Ré-écrire la ligne en cours dans la console
Ré-écrire la ligne en cours dans la console
Bonjour,
Je vais me lancer dans l'écriture d'un utilitaire en mode console et si je veux y intégrer pas mal d'information durant l'exécution mais sans pour autant inonder la console et que ce soit fouillis.
Je cherche une technique qui ré-écrierait la ligne en cours en la changeant un peu comme le fait l'encodeur FFMPEG pour ceux qui connaissent.
Si on part sur de la bidouille, il faudrait que cela fonctionne sous Windows et Linux ^^
D'avance, merci
Je vais me lancer dans l'écriture d'un utilitaire en mode console et si je veux y intégrer pas mal d'information durant l'exécution mais sans pour autant inonder la console et que ce soit fouillis.
Je cherche une technique qui ré-écrierait la ligne en cours en la changeant un peu comme le fait l'encodeur FFMPEG pour ceux qui connaissent.
Si on part sur de la bidouille, il faudrait que cela fonctionne sous Windows et Linux ^^
D'avance, merci
.:NY152:.
Re: Ré-écrire la ligne en cours dans la console
En fait, si je comprend bien, tu as besoin de "EnableGraphicalConsole()" et des fonctions associées...
Re: Ré-écrire la ligne en cours dans la console
Avec ConsoleLocate() ?
Personnellement, je veux bien mais cette fonction a besoin d'une position X et Y pour savoir où écrire.
Si la position X, on peut raisonnablement la mettre à 0 sans trop se tromper, Y dépend du nombre de ligne déjà présent dans la console non ?
Et je ne veux pas me servir de ClearConsole() pour garder un affichage des opérations antérieures ...
Je cherche encore !
Personnellement, je veux bien mais cette fonction a besoin d'une position X et Y pour savoir où écrire.
Si la position X, on peut raisonnablement la mettre à 0 sans trop se tromper, Y dépend du nombre de ligne déjà présent dans la console non ?
Et je ne veux pas me servir de ClearConsole() pour garder un affichage des opérations antérieures ...
Je cherche encore !
.:NY152:.
Re: Ré-écrire la ligne en cours dans la console
Ne peux tu pas tricher en stockant tes commandes dans une liste chainée ?NY152 a écrit : Et je ne veux pas me servir de ClearConsole() pour garder un affichage des opérations antérieures ...
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Re: Ré-écrire la ligne en cours dans la console
Je ne pense pas, le programme sera sous forme de " QCM " et quand bien même, cela ne permettra pas de savoir où on se retrouvera sur la console.
Cela pourrait être une fonction à proposer du style GetCurrentConsoleLine() qui renverrait la ligne de la console en cours que l'on pourrait utiliser avec ConsoleLocate()
Je cherche toujours ...
Cela pourrait être une fonction à proposer du style GetCurrentConsoleLine() qui renverrait la ligne de la console en cours que l'on pourrait utiliser avec ConsoleLocate()
Je cherche toujours ...
.:NY152:.
Re: Ré-écrire la ligne en cours dans la console
Tu pourrais pas utiliser un editorgadget en tant que pseudoconsole vu qu'il gère aussi les lignes ?
Truc fait à l'arrache
Truc fait à l'arrache
Code : Tout sélectionner
Structure Donnee
Q.s
R.s
EndStructure
#ENTRER = 10
Global NewMap QCM.donnee()
Global.b ACTIF
QCM("1")\Q = "Question 1 : combien font 2+2"+Chr(10)
QCM()\R = "4"
QCM("2")\Q = "Question 2 : terminer cette phrase : Pure"+Chr(10)
QCM()\R = "basic"
Procedure Question (NumQuestion)
If FindMapElement(QCM(), Str(NumQuestion))
AddGadgetItem(0, Val ( MapKey(QCM()) ), QCM()\Q )
EndIf
ACTIF = #True
EndProcedure
Procedure Reponse()
Reponse$ = GetGadgetItemText(0,Val ( MapKey( QCM() ) ))
If ACTIF = #True
If Reponse$ = QCM()\R
SetGadgetItemText(0, Val ( MapKey( QCM() )+1 ),Chr(10))
SetGadgetItemText(0, Val ( MapKey( QCM() )+2 ),"Correct"+Chr(10))
Else
SetGadgetItemText(0, Val ( MapKey( QCM() )+1 ),Chr(10))
SetGadgetItemText(0, Val ( MapKey( QCM() )+2 ),"Erreur"+Chr(10))
EndIf
ACTIF = #False
EndIf
ProcedureReturn 1
EndProcedure
If OpenWindow(0, 0, 0, 500, 500, "EditorConsole", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
EditorGadget(0,0, 0, 500, 500)
SetGadgetColor(0,#PB_Gadget_BackColor,$0)
SetGadgetColor(0,#PB_Gadget_FrontColor,#Green)
SetActiveGadget(0)
Question(1)
AddKeyboardShortcut(0, #PB_Shortcut_Return, #ENTRER)
Repeat
Select EventMenu()
Case #ENTRER
Reponse()
EndSelect
Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Re: Ré-écrire la ligne en cours dans la console
Non, en mode graphique, 0,0 reste la première colonne et première ligne de la console lors de l'ouverture, même si l'écran a défilé vers le bas.Si la position X, on peut raisonnablement la mettre à 0 sans trop se tromper, Y dépend du nombre de ligne déjà présent dans la console non ?
Cela permet donc un positionnement absolu.
Code : Tout sélectionner
If OpenConsole()
EnableGraphicalConsole(1)
For i = 0 To 50
ConsoleLocate(i, i)
PrintN(Str(i))
Next
ConsoleLocate(0, 10)
Input()
EndIf
Par exemple, on n'utilise pas Input(), mais Inkey() en comptant tous les caractères et mouvements curseur.
Dans une application texte, on fixe souvent à l'avance la taille de l'écran (ex: 80x25)
De même on mémorise plusieurs 'page écran' dans des variables, c'est aussi plus simple que de tout réécrire si on veut par exemple afficher une page d'aide, puis revenir à la page normale.
Re: Ré-écrire la ligne en cours dans la console
@Ar-S : Je n'utilise aucune interface graphique car je n'en veux pas (sous linux le programme tournera sans serveur graphique d'ailleurs)
@Marc56 : Justement, c'est la position absolue que je ne veux pas mais je veux une position relative à ce qui s'est déjà déroulé dans la console.
Ton code efface tout autre traitement externe que la console a pu affiché.
De plus connaitre la position du curseur, je n'ai pas encore testé mais inKey() prend-t-il en compte toute entrée par l'affichage externe d'une autre programme ?
Je ne pensais pas qu'une chose simple à coder en C soit une telle galère en PureBasic
@Marc56 : Justement, c'est la position absolue que je ne veux pas mais je veux une position relative à ce qui s'est déjà déroulé dans la console.
Ton code efface tout autre traitement externe que la console a pu affiché.
De plus connaitre la position du curseur, je n'ai pas encore testé mais inKey() prend-t-il en compte toute entrée par l'affichage externe d'une autre programme ?
Je ne pensais pas qu'une chose simple à coder en C soit une telle galère en PureBasic
.:NY152:.
Re: Ré-écrire la ligne en cours dans la console
D'accord, présente-nous ton code en C (ou un bout de code faisant ce que tu souhaites), ce sera plus simple et on cherchera comment faire son équivalentNY152 a écrit :Je ne pensais pas qu'une chose simple à coder en C soit une telle galère en PureBasic
Re: Ré-écrire la ligne en cours dans la console
On ne peut pas toujours tout faire, mais on peut utiliser le code ascii de Backspace (Chr(8)) pour effacer en arrière. Ici afficher un pourcentage sur le même emplacement curseur.Je cherche une technique qui ré-écrierait la ligne en cours
Mode console Texte
Code : Tout sélectionner
OpenConsole()
Procedure Progress(Running$)
ConsoleCursor(0)
Print(Running$ + " ")
For i = 0 To 100 Step 10
Print(Str(i) + "% ")
Delay(300)
Print(Chr(8) + Chr(8) + Chr(8) + Chr(8))
Next
ConsoleCursor(1)
PrintN("")
EndProcedure
Progress("Installation A")
Progress("Installation B")
Progress("Installation C")
Input()
- TazNormand
- Messages : 1294
- Inscription : ven. 27/oct./2006 12:19
- Localisation : Calvados (14)
Re: Ré-écrire la ligne en cours dans la console
Salut,
Je ne comprends pas où est ton problème : puisque tu gères l'affichage de tes lignes, utilises un compteur. Comme te l'a dit Marc, en général on fixe la taille de l'écran console (80x25), de ce fait c'est plus simple pour adresser tes lignes/colonnes.
La ligne qui doit rester "fixe" correspond à quoi ? Au Score du QCM ? à la question du QCM ?
si tu permets le défilement de la console, ça ne peut pas fonctionner puisque la ligne 1 va devenir la ligne 0 au premier défilement bas.
Je ne comprends pas où est ton problème : puisque tu gères l'affichage de tes lignes, utilises un compteur. Comme te l'a dit Marc, en général on fixe la taille de l'écran console (80x25), de ce fait c'est plus simple pour adresser tes lignes/colonnes.
La ligne qui doit rester "fixe" correspond à quoi ? Au Score du QCM ? à la question du QCM ?
si tu permets le défilement de la console, ça ne peut pas fonctionner puisque la ligne 1 va devenir la ligne 0 au premier défilement bas.
Re: Ré-écrire la ligne en cours dans la console
@marc56 : Voilà une technique à laquelle je n'avais pas pensé, elle devrait fonctionner, je vais tester, merci !
@TazNormand : Je gère l'affichage de mes lignes, oui mais la difficulté est de ré-écrire la même ligne sans effacer la console.
Je n'ai pas parlé de QCM au sens strict du terme, il s'agit d'un utilitaire (qui peut aussi en appeler d'autres (donc je ne contrôle pas 100% de l'affichage et ne peut être effacé par la suite)).
Cet utilitaire a, à certains moment, une liste d'options possibles que l'utilisateur doit valider, à la manière d'un QCM mais n'en est pas un.
Je vous tiens au courant, encore merci !
@TazNormand : Je gère l'affichage de mes lignes, oui mais la difficulté est de ré-écrire la même ligne sans effacer la console.
Je n'ai pas parlé de QCM au sens strict du terme, il s'agit d'un utilitaire (qui peut aussi en appeler d'autres (donc je ne contrôle pas 100% de l'affichage et ne peut être effacé par la suite)).
Cet utilitaire a, à certains moment, une liste d'options possibles que l'utilisateur doit valider, à la manière d'un QCM mais n'en est pas un.
Je vous tiens au courant, encore merci !
.:NY152:.
Re: Ré-écrire la ligne en cours dans la console
SI c'est pour tourner sous linux, tu ne peut pas aussi utiliser les séquence ansi pour faire ça ?
Re: Ré-écrire la ligne en cours dans la console
tu peux toujours "lire" (Scanner) le contenue de la console (via APi windows, donc avec la version complete de Purebasic)
et ainsi mettre en variable celui ci , ou tout autre traitement , mais en le mettant en variable, tu pourrai ainsi
effacer le contenu de la console sans rien perdre , ecrire ce que tu veux dedans , et replacer le contenu ou une parite de celui ci ou tu veux ....
ps voir l'API : ReadConsoleOutputCharacter_()
et ainsi mettre en variable celui ci , ou tout autre traitement , mais en le mettant en variable, tu pourrai ainsi
effacer le contenu de la console sans rien perdre , ecrire ce que tu veux dedans , et replacer le contenu ou une parite de celui ci ou tu veux ....
ps voir l'API : ReadConsoleOutputCharacter_()
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Re: Ré-écrire la ligne en cours dans la console
tiens exemple valide :
Code : Tout sélectionner
; modifié et tiré d'un code de BalrogSoft
OpenConsole()
For I=1 To 25
PrintN("on ecrit 25 lignes ..... le mot a recup=Toto"+str(I))
Next I
lpCharacter.s = Space(15)
nLength.l = 6 ; <<<<<<<<<<<<<<<<<<<<<<<<< ici longueur du text a recuperer en nbr de caracteres ici 4 pour le mot "Toto" et +2 pour le chiffre apres Toto
Global dwReadCoord.COORD
dwReadCoord\x = 40 ; <<<<<<<<<<< on va recuperer la 40em position (le "=" )
dwReadCoord\y = 0 ; <<<<<<<<<<<<< de la ligne 1 (commence a Zero)
testme=PeekL(dwReadCoord);the DLL call need byvalue, not by refernce
lpNumberOfCharsRead.l
hConsoleOutput.l = GetStdHandle_(#STD_OUTPUT_HANDLE)
PrintN("Handle is "+Str(hConsoleOutput))
PrintN("Calling the function now...")
Result= ReadConsoleOutputCharacter_(hConsoleOutput, @lpCharacter.s, nLength, testme, @lpNumberOfCharsRead)
If Result=0
Erroren.l = GetLastError_()
PrintN("Error="+Str(Erroren))
Else
PrintN("okay, DLL Functions works :) "+Str(result))
PrintN(" le mot recuperé est :"+lpCharacter)
PrintN( "ligne "+str(dwReadCoord\y ))
PrintN("colonne"+str(dwReadCoord\x ))
EndIf
String$ = Input()
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"