![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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); а так?