13-10-2014, 10:38 AM
السلام عليكم ..
فكرة رائعة و صائبة أن تتعلم ال oop .. صدقني عندما تتقنها ستندم لأنك لم تتعلمها في وقت سابق :eek:
للأسف , دلفي لا تدعم بشكل مباشر نسخ كلاس الى كلاس آخر .
لكن يمكن تطبيقها بطريقتين :
- الطريقة الأولى استعمال ال RTTI :
تعتمد هذه الطريقة على enum لجميع ال properties ثم اسناد قيمها الى الكلاس .
أسلوب عملها مشابه تماما لل Object Inspector .
بما أنك تتعلم خطوة بخطوة .. فأنا لا أنصحك باستعمالها حتى تتقن ال OOP بشكل جيد .
-الطريقة الثانية توريث الكلاس من TPersistent :
الكلاس TPersistent يحتوي على اجراء assign لنسخ الكلاس ..
لعلك لاحظت أن أغلب الكلاسات مورثة منه : TCanvas,TFont,TButton,..
الفكرة تعتمد على عمل override للاجراء AssignTo ثم اسناد القيم الى الكلاس الجديد .
ملاحظة : الطريقة الثانية هي الطريقة الشائعة في نسخ الكلاسات
-------------------------------------------------------------------
دائما اجعل أول حرف من الدالة uppercase ..
لمبرمجي دلفي فلسفة مع طريقة كتابة المتغيرات و الدوال في الكلاسات :
المتغيرات دائما تبدأ بحرف F اختصار الى Field .
و الدوال تبدأ بحرف uppercase .
يستحسن أن تستلزم بهذه المسلمات حتى يستطيع غيرك قراءة أكوادك
بالضبط , FPhoneNumbers عبارة عن Object .. و أي Object يجب أن يتم انشائه قبل استخدامه .
بالتوفيــــق .
فكرة رائعة و صائبة أن تتعلم ال oop .. صدقني عندما تتقنها ستندم لأنك لم تتعلمها في وقت سابق :eek:
إقتباس :سؤالي هو كتالي : كيف اقوم بنسخ محتويات كلاس إلى كلاس آخر ؟
للأسف , دلفي لا تدعم بشكل مباشر نسخ كلاس الى كلاس آخر .
لكن يمكن تطبيقها بطريقتين :
- الطريقة الأولى استعمال ال RTTI :
تعتمد هذه الطريقة على enum لجميع ال properties ثم اسناد قيمها الى الكلاس .
أسلوب عملها مشابه تماما لل Object Inspector .
بما أنك تتعلم خطوة بخطوة .. فأنا لا أنصحك باستعمالها حتى تتقن ال OOP بشكل جيد .
-الطريقة الثانية توريث الكلاس من TPersistent :
الكلاس TPersistent يحتوي على اجراء assign لنسخ الكلاس ..
لعلك لاحظت أن أغلب الكلاسات مورثة منه : TCanvas,TFont,TButton,..
الفكرة تعتمد على عمل override للاجراء AssignTo ثم اسناد القيم الى الكلاس الجديد .
ملاحظة : الطريقة الثانية هي الطريقة الشائعة في نسخ الكلاسات

-------------------------------------------------------------------
دائما اجعل أول حرف من الدالة uppercase ..
PHP كود :
setPhoneNumbers
=> SetPhoneNumbers
المتغيرات دائما تبدأ بحرف F اختصار الى Field .
و الدوال تبدأ بحرف uppercase .
يستحسن أن تستلزم بهذه المسلمات حتى يستطيع غيرك قراءة أكوادك

إقتباس :يحصل خطا حيث اني لم أعمل Create للقائمة .. هل يجب ان اعدل الدالة Create الخاصة بالكلاس واضع فيها امر انشاء القائمة ؟
بالضبط , FPhoneNumbers عبارة عن Object .. و أي Object يجب أن يتم انشائه قبل استخدامه .
PHP كود :
type
TMyClass = class(TPersistent)
private
FAge: Integer;
FName: string;
FPhoneNumbers: TStringList;
procedure SetPhoneNumbers(const Value: TStringList);
protected
procedure AssignTo(Dest: TPersistent); override;
public
constructor Create; virtual;
destructor Destroy; override;
property Name: string read FName write FName;
property Age: Integer read FAge write FAge;
property PhoneNumbers: TStringList read FPhoneNumbers write SetPhoneNumbers;
end;
{ TMyClass }
procedure TMyClass.AssignTo(Dest: TPersistent);
var
LDst: TMyClass;
begin
if not(Dest is TMyClass) then
raise Exception.Create('Dest is not TMyClass !');
LDst := TMyClass(Dest);
LDst.FName := FName;
LDst.FAge := FAge;
LDst.FPhoneNumbers.Assign(FPhoneNumbers);
end;
constructor TMyClass.Create;
begin
FPhoneNumbers := TStringList.Create;
end;
destructor TMyClass.Destroy;
begin
FreeAndNil(FPhoneNumbers);
inherited;
end;
procedure TMyClass.SetPhoneNumbers(const Value: TStringList);
begin
if Value <> FPhoneNumbers then
FPhoneNumbers.Assign(Value);
end;
procedure TForm2.Button1Click(Sender: TObject);
var
Man1, Man2: TMyClass;
begin
Man1 := TMyClass.Create;
Man1.Name := 'Kahld';
Man1.Age := 15;
Man1.PhoneNumbers.Add('XXXXXXXXXXXX');
Man1.PhoneNumbers.Add('AAAAAAAAAAAA');
Man1.PhoneNumbers.Add('WWWWWWWWWWWW');
Man2 := TMyClass.Create;
Man2.Assign(Man1);
Edit1.Text := Man2.Name;
Edit2.Text := IntToStr(Man2.FAge);
Edit3.Text := Man2.PhoneNumbers[0]
end;
بالتوفيــــق .
Open Your Source .. Open Your Mind

