2016-06-20 22 views
1

カスタムStringGrid要素が必要です。 は、私はクラスを作成しました:Delphi:delete TStringGridを削除する

constructor TClassStringGrid.Create(AOwner: TForm); 
begin 
    inherited Create(nil); 
    myGroupBox1 := TGroupBox.Create(AOwner); 
    myGroupBox1.Parent := AOwner; 
    myStringGrid1 := TStringGrid.Create(self); 
    myStringGrid1.Parent := myGroupBox1; 
    myStringGrid1.Options := myStringGrid1.Options + [goEditing]; 
end; 

destructor TClassStringGrid.Destroy; 
begin 
    if myStringGrid1 <> nil then begin 
     FreeAndNil(myStringGrid1); 
    end; 

    if myGroupBox1 <> nil then begin 
     DestroyComponents; 
     FreeAndNil(myGroupBox1); 
    end; 

    // Call the parent class destructor 
    inherited; 

end; 

type 
    TClassStringGrid = class(TCustomControl) 
    ... 

私はForm1の中にクラスを作成し、それを示しています。できます。しかし、私がStringGrid(Form1)に値を入れて、Form1を閉じようとすると、FreeAndNil(myStringGrid1);に「この要素には親ウィンドウがありません」という例外が発生します。 Destroyで何が問題になっていますか? 私があなたに提供できる情報があれば、私は感謝しています。あなたは、このコントロールのグループボックス内の文字列のグリッドを表示したいと仮定すると、

+1

なぜ継承されたか(nil);継承されていないCreate(aOwner)? – GuidoG

+0

所有権がひどく混乱しています。サブコントロールに作成し、それらの両方を所有させます。しかし、あなたはそれらのサブコントロールを破壊する責任を負います。 1.継承されたコンストラクタに 'AOwner'を渡します。 2. 2つのサブコントロールの 'Owner 'として' nil'を渡します。 3.デストラクタの2つのサブコントロールで 'Free'を呼び出します。 4.デストラクタから他のすべてのコードを削除します。 –

+0

ありがとうございました!私は3つのステップを行った:1。 'create(AOwner);' 2. myGroupBox1:= TGroupBox.Create(nil); '3。 'myStringGrid1.Free;'しかし、私はまだエラーがあります。 – genakust

答えて

1

が、これはそれのように見えるべきかである。このようにして

type 
    TMyStringGrid = class(TCustomControl) 
    private 
    FGroupBox: TGroupBox; 
    FStringGrid: TStringGrid; 
    public 
    constructor Create(AOwner: TComponent); override; 
    end; 

constructor TMyStringGrid.Create(AOwner: TComponent); 
begin 
    inherited Create(AOwner); 
    FGroupBox := TGroupBox.Create(Self); 
    FGroupBox.Parent := Self; 
    FStringGrid := TStringGrid.Create(Self); 
    FStringGrid.Parent := FGroupBox; 
end; 

、新しく設計された制御は、所有者と親でありますサブコントロール。そのために破壊が自動的に行われます。

+0

技術的には、文字列グリッドの親はグループボックス –

関連する問題