Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.14;
Скачать: [xml.tar.bz2];




Вниз

Как создавать дочерние формы в единственном экземпляре ? 


IronHawk   (2002-02-28 16:53) [0]

Нужно пораждать несколько разных дочерних форм без возможности их дублирования !
Дано :
Есть Материнская форма 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 форме ???



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

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 17:03) [2]

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

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;



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

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



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

Вот так (если эти формы хоть чем - нибудь отличаються, например отличаются именем класса одна 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:09) [5]

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

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



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


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

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

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

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

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



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

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



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


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

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



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

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



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


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

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

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

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



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

На пальцах:

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


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

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



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

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

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



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

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

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



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

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

Action:=caFree;
Form1:=nil;

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



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

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




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.14;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.022 c
14-43166          Alex12                2002-01-28 15:20  2002.03.14  
Delphi или C?


1-43065           Demon ltd             2002-02-26 23:43  2002.03.14  
Работа с Инстал Шилдом


1-43040           bnn                   2002-02-26 15:10  2002.03.14  
Наследование формы


14-43138          Юрий Федоров          2002-01-29 10:41  2002.03.14  
Проблема мышей


3-42928           amamed_3071           2002-02-14 08:51  2002.03.14  
Qreport GroupFooter in Subdetail