banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Thu 05 April 2007 12:09

Carreau
Participant occasionnel
Lieu: Paris
Date d'inscription: 13 Jan 2006
Messages: 29
Site web

callback et barre d'outils dans un client VB

bonjour,

J'ai un client ActiveX VB avec un OLE vers Mapinfo dans un PictureBox et des outils Mapinfo dans une barre d'outils.

Hors, pour pouvoir utiliser un outil Mapinfo qui fait appel au CallBack, il faut d'abord que je "titille" la carte avec le pointeur pour que l'outil devienne opérant, même si mon client rend actif cet outil par défaut.
L'outil Mapinfo est appellé par un

Code:

oMi.RunMenuCommand M_TOOLS_RECENTER

(Si je crée un autre outil VB perso qui lance une commande contre Mapinfo par un

Code:

oMI.Do "Run Menu Command ID xxxx"

, cela ne se produit pas.).

C'est génant pour l'utilisateur final.
Avez vous déjà rencontré ce problème ?
Avez vous une astuce ?
Merci de vos remarques et suggestion.
Jérôme

Hors ligne

 

#2 Thu 05 April 2007 12:22

Maurice
Membre
Lieu: Montpellier
Date d'inscription: 5 Sep 2005
Messages: 5331

Re: callback et barre d'outils dans un client VB

Bonjour,
Je suis incompétent sur le sujet mais je propose à tout hasard de remplacer
oMi.RunMenuCommand M_TOOLS_RECENTER
par
oMI.Do "Run Menu Command ID 1702"  (ou oMi.RunMenuCommand ID 1702)
et de voir si la carte a toujours besoin d'être titillée ??

Hors ligne

 

#3 Thu 05 April 2007 12:39

Carreau
Participant occasionnel
Lieu: Paris
Date d'inscription: 13 Jan 2006
Messages: 29
Site web

Re: callback et barre d'outils dans un client VB

mille excuses pour ce petit correctif : quel que soit l'outil (Mapinfo ou perso), il faut d'abord "titiller" la carte une première fois pour rendre opérationnel un outil

Hors ligne

 

#4 Thu 05 April 2007 20:18

ChristopheV
Membre
Lieu: Ajaccio
Date d'inscription: 7 Sep 2005
Messages: 3199
Site web

Re: callback et barre d'outils dans un client VB

Bonjour,

Je ne connais pas MI mais je pense que le pb que vous évoquez est plus d'aspect VB (peut-être même windows) . Il faut  indiquer au programme quelle est la fenêtre active (celle qui a le focus) pour que les evenmenets clavier et souris soient intrprétés.

Un picture1.setfocus après le click sur la barre d'outil n'est-il pas réalisable ?

A+

Christophe


Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close

Hors ligne

 

#5 Tue 10 April 2007 13:07

Carreau
Participant occasionnel
Lieu: Paris
Date d'inscription: 13 Jan 2006
Messages: 29
Site web

Re: callback et barre d'outils dans un client VB

merci Christophe pour votre suggestion, hélas elle ne fonctionne pas (ce qui ne veut pas dire qu'elle soit mauvaise)
j'ai reecri les outils par des fonctions ad'hoc qui font appel plus explicitement à l'objet de la classe callback %IRESPONDER et cela fonctionne (c'est un peu lourd d'avoir à réinventer les outils Pan Zoom+ Zoom-)
Je crois que c'est bien un problème d'objet OLE de Mapinfo qui doit ne pas être trop solide lorsque le client devient compliqué, ce qui n'est en contradiction avec votre suggestion

Hors ligne

 

#6 Tue 10 April 2007 13:38

ChristopheV
Membre
Lieu: Ajaccio
Date d'inscription: 7 Sep 2005
Messages: 3199
Site web

Re: callback et barre d'outils dans un client VB

Bonjour,

J'avoue que je suis "léger" sur la notion de callback, (en VB je préfère les éviter ou trouver du tout fait).
J'ai pu avoir un extrait de la doc (en anglais) de la liaison VB MI (merci !) par le biais de l'integrated mapping.

Un extrait de ceci:

<<You control the appearance of the Integrated Mapping application. If you want, you can create a user interface that is radically different from the MapInfo user interface.>>

c'est ce que vous faites ?

<<When you integrate a map into your program, the user sees a genuine MapInfo Map window--not a bitmap, metafile, or any other type of snapshot.>>

Mais il est précisé plus loin que cette fenêtre peut-être "réaparentée" (edit : au sens de MDI fille, donc une fenêtre windows classique ), donc on doit pouvoir récupérer le handle de la fenêtre 
et donc utiliser les API Windows depuis l'activeX pour rendre la fenêtre active en envoyant le message qui va bien ?

Mais je pense que votre analyse est juste c'est un pb de conversation DDE.

A+

Christophe

Dernière modification par DIANA2D.dev (Tue 10 April 2007 13:43)


Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close

Hors ligne

 

#7 Tue 10 April 2007 14:40

jasper
Participant occasionnel
Lieu: Paris
Date d'inscription: 7 Mar 2007
Messages: 44

Re: callback et barre d'outils dans un client VB

Bonjour.

J'ai quelquefois utilisé les liaisons OLE entre VB et MapInfo sans soucis particuliers, voici un exemple à mon initialisation de formulaire VB (ce que je pense vous faites bien):

Dim CanalOLE As Object
Dim IdWin As Integer

Private Sub Form_Load()
'Carte est le picturebox devant contenir la fenêtre carte
'Form1 mon formulaire contenant le PictureBox Carte
    Set CanalOLE = CreateObject("MapInfo.Application")
    CanalOLE.do "Set Application Window " & Form1.hWnd
    CanalOLE.do "Set Window Info Parent " & Form1.hWnd
    CanalOLE.do "Set Window Ruler Parent " & Form1.hWnd
    CanalOLE.do "Set Window Legend Parent " & Form1.hWnd
    CanalOLE.do "Set Next Document Parent " & Carte.hWnd & " Style 1"
    CanalOLE.do "Open Table ""C:\toto.tab"" as toto"
    CanalOLE.do "Map from toto"
    CanalOLE.do "Set Map Zoom Entire"
    IdWin = Val(CanalOLE.eval("FrontWindow()"))
End Sub

Par la suite, aucun soucis rencontré pour ma part à devoir "titiller" la carte avec des run menu command; il faut juste faire attention à bien conserver la fenètre active, sans hésiter à utiliser 'Set Window IdWin Front'...

En espérant avoir fait avancer le sujet...

Jasper.

Hors ligne

 

#8 Tue 10 April 2007 16:27

ChristopheV
Membre
Lieu: Ajaccio
Date d'inscription: 7 Sep 2005
Messages: 3199
Site web

Re: callback et barre d'outils dans un client VB

Je ne sais pas pour notre amis Carreau, mais pour ma part merci pour le bout de code.

Ceci dit Je ne vois pas l'utilisation du pictureBox dans le code.

Donc la fenêtre est "activable" "depuis" MI par "Set Window IdWin Front", et par le code VB. Si j'ai bien compris, il suffit d'indiquer à l'instance de MI quel est le hwnd de la fenêtre, le hdc du picturebox,  pour qu'il sache où "mapper".

Par contre est-il possible de récupérer les données MI sous VB à l'aide d'un modèle objet que l'on peut inclure en référence dans un projet VB ? (j'ai cru comprendre que non )

Christophe.


Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close

Hors ligne

 

#9 Tue 10 April 2007 17:12

jasper
Participant occasionnel
Lieu: Paris
Date d'inscription: 7 Mar 2007
Messages: 44

Re: callback et barre d'outils dans un client VB

Le picturebox (nommé 'carte' dans mon exemple) est utilisé à la ligne suivante :
CanalOLE.do "Set Next Document Parent " & Carte.hWnd & " Style 1"
(l'handle de la fenêtre est ainsi parenté au picturebox)

Lorsque certaines instructions MapBasic font perdre le focus de "ma" fenêtre sous MapInfo, je la réactive effectivement avec la ligne suivante :
CanalOLE.do "Set Window " & IdWin & " Front"

Par contre pour récupérer les données d'une table MapInfo, de mémoire, je passe par :
Dim StrValue As String
StrValue = CanalOle.Eval("nomtable.nomcolonne")
(sans oublier les CanalOle.Do "Fetch ..."  qui vont bien)

Dans le même ordre d'idée, il est également possible de communiquer entre VB et directement un programme MapBasic "mbx" (et plus comme ici uniquement avec MapInfo), pour simplifier le codage MB assez lourd dans l'encapsulation et le debuggage (par exemple VB envoie l'ordre d'execution d'une procédure du programme MapBasic préalablement chargé sous MapInfo). Au besoin, je peux joindre un sample VB/MB (je ne pense pas avoir été très clair dans mon explication ;-))...

Mais il ne s'agit pas, là encore, de la structure d'un modèle objet que l'on peut inclure en référence : il faut plutôt se pencher vers MapX (Windows), ou encore MapXtreme (.Net ou Java)... mais il s'agit d'un autre sujet/monde...

Jasper.

Hors ligne

 

Pied de page des forums

Powered by FluxBB