Bug avec le Tcomport

esigvb Messages postés 24 Date d'inscription mercredi 16 mars 2005 Statut Membre Dernière intervention 25 mars 2009 - 11 mai 2006 à 11:54
DeltaFX Messages postés 449 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 8 avril 2009 - 12 mai 2006 à 23:06
Bonjour,
Voilà mon problème, j'ai réalisé une application qui fonctionne très bien. Elle utilise le composant Tcomport.

Le bug apparait quand je lance le "Clavier visuel" de windows. J'ai une erreur "Unable to open com port (win error code:5)".

Si quelqu'un a déjà rencontré ce problème, ou si quelqu'un sait comment éviter le problème (encore mieux), alors je vous écoute.

Merci d'avance pour votre aide...

13 réponses

esigvb Messages postés 24 Date d'inscription mercredi 16 mars 2005 Statut Membre Dernière intervention 25 mars 2009
11 mai 2006 à 11:59
Bonjour,

Pour être plus précis, le bug arrive quand: le "Clavier visuel" de windows est déjà lancé, et que je lance mon application après.

Merci d'avance pour votre aide...
0
cs_jfs59 Messages postés 178 Date d'inscription mardi 29 avril 2003 Statut Membre Dernière intervention 2 février 2010
11 mai 2006 à 12:35
Un petit bout du code ... sinon on est pas devin ...

Cordialement jfs.
<hr size="2" width="100%">
Tout est en tout et réciproquement ...
0
esigvb Messages postés 24 Date d'inscription mercredi 16 mars 2005 Statut Membre Dernière intervention 25 mars 2009
11 mai 2006 à 13:21
Le bug apparait des qu'il y a le composant Tcomport dans un programme, et que le "Clavier visuel" de windows est déjà lancé.
Mais voila le code, j'ai juste mis le composant Tcomport sur la form, et ouvert le comport à la création de la form, on ne peut vraiment pas faire plus simple.



unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, CPort;

type
TForm2 = class(TForm)
ComPort1: TComPort;
procedure FormCreate(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;

var
Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.FormCreate(Sender: TObject);
begin
ComPort1.Open;
end;

end.


Merci pour votre aide
0
Utilisateur anonyme
11 mai 2006 à 15:04
Salut,

Vu la simplicité du code il me semble évident que tu ne peux ouvrir deux fois ton clavier visuel. Alors pourquoi ne pas le fermer quand tu fermes l'application ??

A+
0

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

Posez votre question
esigvb Messages postés 24 Date d'inscription mercredi 16 mars 2005 Statut Membre Dernière intervention 25 mars 2009
11 mai 2006 à 15:25
Salut Francky23012301,

Je ne veux pas lancer deux fois le clavier visuel. Le code que j'ai mis cause aussi le bug comme mon programme plus complexe.

Ce que je recherche, c'est pourquoi j'ai l'erreur "Unable to open com port (win error code:5)", alors que j'ai simplement ouvert le clavier visuel de windows, et lancé ensuite un programme en delphi avec le composant Tcomport.
Et enfin comme résoudre ce problème.

Vous pouvez essayé chez vous, il suffit de :
1) lancer le clavier visuel (démarrer>Tous les programmes>Accessoires>Accessibilité>Clavier visuel)
2) lancer un programme delphi qui contient le composant Tcomport (Comme l'exemple que j'ai donné)

Et après ça vous aurez :
"Unable to open com port (win error code:5)"

Aidez moi SVP!!!
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
11 mai 2006 à 15:31
Le clavier visuel scrute les ports COM à la recherche d'un eventuel périphérique qui permettrai de selectionner une lettre.
Donc, si ma logique est bonne, c'est incopatible avec ton programme.

J'espère juste que je me trompe.

++

Si tu ne te plantes pas ......
tu ne pousseras jamais
0
esigvb Messages postés 24 Date d'inscription mercredi 16 mars 2005 Statut Membre Dernière intervention 25 mars 2009
11 mai 2006 à 15:37
Salut florenth,

Si le clavier visuel scrute les ports COM, comme faire pour fermer ce programme. Car quand je lance le clavier visuel après mon programme en delpi, il n'y a pas de problème.

Il ne reste plus qu'a trouver comment fermer le programme osk.exe(clavier visuel) qui est dans le dossier system32.

Merci pour votre aide...
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
11 mai 2006 à 15:40
Normalement, il suffit de faire ça :

<hr size="2" width="100%">var
H: THandle;
begin
H := FindWindow(nil, 'Clavier visuel');
if H <> 0 then
SendMessage(H, WM_CLOSE, 0, 0);
end;
<hr size="2" width="100%">J'ai pas testé mais ça devrait être ça.

++

Si tu ne te plantes pas ......
tu ne pousseras jamais
0
esigvb Messages postés 24 Date d'inscription mercredi 16 mars 2005 Statut Membre Dernière intervention 25 mars 2009
11 mai 2006 à 15:55
Merci beaucoup florenth,

Ton code marche bien, mais j'ai dû mettre un sleep, pour éviter d'avoir le problème. Voici le code:

procedure TForm2.FormCreate(Sender: TObject);
var
H: THandle;
begin
H := FindWindow(nil, 'Clavier visuel');
if H <> 0 then SendMessage(H, WM_CLOSE, 0, 0);
Sleep(100);
ComPort1.Open;
end;


C'est bien, ça permet d'éviter l'erreur. Il y a t il quelque chose d'autre à faire, comme par exemple modifier le composant (si oui quoi?) pour éviter de bidouiller, car je ne sais pas s'il le composant bug avec d'autres logiciels.

Merci de ton aide florenth, et si il y a d'autres proposition, je suis preneur.
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
11 mai 2006 à 16:37
En gros, ça bugge s'il y a un conflit entre l'utiisation du port COM.
A mon avis, chaque appli qui utilise le port COM devrait vérifier s'il n'est pas déjà utilisé et si et seulement si c'est le cas, alors elle peut s'en sevir.
Dans le cas contraire, elle se ferme ou ignore cette possibilité (cas je pense du clavier visuel).

++

PS: pour le sleep() c'est normal car le temps que la fenetre recoive le message Windows de fermeture (qui est sur une file donc FIFO), ton appli à déjà executé l'autre instruciton (c'est ça le problème de synchro entre les threads)

Si tu ne te plantes pas ......
tu ne pousseras jamais
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
11 mai 2006 à 17:50
salut,

en fait tu essayes d'ouvrir un port qui est déjà ouvert tu peux intercepter l'exception pour traiter le problème

pour remplacer le sleep tu dois pouvoir aussi faire

while FindWindow(nil, 'Clavier visuel')<>0 do Application.processmessages.

tu peux aussi choisir un autre port Com.



@+

jlen
0
esigvb Messages postés 24 Date d'inscription mercredi 16 mars 2005 Statut Membre Dernière intervention 25 mars 2009
12 mai 2006 à 08:13
Bonjour,
Merci a tous pour votre aide. En effet le clavier visuel de windows doit utiliser le COM1, je ne sais pas pourquoi, mais il l'utilise.
Je pense que la meilleur solution est d'intercepter l'exception, comme a dit Jlen100. Mais comment le faire, et où le faire.

Merci pour votre aide.
0
DeltaFX Messages postés 449 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 8 avril 2009 2
12 mai 2006 à 23:06
Bon ben esigvb, t'as plus qu'a coder ton propre clavier virtuel, ouala.....

:p
0
Rejoignez-nous