2017-03-28 3 views
1

Je développe actuellement une application simple pour compter le nombre de clics en 10 secondes, lire les noms et les scores de deux fichiers différents, puis afficher ces noms et scores avec différents types dans un autre format. Cependant, une fois le jeu terminé, le jeu est terminé. message apparaît, le formulaire Leaderboard apparaît mais n'a pas de boutons, semble étrangement plat et semble planter le programme.Pascal - Le programme se bloque lors du changement de formulaire

Voici comment la forme devrait ressembler à: Leaderboard Form

Et voici comment il ressemble réellement: Leaderboard Error in Form

code pour afficher le formulaire se trouve ci-dessous:

if TimeLeft=0 then 
    begin 
      Form2.Timer1.Enabled:=False;{Disable timer} 
      ShowMessage('Game Over!');{Message to show upon termination condtion being met} 
      Leaderboard.Show;{Show Leaderboard Form} 
      Form2.Hide;{Hide game} 
      Reset(LeaderboardNamesFile);{Open file} 
      while not EOF(LeaderboardNamesFile) do 
       LineCount:=LineCount+1;{Increment to allow for EOF marking of the score} 
      LeaderboardScoresArray[LineCount]:=Score;{Add score to array of scores} 
    end; 

Et la code contenu dans le bouton d'affichage Score du formulaire Classement:

var Counter : Integer; 
begin 
    Counter:=1; 
    Memo1.Lines.add(LeaderboardNamesArray[Counter]+' - '+IntToStr(LeaderboardScoresArray[Counter])); 
end; 

Je trouve cela très étrange, car rien ne s'exécute réellement lorsque le formulaire est affiché, il devrait donc se bloquer avant, voire jamais, et aucun message d'erreur n'apparaît. Des idées? Si plus d'informations si nécessaire, s'il vous plaît demander. Nouveau sur ce site!

Répondre

3

La boucle while est sans fin, la boucle ne contient qu'une seule commande:

while not EOF(LeaderboardNamesFile) do 
      LineCount:=LineCount+1;{Increment to allow for EOF marking of the score} 

Ainsi, votre programme comte LineCount up, mais ne lisent pas aktually toutes les données du fichier. Donc le fichier ne devient jamais EOF ("fin de fichier"). Vous devez faire quelque chose comme ceci:

Reset(LeaderboardNamesFile);{Open file} 
while not EOF(LeaderboardNamesFile) do 
begin 
    LineCount:=LineCount+1;{Increment to allow for EOF marking of the score} 
    readln(LeaderboardNamesFile, Score); 
    LeaderboardScoresArray[LineCount]:=Score;{Add score to array of scores} 
end; 
CloseFile(LeaderboardNamesFile); 
+0

Le nom ne serait-il pas lu dans la variable Score? Je suis confus quant à la façon dont cela aide. Je suis en fait plus confus qu'il y a quelqu'un qui code encore en Pascal! – Syla

+0

@Syla: Beaucoup de gens codent en Pascal. La plupart d'entre eux en Delphi ou FreePascal, mais aussi dans d'autres versions de Pascal. Veuillez relire la réponse: si vous ne lisez rien, EOF ne deviendra * jamais * vrai, donc la boucle ne s'arrêtera jamais. 'EOF'stands pour" fin de fichier "et qui ne peut être atteint que si vous lisez réellement à partir du fichier. Donc soit utiliser un autre critère pour arrêter la boucle, soit supprimer complètement la boucle, ou bien, lire quelque chose du fichier jusqu'à la fin, comme le montre la réponse. –

+0

@RudyVelthuis Merci, je ne lisais pas correctement. – Syla