PRÉ-COMPOSANT D'AFFICHAGE DE TEXTE PROGRESSIF...

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 - 6 mai 2009 à 20:52
cs_paradise Messages postés 11 Date d'inscription mercredi 7 mai 2003 Statut Membre Dernière intervention 13 février 2012 - 13 févr. 2012 à 17:06
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/49981-pre-composant-d-affichage-de-texte-progressif

cs_paradise Messages postés 11 Date d'inscription mercredi 7 mai 2003 Statut Membre Dernière intervention 13 février 2012
13 févr. 2012 à 17:06
+1 foxi

Code intéressant mais :
- petit souci de mise en forme du code (chacun sa sauce après tout)
- tous les "self." sont inutiles
- plus gênant les dossiers "prédéfinis" dans les options du projet, à virer avant de poster
blueperfect Messages postés 234 Date d'inscription mardi 13 novembre 2007 Statut Membre Dernière intervention 21 novembre 2013
10 mai 2009 à 16:51
>>Surcharge du thread :
obligée, Execute est abstract !

>>on copie ces variables depuis le composant
normalement, à la création du thread, il devrait y avoir une redirection des variables cruciales du composant vers le thread, c'est à dire que les *getters* et les *setters* devrait être :

function MyComponent.Getxxxx:TMyType;

begin
if System.Assigned(self.TheThread)
then Result := self.TheThread.xxxxx
else Result := self._xxxxx;
end;

En fait, seules les variables susceptibles d'être modifiées par le thread doivent être recopiées...

De plus, la gestion des TCanvas n'est possible qu'avec le méchanisme du Lock/Unlock, ce qui oblige Windows et les autres threads à ne pas modifier leurs adresses mémoires pendant que tu dessines dessus...
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
10 mai 2009 à 11:16
"un thread ne peut être correct si il modifie une variable d'un composant..."

C'est pourquoi l'on procède dans l'autre sens : on surcharge une version du TThread avec des variables dont on aura besoin, puis on copie ces variables depuis le composant.
C'est ça non ?

Cordialement, Bacterius !
nethacker Messages postés 288 Date d'inscription mardi 2 mai 2006 Statut Membre Dernière intervention 12 octobre 2011
9 mai 2009 à 23:45
Merci beaucoup !
blueperfect Messages postés 234 Date d'inscription mardi 13 novembre 2007 Statut Membre Dernière intervention 21 novembre 2013
9 mai 2009 à 23:17
les composants sont accessibles via TForm.Components, sous la forme d'un TComponent...

Tu peux utiliser :

* self.Components[_each].InheritsFrom(TEdit)
* self.Components[_each] as TEdit

pour tester la classe du composant (ici TEdit), et pour ensuite le "typer"...

Dans ton exemple, mieux que *Sleep*, tu devrais te tourner vers le TTimer et son OnTimer (suffisant dans la plupart des cas) !

Mon exemple d'utiilisation avec les threads n'est pas pour simuler 100 TEdit qui font varier leurs contenus, mais plutôt pour manipuler un TBitmap, et son affichage depuis un Thread !

Plus tard, les même threads me seront utiles pour re-travailler des TBitmaps...

C'est délicat, en ce sens, que les threads ne paratgent pas le même espace mémoire que les composants de la VCL, et ne peuvent donc pas partager (ou seulement en lecture) leurs variables : un thread ne peut être correct si il modifie une variable d'un composant...

Pourtant, il faut pouvoir visuellemnt faire varier ses paramètres, comme le délai de rotation des lettres...

Dans le Execute du thread (PleaseDo dans mon exemple), je ne fais qu'un simple appel à Windows (via Invalidate), pour raffraîchir la TPaintBox qui lui est associée...

D'ailleurs, la version Codes-Sources de mon programme bogue si on utilise plusieurs PaintBox. Ceci est résolu en utilisant Canvas.Lock/Canvas.Unlock de la PaintBox, dans le PleaseDo...assurant ainsi le thread de ne pas "tomber" pendant un raffraichissement écran par Windows !

Je vais bientôt mettre les sources à jour... je suis en train de "disséquer" les lasses utilisées, pour en faire des génériques, voire des composants...

DH
nethacker Messages postés 288 Date d'inscription mardi 2 mai 2006 Statut Membre Dernière intervention 12 octobre 2011
9 mai 2009 à 22:56
Je m'excuse pour avoir écrit trop de commentaires à la suite, mais comme je ne peux éditer ...
C'est vraiment bizarre parceque, je voulais faire exactement la même chose ce matin, à la manière d'un noob plusieurs Tedit et un autre pour entrer une chaîne et non un fichier comme votre source, ne connaissant pas les threads je procède lettre par lettre comme votre "write", finalement je me bloque là :

var
alphabet : string;
length,i,j : integer;
begin
i := 1;
j := 1;
alphabet := 'abcdefghijklmnopqrstuvwxyzZBCDEFGHIJKLMNOPQRSTUVWXYZ';
length := edit22.GetTextLen;
while ( i <= length) do begin
if copy(edit22.Text,i,1) <> copy(alphabet,j,1)
then begin inc(j); edit1.Text := copy(alphabet,j,1); edit1.Refresh; sleep(120); end
else begin inc(i); end;
end;

Je n'arrivais pas à passer au deuxième edit, impossible de faire un edit"i", pourtant c'est ce que je voulais faire, vous avez une idée ? du code on runtime ?
nethacker Messages postés 288 Date d'inscription mardi 2 mai 2006 Statut Membre Dernière intervention 12 octobre 2011
9 mai 2009 à 22:49
Ah non c'est bon, apparemment c'est les fichiers de configuration, il voulait à tout prix créer le dcu dans ton bureau /David H.../
nethacker Messages postés 288 Date d'inscription mardi 2 mai 2006 Statut Membre Dernière intervention 12 octobre 2011
9 mai 2009 à 22:37
J'arrive pas à compiler moi,j'ai Delphi 6, et il n'arrive pas à créer le dcu, si tu peux l'uploader sur ton serveur si t'en as ou quelque part ailleurs ça serait bien sympa.
blueperfect Messages postés 234 Date d'inscription mardi 13 novembre 2007 Statut Membre Dernière intervention 21 novembre 2013
8 mai 2009 à 15:02
grrrrrrrrrrrrrrr...Mais pas mon mot de passe !
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
8 mai 2009 à 10:06
Oui c'est bon mon VIEUX PC (n'est pas un vieux PC, il a juste un ventilateur en moins, donc je dois baisser la vitesse du CPU à "basse" ou "moyenne" pour éviter qu'il s'éteigne, mais je vais le réparer dans le courant de la semaine prochaine) fonctionne maintenant :D plus de saccadé.

Cordialement, Bacterius !

PS : vire les fichiers inutiles, en particulier les fichier .dsk, .dof, .cfg. Ils enregistrent les options de Delphi (position de la fenêtre, répertoire de travail), et c'est avec cette gourde que je connais ton nom de famille ^^
blueperfect Messages postés 234 Date d'inscription mardi 13 novembre 2007 Statut Membre Dernière intervention 21 novembre 2013
7 mai 2009 à 22:29
>> Bactérius :

J'ai fait la correction pour ton vieux PC :

OnPaint se réfèrait au Canvas de la Form, et maintenant de la PaintBox... ainsi, il n'y a plus de saccadé !
blueperfect Messages postés 234 Date d'inscription mardi 13 novembre 2007 Statut Membre Dernière intervention 21 novembre 2013
7 mai 2009 à 20:03
>>Bactérius :
C pas normal....

Si tu rajoutes dans le FormCreate un doublebuffered = true ?
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
7 mai 2009 à 16:57
Windows XP SP 3 avec disque dur intégré de 34 Go partitionné en lecteurs C et D, un lecteur CD/DVD en E:\, un disque dur externe 250 Go en F:\, 512 Mb RAM, connexion internet, opéra, un ventilateur probablement pété et un CPU 1.70 GHz.
Quand je dis je rame, c'est-à-dire que par exemple lors de l'animation (telle qu'elle est paramétrée au lancement du programme), quand je veux changer la trackbar, son mouvement est "hachuré", saccadé, un peu comme si tu faisais un sleep(50) en boucle sans ProcessMessages ... je sais pas comment dire ...

Cordialement, Bacterius !
blueperfect Messages postés 234 Date d'inscription mardi 13 novembre 2007 Statut Membre Dernière intervention 21 novembre 2013
6 mai 2009 à 23:49
Ce n'est qu'un avant goût...

On peut en faire en HUD pour gameplay rapidement...

>>Bacterius
ça rame ?
T'as quelle config ?
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
6 mai 2009 à 21:35
Moi ça rame un peu chez moi ... mais c'est très intéressant !
Je vais m'y plonger dès que possible ...

Cordialement, Bacterius !
Rejoignez-nous