Hi!
Zuerst mal haben wir hier wohl das Mißverständnis, daß eine lokale Variable beim nächsten Prozeduraufruf noch ihren alten Wert habe - das mag bei anderen Programmiersprachen so sein, bei Delphi ist das nicht der Fall.
Aufgrund des unter Windows ereignisgesteuerten Programmablaufs kann man ja auch nicht vorhersagen, in welcher Reihenfolge was aufgerufen wird - Tastatur- Maus- und Fensterereignisse passieren nun mal unvorhersehbar und rufen (sofern vom Programmierer da etwas geschrieben wurde) ihre Ereignisverarbeitungen auf. Wenn dann lokale Variablen als Zwischenspeicher verwendet werden könnten, kämen die merkwürdigsten Ergebnisse heraus. Bei Verwendung globaler Variablen kann das auch unter Delphi passieren.
Leider hat der Fragesteller nicht die Zeile genannt, in der der Fehler gemeldet wird - die letzte Zeile dürfte es nicht sein.
Hier mal Luckies Umformung des Codes mit meinen Anmerkungen, wo der Compiler warnen sollte:
Delphi-Quellcode:
procedure TForm1.Note;
var
note, cache : Real;
begin
if (FiCountCorrect = 0) and (jkeins = 1) and (jkzwei = 1) then
begin
note := 7;
end
else if (FiCountCorrect = 0) and (jkeins = 1) then
begin
note := 65 / 10;
end
else if (FiCountCorrect = 0) and (jkzwei = 1) then
begin
note := 65 / 10;
end
else if (FiCountCorrect = 0) then
begin
note := 6;
end
else if (jkeins = 1) then
begin
note := cache; //==> cache möglicherweise nicht initialisiert
note := note + 1 / 2;
end
else if (jkzwei = 1) then
begin
note := cache; //==> cache möglicherweise nicht initialisiert
note := note + 1 / 2;
end
else
begin
note := cache; //==> cache möglicherweise nicht initialisiert
note := note - 5 / 15;
end;
cache := note;
Label7.Caption := FloatToStr(RundeAufStelle(cache, 1));
end;
Entweder cache als globale Variable im Formular haben oder als VAR-Parameter übergeben - dann natürlich vor dem ersten Aufruf der Prozedur das Initialisieren nicht vergessen.
Dabei könnte man dann auch gleich die übrigen globalen Werte per Parameter übergeben:
Delphi-Quellcode:
procedure TForm1.Note (const FiCountCorrect, jkeins, jkzwei: integer; var cache: real);
var
note: Real;
begin
if (FiCountCorrect = 0) and (jkeins = 1) and (jkzwei = 1) then
begin
note := 7;
end
else if (FiCountCorrect = 0) and (jkeins = 1) then
begin
note := 65 / 10;
end
else if (FiCountCorrect = 0) and (jkzwei = 1) then
begin
note := 65 / 10;
end
else if (FiCountCorrect = 0) then
begin
note := 6;
end
else if (jkeins = 1) then
begin
note := cache;
note := note + 1 / 2;
end
else if (jkzwei = 1) then
begin
note := cache;
note := note + 1 / 2;
end
else
begin
note := cache;
note := note - 5 / 15;
end;
cache := note;
Label7.Caption := FloatToStr(RundeAufStelle(cache, 1));
end;
Gruß
Eos-PVU