View Full Version : حدف خصايص كامپوننت والد
امید امرایی
چهارشنبه 02 بهمن 1387, 08:36 صبح
با سلام
كامپوننت طراحي شده از يك فريم مشتق شده (ارث بري كرده). بنده مي خوام property هاي فريم در Object Inspector قابل رويت نباشند . آيا راهي وجود داره ؟
با تشكر
m-khorsandi
چهارشنبه 02 بهمن 1387, 10:53 صبح
ويژگیهای مورد نظرت رو به بخش Public منتقل كن.
امید امرایی
چهارشنبه 02 بهمن 1387, 17:28 عصر
ويژگي هاي والد يا فرزند ؟
اگه منظورتون فرزنده كه فكر مي كنم متوجه سوال بنده نشديد.
اما اگه منظورتون والده عرض كردم والد اين كامپوننت يك فريم از فريم هاي كتابخانه اي خود دلفيه كه منطقي نيست به خاطر يه كامپوننت ساختارش به هم بريزه .
بنده ديده بودم يه بنده خدايي اين كار و كرده بود اما سورس رو نداشتم و متوجه نشدم چطور !
m-khorsandi
چهارشنبه 02 بهمن 1387, 19:11 عصر
اگه منظورتون فرزنده كه فكر مي كنم متوجه سوال بنده نشديد.
تغيير در كلاسهای اصلی منطقی نيست.
كامپوننت طراحي شده از يك فريم مشتق شده (ارث بري كرده). بنده مي خوام property هاي فريم در Object Inspector قابل رويت نباشند . آيا راهي وجود داره ؟
شما كامپوننتی داريد كه از كلاس TFrame يا TCustomFrame مشتق شده؟ و ميخواهيد Propertyهایی در Object Inspector نباشند؟
امید امرایی
پنج شنبه 03 بهمن 1387, 11:26 صبح
شما كامپوننتی داريد كه از كلاس TFrame يا TCustomFrame مشتق شده؟ و ميخواهيد Propertyهایی در Object Inspector نباشند؟
بله دقيقا درسته
Property هاي TFrame كه به كامپوننت به ارث رسيدند در Object Inspector قابل رويت نباشند.
vcldeveloper
پنج شنبه 03 بهمن 1387, 13:02 عصر
همچین کاری از نظر شی گرایی مشکل داره.
اگر هدف پنهان کردن یک متد باشه، میشه متد مربوطه را در یکی از بخش های Private یا Protected با نام مشابه، در کلاس فرزند بوجود آورد، و در انتهای آن هم از کلمه کلیدی reintroduce استفاده کرد، تا متد کلاس والد را مخفی کند.
اما اگر هدف مخفی کردن property باشه، به این راحتی نیست. شما اگه property را به بخش private و protected هم ببرید، بخاطر property کلاس والد، در دسترس خواهد بود. برای property باید در بخش های خصوصی کلاس جدید property هم نامی با property کلاس والد ایجاد کنید که کاری انجام نمیده. حتی در اون صورت هم در Object Inspector نمایش داده میشه!
از نظر شی گرایی برای این کار باید یا از یک کلاس بالاتر کلاس خودتان را مشتق بگیرید؛ مثلا از TCustomForm بجای TForm، یا اینکه کلاس جدیدی ایجاد کنید که نمونه ایی از آن کلاس مورد نظر شما (مثلا TForm) را در داخل خودش ایجاد کند، و فقط آن خصوصیاتی که مد نظر شما هست را در اختیار محیط بیرون قرار دهد:
TFoo = class(TComponent)
private
FButton : TButton;
function GetCaption: TCaption;
procedure SetCaption(Value: TCaption);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property Caption : TCaption read GetCaption write SetCaption;
end;
پیاده سازی:
{ TFoo }
constructor TFoo.Create(AOwner: TComponent);
begin
inherited;
FButton := TButton.Create(nil);
end;
destructor TFoo.Destroy;
begin
FButton.Free;
inherited;
end;
function TFoo.GetCaption: TCaption;
begin
Result := FButton.Caption;
end;
procedure TFoo.SetCaption(Value: TCaption);
begin
FButton.Caption := Value;
end;
در مثال بالا، کلاس TFoo فقط خصوصیت Caption یک TButton را در اختیار استفاده کنندگانش قرار می دهد.
به این میگن Adaptor Pattern یا Wrapper Pattern.
امید امرایی
پنج شنبه 03 بهمن 1387, 22:50 عصر
بسیار عالی و ممنون
دقیقا متوجه فرمایش شما شدم
گویا ابزار های تاپیک تغییر کردند که پست حل شده قرار بدم
به همبن دلیل همینجا اعلام می کنم که مشکل حل شد.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.