간단한 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에 의해 생성된다. 내가 버튼을 닫기/열기의 텍스트를 변경하는 경우 프로젝트가 다른 버튼이 나타납니다. 새 버튼의 텍스트를 변경/닫고 다른 버튼이 생성됩니다. 에.
확실히 생성자에 컨트롤의 부모를 설정하면 안됩니다. 스트리밍 프레임 워크가이를 수행합니다. –
확실하지는 않지만 rectMarker가 마우스 클릭을 삼킬 수 있다고 우려합니다. 나는 labelMarker로 labelDescription의 부모를 만들거나 rectMarker에 대해 HitTest를 False로 설정하려고 시도합니다. – Dsm
나는 부모를 설정해야한다는 것을 확신한다. 하지 않으면 "내부"구성 요소가 보이지 않습니다. –