2016-12-25 12 views
-2

Я создал компонент в Fire-monkey, а также создал TEdit внутри него. Мой компонент имеет свойство String с именем Значение что, надувая любую строку, My Component покажет это в Tedit. при разработке Время все в порядке. но во время выполнения не вещь показывает в TEdit Мой код неИспользование Tedit Внутри компонента FireMonkey

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. 

Что я должен делать?

+2

Где код, который вы тестировали во время выполнения? – RepeatUntil

+0

Посмотрите на загруженный – loki

+0

Я не могу воспроизвести все проблемы, которые у вас есть во время выполнения. Попробуйте улучшить свой вопрос с лучшим объяснением и добавьте недостающий код на ваш вопрос. –

ответ

1

Первоначально я думал, что у вас возникли проблемы с созданием и использованием вашего компонента во время выполнения. Создание и использование вашего компонента во время работы отлично работает.

После комментария EugeneK теперь я понимаю, что компонент не работает, если вы создаете экземпляр его во время разработки и попытаетесь изменить свойство текста TEdit во время выполнения.

Причина может быть связана с тем, что ваш компонент является составным типом и построен из подкомпонентов (ну, только TEdit). Если свойство Stored подкомпонентов (-ов) не установлено в False, они могут получать поток несколько раз во время разработки, f.ex. когда вы переключаетесь между видом формы и текстовым видом формы.

См documentation и прокрутите вниз до TCalender: Изготовленные Сложность, где вы можете найти следующее:

Каждый объект в дереве компонентов имеет свою Хранимое свойство установлено в Ложные и его Locked свойство установлено в True, , Отключение сохраненного запрещает объект из потока в файл .fmx по форме Дизайнер. Если сохраненное свойство не отключено, подкомпоненты будут избыточно создаваться при загрузке.

Результат после дважды переключая вид формы в текстовом виде:

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 

в то время как это, как это должно выглядеть следующим образом:

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 

резервированной TEdit управления будет охватывать тот, который вы создайте в конструкторе.

Коррекция к коду: Добавить отмеченную линию

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

Вы должны делать такого рода вещи, используя стили в FireMonkey, поэтому для примера вам нужно MyComponent.style файл следующим образом

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 

, то вам необходимо включить MyComponent.rc в файл проекта следующим образом

MyComponentStyle RCDATA "MyComponent.style" 

и ваш MyComponent.pas будет

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.