Variable in Komponentennamen einbinden

Rund um die LCL und andere Komponenten

Variable in Komponentennamen einbinden

Beitragvon Gromekh » 25. Jan 2018, 23:02 Variable in Komponentennamen einbinden

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;
Gromekh
 
Beiträge: 2
Registriert: 25. Jan 2018, 22:09

Beitragvon pluto » 25. Jan 2018, 23:10 Re: Variable in Komponentennamen einbinden

'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
Aktuelles Projekt: PlutoArduino
pluto
 
Beiträge: 6523
Registriert: 19. Nov 2006, 12:06
Wohnort: Oldenburg/Oldenburg
OS, Lazarus, FPC: Linux Mint 18.1 | 
CPU-Target: AMD
Nach oben

Beitragvon Gromekh » 26. Jan 2018, 00:08 Re: Variable in Komponentennamen einbinden

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;
Gromekh
 
Beiträge: 2
Registriert: 25. Jan 2018, 22:09

Beitragvon pluto » 29. Jan 2018, 17:01 Re: Variable in Komponentennamen einbinden

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
Aktuelles Projekt: PlutoArduino
pluto
 
Beiträge: 6523
Registriert: 19. Nov 2006, 12:06
Wohnort: Oldenburg/Oldenburg
OS, Lazarus, FPC: Linux Mint 18.1 | 
CPU-Target: AMD
Nach oben

• Themenende •

Zurück zu Komponenten und Packages



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

porpoises-institution
accuracy-worried