#1 Tue 20 December 2011 10:30
- Sébastien PIERRE
- Participant occasionnel
- Date d'inscription: 27 Aug 2011
- Messages: 16
[MAPBASIC 6.5] Selection multiple dans une Listbox
Bonjour à tous, ayant besoin d'un outil, je me relance dans le MapBasic. J'ai fait ce petit bout de code mais avant de continuer j'aurais deux petites questions.
1 - Comment peut-on utiliser la valeur du choix réalisé dans la listbox pour ensuite réaliser des sélections dessus.
Voilà le bout de code, le but étant de, à partir d'une table choisie dans le RadioGroup, pouvoir sélectionner 1 ou plusieurs Code_CLC et de s'en servir pour faire des sélections (puis d'autres opérations mais je n'ai pas encore automatisé le reste, commençons par le commencement ) :
Code:
INCLUDE "MAPBASIC.DEF" INCLUDE "MENU.DEF" DECLARE SUB Main DECLARE SUB alter_popup_table Dim chemin, cmd, liste_CLC() As STRING Dim cpt, CLC_sel,var_table as integer SUB Main 'Chemin = FileOpenDLG("","","TAB","Ouvrir table continuum") 'Open table chemin Dialog title "Choix du continuum" Control radioGroup title "&Continuum_aquatique;&Continuum_agricole;&Continuum_thermophile;&Continuum_boisé" value 0 Position 10,10 into var_table calling alter_popup_table ID 1001 Control listbox title "Code_CLC" Value 0 Position 10,75 width 250 ID 1002 into CLC_sel control OKBUTTON control cancelbutton note CLC_sel 'IF CommandInfo(CMD_INFO_DLG_OK) THEN ' ' IF var_table = 1 THEN ' cmd = "Select * from Cont_Mx_Aqua_Humide,CLC_sel WHERE CLC_sel.col1=Cont_Mx_Aqua_Humide.col3 INTO rq" ' RUN COMMAND cmd ' ' ELSEIF var_table = 2 THEN ' cmd = "Select * from Cont_Mx_Aqua_Humide,rq_tab WHERE CLC_sel.col1=Cont_Mx_Aqua_Humide.col3 INTO rq" ' RUN COMMAND cmd ' ' ELSEIF var_table = 3 THEN ' cmd = "Select * from Cont_Mx_Aqua_Humide,rq_tab WHERE CLC_sel.col1=Cont_Mx_Aqua_Humide.col3 INTO rq" ' RUN COMMAND cmd ' ' ELSEIF var_table = 4 THEN ' cmd = "Select * from Cont_Mx_Aqua_Humide,rq_tab WHERE CLC_sel.col1=Cont_Mx_Aqua_Humide.col3 INTO rq" ' RUN COMMAND cmd ' ' END IF ' ELSE ' EXIT SUB ' END IF END SUB SUB alter_popup_table var_table = ReadControlValue(1001) IF var_table = 1 THEN cmd = "Select CODE_NIV3 from Cont_Mx_Aqua_Humide GROUP BY CODE_NIV3 INTO rq_tab" RUN COMMAND cmd ELSEIF var_table = 2 THEN cmd = "Select CODE_NIV3 from Cont_Mx_Agri_extensifs INTO rq_tab" RUN COMMAND cmd ELSEIF var_table = 3 THEN cmd = "Select CODE_NIV3 from Cont_Mx_Thermo_Secs INTO rq_tab" RUN COMMAND cmd ELSEIF var_table = 4 THEN cmd = "Select CODE_NIV3 from Cont_Mx_Boises INTO rq_tab" RUN COMMAND cmd END IF REDIM liste_CLC(TABLEINFO(rq_tab, TAB_INFO_NROWS)) FOR cpt = 1 TO TABLEINFO(rq_tab, TAB_INFO_NROWS) FETCH REC cpt FROM rq_tab liste_CLC(cpt) = rq_tab.col1 NEXT 'CLOSE TABLE rq_tab ALTER CONTROL 1002 title from variable liste_CLC END SUB
Merci d'avance aux personnes qui m'aideront
PS : Je joint un bout d'une table si sa peut aider (c'est la table Cont_Mx_Aqua_Humide.TAB soit le premier choix dans le RadioGroup)
PS2 : la partie en commentaire ne fonctionne pas, je suis en train d'y plancher dessus mais fait quand même l'objet de ma question
Dernière modification par Sébastien PIERRE (Tue 20 December 2011 11:16)
Hors ligne
#2 Tue 20 December 2011 11:21
- Spacejo
- Membre
- Lieu: Nancy
- Date d'inscription: 17 Aug 2008
- Messages: 2511
Re: [MAPBASIC 6.5] Selection multiple dans une Listbox
Salut et Bienvenue,
Est ce que ceci t'aide?
Voir page 146 "MultiLisbox" dans --> http://www.i-signum.com/download/MapBas … eGuide.pdf
A+
Joël
Dernière modification par Spacejo (Tue 20 December 2011 11:22)
Hors ligne
#3 Tue 20 December 2011 11:50
- Sébastien PIERRE
- Participant occasionnel
- Date d'inscription: 27 Aug 2011
- Messages: 16
Re: [MAPBASIC 6.5] Selection multiple dans une Listbox
Oui merci
J'ai posté un peu rapidement, du coup j'ai refait mon code avec une multilistbox qui fonctionne donc j'ai plus de soucis sur ce point
Par contre, lorsque que je fait un note de mes choix, il me renvoie la "place" de mon choix dans la liste. Est-il possible de récupérer la valeur correspondante et non le numéro de la "place" ?
Lorsqu'à la fin de de ma listbox (qui est devenue une multilistbox) je met un "INTO CLC_Sel", à quoi correspond il exactement ? Parce que je peut le "note" mais lorsque je veux m'en servir pour les sélections d'après, il m'indique que la table "CLC_Sel" n'est pas ouverte.
PS: je me sers aussi du pdf "dialog et controls" mais là je bloque un peu pour mes deux questions.
Hors ligne
#4 Tue 20 December 2011 12:15
- Spacejo
- Membre
- Lieu: Nancy
- Date d'inscription: 17 Aug 2008
- Messages: 2511
Re: [MAPBASIC 6.5] Selection multiple dans une Listbox
As tu ouvert "NVIEWS.MB" avec le bloc-note pour voir un exemple.
Ce fichier doit être ici --> Sous C:\ProgramFiles\Mapinfo\Professional\MAPBASIC\SAMPLES
Hors ligne
#5 Wed 21 December 2011 09:29
- Sébastien PIERRE
- Participant occasionnel
- Date d'inscription: 27 Aug 2011
- Messages: 16
Re: [MAPBASIC 6.5] Selection multiple dans une Listbox
Merci Spacejo
Je pense avoir trouvé mon bonheur, je fait quelques tests puis je posterais le résultat.
Hors ligne
#6 Wed 21 December 2011 18:11
- Sébastien PIERRE
- Participant occasionnel
- Date d'inscription: 27 Aug 2011
- Messages: 16
Re: [MAPBASIC 6.5] Selection multiple dans une Listbox
Je me suis peut-être compliqué la tâche mais je poste quand même mon petit bout de code.
Code:
INCLUDE "MAPBASIC.DEF" INCLUDE "MENU.DEF" DECLARE SUB ajouteritem(t() as string, byval pitem as string) DECLARE SUB Main DECLARE SUB alter_multilistbox DECLARE SUB recup DECLARE SUB ajouteritemsansrepetition(t() as string, byval pitem as string) DECLARE function existeitem(t() as string, pitem as STRING) as logical Dim cmd, liste_CLC(), liste_recupCLC() As STRING Dim cpt,var_table, ichoice, choix as integer SUB Main Dialog title "Choix du continuum" Control radioGroup title "&Continuum_aquatique;&Continuum_agricole;&Continuum_thermophile;&Continuum_boisé" value 0 Position 10,10 into var_table calling alter_multilistbox ID 1001 Control statictext position 10,70 title "Code Corine Land Cover :" Control multilistbox title from variable liste_CLC Value 0 Position 10,85 width 250 ID 1002 control OKBUTTON calling recup control cancelbutton IF CommandInfo(CMD_INFO_DLG_OK) THEN [b]IF var_table = 1 THEN cmd = "Select * from Cont_Mx_Aqua_Humide WHERE Cont_Mx_Aqua_Humide.col3 = " & liste_recupCLC(1) & " INTO rq" RUN COMMAND cmd[/b] ' ELSEIF var_table = 2 THEN ' cmd = "Select * from Cont_Mx_Aqua_Humide,rq_tab WHERE CLC_sel.col1=Cont_Mx_Aqua_Humide.col3 INTO rq" ' RUN COMMAND cmd END IF ELSE EXIT SUB END IF END SUB SUB alter_multilistbox var_table = ReadControlValue(1001) IF var_table = 1 THEN cmd = "Select CODE_NIV3 from Cont_Mx_Aqua_Humide GROUP BY CODE_NIV3 ORDER BY CODE_NIV3 INTO rq_tab" RUN COMMAND cmd ELSEIF var_table = 2 THEN cmd = "Select CODE_NIV3 from Cont_Mx_Agri_extensifs GROUP BY CODE_NIV3 ORDER BY CODE_NIV3 INTO rq_tab" REDIM liste_CLC(TABLEINFO(rq_tab, TAB_INFO_NROWS)) FOR cpt = 1 TO TABLEINFO(rq_tab, TAB_INFO_NROWS) FETCH REC cpt FROM rq_tab liste_CLC(cpt) = rq_tab.CODE_NIV3 NEXT ALTER CONTROL 1002 title from variable liste_CLC END SUB SUB recup dim choix as integer Do choix = readcontrolvalue(1002) If choix <> 0 then CALL ajouteritemsansrepetition(liste_recupCLC, liste_CLC(choix)) ichoice = liste_CLC(choix) ELSE exit do END IF loop dialog remove END SUB SUB ajouteritem(t() as string, byval pitem as string) dim n as integer n=ubound(t)+1 redim t(n) t(n)=pitem END SUB SUB ajouteritemsansrepetition(t() as string, byval pitem as string) if not existeitem(t,pitem)then call ajouteritem(t,pitem) end if END SUB function existeitem(t() as string, pitem as STRING) as logical dim i as integer existeitem=false for i=1 to ubound(t) if t(i) = pitem then existeitem=true End if next END FUNCTION
Il me reste quand même un soucis (la partie en gras) c'est que lorsque je veux faire ma sélection, il me la fait sur un seul choix et non tous les choix que j'aurais pu faire dans la multilistbox. Je vais prendre un petit exemple pour être plus clair.
Dans ma multilistbox, je sélectionne 3 CODE admettons, lorsque j'arrive dans la partie en gras (après le "
IF CommandInfo(CMD_INFO_DLG_OK)", il ne me fait la sélection que sur la première valeur (ou la deuxième ou la troisième selon le chiffre que je met à : "liste_recupCLC()"). Or je voudrais arriver à faire la sélection sur TOUS les choix en même temps.
Je sais pas si c'est possible mais si oui je suis preneur de pistes, conseils ou autre
Dernière modification par Sébastien PIERRE (Wed 21 December 2011 18:14)
Hors ligne