![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Удаление панели из события одного из её дочерних компонентов [D7, XP]
Sco © (2006-10-18 22:32:00)У меня на форме размещёна панелька, на панельке есть кнопка "закрыть", при нажатии на эту кнопку панелька должна исчезнуть из окна и из памяти. Я пробовал реализовать это через
procedure TMayForm.MyButtonClick(Sender: TObject);
begin
// smth
MyButton.parent.destroy;
// smth
end;
Естественно этот способ не заработал так как нельзя вот так просто уничтожить своего родителя. Можно реализовать вот так:
procedure TMyForm.MyButtonClick(Sender: TObject);
begin
// smth
MyTimer.enabled:=true; {Timer.interval=100}
// smth
end;
procedure TMyTimerTimer(sender: TObject);
begin
MyButton.parent.destroy;
end;
Но в этом случае будут незаметные тормоза, да и если система будет сильно висеть то возможны глюки. Вот вопрос - как ещё можно реализовать решение этого вопроса.
Убедительная просьба всем флудерам - обходите эту тему, я создаю темы для того чтобы найти решение проблемы а не для того чтобы слушать ваши бредни.
Sco (2006-10-19 12:03:00) [1]sniknik понял - привожу все данные:
прога - органайзер, раздел - будильники - вид - форма которой в качестве parent назначаю одну из панелей главной формы проги. На форму будильников - каждый будульник оформлен ввиде панелей (которые я создаю по ходу работы программы), на каждой панельке куча всяких TLabel,TEdit,TButton, и кнопки управления панелью (расрыкть свиток,отключиь будильник, "удалить будильник"), то есть не кнопки а TImage (кнопка не подходит изза дизайна). Принажатии на имедж "закрыть" - панель освобождается из памяти, из исчезает из формы. Вроде бы усё. Первый способ, который предложил Percent работает... работает способ [23] тока не савсем как надо...
2Ketmar повторяешься.. тем самым доказывая мои слова
Ketmar (2006-10-19 11:52:00) [2]>[27] sniknik(c) 19-Oct-2006, 11:48
>(или уже бы не дали? ;)
не знаю. лично от меня неко игнор заработало. %-)
sniknik (2006-10-19 11:48:00) [3]> У меня на форме много панелей с Align=alTop
новые открытия... не сдвигается потому как форма про закрытие элемента ничего не знает.
вообще если бы был объяснен смысл действий... (решаемая задача, а не трудности кодинга на пути), то возможно дали бы более рациональное решение (или уже бы не дали? ;), имидж сформирован...). а то счас еще возникнет как ее, эту панель создать на "лету"... (это телепатор, предположение зачем делается), и опять будет "борьба" с системой/дельфями, а нужно то было просто сделать форму невидимой...
sniknik (2006-10-19 11:40:00) [4]MikePetrichenko © (19.10.06 10:13) [24]
это ему давали в той ветке в которой якобы не помогли... еще вчера. но все непонятное начинающие почемуто традиционно игнорируют...
а чтобы получит ошибку от Txxxxxx(Sender).Parent.Free; положи на панель "иконку" (это из той ветки, х.з. что это такое, тип не был приведен, но например замени на TImage), ну и по клику на ней выполняй, будет "абстракт еррор" (почему такого нет у кнопки думаю объяснять не надо).
кстати что там на панели у него лежит непонятно до сих пор (или пропустил описание... многа букаф в ветке уже, еще чуть и не осилю даже ее открытие).
Sco (2006-10-19 11:31:00) [5]сделал, работает... тока такое ощущение что она както не так удалилась...
У меня на форме много панелей с Align=alTop, и ето одна из них. При её удалении 1 способом - все нижние панельки двига.тся вверх - заполняя исчезнувшее пространство... а при [24] пространство остаётся не занятым ничем... Ща буду разбираться, возможно достаточно просто самому подвинуть панельки вверх.
MikePetrichenko (2006-10-19 10:13:00) [6]
> Sco © (19.10.06 09:46) [23]
Код номер три:
procedure TForm1.Button2Click(Sender: TObject);
begin
PostMessage(TButton(Sender).Parent.Handle, WM_CLOSE, 0, 0);
end;
Sco (2006-10-19 09:46:00) [7]
procedure TAlarmClockF.AlarmDelIconClick(Sender: TObject);
var
count,i: integer;
mes: TMessage;
begin
AlarmFileIni.EraseSection(CurrentUserData.Alarms[TControl(Sender).Tag].Ident);
count:=Length(CurrentUserData.Alarms);
if (count>1) and (TControl(Sender).Tag+1<count) then
begin
for i:=count-1 downTo TControl(Sender).Tag+1 do
begin
CurrentUserData.Alarms[i-1]:=CurrentUserData.Alarms[i];
Panels[TControl(Sender).Tag+1].Tag:=Panels[TControl(Sender).Tag+1].Tag-1;
end;
SetLength(CurrentUserData.Alarms,count-1);
end;
//PostMessage(Handle, WM_DESTROYPANEL, cardinal(TControl(Sender).Parent), 0);
TControl(sender).Parent.Free; {<--- вот ета строка}
end;
MikePetrichenko (2006-10-19 09:33:00) [8]
> 2MikePetrichenko я бы забыл если бы код в [20] не выводил
> ошибку памяти... :) тока что попробовал... да я и раньше
> пробовал.
Код не приводит к ошибке памяти. Приведи свой полный кусок кода, который приводит к ошибке.
То что там написано (именно в таком виде) не дает ошибки.
Проверено в D6, D7, D2005, D2006
Sco (2006-10-19 09:09:00) [9]2MikePetrichenko я бы забыл если бы код в [20] не выводил ошибку памяти... :) тока что попробовал... да я и раньше пробовал.
MikePetrichenko (2006-10-19 09:05:00) [10]
> Sco © (19.10.06 08:56) [19]
Смотри способо №2.
> procedure TForm1.Button1Click(Sender: TObject);
> begin
> TButton(Sender).Parent.Free;
> end;
И забудьпро извратыс сообщениями. Пусть VCL делает эту работу за тебя.
Твоя ошибка была только в том, что ты вызывал Destroy, а не Free.
Sco (2006-10-19 08:56:00) [11]2MikePetrichenko твой способ я понял... тут всё просто, тока :) мне надо снести всю панельку.. как ето - нажал на крестик, панель исчезла а крестик остался :) хехе... а ваще первый способ работает... во тока вопрос - я там отправляю сообщение своей же программе, потом его ловлю и уничтожаю панель со всем её содержимым... не может ли выйти так что я сообщение поймаю и выполню раньше чем закончится первой событие (нажатие кнопки). А если так и вйдет то будет ошибка памяти?
2Ketmar не понимаю я тебя... я учусь стараяюсь, пытаюсь сделать программу лучше, читаю книги. штурмую DelphiWorld, но у меня всё равно появляются вопросы? и что ты мне предлагаешь? вместо етого идти за метлой? когда ты начинал программировать - у тебя не возникало никаких вопросов?
"наверное, ламер-неумёха по этой классификации?" - флудером может быть и профи... флудер ето тот кто в серьёзных (то есть не флудерских)темах вместо помощи пытается общатся, а хуже если он при етом ещё и издивается.
Ketmar (2006-10-19 08:46:00) [12]>[17] MikePetrichenko(c) 19-Oct-2006, 08:45
>P.S. Не будем ветку в треп превращать?
да она давно превратилась... %-)
MikePetrichenko (2006-10-19 08:45:00) [13]
> а твой пост можно было понять по-другому? если да, то я
> не смог
Можно. Если не вкладывать в написанное свой скрытый смысл. Что думаю - то пишу (язык мой - враг мой).
> значит, не мог он никаем стать. по определению.
Мог. Если бы нос опустил. (Ничего личного)
:)
P.S. Не будем ветку в треп превращать?
Ketmar (2006-10-19 08:42:00) [14]>[15] MikePetrichenko(c) 19-Oct-2006, 08:37
>Я где-то написал про начальство/уволили/выгнали?
а твой пост можно было понять по-другому? если да, то я не смог.
>Просто за трепатьней своей профукал возможность учится...
значит, не мог он никаем стать. по определению.
MikePetrichenko (2006-10-19 08:37:00) [15]
> упаси меня Баф от такого начальства...
Я где-то написал про начальство/уволили/выгнали?
Внимательно чтим посты. Помогает,..
Просто за трепатьней своей профукал возможность учится... Теперь нафиг никому не нужен...
"Ты все пела - это дело,
Так пойди же попляши.."
(С) Крылов.
Ketmar (2006-10-19 08:20:00) [16]>[10] MikePetrichenko(c) 19-Oct-2006, 07:24
>Лет 5 назад (или около того) я работал с одним парнет.
>Вроде не глупый, начитаный... Мог бы быть вполне хорошим
>программистом. Но говорил много, спорил...
>Теперь сторожем работает...
ага. я построился и маршем отправился молчать в тряпочку.
упаси меня Баф от такого начальства...
MikePetrichenko (2006-10-19 08:05:00) [17]Код номер 2.
На форме панель. На панели кнопка.
procedure TForm1.Button1Click(Sender: TObject);
begin
TButton(Sender).Parent.Free;
end;
Объясните, что я делаю не так? (Код работает).
P.S. А если бы господа "мастера" внимательно прочитали первоначальный код автора вопроса, то заметили бы, что автор вызывает Destroy, а не Free.
Тогда бы не было кучи постов про Message и Timer.
MikePetrichenko (2006-10-19 08:02:00) [18]
> панелька должна исчезнуть из окна и из памяти
Приведенный код решает задачу? Решает. Про кнопку (ее удаление, уставление) вопроса не стояло.
> Потому что ты удаляешь не Parent кнопки.
А что же я удаляю?
> ты его вначале меняешь, а потом удаляешь старого. Удаление
> Parent вызывает удаление всех дочерних элементов.
Верно. А иначе удалится и кнопка.
> Мне кажется, автору такое поведение не было нужно...
Не надо, чтобы казалось.
Percent (2006-10-19 07:55:00) [19]почему сее работает без сообщений и таймера?
Потому что ты удаляешь неParent кнопки. То есть, ты его вначале меняешь, а потом удаляешь старого. Удаление Parent вызывает удаление всех дочерних элементов. Твой код со сменой Parent, кнопку не удаляет, поэтому и нет исключения. Однако, кнопка остается висеть на низлежащем WinControl'е. Мне кажется, автору такое поведение не было нужно...
MikePetrichenko (2006-10-19 07:24:00) [20]Лет 5 назад (или около того) я работал с одним парнет. Вроде не глупый, начитаный... Мог бы быть вполне хорошим программистом. Но говорил много, спорил...
Теперь сторожем работает...