Bonjour,
J'aurais voulu savoir comment prendre une valeur qui se situe dans un bloc-note?
J'ai regarder dans la FAQ, mais ne se trouve que l'insertion ou la modification du nom du fichier... ou devrais-je aller voir l'Oculiste
Merci d'avance
Bonjour,
J'aurais voulu savoir comment prendre une valeur qui se situe dans un bloc-note?
J'ai regarder dans la FAQ, mais ne se trouve que l'insertion ou la modification du nom du fichier... ou devrais-je aller voir l'Oculiste
Merci d'avance
la première chose à comprendre, c'est que le bloc-notes est une application qui permet de visualiser un fichier texte
Ce que tu cherches à faire, c'est donc prendre une valeur qui se situe dans un fichier texte !
partant de cette base, refait une recherche avec fichier texte dans la FAQ et tu trouveras ton bonheur ! Amuse toi bien !
Pas forcement, il arrive parfois que l'on utilise le bloc-note comme un bloc-note justement, simplement pour taper du texte sans vouloir l'enregistrer par la suite.Envoyé par -Sylvain Leray-
Voilà un petit exemple, que tu pourras surement améliorer.
Au lieu de boucler sur les controles, tu peux utiliser GetDlgItem() mais j'avais la flemme de chercher l'identifiant du TEdit
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 procedure TForm1.Button1Click(Sender: TObject); var hNotepad, hEdit: HWND; classe : array[0..255] of Char; buffer: pChar; tailleBuffer: integer; begin hNotepad := FindWindow ('Notepad', nil); // on recherche la fenêtre de notepad if hNotepad = 0 then // si il n'est pas lançé, on quitte begin ShowMessage('Notepad n''est pas lancé!'); exit; end; hEdit := GetWindow(hNotepad, GW_CHILD); // maintenant on récupère le handle du premier controle while hEdit <> 0 do // on boucle sur tous les controles de la fenêtre begin if GetClassName(hEdit, classe, SizeOf(classe)) > 0 then // on recupère la classe du controle begin if UpperCase(StrPAS(classe)) = 'EDIT' then // si c'est un EDIT, donc notre Editeur begin tailleBuffer := SendMessage(hEdit,WM_GETTEXTLENGTH,0,0); //on récupère la longueur du texte if tailleBuffer<>0 then // si la taille du texte est supérieur à 0 begin GetMem(buffer,tailleBuffer+1); //on alloue la mémoire en rajoutant 1 pour le Zéro terminal try SendMessage(hEdit,WM_GETTEXT,tailleBuffer+1,Integer(buffer));//on recupère le texte memo1.Text := buffer; // et on affiche le texte finally FreeMem(buffer); //puis on libère la mémoire end; end else ShowMessage('Aucun texte trouvé dans le notepad!'); break; // on quitte la boucle end; end; hEdit := GetWindow(hEdit, GW_HWNDNEXT); // sinon on passe au controle suivant end; end;
Salut
Pourquoi n'écris-tu pas un équivalent de Notepad (avec un TMemo) ? tu aurais plus facilement la main dessus et cela t'éviterais des joyeusetés comme tu les as montré (c'est pas humain), néanmoins je reconnais que ton exemple de code est intéressant. Quelle est ton intention ?
Il y a quelques temps, une personne cherchait un tel code et personne n'a été en mesure de lui fournir (je suis inclus dans le lot), c'est donmage !
cdlt
e-ric
Personnellement je n'ai pas vu passer ce post mais si cette personne repasse par là, elle trouvera la réponse toute prête, c'est l'avantage d'un forumEnvoyé par e-ric
Sinon je suis assez d'accord avec e-ric, pourquoi ne réécris-tu pas ton propre notepad?
Voilà, une version un peu optimisée, en faisant un callback des controles de notepad avec GetDlgCtrlID(), j'ai trouvé l'ID de l'EDIT qui est 15, avec ça, on peu réduire le code à ceci
Théoriquement l'ID devrait être le même pour tous les notepad, j'ai fait le test avec plusieurs fenêtres du notepad et ça marche parfaitement mais c'est sur le même PC donc à vérifier.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 procedure TForm1.Button1Click(Sender: TObject); var hNotepad, hEdit: HWND; buffer: pChar; tailleBuffer: integer; begin hNotepad := FindWindow ('Notepad', nil); // on recherche la fenêtre de notepad if hNotepad <> 0 then // si il est pas lançé on récupère le handle de l'editeur begin hEdit := GetDlgItem(hNotepad, 15); // 15 est l'identifiant de l'editeur dans Notepad tailleBuffer := SendMessage(hEdit,WM_GETTEXTLENGTH,0,0); //on récupère la longueur du texte if tailleBuffer<>0 then // si la taille du texte est supérieur à 0 begin GetMem(buffer,tailleBuffer+1); //on alloue la mémoire en rajoutant 1 pour le Zéro terminal try SendMessage(hEdit,WM_GETTEXT,tailleBuffer+1,Integer(buffer));//on recupère le texte memo1.Text := buffer; // et on affiche le texte finally FreeMem(buffer); //puis on libère la mémoire end; end end else ShowMessage('Notepad n''est pas lancé!'); end;
J'ai essayé sur mon PC, et ça marche aussi, donc je pense que tu as visé juste
Impressionnant..... que dire de plus.
Ca marche Niquel.
Le seul hic, c'est que le bloc note doit etre ouvert, je vais donc chercher de ce pas comment ouvrir un fichier texte.
Pour info, le but de mon appli etait : stocké sur un serveur, l'appli crée des Freereport qui s'imprime suivant le jour placer dans mon bloc-note.
Merci
Quand on voit ça, on se dit qu'on a encore un sacré chemin à faire avant d'être au top de la programmation en delphi.
Merci lil_jam63 pour cette belle leçon. C'est du grand art. Je voulais le souligner.
Didier
Trop fort ! Impressionnant ! Magnifique ! Superbe !
J'ajouterais même que cette méthode à sa place dans la FAQ
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager