Petit programme d'indentation en ligne

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Message par brossden »

Bonjour #yes

Si vous voulez utiliser l'éditeur JaPBe :10: #yes téléchargeable : http://fr.srd.yahoo.com/S=9159818:WS1/R ... sic/jaPBe/ qui est bien meilleur que celui livré avec PureBasic avec un raccourci clavier qui ultise "Alt+F1" faut utiliser le code suivant pour que le programme fonctionne correctement !

Code : Tout sélectionner



While getkeystate_(#VK_LMENU)<0
  Delay(10)
Wend

;*********************************************************************************************
;* Il est Possible de passer en Paramètre le nombre de Blanc correspondant à l'indentation ! *
;*            La valeur par défaut (Tab) est de "2" mais ne demande qu'à être modifiée       *
;*********************************************************************************************

Global Res.l, Deb.l, Fin.l , Hwnd, Handle.l, LineIndent.s, ProgText.s,Txt.s, Prog.s, RC.s, Blanc.l, Cde.s, Pos.l, Fin.l, DejaCom.b
If Txt=""
  Tab=0
Else
  Tab= Val(Txt)
EndIf
RC = Chr(13)+Chr(10)
Blanc=0
DejaCom = 0
DejaElse = 0

;*******************************************************
; Recherche de la Fenêtre contenat le texte à Indenter *
;*******************************************************

Hwnd = FindWindow_( 0, 0 )
While Hwnd <> 0
  Txt = Space(256)
  GetWindowText_(Hwnd, Txt, 256)
  If FindString(UCase(Txt),"JaPBe",1) = 1 And FindString(UCase(Txt),"DEBUG",1) =0
    Handle=Hwnd
  EndIf
  Hwnd = GetWindow_(Hwnd, #GW_HWNDNEXT)
Wend

;*****************************************************
;* Activationn de la Fenêtre de Programme à Indenter *
;* Copie du Texte du Programme dans le pResse papier *
;*   Puis du contenu du pResse papier dans ProgText  *
;*****************************************************

SetFocus_(Handle)
Res = Keybd_Event_(17,0,0,0)+ Keybd_Event_(65,0,0,0)+ Keybd_Event_(67,0,0,0)+Keybd_Event_(17,0,2,0)
Delay(20)
ProgText=GetClipboardText()+RC+RC

;**************************
;* Sauvegarde de sécurité *
;**************************

If CreateFile(#1,"c:\sauvegarde.bak")
  WriteString(ProgText)
  CloseFile(#1)
EndIf

;*****************************************
;* Mise en Forme du texte et Indentation *
;*****************************************

Prog=""
Deb = 1
Fin = FindString(ProgText,RC,Deb)
While Fin + 2 < Len(ProgText)
  LineIndent = Trim(Mid(ProgText,Deb,Fin-Deb))
  If LineIndent > ""
    Pos.l = FindString(LineIndent," ",1)
    If Pos = 0
      Cde = LineIndent
    Else
      Cde=Left(LineIndent,Pos-1)
    EndIf
    Cde=UCase(Cde)
    If FindString("*ENDIF*ENDPROCEDURE*ENDSELECT*ELSE*CASE*WEND*NEXT*UNTIL*DEFAULT*ELSEIF*","*"+Cde+"*",1)>0 : Blanc - Tab :EndIf
    If Blanc < 0 :  Blanc=0:  EndIf
    If Left(Cde,1)=";"
      If DejaCom = 0 : DejaCom =1 : Prog +  RC :  EndIf
      Prog + LineIndent +RC
    Else
      If DejaCom=1 : Prog +  RC :  EndIf
      DejaCom=0
      Prog + Space(Blanc) + LineIndent +RC
    EndIf
    If FindString("*IF*FOREACH*REPEAT*WHILE*FOR*SELECT*ELSE*CASE*DEFAULT*ELSEIF*","*"+Cde+"*",1)>0
      If FindString(UCase(LineIndent),"UNTIL",1)=0 And FindString(UCase(LineIndent),"ENDIF",1)=0
        Blanc + Tab
      EndIf
    EndIf
  EndIf
  Deb = Fin+2
  Fin = FindString(ProgText,RC,Deb)
Wend

;*********************************************************
;* Remplacement du programme Actuel par le texte indenté *
;*********************************************************

SetClipboardText(Prog)
SetFocus_(Handle)
Res = Keybd_Event_(17,0,0,0)+ Keybd_Event_(65,0,0,0)+Keybd_Event_(86,0,0,0)+Keybd_Event_(36,0,0,0)
Delay(20)
Res = Keybd_Event_(17,0,2,0)

;**********  Fin du Programme ***************

Lukky
Messages : 340
Inscription : dim. 25/janv./2004 12:22
Localisation : Morbihan

Message par Lukky »

Pourquoi le :

Code : Tout sélectionner

While getkeystate_(#VK_LMENU)<0 
    Delay(10) 
Wend 
Quand on me gonfle trop j'éclate, sinon ça va !
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Message par brossden »

Sur ma machine tout du moins, si la touche Alt est enfoncée, le progamme ne fonctionne pas, hors c'est le raccourci Alt+F1 qui lance ce programme ce qui pose problème sur les machines rapides.

Pour pallier ce problème, le debut du programme controle, par le bout de code que tu as extrait, que la touche Alt a été relachée avant de continuer le déroulement du programme et le tour est joué!

Plus je développe en PureBasic et plus je m'aperçois qu'il manque pas mal d'instrutions, certe les API arrangent souvent ce problème, mais il faut reconnaitre que leur utilisation n'est ni trés aisée, ni à la portée de débutant (J'entends réel débutant qui connaissent aucun autre language !)

J'espère ne pas être trop pompeux, ce n'est pa ici mon propos. Je me propose donc de développer plusieur fonctions qui je pense réduiront ce manque.
Je me suis aperçu par exemple que la simple vérification de l'appuis d'une touche sur le clavier n'est pas directement possible sous PB.
Mais la rapidité d'éxecution et la taille plus que modestes des exéutables en font pour moi un outils de tout premier ordre ! (le C++ n'étant pas ma tasse de thé ! lol)

Salut

Denis
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Je vois pas vraiment l'interet d'utiliser ce prog sur jaPBe, puis qui'il y a déja une fonction d'indentation automatique, (Ctrl + Tab) + l'auto-indentation quand tu tapes le code.

Chris :)
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Message par brossden »

Bonjour :lol:

Dans JaPBe l'indetation automatique fonctionne trés bien si on écrit ligne après ligne sans faire de bug (ce qui n'est pas mon cas) sans faire de copier -coller etc. Toute modif brise cet automatisme que je sache. Je peux me trompé, mais dans ce cas il n'y a plus que la bonne vieille mimine :cry: pour régler ce problème ou alors utiliser un programme extérieur. :wink:

Bonne journée à tous !

Denis
Lukky
Messages : 340
Inscription : dim. 25/janv./2004 12:22
Localisation : Morbihan

Message par Lukky »

En tout cas moi je n'utilise pas Alt-F1 mais plutot Alt-F12 et je n'ai pas rencontré de problème avant ta dernière MAJ, j'ai pourtant une grosse config.

Mais bon tu as raison de prévoir le pire.

JL
Quand on me gonfle trop j'éclate, sinon ça va !
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

brossden a écrit :Dans JaPBe l'indetation automatique fonctionne trés bien si on écrit ligne après ligne sans faire de bug
Elle fonctionne aussi sur le texte sélectionné.

Si tu fais Ctrl+ a et ctrl + Tab, tu retrouves une indentation correcte.

Chris :)
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Message par brossden »

Merci Chris j'ignorais la chose et je pense ne pas avoir été le seul !

Salut

Denis
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Moi, ça fait un bon bout de temps que je n'utilise plus que jaPBe, alors je commence à le connaître :lol:

Le gros avantage, c'est qu'il y a un répertoire rempli de fichiers "Include" qui te permettent d'augmenter le nombre de fonctions possibles.
Il suffit juste de cocher la case du fichier correpondant à la commande que tu veux utiliser pour qu'elle soit prise en compte directement.

C'est pour ça que j'ai fait mon petit visualiseur de fichiers includes. (Dont tout le monde à l'air de se foutre comme de sa première chemise, d'ailleurs :lol:)

Chris :)
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Message par brossden »

Bonjour Chris

Donne moi un peu plus de précision sur ton programme visualisateur d'include, je ne suis pas contre toute forme de prog sympa !!

Salut

Denis
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Salut :)

Comme son nom l'indique, c'est un prog qui permet de voir les procédures présentes dans les fichiers "Include" de jaPBe. (Répertoire "Includes")

Quand tu l'ouvres, il t'affiche tous les fichiers qu'il a trouvé dans le répertoire que tu as indiqué au premier lancement, et si tu cliques sur le nom d'un fichier, il te donne toutes les procédure qui sont dans ce fichier, ainsi que les infos, si l'auteur du fichier en a donné.

Il suffit de cliquer sur la fonction dont tu as besoin pour voir la syntaxe, et tu peux la copier dans le presse-papier pour la coller dans l'éditeur.

Ca t'évite d'aller fouiller dans le dossier et d'ouvrir chaque fichier pour trouver la procédure dont tu as besoin.

Bien entendu, il est aussi utilisable avec l'éditeur de PureBasic, il suffit de créer un dossier et d'y mettre les fichiers include, que ce soit des fichiers provenant de jaPBe, ou des fichiers créés par l'utilisateur. On peut changer le chemin du dossier dans le menu "Options"

Chris :)
Avatar de l’utilisateur
ZapMan
Messages : 460
Inscription : ven. 13/févr./2004 23:14
Localisation : France
Contact :

Message par ZapMan »

Ce truc est vraiment génial. Juste une suggestion : ça serait super que l'indentation ne se fasse que sur la partie de texte sélectionnée (quand il y en a une, et sur la totalité sinon).
(J'en demande beaucoup, hein ?)
En tout cas, bravo : c'est bref et efficace. Ca mériterait vraiment que la prochaine version de l'éditeur reprenne ce programme.
Tout obstacle est un point d'appui potentiel.

Bibliothèques PureBasic et autres codes à télécharger :https://www.editions-humanis.com/downlo ... ads_FR.htm
Avatar de l’utilisateur
ZapMan
Messages : 460
Inscription : ven. 13/févr./2004 23:14
Localisation : France
Contact :

Message par ZapMan »

J'ai modifié le programme comme suit :
- Ajouté une indentation pour "Procedure", "Data" et "Structure"
- Remplacé les valeurs des constantes par leurs noms : c'est plus propre et plus lisible
- Modifié le code pour que "Procedure.s" marche
- Modifié le code pour qu'il n'y ait plus de plantage quand la longueur du texte dépasse 65000 caractères
- Ajouté un paramètre pour qu'on puisse indenter les commentaires ou pas (moi j'aime bien quand il sont alignés sur le code)
- Mis sous forme de constantes les paramètres qui sont des constantes (question de clarté)
- Ajouté une petite bidouille pour que AutoIndent marche sur son propre code (c'était quand même dommage que ça le fasse pas !)

ET SURTOUT :

- Modifié le code pour qu'on puisse indenter une sélection (et pas toujours le code en totalité) : là, ça devient vraiment trés pratique

Code : Tout sélectionner

;*********************************************************************************************
;* Il est Possible de passer en Paramètre le nombre de Blanc correspondant à l'indentation ! *
;*            La valeur par défaut (#Tab) est de "2" mais ne demande qu'à être modifiée      *
;* Si #IndentComment = 1, les commentaires sont indentés, sinon ils restent alignés à gauche *
;* Programme développé par Brossden - Modifications mineures apportées par Zapman            *
;*********************************************************************************************
Global Res.l, Deb.l, Fin.l , Hwnd, Handle.l, LineIndent.s, ProgText.s,Txt.s, Prog.s, RC.s, Blanc.l, Cde.s, Pos.l, Fin.l, DejaCom.b
#Tab=2
#IndentComment=1
#RC = Chr(13)+Chr(10)
Blanc=0
Dejacom = 0
;********************************************************
; Recherche de la Fenêtre contenant le texte à Indenter *
;********************************************************
Hwnd = FindWindow_( 0, 0 )
While Hwnd <> 0
  Txt = Space(256)
  GetWindowText_(Hwnd, Txt, 256)
  Hwnd = GetWindow_(Hwnd, #GW_HWNDNEXT)
  If FindString(UCase(Txt),"PUREBASIC - ",1) = 1 And FindString(UCase(Txt),"DEBUG",1) =0
    Handle=Hwnd
    Hwnd=0
  EndIf
  If FindString(UCase(Txt),"JaPBe",1) = 1 And FindString(UCase(Txt),"DEBUG",1) =0
    Handle=Hwnd
    Hwnd=0
  EndIf
Wend
;*****************************************************
;* Activation de la Fenêtre de Programme à Indenter  *
;* Copie du Texte du Programme dans le presse-papier *
;* puis du contenu du presse-papier dans ProgText    *
;*****************************************************
SetFocus_(Handle)
ProgText=""
If OpenClipboard_(WindowID())
  EmptyClipboard_() ; On vide le presse-papier
  CloseClipboard_()
  ; On commence par faire un "copier" pour voir si l'utilisateur avait sélectionné un texte
  Res = Keybd_Event_(#VK_CONTROL,0,0,0)+ Keybd_Event_(#VK_C,0,0,0)+Keybd_Event_(#VK_CONTROL,0,#KEYEVENTF_KEYUP,0)
  Delay(200) ; Il faut laisser assez de temps pour les textes longs
  ; ProgText=GetClipboardText()+#RC+#RC ; Plante quand le texte est trop grand
  ; On utilise donc une méthode un peu plus complexe mais qui permet de limiter
  ; la taille du texte lu.
  OpenClipboard_(WindowID())
  *hmem = GetClipboardData_(#CF_TEXT)
  *D=GlobalLock_(*hmem)
  If *D
    ProgText = PeekS(*D,60000) ; limite à 60000 caractères
    GlobalUnlock_(*hmem)
  EndIf
  CloseClipboard_()
  ; Si il n'y avait rien de sélectionné, on fait "Tout sélectionner", puis "Copier"
  If ProgText=""
    Res = Keybd_Event_(#VK_CONTROL,0,0,0)+ Keybd_Event_(#VK_A,0,0,0)+ Keybd_Event_(#VK_C,0,0,0)+Keybd_Event_(#VK_CONTROL,0,#KEYEVENTF_KEYUP,0)
    Delay(200) ; Il faut laisser assez de temps pour les textes longs
    ; ProgText=GetClipboardText()+#RC+#RC ; Plante quand le texte est trop grand
    ; On utilise donc une méthode un peu plus complexe mais qui permet de limiter
    ; la taille du texte lu.
    OpenClipboard_(WindowID())
    *hmem = GetClipboardData_(#CF_TEXT)
    *D=GlobalLock_(*hmem)
    If *D
      ProgText = PeekS(*D,60000) ; limite à 60000 caractères
      GlobalUnlock_(*hmem)
    EndIf
    CloseClipboard_()
  EndIf
  If Len(ProgText)=60000 ; le texte est plus grand que notre limite
    ProgText=""
    ; On crée une fenêtre pour faire passer AutoIndent au premier plan
    hw=OpenWindow(30, 0, 0, 20, 20,  #PB_Window_ScreenCentered | #PB_Window_TitleBar , "AutoIndent")
    SetForegroundWIndow_(hw)
    MessageRequester("Erreur / Error", "Désolé, ce texte est trop long. Procédez par morceau.", 0)
    CloseWindow(30)
  EndIf
  If ProgText<>""
    ProgText=ProgText+#RC+#RC
    ;**************************
    ;* Sauvegarde de sécurité *
    ;**************************
    If CreateFile(#1,"c:\sauvegarde.bak")
      WriteString(Progtext)
      CloseFile(#1)
    EndIf
    ;*****************************************
    ;* Mise en Forme du texte et Indentation *
    ;*****************************************
    Prog=""
    Deb = 1
    voir=0
    Fin = FindString(ProgText,#RC,Deb)
    While fin + 2 < Len(ProgText)
      LineIndent = Trim(Mid(ProgText,deb,fin-deb))
      If LineIndent > ""
        Pos.l = FindString(LineIndent," ",1)
        If Pos = 0
          Cde = LineIndent
        Else
          Cde=Left(LineIndent,Pos-1)
        EndIf
        Pos.l = FindString(LineIndent,".",1) ; Pour gérer le cas du "Procedure.s", par exemple
        If Pos
          Cde=Left(Cde,Pos-1)
        EndIf
        Cde=UCase(Cde)
        ChaineRech$="*ENDIF*ENDSELECT*ELSE*CASE*WEND*NEXT*UNTIL*DEFAULT*ELSEIF*ENDPROCEDURE*ENDSTRUCTURE*ENDDATASECTION*"
        Cde2$="*"+Cde+"*"
        If FindString(ChaineRech$,Cde2$,1)
          Blanc - #Tab
        EndIf
        If Blanc < 0 :  blanc=0:  EndIf
        If #IndentComment
          Prog + Space(Blanc) + LineIndent +#RC
        Else
          If Left(Cde,1)=";"
            If DejaCom = 0 : DejaCom =1 : Prog +  #RC :  EndIf
            Prog + LineIndent +#RC
          Else
            If dejaCom=1 : Prog +  #RC :  EndIf
            DejaCom=0
            Prog + Space(Blanc) + LineIndent +#RC
          EndIf
        EndIf
        ChaineRech$="*IF*FOREACH*REPEAT*WHILE*FOR*SELECT*ELSE*CASE*DEFAULT*ELSEIF*PROCEDURE*STRUCTURE*DATASECTION*"
        If FindString(ChaineRech$,"*"+Cde+"*",1)>0
          addtab=1
          p=FindString(UCase(LineIndent),"UNTIL",1)
          If p And Mid(LineIndent,(p-1),1)<>Chr(34) ; Chr(34) est le caractère ". Ce test permet à AutoIndent de marcher quand on le test avec son propre code.
            addtab=0
          EndIf
          p=FindString(UCase(LineIndent),"ENDIF",1)
          If p And Mid(LineIndent,(p-1),1)<>Chr(34); Chr(34) est le caractère ". Ce test permet à AutoIndent de marcher quand on le test avec son propre code.
            addtab=0
          EndIf
          If addtab
            Blanc + #Tab
          EndIf
        EndIf
      EndIf
      deb = fin+2
      fin = FindString(ProgText,#RC,deb)
    Wend
    ;*********************************************************
    ;* Remplacement du programme Actuel par le texte indenté *
    ;*********************************************************
    OpenClipboard_(WindowID())
    EmptyClipboard_()
    SetClipboardData_(#CF_TEXT,@Prog)
    CloseClipboard_()
    SetFocus_(Handle)
    Res = Keybd_Event_(#VK_CONTROL,0,0,0)+Keybd_Event_(#VK_V,0,0,0)
    Delay(200)
    Res = Keybd_Event_(#VK_CONTROL,0,#KEYEVENTF_KEYUP,0)
  EndIf
Else
  ; On crée une fenêtre pour faire passer AutoIndent au premier plan
  hw=OpenWindow(30, 0, 0, 20, 20,  #PB_Window_ScreenCentered | #PB_Window_TitleBar , "AutoIndent")
  SetForegroundWIndow_(hw)
  MessageRequester("Erreur / Error", "Impossible d'ouvrir le presse-papier !", 0)
  CloseWindow(30)
EndIf

Merci Brossden pour ton super boulot.
Tout obstacle est un point d'appui potentiel.

Bibliothèques PureBasic et autres codes à télécharger :https://www.editions-humanis.com/downlo ... ads_FR.htm
Répondre