![]() |
AW: Merkwürdiger Effekt bei TLabel
Genügt die PAS-Datei, wenn ich sie hier hochlade? Wi.
|
AW: Merkwürdiger Effekt bei TLabel
Erstmal ja. Damit kann man schon die Logik nachvollziehen und ggfls. Problemstellen identifizieren.
|
AW: Merkwürdiger Effekt bei TLabel
Liste der Anhänge anzeigen (Anzahl: 1)
Das ist es.
|
AW: Merkwürdiger Effekt bei TLabel
Delphi-Quellcode:
procedure TMainForm.Wuerfel_zeigen(Wue: TWuerfelPkt);
var i: Byte; Wuerfel: TDice; Lbl: TLabel; begin for i:=1 to 5 do begin Wuerfel:=TDice(FindComponent('Wuerfel'+IntToStr(i))); Wuerfel.Value:=Wue[i]; // -------------------------------------------- Lbl:=TLabel(FindComponent('Label'+IntToStr(i))); // <-- Da kommt die Ziffer her!!! Lbl.Caption:=IntToStr(Wuerfel.Value) // -------------------------------------------- end end; {TMainForm.Wuerfel_zeigen} procedure TMainForm.btnFertigWuerfelClick(Sender: TObject); ... {$ENDIF} for i:=1 to 5 do begin Box:=TCheckBox(FindComponent('NeuBox'+IntToStr(i))); if Wahl < NeuWuerfeln then begin //3 if Box.Checked then begin Wuerfel:=TDice(FindComponent('Wuerfel'+IntToStr(i))); Wuerfel.Roll; WuerfelPkt[i]:=Wuerfel.Value; // -------------------------------------------- Lbl:=TLabel(FindComponent('Label'+IntToStr(i))); // <-- Oder eventuell auch von hier!!! Lbl.Caption:=IntToStr(Wuerfel.Value) // -------------------------------------------- end; Box.Checked:=false; Inc(Summe,WuerfelPkt[i]) end end; Inc(Wahl); ... |
AW: Merkwürdiger Effekt bei TLabel
Ich denke, Delphi.Narium hat das richtig erkannt. In dem Form gibt es zunächst kein TLabel mit Namen 'Label1'. Ich vermute, das muss
Delphi-Quellcode:
heißen.
FindComponent('lblW'+IntToStr(i))
|
AW: Merkwürdiger Effekt bei TLabel
Hallo Delphi-arium, du hast den Fehler gefunden. Ich habe die Zeilen wegkomentiert und die ominöse 1 2 … erscheinen nicht mehr. Diese Zeilen hatte ich nur zu Testzwecken eingefügt und sind überflüssig.
ABER: Es gibt keine Deklaration für Label1 (auch nicht dynamisch) und wenn ich Label1 in xyz umbenannte, kam immer noch 1.
Delphi-Quellcode:
FRAGE: wenn es Label1 nicht gibt, was passiert in Zeile 2, wenn FindKomponent nichts findet?
Lbl:=TLabel(FindComponent('Label'+IntToStr(i)));
Lbl.Caption:=IntToStr(Wuerfel.Value) Bei der geringen Komplexität vom Kniffelspiel kann ich behaupten, dass das Spiel inzwischen fehlerfrei läuft. Aber Ok - ich habe das Spiel mit Kindern, 6 u. 8 Jahre alt gespielt. Sie kamen sofort damit zurecht, fanden es am Anfang gut aber verloren schnell das Interesse. Es ist wohl besser, wenn ich das Programm in die Ecke packe und nicht veröffentliche. Danke für eure Hilfe und Gruß Willie. |
AW: Merkwürdiger Effekt bei TLabel
Zitat:
Prüfe bei solchen Zuweisungen IMMER ob deine Variable überhaupt einen Inhalt hat. Letztlich ist Lbl in dem Fall nur ein Zeiger, und wenn der auf NIL zeigt, gibt's halt nix was man damit machen kann. [Edit]Hab's grad mal ausprobiert. Aber es führt nicht zu einer Exception. Wahrscheinlich wird irgendwo in den Delphi-Bibliotheken auf <>nil geprüft. In dem Fall passiert nichts.[/Edit] |
AW: Merkwürdiger Effekt bei TLabel
Ja, habe es auch ausprobiert, es liefert nil zurück und in der 2. Zeile passiert nichts. Keine Exception. Sonst wäre mir mein Fehler natürlich sofort auf gefallen.
W. |
AW: Merkwürdiger Effekt bei TLabel
Achtung! Wenn Lbl eine lokale Variable ist, wird sie NICHT mit nil initialisiert! Das sollte der Compiler auch mit einer Warnung anmeckern!
Daher steht dann in Lbl "irgendwas" drin, und der Zugriff auf Lbl.Caption verändert "irgendwas", was überall in dem Programm sein könnte. Ganz dicker böser Schnitzer, und 2 wichtige Regeln missachtet: 1) Warnungen sind nicht zur bloßen Kenntnisnahme da, 2) Rückgabewerte stets überprüfen. Dass nil bei Nichtfund zurückgegeben wird, steht sogar in der Hilfe zu FindComponent(). Also sollte man das auch beachten. |
AW: Merkwürdiger Effekt bei TLabel
Da muss ich mich jetzt aber auch mal einklinken. Wenn FindComponent Nil zurückliefert, wenn die Komponente nicht gefunden ist, dann ist Lbl ja klar definiert. Warum knallt das denn nicht, wenn man auf die Caption von "Nil" zugreift?
Delphi-Quellcode:
Die Message ist leer, aber warum läuft das ohne Zugriffsverletzung durch?Lbl := TLabel(Nil); // Lbl := Nil funktioniert auch Lbl.Caption:='wuppdi'; Showmessage(Lbl.Caption); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz