PDA

View Full Version : تعریف کلاس در دلفی



ayub_coder
چهارشنبه 07 تیر 1391, 21:35 عصر
کسی می تونه ساخت یه کلاس رو توضیح بده
مثلا برای تعریف یه متغییر برای استفاده در کلاس باید در کدام قسمت اونو بنویسیم؟




Type DBClass=class
{اینجا؟}
private


public
{یا اینجا؟}

end;


تفاوت بخش Public و private رو میدونم . ولی تفاوت نوشتن تو اون دو جای بالا رو نمی دونم.تفاوتش چیه؟

Ananas
چهارشنبه 07 تیر 1391, 23:04 عصر
خوب بعد از private متغیرهای private میان و بعد از public متغیر های public میان و ... . اما قبل از همشون اگه چیزی تعریف بشه به عنوان private شناخته میشه. درسته؟

ayub_coder
چهارشنبه 07 تیر 1391, 23:37 عصر
تست کردم به صورت Public اعمال میشه. ولی فکر کنم قبل Private فقط میشه کلاس تعریف کرد. درسته؟ میشه توضیح بدید چرا اینچنینه؟ چه کاربردی داره؟

Ananas
پنج شنبه 08 تیر 1391, 00:21 صبح
تست کردم به صورت Public اعمال میشه.
بله حق با شماست public هست اشتباه کردم.


ولی فکر کنم قبل Private فقط میشه کلاس تعریف کرد. درسته؟ میشه توضیح بدید چرا اینچنینه؟ چه کاربردی داره؟

فقط کلاس؟ نه دیگه همونطور که خودتونم گفتید مثل قسمت public هست فرقی نداره. ببین مثلا شاید تو تعریف کلاس اصلا هیچ کدوم از public و private و protected و published ننویسی اون موقع باید کدوم باشه؟ باید یک پیش فرضی باشه که در نبودن اینها اون رو اعمال کنه که همون public هست.

ayub_coder
پنج شنبه 08 تیر 1391, 00:35 صبح
فقط کلاس؟ نه دیگه همونطور که خودتونم گفتید مثل قسمت public هست فرقی نداره.
آخه وقتی یه متغییر از نوع string یا integer تعریف میکنم پیغام خطا میده و میگه
[DCC Error] Published field 'اسم فیلد' not a class or interface type
:متعجب:

Felony
پنج شنبه 08 تیر 1391, 05:26 صبح
به صورت پیش فرض Published هستند .

ayub_coder
پنج شنبه 08 تیر 1391, 08:53 صبح
یعنی برای published فقط میشه کلاس نوشته؟

Felony
پنج شنبه 08 تیر 1391, 09:36 صبح
بله ؛ کلاس ، متد و Interface میشه تعریف کرد .

ayub_coder
پنج شنبه 08 تیر 1391, 10:29 صبح
آیا برای Constructor میشه خروجی تعیین کرد؟ یا فقط می تونی ورودی هاش تغییر کنه؟ (Overload بشه)

Ananas
پنج شنبه 08 تیر 1391, 14:39 عصر
آخه وقتی یه متغییر از نوع string یا integer تعریف میکنم پیغام خطا میده و میگه 1
[DCC Error] Published field 'اسم فیلد' not a class or interface type




:متعجب:
نخیر، پس چرا برای من این خطا رو نمیده؟

به صورت پیش فرض Published هستند .
الان تو کد زیر x, y که کلاس نیستن تو قسمتی هم که صحبتش هست نوشته شده (قسمت پیش فرض) هیچ اروری هم نمیده:

TMyClass = class
x, y : Integer;
published
b : TBitmap;
end;

ayub_coder
پنج شنبه 08 تیر 1391, 15:24 عصر
اون خطا به خاطر این بود که من کلاسم رو از TComponent مشتق کرده بودم.حالا دلیلشو نمیدونم که چرا وقتی از TComponent مشتق می کنیم این خطا رو میگیره؟؟!! :متفکر:

Ananas
پنج شنبه 08 تیر 1391, 16:00 عصر
این ارور میده :

type
TClassA = class
a0 : Integer;
private
a1 : Integer;
protected
a2 : Integer;
published
a3 : TBitmap;
public
a4 : Integer;
end;
TClassB = class(TClassA)
x, y : Integer;
end;

ولی اگه عبارت published رو از کلاس اول حذف کنیم دیگه ارور نمیده :

type
TClassA = class
a0 : Integer;
private
a1 : Integer;
protected
a2 : Integer;
//published
a3 : TBitmap;
public
a4 : Integer;
end;
TClassB = class(TClassA)
x, y : Integer;
end;

عجب!

ayub_coder
پنج شنبه 08 تیر 1391, 16:54 عصر
احتمالا به خاطر همون Publish باید باشه . چون پیش فرض پابلیشه و وقتی شما پابلیش رو ذکر می کنی احتمالا باید فقط تو قسمت پابلیش نوشته شه!

Felony
پنج شنبه 08 تیر 1391, 19:08 عصر
نخیر، پس چرا برای من این خطا رو نمیده؟
:لبخندساده: آره خطا نمیده ولی اگر دقت میکردی یک Warning موقع کامپایل تولید میکنه با عنوان :

1055 PUBLISHED caused RTTI ($M+) to be added to type 'TMyClass'

خوب ؟ میدونی یعنی چی ؟ یعنی اینکه شما این کلاس رو بدون استفاده از رهنمود کامپایلر {$M+} کامپایل کردی ، این یعنی اینکه Runtime type information برای Property ها و Event های Publish شده شما تولید نمیشه ، حالا قبل از تعریف کلاس رهنمود رو اضافه کن :


{$M+}
type
TMyClass = class
x, y: Integer;
published
b: TBitmap;
end;

خوب ؟ تونستی کامپایلش کنی ؟!


اون خطا به خاطر این بود که من کلاسم رو از TComponent مشتق کرده بودم.حالا دلیلشو نمیدونم که چرا وقتی از TComponent مشتق می کنیم این خطا رو میگیره؟؟!!
بله چون TComponent از TPersistent مشتق شده و TPersistent با رهنمود {$M+} کامپایل شده ، بنابراین کلاس هایی که از این کلاس ارث بری میکنن براشون RTTI تولید میشه و در اون شرایط موقع تعریف کلاس پیغام خطا میگیرن ، چون RTTI فقط برای Property ها و Event ها تولید میشه نه متغییر ها .

SAASTN
پنج شنبه 08 تیر 1391, 22:20 عصر
بله ، کلاس و Interface میشه تعریف کرد .
متد هم میشه تعریف کرد. اگه دقت کرده باشین رویداد های فرم هم همونجا تعریف میشن.
{$M+}
type
TMyClass = class
procedure A;
published
b: TBitmap;
end;

Felony
پنج شنبه 08 تیر 1391, 22:29 عصر
بله میشه تو اون پست حواسم به متدها نبود و یادم رفت اصلاحش کنم ، در پست های بعد ذکر کردم که :


بله چون TComponent از TPersistent مشتق شده و TPersistent با رهنمود {$M+} کامپایل شده ، بنابراین کلاس هایی که از این کلاس ارث بری میکنن براشون RTTI تولید میشه و در اون شرایط موقع تعریف کلاس پیغام خطا میگیرن ، چون RTTI فقط برای Property ها و Event ها تولید میشه نه متغییر ها .

مرسی که تذکر دادی ، پست مربوطه ویرایش شد .

ayub_coder
پنج شنبه 08 تیر 1391, 23:05 عصر
برای تعریفی کلاس به عنوان مثال Person بهتره اطلاعات این شخص به صورت

Type PersnInfo = record
PersonID :Integer;
PersonName : String;
PersonFamily:String;
end;

Type PersonClass = class
pInfo : PersonInfo;

procedure InsertPerson(pInfo);
procedre DeletePerson(pInfo);

end;

تعریف بشه و در متد ها این داده های پردازش بشن بهتره یا اینکه مشخصات به صورت
Type PersonClass = class
private
PersonID :Integer;
PersonName : String;
PersonFamily:String;

procedure InsertPerson(pInfo);
procedre DeletePerson(pInfo);
end;
درون بدنه کلاس باشن بهتره؟

Felony
پنج شنبه 08 تیر 1391, 23:45 عصر
بستگی به پیاده سازی و نیازتون به انعطاف پذیری کدها داره ، برای برنامه ها پیچیده و برنامه هایی که قراره بعدا توسعه داده بشن ، پیاده سازی اول منعطف تره .