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 22 April 2008 12:17

Fabius
Participant actif
Date d'inscription: 19 Mar 2008
Messages: 130

[MapBasic 7.0]Selection fenetre double

Bonjour à tous et à toute.

J'aurais besoin de conseil et de pistes pour la réalisation d'un programme que je dois créeer de toute pieces. Voici les données du probleme. Je pars de table ayant toujours une colonne id rempli en fonction du groupe auquel ces zones géographiques appartiennent. le but serait de creer une boite de dialogue avec deux listes. D'un coté tout les numéros disponibles (donc le programme doit s'adapter en fontion de cela) qui peuvent aussi bien aller de 1 à 1000 avec des valeurs manquantes a certains endroit comme de 7à8. Donc ceci dans la liste de gauche serait en fait l'affichage des occurences (groupées par id) et dans la liste de droite permettre a l'utilisateur de glisser les numeros qu'il souhaite conserver. Le petit plus serait de pouvoir avoir une touche qui permettrait de copier directement tout et une autre pour effacer tout. Ca je vois comment faire mais pour l'autre type de boite de dialogue malgres la doc sur les dialog et control de Jacques Paris je bloque un peu c'est pourquoi je sollicite (une nouvelle fois) votre aide bienveillante.

Cordialement

Fabius

Hors ligne

 

#2 Tue 22 April 2008 16:59

Fabius
Participant actif
Date d'inscription: 19 Mar 2008
Messages: 130

Re: [MapBasic 7.0]Selection fenetre double

Bon j'ai trouvé comment réaliser ceci grace à deux multilistbox, par contre le probleme est toujours pas pour afficher dans la premiere les différentes occurences présentes dans la colonne de ma table. Autre Probleme qui risque de ce poser à moi celui du stockage des différents choix de l'utilisateur afin de pouvoir les réutiliser par la suite dans une requete par exemple. Avec un tableau peut etre ?

Hors ligne

 

#3 Tue 22 April 2008 18:33

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

Re: [MapBasic 7.0]Selection fenetre double

Bonjour
La solution réside sûrement dans 2 variables liste, l'une étant remplie par les choix faits dans l'autre
La première est remplie par toutes les occurences qu'on trouve dans une requête comportant un "group by" sur ID: il faut lire ces occurences par une boucle utilisant "fetch"...
Pour remplir tout ou vider tout (redim variable_liste(0)...) ça devrait être facile smile
Je ne peux guère en dire plus sans des exemples de code....

Hors ligne

 

#4 Wed 23 April 2008 11:05

Fabius
Participant actif
Date d'inscription: 19 Mar 2008
Messages: 130

Re: [MapBasic 7.0]Selection fenetre double

Merci pour votre réponse meme si pour moi celle ci me parait un peu flou.

J'ai une boite de dialogue que l'on va qualifier de primaire. Meme si dans l'arboresccence de mes boites de dialogue c'est la 3eme mais elle est indépendante des autres. Celle ci permet a l'utilisateur de selectionner sa table parmi les tables ouvertes. Une fois celle ci selectionné le programme rempli automatiquement le champ sur lequel sera fait la somme. L'utilisateur clique ensuite sur le bouton central afin de choisir les identifiants désiré ce qui ouvre la boite de dialogue appelé par la procédure dlg4. Pour l'instant je n'ai pas plus avancé hormis la requete group by ID que j'ai fait grace a une commande xx

Code:

xx= "Select id from "+nomtable(A)+" group by id order by id into bidule"

Par contre la boucle utilisant fetch je n'en ai jamais utilisé je vais essayer de m'aider de l'aide mapbasic.
Voici mon code tel qu'il est actuellement, je l'avoue assez peu évolué sad

Code:

Sub Dlg3
    Compteur =  100
   Call Contenu
   Dialog Title "Choix des tables et de l'intervalle (3/3)" width 220 Height 170
   Control statictext Position 10,12 width 60 Title "Table Selection >>"
   Control PopUpMenu Position 90,10 width 90 Height 10 id 31 Title from Variable NomTable Value A calling rec_colonne
   Control statictext Position 10, 72 Title "Somme :"
   Control Popupmenu Position 40,70 id 37 width 80 Title from Variable Nomcolto Value D 
   control button position 125,72 width 10 height 10 title "?" calling info3
   Control statictext Position 10,110 Title "Nom du Document en sortie :"
   Control edittext Position 105,108 width 80 Height 12 id 34 value nomdoc
   Control statictext Position 50,130 Title "Date :"
   Control edittext Position 75,128 width 35 id 35 value datedoc
   Control Button Position 60,90 width 100 Title "Choix du/des ID(s)" calling Btn id 302
   Control Button Position 20, 150  Title "<< Précédent" width 50 Calling Btn id 301
   Control Button Position 80, 150  Title "Annuler" width 50 Calling Btn id 100 calling cannul
   Control okButton Position 140, 150  Title "Terminer" width 50 Calling Btn Id 303
End Sub
'********************************************** DIALOGUE 4 *********************************************************
Sub Dlg4
  Compteur = 100
Dialog Title "Choix des ID"
 control groupbox  position 5,40 width 175 height 100 title "Liste des id"
 control multilistbox position 20,53 width 150 height 80 
 control groupbox  position 210,40 width 175 height 100 title "ID sélectionnés"
 control multilistbox position 224,53 width 150 height 80 
 control button position 186,50 width 20 height 12 title ">" 
 control button position 186,75 width 20 height 12 title "<" 
 Control Button Position 100, 150 Title "Retour" width 50 calling btn id 401
 Control Button Position 260, 150  Title "Valider" width 50 calling btn id 403
 Control Button Position 180, 150  Title "Annuler" width 50 calling btn id 100 calling cannul
End Sub

Dernière modification par Fabius (Wed 23 April 2008 11:18)

Hors ligne

 

#5 Wed 23 April 2008 13:23

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

Re: [MapBasic 7.0]Selection fenetre double

Pas le temps ...mais juste pour dire que les MultiListBox peuvent/doivent être remplies avec les variables liste (Title From Variable liste_1) et que celles_ci sont "remplies par le parcours (à l'aide de Fetch) des cellules d'une colonne (celle issue de la sélection avec un Group By)

Hors ligne

 

#6 Wed 23 April 2008 13:54

Fabius
Participant actif
Date d'inscription: 19 Mar 2008
Messages: 130

Re: [MapBasic 7.0]Selection fenetre double

D'accord la dessus  mais je vois pas coment meme grace a un fetch first fetch next se positionner sur chacune des cellules de ma colonne sélectionnée. J'ai essayé une boucle mais je comprend pas comment je pourrais stocker tout les différents id de maniere a ce que ceux ci soient indépendant.

EDIT : J'ai reussi a remplir ma liste, je pense maintenant créer deux sub appeler par les boutons pour ajouter a la liste 2 la selection et supprimer de la liste 2. Par contre je ne sais pas du tout comment faire.

Code:

xx= "Select ID from "+nomtable(A)+" group by ID order by ID into bidule"
run command xx
k=selectioninfo(SEL_INFO_NROWS)
redim liste1(k)
For y = 1 to k
Fetch rec y from bidule
    uu =bidule.ID
    liste1(y)= uu
next

Dernière modification par Fabius (Wed 23 April 2008 16:04)

Hors ligne

 

#7 Wed 23 April 2008 17:51

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

Re: [MapBasic 7.0]Selection fenetre double

Pour ajouter il faut une procédure "handler" qui est appelée par la MultiListBox (un calling mon_handler) et qui lit les choix que l'utilisateur a faits dans cette MultiListBox pour les ajouter à la variable liste liste2(). Votre bouton ajouter (>>) se contente alors de faire un Alter Control xx Title From Variable liste2.
Pour vider, par bouton vider (<<), il suffit que celui-ci fasse un Redim Liste2(0) puis un Alter Control xx Title From Variable liste2.
Plus dur si on doit procéder à des vidages partiels (l'utilisateur revient sur son choix)....mais faisable tongue

Hors ligne

 

#8 Thu 24 April 2008 09:56

Fabius
Participant actif
Date d'inscription: 19 Mar 2008
Messages: 130

Re: [MapBasic 7.0]Selection fenetre double

Merci de votre réponse. Cependant je vais continuer à vous "embêter" un peu puisque j'aimerais savoir ce que vous appelez une procédure handler ?
Voici mon code appelé par le multibox, celui ci me renvoi seulement une valeur de la liste1, j'ai donc essayé avec une boucles mais celle ci donne le meme resultat au final, mais boucle sur la meme observation

Code:

sub ajout
dim jajou as string
redim liste2(uu)
jajou = readcontrolvalue(50)
liste2(uu)=jajou
alter control 51 title from variable liste2()
eND SUB

Pour le vidage et le remplissage en fait je veux faire un bouton "tout remplir" un autre "tout vider" et les deux autres permettant d'ajouter au compte goutte.

J'ai fait ca pour le TOUT REMPLIR(tres basique mais semble efficace)

Code:

SUB PUTALL
alter control 51 title from variable liste1()
END SUB

et ca pour TOUT EFFACER:

Code:

SUB ERASALL
redim liste2(0)
alter control 51 title from variable liste2()
END SUB

Ca fonctionne mais es ce que je en risque pas d'avoir des problemes par la suite ?

Enfin derniere question une fois que l'utilisateur clique sur valider je voudrais une petite boite de dialogue qui lui dises combien d'ID il a sélectionné. Comment faire pour compter le nombre d'occurence présent dans liste2() au moment de la validation ?

Dernière modification par Fabius (Thu 24 April 2008 10:16)

Hors ligne

 

#9 Thu 24 April 2008 11:04

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

Re: [MapBasic 7.0]Selection fenetre double

Vous manipulez deux variables liste:
- liste1() qui est composée de tous les ID disponibles pour être choisis
- et liste2() qui est la liste des choix faits par l'utilisateur au sein de liste1()
Votre code pour tout effacer est correct et on a bien une liste2 vide (pas de choix)
Celui pour tout remplir est plus discutable: il vaudrait mieux transvaser tout liste1 dans liste2. Si, comme vous l'écrivez, vous substituez liste1 (les disponibles) à liste2 (les choix)...ça peut aller plus vite (?), mais il faut, dans la suite du programme, que vous utilisiez dans ce cas liste1 et non plus liste2 (qui est restée vide) pour représenter les choix de l'utilisateur! Ca risque de créer des problèmes....
Votre sub ajout n'est pas très compréhensible...et a priori ne fonctionne pas. Je vous trouve un exemple pour procéder à ce transvasement (des choix faits dans la MultiListBox vers la variable liste2) partiel...mais plus tard, là je suis pris

Hors ligne

 

#10 Thu 24 April 2008 12:28

Fabius
Participant actif
Date d'inscription: 19 Mar 2008
Messages: 130

Re: [MapBasic 7.0]Selection fenetre double

Merci .

Effectivement le tout remplir est tentant a utiliser puisque vraiment simple mais le fait qu'il puisse créer des problemes m'inquiete.

Merci encore pour votre aide qui me permet d'avancer et d'entrevoir un peu plus la fin de mon programme

Hors ligne

 

#11 Fri 25 April 2008 11:23

Fabius
Participant actif
Date d'inscription: 19 Mar 2008
Messages: 130

Re: [MapBasic 7.0]Selection fenetre double

Bonjour à tous et à toute.
Une autre petite question.. une fois ma selection effectué et cette boite validé (quand tout cela fonctionneras) comment pourrais je associer une action a ma variable liste 2 du style modeliser la zone des id pour ceux choisit ?

Hors ligne

 

#12 Fri 25 April 2008 12:37

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

Re: [MapBasic 7.0]Selection fenetre double

Si "modéliser" veut dire sélectionner et représenter, il suffit de remplir une variable chaine listID qui soit du genre
ID1,ID34,ID35,....ID999
- on part d'un listID vide et, en lisant de 1 à n=Ubound(liste2) les valeurs de liste2(), on a val_1=liste2(1) et listID=listID+val_1+"," jusqu'à  val_n= liste2(n) et listID=listID+val_n+",". Tout ça dans une boucle...ce qui veut dire qu'à la fin il faudra enlever la virgule finale de listID...!
- on fait un cmd="Select * From ma_table Where ID in ("+listID+") Into tutu" ...puis Run Command cmd
- on obtient une table "tutu" qu'on ajoute à la fenêtre carte (ou dont on fait une carte s'il n'y a pas de fenêtre carte ouverte)

Hors ligne

 

#13 Fri 25 April 2008 13:51

Fabius
Participant actif
Date d'inscription: 19 Mar 2008
Messages: 130

Re: [MapBasic 7.0]Selection fenetre double

D'accord d'accord j'ai compris le pricnipe de fonctionnement.

Pour le probleme précédent du remplissage et du vidage partiel ou total de la liste2 a partir de la liste 1 pourriez vous m'eclairer un peu plus si vous n'etes pas trop pris sur les solutions a envisager pour me permettre de continuer ma progression dans mon projet et dans mapbasic ?

Cordialement

Hors ligne

 

#14 Mon 28 April 2008 10:11

Fabius
Participant actif
Date d'inscription: 19 Mar 2008
Messages: 130

Re: [MapBasic 7.0]Selection fenetre double

Bonjour à tous et à toutes

Au risque de paraitre quelque peu lourd, je remonte ce sujet pour obtenir de l'aide sur ma gestion des ajout suppresion entre liste box. Merci d'avance

Cordialement

Hors ligne

 

#15 Mon 28 April 2008 11:18

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

Re: [MapBasic 7.0]Selection fenetre double

Reprenons, après le beau soleil du WE... (ah!!  la plage...)
- pour vider tout, il suffit de faire un redim liste2(0)
- pour ajouter tout liste1() dans un liste2() au départ vide il faut, dans une boucle, lire de 1 à UBound(liste1) toutes les valeurs de liste1() et ajouter ces valeurs à liste2()....dont on a auparavant redéfini le taille par ReDim liste2(UBound(liste1))
- pour des ajouts ou retraits partiels c'est plus coton et il faudra je pense passer par d'autres variable liste listeplus() et listemoins(), d'utilisation provisoire
Mais c'est le même principe de transvasement....comme les gosses avec leurs seaux au bord de la plage tongue

Hors ligne

 

#16 Mon 28 April 2008 12:22

Fabius
Participant actif
Date d'inscription: 19 Mar 2008
Messages: 130

Re: [MapBasic 7.0]Selection fenetre double

merci de votre réponse, mais personnelement je trouve cela moins ludique qu'a la plage. L'eclairage aujourd'hui se résume a un néon dans un bureau dans la grisaille parisienne, ca change d'un beau weeekend, le retour à la réalité est difficile ce matin. Ouinh je veux revoir ma Normandie big_smile

Plus sérieusement , je vais voir pour le Ubound j'ai regardé das l'aide Mapbaci ca a l'air assez facile d'utilisation. Par contre je ne comprend (toujours pas) pouquoi utiliser des sous variable plutot que de faire jouer la selection . Ca me parait simple mais je me rend comtpe que la logique derriere est moins drole

Hors ligne

 

#17 Mon 28 April 2008 12:42

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

Re: [MapBasic 7.0]Selection fenetre double

D'accord...
- pour ajouter une partie de liste1() choisie par l'utilisateur on peut lire les valeurs choisies dans la MultiListBox et les ajouter à liste2() en faisant à chaque lecture, avant l'ajout, un Redim liste2(Ubound(liste2)+1)....
- mais si après on enlève une partie des valeurs de liste2() - l'utilisateur s'est trompé - je ne vois pas comment se passer d'une variable liste intermédiaire qui sera remplie conditionnellement par les valeurs de liste2() qui ne sont pas dans la liste des choix de valeurs à supprimer, puis il faudra vider liste2() et la remplir à nouveau par la variableliste intermédiaire...que l'on videra à la fin !
Il y a peut être des méthodes plus élagantes ?? Avis aux amateurs !

Hors ligne

 

#18 Mon 28 April 2008 16:08

Fabius
Participant actif
Date d'inscription: 19 Mar 2008
Messages: 130

Re: [MapBasic 7.0]Selection fenetre double

Voila ce qye j'ai fait pour tout ajouter mais ce qui me "choque c'est que j'en reviens encore à un liste2 = liste1.
De plus cela mets un certain temps dans mon exemple type (400 id différents)
et si on clique deux fois de suite dessus il recommence a charger pour remplir la liste

Code:

SUB PUTALL
FOR i=1 to ubound(liste1)
ReDim liste2(UBound(liste1))
liste2(i) = liste1(i)
alter control 51 title from variable liste2()
next
END SUB

Pour le reste je cherche la solution la plus simple mais j'avoue que meme avec votre aide j'ai du mal a comprendre le raisonement a suivre. Je m'y remet quand meme de suite

Cdt

Fab

Hors ligne

 

#19 Mon 28 April 2008 16:57

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

Re: [MapBasic 7.0]Selection fenetre double

Pourtant c'est bien ça...et liste2(i) = liste1(i) c'est différent de  liste2 = liste1...qu'on n'a pas le "droit" d'écrire
C'est sûr que si on clique n fois il fera le job n fois...sauf si on met un contrôle (if...) vérifiant avant si liste2() est vide ou pas et que le job n'a lieu que si liste2() est vide smile

Hors ligne

 

#20 Mon 28 April 2008 17:09

Fabius
Participant actif
Date d'inscription: 19 Mar 2008
Messages: 130

Re: [MapBasic 7.0]Selection fenetre double

Bon je vais laisser comme cela , ca fonctionne comme je le veux , j'ai meme reajouter des alter control sur les boutons pour eviter si il n'ya pas eu de modifs de pouvoir relancer plusieurs fois.

Pour ce qui est d'ajout simple ou multiple et de suppressions, je m'y perd un peu. Que me conseillez vous ? sachant que l'utilisateur pourra ajouter manuelement, rectifier ses éventuelles érreurs et ceci un grand nombre de fois.

Hors ligne

 

#21 Tue 29 April 2008 14:38

Fabius
Participant actif
Date d'inscription: 19 Mar 2008
Messages: 130

Re: [MapBasic 7.0]Selection fenetre double

Voila ou j'en suit pour l'ajout, le probleme est que dans la liste2 j'ai des observations vides (sans doute autant ke d'observations stockées dans ma variable k) et que les autres se mettent à la suite. Je pensais que ca venait du redim mais lorsque je change le premier du code ci dessous mon programme ne veut pas s'executer.

Code:

sub ajout
dim ligne,w as integer
dim trouve as logical
ligne =readcontrolvalue(50)
redim liste2(k)
while ligne <> 0
      trouve = false
     for w = 1 to K
         if liste1(ligne) = liste2(w) then trouve = true end if
     next
      if trouve = false then
            k = k+1
            redim liste2(k)
            liste2(k) = liste1(ligne)
      else
              note "Cette variable est déjà sélectionnée"
      end if
      ligne =readcontrolvalue(50) 
wend
alter control 51 title from variable liste2()
eND SUB

Je me mets a ma procédure pour effacer de suite

Cdt

Fabius

Hors ligne

 

#22 Tue 29 April 2008 16:06

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

Re: [MapBasic 7.0]Selection fenetre double

You know what.?? Je n'y comprends rien sad
Je ne sais pas d'où sort cette variable k, je suppose sans en être sûr que vous en êtes à l'ajout partiel .... car contrairement à vous je suis en train de faire tout autre chose que ce programme !
Je propose que vous avanciez autant que vous pouvez et que vous soumettiez l'ensemble du code pour qu'on lève les blocages
Picorer à l'aveuglette, par petits bouts de code, devient vraiment trop astreignant
Prêt pour un coup de main, mais sur un programme exhaustif (même s'il ne marche pas) et commenté smile

Hors ligne

 

#23 Tue 29 April 2008 16:23

Fabius
Participant actif
Date d'inscription: 19 Mar 2008
Messages: 130

Re: [MapBasic 7.0]Selection fenetre double

d'accord c'est vrai que ca devient un peu farfelu. VOICI donc le code correspondant a mon pb (le programme dans son ensemble est plus long mais reste en dehors de tout ca )

Code:

Sub Dlg4
dim y as integer

  Compteur = 100
xx= "Select id from "+nomtable(A)+" group by ID order by ID into bidule"
run command xx
k=selectioninfo(SEL_INFO_NROWS)
redim liste1(k)

For y = 1 to k
Fetch rec y from bidule
    uu =bidule.ID
    liste1(y)= uu
next


Dialog Title "Choix des Nidcartos"

 control groupbox  position 5,10 width 175 height 100 title "Liste des Nidcarto"
 control multilistbox position 20,23 width 150 height 80 id 50 title from variable liste1()

 control groupbox  position 210,10 width 175 height 100 title "Nidcartos sélectionnés"
 control multilistbox position 224,23 width 150 height 80 id 51  title from variable liste2()

 control button position 186,30 width 20 height 12 title ">"  calling ajout id 83
 control button position 186,55 width 20 height 12 title "<"  calling efface id 84

 control button position 70,120 title "TOUT REMPLIR" width 70 calling putall id 81
 control button position 280,120 title "TOUT EFFACER" width 70 calling erasall id 82 disable

Control Button Position 100, 150 Title "Retour" width 50 calling btn id 401
Control Button Position 260, 150  Title "Valider" width 50 calling btn id 403
Control Button Position 180, 150  Title "Annuler" width 50 calling btn id 100 calling cannul

End Sub

sub ajout
dim ligne,i as smallint
dim trouve as logical

ligne =readcontrolvalue(50)
redim liste2(k)
while ligne <> 0
      trouve = false
     for i = 1 to k
         if liste1(ligne) = liste2(i) then trouve = true end if
     next
      if trouve = false then
            k = k+1
            redim liste2(k)
            liste2(k) = liste1(ligne)
      else
              note "Cet ID est déjà sélectionné"
      end if
      ligne =readcontrolvalue(50)
wend

alter control 51 title from variable liste2()
alter control 82 enable
alter control 83 enable
alter control 84 enable
eND SUB

SUB EFFACE
dim ligne,i as smallint
dim trouve as logical

ligne =readcontrolvalue(51)
while ligne<>0
      for i=ligne to k-1
         liste2(i)=liste2(i+1)
      next
      k=k-1
      redim liste2(k)
      ligne =readcontrolvalue(51)
wend

alter control 51 title from variable liste2()
alter control 81 enable
alter control 83 enable
END SUB

SUB ERASALL
redim liste2(0)
alter control 51 title from variable liste2()
alter control 82 disable
alter control 81 enable
alter control 84 disable
alter control 83 enable
END SUB

SUB PUTALL

FOR i=1 to ubound(liste1)
ReDim liste2(UBound(liste1))
liste2(i) = liste1(i)
next
alter control 51 title from variable liste2()
alter control 81 disable
alter control 82 enable
alter control 83 disable
alter control 84 enable

END SUB

c'est vrai également que j'ai la tete dedans depuis un moment et je "me comprend un peu tout seul"

Enfin, ayant mes limites en algo j'aimerais savoir comment on peut trier cette variable liste 2 a chaque nouvel ajout ou suppression ?

Hors ligne

 

#24 Tue 29 April 2008 18:56

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

Re: [MapBasic 7.0]Selection fenetre double

Si je comprends: k c'est le nombre maximum des ID différents possibles pour être choisis. C'est aussi la taille de liste1()
Au moment du Sub ajout, liste2() contient z éléments, avec z <= k
A première vue je dirais:

Sub ajout
dim ligne,i,j as smallint
dim trouve as logical
ligne =readcontrolvalue(50)
while ligne <> 0
  trouve = false
  j = UBound(liste2)    ' taille de liste2(), variable à chaque tour si trouve=false
   for i = 1 to j  ' on limite la recherche à la taille actuelle de liste2()
     if liste1(ligne) = liste2(i) then trouve = true end if
   next
   if trouve = false then
     redim liste2(j+1)
     liste2(j+1) = liste1(ligne)
   else
     note "Cet ID est déjà sélectionné"
   end if
  ligne =readcontrolvalue(50)
wend
...
End Sub


Mais c'est surement long de vérifier, pour chaque élément de la multiliste des choix dans liste1(), s'il est déjà présent dans liste2() ... sad
Peut être faut-il remettre à la toute fin l'élimination des éventuels doublons ??

Fabius a écrit:

Enfin, ayant mes limites en algo j'aimerais savoir comment on peut trier cette variable liste 2 a chaque nouvel ajout ou suppression ?


Moi aussi !! J'en viens à me demander s'il ne faudrait pas passer par une table provisoire, remplie avec le contenu de liste2() et qui servirait à re-remplir liste(2): sur une table on peut faire des regroupements et des tris que l'on ne peut pas faire (je crois) sur une variable liste...
A creuser tongue

Hors ligne

 

#25 Wed 30 April 2008 13:31

Fabius
Participant actif
Date d'inscription: 19 Mar 2008
Messages: 130

Re: [MapBasic 7.0]Selection fenetre double

Merci encore pour votre aide. Dernier petit probleme la question d'une ou plusieurs suppresions.

Pour la table c'est vrai que ca parraitrait etre une bonne solution mais il me semble que l'on peut trier des listes (enfin pour d'autres langages programation c'est possible)

En gros je pense qu'il faudrait boucler une comparaison entre les valeurs de la liste2 qui met a chaque fois la 1ere dans une liste "temporaire" puis la seconde et ainsi de suite et une fois cette boucle fini ecraser la liste2 en la remplacant par la temporaire.
Je pense que mon raisonnement est pas si mauvais que ca mais le truc c'est que je suis incapable de le faire malheureusement pour moi sad

Cordialement

Dernière modification par Fabius (Wed 30 April 2008 13:42)

Hors ligne

 

#26 Tue 06 May 2008 13:29

Fabius
Participant actif
Date d'inscription: 19 Mar 2008
Messages: 130

Re: [MapBasic 7.0]Selection fenetre double

Désolé de remonter ce sujet une enieme fois, mais quelqu'un pourrait t'il m'eclairer afin que je puisse en finir avec ce code ?

Merci d'avance

Fabius

Hors ligne

 

#27 Tue 06 May 2008 14:49

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

Re: [MapBasic 7.0]Selection fenetre double

En fait il faut 2 variables liste intermédiaires:
- On crée deux variables liste3() et liste4() vides
- On remplit liste3() avec les éléments sélectionnés dans liste2() = ceux qu'on veut éliminer, per une procédure simple
- On remplit liste4() avec les éléments qui sont dans liste2() ET qui ne sont pas dans liste3() par une procédure semblable à celle utilisée dans "ajout"
- On vide alors liste2() pour la remplir avec liste4() par une procédure simple
- On vide liste3() et liste4() et on affiche la nouvelle liste2() dans le dialogue par un Alter control 51 title from variable liste2()

Je vous l'avais dit, c'est un jeu de transvasement ....

Hors ligne

 

#28 Tue 06 May 2008 17:59

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

Re: [MapBasic 7.0]Selection fenetre double

Quelque chose comme ça (tiré du code complet joint à mon dernier post):

Sub efface
dim ligne,i,j,k,y,z as smallint
dim trouve as logical
dim liste3(),liste4() as string
ligne =readcontrolvalue(51)  'On remplit liste3() avec la sélection de liste2()
i = UBound(liste3)
while ligne <> 0
  redim liste3(i+1)
  liste3(i+1) = liste2(ligne)
  ligne =readcontrolvalue(51)
  i = i+1
wend                    'Puis on remplit liste4() avec les éléments de liste2() qui ne sont pas dans liste3()
for j = 1 to UBound(liste2)        'on parcourt tout liste2()
  trouve = false
   for k = 1 to UBound(liste3)    'on parcourt tout liste3() pour voir si l'élément de liste2() y est déjà
     if liste2(j) = liste3(k) then trouve = true end if
   next
   if trouve = false then           's'il n'est pas dans ceux à éliminer, on l'ajoute à liste4()
    y=UBound(liste4)
    redim liste4(y+1)
    liste4(y+1) = liste2(j)
   end if
next
redim liste2(0)                'On vide alors liste2() pour la remplir avec liste4()
redim liste2(UBound(liste4))
for z=1 to UBound(liste4)
  liste2(z) = liste4(z)
next
redim liste3(0)                'On vide liste3() et liste4() et on affiche la nouvelle liste2() dans le dialogue
redim liste4(0)
alter control 51 title from variable liste2
'.... ici tous les alter pour activer/inactiver les boutons d'ajout/suppression
End Sub


Cette procédure "efface" doit être appelée par le bouton "<" , par un calling efface ...

Hors ligne

 

#29 Thu 08 May 2008 09:34

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

Re: [MapBasic 7.0]Selection fenetre double

Pour en finir (!? smile), ci-joint un exemple de code qui marche et qui reprend (autant que possible) les dénominations qu'utilise Fabius
nb: je vais éditer ce sujet (enlever les posts "inutiles") pour le rendre plus "lisible"
Bon viaduc pour les heureux qui ne travaillent pas demain tongue


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

Hors ligne

 

#30 Tue 13 May 2008 15:04

Fabius
Participant actif
Date d'inscription: 19 Mar 2008
Messages: 130

Re: [MapBasic 7.0]Selection fenetre double

Merci pour tout, le code fonctionne impecablement s'adapte bien au reste de mon programme.

Cependant j'aimerais toujours trier cette liste, votre solution ( la seule apparement) qui est de passer par une table afin de pouvoir interragir dessus me parait envisageable cependant comment peut on remplir une table a partir d'une liste ?
Il faut que je créer une table puis grace a un fetch first /fetch next je remplisse chaque ligne par une valeur de liste2(i) ?

Cordialement

Hors ligne

 

Pied de page des forums

Powered by FluxBB