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

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

Не удаляется компонент [D6, 2000, XP]


Страницы:   1 2

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;


Страницы:   1 2

Наверх

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