Gambas France BETA


Pas de compte ? Incription

[Résolu]Un affichage qui se passe mal...

Ce sujet est résolu.

1
AuteurMessages
Foromus#1 Posté le 18/7/2010 à 17:12:00
Bonjour à tous,

Voilà, j'ai une frame - enfin, un panel, sur lequel j'ai disposé plusieurs choses, et en particulier :
- Un label1 sur lequel j'affiche "Veuillez patienter..."
- Par dessus, j'ai une tabstrip 2 onglets, onglet1 avec une liste, onglet2 vide.
- En dessous de ces 2 composants, j'ai un autre label2, et qui affiche "En attente"
Rien d'extraordinaire, donc...

Le déroulement :
A un instant donné, j'ai mon label1 bien renseigné("Veuilez patienter..."), mais comme il est recouvert par la tabstrip, il est invisible ( Si je déplace la tabstrip, je le vois bien).
Mon label2 apparait normalement avec son texte("En attente").
Je clique sur un bouton, pour lancer ce que j'ai à faire, et ce que j'ai à faire est assez long : lecture de fichiers de listes, recherches, tris, etc, ça peut demander 8 ou 10 secondes, d'où mes messages d'invite à la patience. A cet effet, je mets ma tabstrip.visible à false, de manière à laisser apparaître mon message en label1, le label2 devant rester affiché azvec un nouveau texte "En recherche".
A la fin du processus, je réaffiche ma tabstrip, tout en sachant que pendant la procédure, l'onglet2 a été renseigné par une liste. Concernant mon label2, je mets dedans le nombre d'éléments contenus dans cette liste de l'onglet2.
Rien de compliqué, donc...

Le souci :
Les procédures font ce qu'elles ont à faire et donnent le résultat souhaité. Ce qui est curieux, c'est que, dès le lancement, le tabstrip s'efface bien (normal), mais le label1 ne s'affiche pas, et le label2 disparaît...
En fait, mes messages d'invite à la patience ne sont jamais affichés !
A la fin de la procédure, le tabstrip s'affiche de nouveau, et en onglet2, avec sa liste. De même, mon label2 s'affiche bien avec le nombre d'éléments.

Bon, vous allez me dire que je n'ai qu'à chercher, il y a bien quelque part un ""label.visible = false"", ou un truc du genre... J'ai bien cherché - l'outil recherche est tout de même efficace, mais je n'ai rien trouvé.
Si je mets un "Return" pour arrêter les choses dans les premières lignes de ma première procédure, je constate que mes commandes sont bien respectées : tabstrip disparaît, label1 apparaît, label2 affiche le nouveau message. Naturellement, ces commandes sont en début, et si il y a effacement ultérieur, je n'ai pas le temps de les voir, en fonctionnement normal.
J'ajoute que plus loin dans mon programme, j'ai une démarche similaire, la tabstrip disparaît et le label1 affiche un autre message.
Bon, je me suis dit que tout cela devait aller trop vite, j'ai collé des "Sleep", un timer et autres subterfuges du même genre pour conjurer le sort, rien n'y fait... En désespoir de cause, je me suis dit que la "pile" ne devait pas assurer, j'ai donc trouvé dans les propriétés une configuration possible: de "Auto" je suis passé à 64K (max), rien n'a changé pour autant !
Bien, voilà 3 jours que je bute sur cette connerie, je reste quand même un peu désappointé....
Prokopy#2 Posté le 20/7/2010 à 00:13:00
Kinder PinguiSalut Foromus,

Bon voilà j'ai étudié un peu ton problème, et j'ai créé un formulaire qui fait grosso-modo ce que tu veux, sans les lectures de fichiers de listes, recherches, tris, etc. , juste pour le côté fenêtre, et tout marche (j'ai mis un Wait au lieu de ta fonction). Est-ce que ça correspond à ton code ? Sinon, tu peux le poster ?

Voilà ma classe de formulaire :

1
' Gambas class fileInherits FormPrivate Onglets As TabStripPrivate Texte1 As LabelPrivate Texte2 As LabelPrivate Bouton As ButtonPublic Sub _new() Me.Arrangement = Arrange.Vertical Onglets = New TabStrip(Me) Onglets.Count = 2 Onglets.Expand = True Texte1 = New Label(Me) Texte1.Visible = False Texte1.Text = "Veuillez patienter …" Texte1.Height = 60 Bouton = New Button(Me) As "Bouton" Bouton.Height = 30 Bouton.Text = "Commencer !" Texte2 = New Label(Me) Texte2.Text = "Prêt" Texte2.Height = 15 EndPublic Sub Bouton_Click() Texte2.Text = "En attente des données …" Onglets.Visible = False Texte1.Visible = True Bouton.Enabled = False 'Des choses … Wait 5 'Encore plus de choses … Texte2.Text = "73 éléments retournés" Onglets.Visible = True Texte1.Visible = False Bouton.Enabled = True End


Voilà,

Cordialement. :)
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
Foromus#3 Posté le 28/7/2010 à 16:14:00
Bonjour,

Bonjour à tous,

Merci pour cette réponse.

Mon code correspond sensiblement à ça.
J'avais aussi essayé l'instruction "wait", mais ça n'avait pas fonctionné. En fait, de tout ce que j'avais essayé, rien n'avait fonctionné ! J'ai remarqué, avec Gambas, quand c'est parti à mal fonctionner, je ne m'en sors pas, j'ai déjà eu un gros souci avec une procédure récurrente et qui m'avait pareillement coincé.
Dans un pareil cas, j'arrête tout, je reprends plus tard, en changeant quand même certaines choses.
Là, en l'occurrence, j'ai remis un timer, et j'ai obtenu ce que je voulais. Alors, pourquoi ça n'a pas fonctionné la première fois ? Peut-être avait-il un temps trop bref, je ne me souviens plus ce que j'avais mis.
Finalement, je n'ai pas remodifié, car le timer me convient mieux qu'un wait dans ce cas. Peut-être aussi que le timer consomme moins de ressources, je ne sais pas, en tous les cas, dans mon souci, c'est bien parce le processus demandait beaucoup de choses que je n'avais pas l'affichage souhaité. Dans le cas du timer, mon affichage se fait, après quoi, vogue la galère...

A propos du code ci-dessus :
J'ai pris l'habitude, dans mes déclarations en début classe, de déclarer en Public. Dans le cas d'une déclaration en Private, jusqu'où la variable est-elle visible ? De toute façon, une Public ne sera visible que dans la classe du formulaire considéré, alors, quel intérêt de mettre une Private ?
Pour la Tabstrip, je n'ai pas fait de déclaration par le code, le formulaire suffit, en réalité, par le code, j'affiche un onglet ou l'autre. Pareil pour les autres contrôles, dans ce cas, pourquoi les déclarer en début de classe ?
manu#4 Posté le 28/7/2010 à 18:27:00
Avec Gambas ca roule !Bonsoir,

De toute façon, une Public ne sera visible que dans la classe du formulaire considéré, alors, quel intérêt de mettre une Private ?


Non Foromus !


Une variable Pubic est visible de toutes les classes de ton application en l'appelant ainsi de n'importe quelle classe :

1
MaClasseOuEstDeclaréLaVariable.MaVariable



Pour la Tabstrip, je n'ai pas fait de déclaration par le code, le formulaire suffit, en réalité, par le code, j'affiche un onglet ou l'autre. Pareil pour les autres contrôles, dans ce cas, pourquoi les déclarer en début de classe ?


C'est une bonne habitude quand on veux aider les autres : Tout est dans le code. Ca évite de dire, Créé une tabstrit dans Fmain, met 2 onglets etc....Là, tu copie le code et ca marche de suite ;)
Jeanne d'arc, elle a frit, elle a tout compris ! ;)

Config :
Manjaro linux (excellent !)
XFCE 4.1 (simple et efficace)
Gambas 3 dans les dépots (confort total)
Foromus#5 Posté le 28/7/2010 à 19:11:00
Bonsoir,

Autant pour moi...
Exact et je l'ai déjà utilisé, une variable Public déclarée dans une classe1 est visible dans une autre classe2, sous condition de mettre le chemin :
Donc, dans une classe2 je vais écrire : Classe1.Mavariable. J'utilise ce système en mettant mes variables (enfin, pas toutes ! ), dans un module, comme ça, je peux les utiliser sur n'importe quel formulaire.
Maintenant, et dans une classe, quand utiliser une procédure public ou private ? Si j'ai bien compris, c'est le même cas de figure que ci-dessus ?...

Bon, j'ai encore à apprendre...

Merci pour ces aides !
Donc, je ferme....
Prokopy#6 Posté le 28/7/2010 à 19:25:00
Kinder Pingui

J'avais aussi essayé l'instruction "wait", mais ça n'avait pas fonctionné. En fait, de tout ce que j'avais essayé, rien n'avait fonctionné !


Salut Foromus,

Normalement tu n'as besoin ni de timer, de Wait, de Sleep ou de quoi que ce soit. Tu à juste à remplacer mon "Wait 5" par ta fonction qui lit tes fichiers, les trie, etc. Le code qui suivra attendra gentiment que ta fonction se termine, donc les Labels se réactualiseront lorsque tes opérations seront terminées. ;)


Pour la Tabstrip, je n'ai pas fait de déclaration par le code, le formulaire suffit, en réalité, par le code, j'affiche un onglet ou l'autre. Pareil pour les autres contrôles, dans ce cas, pourquoi les déclarer en début de classe ?
une bonne habitude quand on veux aider les autres : Tout est dans le code. Ca évite de dire, Créé une tabstrit dans Fmain, met 2 onglets etc....Là, tu copie le code et ca marche de suite ;)
[/Quote]

En effet, mais c'est aussi au cas où il serait planté dans la création de son formulaire. Comme pour faire en sorte qu'un contrôle soit dans un conteneur, il fallait d'abord sélectionner le conteneur, puis ensuite créer le contrôle, on se fait avoir très facilement. Je me souviens que quand j'ai commencé Gambas il y a deux ans, je me faisais avoir presque tout le temps, et le problème a parfois des chances qu'il vienne de là. :D

Juste comme ça, essaie de créer une nouvelle classe (et non pas un formulaire), et colle le code que je t'ai donné. Ensuite crée un module de démarrage (genre MMain) où tu instancies ta classe et où tu appelles sa méthode Show(). Si ça marche bien, alors c'est que ton formulaire a un problème.

La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
Foromus#7 Posté le 28/7/2010 à 20:12:00
Le problème était bien là : les labels étaient réactuallisés après...

Pour les contrôles dans le bon container, j'ai du me faire avoir un coup ou deux, mais pas plus...
C'est assez facile d'éviter : la page classe propose une hiérarchie, et avec ça, on sait exactement qui est qui et où et quoi... Mais on peut toujours tomber dans un piège...
1