Autor Beitrag
Belowtiss
Hält's aus hier
Beiträge: 14

Windows XP
Delphi 7
BeitragVerfasst: Di 21.02.06 19:58 
Hallo zusammen

Ich bin dabei für meine Semesterarbeit ein Schiffe Versenken zu programmieren.
Ich habe es so aufgebaut, dass wenn das Programm gestartet wird ein Fenster mit den SpielOptionen erscheint.
Sobald diese festgelegt sind, zeige ich ein 2 Fenster auf dem ich dann den angewählten optionen entsprechend Spielfelder generiere.
Jetz habe ich das Problem, dass wenn ich das Spiel beenden möchte ich eine "ungültige Zeigeroption" habe.
Ich habe keine Ahnung wie ich das beheben könnte.
Kann mir jemand helfen??
Ich bin Anfänger und weiss einfach nicht mehr weiter.

Gruss

Belowtiss
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Di 21.02.06 20:35 
:welcome:

Ohne Quelltext wird das etwas schwer ;)

AXMD
Belowtiss Threadstarter
Hält's aus hier
Beiträge: 14

Windows XP
Delphi 7
BeitragVerfasst: Di 21.02.06 21:02 
Sorry hab ich komplett vergessen

Hier der Quelltext vom 1 Formular:

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:
143:
144:
145:
146:
147:
148:
unit OptionenMain;

interface

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

type
  TfrmOptionen = class(TForm)
    lblOptionen: TLabel;
   gbxModus: TGroupBox;
    rbtPlCo: TRadioButton;
    rbtPlPl: TRadioButton;
    btnStarten: TButton;
    gbxSpiellevel: TGroupBox;
    rbtBeginner: TRadioButton;
    rbtProfi: TRadioButton;
    grbAnzahlSchiffe: TGroupBox;
    btnAnzahlSchiffeplus: TButton;
    btnAnzahlSchiffeminus: TButton;
    pnlAnzahlSchiffe: TPanel;
    grbSpielfelddimension: TGroupBox;
    btnSpielfelddimensionplus: TButton;
    btnSpielfelddimensionminus: TButton;
    pnlSpielfelddimension: TPanel;
    btnAbbrechen: TButton;
    procedure FormCreate(Sender: TObject);
    procedure rbtSpiellevelClick(Sender: TObject);
    procedure btnSpielfelddimensionplusClick(Sender: TObject);
    procedure btnSpielfelddimensionminusClick(Sender: TObject);
    procedure btnAnzahlSchiffeplusClick(Sender: TObject);
    procedure btnAnzahlSchiffeminusClick(Sender: TObject);
    procedure btnStartenClick(Sender: TObject);
    procedure btnAbbrechenClick(Sender: TObject);
  private
   { Private-Deklarationen }
  public
    Spiellevel : Integer;
  Spielfelddimension: Integer;
  AnzahlSchiffe : integer;
  AnzahlSpieler :integer;
   { Public-Deklarationen }
  end;

var
  frmOptionen: TfrmOptionen;

implementation

uses SpielMain;

{$R *.dfm}

procedure TfrmOptionen.FormCreate(Sender: TObject);
  begin
    Spielfelddimension := 6;
    AnzahlSchiffe := 4;
    Spiellevel := 1;
    AnzahlSpieler := 1;
  end;

procedure TfrmOptionen.rbtSpiellevelClick(Sender: TObject);
  begin
    If rbtBeginner.Checked = true then
    begin
      grbAnzahlSchiffe.Visible := true;
      Spiellevel := 1;
    end;

    If rbtProfi.Checked = true then
    begin
      grbAnzahlSchiffe.Visible := false;
      Spiellevel := 2;
    end;
  end;

procedure TfrmOptionen.btnSpielfelddimensionplusClick(Sender: TObject);
var a : integer;
  begin
    a := strtoint(pnlSpielfelddimension.Caption);
    a := (a+1);
    If a <= 12
    then pnlSpielfelddimension.Caption := inttostr(a)
    else
      begin
        Messagedlg('Sie können maximal auf einem Spielfeld von 12 X 12 Feldern spielen!',mtInformation,[mbok],0);
        exit;
      end;
    Spielfelddimension := a;
  end;

procedure TfrmOptionen.btnSpielfelddimensionminusClick(Sender: TObject);
var a : integer;
  begin
    a := strtoint(pnlSpielfelddimension.Caption);
    a := (a-1);
    If a >=6
      then pnlSpielfelddimension.Caption := inttostr(a)
      else
        begin
          Messagedlg('Sie müssen minimal auf einem Spielfeld von 6 X 6 Feldern spielen!',mtInformation,[mbok],0);
          exit;
        end;
    Spielfelddimension := a;
  end;

procedure TfrmOptionen.btnAnzahlSchiffeplusClick(Sender: TObject);
var a : integer;
  begin
    a := strtoint(pnlAnzahlSchiffe.Caption);
    a := (a+1);
    If a <= 10
      then pnlAnzahlSchiffe.Caption := inttostr(a)
      else
        begin
          Messagedlg('Sie können maximal mit 10 Schiffen Spielen!',mtInformation,[mbok],0);
          exit;
        end;
    AnzahlSchiffe := a;
  end;

procedure TfrmOptionen.btnAnzahlSchiffeminusClick(Sender: TObject);
var a : integer;
  begin
    a := strtoint(pnlAnzahlSchiffe.Caption);
    a := (a-1);
    If a >= 4
      then pnlAnzahlSchiffe.Caption := inttostr(a)
      else
        begin
          Messagedlg('Sie müssen mindestens mit 4 Schiffen Spielen!',mtInformation,[mbok],0);
          exit;
        end;
    AnzahlSchiffe := a;
  end;
procedure TfrmOptionen.btnStartenClick(Sender: TObject);
  begin
    frmSpiel.show;
  end;

procedure TfrmOptionen.btnAbbrechenClick(Sender: TObject);
  begin
    frmSpiel.Close;
    frmOptionen.Close;
  end;

end.





Und dies ist der Quelltext des 2. Fensters:

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:
unit SpielMain;

interface

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

type
  TfrmSpiel = class(TForm)
    procedure FormShow(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  frmSpiel: TfrmSpiel;
  shpSpielfeld1 : array of TShape;
  shpSpielfeld2 : array of TShape;
implementation

uses OptionenMain;

Procedure Spielfeld1_generieren; forward;
Procedure Spielfeld2_generieren; forward;

{$R *.dfm}

procedure TfrmSpiel.FormShow(Sender: TObject);
  begin
    Spielfeld1_generieren;
    Spielfeld2_generieren;
  end;

Procedure Spielfeld1_generieren;
var i, j : integer;
  begin
    setlength(shpSpielfeld1, frmOptionen.Spielfelddimension);

    for j := 1 to frmOptionen.Spielfelddimension do
      for i := 1 to frmOptionen.Spielfelddimension do
      begin
        shpSpielfeld1[i]           := Tshape.create(frmSpiel);
        shpSpielfeld1[i].Parent      := frmSpiel;
        shpSpielfeld1[i].Name         := 'SHP'+Chr(64+j)+IntToStr(i);
        shpSpielfeld1[i].Hint         := shpSpielfeld1[i].Name;
        shpSpielfeld1[i].ShowHint     := tRUE;
        shpSpielfeld1[i].Width       := 25;
        shpSpielfeld1[i].Height      := 25;
        shpSpielfeld1[i].Left      := 50 + (i-1)* 25;
        shpSpielfeld1[i].Top        := 200 + (j-1)* 25;
      end;

  end;

Procedure Spielfeld2_generieren;
var i, j : integer;
  begin
    setlength(shpSpielfeld2, frmOptionen.Spielfelddimension);

    for j := 1 to frmOptionen.Spielfelddimension do
      for i := 1 to frmOptionen.Spielfelddimension do
      begin
        shpSpielfeld2[i]           := Tshape.create(frmSpiel);
        shpSpielfeld2[i].Parent      := frmSpiel;
        shpSpielfeld2[i].Name         := 'SHP'+Chr(76+j)+IntToStr(i);
        shpSpielfeld2[i].Hint         := shpSpielfeld2[i].Name;
        shpSpielfeld2[i].ShowHint     := tRUE;
        shpSpielfeld2[i].Width       := 25;
        shpSpielfeld2[i].Height      := 25;
        shpSpielfeld2[i].Left      := 500 + (i-1)* 25;
        shpSpielfeld2[i].Top        := 200 + (j-1)* 25;
      end;

  end;

end.


Moderiert von user profile iconMotzi: Delphi-Tags hinzugefügt
Moderiert von user profile iconAXMD: Delphi-Tags getrennt ;)
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Di 21.02.06 21:11 
Zeile 145: du rufst Close von einem Objekt auf, von dem du dir nicht einmal sicher sein kannst, dass es zu diesem Zeitpunkt überhaupt noch exisitert ;)

AXMD
Belowtiss Threadstarter
Hält's aus hier
Beiträge: 14

Windows XP
Delphi 7
BeitragVerfasst: Mi 22.02.06 08:53 
Wenn ich das Programm starte und gleich wieder beende, habe ich kein Problem.

Das Problem tritt nicht auf wenn ich das 2. Formular leer zeige (ohne Objekte).

Das Problem besteht wenn ich das 2. Formular (mit Objekten) über das Kreuz oben rechts beende und danach das 1. Formular über den entsprechenden Button (nur form1.close). Das Form2.close habe ich nur mal reingenommen um zu testen, aber auch so geht es nicht.

Das Problem besteht ebenfalls wenn ich beide Formulare über den entsprechenden Button in form1 beenden möchte.

Irgendeine Idee?

Gruss

Belowtiss