Page 1 sur 1

Outils personnalisés

Publié : mar. 03/juil./2007 21:25
par Droopy
Je cherche à créer un pluggin qui modifie le code que j'édite
Voici le code du Pluggin :

Code : Tout sélectionner

Procedure Erreur(Text.s)
  MessageRequester("Erreur",Text,#MB_ICONERROR) 
  End
EndProcedure

#FichierInc="PbSnippet.pbi"

PParametre.s=ProgramParameter(0)
If PParametre="" Or UCase(Left(PParametre,8))="TEMPFILE"
  Erreur("Aucun fichier spécifié")
EndIf

;/ Vérifie que le chemin est valide
Path.s=GetPathPart(PParametre)
If FileSize(Path)<>-2
  Erreur("Chemin invalide")
EndIf


;/ Vérifie que le fichier spécifié n'est pas vide
FichierPB.s=PParametre
If FileSize(FichierPB)<1
  Erreur("Fichier vide")
EndIf


;/ Test si le fichier source inclus déjà le fichier pbi
Fid=ReadFile(#PB_Any,FichierPB)
flag=1
While Eof(Fid)=0
  Ligne.s=ReadString(Fid,#PB_Ascii) ; lit une ligne
  Ligne=UCase(Ligne) ; la mete en majuscule
  Ligne=ReplaceString(Ligne," ","") ; supprime tous les espaces
  LigneRecherchee.s="INCLUDEFILE"+Chr(34)+UCase(#FichierInc)+Chr(34)
  If Left(Ligne,Len(LigneRecherchee))=LigneRecherchee
    flag=0
  EndIf
Wend

;/ Insère la commande include si non incluse
If flag
  Beep_(750,300)
  Taille=FileSize(FichierPB)
  *Ptr=AllocateMemory(Taille)
  Fid=ReadFile(#PB_Any,FichierPB)
  ReadData(Fid,*Ptr,Taille)
  CloseFile(Fid)
  
  ; écrit le fichier avec la commande include en premier
  Fid=CreateFile(#PB_Any,FichierPB)
  WriteStringN(Fid,"IncludeFile "+Chr(34)+#FichierInc+Chr(34))
  WriteData(Fid,*Ptr,Taille)
  CloseFile(Fid)
  FreeMemory(*Ptr)
EndIf
Le soucis que je rencontre est que le fichier modifié n'est pas rechargé !
Si quelqu'un a une idée :wink:

Publié : mar. 03/juil./2007 21:54
par comtois
Peut-être que ce lien peut t'aider ?

http://www.purebasic.fr/french/viewtopic.php?t=6284

Publié : mer. 04/juil./2007 8:06
par brossden
Bonjour Droopy
Lorsque tu fermes le fichier "FichierPB" tu cherches à en créer un autre du même nom beaucoup trop vite, ce se fait rien ne se passe, essaye de rajouter un delay(1000) entre les deux et tu n'auras plus de problème.

Une autre solution (plus judicieuse à mon goût) consiste à ouvrir une seule fois le fichier et de reécrire par dessus puisque le fichier final et forcement égal ou plus grand que le fichier initial, ceci grace au repositionnement du pointeur par FileSeek()

Code : Tout sélectionner

Procedure Erreur(Text.s)
  MessageRequester("Erreur",Text,#MB_ICONERROR)
  End
EndProcedure

#FichierInc="PbSnippet.pbi"

PParametre.s=ProgramParameter(0)

If PParametre="" Or UCase(Left(PParametre,8))="TEMPFILE"
  Erreur("Aucun fichier spécifié")
EndIf

;/ Vérifie que le chemin est valide
Path.s=GetPathPart(PParametre)
If FileSize(Path)<>-2
  Erreur("Chemin invalide")
EndIf


;/ Vérifie que le fichier spécifié n'est pas vide
FichierPB.s=PParametre
If FileSize(FichierPB)<1
  Erreur("Fichier vide")
EndIf


;/ Test si le fichier source inclus déjà le fichier pbi
Fid = OpenFile(#PB_Any,FichierPB)
flag=1
While Eof(Fid)=0
  Ligne.s=UCase(ReadString(Fid,#PB_Ascii)) ; lit une ligne
;  Ligne=UCase(Ligne) ; la mete en majuscule
;  Ligne=ReplaceString(Ligne," ","") ; supprime tous les espaces
;  LigneRecherchee.s="INCLUDEFILE"+Chr(34)+UCase(#FichierInc)+Chr(34)
;  If Left(Ligne,Len(LigneRecherchee))=LigneRecherchee
;    flag=0
;  EndIf
  If FindString(Ligne,"INCLUDEFILE",0)>0 And  FindString(Ligne,UCase(#FichierInc),0)>0
    flag = 0
  EndIf
Wend
;/ Insère la commande include si non incluse
If flag
  Beep_(750,300)
  Taille=FileSize(FichierPB)
  *Ptr=AllocateMemory(Taille)
  FileSeek(Fid,0)
  ReadData(Fid,*Ptr,Taille)
  FileSeek(Fid,0) 
  WriteStringN(Fid,"IncludeFile "+Chr(34)+#FichierInc+Chr(34))
  WriteData(Fid,*Ptr,Taille)
  FreeMemory(*Ptr)
EndIf
CloseFile(Fid)

Publié : mer. 04/juil./2007 9:41
par brossden
J'ai corrigé un petit Bug ! Le code est bon maintenant.

J'avais simplement alloué un nom de fichier existant au paramètre PParametre pour tester plus facilement, j'ai supprimé la ligne !

Toutes mes excuses !
:oops:

J'a' aussi traité un autre problème qui est le suivant :

Si la ligne n'est pas <IncludeFile "PbSnippet.pbi">,
mais IncludeFile "c:\Purebasic\PbSnippet.pbi" ton code ne fonctionne pas !

La parade est de chercher "INCLUDEFILE" et "PBSNIPPET.PBI" présent sur la même ligne !

If FindString(Ligne,"INCLUDEFILE",0)>0 And FindString(Ligne,UCase(#FichierInc),0)>0

Publié : mer. 04/juil./2007 12:00
par Droopy
Merci Brossden & Comtois, je vais analyser mon erreur :D :wink:

Publié : mer. 04/juil./2007 12:11
par Droopy
J'avais juste oublié de fermer le fichier que je lisais :oops:

Merci encore