Variable in Komponentennamen einbinden

Rund um die LCL und andere Komponenten
Antworten
Gromekh
Beiträge: 2
Registriert: Do 25. Jan 2018, 22:09

Variable in Komponentennamen einbinden

Beitrag von Gromekh »

Hallo zusammen,

Ich wollte ein kleines Kartenspiel programmieren,
wobei ich eine Checkliste der Karten erstellt hab.
( aus einigen CheckBoxen)
Mein Problem ist:
Ich würde gerne die generierten Variablen in den Namen der CheckBox einbinden,
um zu verhindern, dass die Karte nochmals generiert wird.
Jedoch stürzt die Anwendung ab, wenn eine Karte erneut gerneriert wird.

Vielen Dank im Voraus
VG Marian

Code: Alles auswählen

var
  Form1: TForm1;
  vWert, c, vF: Integer;
  Farbe: string;

Code: Alles auswählen

    repeat
      begin
        c:=random(8);
       vF:=random(4);
       if vF=0 then
         Farbe:='Karo';
       if vF=1 then
         Farbe:='Herz';
       if vF=2 then
         Farbe:='König';
       if vF=3 then
         Farbe:='Pik';
       vWert:=c+7;
      end;
    until TCheckBox(FindComponent('c'+Farbe+IntToStr(vWert))).checked = false;

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Variable in Komponentennamen einbinden

Beitrag von pluto »

'c'+Farbe+IntToStr(vWert))

Lass dir das mal ausgeben, was da drin steht.
Zum Beispiel mit ShowMessage('c'+Farbe+IntToStr(vWert)));

Code: Alles auswählen

TCheckBox(FindComponent('c'+Farbe+IntToStr(vWert)))

Das solltest du in einer Temp Variable ablegen die vom Typ TComponent ist und dann abfragen(Assigned(TempVar) ob der Wert gesetzt wird.
Bzw. du könntest das auch umschreiben, dann siehst du eine Fehler Meldung vielleicht:

Code: Alles auswählen

(FindComponent('c'+Farbe+IntToStr(vWert)) as TCheckBox)

Nun solltest du eine Zugriff Verletzung erhalten.
MFG
Michael Springwald

Gromekh
Beiträge: 2
Registriert: Do 25. Jan 2018, 22:09

Re: Variable in Komponentennamen einbinden

Beitrag von Gromekh »

Danke für die schnelle Antwort :)

Wenn ich den Befehl ShowMessage('c'+Farbe+IntToStr(vWert)); eingebe wird dann zB. 'cPik10' angezeigt.
Mit dem Einführen von Temp als TComponent hat es aber jetzt funktioniert und eine neue Karte wird generiert.

vielen Dank für die Hilfe!

Code: Alles auswählen

repeat
      begin
        c:=random(8);
       vF:=random(4);
       if vF=0 then
         Farbe:='Karo';
       if vF=1 then
         Farbe:='Herz';
       if vF=2 then
         Farbe:='Kreuz';
       if vF=3 then
         Farbe:='Pik';
       vWert:=c+7;
       Temp:=TCheckBox(FindComponent('c'+Farbe+IntToStr(vWert)));
      end;
    until TCheckbox(Temp).checked=false;

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Variable in Komponentennamen einbinden

Beitrag von pluto »

Code: Alles auswählen

Temp:=TCheckBox(FindComponent('c'+Farbe+IntToStr(vWert)));

Das würde ich ändern in:

Code: Alles auswählen

Temp:=FindComponent('c'+Farbe+IntToStr(vWert)) as TCheckBox(;

Dank dem AS Operator wird die Anwendung eine AV werfen, wenn damit was nicht stimmt.
Nur bei Pointern wird eine die andere Umwandlung genutzt.

Bei until würde ich es auch so anpassen und mit Assigned schauen ob Temp mit einem Wert belegt wurde, in etwa so:

Code: Alles auswählen

until (not Assigned(Temp)) or  (Temp as TCheckbox).checked=false;

Nun wird Theoretisch ausgestiegen wenn Temp = nil ist(Also wenn die Komponente nicht gefunden wurde) oder wenn Temp Checked ist.

Du könntest aber Temp auch direkt als TCheckButton deklarieren und nur einmal die Umwandlung machen.
MFG
Michael Springwald

Antworten