View Full Version : نوشتن کلاس در دلفی
ayub_coder
چهارشنبه 07 تیر 1391, 23:41 عصر
دوستان من این کلاس رو نوشتم میشه ببینین چیزی استاندارد نوشتم یا نه؟ اگه مشکلی تو نوشتن من هست لطفا راهنمایی کنید.
unit DbConnection;
interface
uses
System.Classes,
Data.DB, DBAccess, Uni,
UniProvider, MySQLUniProvider ;
Type DBClass=class(TComponent)
BeforePrivate : TUniConnection;
private
_Provider :String ;
_ServerName :String;
_UserName :String;
_Password :String;
_DataBaseName :String;
_UniConnection : TUniConnection;
_MySqlUniProvider : TMySQLUniProvider;
public
IsConnected : Boolean;
theConnection : TUniConnection;
constructor Create(Provider, ServerName, UserName, Password, DataBaseName: String);
function Connect(): TUniConnection; overload;
function Connect(Provider, ServerName, UserName, Password, DataBaseName: String):TUniConnection; overload;
procedure Disconnect();
end;
implementation
{ DBClass }
function DBClass.Connect(): TUniConnection;
var option:TUniConnectionOptions;
begin
_UniConnection.ProviderName := self._Provider;
_UniConnection.Server := self._ServerName;
_UniConnection.Username := self._UserName;
_UniConnection.Password := self._Password;
_UniConnection.Database := self._DataBaseName;
_UniConnection.SpecificOptions.Values['UseUnicode'] := 'TRUE';
_UniConnection.Connect;
if _UniConnection.Connected then
begin
Connect := _UniConnection;
theConnection := _UniConnection;
Self.IsConnected := TRUE;
end
else
begin
Connect := nil;
self.IsConnected := FALSE;
end;
end;
function DBClass.Connect(Provider, ServerName, UserName, Password, DataBaseName: String): TUniConnection;
begin
Self._Provider := Provider;
Self._ServerName := ServerName;
Self._UserName := UserName;
Self._Password := Password;
Self._DataBaseName := DataBaseName;
Connect := Self.Connect();
end;
constructor DBClass.Create(Provider, ServerName, UserName, Password,
DataBaseName: String);
begin
_UniConnection := TUniConnection.Create(self);
Self._Provider := Provider;
Self._ServerName := ServerName;
Self._UserName := UserName;
Self._Password := Password;
Self._DataBaseName := DataBaseName;
Self.theConnection := self.Connect();
end;
procedure DBClass.Disconnect;
begin
Self._UniConnection.Disconnect;
Self._UniConnection.Free;
Self._UniConnection := nil;
Self.IsConnected := FALSE;
end;
end.
Felony
پنج شنبه 08 تیر 1391, 06:02 صبح
من کامپوننت هایی که استفاده کردید رو در حال حاظر روی دلفی نصب ندارم که کدتون رو کامل تغییر بدم ، تا جایی که میشد تو Notepad برات تغییر دادم ولی فکر نکنم این به کارت بیاد :
type
TDBConnectionInfo = record
Provider: String;
ServerName: String;
UserName: String;
Password: String;
DataBaseName: String;
end;
Type
DBClass = class(TComponent)
private
fConnectionInfo: TDBConnectionInfo ;
_UniConnection: TUniConnection;
function GetConnectedState: Boolean;
public
constructor Create(DBConnectionInfo: TDBConnectionInfo );
function Connect: TUniConnection; overload;
function Connect(DBConnectionInfo: TDBConnectionInfo ): TUniConnection; overload;
function Disconnect: Boolean;
property IsConnected: Boolean read GetConnectedState;
end;
implementation
{ DBClass }
function DBClass.Connect: TUniConnection;
var
option: TUniConnectionOptions;
begin
with _UniConnection do
begin
ProviderName := self._Provider;
Server := self._ServerName;
UserName := self._UserName;
Password := self._Password;
Database := self._DataBaseName;
SpecificOptions.Values['UseUnicode'] := 'TRUE';
Connect;
end;
if IsConnected then
begin
Connect := _UniConnection;
theConnection := _UniConnection;
end
else
Connect := nil;
end;
function DBClass.Connect(DBConnectionInfo: TDBConnectionInfo ): TUniConnection;
begin
self._Provider := DBConnectionInfo.Provider;
self._ServerName := DBConnectionInfo.ServerName;
self._UserName := DBConnectionInfo.UserName;
self._Password := DBConnectionInfo.Password;
self._DataBaseName := DBConnectionInfo.DataBaseName;
Connect := self.Connect();
end;
constructor DBClass.Create(DBConnectionInfo: TDBConnectionInfo );
begin
_UniConnection := TUniConnection.Create(self);
fConnectionInfo := DBConnectionInfo;
theConnection := self.Connect();
end;
function DBClass.Disconnect: Boolean;
begin
try
_UniConnection.Disconnect;
Result := _UniConnection.Connected;
finally
FreeAndNil(_UniConnection);
end;
end;
function DBClass.GetConnectedState: Boolean;
begin
Result := _UniConnection.Connected;
end;
end.
برای متغییر ها و توابع و کلاس هات اسم های معنی دار انتخاب کن ، مهم نیست اسم چقدر طولانی باشه ، مهم این هست که وقتی دادیش به یک توسعه دهنده با خوندن اسم هر کدوم زود تو ذهنش یه ساختار تداعی بشه و بگه این متغییر یا تابع داره فلان کار رو میکنه .
میتونی این کلاسی که نوشتی با کامپوننت های ADO پیاده کنی و قرار بدی تا اصلاحش کنیم ، بعد خودت بری با UniDac یا ... پیادش کنی .
SayeyeZohor
پنج شنبه 08 تیر 1391, 06:14 صبح
كلاس چه وقتايي به كار ميآد؟
ميدونم سوالم مسخرست آماتورم ديگه نخندين بهما
چرا وقتي مي شه اين فانكشن ها رو جدا تعريف كرد كلاس بنويسيم
در كل ضعيفم
ببخش اگه زحمتي نيس به اين تاپيك قبليم هم يك نگاهي بنداز
تاپيك قبلي (http://barnamenevis.org/showthread.php?346616-%D8%B3%D8%A7%D8%AE%D8%AA-%D9%81%D8%A7%D9%86%D9%83%D8%B4%D9%86-ShowModal-%D8%AC%D8%AF%D9%8A%D8%AF)
Felony
پنج شنبه 08 تیر 1391, 06:37 صبح
كلاس چه وقتايي به كار ميآد؟
کلاس مجموعه ای از متدها و ... مرتبط با هم هست که همگی در یک بخش تعریف میشن ( مثلا کلاس Airplane که میتونه شامل متدهای نوع هواپیما ، نوع موتور ، گشتاور موتور ، تعداد موتور ، نوع سوخت ، جنس بدنه ، شرکت سازنده ، تعداد صندلی ها و ... باشه ) کلاس جزء مباحث شئ گرایی هست و از دید مهندسی نرم افزار طراحی و توسعه نرم افزار رو تسریع میکنه و واقعا هم تو کار میشه این موارد رو حس کرد .
ميدونم سوالم مسخرست آماتورم ديگه نخندين بهما
چرا وقتي مي شه اين فانكشن ها رو جدا تعريف كرد كلاس بنويسيم
تا به حال سورس کتابخانه های دلفی رو دیدی ؟ مثلا کد TButton رو دیدی ؟ اگر نه کلید Ctrl رو نگه داری و روی TButton تو یکی از پروژه هات کلیک کن .
به نظرت اگر میخواستن این موارد رو با توابع پیاده کنن چی میشد ؟! چند میلیون خط کد به کتابخانه های دلفی اضافه میشد ؟
مثل همون تاپیک که دیروز در مورد کلاس TControl توضیح دادم و گفتم اشیاء ویژوال در آخر از اون مشتق شدن ، یکسری از متدها و ... در این کلاس پایه تعریف شده و باقی کلاس ها ازش این این متدها رو به ارث میبرن ، یعنی 1 بار نوشته شده و در باقی کامپوننت ها گفته شده که والدشون TControl هست و به همین سادگی کلاس جدید علاوه بر متدهای تعریف شده توسط خودش متدهای TControl رو هم به ارث برده .
مثلا همون تاپیک ShowModal ی که زدی ، فقط تو اونجا دلفی همه کار رو برای شما به صورت خودکار انجام داد و اینجا باید دستی کد بنویسید .
SayeyeZohor
پنج شنبه 08 تیر 1391, 08:45 صبح
چيكار كنم براي Showmodal جديد كه نوشتين؟
مشكل داره
تاپيك NewShowModal (http://barnamenevis.org/showthread.php?346616-%D8%B3%D8%A7%D8%AE%D8%AA-%D9%81%D8%A7%D9%86%D9%83%D8%B4%D9%86-ShowModal-%D8%AC%D8%AF%D9%8A%D8%AF&p=1535949&viewfull=1#post1535949)
ayub_coder
پنج شنبه 08 تیر 1391, 09:02 صبح
خیلی هم داغون نبود که. اولین بارمه یه کلاس دلفی نوشتم!:خجالت:
چند سوال دیگه:
1-آیا برای هر کلاس باید یونیت جدا تعریف کرد؟ یعنی هر کلاس باید تو یونیت جدا باشه یا تو هر یونیت میشه چند تا کلاس داشت؟
2-آیا برای هر یونیت باید فایل مجزا داشت؟
3-آیا کلاسمون همیشه باید از TComponent مشتق بشه؟
Felony
پنج شنبه 08 تیر 1391, 09:14 صبح
خیلی هم داغون نبود که. اولین بارمه یه کلاس دلفی نوشتم!
اول صبح بود سلول خاکستری ها هنوز راه نیافتاده بود ! دستام بی اختیار تایپ میکرد ، برای اولین بار جای نقد خاصی نداشت ...
1-آیا برای هر کلاس باید یونیت جدا تعریف کرد؟ یعنی هر کلاس باید تو یونیت جدا باشه یا تو هر یونیت میشه چند تا کلاس داشت؟
میتونی تو یک یونیت هر چند تا بخوای کلاس تعریف کنی ، ولی اصولا اگر کلاسی خیلی پیچیده باشه تو یک یونیت جدا تعریفش میکنن و یا کلاس هایی که تقریبا موضوع واحدی رو دنبال میکنن در یک یونیت تعریف میشن .
2-آیا برای هر یونیت باید فایل مجزا داشت؟
بله !
3-آیا کلاسمون همیشه باید از TComponent مشتق بشه؟
نه ، اگر میخوای متدهایی که TComponent داره داشته باشه از TComponent مشتق میشه ، ممکنه بخوای کلاسی تعریف کنی که متدهای یک دکمه رو داشته باشه اون موع از TButton مشتقش میکنی ، ممکن هم هست قرار نباشه از هیچ کلاسی چیزی به ارث ببره و خودش کلاث پایه باشه ، اون موقع از هیچ کلاسی مشتقش نمیکنی .
ayub_coder
پنج شنبه 08 تیر 1391, 09:29 صبح
نه ، اگر میخوای متدهایی که TComponent داره داشته باشه از TComponent مشتق میشه ، ممکنه بخوای کلاسی تعریف کنی که متدهای یک دکمه رو داشته باشه اون موع از TButton مشتقش میکنی ، ممکن هم هست قرار نباشه از هیچ کلاسی چیزی به ارث ببره و خودش کلاث پایه باشه ، اون موقع از هیچ کلاسی مشتقش نمیکنی .
آخه تو قسمت کد که می خوام یه نمونه از TUniConnection بسازم تو پارامتر Create میگه AOwner باید از نوع TComponent باشه. و اگه من کلاسم رو از Tcomponent مشتق نکرده باشم اونجا چی می تونم بنویسم؟
_UniConnection := TUniConnection.Create(self);
Felony
پنج شنبه 08 تیر 1391, 09:34 صبح
در اون کد نیازی به معرفی Owner نیست ، بنویس nil .
ayub_coder
پنج شنبه 08 تیر 1391, 10:31 صبح
در کل اون پارامتر داخل Create واسه چه کاریه؟ به چی کاری میاد؟ مثلا الان چه nil بفرستیم چه TComponent به حالش فرقی نمی کنه. پس واسه چی اینو قرار میدن.؟
Win_RT
پنج شنبه 08 تیر 1391, 10:59 صبح
در اون کد نیازی به معرفی Owner نیست ، بنویس nil .
آیا nil همون null هست؟
ayub_coder
پنج شنبه 08 تیر 1391, 11:12 صبح
آیا nil همون null هست؟
nil به معنی هیچ یا پوچ یا همان null هست
Felony
پنج شنبه 08 تیر 1391, 18:38 عصر
در کل اون پارامتر داخل Create واسه چه کاریه؟ به چی کاری میاد؟ مثلا الان چه nil بفرستیم چه TComponent به حالش فرقی نمی کنه. پس واسه چی اینو قرار میدن.؟
Owner به معنای مالک هست ، وقتی مالک چیزی از بین میره چی میشه ؟ مثلا مالک یک حساب بانکی میمیره چی میشه ؟ اون حساب هم بسته میشه !
وقتی Owner شیئی از بین میره خود اون شئ هم به صورت خودکار توسط کامپایلر دلفی آزاد میشه ، در این صورت اگر برای شیئی Owner تعریف کردیه باشید و اون Owner جایی تو برنامه آزاد شده باشه نیازی نیست اون شئ رو با کد آزاد کنید چون خود کامپایلر دلفی در زمان آزاد سازی شئ مالک اشیاء وابسته رو رو از بین میبره ؛ مثلا تمام کامپوننتی هایی که روی فرم برنامه قرار میدید Owner شون اون From هست و وقتی فرم رو میبندید و آزاد میشه اون اشیاء هم آزاد میشن ، مگر اینکه بخواین زودتر از اینکه Owner از بین بره اون شئ رو آزاد کنید .
وقتی Owner رو nil پاس میدید یعنی این شئ مالکی نداره و وظیفه مدیریت حافظش به عهده شما خواهد بود .
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.