ورود

View Full Version : سوال: باز کردن و بستن چند فرم با form.show



masoode
چهارشنبه 30 خرداد 1403, 17:24 عصر
سلام
من همیشه فراری هستم از اینکه به کاربرم اجازه باز کردن چند فرم بدهم. اما الان مجبور شدم!!
فرض کنید من دو تا فرم با نامهای زیر دارم
Form1:Tform1
Form2:Tform2
می خواهم روی فرم اول یک کلید بگذارم که با زدن آن فرم دوم باز شود ولی به فرم اول هم دسترسی داشته باشد. ضنما فرم دوم Auto-Create نیست و موقع زدن کلید ساخته میشود.
یک همچین چیزی:

frm2:=Tform2.Create(self);
frm2.show;

تا اینجا که ساده بود. اما می خواهم اولا موقعی که فرم دوم بسته شد free شود و ضمنا موقعی که روی کلید زده میشود اگر فرم دوم قبلا ساخته شده بود دیگر کاری انجام ندهد.
البته در onClose فرم دوم Action:=caFree; را قرارداده ام که ظاهرا باید موقع بسته شدن فرم آن را آزاد کند.
همچنین در زمانی که کلید زده میشود با assigned چک میکنم:
if not Assigned(frmPM) then begin
frm1:=TForm1.Create(Self);
frm.Show;
end;
اما با این کد یک بار فرم دوم ساخته و نمایش داده میشود ولی اگر فرم بسته شد دیگر ساخته نمی شود و خروجی تابع Assigned همچنان true برمیگرداند!

دلفــي
یک شنبه 03 تیر 1403, 09:39 صبح
unit Unit1;


interface


uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;


type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;


var
Form1: TForm1;


implementation


{$R *.dfm}


uses Unit2;


function FormExists(MyForm: TObject): boolean;
var i: Integer;
begin
Result := False;
for i := 0 to Application.ComponentCount-1 do
if Application.Components[i] = MyForm then begin
Result := True;
Break;
end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
if FormExists(Form2) = False then
begin
try
Application.CreateForm(TForm2, Form2);
finally
Form2.Show;
end;
end;
end;


end.






unit Unit2;


interface


uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs;


type
TForm2 = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;


var
Form2: TForm2;


implementation


{$R *.dfm}


procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Destroy;
end;


end.

masoode
شنبه 09 تیر 1403, 13:20 عصر
با این روشهایی که دوستان گفتند مشکل اولیه ام حل می شود.
حال یک مشکل دیگر داریم:
اگر فرم اول یک فرم دیگر مثلا FORM1_1 را با ShowModule باز کند، تا این فرم بسته نشود، نه تنها فرم اول غیر فعال است (که ذات ShowModule همین است) بلکه فرم دوم هم تا FORM1_1 بسته نشود غیر فعال می ماند. من میخواهم فرم 1 و فرم 2 مستقل باشد:گریه:

دلفــي
یک شنبه 10 تیر 1403, 08:43 صبح
با این روشهایی که دوستان گفتند مشکل اولیه ام حل می شود.
حال یک مشکل دیگر داریم:
اگر فرم اول یک فرم دیگر مثلا FORM1_1 را با ShowModule باز کند، تا این فرم بسته نشود، نه تنها فرم اول غیر فعال است (که ذات ShowModule همین است) بلکه فرم دوم هم تا FORM1_1 بسته نشود غیر فعال می ماند. من میخواهم فرم 1 و فرم 2 مستقل باشد:گریه:

خوب با ShowModule نشون نده از Show استفاده کن که این مشکل ر و نداشته باشی

یوسف زالی
یک شنبه 10 تیر 1403, 12:01 عصر
در سطح یک اپلیکیشن، نمی تونید بیش از یک شومودال اکتیو داشته باشید، آخرین مودال همیشه روی کل پروژه مودال است، چنانچه رفتار دیگه ای مد نظره، باید خودتون در سطج مستر فرم پیادش کنید.