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 - ничего хорошего из этого не получается. Как такое поведение можно корректно реализовать?


oxffff   (2010-02-18 02:23:00) [21]


> Германн ©   (18.02.10 02:15) [24]
>
> > Отлично. Но Вас это обяжет описать обработку сообщения
> по
> > удалению корректным образом у наследников ваших компонентов
>
> Ну не обяжет это меня! Ну как ты не понимаешь!
> Какие наследники?
> См. Игорь Шевченко ©   (17.02.10 22:21) [17]
> Пусть ИШ отдувается. :)


Классы наследники Ваших компонентов, а не Ваши наследники. :)
ИШ отдуваться не в чем. Представлено два решения.
Посетители сами определятся с решением, а может предложат свое.


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


> Отлично. Но Вас это обяжет описать обработку сообщения по
> удалению корректным образом у наследников ваших компонентов

Ну не обяжет это меня! Ну как ты не понимаешь!
Какие наследники?
См. Игорь Шевченко ©   (17.02.10 22:21) [17]
Пусть ИШ отдувается. :)


oxffff   (2010-02-18 02:07:00) [23]


> Германн ©   (18.02.10 01:49) [22]
>
> > oxffff ©   (18.02.10 01:41) [21]
> >
> >
> > > Германн ©   (18.02.10 01:29) [20]
> >
> >
> > Попробую ответить :)
>
>
> > но эти потребители "ездят" на одной с Вами марки средства
>
> Попробуй.
> Я "езжу" на марке, в которой ничего не "перекрыто". То бишь
> (в рамках форума), стандартные компоненты Дельфи. И большинство
> тоже ездят на ней.


Отлично. Но Вас это обяжет описать обработку сообщения по удалению корректным образом у наследников ваших компонентов и может сильно стеснять их. И грубо говоря можете зависить от версий библиотеки. Поскольку потенциально никто не запрещает изменить библиотеку VCL под новые возможности внутреннего устройства языка(хотя по возможности они этого избегают).То есть вынудить совершать Вам излишние дополнительные усилия. Зачем?

Если вы просто скрываете объект и добавляете его в очередь на удаление, а объект фактически удаляется в момент простоя приложения. Вы можете удалять из очереди частями размазав на больший интервал времени. И отдать приложению драгоценные такты(ведь компоненты разные бывают в общем виде).


Германн   (2010-02-18 01:49:00) [24]


> oxffff ©   (18.02.10 01:41) [21]
>
>
> > Германн ©   (18.02.10 01:29) [20]
>
>
> Попробую ответить :)


> но эти потребители "ездят" на одной с Вами марки средства

Попробуй.
Я "езжу" на марке, в которой ничего не "перекрыто". То бишь (в рамках форума), стандартные компоненты Дельфи. И большинство тоже ездят на ней.


oxffff   (2010-02-18 01:41:00) [25]


> Германн ©   (18.02.10 01:29) [20]


Попробую ответить :)

Если бы Вы заметили дефект, который может привести к сложностям у невнимательных(не утруждающих себя деталями) потребителей(но эти потребители "ездят" на одной с Вами марки средства) Вы бы промолчали? Это человечно? :)


Германн   (2010-02-18 01:29:00) [26]


> oxffff ©   (17.02.10 21:52) [16]
>
>
> > Игорь Шевченко ©   (17.02.10 21:42) [15]
> > oxffff ©   (17.02.10 21:40) [14]
> >
> > Несложно сделать веревку достаточной длины, чтобы выстрелить
> > себе в ногу. Только зачем ?
>
>
> Вечер добрый.
> У решения есть очевидные недостатки, почему нельзя просто
> указать на них?
> И тем более предложив более безопасное решение, но возможно
> не окончательное?

Зачем в ответе на простой вопрос искать слишком сложное решение, если есть решение простое, пригодное в большинстве случаев?


Плохиш   (2010-02-18 00:54:00) [27]


> Вася   (17.02.10 13:59) [10]


> Как насчет метода Free ?

Ответ приведён в сообщении автора [0]


oxffff   (2010-02-17 22:30:00) [28]


> Игорь Шевченко ©   (17.02.10 22:21) [17]


Так и с Вами согласен.
Собственно я и сам не всегда стремлюсь к идеалам и в местах где запас не нужен обхожусь без него. Я так понимаю участники форума предлагают решения а уж задача вопрошающего выбрать себе нужный размер. :))

Собственно если и в предложенном мною решении кто-то найдет ошибку.
Я только рад буду, поскольку буду знать где он не сработает и будет предложено(возможно найдено сообща) более refine решение. От этого все выграют. Одна голова хорошо, а две лучше.


Игорь Шевченко   (2010-02-17 22:21:00) [29]

oxffff ©   (17.02.10 21:52) [16]

Добрый вечер. В случае необходимости уничтожения объекта из собственного обработчика идеального решения не существует, существует только тот или иной набор костылей. Я не вижу смысла расширять этот набор костылей сверх необходимости, и, соответственно, усложнять процедуру уничтожения объекта иначе как попросить владельца уничтожить объект. Если у кого-то что-то перекрыто, то не обращаться в перекрытом к уничтоженному объекту будет гораздо проще.


oxffff   (2010-02-17 21:52:00) [30]


> Игорь Шевченко ©   (17.02.10 21:42) [15]
> oxffff ©   (17.02.10 21:40) [14]
>
> Несложно сделать веревку достаточной длины, чтобы выстрелить
> себе в ногу. Только зачем ?


Вечер добрый.
У решения есть очевидные недостатки, почему нельзя просто указать на них?
И тем более предложив более безопасное решение, но возможно не окончательное?
Что плохого в поиске самого refine решения?


Игорь Шевченко   (2010-02-17 21:42:00) [31]

oxffff ©   (17.02.10 21:40) [14]

Несложно сделать веревку достаточной длины, чтобы выстрелить себе в ногу. Только зачем ?


oxffff   (2010-02-17 21:40:00) [32]


> TStas   (17.02.10 17:25) [12]
> Этот вопрос описан в книге Григорьева. Всё очень просто.
>  
> const WM_HARAKIRI = WM_USER + 1; //Определили новое сообщение.
>  
>
> А у окна, которому принадлежит Ваш объект, определяем обработчик
> сообщений, который и будет убивать объект.


Этот способ не является стопроцентным решением. Несложно написать контрпример, в котором этот пример даст сбой.
Например достаточно просто перекрыть Tobject.Dispatch в наследнике  котором дополнительно логировать часть сообщений после обработки сообщений.
Или создать каскад обработчиков сообщений в котором после обработки идет обращение к объекту.
Местом где нет сообщений и они находятся не в каскаде является onIdle.

Я бы предложил зацепиться за Application.OnIdle


Игорь Шевченко   (2010-02-17 17:31:00) [33]


> SendMessage(


PostMessage


TStas   (2010-02-17 17:25:00) [34]

Этот вопрос описан в книге Григорьева. Всё очень просто.
const WM_HARAKIRI = WM_USER + 1; //Определили новое сообщение.

А у окна, которому принадлежит Ваш объект, определяем обработчик сообщений, который и будет убивать объект.
procedure WMHarakiri(var Msg: TMessage); message WM_HARAKIRI;

procedure TMainForm.WMHarakiri(var Msg: TMessage);
var
 HappilessObj: THappilessObj; //Переменная типа убиваемого объекта
begin
 HappilessObj := THappilessObj(Msg.wParam); //Привели тип
 HappilessObj.Free; //И убили
end;

//А теперь в обработчике двойного щелчка пишем
SendMessage(
 Handle, //Handle окна, которое и убъёт компонент
 WM_HARAKIRI, //Само сообщение
 Integer(Sender), //Указатель на убиваемый объект
 0
);

Этот способ хорош по двум причинам:
1) Он "взрослый", а не с таймером.
2) Можно убивать не один, а много объектов одного класса или даже разных классов, во втором случае вместо нуля передавать число, идентифицируещее класс.


DVM   (2010-02-17 15:02:00) [35]


> Вася   (17.02.10 13:59) [10]


> Да ладно. Как насчет метода Free ?

Не с каждым объектом прокатит.


Вася   (2010-02-17 13:59:00) [36]


> Германн ©   (16.02.10 02:16) [7]
>
>


> Ибо он - единственный способ "разрушить" объект из метода
> "этого самого объекта".


Да ладно. Как насчет метода Free ?


Омлет   (2010-02-17 13:15:00) [37]

Странно. Я в обработчике OnExit объекта успешно разрушаю этот объект.


Германн   (2010-02-16 02:30:00) [38]

Токмо в [4] есть маленькая ошибка. В терминологии.
Примите и прочь. :)


Германн   (2010-02-16 02:16:00) [39]


> Дмитрий Белькевич   (15.02.10 19:02) [6]
>
> It works :)

Сей способ должен был быть выучен ещё в детском саду. Ибо он - единственный способ "разрушить" объект из метода "этого самого объекта".


Дмитрий Белькевич   (2010-02-15 19:02:00) [40]

It works :) Спасибо еще раз.


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

Наверх

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