Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.07.15;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.042 c
2-1182278487
Ezorcist
2007-06-19 22:41
2007.07.15
Как запихнуть BMP в PNG?


15-1181941093
Слоник_
2007-06-16 00:58
2007.07.15
Скриншотилка


2-1182084780
skan
2007-06-17 16:53
2007.07.15
Фильтрация


15-1181717231
leonidus
2007-06-13 10:47
2007.07.15
Ищу библиотеку для изменения размера фоток


2-1181946904
IntruderLab
2007-06-16 02:35
2007.07.15
работа с компонентами runtime





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский