et bien sûr, je suis à la poursuite/à la recherche d'une idée/d'une astuce/d'un truc pour contourner ce que je m'en vais vous conter ci-dessous, qui n'est pas piqué des vers !
Bonsoir à tous !
Or donc, toujours dans les méandres des jeux d'échecs, je voulais faire rejouer une partie au programme sur lequel je travaille, et qui fonctionne bien, sauf avec ce problème.
Au départ l'organisation de mon programme est simple : je lance le moteur qui va me servir de partenaire, je clique deux fois sur le plateau, ça génère une string genre "e2e4" qui est envoyée au moteur par le biais de l'événement OnChange d'un TLabeledEdit.
Et le moteur va renvoyer son coup grâce à une chaîne identique dans un autre TLabeledEdit, récupéré aussi dans son OnChange.
Tous ces échanges sont envoyés au système d'affichage qui fait se déplacer les pièces sur le plateau et c'est très joli et voilà le monsieur il est content.
Jusqu'à tout à l'heure où j'avais une longue série de coups représentant une partie que je voulais revoir.
Je me suis dit "Fastoche ! En 5 minutes c'est torché" et trois heures plus tard j'y suis encore et me voilà à poster ma bouteille à la mer...
Ça ne devait pas être une bonne idée, car dès le départ ça partait mal (chez moi c'est un signe) : je me souvenais que pour saisir quelque chose on peut utiliser InputQuery mais ayant oublié la syntaxe, j'ai donc tapé quelque chose genre s := InputQuery, ai mis le curseur en plein milieu du mot, ai fait F1 et paf !, dans le décor, ou plutôt, complètement à côté de la plaque. Essayez, vous verrez bien...
Suis alors parti à la pêche aux infos sur le web, et non sans mal j'ai écrit ça :
(désolé, j'ai essayé code=ceci, code=cela, pas moyen d'avoir un peu de couleur dans ce bout de code...)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 procedure TForm1.btnLoadGameClick(Sender: TObject); var s: string; i: integer; sl:TStringList; begin sl:=TStringList.Create; s := InputBox('Partie à rejouer', 'Entrez les coups :', 'Ici...'); // copier/coller de la liste des coups blanc noir blanc noir etc. // dans http://wiki.lazarus.freepascal.org/Dialog_Examples/fr on peut lire // "Une chaîne de caractère par défaut, peut être rentrée optionnellement." // résultat, une chaîne de caractère par défaut doit être rentrée. !!! // J'adore les options obligatoires, grrrrrr ! // même topo avec l'infobulle qui s'affiche : erronée... Bref... Split(' ', s, sl); // pour découper la chaine en coups genre e2e4 for i := 0 to sl.Count-1 do begin if (i mod 2) = 0 then begin // blancs ledReceivedFromPlateau.Text := sl[i]; // le coup des blancs Application.ProcessMessages; // la respiration qui devrait rendre la main, mais... memoblancs.Lines.Add(sl[i]); // bien loggé Sleep(2000); // pour avoir le temps de voir end else begin // noirs memonoirs.Lines.Add(sl[i]); // bien loggé, mais depuis la chaîne passée, pas le retour du moteur end; end; sl.Free; end;
J'en suis là : la ligne ledReceivedFromPlateau.Text := sl[i]; est la même que celle que j'utilise quand je clique pour de vrai à la souris sur le plateau : ledReceivedFromPlateau.Text := ClickOnPlateau; ClickOnPlateau est une string qui va contenir le coup joué, genre comme ci-dessus, e2e4.
Si je clique avec la souris, comme raconté plus haut, le moteur reçoit la string, la traite et renvoie sa réponse ; si j'exécute la boucle sur la string passée dans l'InputBox, je ne vois rien revenir du moteur...
Ce fonctionnement donne l'impression que je ne sors pas de la procédure btnLoadGameClick (enfin, c'est p'têt pas les bons mots mais je ne vois pas comment le dire autrement) et pourtant les memos de log sont correctement remplis.
Pour moi, il n'y a aucune raison pour que ça ne fonctionne pas...
Une dernière précision : si je passe dans l'InputBox une chaîne de 1 coup (e2e4), tout fonctionne bien, ie le coup est reçu par le moteur qui répond. Mais bien sûr dans ce cas-là on est sorti de la boucle et donc de la procédure.
Une idée, les copains ?
Ah oui, j'ai les CThreads activés dans le .lpr, et j'ai blindé les routines du moteur d'Application.ProcessMessages sans que ça change ce comportement étrange...
Un dernier mot : je poste dans la section Lazarus mais c'est peut-être lié au fait que le moteur (écrit par glegat dans l'autre post et adapté par votre serviteur) est au départ une unité Free Pascal. J'ai peut-être oublié un uses ou un autre truc qui n'empêcherait ni la compilation ni l'exécution basique, mais je ne vois vraiment pas quoi.
Merci de m'avoir lu (oui, c'était long) et merci pour vos pistes
Partager