Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TEdit+TlistBox+AV [D6, Win95/98]


Elast ©   (2005-02-08 09:15:00) 

Уважаемые мастера! В следующем коде  я при нажатии в TEdit формирую TListBox и передаю выбранное значение в TEdit, при уничтожении списка получаю AV. Подскажите, где ошибка.

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var TagPtr : Pointer;
begin
 MyListBox := TListBox.Create(Self);
 with MyListBox do begin
   Parent    := Panel1;
   Tag       := LongInt(Sender as TEdit);
   OnKeyPress := MyKeyPress;
   Items[0] := 'aaa';
   Items[1] := 'bbb';
   Items[2] := 'ccc`';                      
   SetFocus;
 end;
end;

procedure TForm1.Edit1Enter(Sender: TObject);
begin
 if MyListBox <> nil then
   MyListBox.Free;
end;

procedure TForm1.MyKeyPress(Sender : TObject; var Key: Char);
var Id : LongInt;
begin
 if Key = #13 then begin
   Key := #0;
   TEdit(Ptr((TListBox(Sender).Tag))).Text := (Sender as TListBox).Items[(Sender as TListBox).ItemIndex];
   TEdit(Ptr((TListBox(Sender).Tag))).SetFocus;
 end;
end;


Elast   (2005-02-08 11:53:00) [1]

Наверное, я не знаю что можно увидеть при MyListBox.Free


Экспериментатор   (2005-02-08 11:51:00) [2]

вот в MyKeyPress(Sender : TObject; var Key: Char);
и сделай
MyListBox.Free;
а в Edit1Enter(Sender: TObject); не делай ничего.


Плохиш   (2005-02-08 11:42:00) [3]

Что в D6 отключены кнопки F7/F8 и средства просмотра значений переменных?


Экспериментатор   (2005-02-08 11:40:00) [4]

Странно как то строки добавляешь

> Items[0] := 'aaa';
>    Items[1] := 'bbb';
>    Items[2] := 'ccc`';      

Может быть
Items.Add('aaa');
Items.Add('bbb');
Items.Add('ccc');


Elast   (2005-02-08 11:22:00) [5]

Хорошо тем у кого отладчик есть. А другие советы по устранению AV?


Плохиш   (2005-02-08 11:19:00) [6]

Хм, отладчик в руки и вперёд.


Elast   (2005-02-08 11:17:00) [7]

Вообще-то, хотел TEdit приспособить да AV не пускает, т.е. ничего не изменилось...


Семен Сорокин   (2005-02-08 11:14:00) [8]


> Elast   (08.02.05 10:54) [4]
> AV ушло, но я не знаю как закрыть (уничтожить) ЛистБокс.
> CM_RELEASE этого не делает.

не удаляй его, а просто скрой с глаз (Hide or Visible := false), и проверяй в Edit1KeyPress:
if not Assigned(MyListBox) then
MyListBox := TListBox.Create(Self);

и не забудь:
MyListBox.Items.Clear;

:)


Плохиш   (2005-02-08 11:07:00) [9]


procedure TForm1.Edit1Enter(Sender: TObject);
begin
if MyListBox <> nil then
  FreeAndNil(MyListBox);
end;

procedure TForm1.MyKeyPress(Sender : TObject; var Key: Char);
var Id : LongInt;
   tmpEdit: TEdit;
begin
if Key = #13 then begin
  Key := #0;
  tmpEdit := TEdit(Ptr((TListBox(Sender).Tag)));
  tmpEdit.Text := (Sender as TListBox).Items[(Sender as TListBox).ItemIndex];
  tmpEdit.SetFocus;
end;
end;


PS. TComboBox свой пишешь?


Elast   (2005-02-08 10:54:00) [10]

AV ушло, но я не знаю как закрыть (уничтожить) ЛистБокс. CM_RELEASE этого не делает.


Семен Сорокин   (2005-02-08 09:59:00) [11]

Трабла здесь:
TEdit(Ptr((TListBox(Sender).Tag))).SetFocus;
потому как на Edit1Enter у тебя явно убиваетися Листбокс:
MyListBox.Free

а после MyKeyPress происходит еще KeyUp, т.е. вместо явного Free попробуй указать так:
PostMessage(MyListBox.Handle, CM_RELEASE, 0, 0)


Elast   (2005-02-08 09:30:00) [12]

Было и так с тем же результатом.


Чапаев   (2005-02-08 09:28:00) [13]

MyListBox:=TListBox.Create(nil); а так?


Наверх

Титульная страница Поиск, карта сайта Написать письмо