2016-10-18 29 views
0

私は(最初に)簡単なFMXコンポーネントを作成しようとしています。 目的は、コンポーネントの内部にラベルを持ち、内部のonclickイベントに応答するためにラベルをクリックすることです。Delphi Visual FMXコンポーネント

const 
    _MS_Color_Transparent_Buttons = claWhite; 
    _MS_Color_Light_Background  = claWhite; 
    _MS_Color_Dark_Background  = $FF1F2222; 
    _MS_Color_Medium_Dark_Background = $FF3D454C; 
    _MS_Color_Active_Selection  = $FF0281FD; 
    _MS_Color_Separation_Lines  = $FFE1E0E0; 

type 
    TPosItemLayout = class(TLayout) 
    private 
    { Private declarations } 
    protected 
    { Protected declarations } 
    LayMarker  : TLayout; 
    rectMarker  : TRectangle; 
    labelDescription : TLabel; 

    procedure ToggleComponent(Sender : TObject); 
    public 
    { Public declarations } 
    constructor Create(AOwner: TComponent); override; 
    destructor Destroy;     override; 
    published 
    { Published declarations } 
    end; 

constructor TPosItemLayout.Create(AOwner: TComponent); 
begin 
    inherited; 
    Self.ClipChildren := True; 
    Self.Parent  := AOwner as TFmxObject; 
    Self.Position.X := 0; 
    Self.Height  := 153; 
    Self.HitTest  := True; 

    LayMarker   := TLayout.Create(Self); 
    LayMarker.Parent  := Self; 
    LayMarker.Position.X := 0; 
    LayMarker.Position.Y := 0; 
    LayMarker.Height  := 153; 
    LayMarker.Width  := 3; 
    LayMarker.Align  := TAlignLayout.Left; 
    LayMarker.HitTest := True; 

//rectMarker 
    rectMarker    := TRectangle.Create(LayMarker); 
    rectMarker.Parent  := LayMarker; 
    rectMarker.Position.X := 0; 
    rectMarker.Position.Y := 0; 
    rectMarker.Height  := 153; 
    rectMarker.Width  := 3; 
    rectMarker.Fill.Color := _MS_Color_Active_Selection; 
    rectMarker.Fill.Kind := TBrushKind.Solid; 
    rectMarker.Stroke.Color := _MS_Color_Active_Selection; 
    rectMarker.Stroke.Kind := TBrushKind.None; 
    rectMarker.Align  := TAlignLayout.Client; 
    rectMarker.HitTest  := True; 

//lbFirstDecription - Parent LayDescription 
    labelDescription       := TLabel.Create(Self); 
    labelDescription.Parent     := Self; 
    labelDescription.Position.Y    := 8; 
    labelDescription.Height     := 23; 
    labelDescription.Align     := TAlignLayout.Horizontal; 
    labelDescription.StyledSettings   := labelDescription.StyledSettings - [TStyledSetting.FontColor, TStyledSetting.Size]; 
    labelDescription.FontColor    := claBlack; 
    labelDescription.TextSettings.Font.Size := 16; 
    labelDescription.TextSettings.HorzAlign := TTextAlign.Leading; 
    labelDescription.TextSettings.VertAlign := TTextAlign.Center; 
    labelDescription.Text     := 'Description'; 
    labelDescription.WordWrap    := False; 
    labelDescription.HitTest     := True; 
    labelDescription.OnClick     := ToggleComponent; 
end; 

destructor TPosItemLayout.Destroy; 
begin 

    inherited; 
end; 

procedure TPosItemLayout.ToggleComponent(Sender: TObject); 
begin 
    showmessage('toggle'); 
end; 

私のテストアプリケーションでは、ラベルをクリックしても何も起こりません。

私はhittestを再生しようとしていますが、何もありません。

私は何を欠場ですか?

どうすれば動作させることができますか?

EDIT 1 私はコードを変更しました。元のコード上のonclickに隠されている:( 次のコードsemibizarを行動である。

type 
    TPosItemLayout = class(TLayout) 
    private 
    { Private declarations } 
    protected 
    { Protected declarations } 
    imgDelete : TButton; 

    procedure ToggleComponent(Sender : TObject); 
    public 
    { Public declarations } 
    constructor Create(AOwner: TComponent); override; 
    destructor Destroy;     override; 
    published 
    { Published declarations } 
    property btnDelete : TButton read imgDelete; 
    end; 

procedure Register; 

implementation 

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

{ TPosItemLayout } 

constructor TPosItemLayout.Create(AOwner: TComponent); 
var ImgStream : TResourceStream; 
begin 
    inherited; 
    Self.ClipChildren := True; 
    Self.Position.X := 0; 
    Self.Height  := 153; 
    Self.Width  := 400; 

    imgDelete    := TButton.Create(Self); 
    imgDelete.Parent   := Self; 
    imgDelete.Width   := 60; 
    imgDelete.Height   := 24; 
    imgDelete.HitTest  := True; 
    imgDelete.Align   := TAlignLayout.Right; 
    imgDelete.Text   := 'E'; 
    imgDelete.OnClick  := ToggleComponent; 
end; 

destructor TPosItemLayout.Destroy; 
begin 

    inherited; 
end; 

procedure TPosItemLayout.ToggleComponent(Sender: TObject); 
begin 
    imgDelete.Text := 'Click'; 
end; 

設計時に、それはボタンを作成し、 右ますが、実行時に2ボタンを揃えるには...クリックする一つの応答をcratedていますそして、するつもりされて何をすべきか...他のdoesent何もしない。この問題を追跡するための方法を

このmessupはIDEで作成されています。私は、ボタン、クローズ/オープン上のテキストを変更した場合プロジェクトの別のボタンが表示されます。新しいボタンのテキストを閉じる/閉じる、別のボタンが作成されます。 on。

+0

コンストラクタでコントロールの親を設定しないでください。ストリーミングフレームワークはそれを行います。 –

+0

わかりませんが、rectMarkerがマウスのクリックを飲み込んでしまう可能性があります。 labelDescriptionの親をrectMarkerにするか、rectMarkerのHitTestをFalseに設定するかのいずれかを試みます。 – Dsm

+0

私は親を設定しなければならないと確信しています。私がそれをしなければ "内部"のコンポーネントは見えません。 –

答えて

1

これは、ストリーミングプロセスもボタンを作成するためです。あなたは、このような保存されたFALSE属性を持つボタン(とあなたが作成しようとする他のコンポーネント)をマークする必要があります。

property btnDelete : TButton read imgDelete; stored FALSE; 

これは、格納されているボタン(ひいてはリロード)を停止します。しかし、私はこれがあなたの元の問題に関連しているとは思わない(それはそうであるように見えるかもしれないが)。私がそれが何であるかについて私の以前のコメントを見てください。

+0

私はあなたが2つの異なることを求めているように思われるので、質問について混乱します。あなたの最初の質問について:1.クリップ子供を必要としているかどうかわからない2.あなたはself.parent assignmentと3(あなたの質問に答えるために)必要がないと言っているので、あなたのコンポーネントのhittestは真です。ラベルは決してクリックイベントを受け取りません。 Asa –

2

SetSubComponentのような機能は、FMXでは機能しません。前述の複製設定で示されているように、imgDelete.Stored := falseは方法です。さらに、SetSubComponentは、Stored = false設定でもうまく再生されません。

+0

が機能しない:( –

+0

これはうまくいくと私は信じています。これは以前に質問されたたびにいつも答えとなりました。 –

+0

@DavidHeffernan、実際には動作しません! SubComponent機能がFMXで完全に壊れているようです。 –

関連する問題