Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.07.15;
Скачать: CL | DM;

Вниз

Не удаляется компонент   Найти похожие ветки 

 
Mishenka   (2007-06-20 17:01) [0]

На форме создаю 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;


 
Desdechado ©   (2007-06-20 17:11) [1]

Comb.Free;
Comb := nil;

PS вообще работать с глобальными переменными, создавая в одном месте и удаляя в другом, фигово


 
Mishenka   (2007-06-20 17:20) [2]


> Desdechado ©   (20.06.07 17:11) [1]
>
> Comb.Free;
> Comb := nil;
>


Вставил Comb := nil; - не помогло :(


 
Desdechado ©   (2007-06-20 17:27) [3]

Фокус ввода небось на этом комбе?


 
Ega23 ©   (2007-06-20 17:43) [4]

if Comb<>nil then
begin
  Comb.Free;
  Comb := nil;
end;


 
Ega23 ©   (2007-06-20 17:45) [5]

Только зачем так радикально-то? Может имеет смысл на ButtonClick делать Comb.Visible := Ture, а на KeyDown - Comb.Visible := False?


 
Johnmen ©   (2007-06-20 17:46) [6]

И фокус непричём, и нилить не надо.
А надо всего лишь после Comb.Free;
поставить Key:=0;
И желательно покурить на эту тему...:)


 
Ega23 ©   (2007-06-20 17:48) [7]


> поставить Key:=0;
> И желательно покурить на эту тему...:)


Не воткнул. Хотя что-то такое из VCL-кода в мозге вертится...
Пойду внатуре покурю.


 
Ega23 ©   (2007-06-20 18:04) [8]

Покурил. Всё равно не втыкнул. А 27 у нас чему соответствует (проверять тупо лень...)?


 
PZ   (2007-06-20 18:11) [9]

А 27 у нас соответствует ESC


 
clickmaker ©   (2007-06-20 18:35) [10]


> Покурил. Всё равно не втыкнул

обработчик-то у комбика. А при выходе из него, комбика уже нет


 
Desdechado ©   (2007-06-20 18:50) [11]

clickmaker ©   (20.06.07 18:35) [10]
Вот и я о том. Правда из названия не видно. Но вряд ли Form1.KeyPreview стоит...


 
Anatoly Podgoretsky ©   (2007-06-20 19:03) [12]

> clickmaker  (20.06.2007 18:35:10)  [10]

Обработчик то вообще то у формы, но автор молчит где фокус в момент уничтожения компонента, наверняка у комбобокса, вот ему и будет попытка передать код по выходу.


 
Однокамушкин   (2007-06-20 19:09) [13]


> Anatoly Podgoretsky ©   (20.06.07 19:03) [12]
> Обработчик то вообще то у формы, но автор молчит где фокус
> в момент уничтожения компонента,

Наверное, при обработке Button.OnClick фокус всё-таки находится на этой самой кнопке, потому что, судя по названию, это отнюдь не SpeedButton...


 
Desdechado ©   (2007-06-20 19:14) [14]

Однокамушкин   (20.06.07 19:09) [13]
Глюк-то не при создании, а при разрушении. А разрушение на KeyDown, как видишь, а не на экранную кнопку.


 
Anatoly Podgoretsky ©   (2007-06-20 20:14) [15]

> Однокамушкин  (20.06.2007 19:09:13)  [13]

Сглупил, конечно если не SpeedButton


 
Anatoly Podgoretsky ©   (2007-06-20 20:21) [16]

> Desdechado  (20.06.2007 19:14:14)  [14]

Второй раз сглупил, точнее Однокамушкин с панталыку сбил.


 
Ega23 ©   (2007-06-21 09:14) [17]


> обработчик-то у комбика. А при выходе из него, комбика уже
> нет
>


Обработчик, в общем-то, у формы, а не у комбика. С фокусом - понятно, действительно 0 надо дальше передавать, он где-то в недрах VCL загасится (помню какой-то кусок кода, но где, у какого класса - хоть убей не помню...)


 
clickmaker ©   (2007-06-21 09:44) [18]


> [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);


 
Johnmen ©   (2007-06-21 10:10) [19]

Ну, мужики...
Ошибка же вылазит не от Free, а от вызова КейДауна на разрушенный объект...:)


 
ЮЮ ©   (2007-06-21 10:17) [20]

> Ошибка же вылазит не от Free, а от вызова КейДауна на разрушенный
> объект...:)

Тогда уж из-за продолжения выполнения метода КейДаун объекта, разрушенного внутри обработчика, вызванного из этого метода. А этот метод тоже мог быть вызван в теле какого-либо метода.

З.Ы. Вот и предоставляй после этого разработчикам обработчики событий :)


 
Однокамушкин   (2007-06-21 10:32) [21]


> Anatoly Podgoretsky ©   (20.06.07 20:21) [16]

Ну, да, каюсь, лоханулся...


 
Ega23 ©   (2007-06-21 11:04) [22]


>  Comb.OnKeyDown := KeyDown;


У-ё-ё-ё....  А я её-то и не заметил...
Ну тады всё понятно...  :)


 
Mishenka   (2007-06-21 12:37) [23]

Да действительно после Key:=0; всё заработало!
Всем спасибо за помощь!



Страницы: 1 вся ветка

Текущий архив: 2007.07.15;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.019 c
15-1181851885
homm
2007-06-15 00:11
2007.07.15
Ничего не понимаю. Лыжи затупились?


2-1181502728
Golikov
2007-06-10 23:12
2007.07.15
как запустить стандартный просмоторщик изображений и факсов Windo


15-1182002114
Bless
2007-06-16 17:55
2007.07.15
Кот vs Собака.


2-1182251677
zsergey
2007-06-19 15:14
2007.07.15
не работает фильтр Like % ...


6-1166481018
PHPDeveloper
2006-12-19 01:30
2007.07.15
WebBrowser