![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Разрушение объекта при двойном щелчке на объекте
Дмитрий Белькевич © (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]
> Классы наследники Ваших компонентов, а не Ваши наследники.
> :)
Ух её моё. А в где в сабже речь шла о наследниках каких-то компонент?
Я не в праве отнять значек (голубой).
Но ты рискуешь его потерять!