AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Visuelle Komponente mit mehreren Klassen in unterschiedlichen Units
Thema durchsuchen
Ansicht
Themen-Optionen

Visuelle Komponente mit mehreren Klassen in unterschiedlichen Units

Ein Thema von fisipjm · begonnen am 2. Nov 2023 · letzter Beitrag vom 9. Nov 2023
 
fisipjm

Registriert seit: 28. Okt 2013
333 Beiträge
 
Delphi 12 Athens
 
#6

AW: Visuelle Komponente mit mehreren Klassen in unterschiedlichen Units

  Alt 6. Nov 2023, 09:18
Alle Klassen/Komponenten, welche der FormDesigner, bzw. der DFM-Loader erstellt, die müssen "bekannt" sein, damit er diese Klasse über ihren Namen finden kann.

Wenn ein TMyLayout diese Komponente erstellt, dann wird auch deine Komponete als Owner übergeben?
Steht der erstellte Button anschließend in der DFM drin? (wurde also beim Speichern "gefunden" und vom DFM-Streaming gespeichert, um wieder geladen zu werden)
Hi,

damit wir nicht die ganze Zeit über hypothetisches reden, hab ich das Verhalten mal nachgestellt. Das ist der Quellcode für die Unit. Einfach in ein Package werfen und als Komponente installieren. Beim versuch das ganze mit x64 laufen zu lassen, erhalte ich die Info, dass TMySpeedButton nicht gefunden werden kann. Das rein ziehen der Komponente funktioniert aber problemlos.

Delphi-Quellcode:
unit uMyVisualLayout;

interface

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

Type
  TMyImage = class(TImage)

  private
    FBackupImage: TBitmap;

  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

Type
  TMySpeedbutton = class(TSpeedButton)

  private
    FLabelText: TLabel;
    function GetNewText: String;
    procedure SetNewText(const Value: String);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    property NewText: String read GetNewText write SetNewText;
  end;

Type
  TMyLayout = class(TLayout)

  private
    { Private-Deklarationen }
    Speedbutton1, Speedbutton2, Speedbutton3: TMySpeedbutton;
    TopFlowLayout: TFlowLayout;
    procedure ButtonClick(Sender: Tobject);
  protected
    { Protected-Deklarationen }
  public
    constructor Create(AOwner: TComponent); override;
    { Public-Deklarationen }
  published
    { Published-Deklarationen }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('TestVisualComponent', [TMyLayout]);
end;

{ TMyLayout }

procedure TMyLayout.ButtonClick(Sender: Tobject);
begin
  log.d(TSpeedButton(Sender).Name + ' Clicked!');
end;

constructor TMyLayout.Create(AOwner: TComponent);
begin
  inherited;
  TopFlowLayout := TFlowLayout.Create(self);
  TopFlowLayout.Parent := self;
  TopFlowLayout.Align := TAlignLayout.MostTop;

  Speedbutton1 := TMySpeedbutton.Create(self);
  Speedbutton1.Parent := TopFlowLayout;
  Speedbutton1.Align := TAlignLayout.Client;
  Speedbutton1.NewText := 'Speedbutton1';
  Speedbutton1.OnClick := ButtonClick;

  Speedbutton2 := TMySpeedbutton.Create(self);
  Speedbutton2.Parent := TopFlowLayout;
  Speedbutton2.Align := TAlignLayout.Client;
  Speedbutton2.NewText := 'Speedbutton2';
  Speedbutton2.OnClick := ButtonClick;

  Speedbutton3 := TMySpeedbutton.Create(self);
  Speedbutton3.Parent := TopFlowLayout;
  Speedbutton3.Align := TAlignLayout.Client;
  Speedbutton3.NewText := 'Speedbutton3';
  Speedbutton3.OnClick := ButtonClick;

end;

{ TMyImage }

constructor TMyImage.Create(AOwner: TComponent);
begin
  inherited;
  FBackupImage := TBitmap.Create;
end;

destructor TMyImage.Destroy;
begin
  FBackupImage.Free;
  inherited;
end;

{ TMySpeedbutton }

constructor TMySpeedbutton.Create(AOwner: TComponent);
begin
  inherited;
  FLabelText := TLabel.Create(self);
  FLabelText.Parent := self;
  FLabelText.Align := TAlignLayout.Client;
end;

destructor TMySpeedbutton.Destroy;
begin
  FLabelText.Free;
  inherited;
end;

function TMySpeedbutton.GetNewText: String;
begin
  Result := FLabelText.Text;
end;

procedure TMySpeedbutton.SetNewText(const Value: String);
begin
  FLabelText.Text := Value;
end;

end.
  Mit Zitat antworten Zitat
 

 

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 20:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz