PDA

View Full Version : مشتق گیری از Form و محو شدن property های جدید



alefbe
یک شنبه 01 خرداد 1384, 11:47 صبح
سلام خدمت تمامی خواهران و برادران دلفی کار عزیز
اما بعد!!

کسی هست که تا به حال موفق شده باشد از یک کلاس دلفی مشتق گیری کند؟
چه جوری است که وقتی برای کلاس پایه (که خود از TForm مشتق شده)، property تعریف می کنیم آن property در کلاس مشتق شده محو می شود؟


آیا باید به صورتی فرم را register کرد؟
چه جوری؟


پیشاپیش متشکرم

vcldeveloper
دوشنبه 02 خرداد 1384, 03:26 صبح
کسی هست که تا به حال موفق شده باشد از یک کلاس دلفی مشتق گیری کند؟
هر بار که فرمی در دلفی می سازید، در واقع یک کلاس از TForm مشتق (derive) می کنید.


چه جوری است که وقتی برای کلاس پایه (که خود از TForm مشتق شده)، property تعریف می کنیم آن property در کلاس مشتق شده محو می شود؟
شما باید با استفاده از کلمات کلیدی public, private و protected سطح دسترسی کلاس های فرزند (کلاس های مشتق شده) و کلاس های دیگه رو برای هر متد و property مشخص کنید. اگر property مورد نظر در بخش protected یا public قرار داشته باشه، کلاس فرزند براحتی می تونه ازش استفاده کنه.مثال:


TBaseClass = class
private
FData : string;
procedure SetData(AValue: string);
function GetData: string;
public
property Data: string read GetData write SetData;
end;

TChildClass = class(TBaseClass)
private
FTest : integer;
end;

دقت کنید که کلاس هایی که در یک یونیت تعریف میشند به بخش private هم دسترسی دارند.
راهنمای دلفی:


A private member is invisible outside of the unit or program where its class is declared. In other words, a private method cannot be called from another module, and a private field or property cannot be read or written to from another module. By placing related class declarations in the same module, you can give the classes access to one another's private members without making those members more widely accessible.

A protected member is visible anywhere in the module where its class is declared and from any descendant class, regardless of the module where the descendant class appears. A protected method can be called, and a protected field or property read or written to, from the definition of any method belonging to a class that descends from the one where the protected member is declared. Members that are intended for use only in the implementation of derived classes are usually protected.

A public member is visible wherever its class can be referenced.

alefbe
دوشنبه 02 خرداد 1384, 13:57 عصر
از پاسخ دوست عزیز متشکرم
ظاهرا سئوالم را ناقص مطرح کرده ام که باید عذر خواهی کنم
سوال را به نحوه دیگری و با تفصیل مطرح می کنم:
ببینید هر فرم تازه ای که کاربر می سازد یک کلاس از TForm مشتق می کند.قبول.

امکان خوبی که دلفی در اختیار برنامه نویسان می گذارد این است که از فرمی که خود ساخته اند فرم جدیدی مشتق کنند مثلا من فرمی به نام Form1 ساخته ام.حالا می توانم در منوی file به قسمت new رفته و وارد other شوم تا repository نمایش یابد .
حال در برگه ای که نام آن همان نام پروژه است Form1 ظاهر می شود و به این ترتیب می توان فرمی از Form1 مشتق نمود. فرض کنیم این کار را کرده و نام فرم جدید را FormA می گذاریم.اکنون لیست property ها و event های FormA دقیقا همان لیست Form1 است.
حال داریم
...
TFormA = class (Tform1)
... الی آخر
تا اینجا هیچ مشکلی نداریم. حالا بیاییم و یک property جدید برای کلاس پدر یا همان Form1 ایجاد کنیم.
روش این کار دقیقا همان است که دوست عزیز آقای کشاورز فرموده اند.
پس داریم
...
TForm1 = class (Tform)
private
FmyProperty :TNotifyEvent;
...
protected
property myProperty:TNotifyEvent read FmyProperty write FmyProperty;
...
الی آخر

مسئله این است که این property جدید در FormA ظاهر نمی شود.

(ببخشید شاید صورت مسئله کاملا چیز دیگری شده باشد شرمنده :sorry: )
آیا باید Form1 را Register کرد؟ اگر این طور است روش این کار چگونه است و اگر نه پس چه باید کرد.

ebnsina
دوشنبه 02 خرداد 1384, 19:50 عصر
دوست عزیز در واقع مشکل شما با نوشت یک Component حل میشه.
به این طریق که وقتی نکات مورد نظرت رو برای یک ابزار نوشتی و این شیی رو به تکامل مورد نظرت رسوندی باید اون رو بصورت یک کامپوننت قابل نصب در یک یا چند یونیت دربیاری و سپس اون رو بعنوان یک کامپوننت جدید نصب کنی. که در اینصورت یک تب جدید محتوی این کامپوننت برای شما بوجود میاد (الیته VCL tab مورد نظر برای قرار گرفتن این کامپوننت رو هم باید در یونیت اون ذکر کنی) و پراپرتی ها هم بعد انداختن اون بروی فرم برات توی Objetc Inspector ظاهر میشه.
اما اینکه ساختار نوشتن یک کامپونت قابل نصب چیه به Help خود دلفی مراجعه کن که بسیار غنی- واگر خوب سردرنیاوردی مطرح کن تا دوستان جواب بدن. البته در این سایت دوستان کامپوننت های زیادی از خودشون نوشتن و ارایه کردن که خودش میتونه یک کلاس درس حسابی باشه. مثلا کامپوننت آقای خلیل زاده که در این تاپیک توسط جاوید جان همراه با سورس ارایه شد :

http://www.barnamenevis.org/forum/viewtopic.php?t=26443&start=10

موفق باشید.
:flower:

alefbe
سه شنبه 03 خرداد 1384, 07:03 صبح
دوست عزیز
از پاسخ شما بسیار متشکرم.
آنچه من به دنبال آن هستم توارث از یک فرم است.
این کار اگرچه از بسیاری جهات مشابه ایجاد یک کامپوننت است اما کاملا با آن یکسان نیست.
وقتی یک کامپوننت جدید نوشته می شود برای استفاده از آن باید به component palette مراجعه کرد اما برای استفاده از یک فرم باید به repository مراجعه کرد و هیچ وقت برای ایجاد یک فرم جدید به component palette مراجعه نمی کنیم.
قصد من این است که فرمی بنویسم که در repository نمایش یابد.
اختلاف در نتایج دلیل بر اختلاف در مقدمات است و قبلا از روش ساخت کامپوننت استفاده کرده ام و به نتیجه ای نرسیده ام.
مجددا از ابن سینای عزیز تشکر می کنم.

vcldeveloper
چهارشنبه 04 خرداد 1384, 01:29 صبح
آنچه من به دنبال آن هستم توارث از یک فرم است.
ایجاد property جدید در فرم پایه و استفاده از آن در فرم های فرزند هیچ مشکلی نداره (من خودم آزمایش کردم). کاری که شما در بالا توضیح دادید درست است، ولی احتمالا در انجام آن اشتباهی انجام میدید.


آیا باید Form1 را Register کرد؟
خیر

alefbe
چهارشنبه 04 خرداد 1384, 07:30 صبح
propety جدید اگرچه در کلاسهای فرزند قابل استفاده است اما در object inspector مشاهده نمی شود
ضمنا Source را هم می آورم تا دوستان لطف کرده و بررسی نمایند

کلاس پایه:


unit Unit1

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type TMyEvent=
procedure(Sender: TObject;Param :Smallint)of object;
type
TFormBase = class(TForm)
procedure FormClick(Sender: TObject);
private
FMyEvent: TMyEvent;
{ Private declarations }
public
{ Public declarations }
published
property OnMyEvent: TMyEvent read FMyEvent write FMyEvent;
end;

var
FormBase: TFormBase;

implementation

{$R *.dfm}

procedure TFormBase.FormClick(Sender: TObject);
begin
if(assigned(FMyEvent))then
FMyEvent(self,1);
end;

end.


کلاس فرزند:


unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Unit1;

type
TFormDescendant = class(TFormBase)
private
{ Private declarations }
public
{ Public declarations }
end;

var
FormDescendant: TFormDescendant;

implementation

{$R *.dfm}

end.


همان طور که گفتم رویداد OnMyEvent در Object Inspector ظاهر نمی شود.فکر می کنم که دوستان در مورد اینکه نمایشEvent ها بسیار ضروری است با من هم عقیده باشند.
در عین حال در صورتی که constructor مربوط به کلاس فرزند overload شود میتوان به طور دستی یک procedure با پارامتر های یکسان به Event نسبت داد اما این کار چندان هم دلچسب نیست.

از لطف دوستان که وقت می گذارند متشکرم.
در ورژن های قدیمی دلفی دیده ام که با استفاده از مفهومی به نام Expert فرمی را به ثبت رسانده اند اما این کار ظاهرا در ورژنهای 6 و 7 انجام پذیر نیست. حداقل اینکه من موفق نشده ام

مجددا از دوستانی وقت می گذارند متشکرم

alefbe
یک شنبه 08 خرداد 1384, 09:33 صبح
کسی از دوستان جواب نمی دهد؟
DelphiAssistant کمک...SOS !!!

alefbe
یک شنبه 22 خرداد 1384, 10:45 صبح
الو!