Forum Liberty Basic France

Débutant » [Réglé] Positionner des controles avec un tableau ? c'est plutot délicat et pas gagné
Le 01/08/2020 à 08h27

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 599
Salutations matinales, programmeurs fous !

Comme je ne pratique plus beaucoup, à chaque fois qu'il m'arrive d'avoir une velléité de créer quelque chose avec notre JustBASIC, j'ai tout oublié et je perds un temps fou à retrouver les bonnes pratiques.

Ainsi, j'ai voulu créer une attribution automatique de la position des contrôles sur une fenetre. Le but est, durant la phase de création du programme, de pouvoir insérer facilement statictext et textbox dans une page déjà bien fournie : autrement dit, je me vois mal modifier manuellement les coordonnées de trente contrôles si je dois, au cours du développement, en insérer un autre au dessus de ces trente.

Le programme calcule donc à la volée position et dimension de ces contrôles, les place dans un tableau puis tente d'appliquer ce tableau aux statictexts et autres contrôles.

Le problème : si on utilise un tableau pour positionner un contrôle, la variable représentant une case de tableau est interprétée comme une variable ordinaire (elle contiendra cependant le contenu de la case identifiée par le dernier index fourni).

Un exemple pour être plus clair :
Code VB :
 
statictext #p1.str1, "truc", psn(b), psn(b+1), psn(b+2), psn(b+3)
b=b+4
statictext #p1.str2, "muche", psn(b), psn(b+1), psn(b+2), psn(b+3)
 

placera les deux statictext sur la même psn(b) trouvée avec la dernière valeur de b.

Un listing qui permet de constater de visu, et aussi que les calculs sont corrects :
Code VB :
 
    xt=10   'position horizontale de la rubrique
    yt=20   'position verticale initiale de la rubrique
    it=25   'interligne entre données de la rubrique
    xd=xt+10'position horizontale de la donnée sous la rubrique
    ir=40   'interligne entre dernière donnée de la rubrique et la rubrique suivante

    ls=150  'longueur statictext
    lt=50   'longueur textbox
    lu=30   'longueur unité
    hg=20   'hauteur statictext, textbox, etc...
    ig=7   'intervalle entre statictext, textbox, etc... sur une ligne
    cc=3     'correction de hauteur de textbox (alignement avec le texte des statictext)

    dim psn(100)
 
    a=0
    b=a
    psn(a)=xt:a=a+1
    psn(a)=yt:a=a+1
    psn(a)=200:a=a+1
    psn(a)=20:a=a+1
    statictext #p1.str, "Rubrique :", psn(b), psn(b+1), psn(b+2), psn(b+3)
    print a;" : statictext #p1.str : ";psn(b), psn(b+1), psn(b+2), psn(b+3)
 
    b=a
    psn(a)=xd:a=a+1
    psn(a)=yt+1*it:a=a+1
    psn(a)=ls:a=a+1
    psn(a)=hg:a=a+1
    statictext #p1.std1, "Donnée 1", psn(b), psn(b+1), psn(b+2), psn(b+3)
    print a;" : statictext #p1.std1 : ";psn(b), psn(b+1), psn(b+2), psn(b+3)
 
    b=a
    psn(a)=xd+ls+ig:a=a+1
    psn(a)=yt+1*it-cc:a=a+1
    psn(a)=lt:a=a+1
    psn(a)=hg:a=a+1
    textbox #p1.tbd1, psn(b), psn(b+1), psn(b+2), psn(b+3)
    print a;" : textbox #p1.tbd1 : ";psn(b), psn(b+1), psn(b+2), psn(b+3)
 
    b=a
    psn(a)=xd:a=a+1
    psn(a)=yt+2*it:a=a+1
    psn(a)=ls:a=a+1
    psn(a)=hg:a=a+1
    statictext #p1.std2, "Donnée 2", psn(b), psn(b+1), psn(b+2), psn(b+3)
    print a;" : statictext #p1.std2 : ";psn(b), psn(b+1), psn(b+2), psn(b+3)
 
    b=a
    psn(a)=xd+ls+ig:a=a+1
    psn(a)=yt+2*it-cc:a=a+1
    psn(a)=lt:a=a+1
    psn(a)=hg:a=a+1
    textbox #p1.tbd2, psn(b), psn(b+1), psn(b+2), psn(b+3)
    print a;" : textbox #p1.tbd2 : ";psn(b), psn(b+1), psn(b+2), psn(b+3)
 
    WindowWidth=800
    WindowHeight=600
    open "fenetre" for window as #p1
        #p1, "trapclose [quitter]"
    wait
 
 
[quitter]
    close #p1
    end
 


Une idée pour s'en sortir ?
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 01/08/2020 à 20h16

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2204
Une bonne organisation lors des placements suffit pour maîtriser la chose; mettre tous ça en tableau ne fait que compliquer sans rien simplifier
Ligne 1 pos 1
Ligne 1 pos 2
Ligne 1 pos 3

Ligne 2 pos 1
Ligne 2 pos 2
ext....
Ou:
Colonne 1 pos 1
Colonne 1 pos 2
ext...
Pour modifier il suffit de déplacer lignes ou colonnes par valeurs constantes au copié/coller
c'est sûr que si on écrit les trucs en vrac ça n'aide pas pour s'y retrouver.
Les noms des extensions peuvent aussi êtres normalisés (2 lettres pour les static, 3 pour les textbox, 4 pour les boutons, ext...ça aide bien.

Tu a là une autre approche-->: http://libertybasic.fr/forum/topic-143+multi-control-bas.php
____________________
Roro

   
Le 02/08/2020 à 08h16

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 599
La mise en tableau était déjà une tentative de réponse à un phénomène aberrant, ce n'était pas une fin en soi. Je te laisse découvrir l'explication du problème dans le topo qui suit.

J'ai été voir sur le lien que tu fournis, et en effet, il me fallait un truc du genre, et j'ai bien aimé l'étude de "projet de projet" de son auteur, je ne suis pas le seul à "travailler" comme ça ;)

On y parle aussi du freeform (encore un truc que j'avais oublié) qui pourrait bien me rendre plus de services qu'une usine à gaz logicielle et provisoire ne servant qu'aux essais, puisqu'on peut modifier à loisir les positions et taille des contrôles, et sans avoir à intervenir manuellement dans le listing. Il faudra juste faire du copier-coller à la fin.

Pour revenir à la discussion, la déconvenue est due à l'oubli que le déroulé du listing n'est pas forcément linéaire : l'approche erronée consiste à croire que la déclaration effective, officielle, de la position d'un contrôle se fait quand on le définit. Dans cette optique, si tous nos contrôles ont pour coordonnées les variables x et y, il suffit, entre chaque définition de contrôle, de modifier les valeurs de x et y pour répartir les controles sur la fenêtre. Mais ce n'est pas comme ça que ça marche.

En fait, avant d'ouvrir une fenêtre, on fait la liste de tous les contrôles, et tout se passe comme si leurs positions et dimensions sont définies seulement lorsque l'interpréteur arrive sur l'instruction "open...". Et forcément, s'ils utilisent tous la même variable y, ils seront tous positionnés à la dernière valeur connue de y, quelques soient les différentes valeurs qu'on ait pu lui donner avant. Je suis déjà plusieurs fois tombé dans le panneau.

En corollaire, et contrairement à ce que j'ai écrit dans mon premier post, une variable tableau est bien prise en compte dans la déclaration des contrôles, seulement sa valeur sera celle de la case correspondant au dernier index utilisé.

Une règle de base, qui m'aurait permis de savoir pertinemment le nombre et l'agencement des contrôles, donc de les définir à l'avance, est d'avoir d'abord fait l'analyse de ce qu'on veut informatiser, la programmation ne représentant que dix pour cent du travail total.

Ceci dit, le basic est pour moi un passe-temps devenu occasionnel, et ça me cantonne, de fait, dans des projets très simples.



Edité par Christophe Le 02/08/2020 à 08h18
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 02/08/2020 à 10h29

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2204
Citation:
Et forcément, s'ils utilisent tous la même variable y, ils seront tous positionnés à la dernière valeur connue de y

Bah oui, autant de contrôles, autant de variables (de noms différents), qu'on peut mettre en tableau ou en chaine (avant de les utiliser, of course).
Citation:
Une règle de base, qui m'aurait permis de savoir pertinemment le nombre et l'agencement des contrôles, donc de les définir à l'avance.

Pas forcément, il suffit de modifier le code au fur et à mesure de l'avancement de l'interface (c'est comme ça que je fais).

La "freeform", c'est pas mal, mais je n'aime pas trop la manipulation de fichiers que ça demande; et idem pour la méthode de claudevdw, qui reste bonne pour générer du code, mais qui souffre de l'inconvénient que le code généré ne peut pas s'auto-lancer (je crois ?)
____________________
Roro

   
Le 02/08/2020 à 14h44

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 599
Puisque je suis joueur, j'ai rendu fonctionnel mes déclarations de contrôles avec des tableaux ;)

Question subsidiaire sur la pertinence de la solution : quand, dans le listing, je lis "Ampere=2" et "Volt=3", c'est tout à fait parlant. Mais alors, quand je vois n(10,1)+n(10,3), qu'est-ce que ça peut donc bien être ? ;)

Voici :
Code VB :
 
    xt=10   'position horizontale de la rubrique
    yt=20   'position verticale initiale de la rubrique
    it=25   'interligne entre données de la rubrique
    xd=xt+10'position horizontale de la donnée sous la rubrique
    ir=40   'interligne entre dernière donnée de la rubrique et la rubrique suivante

    ls=170  'longueur statictext
    lt=50   'longueur textbox
    lu=30   'longueur unité
    hg=20   'hauteur statictext, textbox, etc...
    ig=7   'intervalle entre statictext, textbox, etc... sur une ligne
    cc=3     'correction de hauteur de textbox (alignement avec le texte des statictext)

    dim c$(100,2),n(100,5)
    fontrub$="!font MS_Sans_Serif 10 bold"
    fontdon$="!font MS_Sans_Serif 10"
    fontres$="!font MS_Sans_Serif 10 italic"
    fontbut$="!font Liberation_Mono 10"
 
    c$(0,0)="Courant continu"
    c$(0,1)=fontrub$
    n(0,0)=xt
    n(0,1)=yt
    n(0,2)=200
    n(0,3)=20
    statictext #p1.stcc, c$(0,0), n(0,0), n(0,1), n(0,2), n(0,3)
 
    c$(1,0)="Tension :"
    c$(1,1)=fontdon$
    n(1,0)=xd
    n(1,1)=yt+1*it
    n(1,2)=ls
    n(1,3)=hg
    statictext #p1.stun, c$(1,0), n(1,0), n(1,1), n(1,2), n(1,3)
 
    c$(2,0)="Tension"
    c$(2,1)=fontdon$ 
    n(2,0)=xd+ls+ig
    n(2,1)=yt+1*it-cc
    n(2,2)=lt
    n(2,3)=hg
    textbox #p1.tbud, n(2,0), n(2,1), n(2,2), n(2,3)
 
    c$(3,0)="V"
    c$(3,1)=fontdon$
    n(3,0)=xd+ls+lt+2*ig
    n(3,1)=yt+1*it
    n(3,2)=lu
    n(3,3)=hg
    statictext #p1.stuu, c$(3,0), n(3,0), n(3,1), n(3,2), n(3,3)
 
    c$(4,0)="Intensité :"
    c$(4,1)=fontdon$
    n(4,0)=xd
    n(4,1)=yt+2*it
    n(4,2)=ls
    n(4,3)=hg
    statictext #p1.stin, c$(4,0), n(4,0), n(4,1), n(4,2), n(4,3)
 
    c$(5,0)="Intensité"
    c$(5,1)=fontdon$
    n(5,0)=xd+ls+ig
    n(5,1)=yt+2*it-cc
    n(5,2)=lt
    n(5,3)=hg
    textbox #p1.tbid, n(5,0), n(5,1), n(5,2), n(5,3)
 
    c$(6,0)="A"
    c$(6,1)=fontdon$
    n(6,0)=xd+ls+lt+2*ig
    n(6,1)=yt+2*it
    n(6,2)=lu
    n(6,3)=hg
    statictext #p1.stiu, c$(6,0), n(6,0), n(6,1), n(6,2), n(6,3)
 
    c$(7,0)="Résultat"
    c$(7,1)=fontrub$ 
    n(7,0)=xt
    n(7,1)=yt+2*it+ir
    n(7,2)=200
    n(7,3)=20
    statictext #p1.stresult, c$(7,0), n(7,0), n(7,1), n(7,2), n(7,3)
 
    c$(8,0)="en attente de vos données"
    c$(8,1)=fontres$
    n(8,0)=xd
    n(8,1)=yt+3*it+ir
    n(8,2)=ls
    n(8,3)=hg
    statictext #p1.stresultat1, c$(8,0), n(8,0), n(8,1), n(8,2), n(8,3)
 
    c$(9,0)="résultat 2"
    c$(9,1)=fontres$
    n(9,0)=xd
    n(9,1)=yt+4*it+ir
    n(9,2)=ls
    n(9,3)=hg
    statictext #p1.stresultat2, c$(9,0), n(9,0), n(9,1), n(9,2), n(9,3)
 
    c$(10,0)="Calculer"
    c$(10,1)=fontbut$
    n(10,0)=xt
    n(10,1)=yt+4*it+2*ir
    n(10,2)=ls
    n(10,3)=25
    button #p1.btok, c$(10,0), [calculer], ul, n(10,0), n(10,1), n(10,2), n(10,3)
 
    WindowWidth=xd+ls+lt+3*ig+lu
    WindowHeight=n(10,1)+n(10,3)+40
 
    open "fenetre" for window as #p1
        #p1.stcc, c$(0,1)
        #p1.stun, c$(1,1)
        #p1.tbud, c$(2,1)
        #p1.stuu, c$(3,1)
        #p1.stin, c$(4,1)
        #p1.tbid, c$(5,1)
        #p1.stiu, c$(6,1)
        #p1.stresult, c$(7,1)
        #p1.stresultat1, c$(8,1)
        #p1.stresultat2, c$(9,1)
        #p1.btok, c$(10,1)
        #p1, "trapclose [quitter]"
    wait
 
 
[quitter]
    close #p1
    end
 
[calculer]
    #p1.tbud,"!contents? U$":U=val(U$)
    #p1.tbid,"!contents? I$":I=val(I$)
    if I=0 then
        notice "Saisissez une valeur non nulle pour l'intensité"
    else
        print
 
        c$(8,0)="Puissance = ";U*I;" W"
        c$(9,0)="Résistance = ";U/I;" Ohm"
 
        #p1.stresultat1, c$(8,0)
        #p1.stresultat2, c$(9,0)
 
        print c$(1,0);U$;" ";c$(3,0)
        print c$(4,0);I$;" ";c$(6,0)
        print c$(8,0)
        print c$(9,0)
    end if
 
    wait
 
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 02/08/2020 à 19h04

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2204
Il marche bien ton calculateur; y a plus qu'a continuer avec les autres formules et rassembler le tout.
Pour le fun
Code VB :
 
chaine10$=str$(xt)+" "+str$(ls)+" "+ str$(yt+4*it+2*ir)+" "+str$(25)
For x=0 to 3
  n(10,x)=val(word$(chaine10$,x))
next x
 
____________________
Roro

   
Le 04/08/2020 à 18h15

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2204
En tournant et retournant le problème dans tous les sens, en dehors de besoins particuliers (modification d'interface ( qui demande une réouverture)); il ne sert à rien de mettre les valeurs en variables, si ce n'est pour faire du placement relatif (aux bords de la fenêtre (parce qu'avec l'inter relatif on retombe sur la complexité (inutile, vu que les contrôles sont placés une fois pour toutes).
Ce qui est très pratique et rapide, mais nécessite une graphicbox; c'est de faire un relevé/affichage de coordonnées avec le clic droit:
Code VB :
 
#w, "when leftButtonDown [cote]
wait
 [cote]
  mx=MouseX: my=MouseY
  #w, " color backcolor...ext"
   #w,g "place ";mx;" ":my: #w,g "\ ";mx;"   ";my
wait

Pour les statictext, on peut faire un petit sous prog qui compte le nombre de caractères pour donner la largeur
____________________
Roro

   
Le 04/08/2020 à 20h30

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 599
Bien vu (pour tes deux derniers posts, j'ai commencé à rédiger lorsqu'il n'y en avait qu'un)

Maintenant que j'ai retrouvé la bonne manière de procéder, ça devrait être relativement simple d'envisager un placement dynamique des controles : des triplets nom du paramètre - valeur - unité regroupés à l'intérieur de rubriques dont le nom est en retrait et en gras.

Au fur et à mesure du développement et au besoin, on ajoute des triplets. Lorsqu'on arrive en bas de la fenêtre, on continue la rubrique en haut à droite dans une nouvelle colonne, et ainsi de suite tant qu'il y a de la place sur la fenêtre. Par contre, si on dépasse la capacité de la fenetre, il faudra ajouter des ascenseurs, et je n'ai jamais fait.

Et je peux toujours reprendre et approfondir le travail que tu m'as fourni en lien.

Freeform mériterait d'être amélioré : pour l'instant je n'ai pas trouvé comment faire une sélection multiple, qui aiderait beaucoup à déplacer un bloc de contrôles pour insérer de nouveaux contrôles.

Je vous retrouve le week-end prochain, là j'ai explosé le budget "temps consacré à JustBasic" pour la semaine ;)



Edité par Christophe Le 04/08/2020 à 20h31
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 05/08/2020 à 09h35

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2204
Citation:
Maintenant que j'ai retrouvé la bonne manière de procéder.

LOL !
Citation:
Au fur et à mesure du développement et au besoin, on ajoute des triplets

Oui mais tes nouveaux triplets tu es bien obligé de les calculer (de PLACER tes contrôles); et à partir de cette constatation, autant mettre les valeurs directement à leurs places (puisque c'est définitif, et que si on veut les changer il faut recalculer.

Le but ce serait de ne pas avoir à calculer; et pour ça il faudrait faire des modulos; on pourrait alors réduire les calculs en affectant aux contrôles leur nombre de modules; mais ça reste pas simple à coder. On pourrait alors (peut-être) penser par "blocks".
Le placement automatique est laid par nature, sauf à y mettre une touche d'aléatoire ou de fantaisie (propre à la nature du contrôle et à ses liens).
Citation:
il faudra ajouter des ascenseurs, et je n'ai jamais fait

Hum...Je crois que les ascenseurs ce n'est que pour l'image (bmp); s'il n'y a pas assez de place il faut agrandir la fenêtre (intérêt du placement relatif)
Citation:
Freeform mériterait d'être amélioré

Je n'ai pas trouvé le code du truc; c'est faisable,mais c'est justement le déplacement par block qui est le "saut" de complexité.
Citation:
j'ai explosé le budget "temps consacré à JustBasic" pour la semaine

Bah, ça pourrait être le jeu vidéo ou les timbres poste, ou va savoir quoi...
Good luck, à la prochaine...
____________________
Roro

   
Débutant » [Réglé] Positionner des controles avec un tableau ? c'est plutot délicat et pas gagné  

 |  |

1 Utilisateur en ligne : 0 Administrateur, 0 Modérateur, 0 Membre et 1 Visiteur
Utilisateur en ligne : Aucun membre connecté
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie