PDA

View Full Version : DLL و Abstract



_alish_
چهارشنبه 07 مرداد 1383, 06:49 صبح
با سلام
begin
از دوستان می خوام در مورد قرار دادن فرم ها در یک DLL و کار با Abstract ها برای ارتباط برنامه با DLL ها هم یک بحث کامل و مفید شروع کنیم
ممنونم
end.

Kambiz
پنج شنبه 08 مرداد 1383, 22:03 عصر
فقط جهت اطلاع: بین Abstract و ارتباط برنامه با DLLها هیچ رابطه‌ای وجود نداره.

_alish_
شنبه 10 مرداد 1383, 11:52 صبح
قط جهت اطلاع: بین Abstract و ارتباط برنامه با DLLها هیچ رابطه‌ای وجود نداره.
آقا کامبیز جهت اطلا ع شما بگوییم اینها با هم خوب ربط دارند و خیلی هم مهم است مانند یونیتی که با DLL برای ارتباط پارامترها است من یک سورس بعدا می دم که ببینید

مهدی کرامتی
شنبه 10 مرداد 1383, 12:26 عصر
یعنی میفرمایید میشه یک کلاس با متدهای Abstract تعریف کرد که پیاده سازی بدنه متدها در DLL باشه ؟!؟! :roll:

Kambiz
شنبه 10 مرداد 1383, 15:10 عصر
یعنی میفرمایید میشه یک کلاس با متدهای Abstract تعریف کرد که پیاده سازی بدنه متدها در DLL باشه ؟!؟!
کلاسها می‌تونند در DLLهای مختلف باشند.

آقا کامبیز جهت اطلا ع شما بگوییم اینها با هم خوب ربط دارند و خیلی هم مهم است مانند یونیتی که با DLL برای ارتباط پارامترها است من یک سورس بعدا می دم که ببینید
اگر Abstract یک تعریف منطقی برای کلاس هست و DLL یک مفهوم فیزیکی. این دو تا چه رابطه‌ای می‌تونند داشته باشند؟ البته اگر اینجوری نگاه کنیم که چون یک کلاس Abstract ممکنه تو یک DLL قرار داشته باشه پس این دو تا با هم رابطه دارند٬ در اینصورت می‌تونیم بگیم Constها هم با DLL رابطه دارند.

_alish_
سه شنبه 13 مرداد 1383, 08:27 صبح
سلام دوستان عزیز
اینهم برنامه یک کم زیاد ولی بد نیست
-------------------------------------------
مشتریانی بصورت یک کلاس تعریف شده و فهرستی از مشتریان برای ذخیره سازی و مدیریت اقلام اطلاعاتی آنها ایجاد شده.
DLL به تنهایی قادر به ارائه داده ها به کاربر نخواهد بود ، اما همه چیز درباره مشتریان وفهرست آنها می داند.
چون از یک برنامه کاربردی Thin-Client برای مدیریت ورود داده ها استفاده خواهیم کرد ، لازم است یک رابط انتزاعی تعریف کنیم این رابط هم در برنامه کاربردی کلاینت و هم در DLL می گنجانیم اما پیاده سازی کلاس مشتریان و فهرست آنها تنها در DLL انجام می شود.


//یونیت Abstract به عنوان رابط در برنامه های کاربردی (client thin)
unit XContact;

interface
uses
classes;

type
IContact=class;//forward تعریف
IcontactList=class;

TContactClass=class of IContact;
TContactListClass=class of IcontactList;

IContact=class
Private
protected
function GetEMail:string; virtual; abstract;
function GetName:string; virtual; abstract;
function GetPhone:string; virtual; abstract;
procedure SetEmail(const Value : string ); virtual; abstract;
procedure SetName(const Value : string ); virtual; abstract;
procedure SetPhone(const Value : string ); virtual; abstract;
public
constructor Create(const name,phone,email:string); virtual;
property Name:string read GetName write SetName;
property Phone:string read GetPhone write SetPhone;
property Email:string read GetEmail write SetEmail;
end;


IContactList=class
protected
function GetCount: Integer; virtual; abstract;
function GetList:TList; virtual; abstract;
function GetContact(Index:Integer):IContact; virtual; abstract;
procedure SetContact(Index:Integer;const Value :IContact); virtual; abstract;
public
constructor Create; virtual;
procedure Add( Contact: IContact); virtual; abstract;
procedure Remove( Contact : IContact); virtual; abstract;
property Contacts[Indx : Integer]: IContact read GetContact write SetContact; default;
property List : TList read GetList;
property Count : Integer read GetCount;
end;


implementation

{ IContactList }

constructor IContactList.Create;
begin
inherited;
end;

{IContact}

constructor IContact.Create(const name,phone,email:string);
begin
inherited Create;
Self.Name:=Name;
Self.Phone:=Phone;
Self.Email:=email;
end;
end.




در کلاس XContact.pas دو نوع داده تعریف شده است که نشانی کلاسها ی انتزاعی IContact , IContactList به شمار می آیند وجود آنها برای ارسال کلاسها ی پیاده سازی شده در بین DLL و برنامه کاربردی فراخوان ضروری است.
کلاسهای انتزاعی عمدتا تنها یک رابط تعریف می کنند و این رابط از چند متد انتزاعی مجازی تشکیل شده است و فاقد هرگونه داده است .
کلاس انتزاعی تنها تنها چیزی است که برنامه کاربردی سرویس گیرنده در رابط با مشتری و فهرست آنها به دست می آورد.
پیاده سازی کلاس مشتری و فهرست آنها در UImpContact انجام شده است.



//یونیتی که در DLL استفاده می شود می توان مستقیما در DLL هم نوشت
//Implementation Abstract Class
unit UImpContact;

interface
uses
XContact{ یونیت کلاس Abstract},Classes, SysUtils;

Type

TContact=class(IContact)
private
FEMail:string;
FName: string;
FPhone: string;
protected
function GetEmail: string; override;
function GetName:String; override;
function GetPhone:string; override;
procedure SetEmail(const Value : string ); override;
procedure SetName(const Value : string ); override;
procedure SetPhone(const Value : string ); override;
public
//constructor Create(const name,phone,email:string); override;
property Name:string read GetName write SetName;
property Phone:string read GetPhone write SetPhone;
property Email:string read GetEmail write SetEmail;
end;

TContactList=class(IContactList)
private
FList:TList; //عناصر را در یک TList نگه میداریم
protected
function GetCount: Integer; override;
function GetList:TList; override;
function GetContact(Index:Integer):IContact; override;
procedure SetContact(Index:Integer;const Value :IContact); override;
public
constructor Create; override;
destructor Destroy; override;
procedure Add( Contact: IContact); override;
procedure Remove( Contact : IContact); override;
property Contacts[Indx : Integer]: IContact read GetContact write SetContact; default;
property List : TList read GetList;
property Count : Integer read GetCount;
end;

implementation

{ TContactList }

procedure TContactList.Add(Contact: IContact);
begin
FList.Add(Contact);
end;

constructor TContactList.Create;
begin
inherited;
FList:=TList.Create;
end;

destructor TContactList.Destroy;
begin
//سوالی که برای من پیش آمده و شک دارم
// آیا بدون Free کردن و بستن برنامه کاربردی و آزاد شدن DLL این متغیرهایی
//که Create شده اند کاملا از حافظه خارج می شوند
//لطفا توضیح دهید و اگر استثنایی داشت نام ببرید
While (FList.Count>0 ) do
begin
TContact(FList.Items[0]).Free;
FList.Delete(0);
end;
FList.Free;
inherited;
end;

function TContactList.GetContact(Index: Integer): IContact;
begin
Result:=TContact(FList.Items[Index]);
end;

function TContactList.GetCount: Integer;
begin
Result:=FList.Count;
end;

function TContactList.GetList: TList;
begin
Result:=FList;
end;

procedure TContactList.Remove(Contact: IContact);
begin
FList.Remove(Contact);
end;

procedure TContactList.SetContact(Index: Integer; const Value: IContact);
begin
FList.Insert(Index,Value);
end;

{ TContact }

{constructor TContact.Create(const name, phone, email: string);
begin
inherited ;
Self.Name:=Name;
Self.Phone:=Phone;
Self.Email:=email;
end;}

function TContact.GetEmail: string;
begin
Result:=FEMail;
end;

function TContact.GetName: String;
begin
Result:=FName;
end;

function TContact.GetPhone: string;
begin
Result:=FPhone;
end;

procedure TContact.SetEmail(const Value: string);
begin
FEMail:=Value;
end;

procedure TContact.SetName(const Value: string);
begin
FName:=Value;
end;

procedure TContact.SetPhone(const Value: string);
begin
FPhone:=Value;
end;
end.



پروژه DLL




//یونیت و پروژه DLL
library NewContactServer;

uses
ShareMem,//برای استفاده از رشته های دلفی در صورتی از
//آن استفاده می شود باید BorlndMM.dll نیز در کامپیوتر اجرا شونده وجود داشته باشد
//اگر از PChar استفاده می کنید نیازی به آن و یونیت مربوطه نیست
SysUtils,
Classes,
XContact in 'XContact.pas', // abstract
UImpContact in 'UImpContact.pas';//implementation abstract

{$R *.res}
function ContactClass : TContactClass;
begin
Result:=TContact;
end;

Function ContactListClass : TContactListClass;
begin
Result:=TContactList;
end;

exports
ContactClass,ContactListClass;

begin
end.



برنامه کاربردی thin Client



unit UTestContact;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, XContact, ComCtrls;

type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
EditName: TEdit;
EditPhone: TEdit;
EditEMail: TEdit;
ButtonAdd: TButton;
ButtonRemove: TButton;
ButtonFind: TButton;
StatusBar1: TStatusBar;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure ButtonAddClick(Sender: TObject);
procedure ButtonRemoveClick(Sender: TObject);
procedure ButtonFindClick(Sender: TObject);
private
FCurrentContact : IContact; //از یونیت Abstract که مزیت آن می باشد
ContactList : IContactList; //از یونیت Abstract
procedure UpdateCount(Count:Integer);
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

//import Class از فایل DLL
Function ContactClass : TContactClass; external 'NewContactServer.dll';
Function ContactListClass : TContactListClass; external 'NewContactServer.dll';

procedure TForm1.FormCreate(Sender: TObject);
begin
FCurrentContact:=nil;
//چون ما نمی توانیم از Abstract به طور مستقیم استفاده کنیم از کلاس فرستاده شده از DLL
// استفاده می کنیم چون implementation abstract در یونیت استفاده شده در DLL قرار دارد
ContactList:=ContactListClass.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
ContactList.Free;
end;

procedure TForm1.ButtonAddClick(Sender: TObject);
begin
FCurrentContact:=ContactClass.Create(EditName.Text ,EditPhone.Text,EditEMail.Text);
ContactList.Add(FCurrentContact);
UpdateCount(ContactList.Count);
end;

procedure TForm1.ButtonRemoveClick(Sender: TObject);
begin
if Assigned(FCurrentContact) then
begin
ContactList.Remove(FCurrentContact);
UpdateCount(ContactList.Count);
end;
end;

procedure TForm1.ButtonFindClick(Sender: TObject);
var
i:Integer;
// SrchCuntact:IContact;
begin
//SrchCuntact:=Nil;
For i:=0 to ContactList.Count-1 do
begin
//SrchCuntact:=ContactList.Contacts[i];
if (ContactList[i].Phone=EditPhone.Text) then
begin
FCurrentContact:=ContactList[i];
EditName.Text:=FCurrentContact.Name;
EditPhone.Text:=FCurrentContact.Phone;
EditEMail.Text:=FCurrentContact.Email;
end;
end;
end;

procedure TForm1.UpdateCount(Count: Integer);
begin
StatusBar1.SimpleText:= Format('Count : %d',[Count]);
end;

end.

_alish_
سه شنبه 13 مرداد 1383, 08:36 صبح
خوب دوستان این هم برنامه فکر کنم دقت کنید مزیت Abstract مشخص باشد

خوب حالا من هم خواهشی دارم لطفا اگر برنامه مشکل داشت انتقاد بفرمایید و دوم اینکه هر که هر چیز در مورد کار با DLL و مثال و نکته ای می داند این تاپپک را با هم کامل کنید .

لا اقل این بار حرفم را زمین نندازید ما هم مشتاق یاد گرفتنیم مثل شما

آقا کامبیز من یک معذرت خواهی به شما بدهکارم راستش منظورتان را در تاپیک TPropertyEditor بد فهمیدم و چیزی گفتم بهرحال گذشت از بزرگان است

_alish_
سه شنبه 13 مرداد 1383, 08:38 صبح
فراموش کردم منبع از کتاب دلفی 6 از انتشارات نشر علوم البته با تغییرات جزیی

Kambiz
سه شنبه 13 مرداد 1383, 17:13 عصر
در مورد سوالت در خصوص آزاد کردن حافظه، به جز در قسمت زیر Memory Leak وجود نداره.


procedure TForm1.ButtonRemoveClick(Sender: TObject);
begin
if Assigned(FCurrentContact) then
begin
ContactList.Remove(FCurrentContact);
UpdateCount(ContactList.Count);
end;
end;
در کد بالا Contact حذف شده از لیست٬ آزاد نمی‌شود. همچنین بهتر بود TContactList از TObjectList مشتق می‌شد.

در ضمن٬ این مثال صحبت قبلی من رو رد نمی‌کنه. رابطه DLL و Abstract مثل رابطه آبگوشت و پیازه! (:D)

_alish_
چهارشنبه 14 مرداد 1383, 06:39 صبح
در مورد سوالت در خصوص آزاد کردن حافظه، به جز در قسمت زیر Memory Leak وجود نداره.
در کد بالا Contact حذف شده از لیست٬ آزاد نمی‌شود. همچنین بهتر بود TContactList از TObjectList مشتق می‌شد.
(:D)
با تشکر لطفا بیشتر در مورد Memory Leak و TObjectList توضیح دهید


کار با Abstract ها برای ارتباط برنامه با DLL ها
لطفا بگویید بجای این جمله و کلمه ارتباط بهتر بود چی می نوشتم

Kambiz
چهارشنبه 14 مرداد 1383, 20:55 عصر
به حافظه‌ای که یک برنامه پس از اتمام کار به سیستم برنگردونده Memory Leak گفته می‌شه.

TObjectList در راهنمای دلفی 6 و نسخه‌های بالاتر شرح داده شده.

بجای اون جمله باید Blank گذاشته می‌شد.

Kambiz
چهارشنبه 14 مرداد 1383, 20:57 عصر
ایجاد یک تاپیک جدید با عنوان "کاربرد کلاسهای Abstract چیست؟" بدک نیست. :wink:

_alish_
سه شنبه 20 مرداد 1383, 06:54 صبح
ابتدا از راهنمایتان ممنونم
من در مورد پیشنهاد شما کاملا موافقم زیرا بعضی از مسائل نیاز به همفکری دارند تا مدت زمان رسیدن به جواب را برای برنامه نویس کوتاه سازد . :flower:

محمد حسین صمدیان
دوشنبه 26 بهمن 1383, 02:04 صبح
با سلام
begin
از دوستان می خوام در مورد قرار دادن فرم ها در یک DLL و کار با Abstract ها برای ارتباط برنامه با DLL ها هم یک بحث کامل و مفید شروع کنیم
ممنونم
end.
ببخشید من در مورد مفهوم abstract نمی دونم یا اون چیزی که میدونم اشتباهه یا ناکامل !
میشه بیشتر توضیح بدید؟؟؟
ما هم یاد بگیریم؟؟!

hamedahmed
سه شنبه 04 اسفند 1383, 11:06 صبح
ببخشید دوستان من حامدم
لطفا به سوال من جواب بدین .
چطوری یک فرم بالاتر از همه فرم ها قرار بگیرد مثل پنجره Windos Task Manager .
لطفا جوابشو هم برای من میل کنید.
[url]hamed_hana_abas@yahoo.com
hamed_hana_abas@yahoo.com