Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Einfaches abgeleitetes Control unter FMX / Delphi 11 (https://www.delphipraxis.net/209202-einfaches-abgeleitetes-control-unter-fmx-delphi-11-a.html)

friedt99 8. Nov 2021 19:27

Einfaches abgeleitetes Control unter FMX / Delphi 11
 
Hallo Zusammen,

ich versuche gerade ein einfaches Control von TRectangle abzuleiten.

Delphi-Quellcode:
unit itfAppControls;

interface

uses
  System.SysUtils, System.Classes, FMX.Types, FMX.Controls, FMX.Objects,FMX.StdCtrls,
  System.UITypes,FMX.MultiResBitmap,FMX.Graphics;

type
  TAppImageButtonTest = Class(TRectangle)
  private
    ccImage:TImage;
    ccImageTextSettings:TTextSettings;

    procedure SetImageTextSettings(pcValue:TTextSettings);
  protected
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property ImageTextSettings:TTextSettings read ccImageTextSettings write SetImageTextSettings;
  End;

procedure Register;

implementation

//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// Imagebutton Compound
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
constructor TAppImageButtonTest.Create(AOwner: TComponent);
begin
  Inherited;
  ccImageTextSettings:=TTextSettings.Create(Self);

  ccImage:=TImage.Create(Self);
  ccImage.Parent:=Self;
  ccImage.Align:=TAlignLayout.Client;
  ccImage.HitTest:=FALSE;
end;

destructor TAppImageButtonTest.Destroy;
begin
  ccImageTextSettings.Free;
  ccImage.Free;
  Inherited;
end;

procedure TAppImageButtonTest.SetImageTextSettings(pcValue:TTextSettings);
begin
  ccImageTextSettings.Assign(pcValue);
end;

procedure Register;
begin
  RegisterComponents('Sample', [TAppImageButtonTest]);
end;

end.
klappt auch soweit, aber ich habe 2 Probleme:

1.)
Die Eigenschaft ImageTextSettings wird im Objektinspektor angezeigt, klappt aber nicht auf.
Das verstehe ich nicht. TTextSettings stammt von TPersistent ab, sollte doch also im
Objektinspektor editierbar sein.

2.)
Wenn ich das Control auf ein Formular setze ist alles OK (bis auf die ImageTextSettings).
In der Strukturansicht sieht das so aus:

Delphi-Quellcode:
Form1
   AppImageButtonTest1
Wenn ich das Formular speichere, schließe und wieder öffne, dann wird beim Anklicken des neuen Controls
das intern erstellte TImage angezeigt als "<unbenannt> TImage". In der Strukturansicht sieht das dann so aus:

Delphi-Quellcode:
Form1
   AppImageButtonTest1
       <Komponenten[I]>
             MultiResBitmap
in der VCL taucht ein intern in dem Parent Control erzeugtes anderes Control (mit Owner = Self) nirgends
auf. Wie bekomme ich das unter FMX (Designtime) auch hin ?

Grüße

Thomas

friedt99 8. Nov 2021 20:14

AW: Einfaches abgeleitetes Control unter FMX / Delphi 11
 
Hallo Nochmal,

das mit dem sichtbaren TImage konnte ich wie folgt lösen:

Delphi-Quellcode:
constructor TAppImageButton.Create(AOwner: TComponent);
begin
  Inherited;
  ccImageTextSettings:=TTextSettings.Create(Self);

  ccImage:=TImage.Create(Self);
  ccImage.Parent:=Self;
  ccImage.Align:=TAlignLayout.Client;
  ccImage.HitTest:=FALSE;
  ccImage.Stored:=FALSE;                    //<-Das hier verhindert das sichtbare TImage

  Stroke.Kind:=TBrushKind.None;
  Fill.Color:=TAlphaColors.Gray;
end;
Aber die TTextSettings funktionieren immer noch nicht. Muss ich da noch einen Editor
registrieren ? Wenn ja, wie ?

Grüße

Thomas

Rollo62 9. Nov 2021 07:32

AW: Einfaches abgeleitetes Control unter FMX / Delphi 11
 
Das löst jetzt nicht Dein Problem, aber eigene CustomControls anlegen mache ich kaum noch.
Genau wegen solcher Probleme und Gefrickel.

Es ist für mich viel einfacher und schneller einen TFrame mit allem was beötigt wird visuell zu erstellen,
und dann als Komponente per Runtime zu benutzen.
Ich nutze auch verschachtelte, solcher TFrames, und kann so ziemlich komplexe "Controls" aufbauen.
Die CustomControls ableiten hat für mich kaum noch Sinn, denn da kann man ja nur schwer sehr komplexe
Dinge reinbringen, die stürzen schonmal gerne mit IDE ab, die müssen immer vorher in die IDE geladen werden, bei IDE-Update müssen die erstmal wieder portiert werden, usw.

Jede Menge Generve und Gefrickel, was ich mit einfachen TFrames per Runtime gar nicht mehr habe,
und diese sogar einfach visuell bearbeiten kann.
An der Stelle wo Du jetzt stehst wäre das eine Überlegung Wert :stupid:

friedt99 12. Nov 2021 22:05

AW: Einfaches abgeleitetes Control unter FMX / Delphi 11
 
Hallo Zusammen,

das mit den TTextSettings konnte ich lösen. Hatte übersehen, das da keine
published properties sind. Habe nun eine eigene Klasse von TTextSettings
abgeleitet, die die erforderlichen Eigenschaften als published definiert.
Damit erscheinen diese auch um Objektinspektor.

Delphi-Quellcode:
TAppTextSetting = Class(TTextSettings)
  private
  public
  published
    property Font;
    property FontColor;
    property HorzAlign;
    property VertAlign;
    property WordWrap;
    property Trimming;
  End;


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