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

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

Как удалить динамически созданный контрол


Страницы:   1 2

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


Страницы:   1 2

Наверх

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