PDA

View Full Version : بیائید به هم کامپوننت نویسی و اوصول شی گرائی یاد بدیم...



Touska
سه شنبه 13 اردیبهشت 1384, 13:24 عصر
شروع کنید که خیلی دوست دارم بدونم که مثلا :


Class Procedure ();

چه کار می کنه برام توضیح دهید. :flower:

منتظر گفتگوهای گرم شما هستم ... :kaf:

DJINN
سه شنبه 13 اردیبهشت 1384, 13:58 عصر
به نظر من بهتره این بحث محدود به یک زبان خاص نباشه اصول و قواعد توضیح داده بشه بعد تعدادی هم مثال به زبانهای مختلف مطرح بشه این طوری میشه با یک تیر دو نشان زد یادگیری اصول شی گرایی و مقایسه ی و نحوه ی بکارگیری اون در محیط های توسعه ی مختلف :flower:

UnREal
سه شنبه 13 اردیبهشت 1384, 17:34 عصر
Hi,
That's a very nice idea.
But do you know what the best Language for Programming and coding COMPONENTS is
?

You should be careful of the programming language you use.

Regards,
unreal

دنیای دلفی
سه شنبه 13 اردیبهشت 1384, 18:26 عصر
برای بهتر یاد گرفتن کامپوننت سازی می توانید از کامپوننتهایی که سورسشان همراهشان است استفاده بسیار زیادی ببرید من که خیلی بردم .

:موفق:

Touska
سه شنبه 13 اردیبهشت 1384, 21:28 عصر
خوب این روش خوبی هست و من پیشنهاد می دم بروی C و Delphi کار کنیم و مهفوم ها رو خوب یاد بگیریم.

نظرتون چیه ؟

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

:flower:

vcldeveloper
چهارشنبه 14 اردیبهشت 1384, 04:26 صبح
خیلی دوست دارم بدونم که مثلا :


Class Procedure ();


چه کار می کنه برام توضیح دهید.
Class Method ها، متدهایی از یک کلاس هستند که برای فراخوانی کردنشون، نیازی به ایجاد یک Instance از اون کلاس نیست.
مثال:


type
TformDialog = class(TForm)
public
class function Execute: integer;
end;

implementation
{$R *.dfm}
class function TformDialog.Execute: integer;
var
ADialog : TForm;
begin
Result := 0;
Application.CreateForm(TformDialog,ADialog);
try
Result := ADialog.ShowModal;
finally
ADialog.Free;
end;
end;

در کد بالا برای فراخوانی تابع Execute میشه به راحتی از کد زیر (بدون نیاز به ایجاد یک نمونه از کلاس TformDialog) استفاده کرد:


procedure TForm1.Button1Click(Sender: TObject);
begin
TformDialog.Execute;
end;

m-khorsandi
چهارشنبه 14 اردیبهشت 1384, 07:49 صبح
درود

آقای کشاورز میشه یه نمونه از کاربردهای Class Method رو هم بفرمائید، این رو به این خاطر
میگم که ایجاد یک Instance از یک کلاس مثلا همین TformDialog با یک یا دو خط انجام میشه و
بعد هم میشه از متدهای اون کلاس استفاده کرد. اگه لطف کنید توضیحی در این مورد بدید ممنون میشم.

Touska
چهارشنبه 14 اردیبهشت 1384, 12:58 عصر
ادامه بدید منظورتون از Instance یعنی تعریف نمونه از آن Class میباشد.

Touska
پنج شنبه 15 اردیبهشت 1384, 12:04 عصر
دیگه نمی خواهید ادامه بدید. :sunglass:

محمد میرمصطفی
جمعه 16 اردیبهشت 1384, 00:43 صبح
راستش من شروع کرده‏بودم. کسی عکس‏العمل نشون نداد. و استقبال نشد. من هم ادامه ندادم:
http://www.barnamenevis.org/forum/viewtopic.php?t=24304

vcldeveloper
جمعه 16 اردیبهشت 1384, 03:15 صبح
ادامه بدید منظورتون از Instance یعنی تعریف نمونه از آن Class میباشد.
بله

آقای کشاورز میشه یه نمونه از کاربردهای Class Method رو هم بفرمائید،
-> مقداردهی اولیه یک کلاس یا عملیاتی که باید بر روی تمام نمونه های یک کلاس انجام شوند.
-> عملیات مربوط به یک Class که باید در خارج محیط (Context) آن کلاس اجرا شود.

مثال: در دلفی متد سازنده (Constructor) هر Class بطور اتوماتیک متد NewInstance رو برای اختصاص حافظه لازم برای نمونه جدید از کلاس فراخوانی میکنه. متد NewInstance هم متد InitInstance رو برای مقداردهی اولیه نمونه جدید فراخوانی میکنه. هر دو متد اخیر (NewInstance, InitInstance) از نوع Class Function هستند.
کلا از Class Method ها در TObject برای مقداردهی اولیه کلاس ها زیاد استفاده شده.

مثال: متد Synchronize از کلاس TThread یک Class Procedure است که در context سرنخ اصلی اجرا می شود.


نکته:
یک Class Method دارای متغیر ضمنی Self (دلفی) یا this(جاوا و C++) نیست. در نتیجه امکان استفاده از فیلدهای کلاس در یک Class Method وجود ندارد.

Touska
شنبه 17 اردیبهشت 1384, 19:14 عصر
آقای کشاورز ادامه بدید ما فیض ببریم. موفق باشید :flower:

Developer Programmer
شنبه 17 اردیبهشت 1384, 21:54 عصر
خدمت همه دوستان و سروران عرض کنم
تمام اونچه که میخواید یاد بگیرید در کتاب Mastering Delphi7 نوشته مارکو کانتو موجوده
این کتاب یه شاهکار هنریه یهچیزی تو مایه های نقاشی کوبیسم خودمون !
وقتی خوندمش دنیام از این رو به اون رو شد

Delphi Skyline
شنبه 17 اردیبهشت 1384, 21:56 عصر
خدمت همه دوستان و سروران عرض کنم
تمام اونچه که میخواید یاد بگیرید در کتاب Mastering Delphi7 نوشته مارکو کانتو موجوده
این کتاب یه شاهکار هنریه یهچیزی تو مایه های نقاشی کوبیسم خودمون !
وقتی خوندمش دنیام از این رو به اون رو شد
_________________
این کتاب full دلفی است و ترجمه فارسی آن هم است و نویسندش هم مارک کانتو است . درسته آقا افشین ؟

m-khorsandi
یک شنبه 18 اردیبهشت 1384, 08:29 صبح
آقای کشاورز عالی بود.

Touska
یک شنبه 18 اردیبهشت 1384, 09:53 صبح
درسته خوبه

راستی این کتاب تو نمایشگاه امسال هست یا نه.

ولی این جا بگذارید دیگران استفاده کنند خیلی بهتره. :flower:

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

vcldeveloper
دوشنبه 19 اردیبهشت 1384, 10:42 صبح
راستی این کتاب تو نمایشگاه امسال هست یا نه.

ولی این جا بگذارید دیگران استفاده کنند خیلی بهتره.
ترجمه فارسیش بود.
e-bookاش رو می تونید تو سی دی های برنامه نویس پیدا کنید.

Touska
سه شنبه 20 اردیبهشت 1384, 18:12 عصر
کدام سی دی منظورت هست. شماره چند و کدامیکی.

:flower:

Developer Programmer
سه شنبه 20 اردیبهشت 1384, 18:19 عصر
کدام سی دی منظورت هست. شماره چند و کدامیکی
دوستان گرامی ... کم کم یهو از عنوانی که برای تاپیک انتخاب کرده اید دور می شوید :confy2:
بحثهای جانبی رو هم میشه از طریق PM دنبال کرد. :flower:

Touska
سه شنبه 20 اردیبهشت 1384, 18:21 عصر
آقای زوار درسته در مورد انواع کلمات کلیدی مثل Override و Static و غیره توضیح دهید.

در مورد Property های چند گزینه ایی توضیح دهید.

ممنون :flower:

Touska
پنج شنبه 22 اردیبهشت 1384, 08:34 صبح
بی خیال شدید ... :oops:

SalarSoft
پنج شنبه 22 اردیبهشت 1384, 09:54 صبح
استفاده از کلاس ها بدون نیاز به ایجاد آنها:
به این گونه از کلاس ها Class methods گویند.

برای این منظور باید قبل از هر رویه یا تابع یک class اظافه کنید.
در ضمن حتما باید در بخش implementation نیز قبل از هر رویه یا تابع عبارت class را اظافه نمایید:

مثال:

type
TMyClass = class
public
class function Hello(str: string): Boolean;
class procedure GetInfo(name:string);
...
end;

implementation

class procedure TMyClass .GetInfo(name:string);
begin
...
end;

برای استفاده: <span dir=ltr>TMyClass.Hello("You")</span>

Touska
پنج شنبه 22 اردیبهشت 1384, 19:47 عصر
خوب حالا برای تاپیک قبلی من کسی توضیح کامل بده... :flower:

مهدی کرامتی
جمعه 23 اردیبهشت 1384, 01:13 صبح
کدوم تاپیک؟

vcldeveloper
جمعه 23 اردیبهشت 1384, 02:13 صبح
در مورد انواع کلمات کلیدی مثل Override و Static و غیره توضیح دهید.
در اینباره در راهنمای دلفی توضیح داده شده.
بطور کلی، هر گاه متدی در یک کلاس والد از نوع Virtual یا Dynamic تعریف شود، کلاسهای فرزند می توانند آن متد را دوباره پیاده سازی کنند. استفاده از کلمه کلیدی Override به معنی آن است که کلاس فرزند از پیاده سازی مخصوص خودش (برای آن متد) استفاده می کنند. در نتیجه بجای آنکه متد مربوطه از کلاس والد فراخوانی شود، از پیاده سازی کلاس فرزند استفاده می شود (Search for: Polymorphism in OOP).
مثال:


TParent = class
private
strFoo &#58; string;
intFoo &#58; integer;
public
constructor Create; virtual;
procedure ShowFoo;
end;

TChild = class&#40;TParent&#41;
private
SomeOtherFoo &#58; integer;
public
constructor Create; override;
end;



implementation

&#123; TParent &#125;
constructor TParent.Create;
begin
strFoo &#58;= 'This is parent class';
intFoo &#58;= 0;
end;

procedure TParent.ShowFoo;
begin
ShowMessage&#40;strFoo&#41;;
end;

&#123;TChild&#125;
constructor TChild.Create;
begin
strFoo &#58;= 'This is child class';
intFoo &#58;= 1;
SomeOtherFoo &#58;= 0;
end;

در مثال ساده بالا، TChild از متد سازنده (constructor) مخصوص بخودش استفاده کرده و متد سازنده کلاس والد را Overrideکرده است.

Static Method
در دلفی Static بعنوان کلمه کلیدی (Keyword) محسوب نمیشه. اما به متدهای عادی یک کلاس (که Virtual, Dynamic یا Class Method) نیستند، متدهای Static گفته می شود. درباره Class Method ها قبلا بحث شد، برای تعریف متدهای Virtual و Dynamic هم می توانید به راهنمای دلفی مراجعه کنید. آدرس متدهای static (و کلا هر اطلاعاتی که برای اجرای آن متد لازم است) در هنگام کامپایل برنامه مشخص می شود (early-binding). این اطلاعات برای متدهای Virtual و Dynamic در هنگام کامپایل مشخص نیست و در زمان اجرای برنامه مشخص می شود (late-binding). طبیعی است که متدهای static سریعتر از متدهای Virtual و Dynamic فراخوانی می شوند، در مقابل متدهای Virtual و Dynamic انعطاف پذیری بیشتری دارند.


در مورد Property های چند گزینه ایی توضیح دهید.
من دقیقا متوجه منظور شما نشدم، ولی فکر کنم منظورتون property هایی مثل Align, BiDiMode, BorderStyle و... باشه:
برای این نوع از Property ها باید ابتدا یک نوع داده سفارشی (Custom Type) از نوع Enumerated ایجاد کنید:


type
TFormBorderStyle = &#40;bsNone, bsSingle, bsSizeable, bsDialog, bsToolWindow, bsSizeToolWin&#41;;


سپس Property خود را از نوع سفارشی ساخته شده، تعریف کنید:


property BorderStyle&#58; TFormBorderStyle read FBorderStyle write SetBorderStyle
stored IsForm default bsSizeable;

SalarSoft
جمعه 23 اردیبهشت 1384, 09:43 صبح
نوشتن برنامه های منسجم
مقدمه:
در مقابل برنامه های منسجم برنامه های اسپاگتی (Spaghetti) قرار دارند. اسپاگتی به معنای ماکرونی است و این اصطلاح به این علت به کار برده می شود که تمام بخش های برنامه به طور نا صحیح با هم در ارتباط هستند. یعنی برای مثال کلاس TClass1 از یک مغیر عمومی از نوع TClass2 برای تنظیم مقادیر خود استفاده می کنند و به آن وابسطه هستند. مانند کد زیر:

Type
Tclass1=class
SumResult&#58;Integer;
procedure Calculate;
Val1,Val2&#58;integer;
End;
TClass2=class
fResult&#58;Integer;
function DoSum&#40;sum1, sum2&#58;integer&#41;&#58; integer;
End;
Var
fClass1&#58;TClass1;
fClass2&#58;TClass2;
impelemention

function TClass2.DoSum&#40;sum1, sum2&#58;integer&#41;&#58; integer;
begin
fClass1&#58;=TClass1.Create;
fClass1.Val1&#58;=sum1;
fClass1.Val2&#58;=sum2;
fClass1.Calculate;
Result&#58;=fClass1.SumResult;
fClass1.Free;
end;
procedure Tclass1.Calculate;
begin
SumResult&#58;=Val1+Val2;
fClass2.fResult&#58;=SumResult;
end;
این کد به شدت در معرض شکست قرار دارد ، چون هر دو کلاس به هم وابسته بوده و با تغییری اندک در یکی از آنها باید دیگری را نیز اصلاح و به روز رسانی کرد. علاوه بر این هنگامی که می خواهید از یکی از کلاس ها استفاده کنید با هر دو متغیر fClass1 و fClass2 ایجاد شده و آماده باشند در غیر این صورت با یک خطا روبرو خواهید شد.
در چنین برنامه هایی با تغییری اندک در هر یک از کلاس ها ( یا فرم هایی مانند این کلاس ها) باید تغییرات در هر دو اعمال شوند که البته زمان زیادی را خواهد گرفت و با بزرگتر شدن پروژه این مشکل حاد تر خواهد شد.
جنگ با ماکرونی!:
یک راه حل بسیار مناسب نوشتن فرم ها ، کلاس ها و در صورت امکان رویه های مستقل است. یعنی باید به صورت مستقل عمل نمایند و از هیچ کلاسی استفاده ننمایند. این بهترین حالت است؛ اما معمولا این چنین کلاس هایی کمتر استفاده می شوند.
اگر کلاسی از سایر اشیا استفاده می کند نباید از متغیر های عمومی آن شیئ استفاده کند. برای رفع این مشکل می توان آن اشیاء را به صورت پاراکتر به ایجاد کننده آن () ارسال کرد. در این صورت کلاس مد نظر این شیئ را در یک متغیر برای استفاده ذخیره نماید.
به این مثال توجه فرمایید:

TMyClass = class
private
fBitmap&#58;TBitmap;
public
constructor Create&#40;bmp&#58;TBitmap&#41;;
procedure DrawBorder;
end;
implementation
constructor TMyClass.Create&#40;bmp&#58; TBitmap&#41;;
begin
fBitmap&#58;=bmp;
end;
procedure TMyClass.DrawBorder;
begin
fBitmap.Canvas.Pen.Width&#58;=1;
fBitmap.Canvas.Rectangle&#40;fBitmap.Canvas.ClipRect&#41;;
end;
این نمونه یک کلاس کارآمد است. در این مثال bmp به عنوان پارامتر به ایجاد کننده TmyClass ارسال می شود. سپس برای استفاده های بعدی در متغیر داخلی fBitmap ذخیره مشود. fBitmap آدرس bmp ارسالی را در خود ذخیره کرده و هنگام استفاده از همانند آن است که از خود متغییر bmp استفاده می کنید.
بدین ترتیب هیچ گونه ارجاع و استفاده مستقیمی به خارج از کلاس صورت نمی گیرد. این واقعا عالی است!
منسجم کردن رابطه فرم ها:
به طور معمول هر فرمی را که به پروژه اضافه میکنید دستور Application.CreateForm(TFormClass, FormVar); به فایل پروژه تان (dpr) افزوده می شود. این دستور سبب خواهد شد که به محض اجرای برنامه فرم ایجاد شود. برای برنامه های کوچک شیوه مناسبی است. اما برای پروژه های بزرگ مشکل ساز خواهد بود.
برای زمانی که چندین فرم در پروژه وجود دارد می توان در زمان نیاز فرم را ایجاد کرده ، نمایش داده و سپس حافظه اش را آزاد کنید. این روش بسیار مفیدی است.
برای مثال یک دکمه در روی TForm1 و 2 دکمه در روی TForm2 قرار دهید. خصوصیت ModalResult یکی از دکمه های فرم2 را برابر mrOK قرار دهید. سپس در فرم1 در رویداد کلیک Button1، کد زیر را وارد نمایید:

procedure TForm1.Button1Click&#40;Sender&#58; TObject&#41;;
var frm2&#58;TForm2;
begin
frm2&#58;=TForm2.Create&#40;Application&#41;;
frm2.ShowModal;
frm2.free;
end;
البته این مثال ناقص است ولی به خوبی کار خواهد کرد. برای اینکه بدانید چه دکمه ای در فرم 2 فشرده شده است از کد زیر استفاده کنید.

procedure TForm1.Button1Click&#40;Sender&#58; TObject&#41;;
var frm2&#58;TForm2;
begin
frm2&#58;=TForm2.Create&#40;Application&#41;;
if frm2.ShowModal=mrOK then
messageDlg&#40;'Hey! you pressed a button',mtInformation,&#91;mbOK&#93;,0&#41;;
frm2.free;
end;
در این مثال ShowModal فرم دوم را نمایش خواهد و تا زمانیکه دکمه ای که ModalResult آن تنظیم شده، فشرده نشود فرم بسته نخواهد شد. پس از بسته شدن فرم2 مقدار برگشتی ShowModal بررسی خواهد شد و صورت صحیح بودن شرط پیغامی صادر خواهد شد.
در این مثال فرم1 تا بسته شدن فرم2 غیر فعال خواهد بود. حال اگر نیاز باشد که هر دو فرم به طور همزمان در دسترس و فعال باشند چه می توان کرد؟ پاسخ این سوال استفاده از روشی است که در ادامه مورد بررسی می باشد.
ابتدا باید متغیری از نوع فرم دوم ایجاد کنید. سپس مس میتوانید با فراخوانی متد show فرم2 را نمایش داد. در این صورت هر دو فرم به صورت همزمان قابل دسترسی هستند.
اما مشکل اینجاست که با بستن فرم2 حافظه مربوط به آن آزاد نخواهد و آن همچنان در حافظه باقی خواهد ماند. برای رفع این مشکل نیز می توان با تخصیص دادن مقدار caFree به پارامتر Action در رویداد OnClose مربوط به فرم2 برطرف نمود.

procedure TForm1.Button1Click&#40;Sender&#58; TObject&#41;;
var frm2&#58;TForm2;
begin
frm2&#58;=TForm2.Create&#40;Application&#41;;
frm2.Show;
end;
و در فرم دوم:

procedure TForm2.FormClose&#40;Sender&#58; TObject; var Action&#58; TCloseAction&#41;;
begin
Action&#58;=caFree;
end;
البته این مثال ناقصی است که می توانید نقایص آن را مرتفع سازید. تخصیص مقداد caFree به Action سبب آزاد سازی حافظه آن و تخصیص مقداد caHide فقط باعث مخفی شدن آن خواهد شد و فرم همچنان در حافظه می باشد.
بخش دوم برنامه نویسی ساخت یافته به زودی در سایا قرار خواهد گرفت.

آدرس مقاله: http://salarsoft.somee.com/magaleh/m_good_programs_1.htm

shayan_delphi
یک شنبه 22 آبان 1384, 14:44 عصر
http://www.barnamenevis.org/forum/showthread.php?p=162112#post162112