2016-12-10 51 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

我強烈懷疑,如果你沒有**使用**:你會聲明一個局部變量來引用你的新'TPanel',並且沒有問題設置你的新'TLabel'的'Parent' _correctly_。因此,幸災樂禍可以避免你的錯誤。雖然你的**並不是一個常見的**,但是事實依然存在:當**和**一起使用時,某些類型的錯誤太容易了。鑑於**和**之間存在一個乾淨而平凡的替代方案:風險遠大於收益。而且你完全可以不使用**和**。 –

回答

5

不能強制轉換一個TPanel.Handle作爲TWinControl,因爲它不是一個。這是一個窗口句柄。

保存對您創建的面板的本地引用,並將其用作標籤的父項。

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

謝謝。它工作完美。 –