سؤال

لدي TPANEL PNLMAIN، حيث يتم إنشاء العديد من TPanels الديناميكي (و PNLMAIN هو الوالد الخاص بهم) وفقا لأفعال المستخدم، وصحة البيانات، وما إلى ذلك. كل لوحة يحتوي على شبكة ملونة واحدة مليئة بالسلاسل. بصرف النظر عن الألواح، هناك بعض مكونات الأسهم مفتوحة المصدر والصورة. مجموعة كاملة من الاشياء.

الآن أريد أن يكون المستخدم قادرا على طباعة هذه اللوحة (سألت كيفية القيام بذلك على هذا السؤال)، ولكن قبل الطباعة، يجب تقديم المستخدم مع نموذج جديد، يحتوي على نسخة من pnlmain. في هذا النموذج، يجب على مستخدم إجراء بعض التغييرات، إضافة عدد قليل من المكونات ثم طباعة نسخة مخصصة من PNLMain. بعد الطباعة، سيقوم المستخدم بإغلاق هذا النموذج والعودة إلى النموذج الأصلي مع PNLMain الأصلي. و - كما يمكنك تخمين - يجب أن تظل PNLMAIN الأصلية سليمة.

فهل هناك أي طريقة ذكية لنسخ TPANEL كلها ومحتوياتها؟ أعلم أنني أستطيع أن أجعلها تكرارا يدويا من خلال قائمة PNLMain.controls.

هل كانت مفيدة؟

المحلول

الرمز يستند إلى تكرار حول عناصر التحكم في الأطفال، ولكن ليس سيئا على أي حال ؛-)

procedure TForm1.btn1Click(Sender: TObject);

    function CloneComponent(AAncestor: TComponent): TComponent;
      var
        XMemoryStream: TMemoryStream;
        XTempName: string;
      begin
        Result:=nil;
        if not Assigned(AAncestor) then
          exit;
        XMemoryStream:=TMemoryStream.Create;
        try
          XTempName:=AAncestor.Name;
          AAncestor.Name:='clone_' + XTempName;
          XMemoryStream.WriteComponent(AAncestor);
          AAncestor.Name:=XTempName;
          XMemoryStream.Position:=0;
          Result:=TComponentClass(AAncestor.ClassType).Create(AAncestor.Owner);
          if AAncestor is TControl then TControl(Result).Parent:=TControl(AAncestor).Parent;
          XMemoryStream.ReadComponent(Result);
        finally
          XMemoryStream.Free;
        end;
      end;

    var
      aPanel: TPanel;
      Ctrl, Ctrl_: TComponent;
      i: integer;
    begin
      //handle the Control (here Panel1) itself first
      TComponent(aPanel) := CloneComponent(pnl1);
      with aPanel do
      begin
        Left := 400;
        Top := 80;
      end;

      //now handle the childcontrols
      for i:= 0 to pnl1.ControlCount-1 do begin
        Ctrl := TComponent(pnl1.Controls[i]);
        Ctrl_ := CloneComponent(Ctrl);
        TControl(Ctrl_).Parent := aPanel;
        TControl(Ctrl_).Left := TControl(Ctrl).Left;
        TControl(Ctrl_).top := TControl(Ctrl).top;
      end;
    end;

رمز من Delphi3000. شرط

نصائح أخرى

الكثير من التعليمات البرمجية ... ObjectBinaryTOTEXTOX و ObjectTextTobinary القيام بهذه المهمة بشكل جيد باستخدام البث. لدى Delphi 7 مثال على التعليمات البرمجية، لا أعرف 2009 (أو 2006، لم يضايقها أبدا) لا يزال لديك. انظر ملف تعليمات D5 لتلك الوظائف (لا تملك D5 متاح هنا).

سأفعل ذلك باستخدام RTTI لنسخ جميع الخصائص. لا يزال يتعين عليك التكرار على جميع عناصر التحكم، ولكن عندما تحتاج إلى إعداد قيم الخاصية، يمكن ل RTTI المساعدة في أتمتة العملية. يمكنك الحصول على مثال تجاه أسفل هذه المقالة, ، حيث ستجد رابطا لبعض رمز المساعد، بما في ذلك CopyObject نمط.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top