#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
... 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