Fonction d'affichage [Scheme] - Divers - Programmation
Marsh Posté le 22-04-2005 à 12:26:08
=> (send qqechose clear) ?
=> faut y instancier un un objet text% ou juste text-field% comme dans DrScheme normal ?
Marsh Posté le 22-04-2005 à 13:08:15
Merci pour la réponse!
Mais la méthode (send xxxx clear) ne change pas la fenetre des intéractions...
Je vais essayer de mieux m'expliquer. Voila ce que j'ai dans ma fenêtre des intéractions:
Citation : >(ligne gare) |
Chaque ligne est en fait un (display "blablabla" )(newline).
Je voudrais simplement une fonction qui, évaluée après ces display, efface tous le texte affiché, afin d'avoir une fenetre des intéractions vide...
Sinon pour le deuxieme probleme je ne comprend pas, le text% veut comme argument un nombre positif...?
Marsh Posté le 22-04-2005 à 13:25:12
Je comprend pas tu veux afficher qq chose et l'effacer tout de suite apres ? C'est quoi l'interet de l'effacer ?
Je sais meme pas si c'est permit de faire ca, y a (send a-drscheme:rep:text reset-console) mais je doute fort que l'on puisse l'utiliser sur les interactions proprietaires de la fenetre principale de DrScheme. Si tu veux vraiment avoir du blanc tu peux faire un mega (printf "\n\n\n\.." ).
Sinon pour le text% :
(new text% [(line-spacing _)] [(tab-stops _)] [(auto-wrap _)])
Je te rappele que les arguments entre crochets sont optionels
Marsh Posté le 22-04-2005 à 14:34:34
Pour le 2eme probleme j'ai trouvé, c'était juste la fonction (make-object messsage% "blablabla" parent) qu'il me fallait, merci quand même!
Sinon pour le premier en fait j'ai un formulaire avec des champs "Clé" "Ville" "Département", puis un bouton valider qui rentre une clé une ville et un département dans une base de donnée, qui est en fait une liste de liste dont le car est '("Clé" "Ville" "Département" )
Apres avoir insérer des informations de cette ville dans la liste, la fonction est censé me renvoyé la liste sous la forme d'un "joli" petit tableau construit à base de display!
Le probleme c'est que quand je re-appuie sur valider, ça me renvoie encore le début du tableau avec le nouvel élément insérer à la fin...comme ceci:
Citation : |
J'aimerais qu'entre chaque fois que j'appuie sur valider, il me remmete à zéro l'affichage de mon tableau, sinon je me retape le nouveau tableau collé à l'ancien!
Mais bon je crois bien que cette fontion magique n'existe pas en fait, et que la seule solution est d'appuyer sur éxécuter (mais dans ce cas je perd toutes mes informations enregistrées!)
Merci en tout cas pour tes réponses rapides!
Marsh Posté le 22-04-2005 à 14:52:15
Bon deja t'a une fenetre, donc afficher des infos dans les interactions de DrScheme c'est un peu light !
Pour regler ton petit probleme d'affichege, je te conseille vivement de crée un champs text% dans ta fenetre que tu utilisera comme sortie standard de ton prog et tu pourras faire autant de (send text% clear) que tu veux.
Marsh Posté le 22-04-2005 à 15:08:59
Oui voila, justement c'este vers ou je voulais m'orienter, parceque utiliser la fenetre de DrScheme c'est vrai que ça fais un peu bricolage!
Merci de ton aide Chronoklazm!
Marsh Posté le 23-04-2005 à 13:28:38
Hum...j'ai cherché, mais j'ai pas trouvé!
Peux tu (ou pouvez vous s'il y en a d'autre qui lisent ) me donner un exemple simple et concret pour que je pige plus vite:
Exemple:
.J'ai une fonction "Blabla" qui prend en argument une liste et qui me renvoie des informations sur cette liste sous forme de display.
.J'ai construit une frame principale avec un formulaire (text-fiel% et boutton valider) nommée "parent".
.Je voudrais en gros qu'il y ait dans cette frame, un écran de sortie qui me renvoie, les display de la fonction "blabla".
Comment faire?
Désolé moi je ne comprend bien qu'en voyant les autres faire...
Marsh Posté le 23-04-2005 à 16:59:37
Ta fonction Blabla qui fait des display ... ok mais les display sortent dans les interactions (c'est la sortie standard definie par defaut) peut on redefinir la sortie standard ? Pas avec display je pense, faut utiliser fprintf(), regarde l'aide sur fprintf. Mais il faut creer une "sortie" qui sera celle de ta fentre et ca c'est un peu lourd.
Il y a une maniere plus simple.
Ton but est de faire en sorte que Blabla affiche dans TA fenetre, pour cela il faudrait plutot une version de Blabla qui renvoi non pas des #void (comme c'est le cas des display) mais une String pour pouvoir faire (send text insert "ta_chaine" ). Sachant que text est l'objet contenu dans TA fenetre.
Un exemple (pris dans l'annuaire qu'on fait avec le_courtois):
(define (give-tel nom prenom adresse code_postal ville pays A text)
(for-each (lambda (x) (if [or (equal? (personne-nom x) nom)
(equal? (personne-prenom x) prenom)]
(send text insert
(format "Fixe: ~a Portable: ~a\n"
(personne-tel_fixe x) (personne-tel_port x))) ; si #t
(void))) A))
Tu trouvera plus d'exemples dans notre topic sur Scheme dans les Divers.
A+
EDIT : text-field% c'est tres light utilise plutot des text%
Marsh Posté le 24-04-2005 à 17:30:29
Merci encore de ton aide...apparemment vous n'etes que deux à connaitre ce language...
Je sais pas si je peux me permettre de refaire appel à ta science infuse mais voila:
J'ai décidé de travailler qu'avec des strings (parceque je croyais qu'on pouvais travailler avec les display).
Quand j'étais avec des display je connaissais la fonction (newline) pour sauter des lignes, mais maintenant que je suis avec des string je ne connais pas de fonction qui renvoie une string ligne vide!Est ce que ça existe ou je dois me taper un truc du genre:
" "
??
Sinon comme j'aime bien poser les problemes en couple , je n'ai toujours pas compris comment on utilise un text% dans une frame (je veux faire un écran de sortie), parceque jusqu'a présent je connaissais juste le:
(define parent (make-object frame% "Fenetre principale" ))
(define message (make-object message% "Blabla" parent))
puis apres je savais comment modifier les valeurs texte ect...Mais la je crois que text% c'est pas la même classe d'objet!
Qui peux me donner un exemple je veux un text% dans ma frame% parent, dans lequel je peux insérer n'importe quelle variable définie au préalable?
Marsh Posté le 24-04-2005 à 18:45:32
Une string qui saute une ligne => "\n" sinon "\newline" je crois ca doti marcher aussi.
Pour inserer un text% dans une frame (directement c'est pas possible faut d'abord creer un editor-canvas%.
Exemple :
(define principale (instantiate frame% ("Super_annuaire" )(parent #f)
(width 600)(height 650);on définit une taille
(min-width 0)(min-height 0)
;on peut la redimensionner
(stretchable-width #t)
(stretchable-height #t)))
(define editeur (instantiate editor-canvas% (principale)))
(define texte (instantiate text%()))
(send editeur set-editor texte)
Puis tu pourra faire des (send texte insert "ta chaine" )
Et voila.
Marsh Posté le 25-04-2005 à 23:31:19
Salut,
En fait, on est que 1,25 et moi, je suis le .25 . Je crois que beaucoup connaissent et ceux qui apprennent s'enlisent tellement dans leurs exos qu'ils ne pensent pas à partager leurs connaissances ou à aller voir d'autres sources qui pourraient les aiguiller. C'est pour cela qu'il faut mettre les connaissance en commun. Bref, c'était histoire d'écrire.
Tu peux aussi regarder vers "pretty-print" qui fait un retour chariot automatiquement et permet de bonnes mises en page. Sinon, pour ta mise en page, ce sera certes plus galèrant, mais as-tu pensé à faire des colonnes avec text-fields% qui feront comme des champs dans lesquels tu retournes le résultat. Ce sera galérant, mais si t'as le temps, ce sera le petit +. Me suis-je bien exprimé?
Courage !
Marsh Posté le 26-04-2005 à 00:44:36
Merci alors tout les deux (tout les 1.25! )
J'ai fais avec la méthode "\n" et je vais essayer avec "pretty-..." même si c'est à peu près équivalent.
C'est vrai c'est une bonne idée le tableau avec des text-field%, mais c'est vrai que ça va etre du boulot, parceque il va falloir faire une fonction qui crée un nombre adapté de text-field% avec des noms différent...
Puis répartir toutes mes valeurs dans tout ces text field, ça va être chaud !
Merci en tout cas!
Marsh Posté le 27-04-2005 à 19:15:05
Excusez moi mais j'ai encore besoin des schemeurs professionels...
J'ai suivi le conseil du Courtois, et donc maintenant j'ai un fichier comme ça:
.Une fenetre formulaire avec des text-field% et un bouton valider.
.Le bouton valider insere les valeurs rentrées dans le formulaire dans une liste.
.Apres avoir fais l'insertion, le bouton valider m'affiche aussi un tableau a base de text-field%, dans une autre frame% que la frame du formulaire.
Le probleme c'est que quand on veut insérer un autre élément (apres avoir appuyé une premiere fois sur valider) l'ancien affichage de mon tableau reside toujours dans la frame.
Donc en fait il m'affiche l'ancien tableau, puis en dessous un nouveau tableau avec un élément inséré en plus!
N'y a t'il pas moyen de faire un restart de la frame ou quekque chose comme ca?
Ou bien est ce que je dois recréer une frame% qui contiendra mon nouveau tableau (et comment?) apres chaque validation?
Qu'est ce que je peux faire?
Merci d'avance!
Marsh Posté le 27-04-2005 à 19:51:22
Faire une boucle qui efface les text-fields ... (send ton-text-field clear) ?
Marsh Posté le 27-04-2005 à 21:13:51
On peut pas faire send...clear, vu que ces text-field% n'ont pas de noms:
Je te donne un extrait de la fonction qui génere un de ces text-field%:
(send (instantiate text-field%()(label "" ) (parent colonne) (callback void) (enabled #f))
set-value (caar liste))))
Voila donc quand on rappuie sur le bouton de la fonction, il me regénere d'autre text-field%
Et puis je peux pas leur mettre un nom vu que l'on ne connait pas la longueur du tableau (ça peut être un tableau de 300 lignes...)
Marsh Posté le 27-04-2005 à 21:44:56
Tes text-fields n'ont pas de nom ... c'est pas hyper pratique mais bon.
Je pense que tu doit pouvoir les recuperer du panel colonne directement (send colonne get-children) => tu recupere une liste de subarea% donc eventuellement tu peux faire un for-each pour les "clear" tous ... poste ton code stp.
Marsh Posté le 27-04-2005 à 22:01:21
Salut,
Je peux poser une quesion bête? Allons-y. C'est pas beau et pas propre, mais pourquoi est-ce que tu ferai pas en cascade un nettoyage et un remplissage en chaîne?
Genre à l'appui du bouton tu fais un begin (send ...set value '()) ou une liste vide prédéfinie puis tu lances ton affichage (send...set-value(caar liste)). (ok, le foin c'est pour moi).
Edit: ou alors, ce que je vois parfois dans certains programmes pour le rafraichissement, ils passent par des classes%. Mais j'ai jamais compris.
Edit2: en fait, je dis que des c...ies. Mais mon idée était: tu renvoies autant de text-fields que tu as de réponses à ta fonction "Recherche". Ca c'est bon? Donc, tu itercales une pseudo-recherche qui te donne l'ensemble vide, tu lui dit de construire les text-fields avec cette valeur et puis tu passes ta vraie recherche. C'est mieux?
Edit3: Sinon, tu as aussi la solution de chronoklazm. Tu peux utiliser "delete-child" sur ton conteneur de colonne. (send an-area-container delete-child child). Avec un for-each devant. Bref tout ça pour en revenir à la première solution. Mangez du foin! Y a bon!
Marsh Posté le 28-04-2005 à 14:25:04
Mouarf les pinpins de MIAS montpellier
En fait c tout a fait normal que vos text-field soient recréés puisque quand tu clik' tu appelles un instantiate...
Donc votre bouton ne doit pas faire des instantiate mais des
for each (send text-field clear)
Arf les pinpins ... zavez bien choisi votre noms ...
Marsh Posté le 28-04-2005 à 19:42:58
Il doit s'agir d'un "private-joke", mais ce n'est pas mon topic. Le clear, si mes souvenirs sont bons ne permet que d'effacer du texte selectionné (mis en surbrillance) mais en aucun cas de détruire le text-field. Finalement, je vois deux solutions: la méthode proposée avec get-children et delete-child ou, tu crées un panel par défaut et tu rafraîchis en l'envoyant à chaque pression de bouton avant la création de tes nvx text-field. Bon je m'arrête avant de me repéter.
Salut!
Edit: Excuses de polluer ton topic et je suis sûr que t'as pas besoin de moi, mais j'ai fait ça (ça peut peut-être servir à qqn):
Code :
|
Marsh Posté le 22-04-2005 à 11:25:21
Lu!
J'ai un petit problème facilement réglable...
Je voudrais juste connaitre une fonction en Scheme si elle existe qui fais un reset de a fenetre des intéractions. Je m'explique, j'ai fais une fonction qui créer un espece de tableau sous forme de display et de (newline), et je voudrais qu'a un moment dans la fonction, il n'y ait plus rien d'affiché dans la fenetre des intéractions!
Sinon un autre petit probleme:
Comment fait t-on sous le language graphique MrEd pour écrire dans une frame% ?
Je voudrais faire en fait une fenetre avec un texte dedans histoire de faire une page d'acceuil avec des menus autour...
Voila Voila...Merci d'avance pour vos réponses!
---------------
~~PiNpiN~~