ورود

View Full Version : وراثت تمام فرم های برنامه از یک کلاس



Mohammad_Mnt
پنج شنبه 01 دی 1384, 16:36 عصر
من می خوام تمام فرم های پروژه ام فرضا از کلاس TMyForm مشتق بشن حتی همون هایی که با FormDesigner درست می شن .
البته من یه کامپوننت فرم درست کردم ولی وقتی توی فرم دیزاینر به پروژه اضافه می کنم ، مشکل MemoryLeak پیش می آد :(

vcldeveloper
جمعه 02 دی 1384, 02:11 صبح
کار خاصی لازم نیست انجام بدی، کلاس والد را در Editor دلفی ایجاد کن و بعد تعریف فرم های برنامه ات را طوری تغییر بده که بجای TForm از کلاس والدی که درست کردی مشتق بشند:


type
TBaseForm = class(TForm)
private
{ Private declarations }
public
Test : integer;
end;

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

یک راه دیگه هم اینه که از Frame ها در فرمهات استفاده کنی. یه Frame والد درست کن و روش هر کنترلی که لازم هست بزار وکدهای مربوط بهشون رو هم بنویس. بعدش می تونی در هر کدوم از فرمهات یک نمونه از اون Frame را بزاری. هر تغییری که در Frame والد بدی، بالافاصله در تمام Frame های مشتق شده از آن اعمال میشه.

Naficy
شنبه 03 دی 1384, 15:12 عصر
احتیاج به هیچ کار خاصی نیست:
بعد از ساخت فرم والد، آنرا به Object Repository اضافه کنید. (این مرحله ضروری نیست. توضیح در ادامه) سپس از درون Object Repository فرم مربوطه را انتخاب کنید، گزینه ی Inherited را انتخاب کرده و ok را بزنید. فرم جدید حاصل، از فرم والد ارث خواهد برد.
(Object Repository همان پنجره ایست که بازدن کلید New ظاهر می شود)
ضمنا نیازی نیست لزوما فرمتان را به Object Repository اضافه کنید. اگر یک پروژه باز باشد، تمام فرمهای آن درون یکی از تبهای Object Repository نشان داده می شوند.

Artawahista
شنبه 03 دی 1384, 15:55 عصر
دوست عزیز شما 2 راه حل خوب دارید

1.کاری که دوست عزیزم علی کشاورز فرمودند

2.اما راه حل اول داری مشکل است.در واقع دارای نقص است
زیرا کلاس TBaseForm فقط در RunTime کار میکند
یعنی اگر شما Property به TBaseForm اضافه کنید در قسمت ObjectInspector دیده نمیشود
برای رفع این مشکل بایستی کلاس TBaseForm را مانند Component هایی که می نوسید Register شود
اما روش Register کردن فرم کمی پیچیده است و در ضمن در Delphi2005 دارای مشکل(یعنی هر کاری کردم نشد و مشکل داشت) اما در Delphi 7 مشکلی ندارد و حدس می زنم مشکل از محیط Delphi2005 باشد.


اگر مایل به ادامه بحث هستید با من تماس بگیرد تا روش Register کردن فرم در Delphi رو خدمتتون بگم.

Artawahista

Mohammad_Mnt
یک شنبه 04 دی 1384, 18:44 عصر
مرسی از همه دوستان
Artawahista جان ، تماس نداره دیگه ! همین جا بفرمایین تا اگه کس دیگه ای هم مشکل داشت راحل رو پیدا کنه :)

Naficy
دوشنبه 05 دی 1384, 12:03 عصر
بی خودی لقمه رو دور سرتون نچرخونین. شما احتیاجی به Register کردن و ... ندارید. از روشی که ذکر کردم استفاده کنید. (روش استاندارد هم همینه)

Mohammad_Mnt
پنج شنبه 11 خرداد 1385, 22:05 عصر
احتیاج به هیچ کار خاصی نیست:
بعد از ساخت فرم والد، آنرا به Object Repository اضافه کنید. (این مرحله ضروری نیست. توضیح در ادامه) سپس از درون Object Repository فرم مربوطه را انتخاب کنید، گزینه ی Inherited را انتخاب کرده و ok را بزنید. فرم جدید حاصل، از فرم والد ارث خواهد برد.
(Object Repository همان پنجره ایست که بازدن کلید New ظاهر می شود)
ضمنا نیازی نیست لزوما فرمتان را به Object Repository اضافه کنید. اگر یک پروژه باز باشد، تمام فرمهای آن درون یکی از تبهای Object Repository نشان داده می شوند.
یادم رفته بود بگم این روش خیلی راحت جواب داد . ممنون :تشویق: