![]() |
| ||
|
|
Новости |
Поиск |
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-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 т.е. отладчик туда где ошибка меня не пускает.