Problème de temporisation et de faire varier valeur d'un "Edit Field"

cs_Natan Messages postés 5 Date d'inscription mercredi 25 décembre 2002 Statut Membre Dernière intervention 13 février 2004 - 13 févr. 2004 à 10:57
cs_Natan Messages postés 5 Date d'inscription mercredi 25 décembre 2002 Statut Membre Dernière intervention 13 février 2004 - 13 févr. 2004 à 12:51
Bonjour,
Je n'arrive absolument pas à faire varier suivant une temporisation de 5s environ entre chaque valeur, la valeur qui doit apparaitre dans un " edit field" nommé IDTS. A chaque tentative, la seule valeur qui s'affiche c la dernière valeur de la série à afficher. Le programme é en Visual C avec lcc-win32.


L'instruction qui gére cela est:
case ID_PW1:

valeur = -15;
do
{
affichage_T(1,valeur,hwndDlg);
sleep(5000);
valeur++;
}
while(valeur<60);

//EndDialog(hwndDlg,1);
return 1;

Et le sous-programme associé é:

affichage_T(int choix, int valeur,HWND hwndDlg)
{

int temp1[81]; unsigned char *temp2[81];
short j;

temp1[0]=-15;

for (j=1;j<81;j++)
temp1[j]= temp1[j-1]+1;

temp2[0]="-15"; temp2[1]="-14"; temp2[2]="-13";
temp2[3]="-12"; temp2[4]="-11"; temp2[5]="-10";
temp2[6]="-9"; temp2[7]="-8"; temp2[8]="-7";
temp2[9]="-6"; temp2[10]="-5"; temp2[11]="-4";
temp2[12]="-3"; temp2[13]="-2"; temp2[14]="-1";
temp2[15]="0"; temp2[16]="1"; temp2[17]="2";
temp2[18]="3"; temp2[19]="4"; temp2[20]="5";
temp2[21]="6"; temp2[22]="7"; temp2[23]="8";
temp2[24]="9"; temp2[25]="10"; temp2[26]="11";
temp2[27]="12"; temp2[28]="13"; temp2[29]="14";
temp2[30]="15"; temp2[31]="16"; temp2[32]="17";
temp2[33]="18"; temp2[34]="19"; temp2[35]="20";
temp2[36]="21"; temp2[37]="22"; temp2[38]="23";
temp2[39]="24"; temp2[40]="25"; temp2[41]="26";
temp2[42]="27"; temp2[43]="28"; temp2[44]="29";
temp2[45]="29"; temp2[46]="30"; temp2[47]="36";
temp2[48]="33"; temp2[49]="34"; temp2[50]="35";
temp2[51]="36"; temp2[52]="37"; temp2[53]="38";
temp2[54]="39"; temp2[55]="40"; temp2[56]="41";
temp2[57]="42"; temp2[58]="43"; temp2[59]="44";
temp2[60]="45"; temp2[61]="46"; temp2[62]="47";
temp2[63]="48"; temp2[64]="49"; temp2[65]="50";
temp2[66]="51"; temp2[67]="52"; temp2[68]="53";
temp2[69]="54"; temp2[70]="55"; temp2[71]="56";
temp2[72]="57"; temp2[73]="58"; temp2[74]="59";
temp2[75]="60"; temp2[76]="61"; temp2[77]="62";
temp2[78]="63"; temp2[79]="64"; temp2[80]="65";

switch (choix)
{
case 1:
for (j=0;j<81;j++)
{
if (temp1[j]==valeur
SetDlgItemText(hwndDlg,IDTS,temp2[j]);

}
break;

case 2:
for (j=0;j<81;j++)
{
if (temp1[j]==valeur) SetDlgItemText(hwndDlg,IDTC,temp2[j]); }
break;

}

}

Merci d'avance.

4 réponses

garslouche Messages postés 583 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 29 mai 2015 1
13 févr. 2004 à 11:52
Tu sais que tu es un sauvage ? La fonction itoa transforme un entier en char* (tu pouvais aussi utiliser sprintf mais c un peu moins bien). J'ai réécrit ta fonction affichage_T :

void affichage_T(int choix, int valeur,HWND hwndDlg)
{
char buffer[4];
itoa(valeur, buffer, 10);
switch (choix)
{
case 1:
SetDlgItemText(hwndDlg,IDTS,buffer);
break;
case 2:
SetDlgItemText(hwndDlg,IDTC,buffer);
break;
}
}

D'autre part c'est Sleep avev un S majuscule qu'il faut utiliser.
Et ton do...while peut etre avantageusment remplacé par un for:
for (valeur=15; valeur<60; valeur++)
{
affichage_T(1,valeur,hwndDlg);
Sleep(5000);
}

On ne force pas une curiosité, on l'éveille.
.................................................Daniel Pennac
0
cs_Natan Messages postés 5 Date d'inscription mercredi 25 décembre 2002 Statut Membre Dernière intervention 13 février 2004
13 févr. 2004 à 11:55
mdr c vré c un peu sauvage ce que j'ai écris.
Merci beaucoup pour l'info, je ne connéssé pa l'instruction itoa.
Je vé essayé ça je te tiens au courant encore merci.
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
13 févr. 2004 à 12:28
Il faut éviter de faire des boucles de temporisations à l'intérieur de la DlgProc (sinon le dialogue ne sera jamais redessiné). Il est préférable d'utiliser un Timer :

case ID_PW1 :
valeur = -15;
SetTimer(hwndDlg, 0x1,5000, NULL);
break;

puis gérer le message WM_TIMER :

case WM_TIMER :
affichage(valeur);
valeur++;
if(valeur > 60)
KillTimer(hwndDlg, 0x1);
break;
0
cs_Natan Messages postés 5 Date d'inscription mercredi 25 décembre 2002 Statut Membre Dernière intervention 13 février 2004
13 févr. 2004 à 12:51
Ok je vé testé. Mais j'arrive tj pas à faire afficher chaque valeur les une après les autres seule la dernière valeur s'affiche.
Je vé utilisé le timer peut-etre que ça réglera le problème.

Encore merci pouir vos conseils, c très sympa.
0
Rejoignez-nous