Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Comment terminer une saisie dans un objet par entrée | |
| | |
Auteur | Message |
---|
Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Comment terminer une saisie dans un objet par entrée Dim 31 Mai 2009 - 19:29 | |
| Bonsoir,
J'essai de terminer une saisie dans un objet EDIT par la touche entrée du clavier. J'ai essayé scancode, inkey$, input.....
a$=inkey$ nt = asc(a$) if nt = 13 then ....
ou
nt=scancode if nt=13 then ....
Rien n'y fait, je suis obligé d'avoir un BUTTON pour terminer la saisie dans l'EDIT (ce que je voudrais justement éviter)
Quelqu'un peut-il me donner un tuyau
Merci et A+ | |
| | | Georges
Nombre de messages : 290 Age : 55 Localisation : Martinique Date d'inscription : 29/05/2009
| Sujet: saisie EDIT par Entrer Mar 16 Juin 2009 - 16:08 | |
| Salut J-C Voici une piste que je te propose de suivre pour la validation d'un EDIT par entrer - Code:
-
label boucle,suite,quit,retour dim a,a$,t$,te$ width 0,250 : height 0,280 edit 1 top 1,20 : left 1,50 : width 1,80 : height 1,30 on_click 1,retour button 2 top 2,20 : left 2,150 : width 2,60 : height 2,30 caption 2,"Afficher" on_click 2,suite button 3 top 3,60 : left 3,150 : width 3,60 : height 3,30 caption 3,"Terminer" on_click 3,quit retour: t$="" boucle: a$ = inkey$ t$ = t$ + a$ text 1,"" text 1,t$ if a$ = chr$(13) then goto suite goto boucle end suite: hide 2 a = len (t$) a = a-1 te$ = mid$ (t$,1,a) print_locate 100,100 print te$ goto retour quit: terminate
Il y a un ou deux bug mais ça marche. Le bouton afficher est la aussi pour valider l'edit mais il est facultatif georges | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: RE:terminer une saisie dans un edit par entrée Mar 16 Juin 2009 - 21:06 | |
| Merci Georges de t'être attaqué au problème.
Mais désolé chez moi ça marche pas.
Le label Quit entraine un message d'erreur (Violation....) Dans l'édit on ne voit pas la saisie se dérouler.
Et surtout a = len (t$) a = a-1 te$ = mid$ (t$,1,a) Cette partie BUG a est trop petit.
Je comprends bien ta tentative boucle: a$ = inkey$ t$ = t$ + a$ text 1,"" text 1,t$ if a$ = chr$(13) then goto suite Mais si a$="", on fait quoi ?
Je suis un peu surpris par la position de end Mais bon, cela ne marche pas
Merci néanmoins d'avoir essayé.
Avis au PRO, Je pense que le problème n'est pas simple. Que le meilleur d'entre vous trouve la solution, il aura droit à mes félicitations. Pour le Champagne, pas facile par internet. (La bonne excuse!) Je vais moi-même retenter, en m'inspirant du code de georges, et si je trouve, j'aurais droit à vos félictations.
A+
Allez au boulot! | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: RE: Mar 16 Juin 2009 - 21:15 | |
| Pour PANORAMIC:
et pouquoi pas ceci:
LABEL findesaisie EDIT 1 rem avec ses dimensions ON_RETURN 1, findesaisie END findesaisie: la on fait ce qu'on veut RETURN
Mais peut-être j'abuse.
A+ | |
| | | Georges
Nombre de messages : 290 Age : 55 Localisation : Martinique Date d'inscription : 29/05/2009
| Sujet: entrer dans l'EDIT Mar 16 Juin 2009 - 21:43 | |
| Salut Jean-Claude
Mais un rem devant la ligne a=a-1
Cela devrait fonctionner. J'ai mis cette ligne parce que quand j'exécute ce code à l'affichage j'ai un caractère pour le CHR$(13). Si tu as un bug sur le a c'est que ta machine ne tiens pas compte du code d'entrer pour l'affichage.
Je tacherai d'améliorer ce code.
P.S. : je n'ai pris que moins de dix minutes pour sortir ce code. Avec un peu plus de temps la dessus je pense pouvoir sortir quelque chose de mieux.
Soit dit en passant l'entrer dans l'edit bloque tout autre commande d'entrer. Mon idée est de donner l'illusion de l'edit. Je sortirais un code dans cette optique.
georges | |
| | | Georges
Nombre de messages : 290 Age : 55 Localisation : Martinique Date d'inscription : 29/05/2009
| Sujet: complement de réponse Mer 17 Juin 2009 - 0:04 | |
| Salut Jean-Claude si a$="" , la bouche continue et attends une entrée la position de end est un peu normale, elle permet de dissocier la présentation du programme du reste.C'est un automatisme que je préfère garder avec le code panoramic. elle permet aussi d'empécher des plantages intempestifs. les programmes sont bizarres des fois. georges | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: RE: terminer une saisie dans un edit par entrée Mar 23 Juin 2009 - 21:30 | |
| Bonsoir, Je suis désolé Georges, mais même avec le rem devant a=a-1, cela ne marche pas. J'ai un message d'erreur à la ligne suivante: te$ = mid$ (t$,1,a). Il semble que "a" soit égal à zéro. De plus rien ne s'affiche dans l'EDIT. POUR PANORMIC: une petite rectification concernant ON_RETURN 1,findesaisie. Jaurais dû dire plûtot: ON_ENTER 1,findesaisie Soit: - Code:
-
LABEL findesaisie
EDIT 1 rem avec ses dimensions ON_CHANGE 1, insert ON_ENTER 1, findesaisie
END
rem--------------------------------
insert: a$=UPPER$(TEXT$(1)) RETURN
findesaisie: la on fait ce qu'on veut RETURN Le but de la manoeuvre est d'avoir une commande qui, quand on tape sur la touche [Entrée] , branche sur un LABEL. Je sais bien que comme ça sur le papier, c'est facile. Est-ce possible ? Bonne soirée, A+ | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: RE: terminer une saisie dans un edit par entrée Sam 4 Juil 2009 - 14:43 | |
| Bonjour,
Je n'ai pas réussi à programmer une fin de saisie par Entrée dans un EDIT. Le but étant que comme la saisie dans l'édit se fait à partir du clavier, je souhaitais donner la possibilité à l'utilisateur de taper [Entrée] pour lui éviter de reprendre la souris en main. Eh! Oui pour moi le programmeur doit être au service de l'utilisateur. Donc, pour le moment, je continues de d'affubler mon EDIT d'un BUTTON "OK" de petite taille à sa droite. Mais, pour ceux que çà intéresse, j'ai découvert par hasard la "combine" suivante: à la fin de la saisie, je presse la touche [TAB] qui m'envoie direct sur le boutton "OK" et la je tape [Entrée], donc tout çà à parir du clavier. Et RE [TAB] pour aller à la saisie (EDIT) suivante et ainsi de suite.
A+ | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Comment terminer une saisie dans un objet par entrée Dim 2 Aoû 2009 - 10:17 | |
| J'ajoute une nouvelle découverte sur ce sujet. Il s'ait de SET_FOCUS qui permet au programme de positionner le pointeur directement dans l'EDIT, ce qui permet que l'utilisateur n'a pas besoin de cliquer dans cet EDIT pour commencer sa saisie.
A+ | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Comment terminer une saisie dans un objet par entrée Dim 2 Aoû 2009 - 23:25 | |
| Si je reprends le code de Georges légèrement modifié, ça marche très bien: - Code:
-
label boucle,suite,quit,retour dim a,a$,t$,te$ width 0,250 : height 0,280 edit 1 top 1,20 : left 1,50 : width 1,80 : height 1,30 on_click 1, retour button 2 top 2,20 : left 2,150 : width 2,60 : height 2,30 caption 2,"Afficher" on_click 2,suite button 3 top 3,60 : left 3,150 : width 3,60 : height 3,30 caption 3,"Terminer" on_click 3,quit
retour: t$="" boucle: a$ = inkey$: if a$ = "" then goto boucle if a$ = chr$(13) then goto suite t$ = t$ + a$ text 1,"" text 1,t$ goto boucle end
suite: hide 2 print_locate 100,100 print t$ goto retour quit: terminate j'ai simplement mis le test de a$ vide juste après le inkey$, suivi du test de 13 (entrée), ce qui est logique, ce caractère n'a pas à être ajouté à t$ ! Je n'ai pas bien compris non plus l'utilité de faire: te$ = mid$(t$, 1, len(t$)) qui est strictement équivalent à: te$ = t$ Par contre, j'ai une erreur sur le Terminate: Access violation at address 00000017 etc...peut-être une ressource non libérée, mais je n'ai pas approfondi. PS le code de saisie ci-dessus 'boucle' est un peu rustique, il faudrait au moins analyser également le caractère backspace (08) pour pouvoir effacer le dernier caractère entré (correction). Par exemple: - Code:
-
if a$ = chr$(13) then goto suite if a$ = chr$(8) and len(t$)>0 t$ = left$(t$, len(t$)-1) else t$ = t$ + a$ end_if | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Comment terminer une saisie dans un objet par entrée Lun 3 Aoû 2009 - 20:44 | |
| Effectivement çà marche (sauf afficher). J'ai le même problème de violation avec terminate. Ce qui est curieux c'est que si tu mets un end ou autre chose après ou avant terminate, la validation par entrée ne fonctionne plus.
On s'approche du but. A+ | |
| | | Jack Admin
Nombre de messages : 2394 Date d'inscription : 28/05/2007
| Sujet: Re: Comment terminer une saisie dans un objet par entrée Mar 4 Aoû 2009 - 10:40 | |
| Cette discussion est très intéressante. Je ne suis pas intervenu car je suis curieux de voir comment elle va évoluer.
J'interviens seulement pour vous dire que ma préoccupation est de sortir la version complète V 0.9.13 puis je m'attaquerai à ce problème de TERMINATE qui plante ou qui "beep". | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Comment terminer une saisie dans un objet par entrée Mar 4 Aoû 2009 - 20:23 | |
| Impatient de la nouvelle version, le reste peut attendre. Je vois que tu nous a toujours à l'oeil.
Merci et A+ | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Comment terminer une saisie dans un objet par entrée Mar 4 Aoû 2009 - 23:07 | |
| Je suis un peu perplexe... J'en suis arrivé au code ci-dessous, simplifié pour les tests: - Code:
-
label SAISIE, BOUCLE, FIN dim a$, t$
top 0, 20: left 0, 20: width 0, 250: height 0, 150 edit 1: top 1, 20: left 1, 20: width 1, 200: height 1, 30 on_click 1, SAISIE end
SAISIE: t$="" BOUCLE: If Scancode = 13 then goto FIN a$ = inkey$: If a$ = "" then goto BOUCLE if a$ = chr$(8) and len(t$)>0 t$ = left$(t$, len(t$)-1) else t$ = t$ + a$ end_if text 1, "": text 1, t$ goto BOUCLE
FIN: print_locate 20, 60: print t$: wait 1500 TERMINATE Finalement, le test du scancode semble plus sûr, inkey$ ne semblant pas renvoyer le code de la touche Entrée (qui semble ignorée). Donc on va bien à l'étiquette FIN par appui sur Entrée, et le programme se termine, mais le print final ne se fait pas, là il y a quelque chose qui m'échappe... | |
| | | Georges
Nombre de messages : 290 Age : 55 Localisation : Martinique Date d'inscription : 29/05/2009
| Sujet: Re: comment terminer une saisie dans un edit par entrée Mer 5 Aoû 2009 - 14:36 | |
| Salut Jean-Claude , JL35
Suite au code de JL35, je vous propose trois codes source qui résolvent le problème posé par Jean-Claude
Le premier est inspiré de celui de JL35 surtout sur l'utilisation de SCANCODE. En effet dans cette structure chr$(13) ne fonctionne pas.
source1: _____________________________________________ label BOUCLE,affich dim a$ top 0, 20: left 0, 20: width 0, 250: height 0, 200 edit 1: top 1, 20: left 1, 20: width 1, 200: height 1, 30 on_click 1,BOUCLE end
BOUCLE: If Scancode = 13 then goto affich a$ = inkey$ goto BOUCLE
affich: print_locate 20, 60 print "texte= " + text$(1) wait 3000 TERMINATE __________________________________________
l'utilisation de a$=inkey$ est indispensable, sinon le programme se court-circuite ou se plante. Il permet aussi à scancode de faire le test sur l'entrée d'une touche. L'édit étant toujours actif, il n'est pas nécessaire de faire de la concaténation. D'ailleurs si l'affichage ne se fait pas sur le code de JL35, c'est que la concaténation ne se construit pas (pourquoi?, ché pa!) Une fois l'édit testé sur le scancode 13, on utilise les fonctions standard de récupération des données dans un édit - à savoir text$(1)
le code par construction devient plus simple et plus concit. C'est la routine BOUCLE qui s'occupe de faire cette tache.
-----------------------
Dans le deuxième code, j'ai inséré le SET_FOCUS souhaité par Jean-Claude. Ainsi dès le RUN du programme le curseur se place directement dans l'édit. la ligne on_click 1, etc devient inutile - on rapproche le test BOUCLE avant le END
source2: ________________________________________________ label BOUCLE, FIN dim a$ top 0, 20: left 0, 20: width 0, 250: height 0, 200 edit 1: top 1, 20: left 1, 20: width 1, 200: height 1, 30 set_focus 1
BOUCLE: If Scancode = 13 then goto FIN a$ = inkey$ goto BOUCLE end
FIN: print_locate 20, 60 print "texte= " + text$(1) wait 3000
TERMINATE ____________________________________________
----------------------
Le troixième code est une amélioration du source1. En insérant un bouton terminer, on peut choisir de quitter le programme sans l'exécuter. Cette option peut évidemment être mis dans le source2
source3: _________________________________________ label BOUCLE,affich,fin dim a$ top 0, 20: left 0, 20: width 0, 250: height 0, 200 edit 1: top 1, 20: left 1, 20: width 1, 200: height 1, 30 button 2: top 2,100: left 2,40: width 2,140: height 2,20: caption 2,TERMINER on_click 1,BOUCLE on_click 2,fin end
BOUCLE: If Scancode = 13 then goto affich a$ = inkey$ goto BOUCLE
affich: print_locate 20, 60 print "texte= " + text$(1) wait 3000 fin:
TERMINATE _______________________________________________
Voila, je pense que nous avons tous progressés dans la compréhension du code grace au problème posé para Jean-Claude et aux pistes de JL35.
J'ai essayé ces trois codes sur mon poste, ils fonctionnent impec.
@+ | |
| | | Georges
Nombre de messages : 290 Age : 55 Localisation : Martinique Date d'inscription : 29/05/2009
| Sujet: Re: comment terminer ............... Mer 5 Aoû 2009 - 14:44 | |
| Salut JC et JL35 petit oubli dans le message précédent. Il y a à mon avis un dernier petit problème sur ces codes. Sur les essais que j'ai fait , j'obtient un bip du même son que la commande BEEP. Personnellement, je pense qu'il y a un bug, car cela ne devait pas. Il reste à le résoudre @+ | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Comment terminer une saisie dans un objet par entrée Mer 5 Aoû 2009 - 14:59 | |
| Là mon cher Georges, je crois que tu as fait un grand pas pour l'humanité. En effet, je ne connaissais pas la fonction text$() qui est bien pratique et qui gère toute l'édition de la saisie à lui tout seul. En plus on ne plante même plus sur le Terminate. Juste une petite remarque, si je rajoute le set_focus sur ton dernier code je ne reconnais plus l'Enter, mais bon je ne le mets peut-être pas où il faut.
Edit tiens, pas de bip pour moi..., je regarde
Exact, il y a un bip sur la touche Entrée... je ne l'avais pas entendu car je ne mets jamais le son, sauf nécessité. Ca c'est un petit problème pour Panoramic... | |
| | | Georges
Nombre de messages : 290 Age : 55 Localisation : Martinique Date d'inscription : 29/05/2009
| Sujet: re: comment ......... Mer 5 Aoû 2009 - 15:34 | |
| Salut JL35 le SET_FOCUS sur le dernier code tel qu'il est provoque une erreur sur le terminate, mais à part ça ça marche. je l'ai essayer rapidement, ça c'est un nouveau problème à résoudre. Ce n'est pas élégant de sortir d'un programme (même s'il à bien fonctionné) avec un message d'erreur. Je vais voir si je trouve une solution sur ce cas (ou bien quelqu'un d'autres). @+ | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Comment terminer une saisie dans un objet par entrée Mer 5 Aoû 2009 - 16:13 | |
| Voilà ce que je ferais moi, et qui semble marcher (mais il y a sûrement plus élégant): - Code:
-
label Reb, S1, Fin dim a$, t$ Edit 1
t$ = "": print_target_is 1 Reb: rem if scancode = 13 then goto Fin if a$ = chr$(13) then goto Fin a$ = inkey$: if a$ = "" then goto Reb if a$ = chr$(8) if t$ <> "" then t$ = left$(t$, len(t$) - 1): goto S1 goto Reb end_if t$ = t$ + a$ S1: print t$: goto Reb
Fin: print_target_is 0 print_locate 10, 30: print "Texte= " + t$: wait 2000 terminate le test sur le scancode et sur le chr$(13) semblent marcher tous les deux. Deux remarques pour Panoramic: - Le bip sonore remarqué par Georges semble se produire dans Text$() quand on appuie sur la touche Entrée, la touche Esc et peut-être d'autres. D'ailleurs je ne sais pas comment on sort proprement de cette fonction. - Dans mon code ci-dessus, en cas d'effacement du dernier caractère entré (touche backspace = 08), la fonction Left$(t$, n) ne marche pas (erreur 52) s'il ne reste qu'un caractère (n = 0), ce qui rendrait une chaîne vide mais qui n'est pas anormal après tout (en tout cas en Basic ça marche). Je ne l'ai pas corrigé ci-dessus pour ne pas alourdir avec un test supplémentaire. | |
| | | Georges
Nombre de messages : 290 Age : 55 Localisation : Martinique Date d'inscription : 29/05/2009
| Sujet: re: comment .......... Mer 5 Aoû 2009 - 20:52 | |
| Salut JL35 Le problème avec ton dernier code, c'est que une fois que tu click dans l'édit avec la souris, tu ne peux plus valider tes données par entrée. A mon avis, ta solution de l'on_click sur l'édit permet les deux : -valider par entrée -valider par button si boutton il y a georges @+ | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Comment terminer une saisie dans un objet par entrée Mer 5 Aoû 2009 - 22:33 | |
| Finalement Jean Claude a raison, la fonction EDIT est toute indiquée pour ce qu'il veut faire, mais à mon avis elle ne fonctionne pas comme elle devrait. Si on prend l'exemple du manuel: DIM a$ EDIT 1 TEXT 1, "Entrer votre nom:" a$ = TEXT$(1) PRINT a$ on ne sort pas de l'Edit et on ne vient jamais dans le print, parce qu'il n'y a pas à ma connaissance de touche pour terminer l'édition, en tout cas pas Entrée, ce qui serait logique, comme dans toute saisie de ligne de texte. Ou alors il faut fabriquer un bouton exprès à cliquer, mais ça ne devrait pas être obligatoire.
A ce propos, dans le Manuel Utilisateur paragraphe 4, rubrique 4.2, les commandes CLEAR, FONT_NAMES_ADD et _LOAD ne semblent pas s'apliquer à un objet EDIT, contrairement à ce qui est écrit. | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Comment terminer une saisie dans un objet par entrée Jeu 6 Aoû 2009 - 8:33 | |
| Bravo à vous deux,
On a beaucoup avancé grace à vous. Personnellement (et même si les derniers codes trouvés sont courts) je préfèrerais avoir la possibilité de sortir de l'EDIT par un autre commande que on_click ou on_change du style ON_ENTER
En tout cas ,au passage, j'ai apris pas mal sur vos méthodes de programmation.
Encore Bravo et A+ | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Comment terminer une saisie dans un objet par entrée Jeu 6 Aoû 2009 - 10:06 | |
| En regardant de plus près les codes de Georges, je me suis dit que la position du END çà collait pas. Alors voila ce que j'ai fait: 1) je supprime le WAIT dans le label FIN 2) J'ajoute un label fin2 avant TERMINATE 3) Je fais touner la boucle par un GOSUB avant le END 4) Dans le Label boucle je remplace GOTO par GOSUB et j'ajoute un RETURN Et cette fois ci çà marche "impec", plus de violation. Par contre il y a toujours le BEEP Voici le code terminé - Code:
-
label BOUCLE, FIN ,fin2
dim a$
top 0, 20: left 0, 20: width 0, 250: height 0, 200 edit 1: top 1, 20: left 1, 20: width 1, 200: height 1, 30 set_focus 1
button 2: top 2,100: left 2,40: width 2,140: height 2,20: caption 2,TERMINER on_click 2,fin2
gosub boucle
end
rem ------------- BOUCLE: If Scancode = 13 then gosub FIN:return a$ = inkey$ goto BOUCLE
FIN: print_locate 20, 60 print "texte= " + text$(1) return
fin2: TERMINATE
A+ | |
| | | Jack Admin
Nombre de messages : 2394 Date d'inscription : 28/05/2007
| Sujet: Re: Comment terminer une saisie dans un objet par entrée Jeu 6 Aoû 2009 - 11:55 | |
| Bravo, c'est pas mal ! Quand tu ne tapes aucun texte dans l'édit et que tu cliques seulement sur le bouton tu as quand même le "access violation ..." Promis, je m'en occupe après la sortie de la version complète. Par contre, ce qui m'interpelle, c'est le: - Code:
-
caption 2,TERMINER qui devrait être rejeté et qui pourtant fonctionne !!!, la syntaxe correcte étant: - Code:
-
caption 2,"TERMINER" Mais on en avait déjà fait mention sur le forum... | |
| | | Georges
Nombre de messages : 290 Age : 55 Localisation : Martinique Date d'inscription : 29/05/2009
| Sujet: re: Jeu 6 Aoû 2009 - 13:41 | |
| salut Panoramic! Je l'avais signalé dans un message précedent - le "caption" @+ | |
| | | Contenu sponsorisé
| Sujet: Re: Comment terminer une saisie dans un objet par entrée | |
| |
| | | | Comment terminer une saisie dans un objet par entrée | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |