Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - EReadError, ich habe keine Ahnung, was ich angestellt hab


Xearox - Sa 20.03.10 02:22
Titel: EReadError, ich habe keine Ahnung, was ich angestellt hab
Folgendes im Vorfeld.
Ich habe einiges aus der MainUnit in eine andere Unit eingefügt.
Und wieder andere sachen in der Mainunit in Public gezogen.

Alle Units enthalten nun keine Fehler oder sonstiges, jedoch bekomme ich nun beim Starten folgende Fehler meldung(mit F7 hab ich den Programm ablauf getestet, wo der Fehler auf Tritt, und zwar hier):


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1); //Hier Tritt der Fehler auf
  Application.Run;
end.


Die Fehler Meldung ist Folgende:

Nr.1) Im Projekt KleinesSpiel.exe ist eine Execption der Klasse EReadError mit der Meldung 'Ungültiger Eigenschaftswert' aufgetreten

es folgt Fehlermeldung 2

Nr.2) Im Projekt KleinesSpiel.exe ist eine Execption der Klasse EReadError mit der Meldung 'Fehler beim Lesen von Form1.OnCreate: Ungültiger Eigenschaftswert' aufgetreten.


Der Source Code sieht so aus


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:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
unit Main;

interface

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

type
  Ship1ArrayType = Array [0..200of TImage;
  TForm1 = class(TForm)

  private
    { Private-Deklarationen }
  public
    Timer1: TTimer;
    BGameStart: TButton;
    BClose: TButton;
    ScrollBar1: TScrollBar;
    MediaPlayer1: TMediaPlayer;
    Panel1: TPanel;
    Label1: TLabel;
    LRundenNr: TLabel;
    Label5: TLabel;
    LUnits: TLabel;
    PBGold: TProgressBar;
    Label3: TLabel;
    Label4: TLabel;
    LGold: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure BGameStartClick(Sender: TObject);
    procedure CollisionAbfrage;
    procedure BCloseClick(Sender: TObject);
    procedure ScrollBar1Change(Sender: TObject);
    procedure Musik;
    procedure RundenBerechnung;
    procedure ObjekteInit;
    { Public-Deklarationen }
  end;

var
  Ship1Typ : Ship1ArrayType;
  ShipProRunde:integer;
  count:integer;
  Form1: TForm1;
  stepX,stepY,Speed:integer;
  FBreite,FHoehe:integer;
  RandR,RandU:integer;
  ButtonKlick,RundeBerechnen,ShipVisi:boolean;
  PosX:integer;
  RundenNr,GoldVorrat,Gold,GoldMine:integer;
  LGoldCap:string;

const
  GoldProWave=50;

implementation

{$R *.dfm}

uses
  kampfsystem,user,AI,Buildings,VarInit;

procedure TForm1.RundenBerechnung;
begin
  if (RundeBerechnen=true) then
  begin
    RundenNr:=RundenNr+1;
    RundeBerechnen:=false;
    RessProWave;
    LGold.Caption:=LGoldCap;
  end;
end;
//----------------------------------------------------------------------------------------------------
procedure TForm1.Musik;
begin
  Mediaplayer1.Close;
  Mediaplayer1.Filename := (ExtractFilePath(ParamStr(0))+'sound1.mp3');
  Mediaplayer1.Open;
  Mediaplayer1.Play;
end;
//----------------------------------------------------------------------------------------------------
procedure TForm1.ScrollBar1Change(Sender: TObject);
begin
  Speed:=ScrollBar1.Position;
end;
//----------------------------------------------------------------------------------------------------
procedure TForm1.CollisionAbfrage;//Hier wird die Postion des Objectes überprüft
var
  Ship1:integer;

begin                             //Falls der Rand erreicht wird, wird das Obj.
for Ship1 := 0  to ShipProRunde -1 do
  begin
    if (Ship1Typ[Ship1].Top>=RandU) then     //wieder zurückgesetzt
      begin
        Ship1Typ[Ship1].Top:=10;
        PosX:=0;
        RundeBerechnen:=true;
      end;
  end;
end;
//----------------------------------------------------------------------------------------------------
procedure TForm1.ObjekteInit;//Hier werden die Objecte initialisiert
var
  Ship1:integer;

begin

  for Ship1 := 0  to ShipProRunde -1 do
    begin
      Ship1Typ[Ship1].Top:=stepX;
      Ship1Typ[Ship1].Left:=stepY;
    end;
end;
//----------------------------------------------------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);//hier wird die Formerstellt und
begin                                        //die Grunddaten initialisert
//intitialsierung
  VariableInit;
  Ship1Init;
  //ObjekteInit;
//Timer Deaktivieren
  timer1.Enabled:=false;//timer Deaktiviern
//Form Größe Anpassen
  Form1.Width:=FBreite;
  Form1.Height:=FHoehe;
end;

procedure TForm1.BCloseClick(Sender: TObject);
begin
  close;
end;
//----------------------------------------------------------------------------------------------------
procedure TForm1.BGameStartClick(Sender: TObject); //Hier wird das Spiel gestartet

begin                                           //oder auch gestoppt
  if ButtonKlick=true then
    begin
      //musik;
      timer1.Interval:=Speed;// 1 sekunde.
      timer1.Enabled :=true;//Timer starten
      BGameStart.Caption:=('Stopp');
    end;

  if ButtonKlick=false then
    begin
      BGameStart.Caption:=('Spiel Starten');
      Timer1.Enabled:=False;
      ButtonKlick:=true;
    end;
end;
//----------------------------------------------------------------------------------------------------
procedure TForm1.Timer1Timer(Sender: TObject);
var
  Ship1:integer;
  PosY:integer;
begin
  if (ShipVisi=false) then
  begin
  for Ship1 := 0  to ShipProRunde -1 do
    begin
      Ship1Typ[Ship1].Visible:=true;
      ShipVisi:=true;
    end;
  end;
  PosY:=10;
  ButtonKlick:=false;
  timer1.Interval:=Speed;
  timer1.Enabled:=true;
  for Ship1 := 0  to ShipProRunde -1 do
  begin
    Ship1Typ[Ship1].Top:=Ship1Typ[Ship1].Top+stepX;
    Ship1Typ[Ship1].Left:=PosY;
    PosY:=PosY+50;
    if (PosY>=600then
    begin
      PosY:=0;
      PosX:=PosX+1;
    end;
  end;
  CollisionAbfrage;
  RundenBerechnung;
  LRundenNr.Caption:=inttostr(RundenNr);
end;
//----------------------------------------------------------------------------------------------------
end.


Ich werde das alles, was da noch so ist, also CollisionsAbfrage etc. in andere Units auslagern, da ich einfach nicht mehr Durchblicke, wo welche Procedure ist. Aus diesem Grund diese Radikal Kur.

Folgendes hab ich in eine andere Unit gepackt:

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

interface

uses
  sysutils, ExtCtrls, pngimage;

{type
  Ship1ArrayType = Array [0..200] of TImage;

var
  Ship1Typ : Ship1ArrayType;}


procedure Ship1Init;

implementation

uses
  Main,VarInit;

procedure Ship1Init;
var
  Ship1 : integer;
  PosY  : integer;
begin
  ButtonKlick:=true;
  PosY:=10;
  for Ship1 := 0  to ShipProRunde -1 do
  begin
    Main.Ship1Typ[Ship1]:=TImage.Create(Form1);
    Ship1Typ[Ship1].Parent:= Form1;
    Ship1Typ[Ship1].picture.LoadFromFile(ExtractFilePath(ParamStr(0))+'ship1.png');
    Ship1Typ[Ship1].autosize:=true;
    Ship1Typ[Ship1].Visible:=true;
    Ship1Typ[Ship1].Top:=PosX;
    Ship1Typ[Ship1].Left:=PosY;
    ShipVisi:=false;
    PosY:=PosY+50;
    //Posx:=PosX+2;
    if (PosY>=600then
    begin
      PosY:=0;
    end;
  end;
end;


end.



Kann mir hier jemand sagen, was ich Falsch gemacht hab?


jaenicke - Sa 20.03.10 08:02

Die Ereignishandler wie FormCreate und Komponenten stehen bei dir unter public, die dorthin zu verschieben funktioniert nicht...

Die gehören vor private.


alzaimar - Sa 20.03.10 09:45

Eventuell stimmt was mit abgeleiteten Formularen und Frames nicht mehr. Nimm Dir mal dein Projekt, öffne jedes Formular und verändere eine Klitzekleinigkeit am Formular (Label nach links und wieder nach rechts schieben, reicht vollkommen). Dann wird das Modify-Flag gesetzt und die DFM gespeichert. Danach das Projekt komplett durchkompilieren (aka 'build').
Das sollte das Problem beseitigen.


jaenicke - Sa 20.03.10 16:48

Eigentlich sollte bereits beim Kompilieren eine Fehlermeldung kommen, denn der Eigenschaftswert für OnCreate ist doch falsch wie du im oben geposteten Quelltext siehst. ;-)


Xearox - So 21.03.10 05:37

jaenicke hat recht, es lag tatsächlich daran, das ich die sachen wie "procedure FormCreate(Sender: TObject);" "procedure Timer1Timer(Sender: TObject);"
in public gemacht hab, keine Ahnung was mich da geritten hat...