نمایش نتایج 1 تا 2 از 2

نام تاپیک: نحوه کلون کردن یک شی با تمام زیرمجموعه ها

  1. #1

    نحوه کلون کردن یک شی با تمام زیرمجموعه ها

    سلام.
    در نظر بگیرید که یک پنل دارید، توش چند تا عنصر گذاشتید که برای هر کدوم هم رویداد هایی نوشتید. حالا دقیقا همین کار رو می خواهید روی یک فرم دیگه چندین بار تکرار کنید، کدی که می گذارم می تونه این کار رو براتون بی دردسر انجام بده و رویداد هاش رو هم انتصاب بده.

    uses TypInfo, Unit2;


    procedure CopyObject(ObjFrom, ObjTo: TObject);
    var
    PropInfos: PPropList;
    PropInfo: PPropInfo;
    Count, Loop: Integer;
    OrdVal: Longint;
    StrVal: String;
    FloatVal: Extended;
    MethodVal: TMethod;
    begin
    Count := GetPropList(ObjFrom.ClassInfo, tkAny, nil);
    GetMem(PropInfos, Count * SizeOf(PPropInfo));


    try
    GetPropList(ObjFrom.ClassInfo, tkAny, PropInfos);


    for Loop := 0 to Count - 1 do
    begin
    PropInfo := GetPropInfo(ObjTo.ClassInfo, PropInfos^[Loop]^.Name);


    case PropInfos^[Loop]^.PropType^.Kind of
    tkInteger, tkChar, tkEnumeration,
    tkSet, tkClass{$ifdef Win32}, tkWChar{$endif}:
    begin
    OrdVal := GetOrdProp(ObjFrom, PropInfos^[Loop]);
    if Assigned(PropInfo) then
    SetOrdProp(ObjTo, PropInfo, OrdVal);
    end;


    tkFloat:
    begin
    FloatVal := GetFloatProp(ObjFrom, PropInfos^[Loop]);
    if Assigned(PropInfo) then
    SetFloatProp(ObjTo, PropInfo, FloatVal);
    end;


    {$ifndef DelphiLessThan3}
    tkWString,
    {$endif}
    {$ifdef Win32}
    tkLString,
    {$endif}
    tkString:
    begin
    { Avoid copying 'Name' - components must have unique names }
    if UpperCase(PropInfos^[Loop]^.Name) = 'NAME' then
    Continue;
    StrVal := GetStrProp(ObjFrom, PropInfos^[Loop]);
    if Assigned(PropInfo) then
    SetStrProp(ObjTo, PropInfo, StrVal);
    end;


    tkMethod:
    begin
    MethodVal := GetMethodProp(ObjFrom, PropInfos^[Loop]);
    if Assigned(PropInfo) then
    SetMethodProp(ObjTo, PropInfo, MethodVal);
    end
    end; // case
    end // if


    finally
    FreeMem(PropInfos, Count * SizeOf(PPropInfo));
    end;
    end;


    procedure CopyTemplate(Template, HostControl: TWinControl);
    var
    BaseName: string;


    function GetOwner(Cmp: TComponent): TComponent;
    begin
    Result := Cmp;
    while Assigned(Result.Owner) and not (Result is TCustomForm) do
    Result := Result.Owner;
    end;


    procedure InnerCopy(Template, HostControl: TWinControl);
    var
    i: integer;
    Cmp, New: TControl;
    CLS: TControlClass;
    Own: TComponent;
    begin
    for i := 0 to Template.ControlCount -1 do
    begin
    Cmp := Template.Controls[i];
    CLS := TControlClass(Cmp.ClassType);
    Own := GetOwner(HostControl);
    New := CLS.Create(Own);
    New.Name := BaseName + '_' + Cmp.Name;
    New.Parent := HostControl;
    CopyObject(Cmp, New);


    if Cmp is TWinControl then
    InnerCopy(TWinControl(Cmp), TWinControl(New));


    end;
    end;


    begin
    if Template = HostControl then
    Exit;


    BaseName := HostControl.Name;
    InnerCopy(Template, HostControl);
    end;




    نمونه استفاده:

    CopyTemplate(form2.Panel1, GroupBox2);


    نکته جالب این کد اینه که اگر روی دکمه ها رویداد هایی بنویسید، در اشیای جدید هم رویداد ها رو خواهید داشت. فقط باید حواستون باشه که به جای استفاده از نام مستقیم اشیا باید از نام Sender استفاده کنید.
    مثلا تو OnClick دکمه بنویسید:

    ShowMessage(TButton(Sender).Name);


    بهترین مورد مصرفش ساخت کامپوننت "واره" هاست، در حقیقت این کد Template هارو ران تایم بسازید.

    امیدوارم به کارتون بیاد.
    توابع تبدیل تاریخ با دقت 5000 سال
    پذیرش پروژه، کامپوننت، آموزش برنامه نویسی (دلفی، اس کیو ال، ..) -> 09123780840

    دوستای گلم حمایت کنید : https://cafebazaar.ir/app/com.nikanmehr.marmarxword/


    نرم افزار پخش مویرگی

  2. #2

    نقل قول: نحوه کلون کردن یک شی با تمام زیرمجموعه ها

    اینم مثالش، البته می شه بهتر نوشتش:
    فایل های ضمیمه فایل های ضمیمه
    توابع تبدیل تاریخ با دقت 5000 سال
    پذیرش پروژه، کامپوننت، آموزش برنامه نویسی (دلفی، اس کیو ال، ..) -> 09123780840

    دوستای گلم حمایت کنید : https://cafebazaar.ir/app/com.nikanmehr.marmarxword/


    نرم افزار پخش مویرگی

تاپیک های مشابه

  1. پاسخ: 3
    آخرین پست: یک شنبه 25 تیر 1391, 15:16 عصر
  2. پاسخ: 1
    آخرین پست: چهارشنبه 23 آذر 1390, 21:13 عصر
  3. نحوه update کردن delphi 8
    نوشته شده توسط reza_62 در بخش برنامه نویسی در Delphi Prism
    پاسخ: 6
    آخرین پست: شنبه 08 فروردین 1383, 04:32 صبح
  4. نحوه انتخابی کردن رکوردها برای چاپ (گیرشم کمک ...)
    نوشته شده توسط یاسر احسانی در بخش برنامه نویسی در Delphi
    پاسخ: 1
    آخرین پست: دوشنبه 27 بهمن 1382, 21:59 عصر
  5. نحوه سوییچ کردن بین مود انگلیسی و فارسی
    نوشته شده توسط esi در بخش VB.NET
    پاسخ: 2
    آخرین پست: یک شنبه 05 مرداد 1382, 10:41 صبح

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •