Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Komponenten rekursiv in die Zwischenablage kopieren (Wie die IDE) (https://www.delphipraxis.net/164294-komponenten-rekursiv-die-zwischenablage-kopieren-wie-die-ide.html)

v2afrank 7. Nov 2011 09:25

Komponenten rekursiv in die Zwischenablage kopieren (Wie die IDE)
 
In meinem Programm habe ich einen Designer, der es dem Benutzer erlaubt verschiedene Fenster wie in Delphi selbe zu gestalten. Diese Formulare kann ich speichern und laden, was über
Delphi-Quellcode:
procedure DesignSaveComponentToStream(AComp: TComponent; AStream: TStream);
var
  MS: TMemoryStream;
begin
  MS := TMemoryStream.Create;
  try
    MS.WriteComponent(AComp);
    MS.Position := 0;
    ObjectBinaryToText(MS, AStream);
  finally
    MS.Free;
  end;
end;
auch super funktioniert. Auch das Laden funktioniert bestens.
Jetzt möchte ich noch eine Copy&Paste Funktion einbauen. Zuerst habe ich gedacht, ich übergebe der obigen Funktion meine Komponete und packe den resultierended Stream in die Zwischenablage. Funktioniert bei einer konmponente auch bestens.
Nun habe ich aber den Aufbau, dass Panel2 in Panel1 liegt. Wenn ich jetzt Panel1 in die Zwischenablage kopiere und wieder einfüge, sehe ich nur noch Panel1 und nicht Panel2.
Daraufhin habe ich Clipboard.SetComponent() benutzt, was aber zum gleichen Ergebnis führt. Hat einer von Euch eine Idee was ich falsch mache ?

Nersgatt 7. Nov 2011 09:30

AW: Komponenten rekursiv in die Zwischenablage kopieren (Wie die IDE)
 
Wie sieht denn der resultierende Stream aus?
Schau Dir mal an, was die IDE macht. Einfach ein Panel kopieren, einen Texteditor öffnen und einfügen. Da siehst Du, dass Delphi einfach den Text (wirklich als String) kopiert, der sonst in der DFM landen würde. Vielleicht hilft Dir das als Denkanstoß.

v2afrank 7. Nov 2011 09:36

AW: Komponenten rekursiv in die Zwischenablage kopieren (Wie die IDE)
 
Ja, das habe ich auch schon festgestellt.
Wenn ich DesignSaveComponentToStream mit dem Formular aufrufe sieht der entscheidende Teil so aus:
Delphi-Quellcode:
  object Panel1: TPanel
    Left = 110
    Top = 70
    Width = 416
    Height = 146
    Caption = 'Panel1'
    ParentShowHint = False
    PopupMenu = PopupMenu1
    ShowHint = True
    TabOrder = 2
    OnClick = FormClick
    object Panel2: TPanel
      Left = 20
      Top = 20
      Width = 370
      Height = 100
      Caption = 'Panel2'
      PopupMenu = PopupMenu1
      TabOrder = 0
      OnClick = FormClick
    end
  end
Also wie es Delphi selber auch macht.
Rufe ich aber DesignSaveComponentToStream mit dem Panel auf sehe ich nur
Delphi-Quellcode:
  object Panel1: TPanel
    Left = 110
    Top = 70
    Width = 416
    Height = 146
    Caption = 'Panel1'
    ParentShowHint = False
    PopupMenu = PopupMenu1
    ShowHint = True
    TabOrder = 2
    OnClick = FormClick
  end
Es fehlen also die Angaben über Panel2.

daywalker9 7. Nov 2011 09:52

AW: Komponenten rekursiv in die Zwischenablage kopieren (Wie die IDE)
 
Delphi-Referenz durchsuchenComponentCount durchgehen und diesen auch mit abspeichern?

v2afrank 7. Nov 2011 09:59

AW: Komponenten rekursiv in die Zwischenablage kopieren (Wie die IDE)
 
Das verstehe ich jetzt nicht. Natürlich könnte ich durch Componentcount iterieren und den String der in die Zwischenablage geht aufbauen. Allerdings bekomme ich dadurch ja nicht die abgebildet, dass Panel2 in Panel1 liegt.
Das werde ich machen, wenn der User mehrer Komponenten in die Zwischenablage kopiert. Ich könnte natürlich jetzt noch ein eigenes Format verwenden und mir irgendwo merken Panel1 ist Parent vom Panel2, aber die IDE schaffts ja auch.
Ich denke das Problem ist der Owner und Parent.
In meinem Beispiel ist es so dass der Owner beider Panel das Formular ist. Panel1 ist Parent von Panel2. Ich denke da liegt irgendwo das Problem

himitsu 7. Nov 2011 10:28

AW: Komponenten rekursiv in die Zwischenablage kopieren (Wie die IDE)
 
http://meinews.niuz.biz/writecomponent-t604210.html
http://www.freak-search.com/de/threa...nur_ein_objekt

Wer ist der Owner deiner Subkomponenten?

WriteComponent geht nicht über die Parent-Beziehungen, sondern über die Owner-Beziehung,
denn nur der Owner hat das Recht seine Subkomponenten zu speichern und vorallem zu erstellen/freizugeben, also speichert auch nur der Owner dieses.

v2afrank 7. Nov 2011 10:41

AW: Komponenten rekursiv in die Zwischenablage kopieren (Wie die IDE)
 
Danke Himitsu, das war die Lösung

Der Owner meiner Subkomponenten war auch das Formular. Eben um einfach das komplette Formular speichern zu können.
Wenn ich den Owner auf das erste Panel gesetzt habe, wurden die Subkomponenten nicht abgespeichert.
Jetzt setzte ich den Onwer der Subkomponente auf den Parent und iteriere durch alle Komponenten des Formulars.
Danke


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz