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

Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
- - Dernière réponse : 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

Afficher la suite 
cs_paradise
Messages postés
11
Date d'inscription
mercredi 7 mai 2003
Statut
Membre
Dernière intervention
13 février 2012
-
+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
237
Date d'inscription
mardi 13 novembre 2007
Statut
Membre
Dernière intervention
21 novembre 2013
-
>>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
3869
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
5 -
"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
293
Date d'inscription
mardi 2 mai 2006
Statut
Membre
Dernière intervention
12 octobre 2011
-
Merci beaucoup !
blueperfect
Messages postés
237
Date d'inscription
mardi 13 novembre 2007
Statut
Membre
Dernière intervention
21 novembre 2013
-
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
293
Date d'inscription
mardi 2 mai 2006
Statut
Membre
Dernière intervention
12 octobre 2011
-
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
293
Date d'inscription
mardi 2 mai 2006
Statut
Membre
Dernière intervention
12 octobre 2011
-
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
293
Date d'inscription
mardi 2 mai 2006
Statut
Membre
Dernière intervention
12 octobre 2011
-
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
237
Date d'inscription
mardi 13 novembre 2007
Statut
Membre
Dernière intervention
21 novembre 2013
-
grrrrrrrrrrrrrrr...Mais pas mon mot de passe !
Bacterius
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
5 -
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
237
Date d'inscription
mardi 13 novembre 2007
Statut
Membre
Dernière intervention
21 novembre 2013
-
>> 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
237
Date d'inscription
mardi 13 novembre 2007
Statut
Membre
Dernière intervention
21 novembre 2013
-
>>Bactérius :
C pas normal....

Si tu rajoutes dans le FormCreate un doublebuffered = true ?
Bacterius
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
5 -
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
237
Date d'inscription
mardi 13 novembre 2007
Statut
Membre
Dernière intervention
21 novembre 2013
-
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
3869
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
5 -
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 !