Autor Beitrag
Nitrom
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Sa 16.01.21 22:07 
Moin,
ich möchte ein Pass`n Play Poker Entwickeln.
In meinem Programm bekomme ich aber der Fehler Error: Illegal qualifier
bei dem Befehl Img.Picture.LoadFromFile('\Images\Rückseite.bmp');
wobei Picture rot Markiert ist.
Später soll einmal das Verzeichnis durch eine String Variable angegeben werden.
Ich häng euch unten mal das Programm an.
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls,
  Menus;

type

  { TForm1 }

  TForm1 = class(TForm)
    btn_start: TButton;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    img_Karte1: TImage;
    Img_Karte2: TImage;
    Img_Karte3: TImage;
    Img_Karte4: TImage;
    Img_Karte5: TImage;
    Img_Karte6: TImage;
    Img_Karte7: TImage;
    procedure Image7Click(Sender: TObject);
    procedure Spiel(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;
  Spielerdaten:Array[1..4,1..8]  of Integer;
  Karten:      Array[1..4,1..13of integer;
  Tischkarten: Array[1..5,1..2]  of Integer;
  Einsaetze:   Array[1..4]       of Integer;
  Karte1,Karte2 :string;
  I,j,x,y,Player_Anzahl,t:Integer;
  img_Karte1,Img_Karte2,Img_Karte3,Img_Karte4,Img_Karte5,Img_Karte6,Img_Karte7:string;

implementation

{$R *.lfm}


{ TForm1 }

procedure Austeilen();
begin
  For i := 1  to 4 do
     begin                                       //Karte 1 1 ist z.B. Kreuz 2
        For j := 1 to 2 do                       //Karte 1 1 ist z.B. Kreuz 3 usw
           begin
              randomize;
              x:=random(3)+1;
              Y:=random(12)+1;
              If  Karten[x,y] = 1 then        //Jede Karte hat anfangs den wert 1, wenn die Karte benutz wird wird dieser auf 0 gesetzt was bedeutet das die karte bereits im spiel ist
                 begin
                    Spielerdaten[j,2]:=x;     //jedem spieler werden 2 Karten zugewisen
                    Spielerdaten[j,3]:=y;
                    Karten[x,y]:= 1;
                 end;
           end;
     end;
  For i := 1 to 5 do
     begin
        randomize;
        x:=random(3)+1;
        Y:=random(12)+1;
        If  Karten[x,y] = 1 then
           begin
              Tischkarten[i,1]:=x;             //Tischkarten werden zugeteilt
              Spielerdaten[i,2]:=y;
              Karten[x,y]:=0;
           end;
     end;
end;
procedure Kartedrehen(Karte1,Karte2:string);
begin
 img_Karte1.Picture.LoadFromFile('\Images\Rückseite.bmp');      // Bilder sollen geändert wärden....
 img_karte2.picture.loadfromfile('');     //:-/
end;

procedure Spielzug(x:Integer);
begin
  showMessage('Spieler '+inttostr(x));
  Karte1:=inttostr(Spielerdaten[x,2])+inttostr(Spielerdaten[x,3]);  //Auslesen der Karten aus dem Spielerprofiel
  Karte2:=inttostr(Spielerdaten[x,4])+inttostr(Spielerdaten[x,5]);
  Kartedrehen(Karte1,Karte2);
  T:=einsaetze[1];
  IF einsaetze[2]>T Then
     T:=einsaetze[2]                                                //Ermittlung des größten gesetzen wertes
     else
         IF einsaetze[3]>T Then
            T:=einsaetze[3]
            else
                IF einsaetze[4]>T Then
                   T:=einsaetze[4]

                                                                  //aktion des Spielers
end;
procedure Aufdecken();
begin
end;
procedure Auswertung();
begin
end;
procedure TForm1.Spiel(Sender: TObject);
begin
  begin
    For i:=1 to 4 do
      begin
        For j:=1 to 13 do
          begin
             Karten[i,j]:= 1;             //Alle Karten bekommen den Wert 1
             Austeilen();
             end;
        end;
    For i:=1 to 4 do
      begin
        Spielerdaten[i,1]:= 1;            //Player Value wird auf 1 gesetzt
        end;
    Player_Anzahl:=4;
    while Player_Anzahl > 1 do
          begin
             For i:=1 to 4 do
                begin
                   If  Spielerdaten[i,1] =1 then
                   Spielzug(i);
                end;
             Aufdecken();
             If Player_Anzahl< 2 then
                //letzer spieler bekommt den Pott
             else
                 Auswertung()
          end;
  end;
end;


end.
PS. Wenn ihr mir verratet wie ich den Code besser anhänge schreibt es mir. Danke!

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 17.01.21 00:06 
user profile iconNitrom hat folgendes geschrieben Zum zitierten Posting springen:
In meinem Programm bekomme ich aber der Fehler Error: Illegal qualifier
bei dem Befehl Img.Picture.LoadFromFile('\Images\Rückseite.bmp');
wobei Picture rot Markiert ist.
Das liegt daran, dass du gleichnamige Variablen und Felder hast:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
TForm1 = class(TForm)
btn_start: TButton;
Button1: TButton;
Button2: TButton;
Button3: TButton;
img_Karte1: TImage;
Img_Karte2: TImage;
Img_Karte3: TImage;
Img_Karte4: TImage;
Img_Karte5: TImage;
Img_Karte6: TImage;
Img_Karte7: TImage;

[..]

img_Karte1,Img_Karte2,Img_Karte3,Img_Karte4,Img_Karte5,Img_Karte6,Img_Karte7:string;
Ein String (denn die untere Variable ist "näher dran") hat keine Eigenschaft Picture, weshalb dies auch bemängelt wird.


user profile iconNitrom hat folgendes geschrieben Zum zitierten Posting springen:
PS. Wenn ihr mir verratet wie ich den Code besser anhänge schreibt es mir. Danke!
Du brauchst nur [delphi]Dein Code[/delphi] zu schreiben oder über dem Eingabefeld unter Bereiche neben Delphi auf das + drücken für den Anfang und noch einmal für das Ende des Codeblocks.
Nitrom Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: So 17.01.21 11:25 
Vielen Dank,
Ja copy and paste hat Vor- und Nachteile. Da habe ich wohl Vergessen die Variablen umzubenennen.
Nun habe ich aber dennoch ein Problem mit dem Programm
Es hat nun das Problem, dass es den Identifier img_karte1 nicht findet obwohl es ja als tImage deklariert ist.
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls,
  Menus;

type

  { TForm1 }

  TForm1 = class(TForm)
    btn_start: TButton;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    img_Karte1: TImage;
    Img_Karte2: TImage;
    Img_Karte3: TImage;
    Img_Karte4: TImage;
    Img_Karte5: TImage;
    Img_Karte6: TImage;
    Img_Karte7: TImage;
    procedure Spiel(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;
  Spielerdaten:Array[1..4,1..8]  of Integer;
  Karten:      Array[1..4,1..13of integer;
  Tischkarten: Array[1..5,1..2]  of Integer;
  Einsaetze:   Array[1..4]       of Integer;
  I,j,x,y,Player_Anzahl,t:Integer;
  Karte1,Karte2,Karte3,Karte4,Karte5,Karte6,Karte7:string;

implementation

{$R *.lfm}


{ TForm1 }

procedure Austeilen();
begin
  For i := 1  to 4 do
     begin                                       //Karte 1 1 ist z.B. Kreuz 2
        For j := 1 to 2 do                       //Karte 1 1 ist z.B. Kreuz 3 usw
           begin
              randomize;
              x:=random(3)+1;
              Y:=random(12)+1;
              If  Karten[x,y] = 1 then        //Jede Karte hat anfangs den wert 1, wenn die Karte benutz wird wird dieser auf 0 gesetzt was bedeutet das die karte bereits im spiel ist
                 begin
                    Spielerdaten[j,2]:=x;     //jedem spieler werden 2 Karten zugewisen
                    Spielerdaten[j,3]:=y;
                    Karten[x,y]:= 1;
                 end;
           end;
     end;
  For i := 1 to 5 do
     begin
        randomize;
        x:=random(3)+1;
        Y:=random(12)+1;
        If  Karten[x,y] = 1 then
           begin
              Tischkarten[i,1]:=x;             //Tischkarten werden zugeteilt
              Spielerdaten[i,2]:=y;
              Karten[x,y]:=0;
           end;
     end;
end;
procedure Kartedrehen(Karte1, Karte2:String);
begin
  img_Karte1.Picture.LoadFromFile('../Bilder/'+Karte2+'.jpg');  
  //unit1.pas(82,3) Error: Identifier not found "img_Karte1"
  img_karte2.picture.loadfromfile('../Bilder/'+Karte2+'.jpg');
  //unit1.pas(83,3) Error: Identifier not found "img_karte2"
end;

procedure Spielzug(x:Integer);
begin
  showMessage('Spieler '+inttostr(x));
  Karte1:=inttostr(Spielerdaten[x,2])+inttostr(Spielerdaten[x,3]);  //Auslesen der Karten aus dem Spielerprofiel
  Karte2:=inttostr(Spielerdaten[x,4])+inttostr(Spielerdaten[x,5]);
  Kartedrehen(Karte1, Karte2);
  T:=einsaetze[1];
  IF einsaetze[2]>T Then
     T:=einsaetze[2]                                                //Ermittlung des größten gesetzen wertes
     else
         IF einsaetze[3]>T Then
            T:=einsaetze[3]
            else
                IF einsaetze[4]>T Then
                   T:=einsaetze[4]

                                                                  //aktion des Spielers
end;
procedure Aufdecken();
begin
end;
procedure Auswertung();
begin
end;
procedure TForm1.Spiel(Sender: TObject);
begin
    For i:=1 to 4 do
      begin
        For j:=1 to 13 do
          begin
             Karten[i,j]:= 1;             //Alle Karten bekommen den Wert 1
             Austeilen();
             end;
        end;
    For i:=1 to 4 do
      begin
        Spielerdaten[i,1]:= 1;            //Player Value wird auf 1 gesetzt
        end;
    Player_Anzahl:=4;
    while Player_Anzahl > 1 do
          begin
             For i:=1 to 4 do
                begin
                   If  Spielerdaten[i,1] =1 then
                   Spielzug(i);
                end;
             Aufdecken();
             If Player_Anzahl< 2 then
                //letzer spieler bekommt den Pott
             else
                 Auswertung()
          end;
end;

end.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 17.01.21 11:47 
Hallo und :welcome:

ich glaube dir ist nicht klar, was der Unterschied zwischen einer freien Funktion/Prozedur und einer Klassenfunktion/-prozedur ist.

Du solltest die globalen Variablen sowie freien Prozeduren als Klassenprozeduren erstellen.
Noch besser wäre es jedoch, wenn du UI und Logik voneinander trennst und eine eigene Spiellogik-Klasse (in eigener Unit) daraus entwickelst, welche du dann nur in deiner UI-Klasse (TForm1 bzw. besser benannt ;- ) benutzt.

PS: Aus deinen einzelnen TImage-Variablen solltest du besser ein Array erzeugen (auch wenn du sie dann dynamisch im Code, statt per Designer, erzeugen mußt).