![]() |
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:
auch super funktioniert. Auch das Laden funktioniert bestens.
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; 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 ? |
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ß. |
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:
Also wie es Delphi selber auch macht.
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 Rufe ich aber DesignSaveComponentToStream mit dem Panel auf sehe ich nur
Delphi-Quellcode:
Es fehlen also die Angaben über Panel2.
object Panel1: TPanel
Left = 110 Top = 70 Width = 416 Height = 146 Caption = 'Panel1' ParentShowHint = False PopupMenu = PopupMenu1 ShowHint = True TabOrder = 2 OnClick = FormClick end |
AW: Komponenten rekursiv in die Zwischenablage kopieren (Wie die IDE)
![]() |
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 |
AW: Komponenten rekursiv in die Zwischenablage kopieren (Wie die IDE)
![]() ![]() 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. |
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 08:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz