AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

[Fmx] Controls und Children mit Deep Copy clonen

Ein Thema von Rollo62 · begonnen am 4. Sep 2018 · letzter Beitrag vom 6. Sep 2018
Antwort Antwort
Rollo62

Registriert seit: 15. Mär 2007
4.116 Beiträge
 
Delphi 12 Athens
 
#1

[Fmx] Controls und Children mit Deep Copy clonen

  Alt 4. Sep 2018, 16:35
Hallo zusammen,

ich möchte unter Fmx ein Control, welches Children enthält kopieren,
am Besten den ganzen Baum mit allen Settings, ImageIndex, OnXxxx Handlern, etc.

Ich mache das z.B. per Write/ReadComponent
Delphi-Quellcode:
        try
            LMs.WriteComponent( SpeedButton1 );

            LMs.Position := 0;

            LFmx := LMs.ReadComponent(nil) as TFmxObject;
            LFmx.Name := LFmx.Name + 'b';

            FlowLayout1.InsertControl(0, LFmx);

        finally
            LMs.Free;
        end;
Das funktioniert auch für SpeedButton1, nur der Name muss angepasst werden.
Aber die Children des SpeedButton werden nicht mit dupliziert.

Gibt es dafür eine bequeme Einstellung in WriteComponent, oder eine andere fertige Methode ?

Rollo
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.538 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: [Fmx] Controls und Children mit Deep Copy clonen

  Alt 5. Sep 2018, 22:24
Eventuell hilft Dir die "Clone"-Funktion?

z.B.:

TFMXObject (ListboxNew) := ListBox1.clone (self); kopiert Dir die ganze Listbox, inklusive aller ListboxItems, ImageIndex usw.

Allerdings werden keine Eventverknüpfungen kopiert (den Parent musst Du auch selber setzen), das müsste man dann selber nachholen.

Funktioniert auch beim Speedbutton mit dem Kopieren der Children (allerdings wird seltsamerweise der .Text nicht kopiert).

Geändert von Harry Stahl ( 5. Sep 2018 um 22:51 Uhr)
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.116 Beiträge
 
Delphi 12 Athens
 
#3

AW: [Fmx] Controls und Children mit Deep Copy clonen

  Alt 6. Sep 2018, 10:25
Hallo Harry,

dankesehr für die gute Idee.

Leider hat TListBox keine direkte Clone Funktion, sondern nutzt die von TFmxObject.

Darin wird weiter im Writer.WriteComponent Folgendes aufgerufen:
Delphi-Quellcode:
    for I := 0 to Component.ComponentCount - 1 do
      if csSubComponent in Component.Components[I].ComponentStyle then
        Include(Component.Components[I].FComponentState, csWriting);
Ich vermute mal das sind die Items der Listbox, die sind in der Components Liste.

Das Clone kam bei meinem Versuch an dieselbe Stelle, und funktionierte eben nicht mit den Children.


Wenn ich aber in FMX Child-Controls z.B. mit der Maus auf andere Parent-Control lege, dann landen die in der Childrens Liste.
Dasselbe Verhalten bekommen ich zur Runtime mit ParentControl.AddObject .RemoveObject,
und das funktioniert auch soweit super.

Aber die internen Collections von z.B. TListbox werden anscheinen in Components abgewickelt, und die manuellen Elemente in Childrens.

Was ich Erreichen möchte ist im Prinzip dasselbe Verhalten wie in der IDE:
- ich habe ein Parent-Objekt mit Child-Objekten
- Klicke drauf mit Crtl-C kopieren
- Klicke auf mein Ziel
- und mit Ctrl-P den ganzen Baum kopieren, mit Allen Unterkomponenten und Settings.

Ich hatte auch an JSONMarshaller und Clipboard gedacht, aber ich da finde ich auch keine Lösung.
Vielleicht kann man die Orginal-IDE-Design Funktion irgendwo anzapfen ?
  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 04:37 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