2016-10-18 5 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를 놀아 보려고했지만 아무 것도 시도하지 못했습니다.

나는 무엇을 놓칠까요?

어떻게 작동합니까?

수정 1 코드를 변경했습니다. 원래의 코드에 온 클릭 다음 코드는 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; 

디자인 타임에이 버튼을 만들고 .. 하나 개의 응답이 를 잘하지만,이 버튼을 상자에 포장되어 런타임에 클릭하여 정렬 그리고 할 예정입니다 않는 것을 .. 다른 doesent 할 아무것도.이 문제를 추적하는 방법

?

이 messup이 IDE에 의해 생성된다. 내가 버튼을 닫기/열기의 텍스트를 변경하는 경우 프로젝트가 다른 버튼이 나타납니다. 새 버튼의 텍스트를 변경/닫고 다른 버튼이 생성됩니다. 에.

+0

확실히 생성자에 컨트롤의 부모를 설정하면 안됩니다. 스트리밍 프레임 워크가이를 수행합니다. –

+0

확실하지는 않지만 rectMarker가 마우스 클릭을 삼킬 수 있다고 우려합니다. 나는 labelMarker로 labelDescription의 부모를 만들거나 rectMarker에 대해 HitTest를 False로 설정하려고 시도합니다. – Dsm

+0

나는 부모를 설정해야한다는 것을 확신한다. 하지 않으면 "내부"구성 요소가 보이지 않습니다. –

답변

1

스트리밍 프로세스도 단추를 생성하기 때문입니다. 이 같은 저장 FALSE 속성 버튼 (당신이 만들려는 다른 구성 요소)를 표시해야합니다

property btnDelete : TButton read imgDelete; stored FALSE; 

이 저장 (따라서 리로디드)되는 버튼을 중지합니다. 그러나 나는 이것이 당신의 원래 문제와 관련이 있다고 생각하지 않는다. 내가 생각하는 것에 대한 나의 이전 코멘트를 보아라.

+0

두 가지 다른 질문을하는 것처럼 나는 질문에 대해 혼란스러워합니다. 귀하의 초기 질문에 대해 : 1. 클립 아이를 필요로하는지 잘 모르겠다. 2. 사람들은 self.parent assignment 및 3. (질문에 답하기 위해) 필요하지 않다고 말하면 컴포넌트의 적중률은 true이다. 레이블에는 클릭 이벤트가 전혀 발생하지 않습니다. Asa –

2

SetSubComponent 기능이 FMX에서 작동하지 않습니다. 언급 된 중복 설정 imgDelete.Stored := false에서 볼 수 있듯이 갈 길이 멀다. 또한 SetSubComponent은 Stored = false 설정으로도 제대로 재생되지 않습니다.

+0

이 작동하지 않습니다. ( –

+0

나는 이것이 효과가 있다고 믿습니다.이 질문은 이전에 질문을 받았을 때마다 항상 대답이었습니다. –

+0

@DavidHeffernan, 실제로 작동하지 않습니다! FMX에서 SubComponent 기능이 완전히 고장난 것 같습니다. –