2016-12-25 2 views
-2

Ich habe eine Komponente in Fire-monkey erstellt und auch ein TEdit darin erstellt. Meine Komponente hat eine String-Eigenschaft mit dem Namen Wert, dass durch das Poultieren einer beliebigen Zeichenfolge, zeigt meine Komponente das in Tedit. bei Design Zeit ist alles in Ordnung. aber während der Laufzeit keine Sache zeigt in Tedit mein CodeVerwenden von Tedit innerhalb einer FireMonkey-Komponente

type 
TMyComponent = class(TPanel) 
private 
    { Private declarations } 
    Edit:TEdit; 
    FValue:String; 
    Procedure SetValue(Const Value:String); 
protected 
    { Protected declarations } 
    Constructor Create(Aoner:TComponent); Override; 
    Destructor Destroy; Override; 
public 
    { Public declarations } 
published 
    { Published declarations } 
    Property Value:String Read FValue Write SetValue; 
end; 

procedure Register; 

implementation 

procedure Register; 
begin 
    RegisterComponents('Samples', [TMyComponent]); 
end; 

Constructor TMyComponent.Create(Aoner:TComponent); 
begin 
    Inherited; 
    Width:=100; 
    Height:=100; 
    Edit:=TEdit.Create(Self); 
    Edit.Parent:=Self; 
    Edit.Width:=30; 
    Edit.Text:=''; 
    Edit.Align:=TAlignLayout.Scale; 
end; 

Procedure TMyComponent.SetValue(const Value: string); 
begin 
    FValue:=Value; 
    Edit.Text:=FValue; 
end; 

Destructor TMyComponent.Destroy; 
begin 
    Edit.Destroy; 
    Inherited Destroy; 
end; 
end. 

Was soll ich tun?

+2

Wo ist der Code, den Sie zur Laufzeit getestet? – RepeatUntil

+0

Blick auf die geladenen – loki

+0

Ich kann nicht reproduzieren, welches Problem Sie zur Laufzeit haben. Bitte versuchen Sie, Ihre Frage mit besserer Erklärung zu verbessern und fügen Sie Ihrer Frage fehlenden Code hinzu. –

Antwort

1

Anfangs dachte ich, Sie hätten Probleme beim Erstellen und Verwenden Ihrer Komponente zur Laufzeit. Die Instanziierung und Verwendung Ihrer Komponente zur Laufzeit funktioniert einwandfrei.

Nach dem Kommentar von EugeneK verstehe ich jetzt, dass die Komponente nicht funktioniert, wenn Sie es zur Entwurfszeit instanziieren und versuchen, die Texteigenschaft der zur Laufzeit zu ändern.

Der Grund kann zu der Tatsache zurückverfolgt werden, dass Ihre Komponente ein zusammengesetzter Typ ist und aus Unterkomponenten (naja, nur ein) aufgebaut ist. Wenn die Stored-Eigenschaft der Unterkomponente (n) nicht auf False festgelegt ist, werden sie möglicherweise zur Entwurfszeit mehrmals gestreamt, z. wenn Sie zwischen Formularansicht und Textansicht des Formulars wechseln.

Siehe documentation und nach unten scrollen zu TCalender: Konstruiert Komplexität, wo Sie die folgenden finden:

Jedes Objekt im Komponentenbaum hat seine gespeicherten Eigenschaft auf Falsch und seine Eigenschaft Locked auf True gesetzt . Durch die Deaktivierung von Stored wird verhindert, dass das Objekt vom Formular Designer in die .fmx-Datei gestreamt wird . Wenn die Eigenschaft Stored nicht deaktiviert ist, werden die Unterkomponenten beim Laden redundant erstellt.

Das Ergebnis nach der Formularansicht Textansicht Schalt zweimal:

object MyComponent1: TMyComponent 
    Position.X = 8.000000000000000000 
    Position.Y = 8.000000000000000000 
    Size.Width = 100.000000000000000000 
    Size.Height = 100.000000000000000000 
    Size.PlatformDefault = False 
    TabOrder = 5 
    object TEdit 
     Touch.InteractiveGestures = [LongTap, DoubleTap] 
     Align = Scale 
     TabOrder = 1 
     Size.Width = 90.000000000000000000 
     Size.Height = 18.333332061767580000 
     Size.PlatformDefault = False 
    end 
    object TEdit 
     Touch.InteractiveGestures = [LongTap, DoubleTap] 
     Align = Scale 
     TabOrder = 0 
     Size.Width = 90.000000000000000000 
     Size.Height = 18.333332061767580000 
     Size.PlatformDefault = False 
    end 
    end 

während dies ist, wie es aussehen sollte:

object MyComponent1: TMyComponent 
    Position.X = 8.000000000000000000 
    Position.Y = 8.000000000000000000 
    Size.Width = 100.000000000000000000 
    Size.Height = 100.000000000000000000 
    Size.PlatformDefault = False 
    TabOrder = 5 
    end 

Die redundanten TEdit steuert das Sie decken Erstellen Sie im Konstruktor.

Die Korrektur, um Ihren Code: Fügen Sie die markierte Zeile

constructor TMyComponent.Create(Aoner: TComponent); 
begin 
    inherited; 
    Width:=100; 
    Height:=100; 
    Edit:=TEdit.Create(Self); 
    Edit.Parent:=Self; 
    Edit.Width:=90; 
    Edit.Align:=TAlignLayout.Scale; 
    Edit.Stored := False; // *** add this line *** 
end; 
2

Sie sollen diese Art von Dingen tun Stile in Firemonkey verwenden, so für Ihr Beispiel Sie MyComponent.style Datei benötigen folgend

object TRectangle 
    StyleName = 'MyComponentStyle' 
    Align = Center 
    Fill.Color = xFFF0F0F0 
    HitTest = False 
    Size.Width = 159.000000000000000000 
    Size.Height = 131.000000000000000000 
    Size.PlatformDefault = False 
    Stroke.Color = xFFCCCCCC 
    object TEdit 
    StyleName = 'MyComponentEditStyle' 
    Touch.InteractiveGestures = [LongTap, DoubleTap] 
    Align = Scale 
    TabOrder = 0 
    Size.Width = 79.499755859375000000 
    Size.Height = 21.833337783813480000 
    Size.PlatformDefault = False 
    end 
end 

dann müssen Sie MyComponent.rc in der Projektdatei enthalten, wie folgend

MyComponentStyle RCDATA "MyComponent.style" 

und Ihre MyComponent.pas wird

unit MyComponent; 

interface 

uses System.Classes, FMX.Types, FMX.Controls, FMX.StdCtrls, FMX.Edit, FMX.Styles; 

type 
    TMyComponent = class(TPanel) 
    private 
    { Private declarations } 
    FEdit: TEdit; 
    FValue: string; 
    procedure SetValue(const AValue: string); 
    function GetValue: string; 
    protected 
    { Protected declarations } 
    procedure FreeStyle; override; 
    procedure ApplyStyle; override; 
    function GetStyleObject: TFmxObject; override; 
    public 
    { Public declarations } 
    constructor Create(AOwner: TComponent); override; 
    published 
    { Published declarations } 
    property Value: string read GetValue write SetValue; 
    end; 

procedure Register; 

implementation 

uses Winapi.Windows; 

{$R MyComponent.res} 

procedure Register; 
begin 
    RegisterComponents('Samples', [TMyComponent]); 
end; 

procedure TMyComponent.ApplyStyle; 
begin 
    inherited; 
    if FindStyleResource<TEdit>('MyComponentEditStyle', FEdit) then 
    begin 
    FEdit.Visible := True; 
    FEdit.Text := Value; 
    end; 
end; 

function TMyComponent.GetStyleObject: TFmxObject; 
const 
    Style = 'MyComponentStyle'; 
begin 
    if (StyleLookup = '') then 
    Result := TStyleStreaming.LoadFromResource(HInstance, Style, RT_RCDATA) 
    else 
    Result := inherited GetStyleObject; 
end; 

procedure TMyComponent.FreeStyle; 
begin 
    FEdit := nil; 
    inherited; 
end; 

constructor TMyComponent.Create(AOwner: TComponent); 
begin 
    inherited; 
    Width := 100; 
    Height := 100; 
end; 

procedure TMyComponent.SetValue(const AValue: string); 
begin 
    FValue := AValue; 
    if Assigned(FEdit) then 
    begin 
    FEdit.Text := FValue; 
    end; 
end; 

function TMyComponent.GetValue: string; 
begin 
    Result := FValue; 
end; 

end. 
Verwandte Themen