French Accéder aux objets de l'interface depuis plusieurs modules

antonomase

Active Member
Licensed User
Bonjour

Question d'un débutant

Je suis en train d'écrire une application et j'ai un code source qui commence à devenir assez long et donc difficile à lire. Je voudrais séparer ce code en différents modules spécialisés : cela me permettrait d'avoir une meilleure lisibilité et une meilleure maintenance. Mais je ne sais pas comment accéder aux objets de l'interface depuis ces modules.

exemple
le code principal est

B4X:
sub globals
dim lblForname, lblSurname, lblFullname as Label
dim btnSend as Button
Sub btnSend_Click
  ComposeAddress
End Sub

Sub ComposeAddress
  lblFullname.Text = lblForname.Text & " " & lblSurname.Text
End Sub



Je voudrais avoir
Code principa
B4X:
sub globals
 dim lblForname, lblSurname, lblFullname as Label
 dim btnSend as Button

Sub btnSend_Click
  AddressManager.ComposeAddress
End Sub

code Module AddressManager
B4X:
sub ComposeAddress
 lblFullname.Text = lblForname.Text & " " & lblSurname.Text
End Sub

Bien entendu, c'est juste un exemple. Mais la question est donc : comment accéder aux objets de l'interface depuis différents modules ?

Merci
 

klaus

Expert
Licensed User
Il n'est pas possible d'accéder directement à des views depuis d'autres modules.
Par-contre on peut transmettre des views.
Dans ton exemple:
- soit transmettre les views:
B4X:
Sub btnSend_Click
    AddressManager.ComposeAddress(lblFullName, lblForename, lblSurname)
End Sub
B4X:
Sub ComposeAddress(lbl1 As Label, lbl2 As Label, lbl3 As Label)
    lbl1.Text = lbl2.Text & " " & lbl3.Text
End Sub
- ou ne transmettre que deux texts et retourner le troisième:
B4X:
Sub btnSend_Click
  lblFullName.Text = AddressManager.ComposeAddress(lblForename.Text, lblSurname.Text)
End Sub
B4X:
Sub ComposeAddress(txt1 As String, txt2 As String) As String
    Return txt1 & " " & txt2
End Sub

Une autre solution est de jouer avec des 'régions' qui permettent de cacher ou d'afficher des zones de code.
Voir chapitre 4.2.4 Collapse a Region dans le Beginner's Guide.

Ou alors diviser ton projet en différentes Activities.

Meilleures salutations.
 

antonomase

Active Member
Licensed User
Merci pour la réponse.

J'avais effectivement pensé à passer les views en paramètres, mais par exemple j'ai une fonction ResetAll qui remet à zéro une bonne cinquantaine de views sur le texte, la couleur, ... C'est un code assez inintéressant mais qui occupe un gros paquet de lignes. Et je ne peux pas modifier les paramètres chaque fois que j'ajoute ou que je retire une view.

Et puis le fait d'avoir ça dans un module à part permettait de jouer plus facilement avec les onglets.

Mais bon... on va faire avec et je vais donc me contenter des régions. Merci beaucoup
 

klaus

Expert
Licensed User
Si toutes ces views sont regroupés dans un Panel il serait possible de passer celui-ci dans la routine ResetAll et d'accéder aux différents views dans celle-ci.
Avec:
B4X:
For i = 0 To Panel1.NumberOfViews - 1
    Dim lbl As Label
    lbl = Panel1.GetView(i)
    lbl.Text = ""
    .
    .
Next

Meilleures salutations.
 

antonomase

Active Member
Licensed User
J'ai effectivement des panneaux. Mais comment je fais à partir de Panel1.GetView(i) (ou GetAllViewsRecursive) pour savoir quel est le nom de la view pour pouvoir déclencher les actions adéquates : j'ai des labels qui doivent avoir un texte remis à "0", d'autres qui doivent avoir un autre texte, certains labels ou boutons qui doivent être rendus invisibles, ...
Sachant que je ne peux pas utiliser les tags car ils sont déjà utilisés.
 

antonomase

Active Member
Licensed User
Ca devient très compliqué pour juste répartir du code sur plusieurs fichiers. C'est d'ailleurs un de mes reproches fait à ce produit que je découvre depuis 2 semaines environ : il est vraiment génial et il a des fonctionnalités qui n'ont rien à envier à des produits beaucoup plus chers, mais il manque un peu de finitions. Une documentation qui n'en est pas vraiment une, ce coup qui empêche de répartir le code source sur plusieurs fichiers, ...

Un autre truc qui (me semble t'il) existait dans PowerBuilder ou dans VB) : la possibilité de faire des tableaux de views directement dans le designer afin de pouvoir faire des boucles directement sans passer par un panel qui regroupe ces Views ou par des astuces de (par exemple, un tableau de radiobuttons ou un tableau de labels)
 

Informatix

Expert
Licensed User
Ca devient très compliqué pour juste répartir du code sur plusieurs fichiers. C'est d'ailleurs un de mes reproches fait à ce produit

Tu as du mal à organiser ton code et c'est la faute du langage ? Ben voyons...

J'avais effectivement pensé à passer les views en paramètres, mais par exemple j'ai une fonction ResetAll qui remet à zéro une bonne cinquantaine de views sur le texte, la couleur, ... C'est un code assez inintéressant mais qui occupe un gros paquet de lignes. Et je ne peux pas modifier les paramètres chaque fois que j'ajoute ou que je retire une view.

Quand je lis ce genre d'horreur, je comprends que ton code doit ressembler à un gros plat de spaghettis indigeste. ;) Poste-le histoire qu'on te montre comment l'écrire de façon plus efficace et comment le réorganiser. Un module de code n'est pas forcément la bonne solution. Utiliser une classe est peut-être plus intéressant, surtout qu'on peut créer et partager des vues avec les classes.

Un autre truc qui (me semble t'il) existait dans PowerBuilder ou dans VB) : la possibilité de faire des tableaux de views directement dans le designer

Tu veux dire que tu crées le premier item et qu'ensuite une liste est créée en répétant le premier item? On ne peut pas faire ça avec Android (pas seulement avec B4A). Il faut faire une boucle pour remplir un ScrollView.
 
Last edited:

antonomase

Active Member
Licensed User
@Informatix

Tu es qui pour juger de ce que je fais ? J'adore les mecs qui se la pètent et qui commencent à présupposer sur l'organisation de mon code et son aspect spaghetti.

Tu veux dire que tu crées le premier item et qu'ensuite une liste est créée en répétant le premier item? On ne peut pas faire ça avec Android (pas seulement avec B4A). Il faut faire une boucle pour remplir un ScrollView.
Ce n'est absolument pas de quoi je parle. Peut-être que tu aurais pu poser la question si mon explication n'était pas claire au lieu de te faire TES idées.

C'est assez souvent la différence entre les forums anglophones et les forums français : en général, sur les forums anglophones, les mecs essayent de répondre aux questions que tu poses ; sur les forums français, les mecs exposent leur savoir sans se préoccuper de la question posée.

Merci de m'avoir répondu.
 

Informatix

Expert
Licensed User
Qui je suis? On s'en fout. Est-ce que je peux t'aider? C'est certain. Maintenant, si tu veux me fermer la porte au nez, c'est bien parti et ça ne m'empêchera pas de dormir. J'ai trouvé un peu gros, alors que tu débutes, que tu accuses le langage plutôt que ta propre compétence. Au vu de tes jugements à l'emporte-pièce, je me suis dit que ce serait amusant d'en émettre aussi quelques-uns histoire de te montrer un peu l'impression que ça fait.
Cela étant dit, je t'ai avancé une solution possible à ta première question: utiliser les classes. Pour développer ce point, il faudrait que je vois un peu ton code. C'est très difficile de raisonner dans le vide.

Ce n'est absolument pas de quoi je parle. Peut-être que tu aurais pu poser la question si mon explication n'était pas claire au lieu de te faire TES idées.
Il m'a bien semblé que j'avais posé une question (enfin je crois vu que j'ai mis un point d'interrogation). J'ai pensé, naïvement, que tu faisais allusion à un composant de VB, mais puisque ce n'est pas ça, je ne vois pas du tout de quoi tu parles (et pourquoi tu fais référence à VB).

C'est assez souvent la différence entre les forums anglophones et les forums français : en général, sur les forums anglophones, les mecs essayent de répondre aux questions que tu poses ; sur les forums français, les mecs exposent leur savoir sans se préoccuper de la question posée.

Si tu nous épargnes tes jugements à deux balles, peut-être qu'on pourra parler du langage et trouver une solution à ton problème.
 

antonomase

Active Member
Licensed User
J'ai trouvé un peu gros, alors que tu débutes, que tu accuses le langage plutôt que ta propre compétence.
Tu confonds peut-être le fait que je débute avec Basic4Android et le fait que je sois compétent. Je ne vais pas te donner mon CV, mais ça fait plus de 25 ans :
- Que je fais du développement informatique depuis des langages de base comme l'assembleur jusqu'à des langages orientés objets purs comme Smalltalk en passant par tous les hybrides plus ou moins objets comme PowerBuilder, Visual Basic, PHP et certains Pascal
- Que j'ai dirigé des équipes informatiques et que j'ai pu voir les problèmes de maintenance qui se posent lorsque tu commences à gérer des applications qui font plusieurs centaines de milliers de lignes et qu'il y a 20 personnes qui sont intervenues dessus pendant 5 ans.
- Que des langages, j'en ai vu et utilisé beaucoup, que pas un seul n'est parfait et que je me permet d'émettre des critiques sur chacun d'entre eux

si tu veux me fermer la porte au nez [...] Si tu nous épargnes tes jugements à deux balles [...] ce serait amusant d'en émettre aussi quelques-uns histoire de te montrer un peu l'impression que ça fait.
Le meilleur moyen que tu as trouvé pour ouvrir la porte et coopérer, c'est de parler de mon code qui ressemble à un plat de spaghetti et inefficace.
Ce qui n'est d'ailleurs pas de ta part un jugement à deux balles de ta part bien entendu...

Alors mon gars, l'agressivité, elle se trouve de ton côté et je te la renvoie. J'ai émis des critiques (justifiées ou pas) à l'encontre du langage et de l'outil. Mais ce n'est pas toi que j'ai critiqué (d'ailleurs je ne savais même pas que tu existait). Et toi au lieu de répondre à ces critiques sur le langage et éventuellement de m'expliquer en quoi elles étaient injustifiées, tu t'es senti personnellement responsable et tu m'es rentré dans le lard avec des attaques personnelles. Un comportement de fanboy plutôt qu'un comportement d'entraide.

Alors, ne viens pas me reprocher une attitude que tu as toi même initiée.

Donc, même si cela te déplaît et que tu me trouves incompétent, je renouvelle mes critiques à l'encontre de Basic4Android (bien qu'il t'a certainement échappé que j'ai dit que je trouvais ce langage génial)
- L'absence d'une documentation digne de ce nom
- La difficulté de segmenter son code dans plusieurs fichiers afin de faciliter la lecture et la maintenance

Et j'en rajoute deux.
- Dans le designer : quand on sélectionne plusieurs Views dans le designer, les seuls attributs présentés sont EventName, Parent, Top, Left, ... Donc pas possible de passer tout un lot de views en invisible, de changer leur police de caractères ou leur alignement.
- Le designer propose parfois les couleurs sous une forme nommée, parfois sous forme RGB sans avoir la correspondance. J'avais mis un objet dans un gris nommé. Deux jours après, j'ai voulu mettre un autre objet dans le même gris (dont j'avais oublié le nom bien entendu). Sauf que pour le premier, je n'avais plus que sa valeur RGB sans le nom et que pour le deuxième j'avais le nom mais pas le RGB.

Quand au coup des tableaux de views, c'est pouvoir nommer les objets dans le designer lbl(1), lbl(2), lbl(3), ... au lieu de lbl1, lbl2, lbl3. Ce qui permettrait dans le code source de pouvoir accéder directement à un tableau de views.

Enfin à propos des classes, Basic4Android permet de faire pas mal de choses, mais exclusivement sous forme programmatique d'après ce que j'ai pu en voir, donc sans profiter des avantages d'un designer.

Il me semble qu'on est très loin de ce que pouvait faire un langage tel que PowerBuilder où tu pouvais poser des objets à l'écran, leur assigner leurs attributs visuels, mettre en place leurs méthodes (click, changed, ...) et les enregistrer en tant qu'objets à part entière utilisables directement. Par exemple, tu pouvais faire un objet EditTextemail qui vérifie qu'une adresse email est valide (objet hérité d'un objet simple), un objet EditTextemailVerif qui combine les deux précédents et qui vérifient que les emails sont identiques et un objet FormulaireAdresse qui combine un champ pour le nom, le prénom, ... les deux adresses emails, ... (objets composés de plusieurs objets simples).
Ces objets pouvaient alors être utilisés dans le designer : c'est-à-dire qu'ils seraient apparus dans le menu AddView et que leurs propriétés accessibles dans le panneau. En un clic dans AddView (ou son équivalent), on pouvait ajouter un formulaire de saisie d'adresse.

Je viens de regarder le code ClsWheel, un objet que je vais utiliser(*). Mais ce qui me choque, c'est que la puissance du designer n'est pas utilisée. A quoi cela sert-il d'avoir un designer visuel si c'est pour tout faire de manière programmatique. Initialiser le bouton OK, sa taille, sa position, sa police de caractères, ... placer les roues, ... tout ça en code alors qu'une grande partie pourrait être faite sous forme visuelle (ce qui allègerait le code).
Idem à l'utilisation : pouvoir placer l'objet clsWheel directement à l'écran et indiquer ses propriétés dans le designer. Là aussi, cela allègerait le code source.

Donc les classes pour répondre à mon problème, je ne trouve cela pas particulièrement adapté car globalement je vais perdre en efficacité à la fois en développement initial qu'en debugging et ensuite en maintenance et évolutions.
 

Informatix

Expert
Licensed User
Tu confonds peut-être le fait que je débute avec Basic4Android et le fait que je sois compétent. Je ne vais pas te donner mon CV, mais ça fait plus de 25 ans :

Nous sommes nombreux sur ce site à avoir un profil très voisin du tien, à commencer par moi. Il n'empêche que la plupart ne sont pas arrivés en formulant des critiques au bien fondé discutable. Android et B4A ont des spécificités qui peuvent être déroutantes, même pour un vieux routard du développement, et il m'a personnellement fallu des mois avant de maîtriser le langage et son environnement, donc je pense qu'il vaut mieux rester humble quand on a seulement deux semaines derrière soi. Le langage a des défauts bien sûr, mais il faut voir ce qui est dû à Android, ce qui est dû à Java (B4A est un traducteur Basic -> Java, ce dont certains débutants n'ont pas conscience) et ce qui est spécifiquement dû à cette version du Basic. Je ne suis pas sûr que tu sois capable de démêler tout ça si ton expérience de développement sous Android est encore toute fraîche.

Le meilleur moyen que tu as trouvé pour ouvrir la porte et coopérer, c'est de parler de mon code qui ressemble à un plat de spaghetti et inefficace. Ce qui n'est d'ailleurs pas de ta part un jugement à deux balles de ta part bien entendu...

Précisément. Je n'ai aucune idée de ce à quoi ressemble ton code. Comme je te l'ai dit dans mon message précédent, je me suis amusé à sortir un jugement sans fondement histoire de te mettre en face d'un miroir grossissant. C'est pénible, n'est-ce pas?
D'autre part, quand tu réponds à Klaus, qui a bénévolement écrit deux guides et des centaines d'exemples pour les débutants, que son travail de documentation n'est pas digne de ce nom, eh bien je trouve que Klaus est plutôt cool, même s'il est le premier à dire que sa doc peut être améliorée. Un peu de diplomatie ne fait pas de mal.
Moi, je trouve que sa documentation et les tutoriels du forum sont largement suffisants pour n'importe quel professionnel digne de ce nom. Et puis, il y a toujours plein de gens pour répondre aux questions, à commencer par Klaus et Erel, le développeur du langage, et j'ai vu qu'un livre était en préparation.

Un comportement de fanboy plutôt qu'un comportement d'entraide.

Est-ce que tu es vraiment obligé de ponctuer ta prose de ce genre de jugements? C'est un peu gonflant.

Dans le designer : quand on sélectionne plusieurs Views dans le designer, les seuls attributs présentés sont EventName, Parent, Top, Left, ... Donc pas possible de passer tout un lot de views en invisible, de changer leur police de caractères ou leur alignement.

Oui c'est clair que le designer a de nombreux défauts et notamment ceux que tu cites. La wish list à ce sujet est assez fournie (tu verras d'ailleurs à ce sujet que mes posts n'ont rien d'un fanboy). Je ne comprends pas pourquoi Erel n'en fait pas un point fort de son produit. Jusqu'à fin 2011, les développeurs Android utilisant Java n'avaient pas de designer du tout et il y en a encore beaucoup (vu les messages sur StackOverflow) qui font leurs fichiers XML à la main (les interfaces sont décrites par des fichiers XML en Java). Un excellent designer pourrait en convaincre certains de migrer vers B4A.

Il me semble qu'on est très loin de ce que pouvait faire un langage tel que PowerBuilder où tu pouvais poser des objets à l'écran, leur assigner leurs attributs visuels, mettre en place leurs méthodes (click, changed, ...) et les enregistrer en tant qu'objets à part entière utilisables directement.
Je n'ai jamais utilisé PowerBuilder mais je vois de quoi tu parles. Le parti pris, ici, est que ce qui est conçu dans le designer est une sorte de brique visuelle et non un formulaire (comme dans les produits Visual Studio ou Borland), un composant ou une entité autonome (avec son propre code). C'est un ensemble visuel qui s'adapte, avec un script, à différentes résolutions et différentes densités d'écran. Rien de plus. Il n'est pas lié à une activité particulière, donc il n'est pas possible de gérer les événements à son niveau.

Je viens de regarder le code ClsWheel, un objet que je vais utiliser(*). Mais ce qui me choque, c'est que la puissance du designer n'est pas utilisée. A quoi cela sert-il d'avoir un designer visuel si c'est pour tout faire de manière programmatique. Initialiser le bouton OK, sa taille, sa position, sa police de caractères, ... placer les roues, ... tout ça en code alors qu'une grande partie pourrait être faite sous forme visuelle (ce qui allègerait le code).

C'est clair. Erel a encore du pain sur la planche.
 

antonomase

Active Member
Licensed User
Il n'empêche que la plupart ne sont pas arrivés en formulant des critiques au bien fondé discutable
Donc en gros, il faut fermer sa gueule ? Il faut un long parcours d'initiation avant de pouvoir oser formuler la moindre critique ?

Comme je te l'ai dit dans mon message précédent, je me suis amusé à sortir un jugement sans fondement histoire de te mettre en face d'un miroir grossissant. C'est pénible, n'est-ce pas?
Ou tu as vu que je te jugeais ?
Quant au jugement "sans fondement" sur le produit, cela signifierait que je n'aurais pas vu le produit et que je ne l'aurais pas utilisé.

D'autre part, quand tu réponds à Klaus, qui a bénévolement écrit deux guides et des centaines d'exemples pour les débutants, que son travail de documentation n'est pas digne de ce nom
Désolé pour lui. Je ne remet pas en cause la quantité de travail, ni la bonne volonté de ceux qui bénévolement ou professionnellement ont écrit la documentation de ce produit. Il n'en reste pas moins qu'elle n'a pas un niveau professionnel par rapport à d'autres produits. Même celle de PHP, écrite par des "amateurs", je suis désolé de dire qu'elle a une autre tenue et une facilité d'accès à l'information beaucoup plus simple, rapide et complète.
C'est tout.

Si maintenant, il y a un projet d'organisation de la documentation pour la rendre efficace, je suis tout à fait prêt à y participer.

Un peu de diplomatie ne fait pas de mal.
Dixit celui qui s'est senti obligé de m'agresser après que j'ai écrit cette phrase hyper violente que je remet en gras pour bien accentuer son caractère non diplomatique, excessif et non fondé : "il est vraiment génial et il a des fonctionnalités qui n'ont rien à envier à des produits beaucoup plus chers, mais il manque un peu de finitions. Une documentation qui n'en est pas vraiment une, ce coup qui empêche de répartir le code source sur plusieurs fichiers, ..."
C'est vrai, je le reconnais, que c'est une attaque incroyablement injuste et méchante contre le produit. Une véritable déclaration de guerre qui méritait qu'un preux chevalier vienne rétablir l'ordre et châtier le mécréant. "Il manque un peu de finition" ... ouahou ! Quelle horreur de dire cela !

Moi, je trouve que sa documentation et les tutoriels du forum sont largement suffisants pour n'importe quel professionnel digne de ce nom.
Donc comme c'est ton avis, les autres doivent penser pareils ?

Est-ce que tu es vraiment obligé de ponctuer ta prose de ce genre de jugements? C'est un peu gonflant.
C'est sûr qu'on n'aime pas qu'on nous présente un miroir qui montre des défauts. Et encore une fois, je vais me répéter : tu n'avais pas besoin de m'agresser personnellement quand je critique un produit sur certains points (après avoir dit qu'il était génial).

Restons en là. Je te laisse le dernier mot si cela te fait plaisir. Pour moi, ce sujet est clos, à moins que tu ne veuilles que l'on parle de points techniques ou d'idées d'amélioration.
 
Top