AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Komponenten rekursiv in die Zwischenablage kopieren (Wie die IDE)
Thema durchsuchen
Ansicht
Themen-Optionen

Komponenten rekursiv in die Zwischenablage kopieren (Wie die IDE)

Ein Thema von v2afrank · begonnen am 7. Nov 2011 · letzter Beitrag vom 7. Nov 2011
Antwort Antwort
v2afrank

Registriert seit: 9. Mai 2005
Ort: Bocholt
571 Beiträge
 
Delphi XE2 Professional
 
#1

Komponenten rekursiv in die Zwischenablage kopieren (Wie die IDE)

  Alt 7. Nov 2011, 09:25
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 ?
  Mit Zitat antworten Zitat
Benutzerbild von Nersgatt
Nersgatt

Registriert seit: 12. Sep 2008
Ort: Emlichheim
693 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

AW: Komponenten rekursiv in die Zwischenablage kopieren (Wie die IDE)

  Alt 7. Nov 2011, 09:30
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ß.
Jens
  Mit Zitat antworten Zitat
v2afrank

Registriert seit: 9. Mai 2005
Ort: Bocholt
571 Beiträge
 
Delphi XE2 Professional
 
#3

AW: Komponenten rekursiv in die Zwischenablage kopieren (Wie die IDE)

  Alt 7. Nov 2011, 09:36
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.
  Mit Zitat antworten Zitat
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#4

AW: Komponenten rekursiv in die Zwischenablage kopieren (Wie die IDE)

  Alt 7. Nov 2011, 09:52
Delphi-Referenz durchsuchenComponentCount durchgehen und diesen auch mit abspeichern?
Lars
  Mit Zitat antworten Zitat
v2afrank

Registriert seit: 9. Mai 2005
Ort: Bocholt
571 Beiträge
 
Delphi XE2 Professional
 
#5

AW: Komponenten rekursiv in die Zwischenablage kopieren (Wie die IDE)

  Alt 7. Nov 2011, 09:59
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#6

AW: Komponenten rekursiv in die Zwischenablage kopieren (Wie die IDE)

  Alt 7. Nov 2011, 10:28
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
v2afrank

Registriert seit: 9. Mai 2005
Ort: Bocholt
571 Beiträge
 
Delphi XE2 Professional
 
#7

AW: Komponenten rekursiv in die Zwischenablage kopieren (Wie die IDE)

  Alt 7. Nov 2011, 10:41
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:40 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