Modifier une caption à partir d'une variable

Résolu
fredelem Messages postés 136 Date d'inscription dimanche 29 octobre 2006 Statut Membre Dernière intervention 1 décembre 2022 - 8 avril 2013 à 13:02
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 - 13 avril 2013 à 15:20
J'écris un programme qui contient beaucoup de labels. Je suis tout le temps en train d'écrire Label1.caption=ceci, label2.caption=cela... Je voudrais bien me simplifier la tâche en écrivant tout simplement c1:=ceci, c2:=cela ou à la rigueur c1^:=ceci c2^:=cela. Et bien sûr, les captions prendraient les valeurs données à c1 et c2.

Delphi me permet d'écrire: Addr(Label1) mais ça ne m'apporte rien. Si je pouvais écrire Addr(label1.caption), ce serait facile mais ça, Delphi ne l'accepte pas, c'est bien normal.

Avec quelques recherches, je peux trouver combien d'octets séparent le début de Label1 de sa caption (on peut appeler ça le décalage, l'offset) mais je ne vois pas comment je pourrais m'en servir.

En résumé: si je connais A, adresse de Label1, comment lire et modifier le contenu de [(adresse pointée par A) + offset de la caption)]. En Turbo-Pascal, on avait le mot Mem[adresse] qui permettait de faire tout ce qu'on voulait, y compris de grosses bêtises, mais Delphi me semble s'être cuirassé contre la possibilité de lire ou de modifier une adresse mémoire autrement qu'en y accédant par une variable.

25 réponses

beckerich Messages postés 302 Date d'inscription jeudi 29 septembre 2005 Statut Membre Dernière intervention 17 septembre 2013 2
11 avril 2013 à 13:33
Salut,

pour ta question à F0xi, je pense que tu peux passer n'importe quel un TControl en paramètre au lieu d'un TCaption, par exemple.
Ce qui permet d'avoir une procédure plus générique.

Luc.
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
11 avril 2013 à 14:22
non, SetTextBuf attend un PChar en paramètre, donc SetTextBuf(S) ne marchera pas (tu peux essayer tu auras une erreur de compilation). On appelle donc SetTextBuf(PChar(S)) en castant le S en PChar...

Par rapport au const, si tu es intéressé, jette un oeil dans l'aide delphi sur les paramètres de fonction. Tu verras qu'il y a d'autres mots clés comme var et out...


Simon
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
11 avril 2013 à 14:23
Pardon, j'ai répondu complètement à côté... beckerich a raison. Ne pas tenir compte de ma dernière remarque...


Simon
0
fredelem Messages postés 136 Date d'inscription dimanche 29 octobre 2006 Statut Membre Dernière intervention 1 décembre 2022 2
11 avril 2013 à 21:09
Merci à tous. Tout est maintenant clair dans ma tête.

Mais je me suis lancé dans la création d'un Showmessage amélioré. J'ai réussi à faire ce que je voulais mais je bute sur un petit détail. Je crois que je ne vais pas tarder à poser une nouvelle question.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
13 avril 2013 à 15:20
oui Fredelem, la procedure setTextBuf est propre au TControl (et descendant Tlabel, Tbutton, etc).

tu peux donc passer tout descendant de TControl utilisant TCaption comme base d'affichage (TButton, TLabel, TPanel, TGroupBox, TRadioGroup, etc) et ainsi ne pas avoir un traitement spécifique pour chaque classe.

ce genre de proc est interessante pour les interfaces multilangues dans une certaine mesure.

les tableaux dynamique (array of) sont très pratiques en arguments, mais attention de ne point trop en abuser non plus, on aurait tot fait d'exploser la pile en en utilisant trop.

Un dernier point, il est toujours bien de faire des fonctions outils, mais il faut savoir qu'ajouter en simplicité d'écriture de code (grace a des fonctions et des boucles) peux vite nuire aux perf du programme.


________________________________________________________
0
Rejoignez-nous