Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как правильно удалить объект созданный в рантайме [D7, WinXP]


superlamer ©   (2006-11-11 01:21:00) 

Ув. Мастера есть научите. Нужно удалить объект типа TPanel через его попап меню. Как это сделать корректно? Если можно, то приведите небольшой пример.


Ketmar   (2006-11-11 15:11:00) [1]

>[17] Anatoly Podgoretsky(c) 11-Nov-2006, 09:57
>Сделать владельцем попап меню форму, а не панель, дальше
>просто Panel.Free
оффтоп: о. наконец-то пост попал по назначению. а то какой-то слепой артиллерист, а не APC. %-)


Anatoly Podgoretsky   (2006-11-11 09:57:00) [2]

> Ketmar  (11.11.2006 1:27:02)  [2]

Сделать владельцем попап меню форму, а не панель, дальше просто Panel.Free


Джо   (2006-11-11 05:25:00) [3]

> Ув. Мастера есть научите. Нужно удалить объект типа TPanel
> через его попап меню. Как это сделать корректно?


// Обработчик OnClick для элемента popup-menu
procedure TForm1.Free1Click(Sender: TObject);
begin
 Panel1.Free
end;


Германн   (2006-11-11 03:33:00) [4]


> (за интерес в столь поздний час - отдельное спасибо).
>

Пожалуйста, но лучше бы тебе поспать. И мне тоже.


superlamer   (2006-11-11 03:26:00) [5]


> Германн ©   (11.11.06 03:08) [13]

как такового кода еще нет, так как не знаю как правильно это реализовать.
теперь конкретно, что нужно сделать: на форме есть определенное кол-во панелей. нужно удалить любую из них выбрав из контекстного меню этой панели пункт "удалить". и вопрос: как это сделать корректно. код, который приводился выше - это варианты того как я себе этот процесс представляю. буду очень благодарен за конкретный пример (за интерес в столь поздний час - отдельное спасибо).


Германн   (2006-11-11 03:08:00) [6]


> superlamer ©   (11.11.06 02:56) [12]

Давай разговаривать конкретно. У тебя код, у нас вопросы/ответы. Только дай "реальный код" и приведи вопросы по нему!


superlamer   (2006-11-11 02:56:00) [7]

DelPnl объявлена как
procedure DelPnl(var Res: Byte); message WM_MYDELETE;


superlamer   (2006-11-11 02:53:00) [8]


> Дежавю. Ну а реальный код с реальными проблемами
> так уж трудно привести? Или религия не позволяет?

Пробую отдельно, так как никогда такого не делал(совсем в новинку все это мне). Так все таки это будет правильно работать или лучше так?

procedure TForm1.DelPnl(var Res: Byte);
begin
 try
   SelectedPnl.Free;
 except
   Res := 0
 end;
end;

procedure TForm1.pmDeleteClick(Sender: TObject);
begin
 PostMessage(Form1.Handle, WM_MYDELETE,0,0)
end;


Германн   (2006-11-11 02:41:00) [9]


> superlamer ©   (11.11.06 02:26) [9]
>
> А вот так совсем неправильно будет?
>
> procedure TForm1.Button1Click(Sender: TObject);
> var
>  pnl: TPanel;
> begin
>  pnl := TPanel.Create(Self);
>  with pnl do
>    begin
>      Parent := Form1;
>      .
>      .
>      .      
>      OnMouseDown := pnlMouseDown;
>      PopupMenu := PanelPopupMenu;
>    end;
> end;
>
> procedure TForm1.pnlMouseDown(Sender: TObject; Button: TMouseButton;
>  Shift: TShiftState; X, Y: Integer);
> begin
>  SelectedPnl := Sender as TPanel;
> end;
>
> procedure TForm1.pmDeleteClick(Sender: TObject);
> begin
>  SelectedPnl.Free;
> end;

Дежавю. Ну а реальный код с реальными проблемами
так уж трудно привести? Или религия не позволяет?


superlamer   (2006-11-11 02:26:00) [10]

А вот так совсем неправильно будет?

procedure TForm1.Button1Click(Sender: TObject);
var
 pnl: TPanel;
begin
 pnl := TPanel.Create(Self);
 with pnl do
   begin
     Parent := Form1;
     .
     .
     .      
     OnMouseDown := pnlMouseDown;
     PopupMenu := PanelPopupMenu;
   end;
end;

procedure TForm1.pnlMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 SelectedPnl := Sender as TPanel;
end;

procedure TForm1.pmDeleteClick(Sender: TObject);
begin
 SelectedPnl.Free;
end;


Германн   (2006-11-11 02:21:00) [11]


> MikePetrichenko ©   (11.11.06 02:09) [7]
>
>
> > Ув. Мастера есть научите. Нужно удалить объект типа TPanel
> > через его попап меню. Как это сделать корректно? Если
> можно,
> >  то приведите небольшой пример.
>
> Где-то я это уже видел :)
>

И не один раз!


MikePetrichenko   (2006-11-11 02:09:00) [12]


> Ув. Мастера есть научите. Нужно удалить объект типа TPanel
> через его попап меню. Как это сделать корректно? Если можно,
>  то приведите небольшой пример.

Где-то я это уже видел :)


Германн   (2006-11-11 02:02:00) [13]


> К сожалению с таким столкнулся впервые. Нельзя ли выше сказанное
> в код перекинуть?
>

В 2 часа ночи!? В ночное время тариф, ну очень большой! Осилилишь!?

Может дешевле будет прочитать справку по PostMessage? [2]
Для "Основной" в самый раз.


superlamer   (2006-11-11 01:46:00) [14]


> Как ты уже сам наверняка проверил, просто вызвать Free из
> собственного обработчика некузяво - стек красиво разваливается.

Да уж, с Free не красиво получается.


>  Поэтому нужно выйти из обработчика, сначала бросив какое-
> нибудь сообщение, скажем, форме - чтобы она потом сама и
> удалила эту панель

К сожалению с таким столкнулся впервые. Нельзя ли выше сказанное в код перекинуть?


DrPass   (2006-11-11 01:39:00) [15]

Как ты уже сам наверняка проверил, просто вызвать Free из собственного обработчика некузяво - стек красиво разваливается. Поэтому нужно выйти из обработчика, сначала бросив какое-нибудь сообщение, скажем, форме - чтобы она потом сама и удалила эту панель


superlamer   (2006-11-11 01:33:00) [16]

Можно по-подробнее?


Ketmar   (2006-11-11 01:27:00) [17]

SendMessage(), обработчик.


Ketmar   (2006-11-11 01:27:00) [18]

пардон. PostMessage().


Наверх

Титульная страница Поиск, карта сайта Написать письмо