Ré-écrire la ligne en cours dans la console

Sujets variés concernant le développement en PureBasic
NY152
Messages : 148
Inscription : dim. 14/mai/2006 20:41

Ré-écrire la ligne en cours dans la console

Message par NY152 »

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
.:NY152:.
Avatar de l’utilisateur
Naheulf
Messages : 191
Inscription : dim. 10/mars/2013 22:22
Localisation : France

Re: Ré-écrire la ligne en cours dans la console

Message par Naheulf »

En fait, si je comprend bien, tu as besoin de "EnableGraphicalConsole()" et des fonctions associées...
NY152
Messages : 148
Inscription : dim. 14/mai/2006 20:41

Re: Ré-écrire la ligne en cours dans la console

Message par NY152 »

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 !
.:NY152:.
Avatar de l’utilisateur
Ar-S
Messages : 9478
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Ré-écrire la ligne en cours dans la console

Message par Ar-S »

NY152 a écrit : Et je ne veux pas me servir de ClearConsole() pour garder un affichage des opérations antérieures ...
Ne peux tu pas tricher en stockant tes commandes dans une liste chainée ?
~~~~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
NY152
Messages : 148
Inscription : dim. 14/mai/2006 20:41

Re: Ré-écrire la ligne en cours dans la console

Message par NY152 »

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 ...
.:NY152:.
Avatar de l’utilisateur
Ar-S
Messages : 9478
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Ré-écrire la ligne en cours dans la console

Message par Ar-S »

Tu pourrais pas utiliser un editorgadget en tant que pseudoconsole vu qu'il gère aussi les lignes ?

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
Marc56
Messages : 2148
Inscription : sam. 08/févr./2014 15:19

Re: Ré-écrire la ligne en cours dans la console

Message par Marc56 »

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 ?
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.
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
On ne peut cependant connaitre l'emplacement du curseur à moins de prendre en compte toutes les touches clavier (y compris curseur).
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.
NY152
Messages : 148
Inscription : dim. 14/mai/2006 20:41

Re: Ré-écrire la ligne en cours dans la console

Message par NY152 »

@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
.:NY152:.
Marc56
Messages : 2148
Inscription : sam. 08/févr./2014 15:19

Re: Ré-écrire la ligne en cours dans la console

Message par Marc56 »

NY152 a écrit :Je ne pensais pas qu'une chose simple à coder en C soit une telle galère en PureBasic
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 équivalent :wink:
Marc56
Messages : 2148
Inscription : sam. 08/févr./2014 15:19

Re: Ré-écrire la ligne en cours dans la console

Message par Marc56 »

Je cherche une technique qui ré-écrierait la ligne en cours
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.
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()
Avatar de l’utilisateur
TazNormand
Messages : 1294
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: Ré-écrire la ligne en cours dans la console

Message par TazNormand »

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.
Image
Image
NY152
Messages : 148
Inscription : dim. 14/mai/2006 20:41

Re: Ré-écrire la ligne en cours dans la console

Message par NY152 »

@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 ! :)
.:NY152:.
Avatar de l’utilisateur
Naheulf
Messages : 191
Inscription : dim. 10/mars/2013 22:22
Localisation : France

Re: Ré-écrire la ligne en cours dans la console

Message par Naheulf »

SI c'est pour tourner sous linux, tu ne peut pas aussi utiliser les séquence ansi pour faire ça ?
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Ré-écrire la ligne en cours dans la console

Message par Zorro »

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_()
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Ré-écrire la ligne en cours dans la console

Message par Zorro »

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()
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Répondre