Форум: "Основная";
Текущий архив: 2003.10.20;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.007 c