Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.11.05;
Скачать: CL | DM;

Вниз

Удаление панели из события одного из её дочерних компонентов   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.062 c
2-1161086373
RebroFF
2006-10-17 15:59
2006.11.05
Разделение прав и компоненты Delphi


3-1157611152
vodvorezlaya
2006-09-07 10:39
2006.11.05
Помогите вылазит ошибка EDBEngine error with message insufficien


2-1161344333
dest81
2006-10-20 15:38
2006.11.05
XML


2-1161607652
atruhin
2006-10-23 16:47
2006.11.05
Сравнение событий Onxxxx


3-1157093965
Delphi basic
2006-09-01 10:59
2006.11.05
Неправильный расчет выражений в SQL