2016-12-10 3 views
-1

Ich möchte Panel-Komponenten einschließlich mehrerer Etiketten erstellen. Mein Code ist wie folgt, und das Panel ist erstellt, aber Etiketten nicht. Die Fehlermeldung lautet 'Zugriffsverletzung bei Adresse 0040452A ... Lesen der Adresse FFFFFFD0'.Wie erstellt man eine Komponente im Runtime Created Panel?

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

Als eine allgemeine Regel, jede Besetzung ist verdächtig und sollte dafür verantwortlich sein. Ich vermute, dass Ihr Prozess, wenn der Compiler gegen den ursprünglichen Typkonflikt verstoßen hat, das Handle als Steuerelement darstellt. Denke nicht so. –

+0

Ich vermute stark, dass du, wenn du nicht ** mit ** benutzt hättest: du hättest eine lokale Variable deklariert, um auf dein neues 'TPanel' zu verweisen und hättest kein Problem damit, das 'Eltern' deines neuen' TLabel' _correctly_ zu setzen. Und so hätte durch glücklichen Zufall Ihr Fehler ganz vermieden werden können. Während Ihres ist kein gewöhnlicher ** mit ** - Fehler, die Tatsache bleibt: Bestimmte Arten von Fehlern sind viel zu einfach, wenn Sie ** mit ** verwenden. Da gibt es eine saubere, triviale Alternative zu ** mit **: Die Risiken überwiegen bei weitem die Vorteile. Und du würdest gut tun, um ** mit ** überhaupt nicht zu verwenden. –

Antwort

5

können Sie keine TPanel.Handle als TWinControl typisieren, weil es nicht ist. Es ist ein Fenstergriff.

Speichern Sie stattdessen einen lokalen Verweis auf das Panel, das Sie erstellen, und verwenden Sie es als übergeordnetes Element für das Label.

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

Danke. Es funktioniert perfekt. –

Verwandte Themen