Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Наследуемым формам задать nil в родителе при закры, Наследуемым форма задать nil при закрыти 
:(
    Опции темы
Злоумышленник
Дата 27.3.2007, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.9.2006

Репутация: нет
Всего: -3



В программе использую много MDI-форм внешне схожих, поэтому наследую их от одной формы. При закрытии в родителе ставлю Action := caFree; Но мне нужно также на переменную-указатель "имя формы" при закрытии ставить nil. Сейчас я это делаю в наследниках при закрытии (одно и то же практически при разных именах форм). Как это можно делать в родительской форме один раз? Self := nil не проходит.
PM   Вверх
yus
Дата 28.3.2007, 06:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 1.2.2007
Где: Tomsk

Репутация: нет
Всего: нет



Цитата(Злоумышленник @ 27.3.2007,  23:46)
В программе использую много MDI-форм внешне схожих, поэтому наследую их от одной формы. При закрытии в родителе ставлю Action := caFree; Но мне нужно также на переменную-указатель "имя формы" при закрытии ставить nil. Сейчас я это делаю в наследниках при закрытии (одно и то же практически при разных именах форм). Как это можно делать в родительской форме один раз? Self := nil не проходит.

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

    procedure WmUser(var Msg: TMessage); message WM_USER + 1;

Код

procedure TMyForm.WmUser(var Msg: TMessage);
begin
  TMyForm(Pointer(Msg.WParam)^).Free;
end;


Дочернее:
Код

  PostMessage(MyForm.Handle, WM_USER + 1, Integer(@Owner), 0)



Это сообщение отредактировал(а) yus - 28.3.2007, 06:04
PM MAIL ICQ Jabber   Вверх
ama_kid
Дата 28.3.2007, 07:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 9
Всего: 95



Вариант yus достаточно неплох (при условии, что и он, и я правильно поняли вопрос), но может правильней переопределить деструктор MDI-формы?


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Злоумышленник
Дата 28.3.2007, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.9.2006

Репутация: нет
Всего: -3



Вы меня не так поняли. Не главная форма, а родительская, она даже не создаётся, просто инкапсулирует общие для всех форм действия.
А переопределение деструкторОВ MDI-форМ ничего нового, кроме лишнего кода, не даст. 
Вот определение формы, наследуемой от TfmLabxForm:
Код

//.........
type
  TfmLabxForm1 = class(TfmLabxForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
//.........

Я сейчас делаю примерно так в КАЖДОЙ наследуемой форме:
Код

procedure TfmLabxForm1.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  inherited;
  fmLabxForm1 := nil;
end;
//...........

Хочется fmLabxForm1 := nil; и все остальные (fmLabxForm2, 3, ... ,35) один раз при закрытии в nil ставить в РОДИТЕЛЕ

Это сообщение отредактировал(а) Злоумышленник - 28.3.2007, 10:33
PM   Вверх
Rennigth
Дата 28.3.2007, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 15
Всего: 76



Злоумышленник, Что ты хочешь сделать, так нельзя. Я как понимаю это тебе нужно для анализа существования формы(аля создавать или нет)? Нужно писать отдельный менеджер который и будет создавать формы, хранить на них указатели, и анализировать их уничножение. 


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
ama_kid
Дата 28.3.2007, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 9
Всего: 95



Да позволено мне будет спросить: а откуда родитель может знать о своих потомках? По-моему, в принципах ООП такой связи не предусмотрено... Это потомок знает своего предка в лицо, а наоборот - это нонсенс какой-то...


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Злоумышленник
Дата 28.3.2007, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.9.2006

Репутация: нет
Всего: -3



решено другим способом
http://expert.delphi.int.ru/question_440

"Ответ эксперта:
Задача осложняется тем, что на одну форму может быть не одна переменная-указатель. Что и есть в вашем случае. Self и FormXXX. И форма не сможет обнулить их всех. это даже в теории сложно звучит.
Что делать. Есть два варианта. Один, в формкрейте передавать ссылку на переменную, которую нужно обнулить по выходу. Второе решение заключается в том, (я его часто применяю) что когда форма пропадает, то она пропадает с глобального маасива Screen.Forms. Тоесть, когда создаёте новую форму, вам нужно проверить, а нет ли её ещё. И с помощю банального цикла
for i:=0 to Screen.FormCount-1 do
if TForm(Screen.Forms).XXXXX = XXXXX
then {наша форма найдена!}
мы по какомуто критерию ищем нашу форму. Нашли - указатель на неё валиден. нет - звиняйте. Можно обнулять и создавать новую форму.
Пожалуйста, не забывайте оценивать ответы экспертов! Нам важно Ваше непредвзятое мнение!
Ответ отправил(а): Вадим К
Дата и время отправки ответа: 28.03.2007, 11:31"

Правда, проверить смогу только через 2 недели на работе - сейчас отпуск

Это сообщение отредактировал(а) Злоумышленник - 28.3.2007, 11:54
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1448 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.