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 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 smile ) :

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 smile

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)


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

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 smile

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 smile

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 smile

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 smile

Dernière modification par Sébastien PIERRE (Wed 21 December 2011 18:14)

Hors ligne

 

Pied de page des forums

Powered by FluxBB