ورود

View Full Version : سوال: آیا لازمه که حتما برای تغییر پروپرتی در زمان اجرا یه پروسیجر برای Read تعریف کنم؟



mbshareat
شنبه 06 خرداد 1391, 19:31 عصر
سلام
فرض کنین من یه کامپوننت دارم که یه پروپرتی با نام Colored داره که از نوع Boolean باشه.
توی Paint کامپوننت مقدار این پروپرتی بررسی میشه و بر طبق مقدارش ترسیم ظاهر کامپوننت انجام میشه.
من امتحان کردم دیدم که اگه Read و Write هردو مستقیما با یک فیلد (متغیری با پیشوند F!) کار کنند در زمان طراحی با تغییر اون پروپرتی تغییری رخ نمی ده.
فرض کنین داشته باشیم:
TClrProgress= class(TCustomControl)
Private
FPosition: Integer;
.
Published
Property Position:Integer read FPosition write FPosition default 0;
end;

وقتی کامپوننت رو روی فرم میذاریم با تغییر مقدار Position تغییری منعکس نمیشه ولی وقتی برنامه رو اجرا می کنیم تازه اثر مقداردهی معلوم میشه.
آیا ممکنه این به دلیل نسخه قدیمی دلفی من باشه یا راه دیگه ای هم هست که بدون تعریف پروسیجر برای مقداردهی Position تغییر مقدار این پروپرتی در زمان طراحی هم در کامپوننت منعکس بشه.
آیا حتما باید چنین چیزی بنویسیم؟:
TClrProgress= class(TCustomControl)
Private
FPosition: Integer;
Procedure SetPosition(P:Integer);
.
.
Published
Property Position:Integer read FPosition write SetPosition default 0;
end;
یه سوال کوچولوی دیگه: چرا مقدار Default بی اثره و مجبورم در Create پروپرتی رو مقداردهی کنم؟

SAASTN
یک شنبه 07 خرداد 1391, 00:53 صبح
من امتحان کردم دیدم که اگه Read و Write هردو مستقیما با یک فیلد (متغیری با پیشوند F!) کار کنند در زمان طراحی با تغییر اون پروپرتی تغییری رخ نمی ده.
آقا سلام،
خوب همونطور که خودت گفتی اون تغییرات تو Paint اعمال میشه، پس تا وقتی که Paint یه بار اجرا نشه آخرین تغییرات دیده نمی شن. حالا اگه شما Read و Write پراپرتی رو به فیلد وصل کنی موقع ست کردنش هیچ متدی اجرا نمی شه. اما اگه فقط Write ش رو به متد ببندی و حتما تو اون متد کنترلت رو Repaint کنی، اون موقع به محض ست شدن پراپرتی تغییرات ظاهری تو کنترل دیده می شه. اما read در این زمینه نقشی نداره پس همون فیلد کفایت می کنه. اما اگه write رو به فیلد ببندی، چه زمان طراحی چه زمان اجرا، با ست کردن پراپرتی هیچ تغییر ظاهری دیده نمی شه و باید منتظر اولین ترسیم باشی.

یه سوال کوچولوی دیگه: چرا مقدار Default بی اثره و مجبورم در Create پروپرتی رو مقداردهی کنم؟
اون مقدار هیچ ارتباطی به مقدار اولیه دادن به پراپرتی نداره، تنها کارش اینه که در زمان طراحی و توی ObjectInspector اگه مقدار پراپرتی برابر Default باشه با قلم عادی ترسیم میشه و اگه مقدار برابر نباشه با قلم Bold ترسیم میشه!

mbshareat
یک شنبه 07 خرداد 1391, 08:58 صبح
سلام
یعنی من می تونم اصلا Read برای پروپرتی نذارم؟

با قلم عادی ترسیم میشه و اگه مقدار برابر نباشه با قلم Bold ترسیم میشه!
منظورتون مثال زدنه یا Defult فقط به درد فونت می خوره؟

SAASTN
یک شنبه 07 خرداد 1391, 12:53 عصر
یعنی من می تونم اصلا Read برای پروپرتی نذارم؟
نه، پراپرتی که بدون read نمیشه! ولی لازم نیست به متد ببندیش، فیلد کفایت می کنه.
پراپرتی حتما باید read داشته باشه، ولی اگه write براش نذاری readonly میشه.

منظورتون مثال زدنه یا Defult فقط به درد فونت می خوره؟
نه منظورم مثال زدن نیست، اگه دقت کرده باشی توی ObjectInspector وقتی مقدار یه پراپرتی با پیشفرض کلاس یکی باشه، مقدار رو با فونت معمولی می نویسه، ولی وقتی مقدار رو تغییر بدی با فونت Bold شده می نویسه. این Default فقط برای تعیین مقدار پیشفرض پراپرتی هست نه مقداردهی اولیه اون.