PDA

View Full Version : چگونه بفهمیم که یک فرم فرزند را وجود دارد یا نه؟



Rocker
پنج شنبه 19 مهر 1386, 10:16 صبح
سلام دوستان:
من در برنامه ام از روش فرم والد و فرزند استفاده کرده ام و برای اینکه هنگامی که روی دکمه close فرم های فرزند کلیک شد آنها بسته شوند و همچنین اینکه نیازی نیست که این فرمها دائما در حافظه باشند در رویداد onClose آنها Action را برابر با caFree قرار دادها م خوب این کار درواقع هنگام بستن فرم آنرا از بین میبرد به نوعی Destory حالا برای اینکه کاربر مجداد بخواهد اون فرم رو باز کند ما باید در قسمت مربوطه دستور مربوط به ایجاد فرم را قرار دهیم .
خوب تا اینجای کار مشکلی نبود اما مشکل اصلی اونجایی هست که کاربر بیاد مجداد روی اون منو یا هر چیز دیگری که باعث ایجاد فرم میشود کلیک کند باز هم یک فرم دیگر عین همان تولید میکند مثلا ممکنه در یک زمان در برنامه چنید فرم مثل هم داشته باشد به علت کلیک ها اشتباه.
حالا من دنبال روشی هستم تا بتوانم تشخیص دهم که فرم فرزند مربوطه ایجاد شده یا نه تا بر اساس اون برنامه تصمیم بگیره که فرم رو ایجاد کنه یا نه.
ممنومم از راهنماییتون.

Arman_1367
پنج شنبه 19 مهر 1386, 10:39 صبح
خوب اولین راهی که هست اینه که برای هر کدام یک متغییر سراری تعریف منظورم اینه که برای هر کدام از کلاسها و بعد موقع ساختن اولین شئی بریزش داخل اون دفعه بعد که کلیک کردند چک کنی اگر مقدار این متغییر nil بود دوباره فرم ساخته بشه وگرنه همون فرم درون متغییر را نمایش بدهید.

Rocker
پنج شنبه 19 مهر 1386, 10:41 صبح
خوب اولین راهی که هست اینه که برای هر کدام یک متغییر سراری تعریف منظورم اینه که برای هر کدام از کلاسها و بعد موقع ساختن اولین شئی بریزش داخل اون دفعه بعد که کلیک کردند چک کنی اگر مقدار این متغییر nil بود دوباره فرم ساخته بشه وگرنه همون فرم درون متغییر را نمایش بدهید.
آرمان جان دستت درد نکنه اینم روشه خوبیه.

Mahyaa
پنج شنبه 19 مهر 1386, 10:47 صبح
چک کنید اگر فرم مقدارش Nil نبود ، اون رو Create کنید وگرنه فقط Show کنید . در ضمن برای اینکه مطمئن بشید که فرم بسته شده بعد از Free شدن ، مقدار nil میگیرد ، بعد از اینکه Action رو caFree کردید ، مقدار فرم را برابر Nil قرار بدید :



َAction := caFree;
MyForm := nil;

.

Arman_1367
پنج شنبه 19 مهر 1386, 10:52 صبح
روش دوم اینه :

Var Found:Boolean;
Begin
Found:=False;
For I:=0 to Self.MDIChildcount-1 do
If MDIChildren[i] is TFrmSecClass then
Begin
MDIChildren[i].show();
Found:=True;
Break;
End;
If not Found then
With TFrmSecClass.Create(Self) do
Show;
End;
البته شکی در این نیست که روش اول خیلی بهتر هست.

موفق باشید.

Rocker
پنج شنبه 19 مهر 1386, 11:52 صبح
از همه دوستان خیلی ممنونم.
من به هدفم رسیدم خیلی ازتون متشکرم.