Page 1 sur 2

Petit programme d'indentation en ligne

Publié : mer. 18/févr./2004 16:17
par brossden
Bonjour à tous

J'ai réalisé ce petit programme d'intentation, il a la particularité de pouvoir être ajouté aux outils de l'éditeur PureBasic Standard quelque soit la version et de s'executer pendant que l'éditeur est ouvert.
Il loin d'être parfait, mais il ne tient qu'à vous de l'amélioer à votre convenance.

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       *
;*********************************************************************************************

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=2
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),"PUREBASIC - ",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 ***************


Bonne continuation

Denis

Publié : mer. 18/févr./2004 19:03
par Oliv
Excuse-moi, mais ça fait quoi ? Merci :oops:

Publié : mer. 18/févr./2004 19:15
par brossden
Re Bonjour

L'indentation d'un programme c'est l'alignement en fonction des boucles et autres, exemple
J'ai profité de mon retour ici pour modifier le programme un peu plus haut, avec certaine machine rapide, il y avait un problème, il est résolu !
Code non indenté

Code : Tout sélectionner

While Hwnd <> 0
If GetwindowLong_(Hwnd, #GWL_STYLE) & #WS_VISIBLE = #WS_VISIBLE
If GetwindowLong_(Hwnd, #GWL_EXSTYLE) & #WS_EX_TOOLWINDOW <> #WS_EX_TOOLWINDOW
Txt.s = Space(256)
GetWindowText_(Hwnd, Txt, 256)
If FindString(UCase(Txt),"PUREBASIC -",1) >0
If Len(Trim(Txt))>Lenm
Lenm=Len(Txt)
Handle=Hwnd
Prog=Txt
EndIf
EndIf
EndIf
EndIf
Hwnd = GetWindow_(Hwnd, #GW_HWNDNEXT)
Wend
Code Indenté

Code : Tout sélectionner

While Hwnd <> 0
 If GetwindowLong_(Hwnd, #GWL_STYLE) & #WS_VISIBLE = #WS_VISIBLE
  If GetwindowLong_(Hwnd, #GWL_EXSTYLE) & #WS_EX_TOOLWINDOW <> #WS_EX_TOOLWINDOW
   Txt.s = Space(256)
   GetWindowText_(Hwnd, Txt, 256)
   If FindString(UCase(Txt),"PUREBASIC -",1) >0
    If Len(Trim(Txt))>Lenm
     Lenm=Len(Txt)
     Handle=Hwnd
     Prog=Txt
    EndIf
   EndIf
  EndIf
 EndIf
 Hwnd = GetWindow_(Hwnd, #GW_HWNDNEXT)
Wend
Salut

Denis

Publié : mer. 18/févr./2004 19:32
par Lukky
Quel genre de problème ? J'ai eu quelques soucis je suis en train de voir la provenance. JL

Publié : mer. 18/févr./2004 19:44
par brossden
J'ai cru un instant que c'était à cause de la vitesse de la machine, mais je me suis aperçu que ce programme ne fonctionne qui si on l'a sauvegardé avant, je ne comprend pas trop pourquoi, mais c'est le cas !

J'ai modifié à noveau le source vous pouvez le Copier / Coller !

Denis

Publié : mer. 18/févr./2004 19:52
par Lukky
Oui mais quel était le problème ? Pasque moi quand je le lance je te dis pas l'état de ma souris, elle devient dingue, le reboot est obligatoire. Amusant. Par contre j'ai pas testé la toute dernière version.

Publié : mer. 18/févr./2004 19:55
par Patrick88
hum,
j'ai des Hallucinations ou Régis a pas déja fait un utilitaire de ce genre là ?
bon, c'était p't'être dans l'autre forum.... ( celui de Chris ou de Cederavic )

Patrick

Publié : mer. 18/févr./2004 20:24
par brossden
J'ai corrigé une nième fois le programme, il y avait un bug !!!

Désolé

Pour ce qui est du programme de Régis, il n'est pas actif directemnt sous l'éditeur comme celui là !
Sauf erreur de ma part bien sur !

Salut

Denis

Publié : mer. 18/févr./2004 20:46
par Oliv
Oui celui de Régis n'était pas en direct, il est battu là :D

Publié : mer. 18/févr./2004 21:02
par Lukky
Bon pour moi maintenant ça marche impec.

JL

Publié : mer. 18/févr./2004 21:42
par brossden
J'ai complété le programme, je pense avoir traité tous les cas

Salut


Denis

Publié : jeu. 19/févr./2004 9:44
par brossden
Bonjour à tous

Dans un soucis de performance maximale, j'ai modifié le programme et supprimé le code inutil dans le message Initial. Je pense qu'il est maintenant deverminé et qu'il répondra à votre attente (si vous en aviez une :D )

Si vous avez des suggestions, merci de m'en faire part ici !

Bonne journée à tous.

Denis

Publié : jeu. 19/févr./2004 11:19
par Lukky
Bon bein moi je te félicite sans compter pour ceux que ça interesse que si on met comme chaine de recherche de fenêtre le mot JaPBe et qu'on met l'exe dans les plugins et bein ça marche impec avec cet éditeur.

JL

Publié : jeu. 19/févr./2004 12:18
par brossden
Lukky a écrit :Bon bein moi je te félicite sans compter pour ceux que ça interesse que si on met comme chaine de recherche de fenêtre le mot JaPBe et qu'on met l'exe dans les plugins et bein ça marche impec avec cet éditeur.
Bonjour, je dérange ?
JL
Merci pour les fleurs ! lol :onfire:

Mais pourrais tu mieux expliquer :
si on met comme chaine de recherche de fenêtre le mot JaPBe et qu'on met l'exe dans les plugins et bein ça marche impec avec cet éditeur.

Denis

Publié : jeu. 19/févr./2004 14:31
par Lukky
Bein comme ça :

Code : Tout sélectionner

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 
JL