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-20 07:27:00) [1]

хочу получить дизайнер форм, для этого берем форму, кладем на нее панель - форма владелец всего, панель эмулирует ту форму которую мы разрабатываем и является родителем всех контролов. пользователь из списка выбирает контрол который он хочет добавить, он программно создается и появляется на панели. Если пользователь решил, что контрол не нужен, он его выделяет и жмет делит и контрол удаляется, вот что нужно ) в принципе все уже работает...


Inovet   (2014-06-20 06:48:00) [2]

> [35] Sakipiel   (20.06.14 06:33)

Подожди насчёт Free. Сначала расскажи, что хочешь получить, а не сразу о том, как это делаешь. Делаешь ты что-то не то, а что надо пока не ясно. Кто там кого и зачем должен удалять? Насовсем или как?


Sakipiel   (2014-06-20 06:33:00) [3]


> Во-первых, RemoveControl - это не "вообще удалить",а удалить
> из списка контролов. See also: InsertControl.


вы мне писали.....после чего я начал делать Free, до этого я этого не делал, если владелец удалит, так я не против) не надо так не надо, я что против что ли )


Sakipiel   (2014-06-20 06:19:00) [4]

согласитесь это очень удобно, нажать делит, и чтобы все было. более того даже в делфи так оно и работает. Вот от этого я и пляшу. А раз так, то что же еще обрабатывать, как не онКейДаун? Хотя кейАп тоже нормально.

К каждому контролу при создании у меня прикрепляется онКлик, который записывает в отдельное поле владельца компонента ссылку на него, на котором кликнули, поэтому я всегда удаляю тот лабел, я не удаляю на данный момент активный контрол. Так что все пучком, довольно пессимизма.


brother   (2014-06-20 05:39:00) [5]

меня так и тянет спросить: какое условие должно произойти, чтобы TLabel (если их несколько,то какой именно) нужно было удалять? ибо он не может быть в фокусе!


brother   (2014-06-20 05:35:00) [6]

[29] Вы еще не устали с ним спорить? Ну уперся на кейдауне, пусть грабли ловит...
зы. автор, еще раз [24] + удаление объекта "из себя" ЗАПРЕЩАЮ! и [25] вызывает улыбку...


Sakipiel   (2014-06-20 05:06:00) [7]

а то понимаешь, ссылки удаляй, чо как не программист, а контролы не удаляй, чо как не программист )


Sakipiel   (2014-06-20 05:04:00) [8]

хе хе, тута нету Free, это раз, т.к. в этом вся фишка, контрол должен удалятся по кейдауну, а не по нажатии кнопки, из кейдауна формы. При этом фокус должен быть на удаляемом контроле в этот момент, чтобы он тоже получил кейдаун, вернее получать его будет уже не кому и вылезет ошибка о которой я говорил.

А делать Free научили меня вы. А создал я его програмно. Я ж начинающий я не знаю удалит его владелец и когда или нет


Inovet   (2014-06-20 04:27:00) [9]

> [28] Sakipiel   (20.06.14 04:08)

Да пожалуйста

procedure TForm1.Button1Click(Sender: TObject);
begin
 if Assigned(ActiveControl) then
 begin
   RemoveControl(ActiveControl);
 end;
end;

И не надо, чтобы он самоудалялся. Удалять должен тот, кто создал, или владелец.


Sakipiel   (2014-06-20 04:08:00) [10]

ну может вы сначала попробуете удалить компонент так, а потом расскажете как у вас это получилось ) мою процедуру можно вообще закомментировать, она ничего не меняет.


Inovet   (2014-06-20 00:43:00) [11]

> [25] Sakipiel   (19.06.14 23:54)
> я уже давно все обнулил

Перечитать

> [12] Inovet ©   (19.06.14 20:27)
> Во-вторых, надо проверить - всё ли в порядке с логикой,
> если после удаления надо проверять на удалённость.


Inovet   (2014-06-20 00:41:00) [12]

> [25] Sakipiel   (19.06.14 23:54)
> я же сказал ошибка не в моем коде вылазила

А, Снова Билл Гейтс? Или про него уже не помнят?


Sakipiel   (2014-06-19 23:54:00) [13]

омг, я уже давно все обнулил, я же сказал ошибка не в моем коде вылазила, свои соображения по поводу того что происходило я выше написал, что я сделаю то с этим?


Юрий Зотов   (2014-06-19 23:11:00) [14]

> Sakipiel   (19.06.14 22:59) [23]
> Сделать это не  в кейдауне,  а в кейапе, тогда косяка нет.


Необнуленная ссылка на уже уничтоженный компонент - это скрытый косяк. И корень зла. Если Вы это корень не уберете, то рано или поздно он себя все равно проявит. И никакие кейдауны тогда уже не помогут. Исправлять надо саму причину, а не ее следствие.


Sakipiel   (2014-06-19 22:59:00) [15]

уже начал изучать TApplicationEvents, как вдруг пришло гениальное решение. Сделать это не  в кейдауне,  а в кейапе, тогда косяка нет.


Германн   (2014-06-19 22:00:00) [16]


> с логикой все в порядке

Как раз наоборот. Класс не может знать в каких переменных содержатся ссылки на него и сколько их вообще этих переменных.


Плохиш   (2014-06-19 21:38:00) [17]

Ещë один горе-кодер, за которым пушкин подчищать ссылки.

Запомни: это программирование, здесь тебе никто и ничего не должен, всë что накодил, должен сам и подчистить за собой.


Sakipiel   (2014-06-19 21:20:00) [18]

в подтверждение моей теории TLabel удаление таким образом не вызывает ошибки, т.к. у него нет OnkeyDown события. Так что метод че то дал сбой) как удалить контрол? ))


Sakipiel   (2014-06-19 21:18:00) [19]

может он после FormKeyDown пытается вызвать OnkeyDown компонента? а компонента уже нет? и вот результат...


Sakipiel   (2014-06-19 21:06:00) [20]


> ps. используйте отладчик и точки останова чтобы выловить
> причину и точное место AV


так я именно это и делал, я же говорю весь код проходит без ошибок, вылет происходит на выходе из FormKeyDown, причем я жму F7 т.е. отладчик туда где ошибка меня не пускает.


Страницы:   1 2

Наверх

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