Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
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 Mon 27 April 2009 11:01

régisj
Participant occasionnel
Date d'inscription: 3 Dec 2007
Messages: 49

WinclosedHandler et Close Table

Bonjour,
Dans un programme Mapbasic, je souhaiterais pouvoir fermer une ou plusieurs tables quand je ferme une fenêtre carte qui les contient.
Pour cela, j'utilise un Sub WinClosedHandler qui comprend une instruction "Close Table MATABLE", mais Mapinfo (9.5 et 7.8) plante sur cette instruction une fois sur deux...
Quelqu'un a-t-il déjà rencontré ce problème?

Hors ligne

 

#2 Mon 27 April 2009 11:17

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

Re: WinclosedHandler et Close Table

Bonjour
Il faudrait voir le code...
Mais peut être faut il introduire quelque chose genre:
  closed_id = CommandInfo(CMD_INFO_WIN)
  If closed_id = mapper_id  Then
    Close Table MATABLE
  End If

Hors ligne

 

#3 Mon 27 April 2009 11:59

régisj
Participant occasionnel
Date d'inscription: 3 Dec 2007
Messages: 49

Re: WinclosedHandler et Close Table

Voici le code que j'ai réécrit pour le sortir du contexte de mon programme :

Code:

Include "mapbasic.def"
Declare Sub main
Declare Sub WinClosedHandler
Dim AliasTable(1),Chemin(1) as string
Dim Nbcouches,i_win_type,WinId,i,Nbtable as integer
'**********************************************************
'**********************************************************
Sub main
open window message
print chr$(12)
End sub
'**********************************************************
'**********************************************************
Sub WinClosedHandler
    if Frontwindow()<>0 then
    WinId=Frontwindow()
    i_win_type=WindowInfo(WinId,WIN_INFO_TYPE)
        If i_win_type=WIN_MAPPER then
        Nbcouches=MapperInfo(WinId,MAPPER_INFO_LAYERS)
        redim Chemin(Nbcouches)
        redim AliasTable(Nbcouches)
            For i=1 to Nbcouches
            Chemin(i)=LayerInfo(WinId,i,LAYER_INFO_PATH)
            AliasTable(i)=LayerInfo(WinId,i,LAYER_INFO_NAME)
            print AliasTable(i) 
            Next
            For i=1 to Nbcouches
             Close table AliasTable(i)
            Next
        End if
    End if
End sub
'**********************************************************
'**********************************************************

Hors ligne

 

#4 Mon 27 April 2009 14:25

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

Re: WinclosedHandler et Close Table

Et c'est ce code (ici transposé) qui provoque le plantage ?? En plus une fois sur deux (précisemment ?) !
Dans ce cas une solution est de faire l'inventaire des tables (celui des chemins me paraît superflu, à vous de voir...) et de simplement faire un Close Window ... , suivi d'un Close table dans une boucle, sans recourir à WinClosedHandler

Hors ligne

 

#5 Mon 27 April 2009 17:08

régisj
Participant occasionnel
Date d'inscription: 3 Dec 2007
Messages: 49

Re: WinclosedHandler et Close Table

En fait lorsqu'il n'y a qu'une seule table dans la fenêtre carte, cela fonctionne toujours ... mais si il y a plusieurs tables, ça marche une fois, voir deux mais pas plus... je crois que je vais me contenter d'un message d'avertissement pour indiquer à l'opérateur les tables inutilisées pouvant être fermées! merci tout de même. bonne fin de journée.

Hors ligne

 

#6 Tue 28 April 2009 10:51

Richard Lohier
Participant occasionnel
Lieu: Le perray en yvelines
Date d'inscription: 13 Nov 2006
Messages: 28

Re: WinclosedHandler et Close Table

régisj a écrit:

... je crois que je vais me contenter d'un message d'avertissement pour indiquer à l'opérateur les tables inutilisées pouvant être fermées!


Bonjour,

Il y a effectivement un risque dans l’utilisation de WinClosedHandler que vous faites : Vous fermez les tables d’une fenêtre que vous fermez… ce qui a pour effet de fermer à nouveau cette même fenêtre, et peut être d’autre fenêtres qui utilisent les même couches.
Testez l'utilisation de la commande 'Set Handler WinClosedHandler off' pour désactiver cet Handler lorsqu'il se déclenche, mais il y a des chances qu'au final votre problème reste le même.

Si vous êtes prêt à laisser l’utilisateur fermer lui-même les tables, pourquoi ne pas lui proposer un bouton dédié à cette opération, qui se chargera de fermer les tables de la fenêtre carte ?
-> Vous pouvez utiliser la commande ‘Set Window window_id SysMenuClose Off’ pour empêcher l’utilisateur de fermer une fenêtre en cliquant sur la croix, et utiliser l’handler WinChangedHandler pour le faire à la volée/automatiquement à l'ouverture d'une fenetre carte non geré par votre application (ouverture d'un WOR par exemple).
-> Si dans votre contexte, il est possible qu’une couche soit présente deux fois dans une fenêtre carte, ajoutez Interactive dans votre commande 'Close table AliasTable(i)' : 'Close table AliasTable(i) Interactive'
'Interactive' permet à MapInfo Professional® de ne pas afficher d’erreur si la table est absente. Cela vous évitera d’avoir à tester la présence de la table.
Le tout donc géré indépendamment du WinClosedHandler.

Je ne connais pas le but et le contexte de votre application, mais il faudrait peut être aussi gérer la présence de plusieurs fenêtres cartes dont le contenu pourrait être impacté par la fermeture des tables d’une fenêtre carte en particulier.

Dernière modification par Richard Lohier (Tue 28 April 2009 11:27)

Hors ligne

 

#7 Mon 04 May 2009 11:09

régisj
Participant occasionnel
Date d'inscription: 3 Dec 2007
Messages: 49

Re: WinclosedHandler et Close Table

Bonjour,
J'ai pris connaissance de votre message un peu tardivement la semaine dernière, avant de partir en congés, pour pouvoir essayer les nombreuses pistes que vous m'avez fort aimablement indiquées. Je vais donc faire des essais afin de prendre la meilleure solution...
Effectivement le fait de vouloir, dans un WinclosedHandler, fermer les tables contenues dans la fenêtre carte que l'on ferme, peut entrainer des conflits dans Mapinfo. Je vais quand même faire un test en ne fermant pas toutes les tables contenues dans la fenêtre carte, car une fenêtre carte ne se ferme automatiquement que si l'on ferme toutes les tables  contenues dans celle-ci...
En fait, dans mon application seules les tables non présentes dans d'autres fenêtres cartes sont fermées. De plus il s'agit de tables bien précises, gérées par l'application.
Merci beaucoup pour votre aide.

Hors ligne

 

Pied de page des forums

Powered by FluxBB