Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.008 c
14-65619
Сатир
2003-10-02 16:49
2003.10.20
ГРЯЗНЫЕ ТЕХНОЛОГИИ


3-65347
Woolen
2003-09-26 17:33
2003.10.20
Буферизация данных в отчете


1-65438
Aleksandr
2003-10-07 16:24
2003.10.20
Как трассировать DLL?


11-65399
mike.dld
2003-02-06 11:23
2003.10.20
Проблемы


1-65430
slap
2003-10-09 09:56
2003.10.20
TDateTime и TTime





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский