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

Вниз

MDI формы и проблема ограничения создания дочерних окон   Найти похожие ветки 

 
Delph ©   (2003-10-08 16:33) [0]

Здравствуйте.
Суть проблемы: Есть MDI приложение и 5 РАЗЛИЧНЫХ дочерних окон.
Надо, чтобы при нажатии, скажем, на кнопку осущ. проверка создано-ли уже окно такого типа (Form1,Form2...Form3) и если нет, то создать его.

Побовалось: if (Form1=nil) - во второй раз не сраб.
if (Form1=nil) or (not Form1.HandleAllocated)
Если сталкивались с такой проблемой, убедительная просьба помочь


 
AlexSV   (2003-10-08 17:03) [1]

> Побовалось: if (Form1=nil) - во второй раз не сраб.

Чтобы срабатывало напиши в OnDestroy дочерней формы
Form1 := nil
если Form1 объявлена там же где и описан класс


 
webpauk   (2003-10-08 17:24) [2]

if assigned(Form1) then...
else Form1.Create


 
Woolen   (2003-10-08 17:27) [3]


> if assigned(Form1) then...
> else Form1.Create

И ни хрена второй раз ен сработает, потому что переменная в первый раз рисвоится и все - дальше всегда будедет обнаруживаться, даже если формы нет. Он, кстати, так и делал


 
Delph ©   (2003-10-08 17:29) [4]

Спасибо:)


 
webpauk   (2003-10-08 17:31) [5]

2Woolen
ежели Form1.free то по-моему должно сработать


 
Woolen   (2003-10-08 17:41) [6]


> 2Woolen
> ежели Form1.free то по-моему должно сработать

Ни хрена. Объект в памяти уничтожается, а Assigned(Form1) проверит, чтобы переменная Form1 не была равна нулю, а она и не будет равна - там будет по-прежнему то же число - то бишь адрес, по которому лежало содержимое уничтоженного объекта. Срабатывает FreeAndNil(Form1). Так не только уничтожается объект, но и обнуляется переменная.


 
webpauk   (2003-10-08 17:55) [7]

var
Form1: TForm1;
Form2: TForm;
Form3: TForm;

implementation

{$R *.dfm}

procedure TForm1.ToolButton1Click(Sender: TObject);
begin
if Assigned(Form2) then BringWindowToTop(Form2.Handle)
else
begin
Form2:=TForm.Create(Self);
Form2.FormStyle:=fsMDIChild;
Form2.OnClose:=fClose;
BringWindowToTop(Form2.Handle);
end;
end;

procedure TForm1.fClose(Sender: TObject; var Action: TCloseAction);
begin
Form2:=Nil;
Action:=caFree;
end;

end.


 
webpauk   (2003-10-08 17:55) [8]

точнее, говоря:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ToolWin;

type
TForm1 = class(TForm)
ToolBar1: TToolBar;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
procedure ToolButton1Click(Sender: TObject);
procedure fClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
Form2: TForm;
Form3: TForm;

implementation

{$R *.dfm}

procedure TForm1.ToolButton1Click(Sender: TObject);
begin
if Assigned(Form2) then BringWindowToTop(Form2.Handle)
else
begin
Form2:=TForm.Create(Self);
Form2.FormStyle:=fsMDIChild;
Form2.OnClose:=fClose;
BringWindowToTop(Form2.Handle);
end;
end;

procedure TForm1.fClose(Sender: TObject; var Action: TCloseAction);
begin
Form2:=Nil;
Action:=caFree;
end;

end.


 
Анонимщик ©   (2003-10-08 18:20) [9]

А у меня еще вопрос, если в OnClose не устанавливать указатель в nil, можно ли все равно узнать, есть такая форма или нет?


 
AlexSV   (2003-10-08 18:36) [10]

> Анонимщик © (08.10.03 18:20) [9]
Можно (в контексте дискуссии)

try
Form1.BringToFront;
except
Form1 := TForm1.Create(Self);
end;


 
Анонимщик ©   (2003-10-08 18:39) [11]

Нет, это обман.
Нужно именно узнать - исходя из анализа, а не из неудачных попыток.


 
webpauk   (2003-10-08 18:56) [12]

procedure TForm1.ToolButton1Click(Sender: TObject);
var
I: Integer;
Log: Boolean;
begin
Log:=False;
for I:=0 to Form1.MDIChildCount-1 do
begin
ShowMessage(Form1.MDIChildren[I].GetNamePath);
if Form1.MDIChildren[I].GetNamePath="Form2" then Exit
else
begin
Form2:=TForm.Create(Self);
Form2.Name:="Form2";
Form2.FormStyle:=fsMDIChild;
Form2.OnClose:=fClose;
BringWindowToTop(Form2.Handle);
Log:=true;
end;
end;
if not log then
begin
Form2:=TForm.Create(Self);
Form2.FormStyle:=fsMDIChild;
Form2.Name:="Form2";
Form2.OnClose:=fClose;
BringWindowToTop(Form2.Handle);
end;
end;


 
webpauk   (2003-10-08 18:56) [13]

топорно, но действует


 
Анонимщик ©   (2003-10-08 19:10) [14]

Ладно, а если форма не дочерняя?


 
AlexSV   (2003-10-08 19:10) [15]

> webpauk (08.10.03 18:56) [12]
Ну тогда уж так:

...
for I:=0 to MDIChildCount-1 do
begin
if (MDIChildren[I] = Form1) then begin
Form1.BringToFront;
Exit;
end;
end;
Form1 := TForm1.Create(Self);
...


 
webpauk   (2003-10-08 19:11) [16]

а чё пристал?
а слабо help почитать?


 
Анонимщик ©   (2003-10-08 19:23) [17]

Я так никогда не отвечаю



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

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

Наверх




Память: 0.5 MB
Время: 0.017 c
8-65557
Mr.ElectroNick
2003-06-14 10:19
2003.10.20
Изменение размера компоненты (от TImage) в RunTime


6-65570
oduvan
2003-08-24 17:01
2003.10.20
ClientSocket!!!!!


1-65497
АТ
2003-10-08 10:32
2003.10.20
поля в TPrinter


8-65555
Oxy
2003-06-20 13:14
2003.10.20
Как сделать flip для Tbitmap


3-65363
MakNik
2003-09-24 15:24
2003.10.20
Аналог TOpenDialog