Форум: "Основная";
Текущий архив: 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 ©
Я это сделал но наоборот !
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.03.14;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.107 c