Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - vier gewinnt - Spielfeld wird nicht angezeigt


Agathe - Di 08.03.16 18:32
Titel: vier gewinnt - Spielfeld wird nicht angezeigt
Hallo,

ich muss in der Schule ein 4 Gewinnt Spiel mit Delphi 7 programmieren.

Ich bin grad bei der Erstellung des Spielfeldes. Es sollte jetzt fertig sein, wird aber wenn man F9 drückt nicht angezeigt. Weder ich noch meine Lehrerin wissen weiter - ich füge mal den Quelltext an.

Vielleicht kann mir ja einer von euch Computer-Füchsen helfen? ;)

Lg

Quelltext:


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:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
unit UnitAbschluss;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
TFeldBesetzung = (sLeer, sSpieler1, sSpieler2);
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    btnNeu: TButton;
    Panel1: TPanel;
    Panel2: TPanel;
    Anzeigeflaeche: TPaintBox;
    Edit6: TEdit;
    Panel4: TPanel;
    pnlSpieler: TPanel;
    btnGewinnausgabe: TButton;
    btnEinstellungen: TButton;
    Edit4: TEdit;
    Edit5: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure btnEinstellungenClick(Sender: TObject);
    procedure btnNeuClick(Sender: TObject);

  private
    { Private-Deklarationen }
    FGRafik: TBitmap;
    FLinks: Integer;
    FUnten: Integer;
    FSpielfeldBreite: Integer;
    FSpielfeldHoehe: Integer;
    FFelderBreite: Integer;
    FSpielfeld: array[0..60..5of TFeldBesetzung;
    FSpielerFarbe: array[TFeldbesetzung] of TColor;
    FSpielerBmp: array[TFeldBesetzung] of TBitmap;
    FSpielerName: array[TFeldBesetzung] of string;


    procedure GitterZeichnen(breite, hoehe, feldbreite: Integer);
     procedure Darstellen;
     procedure GroessenEinstellungenAnpassen;
     procedure SymbolErstellen(breite: Integer; spieler: TFeldBesetzung);
  public
    { Public-Deklarationen }
  end;


var
  Form1: TForm1;
  i, j: Integer;
  Spieler1, Spieler2: String;

implementation

uses  UnitAbschlussEinstellungen;

{$R *.dfm}
procedure TForm1.GitterZeichnen(breite, hoehe, feldbreite: Integer);
var
i: Integer;
begin
FGrafik.Canvas.Pen.Color := clBlack;
for i := 0 to hoehe do
begin
FGrafik.Canvas.MoveTo(FLinks, FUnten - i* feldbreite);
FGrafik.Canvas.LineTo(FLinks + breite * Feldbreite, FUnten - i * feldbreite);
end;
for i := 0 to breite do
begin
FGrafik.Canvas.MoveTo(FLinks + i*feldbreite, FUnten - hoehe * feldbreite);
FGrafik.Canvas.LineTo(FLinks + i*feldbreite, FUnten);
end;

end;
procedure TForm1.Darstellen;
begin
FGrafik.Canvas.Pen.Color := clWhite;
FGrafik.Canvas.Brush.Color := clWhite;
FGrafik.Canvas.Rectangle(0,0,FGrafik.Width, FGrafik.Height);
Anzeigeflaeche.Canvas.Draw(00, FGrafik);
Form1.GitterZeichnen(FSpielfeldBreite, FSpielfeldHoehe, FFelderBreite);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Randomize;
FGrafik:= TBitmap.Create;
FSpielfeldBreite := 7;
FSpielfeldHoehe := 6;
FFelderBreite := 25;
FSpielerBmp[sSpieler1] := TBitmap.Create;
FSpielerBmp[sSpieler2] := TBitmap.Create;
FSpielerBmp[sLeer] := TBitmap.Create;
FSpielerFarbe[sLeer] := clWhite;
FSpielerFarbe[sSpieler1] := clGreen;
FSpielerFarbe[sSpieler2] := clFuchsia;
FSpielerName[sLeer] := 'Leer';
FSpielerName[sSpieler1] := 'Spieler1';
FSpielerName[sSpieler2] := 'Spieler2';

end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
FGrafik.Free;
FSpielerBmp[sSpieler1].Free;
FSpielerBmp[sSpieler2].Free;
FSpielerBmp[sLeer].Free;
end;

procedure TForm1.GroessenEinstellungenAnpassen;
begin
FGrafik.Width := Anzeigeflaeche.Width;
FGrafik.Height := Anzeigeflaeche.Height;
FLinks := FGrafik.Width div 2 - FSpielfeldBreite div 2 * FFelderbreite;
FUnten := FGrafik.Height div 2 + FSpielfeldHoehe div 2 * Ffelderbreite;
SymbolErstellen(FFelderbreite-1, sSpieler1);
SymbolErstellen(FFelderbreite-1, sSpieler2);
SymbolErstellen(1, sLeer);

end;

procedure TForm1.SymbolErstellen(breite: Integer; spieler: TFeldBesetzung);
 begin
FSPielerBmp[spieler].Width := breite;
FSpielerBmp[Spieler].Height := breite;
FSpielerBmp[spieler].Canvas.Pen.Color := clWhite;
FSpielerBmp[spieler].Canvas.Brush.Color := clWhite;
FSpielerBmp[spieler].Canvas.Rectangle(00, breite, breite);
FSpielerBmp[spieler].Canvas.Pen.Color := FSpielerFarbe[spieler];
FSpielerBmp[spieler].Canvas.Brush.Color := FSpielerFarbe[spieler];
FSpielerBmp[spieler].Canvas.Ellipse(00, breite, breite);
end;





procedure TForm1.btnEinstellungenClick(Sender: TObject);
begin
FormEinstellungen.ShowModal;
end;

procedure TForm1.btnNeuClick(Sender: TObject);
begin
for i := 0 to FSpielfeldBreite - 1 do
begin
for j := 0 to FSpielfeldHoehe - 1 do FSpielfeld[i,j] := sLeer;
end;

end;

end.


Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt


ub60 - Di 08.03.16 18:58

Hallo Agathe,

willkommen im Forum.
Zuerst eine Bitte: Setze doch bitte Deinen Quelltext in Delphi-Tags (Markieren, dann Bereiche/Delphi/+).

Zu Deiner Frage: Du musst die Zeichenroutine (Darstellen) auch aufrufen, sonst wird nichts gezeichnet.

ub60


Agathe - Di 08.03.16 19:47

So ungefähr?

Das hab ich in dem Tutorial das ich benutzt hab auch gelesen und dachte, ich hätte das auch schon gemacht.
Muss ich das nicht in der Prozedur GrößenEinstellungenAnpassen machen?



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:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
unit UnitAbschluss;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
TFeldBesetzung = (sLeer, sSpieler1, sSpieler2);
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    btnNeu: TButton;
    Panel1: TPanel;
    Panel2: TPanel;
    Anzeigeflaeche: TPaintBox;
    Edit6: TEdit;
    Panel4: TPanel;
    pnlSpieler: TPanel;
    btnGewinnausgabe: TButton;
    btnEinstellungen: TButton;
    Edit4: TEdit;
    Edit5: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure btnEinstellungenClick(Sender: TObject);
    procedure btnNeuClick(Sender: TObject);

  private
    { Private-Deklarationen }
    FGRafik: TBitmap;
    FLinks: Integer;
    FUnten: Integer;
    FSpielfeldBreite: Integer;
    FSpielfeldHoehe: Integer;
    FFelderBreite: Integer;
    FSpielfeld: array[0..60..5of TFeldBesetzung;
    FSpielerFarbe: array[TFeldbesetzung] of TColor;
    FSpielerBmp: array[TFeldBesetzung] of TBitmap;
    FSpielerName: array[TFeldBesetzung] of string;


    procedure GitterZeichnen(breite, hoehe, feldbreite: Integer);
     procedure Darstellen;
     procedure GroessenEinstellungenAnpassen;
     procedure SymbolErstellen(breite: Integer; spieler: TFeldBesetzung);
  public
    { Public-Deklarationen }
  end;


var
  Form1: TForm1;
  i, j: Integer;
  Spieler1, Spieler2: String;

implementation

uses  UnitAbschlussEinstellungen;

{$R *.dfm}
procedure TForm1.GitterZeichnen(breite, hoehe, feldbreite: Integer);
var
i: Integer;
begin
FGrafik.Canvas.Pen.Color := clBlack;
for i := 0 to hoehe do
begin
FGrafik.Canvas.MoveTo(FLinks, FUnten - i* feldbreite);
FGrafik.Canvas.LineTo(FLinks + breite * Feldbreite, FUnten - i * feldbreite);
end;
for i := 0 to breite do
begin
FGrafik.Canvas.MoveTo(FLinks + i*feldbreite, FUnten - hoehe * feldbreite);
FGrafik.Canvas.LineTo(FLinks + i*feldbreite, FUnten);
end;

end;
procedure TForm1.Darstellen;
begin
FGrafik.Canvas.Pen.Color := clWhite;
FGrafik.Canvas.Brush.Color := clWhite;
FGrafik.Canvas.Rectangle(0,0,FGrafik.Width, FGrafik.Height);
Anzeigeflaeche.Canvas.Draw(00, FGrafik);
Form1.GitterZeichnen(FSpielfeldBreite, FSpielfeldHoehe, FFelderBreite);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Randomize;
FGrafik:= TBitmap.Create;
FSpielfeldBreite := 7;
FSpielfeldHoehe := 6;
FFelderBreite := 25;
FSpielerBmp[sSpieler1] := TBitmap.Create;
FSpielerBmp[sSpieler2] := TBitmap.Create;
FSpielerBmp[sLeer] := TBitmap.Create;
FSpielerFarbe[sLeer] := clWhite;
FSpielerFarbe[sSpieler1] := clGreen;
FSpielerFarbe[sSpieler2] := clFuchsia;
FSpielerName[sLeer] := 'Leer';
FSpielerName[sSpieler1] := 'Spieler1';
FSpielerName[sSpieler2] := 'Spieler2';

end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
FGrafik.Free;
FSpielerBmp[sSpieler1].Free;
FSpielerBmp[sSpieler2].Free;
FSpielerBmp[sLeer].Free;
end;

procedure TForm1.GroessenEinstellungenAnpassen;
begin
FGrafik.Width := Anzeigeflaeche.Width;
FGrafik.Height := Anzeigeflaeche.Height;
FLinks := FGrafik.Width div 2 - FSpielfeldBreite div 2 * FFelderbreite;
FUnten := FGrafik.Height div 2 + FSpielfeldHoehe div 2 * Ffelderbreite;
SymbolErstellen(FFelderbreite-1, sSpieler1);
SymbolErstellen(FFelderbreite-1, sSpieler2);
SymbolErstellen(1, sLeer);

end;

procedure TForm1.SymbolErstellen(breite: Integer; spieler: TFeldBesetzung);
 begin
FSPielerBmp[spieler].Width := breite;
FSpielerBmp[Spieler].Height := breite;
FSpielerBmp[spieler].Canvas.Pen.Color := clWhite;
FSpielerBmp[spieler].Canvas.Brush.Color := clWhite;
FSpielerBmp[spieler].Canvas.Rectangle(00, breite, breite);
FSpielerBmp[spieler].Canvas.Pen.Color := FSpielerFarbe[spieler];
FSpielerBmp[spieler].Canvas.Brush.Color := FSpielerFarbe[spieler];
FSpielerBmp[spieler].Canvas.Ellipse(00, breite, breite);
end;





procedure TForm1.btnEinstellungenClick(Sender: TObject);
begin
FormEinstellungen.ShowModal;
end;

procedure TForm1.btnNeuClick(Sender: TObject);
begin
for i := 0 to FSpielfeldBreite - 1 do
begin
for j := 0 to FSpielfeldHoehe - 1 do FSpielfeld[i,j] := sLeer;
end;

end;
end.


Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt


jaenicke - Di 08.03.16 20:48

Du hast eine Prozedur Darstellen wie ub60 schon sagte. Die rufst du aber nie auf. Das ist als ob du eine Türklinke an eine Tür anbringst, diese aber nie benutzt, dich dann aber wunderst warum die Tür nicht aufgeht.

Dein Formular hat ein Event OnPaint. Dort kannst du die Prozedur aufrufen.


Agathe - Di 08.03.16 21:01

Probier ich mal aus. Danke!