Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.03.14;
Скачать: CL | DM;

Вниз

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

 
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 ©
Я это сделал но наоборот !



Страницы: 1 вся ветка

Текущий архив: 2002.03.14;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.011 c
1-43005
метеоролог
2002-02-28 15:30
2002.03.14
компонент DELPHI3


1-43010
wicked
2002-02-26 11:26
2002.03.14
про string


1-43101
Poirot
2002-02-28 07:43
2002.03.14
Как в компонент ввести свойство типа Int4


1-43095
Стас
2002-02-28 06:31
2002.03.14
Помогите чайнику


3-42971
Natalie
2002-02-16 23:01
2002.03.14
проблемы при работе с ADO