Recuperer texte via handle

yannfrance Messages postés 48 Date d'inscription mardi 18 septembre 2007 Statut Membre Dernière intervention 1 décembre 2010 - 27 mars 2009 à 05:44
yannfrance Messages postés 48 Date d'inscription mardi 18 septembre 2007 Statut Membre Dernière intervention 1 décembre 2010 - 31 mars 2009 à 19:21
Bonjour,


Je récupère du texte dans une appli externe.

Ca fonctionne sur des memo, richEdit:

Code :
var monhandle, longue : integer;
Pseudo : string;
begin
Memo1.Lines.Clear; // efface contenue memo
monhandle:= strtoint(Edit1.Text); //Contenu de edit dans monhandle
longue := SendMessage(monhandle, WM_GETTEXTLENGTH, 0, 0);// recupère la longueur du texte
SetLength(Pseudo, longue); // fixe la longueur pour Pseudo
SendMessage(monhandle, WM_GETTEXT, longue + 1, LParam(PChar(Pseudo))); //Recupère le texte dans pseudo
Memo1.lines.add(Pseudo);

// ajoute au memo


Mais là ou ça commence à ce corser, c'est là ou je veut récuperer tous le texte des composants tel que des TreeView, ListView, Label...

Enfin bref, çe code ne fonctionne pas sur ces composants.

Comment puis-je procéder ?

Merci pour votre aide.

10 réponses

Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
27 mars 2009 à 17:22
Evidemment :

1. Le TLabel. Il n'est pas un composant fenêtré, il n'a donc pas de Handle. Autrement dit, pas de SendMessage dessus :) Il faudra réfléchir à d'autres techniques !

2. Le ListView et le TreeView. On peut facilement concevoir que les mémos et les edits ont une propriété Text, que les messages WM_GETTEXT récupèrent. Or, les ListView et TreeView n'ont pas cette propriété, puisqu'ils ont différents éléments séparés. Il faudra donc probablement se renseigner sur des messages plus spécialisés, ou alors établir un protocole de communication entre deux applications (si c'est toi qui les codes) ...

Voilà ... demande pour plus d'information.

Enfin des questions interessantes :)

Cordialement, Bacterius !
0
yannfrance Messages postés 48 Date d'inscription mardi 18 septembre 2007 Statut Membre Dernière intervention 1 décembre 2010
27 mars 2009 à 18:11
Bonjour Bacterius
Merci de t'intéresser à mon soucis.
Excuse moi, j'ai pas réfléchie à propos du label.
Sinon, je suis d'accord avec toi que pour récupérer les textes dans les treeview, ce sont des messages spécialisé tel que LVM_GETITEMTEXT d'àpres l'aide de delphi...
mais lorsque j'essai (bidouiller à mon niveau) , ça ne donne rien.
J'essai de récupérer le contenue dans un ComboBox, ListView, mais rien de concret.
je vais continuer de chercher et de bidouiller, ont verra bien.
Si je trouve du nouveau, j'apporterais...
merci
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
27 mars 2009 à 18:15
Pour LVM_GETITEMTEXT, tu dois passer dans wParam l'index (la position) de l'élément à récupérer, et dans lParam tu dois passer un pointeur :

Longword(@Variable)

qui pointera vers un enregistrement LVITEM.

Voici des informations sur le type LVITEM, qui n'est peut-être pas déclaré dans Delphi directement :

http://msdn.microsoft.com/en-us/library/bb774760(VS.85).aspx

Cordialement, Bacterius !
0
yannfrance Messages postés 48 Date d'inscription mardi 18 septembre 2007 Statut Membre Dernière intervention 1 décembre 2010
30 mars 2009 à 08:47
Bonjour,

Bon, Le LVM_GETITEMTEXT c'est pour récuperer les textes dans les listView.
J'ai trouver plein de source qui permet de le faire.
En ce qu'il concerne mon TreeView, j'ai consulter l'aide de delphi et j'ai trouver qu'il fallait envoyer le message avec TVM_GETITEM.
Donc, étant novice, ça va être assez dur pour moi.
Je ne sais pas réellement si je doit passer un TVM_GETCOUNT ou autre.
Voilà, si quelqu'un est interresser pour m'aider, il seras le bienvenue.
Je vais continuer à chercher
0

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

Posez votre question
yannfrance Messages postés 48 Date d'inscription mardi 18 septembre 2007 Statut Membre Dernière intervention 1 décembre 2010
30 mars 2009 à 08:57
J'ai essayer celà :

var monhandle, longue : integer;
     Pseu : string;
begin
Memo2.Lines.Clear;
 monhandle:= strtoint(Edit1.Text);
  longue := SendMessage(monhandle, TVM_GETITEMHEIGHT, 0, 0);
  SetLength(Pseu, longue);
  SendMessage(monhandle, TVM_GETITEM, longue + 1, LParam(PChar(Pseu)));
  Memo2.lines.add(Pseu);

Bon, il y'as du nouveau puisque là, il m'affiche quelque choses dans mon memo, mais le prblème, c'est que je ne parle pas le chinois
????????????????
voilà...
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
30 mars 2009 à 17:47
Normal : changes Pseu en PChar, et fais plutôt un StrAlloc à la place du Length (Pseu := StrAlloc(Longue) et pour libérer StrDispose(Pseu).
Ca devrait marcher mieux.

Cordialement, Bacterius !
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
30 mars 2009 à 18:01
En réalité, quand tu fais PChar(UneVariable), il va simplement te donner un pointeur vers un nouveau tableau de caractères qui contiendra le texte de la variable (dans le cas d'un String). Or, le SendMessage va (grossièrement) copier du texte dans le PChar pointé par PChar(Pseu). Comme tu n'as plus cette adresse, tu n'auras jamais le texte, et Pseu sera rempli de caractères bizarres.
Regarde :

procedure Test;
var
VarStr: String;
VarPChar: PChar;
begin
VarStr := 'Salut';
// Le pointeur @VarStr pointe vers une chaîne de caractères 'Salut')
VarPChar := StrAlloc(255);
// Le pointeur VarPChar pointe à présent vers une chaîne vide de 255 caractères)
VarPChar := PChar(VarStr);
// Le pointeur VarPChar pointe à présent vers une nouvelle adresse mémoire qui à son tour pointera vers le texte contenu dans VarStr).
StrDispose(VarPChar);
// VarPChar n'existe plus en mémoire
end;

C'est très interessant les pointeurs ...
N'oublie pas que quand tu manipules des objets (String, TBitmap, etc ...), ce sont juste 2 nombres : 1 pointeur et 1 longueur. Ca simplifie énormément de choses. Par exemple, si j'ai un enregistrement de 12 octets de ce type :

type

TMyRec=record
Number1, Number2, Number3: Longword;
end;

PMyRec=^TMyRec;

Quand tu créeras un objet TMyRec, ça sera juste un pointeur PMyRec, pointant vers le début de l'objet en mémoire (imaginons à l'adresse 500), et une longueur, contenant la taille en octets de l'objet (ici 12). Ainsi, avec ces deux nombres, l'ordinateur sait que notre objet occupe la place 500 à 511 en mémoire (511 car on compte le 500). Quand tu déréférences un objet (MonPointeurPMyRec^.Number1 := 7; par exemple), Delphi s'occupe de tout en copiant l'information directement en mémoire.
Regarde :

Adresses
500 |-
501 | Nombre 1, occupe 4 octets (32 bits)
502 |
503 |-
504 |-
505 |
506 | Nombre 2, occupe 4 octets (32 bits)
507 |-

Quand Delphi veut modifier le nombre 2, il va prendre l'adresse de départ (500), regarder à quel endroit dans l'enregistrement se trouve ta variable, et va modifier 4 octets. Il va donc se placer à 500 + 4 (504), et modifier les informations jusqu'à 500 + 4 + 4 (508).

Enfin c'est comme ça que je vois les choses :p et ça marche drôlement bien pour la mémoire partagée en fichier paginé ^^

Voilà ...

Cordialement, Bacterius !
0
yannfrance Messages postés 48 Date d'inscription mardi 18 septembre 2007 Statut Membre Dernière intervention 1 décembre 2010
31 mars 2009 à 15:45
Merci pour ce petit cours.
Mais j'avoue que c'est encore flou dans ma tête.
j'avoue aussi que lorsque je ne trouve pas de solution, je suis même prêt à taper n'importe quoi comme code au cas ou
Tous ce qui est chaine de caractères etc, manipulations de string, c'est vraiment mon point faible.
Merci encore pour ce cours, je vais essayer d'approfondir aussi sur les pointeurs, ça l'air interressant.
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
31 mars 2009 à 19:05
Oui mais fais attention en testant n'importe-quoi : quand ta mémoire sera bourrée de pointeurs qui se baladent dans la nature ça va bien ramer et tu seras obligé de rebooter ^^
Je prépare d'ailleurs un tutorial sur les pointeurs, même si tu auras sûrement compris avant que je ne le poste (il sera prêt d'ici quelques jours/semaines).

Cordialement, Bacterius !
0
yannfrance Messages postés 48 Date d'inscription mardi 18 septembre 2007 Statut Membre Dernière intervention 1 décembre 2010
31 mars 2009 à 19:21
Ok Bacterius.

Pour ton tutorial, fait le moi savoir, çe seras avec plaisir de le lire et d'en tirer des choses interressantes.
merci
0
Rejoignez-nous