korgis
Messages postés420Date d'inscriptionsamedi 17 mai 2003StatutMembreDernière intervention 6 mai 2019
-
23 août 2003 à 15:21
Delphi -
22 juin 2019 à 14:07
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
La ligne "call [EAX].TApplication.ProcessMessages" est fausse. Le compilateur s'arrête dessus avec une énorme erreur !
Il faut vérifier ce que vous publiez avant de la faire parce que dans le cas contraire c'est ridicule !
manu1506
Messages postés54Date d'inscriptionjeudi 13 novembre 2003StatutMembreDernière intervention25 avril 2012 20 juin 2007 à 15:40
Et utiliser un Timer, ce ne serait pas plus simple?
JulioDelphi
Messages postés2226Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention18 novembre 201014 26 janv. 2007 à 17:04
OUIN ! ça bloque aussi pour moi :'( Delphi 7 Enterprise.
Quelqu'un une autre soluce pour faire une pause, une attente sans bloquer ? =) merci
LeGrizz
Messages postés1Date d'inscriptionmardi 17 janvier 2006StatutMembreDernière intervention17 janvier 2006 17 janv. 2006 à 17:36
Je n'ai aucun problème sous Delphi 7 et ça résoud parfaitement mon problème.
Merci
Filipe35
Messages postés470Date d'inscriptionvendredi 14 novembre 2003StatutMembreDernière intervention23 octobre 20071 30 oct. 2005 à 23:11
Delphi 7 et moi ca me bloque tout, ^^
pas grave mais merci ;)
retd
Messages postés1Date d'inscriptiondimanche 25 janvier 2004StatutMembreDernière intervention 2 juillet 2004 2 juil. 2004 à 16:27
Juste une info pour tester la version de Delphi sur une plage:
{$IF RTLVersion >= 14} // si delphi6 ou supérieur
...
{$IFEND}
RTLVersion est définie dans System.pas
@+
Manu
Sylvainlefou
Messages postés43Date d'inscriptionvendredi 27 décembre 2002StatutMembreDernière intervention15 février 2006 27 mars 2004 à 10:36
Semble ne pas marcher sous delphi 7 et XP
cs_Zeroc00l
Messages postés367Date d'inscriptionlundi 1 avril 2002StatutMembreDernière intervention11 février 2010 2 févr. 2004 à 23:29
J'comprend pôôô !
Je suis sous delphi 6 là... j'ai recopié la fonction de cam91, essayé avec des valeurs allant de 1 à 4 000 000 000 ca ne fait aucune différence ... C'est quoi ce bins ?
Sinon je vais passer à delphi 7... si je résume, je dois passer à quelS codeS (mieux optimisé etc ...) ???
MERCI d'avance !
cs_AnAcOnDa
Messages postés30Date d'inscriptionmardi 13 novembre 2001StatutMembreDernière intervention17 novembre 2003 17 nov. 2003 à 06:48
(sous delphi7 même avec les modifications c'est toujours bloquant)
yvemoreau
Messages postés308Date d'inscriptionmardi 11 juin 2002StatutMembreDernière intervention26 septembre 2008 25 sept. 2003 à 17:00
{$IfDef VER140 or higher} // si delphi 6
mov eax,edi
call TApplication.ProcessMessages
{$else}
call [EAX].TApplication.ProcessMessages
{$endif}
moi aussi sous delphi6 ça plantait
reste à voir si ça fonctionne sous 5 ?
bravo encore !
yve
cs_Nebula
Messages postés787Date d'inscriptionsamedi 8 juin 2002StatutMembreDernière intervention 7 juin 20072 25 août 2003 à 09:21
lol :)
C'était effectivement bien çà, dommage qu'on puisse pas faire :
VER80 pour Delphi1
VER90 pour Delphi2
VER100 pour Delphi3
VER120 pour Delphi4
VER130 pour Delphi5
VER140 pour Delphi6
VER150 pour Delphi7
Voila, désolé de t'avoir coupé l'herbe sous les pieds ;-)
cs_Nebula
Messages postés787Date d'inscriptionsamedi 8 juin 2002StatutMembreDernière intervention 7 juin 20072 24 août 2003 à 16:02
Tout d'abord merci pour vos compliments et remarques, çà fait bien plaisir ! ;-)
Et merci cam91 pour la version améliorée, c'est effectivement plus propre (et un poil plus rapide, lol) sans les push/pop dans la boucle ! Mais on doit pouvoir utiliser des tests dans le code, non ? Un peu comme les #ifdef en C, çà ferait une seule procédure pour toutes les versions de Delphi... J'ai déjà vu des codes qui en utilisaient, mais je sais plus comment çà marche... Je verrais çà demain au taf, à moins que quelqu'un me coupe l'herbe sous le pied, lol ;-)
cs_cam91
Messages postés19Date d'inscriptiondimanche 9 juin 2002StatutMembreDernière intervention 4 février 2006 23 août 2003 à 23:44
Tout d'abord merci beaucoup pour ton code qui répond à un problème essentiel de gestion du temps. Je l'ai testé et il fonctionne à merveille sous Delphi 3, cependant pour la version 7 que j'utilise, le compilateur ne reconnait pas l'instruction call[EAX].TApplication.ProcessMessages. J'ai donc repris l'idée pour l'appliquée aux dernières versions de Delphi:
procedure TForm1.Pause2(t:DWORD);
asm
push esi
push edi
mov esi,edx
call GetTickCount
add esi,eax
mov edi,Application
@attente:
push 1
call sleep
mov eax,edi //ou rien (selon version)
call TApplication.ProcessMessages //où call [edi].TApplication.ProcessMessages
call GetTickCount
cmp esi,eax
jae @attente
pop edi
pop esi
end;
Comme tu peux le constater j'ai également optimisé le code qui devient plus court, en effet les 3 call ne modifient pas les registres ebx,esi et edi. Mais on peut toujours faire mieux ;-)
korgis
Messages postés420Date d'inscriptionsamedi 17 mai 2003StatutMembreDernière intervention 6 mai 201917 23 août 2003 à 15:21
Fonctionne parfaitement sous Delphi 4.
Me semble remplacer très avantageusement Sleep !
Bravo et merci pour ce code, Nebula :-)
22 juin 2019 à 14:07
Il faut vérifier ce que vous publiez avant de la faire parce que dans le cas contraire c'est ridicule !
20 juin 2007 à 15:40
26 janv. 2007 à 17:04
Quelqu'un une autre soluce pour faire une pause, une attente sans bloquer ? =) merci
17 janv. 2006 à 17:36
Merci
30 oct. 2005 à 23:11
pas grave mais merci ;)
2 juil. 2004 à 16:27
{$IF RTLVersion >= 14} // si delphi6 ou supérieur
...
{$IFEND}
RTLVersion est définie dans System.pas
@+
Manu
27 mars 2004 à 10:36
2 févr. 2004 à 23:29
Je suis sous delphi 6 là... j'ai recopié la fonction de cam91, essayé avec des valeurs allant de 1 à 4 000 000 000 ca ne fait aucune différence ... C'est quoi ce bins ?
Sinon je vais passer à delphi 7... si je résume, je dois passer à quelS codeS (mieux optimisé etc ...) ???
MERCI d'avance !
17 nov. 2003 à 06:48
25 sept. 2003 à 17:00
mov eax,edi
call TApplication.ProcessMessages
{$else}
call [EAX].TApplication.ProcessMessages
{$endif}
moi aussi sous delphi6 ça plantait
reste à voir si ça fonctionne sous 5 ?
bravo encore !
yve
25 août 2003 à 09:21
C'était effectivement bien çà, dommage qu'on puisse pas faire :
{$if ver >= 150}
mov eax,edi
call TApplication.ProcessMessages
{$else}
call [EAX].TApplication.ProcessMessages
{$endif}
25 août 2003 à 00:33
{$IfDef VER150} //pour Delphi 7
mov eax,edi
call TApplication.ProcessMessages
{$Else}
call [EAX].TApplication.ProcessMessages
{$EndIf}
VER80 pour Delphi1
VER90 pour Delphi2
VER100 pour Delphi3
VER120 pour Delphi4
VER130 pour Delphi5
VER140 pour Delphi6
VER150 pour Delphi7
Voila, désolé de t'avoir coupé l'herbe sous les pieds ;-)
24 août 2003 à 16:02
Et merci cam91 pour la version améliorée, c'est effectivement plus propre (et un poil plus rapide, lol) sans les push/pop dans la boucle ! Mais on doit pouvoir utiliser des tests dans le code, non ? Un peu comme les #ifdef en C, çà ferait une seule procédure pour toutes les versions de Delphi... J'ai déjà vu des codes qui en utilisaient, mais je sais plus comment çà marche... Je verrais çà demain au taf, à moins que quelqu'un me coupe l'herbe sous le pied, lol ;-)
23 août 2003 à 23:44
procedure TForm1.Pause2(t:DWORD);
asm
push esi
push edi
mov esi,edx
call GetTickCount
add esi,eax
mov edi,Application
@attente:
push 1
call sleep
mov eax,edi //ou rien (selon version)
call TApplication.ProcessMessages //où call [edi].TApplication.ProcessMessages
call GetTickCount
cmp esi,eax
jae @attente
pop edi
pop esi
end;
Comme tu peux le constater j'ai également optimisé le code qui devient plus court, en effet les 3 call ne modifient pas les registres ebx,esi et edi. Mais on peut toujours faire mieux ;-)
23 août 2003 à 15:21
Me semble remplacer très avantageusement Sleep !
Bravo et merci pour ce code, Nebula :-)