(dotNet) réception de données vers une textbox

stgi02
(dotNet) réception de données vers une textbox

bonjour,
est que quelqu'un pourrait m'aider, je m'expique:
je suis sur un projet qui permet de réaliser un genre d'hyper terminal
j' ai un fichier Form1.h[design] j' ai mis mon formulaire et une textbox,..,. j'ai un fichier Form1.h et aussi un fichier serial.cpp oû j' ai mis toute la programmation du port série, l'émission fonctionne ainsi que la réception mais mon problème est ici j' aimerai envoyer les données réceptionnées dans ma textbox ,mais je ne vois pas comment faire

dans le fichier serial.cpp j'ai utilisé la fonction suivante:

BYTE buf [4096];
ReadFile(hComm, &buf, dwtoRead, &dwRead, &ov);//les données sont reçues dans buf

je prog sur visual studio.net 2003 en c++

merci bcp de bien vouloir m'aide

fredericmazue

Bonsoir,

Avant de commencer et si je puis me permettre, il est sans doute mieux de lire les octets un à un depuis le port série.

Maintenant quel est ton problème exactement ? D'écrire les octets lus dans la TextBox ? Si c'est ça il faut d'abord filter tous les caractères indésirables. Par exemple un octet nul ou un retour chariot qui n'aura pas la même valeur dans la textBox que pour le périphérique connecté au port. Cette opération est d'ailleurs plus simple en lisant les octets un par un

Après ça un des constructeurs de la classe .Net String devrait faire ton affaire.

Après c'est tout simple

String s = ...

textBox1.AppendText(s);

stgi02

au fait je suis dans en stage et on m'a imposé de faire de la façon que j' ai décris

est ce que sait possible d'envoyer les données vers la textbox depuis le fichier serial.cpp , c' est ça qui bloque

merci de m'aider

stgi02

on m'a conseillé d'utiliser SendMessge et wndProc
qu'en pensez-vous?

fredericmazue

J'en pense qu'il faut savoir ce que tu fais. Le sais tu ? A te lire on dirait que tu mélanges les torchons et les serviettes.

Tu parles maintenant de SendMessage et de WndProc. Ca ce sont des API Win 32 pour les contrôles Edit Win32 et d'un autre côté tu parles de form1.h et de TextBox ce que à priori sous Visual 2003 j'interprète comme du C++ managed.

Les deux ne font pas vraiment bon ménage ensemble. Faut choisir. Ou tu fais du Win32 ou du C++ Managé Ou alors tu passes à Visual 2005 et C++/CLI qui te permet de mélanger les deux, mais c'est encore autre chose, mais pas forcément idiot nonplus car là la classe SerialPort est un vrai bonbon.

Si tu es en Win32 (C++ natif) alors SendMessage est nécessaire et suffisant, tu peux laisser WndProc à priori. En ce qui concerne le contôle Edit je veux dire.
Si tu es en C++ managé sur la plate forme .net alors tu fais comme dit dans mon premier message.

stgi02

oui j'aimerai utiliser sendmesage et wndproc
mais j'ai du mal a comprendre comme il fonctionne l'un et l'autre

fredericmazue

Comme tu sembles être en .Net (tu as dit "form1.h[design]) ce n'est pas la bonne démarche et je crains que tu ne te heurtes à de nombreuses difficultés inutilement.

SendMessage est une API Win32 (et donc pas .Net) qui notifie les événements aux fenêtres et contrôles (qui sont aussi des fenêtres)
Pour écrire dans le contrôle Edit sous jacent à la TextBox il faut lui envoyer un message WM_CHAR comme ceci:

SendMessage(Handle_du_controle,
WM_CHAR, // défini dans windows.h
octet_a_ecrire,
NULL);

WndProc concerne les procédures de fenêtre. le contrôle en a déjà une et celle-ci va afficher le caractère. Tu peux donc oublier WndProc pour ce que tu as à faire.

Voilà, mais je n'assure pas le service après vente

stgi02

bonjour,
pour l'envoi j'ai effectué :
SendMessage ( handle_textbox,WM_CHAR,WPARAM(buf),NULL);
j'ai cherché mais je ne rien trouvé concernant la récupération du handle de la textbox je ne sais pas si c'est possible??

merci

fredericmazue

>pour l'envoi j'ai effectué :
> SendMessage ( handle_textbox,WM_CHAR,WPARAM(buf),NULL);

Et comment as tu pu sans le Handle ?? :twisted:
Et tu sais, ta ligne de code elle est déjà fausse!

> WPARAM(buf),

Là tu envoies le pointeur sur le tableau d'octets au lieu d'envoyer un caractère.
Pourquoi diable t'entêtes tu dans cette voie piégée ?

> j'ai cherché mais je ne rien trouvé concernant la récupération du
> handle de la textbox je ne sais pas si c'est possible??

J'ai répondu à ton autre question concenrant le Handle sur sur ce forum....

stgi02

pour le handle ça ne fonctionne pas j'ai essayé plein de choses....
qu est ce que je dois mettre à la place de WPARAM(buf) j'ai vu ça sur le net...

il ne faut pas oublié que je suis dans le fichier serial.cpp et que ma textbox est dans Form.h ,il faut peut être que déclare une variable global tels que static .... ??

fredericmazue

> pour le handle ça ne fonctionne pas

Bien sûr que si...

> qu est ce que je dois mettre à la place de WPARAM(buf) j'ai vu ça sur
> le net...

Et sur le net comme tu dis quel est le type de buf ?
Moi je me suis basé sur les bouts de code que tu as donné avant et dans ce cas tu dois mettre

(WPARAM)buf[0]

> il ne faut pas oublié que je suis dans le fichier serial.cpp et que ma
> textbox est dans Form.h ,il faut peut être que déclare une variable
> global tels que static .... ??

Mais non
#include dans serial.cpp
suffira amplement

Tu sais, tu t'entêtes dans ta démarche et tu vas rencontrer mille autres difficultés je le crains. Pardonne moi mais je pense que je n'aurais pas le temps de continuer à t'aider

stgi02

ok je vais faire comme tu dis mais mon seul problème est de récupérer le handle car je dois le passer a SendMessage et aprés j'espère que ça marchera car ça fait une semaine que je suis bloqué et oû je suis il n'y personne qui peut m'aider à part ce forum

merci

fredericmazue

> ok je vais faire comme tu dis mais mon seul problème est de récupérer
> le handle car je dois le passer a SendMessage

Oh que non tu ne fais pas comme je te dis. Moi je t'ai dis jusqu'à l'essoufflement de ne pas t'entêter avec SendMessage qui est à contre-emploi ici.
En plus je t'ai dit comment récupérer le Handle en réponse à un de tes autres messages. Alors je répète

SendMessage(textBox1.Handle,
WM_CHAR, // défini dans windows.h
octet_a_ecrire,
NULL);

Je ne peux pas être plus clair.
> et aprés j'espère que ça marchera

Je ne voudrais pas te décourager mais je crains que tu ne te heurtes à d'autres problèmes.

> car ça fait une semaine que je suis bloqué

Pour la dernière fois, tu n'abordes pas, mais alors pas du tout, le problème sainement.

> et oû je suis il n'y personne qui peut m'aider à part ce forum

Et je commence à fatiguer aussi. Tu sais, demander de l'aide sur un forum, c'est une chose. Mais ne pas tenir compte des réponses et même ajouter à propos de ce qu'on a pu te dire: "ça ne fonctionne pas", ça use les patiences...

stgi02

je sais que je suis débutant mais si je demande comment il faut faire pour récupérer le handle du textbox c'est que si je fais ça:

SendMessage(textBox1.Handle,
WM_CHAR, // défini dans windows.h
octet_a_ecrire,
NULL);

il y a une erreur pour textBox1.Handle , il n' est pas connu , même si
#include "Form1.h"

fredericmazue

> je sais que je suis débutant mais si je demande comment il faut faire
> pour récupérer le handle du
> textbox c'est que si je fais ça:

Que tu sois débutant c'est une chose. Nous avons tous débuté un jour et c'est même pour cela que je t'aide. Enfin que j'essaie de t'aider...

J'essaie d'expliquer au débutant que tu es, que tu mélanges la programmation Windows native Win32 et la programmation .Net
L'un et l'autre, surtout la première sont difficiles. Si tu mélanges les deux tu élèves le niveau de difficulté au carré. Mais tu ne veux pas m'écouter.
Je me tue à te dire que SendMessage concerne la programmation Win32 (Windows native) et que tu as tort de t'acharner à vouloir t'en servir dans une Form .Net. Dès ma première réponse je t'ai dit comment faire en .Net. Il y a deux lignes de code.
Tu veux faire autrement pour une raison qui te regarde. Pourquoi pas ? Mais dans ce cas il est normal que tu te retrouves seul à gérer des problèmes que tu as insisté à générer. Pourquoi veux tu à tout prix passer par SendMessage, voilà qui est pour moi un mystère.

> il y a une erreur pour textBox1.Handle , il n' est pas connu , même si

Moi j'ai dit textBox1, parce que j'ai supposé qu'il s'appelait comme ça ton TextBox. Si tu en as plusieurs sur ta Form ou si tu as fait des modifs en cours de design, peut être bien qu'il s'appelle textBox2 ou textBox3 ou encore autre chose. c'est à toi de voir à ce niveau là.

stgi02

au faite dans mon projet j'utilise les fonctions writeFile et ReadFile,.. pour gérer le prot c'est de la programmation Win32
en ce qui concerne sendmessage et Wndproc c'est mon responsable qui m' a dit d'utiliser cette méthode, c'est pour cela que j'essaye de le faire..
j' aurai plus d'info la semaine prochaine

pour le handle de la textbox
j' ai pensé à faire dans le form1.h
HWND_hf = textbox1->handle();
mais je ne sais pas si je suis sur le bon chemin?

merci

fredericmazue

> au faite dans mon projet j'utilise les fonctions writeFile et ReadFile,..
> pour gérer le prot c'est de la
> programmation Win32

C'est exact. Il se trouve qu'en .Net on ne peut pas ouvrir le port série comme un flux classique .Net (enfin ce que je dis là est vrai en 2.0, je ne me souvient plus en 1.1 (Visual 2003)). On est donc plus ou moins obligé de faire comme ça, ce qui apporte mille contrariétés. Mais qu'on soit obligé de sortir les API Win32 pour lire/écrire dans le port, ne veut pas dire qu'on doive continuer à le faire pour écrire dans une TextBox pour plein de raisons. Ou alors dans ce cas, autant tout faire en Win32 ça ira même mieux et plus vite

> en ce qui concerne sendmessage et Wndproc c'est mon responsable qui
> m' a dit d'utiliser cette
> méthode,

Il a tort. :twisted:

> c'est pour cela que j'essaye de le faire..

Je comprends. tu aurais pu le dire tout de suite.
Dis à ton responsable qu'il aurait intérêt à upgrader vers Visual 2005 qui permet de développer un hyperterminal en une demi-heure, et encore en prenant le temps d'un petit café.

> HWND_hf = textbox1->handle();
> mais je ne sais pas si je suis sur le bon chemin?

Oui et non. si textBox1 est un pointeur alors c'est

textBox1->Handle;

sans les parenthèses car Handle est une propriété, pas une méthode.

Ceci posé tu vas avoir un problème de type à gauche du signe = justement à cause du mélange Win32/Net

Parce qu'en .Net le Handle est de Type IntPtr que le compilateur ne vas pas forcément accepter de convertir comme ça.
Alors tu sera peut être obligé d'écrire:

HWND_hf = (HWND)(textbox1->handle);

Mais vraiment tu aurais à l'écrire complètement en Win32 ton appli. Vraiment. Tu es sûr que ton responsable sait que tu es en .Net ? Peut être qu'il croit que tu es en Win32. Il aurait alors raison pour SendMessage

stgi02

il a réussi à envoyer dans la textbox avec les methodes wndProc et senMessage il va me le montrer mardi..

pour l'instant je vais essayer le handle de la textbox.

merci de ton aide

stgi02

j' ai essayé pour le handle, j' ai fais:

static HWND_hf; //je l'ai déclaré comm ça je peux l'attiendre de partout

HWND_hf = (HWND)(textBox1->Handle);

quand je compile il y à une erreur :
impossible de convertir de'system::IntPtr':: en 'HWND'

fredericmazue

Heu oui, c'est de ma faute, j'en ai oublié un petit bout (je fatigue :P )

Mais ça illustre les problèmes de types entre Win32 et .Net :twisted:

Bon essaie ça, le compilateur devrait le gober:

HWND_hf = (HWND)((textBox1->Handle).ToInt32());

> static HWND_hf; //je l'ai déclaré comm ça je peux l'attiendre de partout

Ca par contre c'est n'importe quoi. D'abord où est le type ?
Ensuite l'atteindre de partout ça ne veut rien dire et c'est contraire à la philosophie de la programmation objet :cry:

Bon je crois que j'ai bien mérité mon week end moi :P

stgi02

bonjour,
le handle fonctionne, super!
quand j'utilise SetWindowText pour écrire dans la textbox à patir du Form1.h ça fonctionne mais si je l'effectue dans le fichier serial.cpp ça ne marche pas??
pourtant j'ai inclu le Form1.h dans le fichier serial.cpp

merci

fredericmazue

> le handle fonctionne, super!

Il n'y a rien de super dans cette façon de procéder :cry:

> quand j'utilise SetWindowText

SetWindowText est un API qui est un raccourci équivalent de SendMessage.

> pour écrire dans la textbox à patir du Form1.h ça fonctionne mais si je
> l'effectue dans le fichier serial.cpp ça ne marche pas??

Comment veux tu qu'il soit possible de t'aider avec une question pareille...
Tu ne montr epas de coe, tu ne dit pas si le compilateur émet une erreur, tu ne dis rien....

Bon, je suis content que tu ais eu satisfaction avec ton Handle.
Au stade où tu en es il me paraît opportun que tu demandes des conseils à ton responsable. Bonne continuation