![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не удаляется компонент [D6, 2000, XP]
Mishenka © (2007-06-20 17:01:00)На форме создаю ComboBox, затем по событию OnKeyDown пытаюсь его удалить - возникает ошибка EAccessViolation. Вроде как делаю всё правильно и никак не пойму где ошибка :(
Comb: TComboBox;
S: string;
procedure TForm1.Button1Click(Sender: TObject);
begin
Comb := TComboBox.Create(Self);
Comb.Style := csDropDownList;
Comb.Parent := Self;
Comb.OnKeyDown := KeyDown;
Comb.Items.Add('Ddsdfsdf');
Comb.ItemIndex := 0;
Comb.SetFocus;
end;
procedure TForm1.KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if (Key = 27) or (Key = 13) then
begin
S := Comb.Text;
Comb.Free;
end;
end;
Mishenka (2007-06-21 12:37:00) [1]Да действительно после
Key:=0;всё заработало!
Всем спасибо за помощь!
Ega23 (2007-06-21 11:04:00) [2]
> Comb.OnKeyDown := KeyDown;
У-ё-ё-ё.... А я её-то и не заметил...
Ну тады всё понятно... :)
Однокамушкин (2007-06-21 10:32:00) [3]
> Anatoly Podgoretsky © (20.06.07 20:21) [16]
Ну, да, каюсь, лоханулся...
ЮЮ (2007-06-21 10:17:00) [4]> Ошибка же вылазит не от Free, а от вызова КейДауна на разрушенный
> объект...:)
Тогда уж из-за продолжения выполнения метода КейДаун объекта, разрушенного внутри обработчика, вызванного из этого метода. А этот метод тоже мог быть вызван в теле какого-либо метода.
З.Ы. Вот и предоставляй после этого разработчикам обработчики событий :)
Johnmen (2007-06-21 10:10:00) [5]Ну, мужики...
Ошибка же вылазит не от Free, а от вызова КейДауна на разрушенный объект...:)
clickmaker (2007-06-21 09:44:00) [6]
> [12] Anatoly Podgoretsky © (20.06.07 19:03)
> [17] Ega23 © (21.06.07 09:14)
да как же у формы, мужики?
Comb.OnKeyDown := KeyDown;
procedure TForm1. KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
Ega23 (2007-06-21 09:14:00) [7]
> обработчик-то у комбика. А при выходе из него, комбика уже
> нет
>
Обработчик, в общем-то, у формы, а не у комбика. С фокусом - понятно, действительно 0 надо дальше передавать, он где-то в недрах VCL загасится (помню какой-то кусок кода, но где, у какого класса - хоть убей не помню...)
Anatoly Podgoretsky (2007-06-20 20:21:00) [8]> Desdechado (20.06.2007 19:14:14) [14]
Второй раз сглупил, точнее Однокамушкин с панталыку сбил.
Anatoly Podgoretsky (2007-06-20 20:14:00) [9]> Однокамушкин (20.06.2007 19:09:13) [13]
Сглупил, конечно если не SpeedButton
Desdechado (2007-06-20 19:14:00) [10]Однокамушкин (20.06.07 19:09) [13]
Глюк-то не при создании, а при разрушении. А разрушение на KeyDown, как видишь, а не на экранную кнопку.
Однокамушкин (2007-06-20 19:09:00) [11]
> Anatoly Podgoretsky © (20.06.07 19:03) [12]
> Обработчик то вообще то у формы, но автор молчит где фокус
> в момент уничтожения компонента,
Наверное, при обработке Button.OnClick фокус всё-таки находится на этой самой кнопке, потому что, судя по названию, это отнюдь не SpeedButton...
Anatoly Podgoretsky (2007-06-20 19:03:00) [12]> clickmaker (20.06.2007 18:35:10) [10]
Обработчик то вообще то у формы, но автор молчит где фокус в момент уничтожения компонента, наверняка у комбобокса, вот ему и будет попытка передать код по выходу.
Desdechado (2007-06-20 18:50:00) [13]clickmaker © (20.06.07 18:35) [10]
Вот и я о том. Правда из названия не видно. Но вряд ли Form1.KeyPreview стоит...
clickmaker (2007-06-20 18:35:00) [14]
> Покурил. Всё равно не втыкнул
обработчик-то у комбика. А при выходе из него, комбика уже нет
PZ (2007-06-20 18:11:00) [15]А 27 у нас соответствует ESC
Ega23 (2007-06-20 18:04:00) [16]Покурил. Всё равно не втыкнул. А 27 у нас чему соответствует (проверять тупо лень...)?
Ega23 (2007-06-20 17:48:00) [17]
> поставить Key:=0;
> И желательно покурить на эту тему...:)
Не воткнул. Хотя что-то такое из VCL-кода в мозге вертится...
Пойду внатуре покурю.
Johnmen (2007-06-20 17:46:00) [18]И фокус непричём, и нилить не надо.
А надо всего лишь после Comb.Free;
поставить Key:=0;
И желательно покурить на эту тему...:)
Ega23 (2007-06-20 17:45:00) [19]Только зачем так радикально-то? Может имеет смысл на ButtonClick делать Comb.Visible := Ture, а на KeyDown - Comb.Visible := False?
Ega23 (2007-06-20 17:43:00) [20]
if Comb<>nil then
begin
Comb.Free;
Comb := nil;
end;