2016-12-10 30 views
-1

いくつかのラベルを含むパネルコンポーネントを作成したいと思います。私のコードは以下の通りで、パネルは作成されますが、ラベルは作成されません。エラーメッセージは「アドレス0040452Aのアクセス違反...アドレスFFFFFFD0の読み取り」です。実行時作成パネルでコンポーネントを作成するにはどうすればよいですか?

rScan:=rScan+1; 
// create panel 
with TPanel.Create(self) do begin 
    Parent:=sxScan; 
    Name:='pnScanItem'+IntToStr(rScan); 
    Left:=0; 
    Top:=4+(rScan-1)*67; 
    Width:=983; 
    Height:=68; 
    Caption:=''; 
    vHandle:=Handle; 
end; 
// create label 
with TLabel.Create(self) do begin 
    Parent:=TWinControl(vHandle); 
    Name:='lbScanNam'+IntToStr(rScan); 
    Left:=11; 
    Top:=4; 
    Font.Size:=14; 
    Caption:='.....'; 
end; 
+1

広範なルールとして、キャストは疑わしいものですが、原因となるはずです。私は、元の型の不一致に反対するコンパイラがハンドルをコントロールにキャストすることになっていたときのプロセスを推測します。そんなことは考えないでください。 –

+0

私は、あなたが** with **を使っていないことを強く疑っています:新しい 'TPanel'を参照するローカル変数を宣言し、新しい' TLabel'_correctly_の 'Parent'を設定するのに問題はないでしょう。したがって、幸せな事故であなたの過ちを完全に回避することができました。あなたが**間違ったミスをしているのはあなたのものではありませんが、**の**を**と使用すると、ある種の間違いが簡単すぎます。 **と**のクリーンで些細な代替策があることを考えると、リスクは利益をはるかに上回ります。そして**を**と一緒に使用しないことはうまくいくでしょう。 –

答えて

5

それは一つではないので、あなたは、TWinControlとしてTPanel.Handleを型キャストすることはできません。それは窓のハンドルです。

代わりに作成しているパネルへのローカル参照を保存し、ラベルの親として使用します。

var 
    Pnl: TPanel; 
begin 
    Pnl := TPanel.Create(Self); 
    with Pnl do 
    begin 
    Parent := ... 
    // Other panel setup code 
    end; 
    with TLabel.Create(self) do 
    begin 
    Parent := Pnl; 
    // Other label setup code 
    end; 
end; 
+0

ありがとうございます。完璧に動作します。 –

関連する問題