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

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

Как создавать дочерние формы в единственном экземпляре ? [D5, Win95/98, Win2k]


IronHawk ©   (2002-02-28 16:53:00) 

Нужно пораждать несколько разных дочерних форм без возможности их дублирования !
Дано :
Есть Материнская форма FMain и 3 дочерние FChild1, FChild2, FChild3.
Как обрубить возможность их дублирования ?

Есть такое :

procedure FMain.Button1Click(Sender: TObject);
begin
FChild1 := TFChild.Create(Application);
end;
procedure FMain.Button2Click(Sender: TObject);
begin
FChild2 := TFChild.Create(Application);
end;
procedure FMain.Button3Click(Sender: TObject);
begin
FChild3 := TFChild.Create(Application);
end;

так создаеться их немерянно !

А так может быть только одна из них :

procedure FMain.Button1Click(Sender: TObject);
begin
if FMain.MDIChildCount<>1 then FChild1 := TFChild.Create(Application);
end;
procedure FMain.Button2Click(Sender: TObject);
begin
if FMain.MDIChildCount<>1 then FChild2 := TFChild.Create(Application);
end;
procedure FMain.Button3Click(Sender: TObject);
begin
if FMain.MDIChildCount<>1 then FChild3 := TFChild.Create(Application);
end;

Какой и куда надо сунуть код, что б могло быть только по одной FChild форме ???


IronHawk   (2002-03-01 10:46:00) [1]

>>> Shirson ©
Я это сделал но наоборот !


Shirson   (2002-03-01 09:04:00) [2]

В onClose это работает ничуть не хуже.
Если форма MDIChild то на onClose следует написать

Action:=caFree;
Form1:=nil;

И все, форма благополучна умерла.


IronHawk   (2002-02-28 18:00:00) [3]

>>> Юрий Зотов ©

Спасибо !
Оказываеться надобыло не в FormClose, а в OnDestroy !
СПАСИБО !


Юрий Зотов   (2002-02-28 17:48:00) [4]

procedure TForm1.OnDestroy(Sender: TObject);
begin
Form1 := nil
end;

То же повторить для остальных форм.


Виктор Щербаков   (2002-02-28 17:46:00) [5]

На пальцах:

> if FChild1 = nil then
> FChild1 := TFChild.Create(Application);


Означает:
Если переменная FChild1 равна nil то создаем форму и записываем адрес экземпляра класса созданной формы в FChild1.

После закрытия формы, переменная FChild1 не изменит своего значения. Делай выводы!


IronHawk   (2002-02-28 17:42:00) [6]


> > Виктор Щербаков ©

Извините повторюсь ...

> > И при закрытии каждой MDIChild зануляй ссылку на неё

Можно пояснить на пальцах ?


Алексей Петров   (2002-02-28 17:35:00) [7]

> И при закрытии каждой MDIChild зануляй ссылку на неё
Это слишком приземленно для такого великого мастера, как IronHawk


IronHawk   (2002-02-28 17:31:00) [8]


> И при закрытии каждой MDIChild зануляй ссылку на неё.

А вот этого момента непонял ! 8-)


Кулюкин Олег   (2002-02-28 17:19:00) [9]

Предвосхищая следующий вопрос.
Вывести форму на передний план - FChild1.BringToFront


IronHawk   (2002-02-28 17:11:00) [10]


> Виктор Щербаков © (28.02.02 17:09)
> IronHawk © (28.02.02 17:07)
> См. Виктор Щербаков © (28.02.02 17:03)
>
> И при закрытии каждой MDIChild зануляй ссылку на неё.

ДА !
СРАботало я попробовал так !

Спасибо огромное !
Работает!
Вы настоящие мастера : Виктор Щербаков ©
: SDS ©

Всем спасибо !

ВОПРОС Снимаеться !


Виктор Щербаков   (2002-02-28 17:09:00) [11]

IronHawk © (28.02.02 17:07)
См. Виктор Щербаков © (28.02.02 17:03)

И при закрытии каждой MDIChild зануляй ссылку на неё.


IronHawk   (2002-02-28 17:07:00) [12]

>>> Виктор Щербаков ©
Отлично, только так они ваще непораждаються ! :-(


SDS   (2002-02-28 17:07:00) [13]

Вот так (если эти формы хоть чем - нибудь отличаються, например отличаются именем класса одна TForm1 другая TForm2 и т.д.)

procedure FMain.Button2Click(Sender: TObject);
var
i : integer;
IsForm : boolean;
begin
IsForm := false;
for i := 0 to FMain.MDIChildCount - 1 do{бегаем по "дочкам" и ищем одну из них}
if FMain.MDIChildren[i] is TForm2 then begin
FMain.MDIChildren[i].Show;
IsForm := true;
break;
end;
if Not IsForm then
FChild2 := TFChild.Create(Application);
end;


Виктор Щербаков   (2002-02-28 17:03:00) [14]

Всё наоборот:

procedure FMain.Button1Click(Sender: TObject);
begin
if FChild1 = nil then
FChild1 := TFChild.Create(Application);
end;

procedure FMain.Button2Click(Sender: TObject);
begin
if FChild2 = nil then
FChild2 := TFChild.Create(Application);
end;

procedure FMain.Button3Click(Sender: TObject);
begin
if FChild3 = nil then
FChild3 := TFChild.Create(Application);
end;


Виктор Щербаков   (2002-02-28 16:58:00) [15]

procedure FMain.Button1Click(Sender: TObject);
begin
if FChild1 <> nil then
FChild1 := TFChild.Create(Application);
end;

procedure FMain.Button2Click(Sender: TObject);
begin
if FChild2 <> nil then
FChild2 := TFChild.Create(Application);
end;

procedure FMain.Button3Click(Sender: TObject);
begin
if FChild3 <> nil then
FChild3 := TFChild.Create(Application);
end;


Наверх

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