Форум: "Начинающим";
Текущий архив: 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