아래와 같이 만들었는데 안되네요. 만들려고 하는것은 Panel 위에 Panel과 DBGrid 를 올려서 하나의 컴포넌트로 만들고 싶습니다.
아래 소스중에서 어디가 잘못 된건지 알수가 없네요.(컴포넌트 처음 만들어 보는건데요. 아주 초보용으로 갈켜 주세요.)
<!--CodeS-->
unit TntmailDBGrid;
interface
uses
SysUtils, Classes, Controls, ExtCtrls, DBGrids, DB;
type
TTntmailDBGrid = class(TPanel)
private
{ Private declarations }
FDBGrid : TDBGrid;
FFindPanel : TPanel;
FDataSource : TDataSource;
FDataSet : TDataSet;
procedure SetFDataSet(Value:TDataSet);
protected
{ Protected declarations }
public
{ Public declarations }
Constructor Create(AOwner:TComponent); override;
Destructor Destroy; override;
published
{ Published declarations }
Property DataSet : TDataSet read FDataSet write SetFDataSet;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Tntmail', [TTntmailDBGrid]);
end;
{ TTntmailDBGrid }
constructor TTntmailDBGrid.Create(AOwner: TComponent);
begin
inherited;
BevelInner := bvNone;
BevelOuter := bvNone;
FFindPanel := TPanel.Create(AOwner);
// FFindPanel.Align := alTop;
FFindPanel.BevelInner := bvLowered;
FFindPanel.BevelOuter := bvRaised;
FFindPanel.Parent := Self;
FDataSource := TDataSource.Create(AOwner);
FDataSource.DataSet := FDataSet;
FDBGrid := TDBGrid.Create(AOwner);
FDBGrid.Parent := Self;
// FDBGrid.Align := alClient;
FDBGrid.DataSource := FDataSource;
// FDBGrid.DataSource := FDataSource;
end;
destructor TTntmailDBGrid.Destroy;
begin
FFindPanel.Free;
FDBGrid.Free;
FDataSource.Free;
inherited;
end;
procedure TTntmailDBGrid.SetFDataSet(Value: TDataSet);
begin
FDataSet := Value;
FDataSource.DataSet := Value;
end;
end.
<!--CodeE-->
그냥 봐선 어디가 잘못된것인지 잘 모르겠네요...
무엇이 어떻게 안된다하는것에 대해서 구체적으로 설명해주셔야 할듯...
한가지 눈에 띄는 점은 DataSet속성이 내부에서 자체적으로 생성하는것이 아니라 외부의 링크를 받아서 처리하는것 같은데 이럴때는 Notification메소드를 오버라이드해서 처리해줘야 합니다.
이 메소드는 컴포넌트가 생성되거나 삭제될때 통지하는 역활을 합니다. 생성쪽이야 별 처리할것은 없지만 DataSet에 연결된 컴포넌트가 삭제될때 DataSet속성을 nil로 만들어주셔야 합니다. 안그러면 이미 삭제된 컴포넌트를 계속 참조하고 있을테니까요...
^^ 항상 즐코하세요...