자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Delphi [XE7] 컴포넌트 제작하여 설치했더니 문제점 발견되어 질문드립니다.
2014.11.22 02:10
간단한 컴포넌트(FMX)를 만들어서 테스트해보려고 했는데, 의도되지 않은 결과가 나와서 질문드립니다.
설명: TRectangle을 상속받아 컴포넌트를 만듬.
1. TLayout, TSpeedButton을 생성하여 컴포넌트(TNHSchedule)에 포함시키도록 코딩한 후 인스톨합니다.
2. 설치된 컴포넌트를 빈폼에 올려보면 정상적인 듯 하지만,
3. 실행파일을 만들어보면 이상하게도 TLayout, TSpeedButton이 하나씩 더 보여서 두 개 중복되는 오류발생.
(디자인모드에서 컴포넌트를 Cut하고 Paste해보아도 같은 현상 발생)
컴포넌트 소스는 아래와 같습니다. 왜 그럴까요? 제 실수일까요? 델파이 버그일까요?
unit NHSchedule;
interface
uses
System.SysUtils, System.Classes, FMX.Types, FMX.Controls, FMX.Objects
, FMX.Layouts, FMX.StdCtrls;
type
TNHSchedule = class(TRectangle)
private
fTopLayout: TLayout;
fBtnYear: TSpeedButton;
protected
procedure Resize; override;
procedure Paint; override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('N&H4FMX', [TNHSchedule]);
end;
constructor TNHSchedule.Create(AOwner: TComponent);
begin
inherited;
fTopLayout := TLayout.Create(self);
fTopLayout.Parent := self;
fTopLayout.Align := TAlignLayout.Top;
fBtnYear := TSpeedButton.Create(self);
fBtnYear.Parent := fTopLayout;
fBtnYear.Align := TAlignLayout.Center;
fBtnYear.Text := '2016';
end;
destructor TNHSchedule.Destroy;
begin
inherited;
end;
procedure TNHSchedule.Paint;
begin
inherited;
end;
procedure TNHSchedule.Resize;
begin
inherited;
fTopLayout.Height := Height / 6;
fBtnYear.SetBounds(0,0,Width /3, fTopLayout.Height/2);
end;
end.
댓글 4
Delphi [XE7] 컴포넌트 제작하여 설치했더니 문제점 발견되어 질문드립니다.
2014.11.22 02:10
간단한 컴포넌트(FMX)를 만들어서 테스트해보려고 했는데, 의도되지 않은 결과가 나와서 질문드립니다.
설명: TRectangle을 상속받아 컴포넌트를 만듬.
1. TLayout, TSpeedButton을 생성하여 컴포넌트(TNHSchedule)에 포함시키도록 코딩한 후 인스톨합니다.
2. 설치된 컴포넌트를 빈폼에 올려보면 정상적인 듯 하지만,
3. 실행파일을 만들어보면 이상하게도 TLayout, TSpeedButton이 하나씩 더 보여서 두 개 중복되는 오류발생.
(디자인모드에서 컴포넌트를 Cut하고 Paste해보아도 같은 현상 발생)
컴포넌트 소스는 아래와 같습니다. 왜 그럴까요? 제 실수일까요? 델파이 버그일까요?
unit NHSchedule;
interface
uses
System.SysUtils, System.Classes, FMX.Types, FMX.Controls, FMX.Objects
, FMX.Layouts, FMX.StdCtrls;
type
TNHSchedule = class(TRectangle)
private
fTopLayout: TLayout;
fBtnYear: TSpeedButton;
protected
procedure Resize; override;
procedure Paint; override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('N&H4FMX', [TNHSchedule]);
end;
constructor TNHSchedule.Create(AOwner: TComponent);
begin
inherited;
fTopLayout := TLayout.Create(self);
fTopLayout.Parent := self;
fTopLayout.Align := TAlignLayout.Top;
fBtnYear := TSpeedButton.Create(self);
fBtnYear.Parent := fTopLayout;
fBtnYear.Align := TAlignLayout.Center;
fBtnYear.Text := '2016';
end;
destructor TNHSchedule.Destroy;
begin
inherited;
end;
procedure TNHSchedule.Paint;
begin
inherited;
end;
procedure TNHSchedule.Resize;
begin
inherited;
fTopLayout.Height := Height / 6;
fBtnYear.SetBounds(0,0,Width /3, fTopLayout.Height/2);
end;
end.
오버라이드된 RESIZE 부분이 문제가 있는것 같습니다. 이 부분을 주석처리하니 버튼이 하나만 표시됩니다.
그리고 저는 스피드 버튼을 Top으로 놓고 사용했습니다.
constructor TMYRectangle.Create(AOwner: TComponent);
begin
inherited;
fTopLayout := TLayout.Create(self);
fTopLayout.Parent := self;
fTopLayout.Align := TAlignLayout.Client;
fBtnYear := TSpeedButton.Create(self);
fBtnYear.Parent := fTopLayout;
fBtnYear.Parent := fTopLayout;
fBtnYear.Align := TAlignLayout.top;
fBtnYear.Text := '2016';
end;