![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как создавать дочерние формы в единственном экземпляре ? [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;