#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
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é
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
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
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
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
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
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é
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() ...
Peut être faut-il remettre à la toute fin l'élimination des éventuels doublons ??
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
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
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 (!? ), 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
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