이건 참 설명하기 어려운데... 그냥 소스 보면 이해될겁니다.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TButton = class(StdCtrls.TButton)
public
procedure Click; override;
end;
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TButton }
procedure TButton.Click;
begin
inherited;
Form1.Label1.Caption := 'Button clicked';
end;
end.
일종의 트릭인데... 런타임에 DFM 리소스를 읽어서 해당 폼을 구성하는 콤포넌트를 생성하겠지요.. 이때 내가 원하는 콤포넌트로 바꿔 버리는 겁니다. Naming scope(맞나?..)를 이용해서 StdCtrls에 있는 TButton을 찾기 전에 이 유닛의 TButton을 찾게하고 여기서 원하는 기능을 추가하면 됩니다.
하여간 StdCtrl.TButton이 아니라 Unit1.TButton을 생성하게 하는 트릭.. 하지만 이런 기능의 문제는
1. 해당 유닛의 모든 컴포넌트에 같이 적용되어 버린다.
모든 버튼이 Unit1.TButton으로 생성되기에 모든 버튼을 클릭하면 레이블의 캡션을 변경해버리는 문제가 있죠. 이런 경우 TButton.Name이나 Tag를 이용하여 해당 기능을 수행하는 또다른 꽁수를 쓰게됩니다. 꽁수는 결국 계속된 꽁수를 낳게되죠..
2. 재사용성이 어렵다.
이 유닛에서 구현한 기능을 또 다른 곳에도 필요하다면.. 그럴 경우 그냥 TMyButton 컴포넌트를 만드는 것이 상책이지만 이 역시도 꽁수가 있습니다.
다른 유닛(Unit2.pas)에 TMyButton 이렇게 만들고... Unit1에는 class alias 또는 상속으로 해놓으면 되지요..
Unit2.pas
TMyButton = class(TButton)
public
procedure Click; override;
end;
Unit1.pas
type
TButton = class(TMyButton)
end;
TForm1 = class(TForm)
blabla.... |