Autor Beitrag
Tjeri
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: Sa 11.07.09 12:51 
Ich hab in meinem Programm irgendwo einen Fehler und weiß leider nicht, wo.
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:
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:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
unit Zeit;

interface

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

type
    TArray = array[1..2of Integer;
    TZeitrechnung = class(TForm)
    Stundeneingabe: TEdit;
    Minuteneingabe: TEdit;
    Label1: TLabel;
    ZeitSpeichern: TButton;
    Metalleingabe: TEdit;
    Kristalleingabe: TEdit;
    Deuteriumeingabe: TEdit;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    RohstoffeSpeichern: TButton;
    AnzahlGebaeudeEingabe: TEdit;
    Label8: TLabel;
    AnzahlSpeichern: TButton;
    Gebaeudeliste: TRadioGroup;
    GebaeudenameEingabe: TEdit;
    KostenMetallEingabe: TEdit;
    KostenKristallEingabe: TEdit;
    Label9: TLabel;
    KostenDeuteriumEingabe: TEdit;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    EingabenSpeichern: TButton;
    Berechnen: TButton;
    BauzeitEingabe: TEdit;
    Label14: TLabel;
    Gebaeudetabelle: TStringGrid;
    GebaeudestufeEingabe: TEdit;
    Label10: TLabel;
    Zeitlist: TStringGrid;
    Metallproduktioneingabe: TEdit;
    Label16: TLabel;
    Label17: TLabel;
    Label18: TLabel;
    Kristallproduktioneingabe: TEdit;
    Deuteriumproduktioneingabe: TEdit;
    ProduktionSpeichern: TButton;
    Zeit: TGroupBox;
    Rohstoffe: TGroupBox;
    Produktion: TGroupBox;
    Gebaeude: TGroupBox;
    Gebaeudeeinstellungen: TGroupBox;
    Gebaeudeinformationen: TGroupBox;
    Zeitliste: TGroupBox;
    procedure ZeitSpeichernClick(Sender: TObject);
    procedure RohstoffeSpeichernClick(Sender: TObject);
    procedure ProduktionSpeichernClick(Sender: TObject);
    procedure AnzahlSpeichernClick(Sender: TObject);
    procedure GebaeudelisteClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure EingabenSpeichernClick(Sender: TObject);
    procedure BerechnenClick(Sender: TObject);
    function IsValidInteger(S: String): Boolean;
    function ZeitBerechnung(Bauzeit:integer;benoetigtesMetall:string;benoetigtesKristall:string;benoetigtesDeuterium:string):TArray;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Zeitrechnung: TZeitrechnung;
  Stunden,Minuten:integer; //aktuelle Uhrzeit
  Metall,Kristall,Deuterium:integer; //vorhandene Ressourcen
  Metallproduktion,Kristallproduktion,Deuteriumproduktion:integer; //Produktion
  Anzahl:integer; //Anzahl der Gebäude
  Zaehler:integer; //Zaehler für die Tabelle

implementation

{$R *.dfm}

procedure TZeitrechnung.ZeitSpeichernClick(Sender: TObject);
begin
  if TryStrToInt(Stundeneingabe.Text,Stunden)
    then begin
      if Stunden>23
        then Stunden:=0;
    end
    else Stunden:=0;
  if TryStrToInt(Minuteneingabe.Text,Minuten)
    then begin
      if Minuten>60
        then Minuten:=0;
    end
    else Minuten:=0;
    Zeit.Visible:=false;
    Rohstoffe.Visible:=true;
end;

procedure TZeitrechnung.RohstoffeSpeichernClick(Sender: TObject);
begin
  if TryStrToInt(Metalleingabe.Text,Metall)
    then
    else Metall:=0;
  if TryStrToInt(Kristalleingabe.Text,Kristall)
    then
    else Kristall:=0;
  if TryStrToInt(Deuteriumeingabe.Text,Deuterium)
    then
    else Deuterium:=0;
  Rohstoffe.Visible:=false;
  Produktion.Visible:=true;
end;

procedure TZeitrechnung.ProduktionSpeichernClick(Sender: TObject);
begin
  if TryStrToInt(Metallproduktioneingabe.Text,Metallproduktion)
    then
    else Metallproduktion:=40;
  if TryStrToInt(Kristallproduktioneingabe.Text,Kristallproduktion)
    then
    else Kristallproduktion:=20;
  if TryStrToInt(Deuteriumproduktioneingabe.Text,Deuteriumproduktion)
    then
    else Deuteriumproduktion:=10;
  Produktion.Visible:=false;
  Gebaeude.Visible:=true;
end;

procedure TZeitrechnung.AnzahlSpeichernClick(Sender: TObject);
  var i:integer;
begin
  i:=0;
  if TryStrToInt(AnzahlGebaeudeEingabe.Text,Anzahl)
    then
    else Anzahl:=1;
  repeat
    Gebaeudeliste.Items.Add(IntToStr(i+1));
    i:=i+1;
  until i=Anzahl;
  Gebaeudeliste.ItemIndex:=0;
  Gebaeude.Visible:=false;
  Gebaeudeeinstellungen.Visible:=true;
end;

procedure TZeitrechnung.GebaeudelisteClick(Sender: TObject);
begin
  Gebaeudeliste.ItemIndex:=0;
end;

procedure TZeitrechnung.FormCreate(Sender: TObject);
begin
  Zaehler:=0;
  Gebaeudetabelle.Cells[0,0]:='Name';
  Gebaeudetabelle.Cells[1,0]:='Stufe';
  Gebaeudetabelle.Cells[2,0]:='Metallkosten';
  Gebaeudetabelle.Cells[3,0]:='Kristallkosten';
  Gebaeudetabelle.Cells[4,0]:='Deuteriumkosten';
  Gebaeudetabelle.Cells[5,0]:='Bauzeit';
  Zeitlist.Cells[0,0]:='Aktion';
  Zeitlist.Cells[1,0]:='Uhrzeit';
end;

procedure TZeitrechnung.EingabenSpeichernClick(Sender: TObject);
begin
  Gebaeudeliste.Items.Delete(0);
  Zaehler:=Zaehler+1;
  Gebaeudetabelle.RowCount:=Zaehler+1;
  Gebaeudetabelle.Cells[0,Zaehler]:=GebaeudenameEingabe.Text;
  if IsValidInteger(GebaeudestufeEingabe.Text)
    then Gebaeudetabelle.Cells[1,Zaehler]:=GebaeudestufeEingabe.Text
    else Gebaeudetabelle.Cells[1,Zaehler]:='1';
  if IsValidInteger(KostenMetallEingabe.Text)
    then Gebaeudetabelle.Cells[2,Zaehler]:=KostenMetallEingabe.Text
    else Gebaeudetabelle.Cells[2,Zaehler]:='0';
  if IsValidInteger(KostenKristallEingabe.Text)
    then Gebaeudetabelle.Cells[3,Zaehler]:=KostenKristallEingabe.Text
    else Gebaeudetabelle.Cells[3,Zaehler]:='0';
  if IsValidInteger(KostenDeuteriumEingabe.Text)
    then Gebaeudetabelle.Cells[4,Zaehler]:=KostenDeuteriumEingabe.Text
    else Gebaeudetabelle.Cells[4,Zaehler]:='0';
  if IsValidInteger(BauzeitEingabe.Text)
    then Gebaeudetabelle.Cells[5,Zaehler]:=BauzeitEingabe.Text
    else Gebaeudetabelle.Cells[5,Zaehler]:='30';
  GebaeudenameEingabe.Clear;
  GebaeudestufeEingabe.Clear;
  KostenMetallEingabe.Clear;
  KostenKristallEingabe.Clear;
  KostenDeuteriumEingabe.Clear;
  BauzeitEingabe.Clear;
  if Gebaeudeliste.ItemIndex<>0
    then begin
      Gebaeudeeinstellungen.Visible:=false;
      Gebaeudeinformationen.Visible:=true;
    end;
end;

procedure TZeitrechnung.BerechnenClick(Sender: TObject);
  var i:integer;
begin
  i:=0;
  Zeitlist.Cells[0,1]:='Beginn';
  if Minuten<10
    then Zeitlist.Cells[1,1]:=IntToStr(Stunden)+':0'+IntToStr(Minuten)
    else Zeitlist.Cells[1,1]:=IntToStr(Stunden)+':'+IntToStr(Minuten);
  //repeat
    i:=i+1;
    Zeitlist.RowCount:=Zeitlist.RowCount+1;
    Zeitlist.Cells[0,Zeitlist.RowCount+1]:=Gebaeudetabelle.Cells[0,i] + ' Stufe ' + Gebaeudetabelle.Cells[1,i];
    Stunden:=ZeitBerechnung(StrToInt(Gebaeudetabelle.Cells[5,i]),Gebaeudetabelle.Cells[2,i],Gebaeudetabelle.Cells[3,i],Gebaeudetabelle.Cells[4,i+1])[1];
    Minuten:=ZeitBerechnung(StrToInt(Gebaeudetabelle.Cells[5,i]),Gebaeudetabelle.Cells[2,i],Gebaeudetabelle.Cells[3,i],Gebaeudetabelle.Cells[4,i+1])[2];
    if Minuten<10
      then Zeitlist.Cells[1,Zeitlist.RowCount+1]:=IntToStr(Stunden)+':0'+IntToStr(Minuten)
      else Zeitlist.Cells[1,Zeitlist.RowCount+1]:=IntToStr(Stunden)+':'+IntToStr(Minuten);
  //until Zeitlist.RowCount+1=Zaehler;
  Gebaeudeinformationen.Visible:=false;
  Zeitliste.Visible:=true;
end;

function TZeitrechnung.IsValidInteger(S: String): Boolean;
var
  dummy, Code: Integer;
begin
  Val(S, dummy, Code);
  Result := Code = 0;
end;

function TZeitrechnung.ZeitBerechnung(Bauzeit:integer;benoetigtesMetall:string;benoetigtesKristall:string;benoetigtesDeuterium:string):TArray;
  var zeit:real;
begin
  zeit:=Stunden*60+Minuten+Bauzeit;
  if Metall<StrToInt(benoetigtesMetall)
    then zeit:=zeit+60*((StrToInt(benoetigtesMetall)-Metall)/Metallproduktion);
  if Metall<StrToInt(benoetigtesKristall)
    then zeit:=zeit+60*((StrToInt(benoetigtesKristall)-Kristall)/Kristallproduktion);
  if Metall<StrToInt(benoetigtesDeuterium)
    then zeit:=zeit+60*((StrToInt(benoetigtesDeuterium)-Deuterium)/Deuteriumproduktion);
  result[1]:=trunc(zeit/60);
  result[2]:=Round(zeit-(result[1]*60));
end;

end.


Fehler ist bei der Anwendung der Function ZeitBerechnung.
Der sagt mir, dass ich irgendwo einen leeren String habe.
Einloggen, um Attachments anzusehen!
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Sa 11.07.09 12:58 
Setz einen Breakpoint in Zeile 234 und schau dir zum einen die übergeben Parameter an und zum anderen stepp solange durch, bis der Fehler auftritt. ;)
Tjeri Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: Sa 11.07.09 13:04 
Also ich hab jetzt schon in Zeile 237 und 239 Fehler gefunden aber nur dass da Metall statt Kristall und Metall statt Deuterium steht. Fehler bleibt, kommt direkt beim step von Zeile 239 aus
Tjeri Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: Sa 11.07.09 13:07 
Fehler gefunden...da stand noch einmal i+1 statt i
nur irgendwie ist da immer noch ein Fehler
Tjeri Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: Sa 11.07.09 13:26 
So selver gelöst