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

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

Уничтожение ListBox [D6, Win95/98]


Elast ©   (2005-02-08 18:48: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-09 11:30:00) [1]

Юрий Зотов ©   (08.02.05 20:01) [2]
Спасибо за ответ. Частично Ваши предположения о сути вопроса верны. В соседней ветке длительный диалог ни к чему не привел ...
Я выкрутился сам (наверное, коряво): при покидании ЛистБокса делаю Визибле False, а перед созданием ЛистБокса, при необходимости, его уничтожаю FreeAndNil. Но почему при AV в моем коде (по моей версии) существовала ссылка на объект при отсутствии оного я не понял. Извините за многословие.


Юрий Зотов   (2005-02-08 20:01:00) [2]

Не проверял, но должно работать.

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
 with TListBox.Create(Self) do
 begin
   Parent := Panel1;
   Tag    := Integer(Sender);
   OnKeyPress := MyKeyPress;
   Items.Text := 'aaa'#13#10'bbb'#13#10'ccc';
   SetFocus
 end
end;

procedure TForm1.WMUserPlus101(var Message: TMessage);
begin
 inherited;
 TObject(Message.WParam).Free
end;

procedure TForm1.MyKeyPress(Sender: TObject; var Key: Char);
begin
 if Key = #13 then
 begin
   Key := #0;
   with TListBox(Sender) do
     TEdit(Tag).Text := Items[ItemIndex];
   PostMessage(Handle, WM_USER + 101, Integer(Sender), 0)
 end
end;


Ответил на вопрос только потому, что он может иметь отношение к разработке компонентов (Edit с выбором из списка). Но в следующий раз примите во внимание, что вопросы, нарушающие тематику конференции могут быть удалены (об чем сказано в правилах). Здесь не свалка и каждый вопрос надо задавать в той конференции, которая ему соответствует.


Cobalt   (2005-02-08 19:47:00) [3]

>MyListBox.Free;
FreeAndNil
Это раз.


Наверх

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