Forum Liberty Basic France

Général » Agrandir une fenêtre et son contenu tout un programme...
Le 07/05/2017 à 12h55

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 516
Hello tous !

En voulant créer une liste de boutons dans une fenêtre, je me suis lancé dans une conception erronée : seul le dernier bouton de la liste était dessiné.

A l'examen des variables j'ai deviné que chaque bouton était correctement affiché puis supprimé avant l'affichage du suivant, comme si c'était le même bouton qui était dessiné à chaque fois, mais à de nouvelles coordonnées. L'emplacement du dernier bouton, et son nom, étaient pourtant ceux qu'on attendait.

J'ai rectifié le code en pensant en faire un article de forum, puisque ma procédure erronée ne me semblait pas si illogique, et que cette expérience pourrait servir à d'autres. Mais c'était il y a plus d'un mois, je n'ai pas gardé le code erroné et aujourd'hui, je n'ai pas réussi à reproduire le "bug".

Donc je livre quelques codes fonctionnels issus de ces tests, prétextes à une discussion du dimanche, et bonnes révisions de la définition des boutons avant d'ouvrir la fenêtre qui va les afficher.

Il y a une version "manuelle" dans laquelle on spécifie dans le programme la position des boutons et une version "automatique" dans laquelle c'est le programme qui calcule la position des boutons.

L'évolution prévue est d'obtenir des boutons (et tout autre objet graphique) s'adaptant à la taille de la fenêtre quand l'utilisateur la redimensionne, pour être lisible devant l'écran ou à 5 mètres de celui-ci, par exemple.

Pour revenir dans le temps présent ;)
Méthode classique pour définir 8 boutons disposée en matrice dans une fenêtre :
Code VB :
 
'matrice de boutons
'placement manuel, programmé en dur, des boutons

'désactiver la fenetre dite "principale"
    nomainwin
 
'paramétrer la fenetre qu'on utilisera pour le programme
    qte=8 'quantité de boutons créés
    WindowWidth=330
    WindowHeight=193
 
    'calcul des paramètres des boutons
    dim nom$(2*qte)  'texte affiché sur le bouton(deux noms par boutons, donc 2*qte)
    dim numero(qte)  'contiendra l'état de chaque bouton (0 à 1 ou 1 à 0 à chaque clic)

    restore [nom_boutons]   'attribution du nom des boutons
    for atchoum=0 to 15
        read a$:nom$(atchoum)=a$
    next
 
    'définition des boutons
    'nom, connecté au sous-programme, angle de référence, x, y, largeur, hauteur
    button #fenetre.b1,nom$(0),[sp1],UL,15,15,80,25
    button #fenetre.b2,nom$(2),[sp2],UL,115,15,80,25
    button #fenetre.b3,nom$(4),[sp3],UL,215,15,80,25
    button #fenetre.b4,nom$(6),[sp4],UL,15,70,80,25
    button #fenetre.b5,nom$(8),[sp5],UL,115,70,80,25
    button #fenetre.b6,nom$(10),[sp6],UL,215,70,80,25
    button #fenetre.b7,nom$(12),[sp7],UL,15,125,80,25
    button #fenetre.b8,nom$(14),[sp8],UL,115,125,80,25
 
 
'ouvrir la fenetre qui va accueillir les boutons
    open "Huit boutons" for window_nf as #fenetre
 
        'quitter la fenetre par le gadget de fermeture
        print #fenetre,"trapclose [fermer_fenetre]"
 
    wait
 
 
end
 
'************** sous-programmes ****************

[fermer_fenetre]
    close #fenetre
    end
wait
 
[sp1]
    if numero(0)=0 then print #fenetre.b1,nom$(1) : numero(0)=1 else print #fenetre.b1,nom$(0) : numero(0)=0
wait
 
[sp2]
    if numero(1)=0 then print #fenetre.b2,nom$(3) : numero(1)=1 else print #fenetre.b2,nom$(2) : numero(1)=0
wait
 
[sp3]
    if numero(2)=0 then print #fenetre.b3,nom$(5) : numero(2)=1 else print #fenetre.b3,nom$(4) : numero(2)=0
wait
 
[sp4]
    if numero(3)=0 then print #fenetre.b4,nom$(7) : numero(3)=1 else print #fenetre.b4,nom$(6) : numero(3)=0
wait
 
[sp5]
    if numero(4)=0 then print #fenetre.b5,nom$(9) : numero(4)=1 else print #fenetre.b5,nom$(8) : numero(4)=0
wait
 
[sp6]
    if numero(5)=0 then print #fenetre.b6,nom$(11) : numero(5)=1 else print #fenetre.b6,nom$(10) : numero(5)=0
wait
 
[sp7]
    if numero(6)=0 then print #fenetre.b7,nom$(13) : numero(6)=1 else print #fenetre.b7,nom$(12) : numero(6)=0
wait
 
[sp8]
    if numero(7)=0 then print #fenetre.b8,nom$(15) : numero(7)=1 else print #fenetre.b8,nom$(14) : numero(7)=0
wait
 
 
'************* données du programme ************

[nom_boutons]  '(boutons bi-stables : état d'origine, état modifié)
data "Un","1","Deux","2","Trois","3","Quatre","4"
data "Cinq","5","Six","6","Sept","7","Huit","8"
 
 



Méthode incomplète pour un traitement dynamique des paramètres des boutons (il manque encore la gestion des longueurs et hauteurs de chaque bouton, la taille et la fonte des caractères utilisées, je n'ai pas non plus réfléchi à comment ré-afficher la fenêtre avec sa nouvelle dimension) :
Code VB :
 
'matrice de boutons
'placement automatique des boutons

'désactiver la fenetre dite "principale"
    nomainwin
 
'paramètres des boutons
    larg = 80     'largeur
    haut = 25     'hauteur
    'fonte=
    'couleur cliqué
    'couleur libre
    pasx = larg+20'intervalle de placement des boutons sur x
    pasy = haut+30'intervalle de placement des boutons sur y

    margex = 15 'distance mini entre bords de la fenêtre et bouton sur x
    margey = 15 'distance mini entre bords de la fenêtre et bouton sur x

'paramétrer la fenetre qu'on utilisera pour le programme
    btnparligne=3
    btnparcolonne=3
    qte=8 'quantité de boutons souhaitée

    'dimensions de la fenêtre
    largeur = margex+pasx*btnparligne+margex
    hauteur = margey+pasy*btnparcolonne+margey
 
    'compatibilité de l'affichage avec les dimensions de la fenêtre
    ratiox=largeur/DisplayWidth
    ratioy=hauteur/DisplayHeight
 
    if ratiox>1 or ratioy>1 then 'on adapte les dimensions pour tenir à l'écran
        if ratiox>ratioy then ratio=ratiox else ratio=ratioy
        largeur=DisplayWidth*ratio
        hauteur=DisplayHeight*ratio
    end if
 
    'dimensions retenues
    WindowWidth=largeur
    WindowHeight=hauteur
 
    'calcul des paramètres des boutons
    'nom affiché sur le bouton, x, y bouton
    dim nom$(2*qte), x(qte), y(qte)  '(deux noms par boutons, donc 2*qte)
    dim numero(qte)                   'contiendra l'état de chaque bouton (0 à 1 ou 1 à 0 à chaque clic)

    restore [nom_boutons]   'nom des boutons
    for atchoum=0 to 15
        read a$:nom$(atchoum)=a$
    next
 
    for a=0 to qte-1        'position des boutons
        ybtn=int(a/btnparligne)
        xbtn=a mod btnparligne
        x(a)=margex+xbtn*pasx
        y(a)=margey+ybtn*pasy
    next
 
    'définition des boutons
    'nom, connecté au sous-programme, UpperLeft, x, y, largeur, hauteur
    button #fenetre.b1,nom$(0),[sp1],UL,x(0),y(0),larg,haut
    button #fenetre.b2,nom$(2),[sp2],UL,x(1),y(1),larg,haut
    button #fenetre.b3,nom$(4),[sp3],UL,x(2),y(2),larg,haut
    button #fenetre.b4,nom$(6),[sp4],UL,x(3),y(3),larg,haut
    button #fenetre.b5,nom$(8),[sp5],UL,x(4),y(4),larg,haut
    button #fenetre.b6,nom$(10),[sp6],UL,x(5),y(5),larg,haut
    button #fenetre.b7,nom$(12),[sp7],UL,x(6),y(6),larg,haut
    button #fenetre.b8,nom$(14),[sp8],UL,x(7),y(7),larg,haut
 
 
'ouvrir la fenetre qui va accueillir les boutons
    open "Huit boutons" for window_nf as #fenetre
 
        'quitter la fenetre par le gadget de fermeture
        print #fenetre,"trapclose [fermer_fenetre]"
 
    wait
 
 
end
 
'************** sous-programmes ****************

[fermer_fenetre]
    close #fenetre
    end
wait
 
[sp1]
    if numero(0)=0 then print #fenetre.b1,nom$(1) : numero(0)=1 else print #fenetre.b1,nom$(0) : numero(0)=0
wait
 
[sp2]
    if numero(1)=0 then print #fenetre.b2,nom$(3) : numero(1)=1 else print #fenetre.b2,nom$(2) : numero(1)=0
wait
 
[sp3]
    if numero(2)=0 then print #fenetre.b3,nom$(5) : numero(2)=1 else print #fenetre.b3,nom$(4) : numero(2)=0
wait
 
[sp4]
    if numero(3)=0 then print #fenetre.b4,nom$(7) : numero(3)=1 else print #fenetre.b4,nom$(6) : numero(3)=0
wait
 
[sp5]
    if numero(4)=0 then print #fenetre.b5,nom$(9) : numero(4)=1 else print #fenetre.b5,nom$(8) : numero(4)=0
wait
 
[sp6]
    if numero(5)=0 then print #fenetre.b6,nom$(11) : numero(5)=1 else print #fenetre.b6,nom$(10) : numero(5)=0
wait
 
[sp7]
    if numero(6)=0 then print #fenetre.b7,nom$(13) : numero(6)=1 else print #fenetre.b7,nom$(12) : numero(6)=0
wait
 
[sp8]
    if numero(7)=0 then print #fenetre.b8,nom$(15) : numero(7)=1 else print #fenetre.b8,nom$(14) : numero(7)=0
wait
 
 
'************* données du programme ************

[nom_boutons]  '(boutons bi-stables : état d'origine, état modifié)
data "Un","1","Deux","2","Trois","3","Quatre","4"
data "Cinq","5","Six","6","Sept","7","Huit","8"
 
 

Ces programmes sont faits en travaillant avec Wine/Linux, je ne les ai pas essayés avec un Windows natif.

Voili...
____________________
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

   
Général » Agrandir une fenêtre et son contenu tout un programme...  

 |  |

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