Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
11-1136123221
Аид
2006-01-01 16:47
2006.11.05
Контрол для чата


1-1159128493
dreamse
2006-09-25 00:08
2006.11.05
Создание компоненты с уже готовой формой


15-1161020542
55_Ald
2006-10-16 21:42
2006.11.05
Как защитить dll от несанкционированного копирования?


15-1160453087
IMHO
2006-10-10 08:04
2006.11.05
Евро-2008: 11 октября


15-1161166150
SerJaNT
2006-10-18 14:09
2006.11.05
Комп не грузиться=((





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский