كيف يتم نسخ كلاس إلى آخر ؟
#2
السلام عليكم ..

فكرة رائعة و صائبة أن تتعلم ال oop .. صدقني عندما تتقنها ستندم لأنك لم تتعلمها في وقت سابق :eek:

إقتباس :سؤالي هو كتالي : كيف اقوم بنسخ محتويات كلاس إلى كلاس آخر ؟

للأسف , دلفي لا تدعم بشكل مباشر نسخ كلاس الى كلاس آخر .
لكن يمكن تطبيقها بطريقتين :
- الطريقة الأولى استعمال ال RTTI :
تعتمد هذه الطريقة على enum لجميع ال properties ثم اسناد قيمها الى الكلاس .
أسلوب عملها مشابه تماما لل Object Inspector .
بما أنك تتعلم خطوة بخطوة .. فأنا لا أنصحك باستعمالها حتى تتقن ال OOP بشكل جيد .

-الطريقة الثانية توريث الكلاس من TPersistent :

الكلاس TPersistent يحتوي على اجراء assign لنسخ الكلاس ..
لعلك لاحظت أن أغلب الكلاسات مورثة منه : TCanvas,TFont,TButton,..
الفكرة تعتمد على عمل override للاجراء AssignTo ثم اسناد القيم الى الكلاس الجديد .
ملاحظة : الطريقة الثانية هي الطريقة الشائعة في نسخ الكلاسات Big Grin

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

إقتباس :يحصل خطا حيث اني لم أعمل 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
الرد


الردود في هذا الموضوع
كيف يتم نسخ كلاس إلى آخر ؟ - بواسطة ALmuhhnad - 13-10-2014, 06:55 AM
كيف يتم نسخ كلاس إلى آخر ؟ - بواسطة SMP3 - 13-10-2014, 10:38 AM
كيف يتم نسخ كلاس إلى آخر ؟ - بواسطة ALmuhhnad - 13-10-2014, 12:13 PM
كيف يتم نسخ كلاس إلى آخر ؟ - بواسطة Amer12 - 14-10-2014, 05:27 AM
كيف يتم نسخ كلاس إلى آخر ؟ - بواسطة ALmuhhnad - 14-10-2014, 06:00 PM
كيف يتم نسخ كلاس إلى آخر ؟ - بواسطة SMP3 - 14-10-2014, 09:54 PM
كيف يتم نسخ كلاس إلى آخر ؟ - بواسطة ALmuhhnad - 15-10-2014, 03:47 AM
كيف يتم نسخ كلاس إلى آخر ؟ - بواسطة SMP3 - 15-10-2014, 10:29 AM
كيف يتم نسخ كلاس إلى آخر ؟ - بواسطة me_delphi - 16-10-2014, 07:02 AM
كيف يتم نسخ كلاس إلى آخر ؟ - بواسطة ALmuhhnad - 16-10-2014, 08:12 AM
كيف يتم نسخ كلاس إلى آخر ؟ - بواسطة ALmuhhnad - 16-10-2014, 03:21 PM
كيف يتم نسخ كلاس إلى آخر ؟ - بواسطة SMP3 - 16-10-2014, 08:47 PM
كيف يتم نسخ كلاس إلى آخر ؟ - بواسطة me_delphi - 17-10-2014, 02:40 AM
كيف يتم نسخ كلاس إلى آخر ؟ - بواسطة ALmuhhnad - 17-10-2014, 04:59 AM
كيف يتم نسخ كلاس إلى آخر ؟ - بواسطة SMP3 - 13-10-2014, 05:44 PM

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم