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/)
-   -   Firemonkey ignoriert SetSubComponent() (https://www.delphipraxis.net/180362-firemonkey-ignoriert-setsubcomponent.html)

sks4u 14. Mai 2014 18:17


Firemonkey ignoriert SetSubComponent()
 
Hallo,

ich versuche gerade mit Delphi XE6 in einem Firmonkey-Projekt eine von TPanel abgeleitete Komponente zu erstellen.
Also vereinfacht etwa so etwas:

Delphi-Quellcode:
unit TFlipPanelsIntern;

interface

uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls;

type
  TFlipPanelIntern = class(TPanel)
    constructor Create(AOwner: TComponent); override;
  private
    Button1: TButton;
  public
  published
end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('sks', [TFlipPanelIntern]);
end;


constructor TFlipPanelIntern.create(AOwner: Tcomponent);
begin
  inherited create(AOwner);

  Button1 := TButton.Create(self);
  Button1.SetSubComponent(true);
  Button1.Parent := self;
  Button1.Name := 'Button1';
  Button1.Align := TAlignLayout.Right;
  Button1.Width := 20;
end;

end.
Das funktioniert soweit auch bis ich die Komponente in ein Formular einfüge.
Die Subkomponente "Button1" wird mit in die .FMX gescchrieben


Delphi-Quellcode:
object FlipPanelIntern1: TFlipPanelIntern
  Height = 120.000000000000000000
  Position.X = 136.000000000000000000
  Position.Y = 96.000000000000000000
  Width = 120.000000000000000000
  TabOrder = 5
  object Button1: TButton
    Align = Right
    Height = 120.000000000000000000
    Position.X = 100.000000000000000000
    TabOrder = 0
    Text = 'Button1'
    Width = 20.000000000000000000
  end
end
Wenn ich das Formular nun erneut öffne, dann habe ich den Button 2x drin.
Ich nehme mal an, dass beim Parsen der .FMX meine Komponente angelegt wird und zwar inclusive des Buttons aus dem Konstructor und dann der Button aus der *.FMX

Wenn ich das Formular dan wieder schliesse (und speichere) steht der Button 2x in der .FMX und beim Öffnen zeigt der FormularEditor den Button 3x ... und so weiter....


Eigentlich dachte ich SetSubComponent(true) soll genau das - das Schreiben in die RessourcenDatei verhindern.


Folgende Tips habe ich bereits via Google gefunden und vergeblich ausprobiert.
- die TButton-Komponente aus privat, public, published deklariern
- den Constructor von TButton mit AOwner self, Owne und nil aufrufen


Grüße,

Sascha

stahli 14. Mai 2014 18:49

AW: Firemonkey ignoriert SetSubComponent()
 
Hallo Sascha,

herzlich willkommen. :-)

Den Quelltext kannst Du in Delphi-Tags setzen (Delphi-Helm im Editor).

Versuch mal
Delphi-Quellcode:
Button1.Stored := False;
ob das hilft.
Aber selbst wenn, bei FMX steht man wohl immer wieder vor Rätseln. :-(

himitsu 14. Mai 2014 19:01

AW: Firemonkey ignoriert SetSubComponent()
 
Zitat:

Zitat von sks4u (Beitrag 1258930)
Eigentlich dachte ich SetSubComponent(true) soll genau das - das Schreiben in die RessourcenDatei verhindern.

War das nicht genau andersrum?
Mit SetSubComponent(True) sagt man, daß die Komponente gespeichert werden soll.

stahli 14. Mai 2014 19:06

AW: Firemonkey ignoriert SetSubComponent()
 
Ja, das stimmt.

Bei FMX hat aber auch noch Stored einen Einfluss.
Ich hatte das durch Quelltextstudium und Versuche heraus bekommen.

100%ig kann ich den Zusammenhang jetzt nicht mehr zusammenfassen.
Ich war damals froh, dass es "irgendwie zu funktionieren schien".

sks4u 14. Mai 2014 19:27

AW: Firemonkey ignoriert SetSubComponent()
 
Herzlichen Dank in die Runde.

Delphi-Quellcode:
Button1.Stored  := false;
ist das was ich gesucht habe.

Dann werde ich mal loslegen und vielleicht komme ich auch noch drauf, welchen Einfluß
Button1.SetSubComponent(true|false);
hat. Im Moment entdecke ich noch keinen.


Danke,
Sascha

sks4u 18. Mai 2014 18:54

AW: Firemonkey ignoriert SetSubComponent()
 
Naja, leider ist
Delphi-Quellcode:
Stored := false;
auch nicht unbedingt eine Lösung.

Wenn die Subkomponente selbst auch ein TPanel ist - und darauf sollte es hinauslaufen,
dann wird eben auch nichts gespeichert, was man da zur Entwurfszeit raufpackt.

Damit bin ich wieder am Anfang.

Es muß doch möglich sein, die Subkomponenten auf meine Komponente zu bekommen,
ohne sie im Konstruktor meiner Komponente zu instanzieren,
oder zu verhindern, das sie in der Folgeverarbeitung der .FMX nochmal erzeugt werden.


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