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/)
-   -   [Fmx] Controls und Children mit Deep Copy clonen (https://www.delphipraxis.net/197787-%5Bfmx%5D-controls-und-children-mit-deep-copy-clonen.html)

Rollo62 4. Sep 2018 15:35

[Fmx] Controls und Children mit Deep Copy clonen
 
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

Harry Stahl 5. Sep 2018 21:24

AW: [Fmx] Controls und Children mit Deep Copy clonen
 
Eventuell hilft Dir die "Clone"-Funktion?

z.B.:

Delphi-Quellcode:
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).

Rollo62 6. Sep 2018 09:25

AW: [Fmx] Controls und Children mit Deep Copy clonen
 
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 ? :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:57 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