PDA

View Full Version : ساخت یک object از کلاس Tparameters ؟



Modifier
شنبه 05 شهریور 1390, 14:52 عصر
سلام
من قصد داشتم موضوع مذکور رو انجام بده ولی در Constratctor کلاس مربوطه 2 آیتم میخواد که نمیدونم چی بزارم براش!
لطفا مرا راهنمایی کنید.
با تشکر

BORHAN TEC
شنبه 05 شهریور 1390, 15:26 عصر
این هم یک نمونه بسیار کوچک:
procedure TForm3.Button1Click(Sender: TObject);
var
param: TParameters;
begin
param := TParameters.Create(Self, ADOQuery1.Parameters);
// do somethings
end;
برای کسب اطلاعات بیشتر نیز می توانید به آدرس زیر مراجعه کنید:
http://docwiki.embarcadero.com/VCL/en/ADODB.TParameters

soft-c
سه شنبه 08 شهریور 1390, 10:51 صبح
حالا که این بحث اینجا مطرح شد می شه مقداری بیشتر در بارهی سازنده و پارامترهای آن توضیح بدهید ؟
من کتاب کانتو را خوندم ولی به درستی بحث برای من مفهوم نبود .
وقتی از پارامتر self در سازنده استفاده می کنید چه اتفاقی می افتد ؟
چه لزومی دارد که به وسیله ی اون مالک را مشخص کنیم ؟
تشکر

BORHAN TEC
سه شنبه 08 شهریور 1390, 14:10 عصر
حالا که این بحث اینجا مطرح شد می شه مقداری بیشتر در بارهی سازنده و پارامترهای آن توضیح بدهید ؟
البته
سازنده متدی است که از آن برای ساخت یک نمونه از کلاس استفاده میشود. کلاس در واقع یک مفهوم است. به عنوان مثال کلاس انسان!!! و من هم یک نمونه از این کلاس هستم. جسم من فضایی را اشغال می کند. نمونه هم همینطور است و فضا اشغال می کند.
در بسیاری از موارد نیاز است که شما در هنگام ساخت یک نمونه از یک کلاس مقادیر اولیه ای را برای آن مشخص کنید. به عنوان مثال شما یک کلاس با نام Person را می توانید به شکل زیر تعریف کنید:
TPerson = class
private
FName: string;
FFamily: string;
FAge: Integer;
FEmail: string;
public
Name: string;
Family: string;
Age: Integer;
Email: string;
end;
و با کد زیر هم می توانید یک نمونه از آن را ایجاد کنید:
var
Person: TPerson;
begin
Person := TPerson.Create;
// Somethings
end;
خوب، در تابع بالا متد Create از کجا آمده؟ توجه کنید که در دلفی جد تمام کلاسها، کلاس TObject است و کلاس TPerson هم از کلاس TObject مشتق شده است. به عبارتی دیگر تعریف کلاس TPerson در بالا معادل تعریف زیر است:
TPerson = class(TObject)
private
FName: string;
FFamily: string;
FAge: Integer;
FEmail: string;
public
Name: string;
Family: string;
Age: Integer;
Email: string;
end;
حال به ادامه بحث پرداحته و به سراغ سازنده ها می رویم:
نکته 1: سازنده یک متد خاص است که مقداری را بر نمی گرداند، و با توجه به این مطلب می توان گفت که نوع مقدار برگشتی هم ندارد.

نکته 2: در دلفی هر کلاس می تواند چندین سازنده با نامهای مختلف و یا با نام های یکسان داشته باشد ولی بهتر است که در صورتی که نیاز به چندین سازنده در یک کلاس دارید برای حفظ سازگاری با C++ Builder چندین سازنده با نام یکسان Create داشته باشید. در واقع این یک نکته بسیار کلیدی در ایجاد سازگاری بین دلفی و C++ Builder است.

نکته 3: سازنده ها باید Public باشند، یعنی باید در قسمت Public کلاس تعریف شوند.

نکته 4: سازنده ها با کلمه کلیدی constructor تعریف می شوند.

مثال: ممکن است یک کلاس چند سازنده با نام های مختلف داشته باشد. مانند این:
TPerson = class(TObject)
private
FName: string;
FFamily: string;
FAge: Integer;
FEmail: string;
public
Name: string;
Family: string;
Age: Integer;
Email: string;

constructor Create;
constructor CreateByParams(aName, aFamily, aEmail: string; aAge: Integer);
end;

مثال: اگر بخواهیم که کلاس ما چند سازنده با نام های یکسان داشته باشد باید آنها را overload کنیم. مانند این:
type
TPerson = class(TObject)
private
FName: string;
FFamily: string;
FAge: Integer;
FEmail: string;
public
Name: string;
Family: string;
Age: Integer;
Email: string;

constructor Create; overload
constructor CreateByParams(aName, aFamily, aEmail: string; aAge: Integer); overload;
end;

وقتی از پارامتر self در سازنده استفاده می کنید چه اتفاقی می افتد ؟
اگه منظورتون این خط است:
param := TParameters.Create(Self, ADOQuery1.Parameters);
به دو خط زیر توجه کنید:
procedure TForm3.Button1Click(Sender: TObject);
param := TParameters.Create(Self, ADOQuery1.Parameters);
self به کلاس جاری اشاره می کند(در اینجا TForm3). در اینجا منظور این است که موقعی که شی Form3 در حال آزادسازی از حافظه است شی Param نیز به صورت خودکار آزاد سازی شود.

چه لزومی دارد که به وسیله ی اون مالک را مشخص کنیم ؟
در اکثر موارد بهتر است که از self استفاده کنیم، ولی هرشی دیگری را نیز می توانید استفاده کنید. حتی از nil هم می توانید استفاده کنید.

توجه داشته باشید که مبحث Object Oriented در دلفی بحث بسیار گسترده ای است که بیشتر نکات نیز حتی در کتاب mastering Delphi 7 مطرح نشده اند. چون بسیاری از نکات مربوط به OOP مربوط به نسخه های جدیدتر دلفی می باشند. به هر حال مواردی از این دست بسیار زیاد است که در زیر به برخی از آنها اشاره شده است:

Operator Overloading
Class Helpers
strict private
strict protected
Records with Methods
class abstract
class sealed
class const
class type
class var
class property
nested classes
final methods
sealed methods
static class methods
Generics
Anonymous methods
و ...

که برای آشنایی با برخی از آنها می توانید به آدرس زیر مراجعه کنید:
http://dn.embarcadero.com/article/34324

soft-c
سه شنبه 15 شهریور 1390, 11:28 صبح
self به کلاس جاری اشاره می کند(در اینجا TForm3). در اینجا منظور این است که موقعی که شی Form3 در حال آزادسازی از حافظه است شی Param نیز به صورت خودکار آزاد سازی شود.
یعنی اگر ما به جای self مثلا از شی از نوع خود کلاس یا هرچیز دیگر استفاده کنیم هنگامیکه آن شی آزاد می شود شی param نیز آزاد می شود .
خوب در کتاب گفته که هنگامی که اشیا را در فرم می نویسیم ، فرم مالک آنها حساب میشه و هنگام بستن فرم آن اشیا هم آزاد می شوند ، در این صورت اگر ما شی دیگری که مالک آن فرم جاری نباشد یعنی که آن شی تا وقتی که ما خودمان آن را آزاد نکنیم آزاد نمی شود . در این صورت باید برای آزاد کردن شی param باید به صورت دستی اقدام کنیم ؟
تشکر از پاسختون

BORHAN TEC
سه شنبه 15 شهریور 1390, 12:42 عصر
یعنی اگر ما به جای self مثلا از شی از نوع خود کلاس یا هرچیز دیگر استفاده کنیم هنگامیکه آن شی آزاد می شود شی param نیز آزاد می شود .
بله

خوب در کتاب گفته که هنگامی که اشیا را در فرم می نویسیم ، فرم مالک آنها حساب میشه و هنگام بستن فرم آن اشیا هم آزاد می شوند
درسته، اگر شما کنترلی را از Tool Palette بر روی فرم بیاندازید به صورت خودکار Owner آن به Self ست می شود ولی اگر بخواهید که به صورت داینامیک آنرا بسازید باید خودتان Owner آنرا ست کنید. باز هم می گویم در در اینجا Owner هرچیزی می تواند باشد.مثال:
procedure TForm3.Button1Click(Sender: TObject);
var
btn: TButton;
begin
btn := TButton.Create(Self);

end;

در این صورت اگر ما شی دیگری که مالک آن فرم جاری نباشد یعنی که آن شی تا وقتی که ما خودمان آن را آزاد نکنیم آزاد نمی شود .در این صورت باید برای آزاد کردن شی param باید به صورت دستی اقدام کنیم ؟
همانطور که گفتم Owner هر شی ای می تواند باشد. حتی یک شی از نوع کلاس TButton ولی اگر Owner مقدار nil باشد باید آنرا خودمان آزادسازی کنیم. البته راه حل بهتر در این مورد استفاده از Interface ها است که می توان با استفاده از آن کاری کرد که آزادسازی به صورتی بسیار هوشمندتر انجام شود که توضیحات در مورد آن خارج از حوصله این بحث است. البته توجه داشته باشید که آقای کشاورز در این رابطه مقاله ای را ترجمه کرده بودند که می توانید از آن استفاده کنید. به هر حال شدیداً توصیه می کنم که در برنامه نویسی بلوک try/Finally را به هیچ عنوان فراموش نکنید، زیرا با به کار بردن این بلوک حتی در صورت بروز یک exception هم می توانید به درستی یک شی را آزاد سازی کنید.:متفکر: