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

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

Разрушение объекта при двойном щелчке на объекте


Страницы:   1 2 3

Дмитрий Белькевич ©   (2010-02-15 16:02:00) 

Возникла потребность разрушить визуальный объект, когда на нём сделали двойной щелчок. Пытаюсь разрушать в обработчике OnDblClick - ничего хорошего из этого не получается. Как такое поведение можно корректно реализовать?


Leonid Troyanovsky   (2010-02-18 16:09:00) [1]


> oxffff ©   (18.02.10 15:28) [43]

> И я про это. :)

А..вот, еще кое-что вспомнил.
Чтобы корректно обработать еще пару объектов:

procedure TForm1.ApplicationEvents1Exception(Sender: TObject; E: Exception);
begin
 if E is EForceFreeException then
   with  EForceFreeException(E) do
     if (DestroyedObject = Application.MainForm) or
        (DestroyedObject = Application) then
       Application.Terminate
     else
       DestroyedObject.Free;
 Application.ShowException(E);
end;

--
Regards, LVT.


Leonid Troyanovsky   (2010-02-18 15:34:00) [2]


> oxffff ©   (18.02.10 15:28) [43]

> Я не понял о каких проблемах. Ведь это недостижимый код.

Ну, чего там непонятного. Сначало было

procedure TForm1.Button1Click(Sender: TObject);
begin
  Release;
  Application.ProcessMessages;
end;

Потом я вспоминал, что должно быть вместо Release.
А строчка так и осталась. Считай, для сравнения.

--
Regards, LVT.


oxffff   (2010-02-18 15:28:00) [3]


> Leonid Troyanovsky ©   (18.02.10 15:20) [42]
>
> > oxffff ©   (18.02.10 15:09) [41]
>
> > Назначение строчки не раскрыто.
>
> У Post*Message/Release на этом месте возникают проблемы.
>


Я не понял о каких проблемах. Ведь это недостижимый код.

>А, во-ще, что там стоит уже не важно.
И я про это. :)


Leonid Troyanovsky   (2010-02-18 15:20:00) [4]


> oxffff ©   (18.02.10 15:09) [41]

> Назначение строчки не раскрыто.

У Post*Message/Release на этом месте возникают проблемы.
А, во-ще, что там стоит уже не важно.

Вот и то обсуждение:
http://www.delphimaster.net/view/2-1192180654/40-79

Как оказалось, что кроме ИШ там многие поучаствовали ;)

--
Regards, LVT.


oxffff   (2010-02-18 15:09:00) [5]


> procedure TForm1.Button1Click(Sender: TObject);
> begin
>  with EForceFreeException.Create('Free: '+(Sender as TButton).
> Caption) do
>    begin
>      DestroyedObject := Sender;
>      raise This;
>    end;
>  Application.ProcessMessages;
> end;


Что это?
Назначение строчки не раскрыто.


Leonid Troyanovsky   (2010-02-18 14:34:00) [6]


> Riply ©   (18.02.10 13:17) [35]

>  вместе с резюме "Общих решений таких проблем, по видимому
> не существует"

Мы тут как-то не очень давно с ИШ обсуждали похожую тему,
и я предлагал примерно такой вариант, во многом свободный от
недостатков PostMessage:

type
 EForceFreeException = class(Exception)
 private
   DestroyedObject: TObject;
   function This: EForceFreeException;
 end;

function EForceFreeException.This;
begin
 Result := Self;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 with EForceFreeException.Create('Free: '+(Sender as TButton).Caption) do
   begin
     DestroyedObject := Sender;
     raise This;
   end;
 Application.ProcessMessages;
end;

procedure TForm1.ApplicationEvents1Exception(Sender: TObject;
 E: Exception);
begin
 if E is EForceFreeException then
   begin
     EForceFreeException(E).DestroyedObject.Free;
     Application.ShowException(E);
   end;
end;

Про не гуевы приложения особо не задумывался.

--
Regards, LVT.


Leonid Troyanovsky   (2010-02-18 13:37:00) [7]


> Riply ©   (18.02.10 13:34) [38]

> Sorry.

Да чего там :)
В свое время наобсуждались.

--
Regards, LVT.


Riply   (2010-02-18 13:34:00) [8]

>  [37] Leonid Troyanovsky ©   (18.02.10 13:26)
> А объяснения с Application.ProcessMessages и/или диалогом есть?

С Application.ProcessMessages есть.

Там много (более трех страниц посвещено этому вопросу) - долго все перепечатывать.
Sorry.


Leonid Troyanovsky   (2010-02-18 13:26:00) [9]


> Riply ©   (18.02.10 13:21) [36]

А объяснения с Application.ProcessMessages и/или диалогом есть?

--
Regards, LVT.


Riply   (2010-02-18 13:21:00) [10]

> [35] Riply ©   (18.02.10 13:17)
> Если я нашла именно то место, что имеется ввиду, то нет.

Глава 1.2.6 Листинг 1.33


Riply   (2010-02-18 13:17:00) [11]

> [34] Игорь Шевченко ©   (18.02.10 12:11)
> И кстати, вопрос к владельцам книги Антона Григорьева - там действительно написано так, как в посте [12] ?

Если я нашла именно то место, что имеется ввиду, то нет.
Основные отличия:
1. PostMessge, а не SendMessage (с подробным объяснением почему именно так, кстати)
2. Большое дополнение, обясняющее в каких случаях данный метод не работает,
  вместе с резюме "Общих решений таких проблем, по видимому не существует"


Игорь Шевченко   (2010-02-18 12:11:00) [12]

oxffff ©   (18.02.10 03:48) [30]


> Я с этим сталкиваюсь постоянно, и понимаю что люди поверхностно
> представляют  себе вообще что происходит в их программе
> или более того вообще не правильно представляют. И от этого
> становится грустно.


Поддерживаю.

Но может пусть пока начнут представлять с относительно простых вещей (типа нотификации через PostMessage), а после уже и до перекрытых методов Dispatch (if any) дойдут.

И кстати, вопрос к владельцам книги Антона Григорьева - там действительно написано так, как в посте [12] ?


Плохиш   (2010-02-18 11:41:00) [13]


> Вася   (18.02.10 10:36) [32]

> Я имел в виду, что если мы посмотрим реализацию метода Free,
>  мы увидим ,что оказывается можно разрушить объект, находясь
> внутри его метода

Вообще-то здесь речь идёт о разрущении объекта в обработчике его событий.


Вася   (2010-02-18 10:36:00) [14]


> Плохиш ©   (18.02.10 00:54) [19]


> DVM ©   (17.02.10 15:02) [11]
>
>


Я имел в виду, что если мы посмотрим реализацию метода Free, мы увидим ,что оказывается можно разрушить объект, находясь внутри его метода непосредственно вызовом деструктора.
А Германн утверждает в [7], что единственный способ - через PostMessage


Sha   (2010-02-18 09:47:00) [15]

> Я с этим сталкиваюсь постоянно, и понимаю что люди поверхностно
> представляют  себе вообще что происходит в их программе или более того
> вообще не правильно представляют. И от этого становится грустно.

+1


oxffff   (2010-02-18 03:48:00) [16]


> Германн ©  


Обычно людям проще применить доступноеим решение.
И потом невдумываясь в различия применять это решение налево и направо(как повторно используемый код). Это мина замедленного действия.
Я не упрекаю ИШ и АГ (более того я не совмеваюсь в их профессионализме при решении с теми подводными камнями).
Но форум читают(и студенты бездумно берут решения налево и направо, потом вырастают и тиражируют себе подобных). Потом идут работать.

Я с этим сталкиваюсь постоянно, и понимаю что люди поверхностно представляют  себе вообще что происходит в их программе или более того вообще не правильно представляют. И от этого становится грустно.
Но это пройдет.


oxffff   (2010-02-18 03:34:00) [17]


> Германн ©   (18.02.10 03:19) [28]


Есть общие решения одни, а есть общие решения корректные.


Германн   (2010-02-18 03:19:00) [18]


> ffff ©   (18.02.10 03:04) [27]
>
>
> > Германн ©   (18.02.10 02:46) [26]
> >
> > > Классы наследники Ваших компонентов, а не Ваши наследники.
>
> >
> > >  :)
> >
> > Ух её моё. А в где в сабже речь шла о наследниках каких-
>
> > то компонент?
>
>
> Может внимательнее посмотреть мой пост [14].
>
> P.S.
>
> Я собственно слежу за этой темой давно (как и за многими
> другими мне потенциально интересными) и специально не высказывался
> поскольку автора темы устроил вариант решения.
> Но позже была приведена ссылка на решение из книге в общем
> виде.

Ну и зря отреагировал. :)
Кстати. Могу процитировать советского классика журналистики.


oxffff   (2010-02-18 03:04:00) [19]


> Германн ©   (18.02.10 02:46) [26]
>
> > Классы наследники Ваших компонентов, а не Ваши наследники.
>
> >  :)
>
> Ух её моё. А в где в сабже речь шла о наследниках каких-
> то компонент?


Может внимательнее посмотреть мой пост [14].

P.S.

Я собственно слежу за этой темой давно (как и за многими другими мне потенциально интересными) и специально не высказывался поскольку автора темы устроил вариант решения.
Но позже была приведена ссылка на решение из книге в общем виде.
На нее я и отреагировал указав на возможные проблемы.

По остальной части поста [25] без комментариев.


Германн   (2010-02-18 02:46:00) [20]


> Классы наследники Ваших компонентов, а не Ваши наследники.
>  :)

Ух её моё. А в где в сабже речь шла о наследниках каких-то компонент?

Я не в праве  отнять значек (голубой).
Но ты рискуешь его потерять!


Страницы:   1 2 3

Наверх

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