![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как удалить динамически созданный контрол
Sakipiel © (2014-06-05 15:52:00)Есть панель, на нее программно создаются контролы.
Задача:
при нажатии на кнопку Delete удалить активный контрол с панели и вообще удалить.
Проблема:
Событие OnkeyDown активизируется в том самом контроле. В панели на которую он ложится OnkeyDown нет вообще. ну и когда мы из самого контрола, а именно события OnKeyDown вызываем
if Key = VK_DELETE then
If Assigned(ActiveControl) Then
ActiveControl.RemoveControl(ActiveControl);
то получаем ошибку, вообщем отказывается он удалять самого себя, а что делать?
Sakipiel (2014-06-19 21:04:00) [21]LastSelectedControl.free; а если не делать этого, то эта ошибка не появляется
> он уже мертв!
это моя процедура и она рисует рамку вокруг компонента, а если он уже мертв, то она ее стирает.
brother (2014-06-19 21:04:00) [22]ps. используйте отладчик и точки останова чтобы выловить причину и точное место AV
brother (2014-06-19 21:00:00) [23]1.
> LastSelectedControl.free;
> LastSelectedControl := nil;
freeandnil
2.
> SetFocus(LastSelectedControl);
он уже мертв!
Sakipiel (2014-06-19 20:58:00) [24]
procedure TDesForm.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
//var
// s:string;
begin
if Key = VK_DELETE then
if Assigned(LastSelectedControl) then
begin
//s := TControl(Sender).Name;
MarkControlAsDeleted(LastSelectedControl.Name);
DeleteSelectedComponentFromPointerList;
LastSelectedControl.Parent.RemoveControl(LastSelectedControl);
LastSelectedControl.free;
LastSelectedControl := nil;
SetFocus(LastSelectedControl);
end;
end;
мде вот она и случилась непонятная ситуация. весь код проходит, останавливаемся отладчиком на последнем end, жмем F7 и получаем ошибку чтения памяти...я чета без идей )
Sakipiel (2014-06-19 20:51:00) [25]мде, чо ж оно не обниливаецо само, а то удаляешь удаляешь, удаляешь, удаляешь, а ничего не удаляется. с логикой все в порядке, просто я не люблю делать компоненты которые в каждой непонятной ситуации (как то неназначеная ссылка на компонент) будет вываливать Аксесс виалейшн, и чтобы я потом долго размышлял, и что же это за беда то такая. У меня есть мой компонент, который вокруг этого рисует рамку и в нем на него ссылка, и ее он и проверяет, перед тем как перерисовать рамку, и получается, если я удаляю компонент, то мне придется вручную обниливать все ссылки..нет их конечно не много, но все равно обидно чо та.
Inovet (2014-06-19 20:27:00) [26]> [11] Sakipiel (19.06.14 19:54)
> как так то?
Во-первых, кто ж за тебя её будет обниливать. Во-вторых, надо проверить - всё ли в порядке с логикой, если после удаления надо проверять на удалённость.
Sakipiel (2014-06-19 19:54:00) [27]непонятная ботва,
LastSelectedControl.Parent.RemoveControl(LastSelectedControl);
LastSelectedControl.free;
делаю я, где LastSelectedControl это переменная в которой хранится указатель на компонент, все проходит, но есть еще 1 переменная в которой также хранится указатель на этот компонент, и вот после того что я сделал, что должно остаться в той переменной? Ибо она проходит проверку
if not Assigned(C) then
exit;
т.е. получается что оно вполне себе Assigned после удаления. Причем можно посмотреть его ClassName, как так то? что делать?
Dimka Maslov (2014-06-19 17:40:00) [28]Ставим форме KeyPreview (или как там оно называется) в true и спокойно обрабатываем удаление контролов в OnKeyDown формы.
Что же касается TLabel, то в силу определённых причин оно не может быть активным контролом. Никогда.
Германн (2014-06-19 17:35:00) [29]
> в Tlabel нет OnKeyDown
Значит для TLabel и не существует проблемы описанной в топике.
Sakipiel (2014-06-19 17:27:00) [30]да, но из какого обработчика? в Tlabel нет OnKeyDown, не модифицировать же мне теперь все контролы
Юрий Зотов (2014-06-07 13:47:00) [31]Безопасный вариант.
Из обработчика контрола посылаем форме (через PostMessage) юзерское сообщение, передавая контрол через параметры. Получив это сообщение, форма удаляет контрол.
Leonid Troyanovsky (2014-06-07 08:29:00) [32]
> Sakipiel (07.06.14 03:11) [4]
Ну, можно, например, у панели сделать контекстное меню,
с помощью которого можно удалить (добавить, переместить, ..) контрол. See also: HotKey, TAction &etc.
--
Regards, LVT.
Leonid Troyanovsky (2014-06-07 08:25:00) [33]
> Sakipiel (05.06.14 15:52)
Во-первых, RemoveControl - это не "вообще удалить",
а удалить из списка контролов. See also: InsertControl.
Во-вторых, OnKeyDown у панели есть, просто оно protected.
В-третьих, удалять контрол из его же обработчика - не очень
хорошая идея.
Я бы сделал HitList: TObjectList и очищал его (Clear),
скажем, в Application.OnIdle (See TApplicationEvents).
Т.е., если контрол стал не нужен, то добавим его в список.
--
Regards, LVT.
Sakipiel (2014-06-07 03:11:00) [34]Вопрос на засыпку, а что делать с контролами у которых OnKeyDown нет? Tlabel например...
Sakipiel (2014-06-05 16:17:00) [35]спс )
Sakipiel (2014-06-05 16:09:00) [36]
if Key = VK_DELETE then
If Assigned(ActiveControl) Then
(Sender as TControl).Owner.RemoveComponent(ActiveControl);
и так ниале
mfender (2014-06-05 16:09:00) [37]
if Assigned(TControl(Sender)) then
TControl(Sender).Parent.RemoveControl(TControl(Sender));