View Full Version : ایجاد محدودست در دفعات باز کردن فرم فرزند
MOJTABAATEFEH
جمعه 27 خرداد 1390, 13:55 عصر
سلام دوستان عزیز در برنامه های MDI چطور میشه چک کرد که یک فرم فرزند باز هست یا نه تا از باز شدن مجدد اون فرم جلوگیری کنیم یعنی در حقیقت هر فرم تنها یکبار بتواند نمایش داده شود و تا بسته نشده نتونه مجدد نمایش داده بشه؟
با تشکر
سعید صابری
جمعه 27 خرداد 1390, 14:13 عصر
با این کد
if Form2.Showing then
MOJTABAATEFEH
جمعه 27 خرداد 1390, 14:42 عصر
دوست عزیز ممنون بابت پاسختون ولی این دستور رو استفاده کردم جواب نمیده
Mahmood_M
جمعه 27 خرداد 1390, 14:45 عصر
معمولا فرمهای MDIChild برای نمایش Create میشن و برای بستن Free میشن ، پس امکان استفاده از شرط Showing وجود نداره ، چون اگر فرم Create نشده باشه و شما showing رو بررسی کنید با یک Access Violation مواجه خواهید شد
راه های مختلفی برای حل این مشکل وجود داره ، اولین راه اینه که شما یک متغیر مثلا Boolean داشته باشید و در هر بار Create و نمایش فرم اون رو True کنید و در هنگام بستن فرم اون رو False کنید و برای فهمیدن اینکه فرم Create شده و در حال نمایش هست ، مقدار اون متغیر رو بررسی کنید
راه دوم اینه که شما یک متغیر عمومی برای فرم Child درنظر بگیرید و مثلا به صورت زیر نمایش و بستنش رو مدیریت کنید :
برای نمایش
var
MDIForm: TMDIForm;
MyChild : TMyChildForm;
implementation
{$R *.dfm}
procedure TMDIForm.ShowBtnClick(Sender: TObject);
begin
if not Assigned(MyChild) then
MyChild := TMyChildForm.Create(Application);
...
end;
برای OnClose
procedure TMyChildForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
if Assigned(MyChild) then
MyChild := nil;
end;
توجه کنید که MyChild یک متغیر عمومی در Unit مربوط به فرم MDI اصلی هست
راه دیگه اینه که با استفاده از نام فرم Child اون رو در بین فرمهای Child فعال پیدا کنید ، به عنوان مثال تابع زیر رو در کلاس فرم MDI اصلی تعریف می کنیم :
function TMDIForm.CheckMDIChild(ChildName : String): Boolean;
var
I : Integer;
begin
Result := False;
for I := 0 to MDIChildCount - 1 do
begin
if MDIChildren[I].Name = ChildName then
begin
Result := True;
Exit;
end;
end;
end;
برای استفاده :
if CheckMDIChild('MyChildForm') then
ShowMessage('Showing');
موفق باشید ...
MOJTABAATEFEH
جمعه 27 خرداد 1390, 14:52 عصر
ممنون دستور
Application.CreateForm(TChildForm, ChildForm);
رو باید از سورس حذف کنم و به دکمه نمایش اضافه کنم یا نه؟
Mahmood_M
جمعه 27 خرداد 1390, 14:59 عصر
به منوی Project > Options برید و در قسمت Forms ، فرم Child رو از لیست Auto-Create Forms به لیست Available Forms انتقال بدید ، اون خط خودش حذف میشه و دیگه برنامه در زمان شروع ، فرم Child رو خودش نمی سازه
MOJTABAATEFEH
جمعه 27 خرداد 1390, 15:08 عصر
موقع استفاده باید ساخته بشه درسته؟
Mahmood_M
جمعه 27 خرداد 1390, 15:27 عصر
بله ، هر زمان که نیاز به نمایش فرم بود ، اون رو می سازید و بعد نمایش میدید و در زمان بستن فرم هم Free می کنید : Action = caFree در رویداد OnClose
Felony
جمعه 27 خرداد 1390, 16:31 عصر
در رویداد OnClose فرم Child :
Action := caFree;
if Assigned(Self) then
Self := nil;
و برای بررسی مثلا فرم 2 :
if (Assigned(Form2)) and (Form2.Showing) then
ShowMessage('Showing');
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.