Форум: "Начинающим";
Текущий архив: 2006.11.05;
Скачать: [xml.tar.bz2];
ВнизУдаление панели из события одного из её дочерних компонентов Найти похожие ветки
← →
Sco © (2006-10-18 22:32) [0]У меня на форме размещёна панелька, на панельке есть кнопка "закрыть", при нажатии на эту кнопку панелька должна исчезнуть из окна и из памяти. Я пробовал реализовать это через
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;
Но в этом случае будут незаметные тормоза, да и если система будет сильно висеть то возможны глюки. Вот вопрос - как ещё можно реализовать решение этого вопроса.
Убедительная просьба всем флудерам - обходите эту тему, я создаю темы для того чтобы найти решение проблемы а не для того чтобы слушать ваши бредни.
← →
Percent (2006-10-18 22:38) [1]я создаю темы для того чтобы найти решение проблемы
На самом деле, ты хочешь, чтобы ее решили за тебя. То есть, ты халявщик. Тебе же в предыдущей ветке все объяснили. Зачем заводишь новую ветку?
const
WM_DESTROYPANEL = WM_USER + $80;
type
TForm1 = class(TForm)
private
procedure WMDestroyPanel(var Msg: TMessage); message WM_DESTROYPANEL;
end;
procedure TMyForm.MyButtonClick(Sender: TObject);
begin
Perform(WM_DESTROYPANEL, cardinal(TControl(Sender).Parent), 0);
end;
procedure TMyForm.WMDestroyPanel(var Msg: TMessage);
begin
TWinControl(Msg.WParam).Free;
end;
← →
Percent (2006-10-18 22:41) [2]Perform(WM_DESTROYPANEL, cardinal(TControl(Sender).Parent), 0);
То есть, конечно же:
PostMessage(Handle, WM_DESTROYPANEL, cardinal(TControl(Sender).Parent), 0);
← →
Sco © (2006-10-18 22:56) [3]2Percent - большое спасибо всё заработало, теперь обьяснение:
1 я не халявщик, то есть большинство людей любят халяву и пользуются ей, я из их числа, но ето не тот случай. Просто у меня базовые знания средних книжек по Делфи, и я реально не знаю принцип действий перехвата и послыки системных сообщений... поетому после того как мне написали тот вариант, и он не заработал - я спросил что не так, при етом начал штудировать DelphiWorld, прочитал там азы, но мне ето ничего не дало...
2 Помощи от старой ветки не было, там собралась толпа флудеров... сижу на куче форумов но такого беспредела нигде не видел... чтобы меня так нагло оскарбляли... флудеры да и только. Тот топик умер поетому я начал новый с более чёткой формулировкой вопроса.
3 исходя из ^ и ^^ я сделал выводы - писать сразу как можно более понятное определение вопроса, и не реагировать на всяких флудеров по типу Игоря Шевченко, которые совершенно не задумываются о том что пишут, им лишь бы вставить свой наглый комментарий, по сути все их высказывания - ето оскорбительный бред. Всё настроение испортили.
4 буду учить message-s видать пригодятся :)
← →
Virgo_Style © (2006-10-18 23:13) [4]Sco © (18.10.06 22:56) [3]
Помощи от старой ветки не было
> наглый комментарий
> оскорбительный бред
> всяких флудеров
> такого беспредела нигде не видел... чтобы меня так
> нагло оскарбляли...
Теперь, сдается мне, и от новых веток помощи не будет.
← →
RASkov (2006-10-18 23:45) [5]Вот как без сообщений, посылке их... т.е. как ты изначально хотел.
код в шутку написал (дикая мысль:) непроверял. Ну вроде работать должен.var DelObj: TObject;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
DelObj.Free;
DelObj:=nil;
Timer1.Enabled:=False;
end;
procedure DelObject(Obj: TObject);
begin
if not Assigned(Obj) then Exit;
DelOdj:=Obj;
Timer1.Enabled:=True;
end;
procedure TMayForm.MyButtonClick(Sender: TObject);
begin
DelObject(MyButton.Parent);
end;
Конечно это изврат полнейший и почти не защищен. А вот ругаться не хорошо.
Будишь ворчать только такой изврат и будут присылать(может быть).
← →
MikePetrichenko © (2006-10-19 06:49) [6]
> procedure TMayForm.MyButtonClick(Sender: TObject);
> begin
> // smth
> MyButton.parent.destroy;
> // smth
> end;
Мдя...
Message, Message.
procedure TfmMain.Button1Click(Sender: TObject);
var
Obj: TOBject;
begin
Obj := TButton(Sender).Parent;
TButton(Sender).Parent := TButton(Sender).Parent.Parent;
Obj.Free;
end;
← →
MikePetrichenko © (2006-10-19 07:00) [7]В догонку.
Порою посты в данной конференции вгоняют в тупик. Не знаешь, толи плакать, то ли смеяться....
← →
MikePetrichenko © (2006-10-19 07:01) [8]И еще в догонку (сонный, мысли теут мееедленно).
Ну что, "мастера", объясните вопрошающему, почему сее работает без сообщений и таймера?
> procedure TfmMain.Button1Click(Sender: TObject);
> var
> Obj: TOBject;
> begin
> Obj := TButton(Sender).Parent;
> TButton(Sender).Parent := TButton(Sender).Parent.Parent;
>
> Obj.Free;
> end;
← →
Ketmar © (2006-10-19 07:06) [9]>[8] MikePetrichenko(c) 19-Oct-2006, 07:01
>Ну что, "мастера", объясните вопрошающему, почему сее
>работает без сообщений и таймера?
потому что грибы качественные.
зыж фигасе. ИШ, оказывается, теперь наглый флудер. а ЮЗ, наверное, ламер-неумёха по этой классификации? игнор-лист пополняется... %-)
← →
MikePetrichenko © (2006-10-19 07:24) [10]Лет 5 назад (или около того) я работал с одним парнет. Вроде не глупый, начитаный... Мог бы быть вполне хорошим программистом. Но говорил много, спорил...
Теперь сторожем работает...
← →
Percent (2006-10-19 07:55) [11]почему сее работает без сообщений и таймера?
Потому что ты удаляешь не Parent кнопки. То есть, ты его вначале меняешь, а потом удаляешь старого. Удаление Parent вызывает удаление всех дочерних элементов. Твой код со сменой Parent, кнопку не удаляет, поэтому и нет исключения. Однако, кнопка остается висеть на низлежащем WinControl"е. Мне кажется, автору такое поведение не было нужно...
← →
MikePetrichenko © (2006-10-19 08:02) [12]
> панелька должна исчезнуть из окна и из памяти
Приведенный код решает задачу? Решает. Про кнопку (ее удаление, уставление) вопроса не стояло.
> Потому что ты удаляешь не Parent кнопки.
А что же я удаляю?
> ты его вначале меняешь, а потом удаляешь старого. Удаление
> Parent вызывает удаление всех дочерних элементов.
Верно. А иначе удалится и кнопка.
> Мне кажется, автору такое поведение не было нужно...
Не надо, чтобы казалось.
← →
MikePetrichenko © (2006-10-19 08:05) [13]Код номер 2.
На форме панель. На панели кнопка.
procedure TForm1.Button1Click(Sender: TObject);
begin
TButton(Sender).Parent.Free;
end;
Объясните, что я делаю не так? (Код работает).
P.S. А если бы господа "мастера" внимательно прочитали первоначальный код автора вопроса, то заметили бы, что автор вызывает Destroy, а не Free.
Тогда бы не было кучи постов про Message и Timer.
← →
Ketmar © (2006-10-19 08:20) [14]>[10] MikePetrichenko(c) 19-Oct-2006, 07:24
>Лет 5 назад (или около того) я работал с одним парнет.
>Вроде не глупый, начитаный... Мог бы быть вполне хорошим
>программистом. Но говорил много, спорил...
>Теперь сторожем работает...
ага. я построился и маршем отправился молчать в тряпочку.
упаси меня Баф от такого начальства...
← →
MikePetrichenko © (2006-10-19 08:37) [15]
> упаси меня Баф от такого начальства...
Я где-то написал про начальство/уволили/выгнали?
Внимательно чтим посты. Помогает,..
Просто за трепатьней своей профукал возможность учится... Теперь нафиг никому не нужен...
"Ты все пела - это дело,
Так пойди же попляши.."
(С) Крылов.
← →
Ketmar © (2006-10-19 08:42) [16]>[15] MikePetrichenko(c) 19-Oct-2006, 08:37
>Я где-то написал про начальство/уволили/выгнали?
а твой пост можно было понять по-другому? если да, то я не смог.
>Просто за трепатьней своей профукал возможность учится...
значит, не мог он никаем стать. по определению.
← →
MikePetrichenko © (2006-10-19 08:45) [17]
> а твой пост можно было понять по-другому? если да, то я
> не смог
Можно. Если не вкладывать в написанное свой скрытый смысл. Что думаю - то пишу (язык мой - враг мой).
> значит, не мог он никаем стать. по определению.
Мог. Если бы нос опустил. (Ничего личного)
:)
P.S. Не будем ветку в треп превращать?
← →
Ketmar © (2006-10-19 08:46) [18]>[17] MikePetrichenko(c) 19-Oct-2006, 08:45
>P.S. Не будем ветку в треп превращать?
да она давно превратилась... %-)
← →
Sco © (2006-10-19 08:56) [19]2MikePetrichenko твой способ я понял... тут всё просто, тока :) мне надо снести всю панельку.. как ето - нажал на крестик, панель исчезла а крестик остался :) хехе... а ваще первый способ работает... во тока вопрос - я там отправляю сообщение своей же программе, потом его ловлю и уничтожаю панель со всем её содержимым... не может ли выйти так что я сообщение поймаю и выполню раньше чем закончится первой событие (нажатие кнопки). А если так и вйдет то будет ошибка памяти?
2Ketmar не понимаю я тебя... я учусь стараяюсь, пытаюсь сделать программу лучше, читаю книги. штурмую DelphiWorld, но у меня всё равно появляются вопросы? и что ты мне предлагаешь? вместо етого идти за метлой? когда ты начинал программировать - у тебя не возникало никаких вопросов?
"наверное, ламер-неумёха по этой классификации?" - флудером может быть и профи... флудер ето тот кто в серьёзных (то есть не флудерских)темах вместо помощи пытается общатся, а хуже если он при етом ещё и издивается.
← →
MikePetrichenko © (2006-10-19 09:05) [20]
> 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 09:09) [21]2MikePetrichenko я бы забыл если бы код в [20] не выводил ошибку памяти... :) тока что попробовал... да я и раньше пробовал.
← →
MikePetrichenko © (2006-10-19 09:33) [22]
> 2MikePetrichenko я бы забыл если бы код в [20] не выводил
> ошибку памяти... :) тока что попробовал... да я и раньше
> пробовал.
Код не приводит к ошибке памяти. Приведи свой полный кусок кода, который приводит к ошибке.
То что там написано (именно в таком виде) не дает ошибки.
Проверено в D6, D7, D2005, D2006
← →
Sco © (2006-10-19 09:46) [23]
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 10:13) [24]
> 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 11:31) [25]сделал, работает... тока такое ощущение что она както не так удалилась...
У меня на форме много панелей с Align=alTop, и ето одна из них. При её удалении 1 способом - все нижние панельки двига.тся вверх - заполняя исчезнувшее пространство... а при [24] пространство остаётся не занятым ничем... Ща буду разбираться, возможно достаточно просто самому подвинуть панельки вверх.
← →
sniknik © (2006-10-19 11:40) [26]MikePetrichenko © (19.10.06 10:13) [24]
это ему давали в той ветке в которой якобы не помогли... еще вчера. но все непонятное начинающие почемуто традиционно игнорируют...
а чтобы получит ошибку от Txxxxxx(Sender).Parent.Free; положи на панель "иконку" (это из той ветки, х.з. что это такое, тип не был приведен, но например замени на TImage), ну и по клику на ней выполняй, будет "абстракт еррор" (почему такого нет у кнопки думаю объяснять не надо).
кстати что там на панели у него лежит непонятно до сих пор (или пропустил описание... многа букаф в ветке уже, еще чуть и не осилю даже ее открытие).
← →
sniknik © (2006-10-19 11:48) [27]> У меня на форме много панелей с Align=alTop
новые открытия... не сдвигается потому как форма про закрытие элемента ничего не знает.
вообще если бы был объяснен смысл действий... (решаемая задача, а не трудности кодинга на пути), то возможно дали бы более рациональное решение (или уже бы не дали? ;), имидж сформирован...). а то счас еще возникнет как ее, эту панель создать на "лету"... (это телепатор, предположение зачем делается), и опять будет "борьба" с системой/дельфями, а нужно то было просто сделать форму невидимой...
← →
Ketmar © (2006-10-19 11:52) [28]>[27] sniknik(c) 19-Oct-2006, 11:48
>(или уже бы не дали? ;)
не знаю. лично от меня неко игнор заработало. %-)
← →
Sco © (2006-10-19 12:03) [29]sniknik понял - привожу все данные:
прога - органайзер, раздел - будильники - вид - форма которой в качестве parent назначаю одну из панелей главной формы проги. На форму будильников - каждый будульник оформлен ввиде панелей (которые я создаю по ходу работы программы), на каждой панельке куча всяких TLabel,TEdit,TButton, и кнопки управления панелью (расрыкть свиток,отключиь будильник, "удалить будильник"), то есть не кнопки а TImage (кнопка не подходит изза дизайна). Принажатии на имедж "закрыть" - панель освобождается из памяти, из исчезает из формы. Вроде бы усё. Первый способ, который предложил Percent работает... работает способ [23] тока не савсем как надо...
2Ketmar повторяешься.. тем самым доказывая мои слова
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.11.05;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.043 c