Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Merkwürdiger Effekt bei TLabel (https://www.delphipraxis.net/204149-merkwuerdiger-effekt-bei-tlabel.html)

Willie1 1. Mai 2020 16:56

AW: Merkwürdiger Effekt bei TLabel
 
Genügt die PAS-Datei, wenn ich sie hier hochlade? Wi.

Delphi.Narium 1. Mai 2020 17:00

AW: Merkwürdiger Effekt bei TLabel
 
Erstmal ja. Damit kann man schon die Logik nachvollziehen und ggfls. Problemstellen identifizieren.

Willie1 1. Mai 2020 17:20

AW: Merkwürdiger Effekt bei TLabel
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das ist es.

Delphi.Narium 1. Mai 2020 17:46

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);
...

Uwe Raabe 1. Mai 2020 18:34

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:
FindComponent('lblW'+IntToStr(i))
heißen.

Willie1 3. Mai 2020 17:20

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:
    Lbl:=TLabel(FindComponent('Label'+IntToStr(i)));
    Lbl.Caption:=IntToStr(Wuerfel.Value)
FRAGE: wenn es Label1 nicht gibt, was passiert in Zeile 2, wenn FindKomponent nichts findet?

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.

Hobbycoder 3. Mai 2020 17:28

AW: Merkwürdiger Effekt bei TLabel
 
Zitat:

Zitat von Willie1 (Beitrag 1463499)
Delphi-Quellcode:
    Lbl:=TLabel(FindComponent('Label'+IntToStr(i)));
    Lbl.Caption:=IntToStr(Wuerfel.Value)
FRAGE: wenn es Label1 nicht gibt, was passiert in Zeile 2, wenn FindKomponent nichts findet?

Ich würde mal behaupten wenn FindComponent die Komponente nicht findet, gibt's ein nil zurück, und in der zweite Zeile wird dann eine Access Violation regnen.
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]

Willie1 3. Mai 2020 17:48

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.

Medium 3. Mai 2020 18:48

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.

Gausi 3. Mai 2020 19:59

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:
   
Lbl := TLabel(Nil);
// Lbl := Nil funktioniert auch
Lbl.Caption:='wuppdi';
Showmessage(Lbl.Caption);
Die Message ist leer, aber warum läuft das ohne Zugriffsverletzung durch?


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:09 Uhr.
Seite 3 von 4     123 4      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz