[EDITEUR PERSO]-Pb ouverture +sieurs fichiers

Programmation d'applications complexes
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

[EDITEUR PERSO]-Pb ouverture +sieurs fichiers

Message par flaith »

Bonsoir,

je fais un éditeur perso et j'ai le soucis suivant :

lorsque que je double-clic sur un type de fichier déterminé (*.gs dans ce cas),
mon éditeur s'ouvre et affiche le fichier (jusque là ça va), si je refait la
même chose sur un autre fichier ça plante.
Mais si je fais ouvrir directement dans l'éditeur, pas de soucis, il m'affiche
un onglet supplémentaire.

Note: Je gère le fait que le programme ne peut pas se lancer plus d'une fois

Bref, j'essaye de faire un éditeur comme celui de PureBasic ;)

voici le source

Code : Tout sélectionner

; Windows
Enumeration
  #Win_0
  #Win_About
EndEnumeration

; Menu bars
Enumeration
  #Menu_Win_0
  #Menu_PopUP
EndEnumeration

; Menu items
Enumeration
  #Menu_Nouveau
  #Menu_Ouvrir
  #Menu_Sauver
  #Menu_Sauver_Sous
  #Menu_Sauver_Tout
  #Menu_Fermer
  #Menu_Fermer_Tout
  #Menu_Printer
  #Menu_Apercu
  #Menu_Imprimer
  #Menu_Quitter
  #Menu_Aide
  #Menu_APropos

  #Menu_Couper
  #Menu_Copier
  #Menu_Coller
  #Menu_Select_All
  
  #Alt_F4
EndEnumeration

; Status bars
Enumeration
  #StatusBar_Win_0
EndEnumeration

; Gadgets
Enumeration
  #Panel_Editor
  #Editor
EndEnumeration

; File
Enumeration 900
  #TMP_FILE
EndEnumeration

Declare Status_Bar()
Declare Open_ReadFile(File.s = "")
Declare CallBack(WindowID.l, Message.l, wParam.l, lParam.l)
Declare Windows_About()
Declare CreateEditor()
Declare Create_PopUP_Menu()
Declare OpenWindow_Win_0()

#GS_TITLE        = "GScript Editor"
#GS_VERSION      = "V0.1.7Win32"
#GS_TMP_FILENAME = "$LIST$.$$$"
#SonAigue        = 250
#SonGrave        = 150
#Duree           = 100

Global Font_Editor.l, Font_About.l
Global hsb.l, hEdit.l, PosX.l, PosY.l, NbCar.l
Global FullPath.s
Global CurrentFile.s, The_File_To_Load.s
Global Gadget_Editor.l = 0, Num_Editor.l = 0
Global PrintDlg.PRINTDLG

Structure GadgetEditor
  Num_Gadget.l
  Num.l
  FileName.s
  Repertoire.s
EndStructure

Global NewList ListEditor.GadgetEditor()

Font_Editor = LoadFont(0, "Lucida console", 9)
Font_About = LoadFont(1, "Tahoma", 8)

Procedure _BEEP()
	Beep_(#SonAigue, #Duree)
	Delay(15)
	Beep_(#SonGrave, #Duree*2)
EndProcedure

Procedure.l LOWORD(value.l)
  ProcedureReturn value & $FFFF
EndProcedure

Procedure.l HIWORD(Value.l)
  ProcedureReturn (Value >> 16) & $FFFF
EndProcedure

Procedure Status_Bar()
  StatusBarText(#StatusBar_Win_0,0," File:"+ListEditor()\FileName)
EndProcedure

Procedure.l Open_ReadFile(File.s = "")
Protected filtre.s = "", filtreDef.l, buffer.s, fichier.s = "", RepEnCours.s = "", Chemin.s = ""
Protected Dont_Read.l = #False

  RepEnCours = GetCurrentDirectory()
  
  If file = ""
    Filtre = "GScript (*.gs)|*.gs|Include (*.gsi)|*.gsi|Texte (*.txt)|*.txt|Tous les fichiers (*.*)|*.*"
    FiltreDef = 0    ; utiliser  par défaut le premier des trois filtres possibles
    Fichier = OpenFileRequester("Choisissez un fichier à charger", RepEnCours, Filtre, FiltreDef)
  Else
    Fichier = file
  EndIf
  
  If Fichier
    OpenFile(#TMP_FILE,#GS_TMP_FILENAME)
    FileSeek(#TMP_FILE,Lof(#TMP_FILE)) 
    
    Chemin = GetPathPart(fichier)
    Currentfile = RemoveString(fichier, Chemin)
    
;    MessageRequester("","--[ResetList(ListEditor())] inside [Procedure Open_ReadFile()]--")

    ResetList(ListEditor())
    ForEach ListEditor()
      If ListEditor()\Filename = CurrentFile
        Position = ListIndex(ListEditor()) 
        SetGadgetState(#Panel_Editor,Position)
        Dont_Read = #True
        Break
      EndIf
    Next        

    If Dont_Read = #False

;      MessageRequester("","--[If Dont_Read = #False] inside [Procedure Open_ReadFile()]--")

      ;verif si c'est le 1er untitled, sinon on créé
      If Left(ListEditor()\FileName,4) <> "<unt"
        CreateEditor()
      EndIf

;      MessageRequester("","--[*Ancien_Element = @ListEditor()] inside [Procedure Open_ReadFile()]--")
      
      *Ancien_Element = @ListEditor()
      Position = GetGadgetState(#Panel_Editor)
      SelectElement(ListEditor(),Position)

      If ReadFile(0, fichier)
        buffer = Space(Lof(0))
        If ReadData(0, @buffer, Lof(0))
          SetGadgetText(ListEditor()\Num_Gadget, buffer)           ; *** ERREUR ICI ***
        EndIf
        CloseFile(0)
      Else
        MessageRequester("ERROR","Ne peut lire le fichier "+fichier+"!")
        ProcedureReturn 1
      EndIf
        
      NbLine = CountGadgetItems(ListEditor()\Num_Gadget)
    
      SetGadgetItemText(#Panel_Editor,GetGadgetState(#Panel_Editor),CurrentFile,-1)

      ListEditor()\FileName = CurrentFile
      ListEditor()\Repertoire = Chemin

      ChangeCurrentElement(ListEditor(), *Ancien_Element)

;       Status_Bar()
      
      WriteLong(#TMP_FILE,ListEditor()\Num_Gadget)
      WriteLong(#TMP_FILE,ListEditor()\Num)
      WriteStringN(#TMP_FILE,ListEditor()\Filename)
      WriteStringN(#TMP_FILE,ListEditor()\Repertoire)
      CloseFile(#TMP_FILE)

    EndIf

  EndIf

  Status_Bar()

  SetActiveGadget(ListEditor()\Num_Gadget)
  ProcedureReturn 0
EndProcedure

Procedure CallBack(WindowID.l, Message.l, wParam.l, lParam.l)
  WW = WindowWidth(#Win_0) : WH = WindowHeight(#Win_0) - StatusBarHeight(#StatusBar_Win_0) - MenuHeight()
  
  Select Message
    Case #WM_CTLCOLOREDIT
    
    Case #WM_SIZE
      ResizeGadget(#Panel_Editor,0,0,WW,WH)
      
      ResetList(ListEditor())
      ForEach ListEditor()
        ResizeGadget(ListEditor()\Num_Gadget,0,0,WW - 4,WH - GetGadgetAttribute(#Panel_Editor, #PB_Panel_TabHeight) - 2)
      Next      
      
    Case #WM_MENUSELECT
      If lParam = GetMenu_(WindowID)
        Select LOWORD(wParam)
          Case 0
            StatusBarText(#StatusBar_Win_0,0,"Menu Fichier")
          Case 1
            StatusBarText(#StatusBar_Win_0,0,"Menu Edition")
          Case 2
            StatusBarText(#StatusBar_Win_0,0,"Menu Aide")
        EndSelect
      Else
        Select LOWORD(wParam)
          Case 0
            StatusBarText(#StatusBar_Win_0,0,"Nouveau script")
          Case 1
            StatusBarText(#StatusBar_Win_0,0,"Ouvrir un script...")
          Case 2
            StatusBarText(#StatusBar_Win_0,0,"Enregistrer le script")
          Case 3
            StatusBarText(#StatusBar_Win_0,0,"Enregistrer le script sous...")
          Case 4
            StatusBarText(#StatusBar_Win_0,0,"Quitter WinGS")
          Case 5
            StatusBarText(#StatusBar_Win_0,0,"Aide...")
          Case 6
            StatusBarText(#StatusBar_Win_0,0,"A propos de...")
        EndSelect
      EndIf
    Case #WM_EXITMENULOOP
      Position = GetGadgetState(#Panel_Editor)
      SelectElement(ListEditor(),Position)
      Status_Bar()
  EndSelect
  ProcedureReturn #PB_ProcessPureBasicEvents 
EndProcedure

Procedure Windows_About()
  If OpenWindow(#Win_About,10,10,205,140,"About GScript Editor",#PB_Window_SystemMenu|#PB_Window_WindowCentered,WindowID(#Win_0))
    If CreateGadgetList(WindowID(#Win_About))
      ;on récupère le handle de l'icône de la fenêtre de l'application avec 
      ;GetClassLong_(WindowID(#Window), #GCL_HICON)
      ;Merci à Gnozal :)
      ImageGadget(1000,5,5,32,32,GetClassLong_(WindowID(#Win_0), #GCL_HICON))

      TextGadget(1001,40,5,105,18,#GS_TITLE)
        SetGadgetFont(1001, Font_About)
      TextGadget(1002,40,22,105,18,#GS_VERSION)
        SetGadgetFont(1002, Font_About)
      TextGadget(1003,40,59,195,36,"©2007 by Nicolas DJUROVIC")
        SetGadgetFont(1003, Font_About)
      TextGadget(1004,75,74,195,36,"aka "+Chr(34)+"Flaith"+Chr(34))
        SetGadgetFont(1003, Font_About)
        
      ButtonGadget(1005,70,114,60,18,"Ok")
        SetGadgetFont(1004, Font_About)
    EndIf
    
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow 
          aboutquit = 1
  
        Case #PB_Event_Gadget
          Select EventGadget()
            Case 1005
              aboutquit = 1
  
          EndSelect
      EndSelect
    Until aboutquit = 1

    CloseWindow(#Win_About)
  EndIf
EndProcedure

Procedure CreateEditor()

  AddElement(ListEditor())
    Gadget_Editor + 1
    Num_Editor + 1
    
    ListEditor()\Num_Gadget = Gadget_Editor
    ListEditor()\Num        = Num_Editor

    Untitled$ = "<untitled"+RSet(Str(ListEditor()\Num),2,"0")+".gs>"
    Directory$ = GetCurrentDirectory()
    
    ListEditor()\Filename   = Untitled$
    ListEditor()\Repertoire = Directory$
    
;     Debug ListEditor()\Num
;     Debug ListEditor()\Num_Gadget

  AddGadgetItem(#Panel_Editor, -1, ListEditor()\Filename)

    hEdit = EditorGadget(ListEditor()\Num_Gadget, 0, 0, WindowWidth(#Win_0) - 4, WindowHeight(#Win_0) - StatusBarHeight(#StatusBar_Win_0) - MenuHeight() - GetGadgetAttribute(#Panel_Editor, #PB_Panel_TabHeight) - 2)

  SetGadgetColor(ListEditor()\Num_Gadget, #PB_Gadget_FrontColor, $FFFFFF)
  SetGadgetColor(ListEditor()\Num_Gadget, #PB_Gadget_BackColor, RGB(50,50,50))
  SetGadgetFont(ListEditor()\Num_Gadget, Font_Editor)
  SetActiveGadget(ListEditor()\Num_Gadget)
  SetGadgetState(#Panel_Editor,ListEditor()\Num-1)

  Status_Bar()
EndProcedure

Procedure Create_PopUP_Menu()
  If CreatePopupMenu(#Menu_PopUP)
    MenuItem(#Menu_Couper,     "Couper"+Chr(9)+"Ctrl-X")
    MenuItem(#Menu_Copier,     "Copier"+Chr(9)+"Ctrl-C")
    MenuItem(#Menu_Coller,     "Coller"+Chr(9)+"Ctrl-V")
    MenuBar()
    MenuItem(#Menu_Select_All, "Sélectionner tout"+Chr(9)+"Ctrl-A")
    MenuBar()
    MenuItem(#Menu_Printer,    "Configuration de l'impression...        ")
;     MenuItem(#Menu_Apercu,      "Apercu avant impression")
    MenuItem(#Menu_Imprimer,   "Imprimer"+Chr(9)+"Ctrl-P")
    MenuBar()
    MenuItem(#Menu_Fermer,     "Fermer"+Chr(9)+"Ctrl-W")
  EndIf
EndProcedure

Procedure OpenWindow_Win_0()
  If OpenWindow(#Win_0, 0, 0, 800, 600, "#Win_0", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered)
    If CreateMenu(#Menu_Win_0, WindowID(#Win_0))
      MenuTitle("Fichier")
      MenuItem(#Menu_Nouveau,     "&Nouveau"+Chr(9)+"Ctrl-N")
      MenuItem(#Menu_Ouvrir,      "&Ouvrir..."+Chr(9)+"Ctrl-O")
      MenuItem(#Menu_Sauver,      "&Enregistrer"+Chr(9)+"Ctrl-S")
      MenuItem(#Menu_Sauver_Sous, "Enregistrer sous...")
      MenuItem(#Menu_Sauver_Tout, "Enregistrer tout")
      MenuItem(#Menu_Fermer,      "Fermer"+Chr(9)+"Ctrl-W")
      MenuItem(#Menu_Fermer_Tout, "Fermer tout")
      MenuBar()
      MenuItem(#Menu_Printer,     "Configuration de l'impression...        ")
;       MenuItem(#Menu_Apercu,      "Apercu avant impression")
      MenuItem(#Menu_Imprimer,    "Imprimer"+Chr(9)+"Ctrl-P")
      MenuBar()
      MenuItem(#Menu_Quitter,     "&Quitter")
      MenuTitle("Edition")
      MenuItem(#Menu_Couper,      "Couper                                  "+Chr(9)+"Ctrl-X")
      MenuItem(#Menu_Copier,      "Copier"+Chr(9)+"Ctrl-C")
      MenuItem(#Menu_Coller,      "Coller"+Chr(9)+"Ctrl-V")
      MenuBar()
      MenuItem(#Menu_Select_All,  "Sélectionner tout"+Chr(9)+"Ctrl-A")
      MenuTitle("Aide")
      MenuItem(#Menu_Aide,        "Aide...                                 "+Chr(9)+"F1")
      MenuBar()
      MenuItem(#Menu_APropos,     "A propos de ...")
    EndIf
    
    hsb = CreateStatusBar(#StatusBar_Win_0, WindowID(#Win_0))
    If hsb
      AddStatusBarField(150)        ; Fichier en cours
      AddStatusBarField(120)        ; Ligne/colonne
      AddStatusBarField(60)         ; Statut (Insertion/Ecrasement)
      AddStatusBarField(40)         ; Indication si texte modifié ou pas
      AddStatusBarField(2000)       ; un max pour aller jusqu'au bout 
    EndIf

    If CreateGadgetList(WindowID(#Win_0))
      AddKeyboardShortcut(#Win_0, #PB_Shortcut_N | #PB_Shortcut_Control, #Menu_Nouveau)
      AddKeyboardShortcut(#Win_0, #PB_Shortcut_O | #PB_Shortcut_Control, #Menu_Ouvrir)
      AddKeyboardShortcut(#Win_0, #PB_Shortcut_S | #PB_Shortcut_Control, #Menu_Sauver)
      AddKeyboardShortcut(#Win_0, #PB_Shortcut_W | #PB_Shortcut_Control, #Menu_Fermer)
      AddKeyboardShortcut(#Win_0, #PB_Shortcut_X | #PB_Shortcut_Control, #Menu_Couper)
      AddKeyboardShortcut(#Win_0, #PB_Shortcut_C | #PB_Shortcut_Control, #Menu_Copier)
      AddKeyboardShortcut(#Win_0, #PB_Shortcut_V | #PB_Shortcut_Control, #Menu_Coller)
      AddKeyboardShortcut(#Win_0, #PB_Shortcut_A | #PB_Shortcut_Control, #Menu_Select_All)
      AddKeyboardShortcut(#Win_0, #PB_Shortcut_P | #PB_Shortcut_Control, #Menu_Imprimer)
      AddKeyboardShortcut(#Win_0, #PB_Shortcut_F1                      , #Menu_Aide)
      AddKeyboardShortcut(#Win_0, #PB_Shortcut_F4 | #PB_Shortcut_Alt   , #Alt_F4)

      PanelGadget(#Panel_Editor, 0, 0, WindowWidth(#Win_0), WindowHeight(#Win_0) - StatusBarHeight(#StatusBar_Win_0) - MenuHeight())
        CreateEditor()
      CloseGadgetList()
    EndIf
  EndIf
EndProcedure

; Pris sur la source de l'éditeur de purebasic
Procedure CreateRegistryKeys()
  If GetVersion_() & $FF0000  ; Windows NT/XP

    If RegCreateKeyEx_(#HKEY_CLASSES_ROOT, "Applications\WinGS.exe\shell\open\command", 0, 0, #REG_OPTION_NON_VOLATILE, #KEY_ALL_ACCESS, 0, @NewKey, @KeyInfo) = #ERROR_SUCCESS
      StringBuffer$ = Chr(34)+FullPath+"WinGS.exe"+Chr(34)+" "+Chr(34)+"%1"+Chr(34)
      RegSetValueEx_(NewKey, "", 0, #REG_SZ,  StringBuffer$, Len(StringBuffer$)+1)
      RegCloseKey_(NewKey)
    EndIf

    If RegCreateKeyEx_(#HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.gs", 0, 0, #REG_OPTION_NON_VOLATILE, #KEY_ALL_ACCESS, 0, @NewKey, @KeyInfo) = #ERROR_SUCCESS
      RegSetValueEx_(NewKey, "Application", 0, #REG_SZ,  "WinGS.exe", Len("WinGS.exe")+1)
      RegCloseKey_(NewKey)
    EndIf

    If RegCreateKeyEx_(#HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.gsi", 0, 0, #REG_OPTION_NON_VOLATILE, #KEY_ALL_ACCESS, 0, @NewKey, @KeyInfo) = #ERROR_SUCCESS
      RegSetValueEx_(NewKey, "Application", 0, #REG_SZ,  "WinGS.exe", Len("WinGS.exe")+1)
      RegCloseKey_(NewKey)
    EndIf

  Else  ; The same for Win9x

    If RegCreateKeyEx_(#HKEY_LOCAL_MACHINE, "Software\Classes\WinGS.exe\shell\open\command", 0, 0, #REG_OPTION_NON_VOLATILE, #KEY_ALL_ACCESS, 0, @NewKey, @KeyInfo) = #ERROR_SUCCESS
      StringBuffer$ = Chr(34)+FullPath+"WinGS.exe"+Chr(34)+" "+Chr(34)+"%1"+Chr(34)
      RegSetValueEx_(NewKey, "", 0, #REG_SZ,  StringBuffer$, Len(StringBuffer$)+1)
      RegCloseKey_(NewKey)
    EndIf

    If RegCreateKeyEx_(#HKEY_LOCAL_MACHINE, "Software\CLASSES\.gs", 0, 0, #REG_OPTION_NON_VOLATILE, #KEY_ALL_ACCESS, 0, @NewKey, @KeyInfo) = #ERROR_SUCCESS
      RegSetValueEx_(NewKey, "", 0, #REG_SZ,  "WinGS.exe", Len("WinGS.exe")+1)
      RegCloseKey_(NewKey)
    EndIf

    If RegCreateKeyEx_(#HKEY_LOCAL_MACHINE, "Software\CLASSES\.gsi", 0, 0, #REG_OPTION_NON_VOLATILE, #KEY_ALL_ACCESS, 0, @NewKey, @KeyInfo) = #ERROR_SUCCESS
      RegSetValueEx_(NewKey, "", 0, #REG_SZ,  "WinGS.exe", Len("WinGS.exe")+1)
      RegCloseKey_(NewKey)
    EndIf

  EndIf

EndProcedure

Procedure Init()
  Gadget_Editor = 5000
  Num_Editor = 0
  FullPath = Space(1000)
  GetModuleFileName_(GetModuleHandle_(0), @FullPath, 1000)

  FullPath = GetPathPart(FullPath)

  CreateRegistryKeys()
  
  If CreateFile(#TMP_FILE,#GS_TMP_FILENAME)

    OpenWindow_Win_0()
    Create_PopUP_Menu()
    SmartWindowRefresh(#Win_0, #False) 
          
    PrintDlg\hDevMode = 0
    PrintDlg\hDevNames = 0
    PrintDlg\lStructSize = SizeOf(PRINTDLG)
    PrintDlg\Flags = #PD_ALLPAGES

    SetWindowTitle(#Win_0,#GS_TITLE)
    StatusBarText(#StatusBar_Win_0,0,"")
    StatusBarText(#StatusBar_Win_0,4,#GS_VERSION)

    SetWindowCallback(@CallBack())
  Else
    MessageRequester("ERROR","Impossible de créer un fichier temporaire !")
  EndIf
EndProcedure

Procedure CheckParam()
  If CountProgramParameters() > 0
    The_File_To_Load = ProgramParameter()
    Open_ReadFile(The_File_To_Load)
  EndIf
EndProcedure

Procedure LoadTMPFile()
Protected a.l, b.l, c.s, d.s

  If ReadFile(#TMP_FILE,#GS_TMP_FILENAME)
    While Eof(#TMP_FILE) = 0
      a = ReadLong(#TMP_FILE)
      b = ReadLong(#TMP_FILE)
      c = ReadString(#TMP_FILE)
      d = ReadString(#TMP_FILE)
      
      AddElement(ListEditor())
      ListEditor()\Num_Gadget = a
      ListEditor()\Num        = b
      ListEditor()\Filename   = c
      ListEditor()\Repertoire = d
    Wend
  EndIf
EndProcedure

Procedure Quit()
  GlobalFree_(PrintDlg\hDevNames)
;   CreateFile(#TMP_FILE,#GS_TMP_FILENAME)    ;Efface les données
  CloseFile(#TMP_FILE)
;   DeleteFile(#GS_TMP_FILENAME)
  End
EndProcedure

;***************************************************
; #MUTEX_ALL_ACCESS =  $1F0001
; 
; Hmutex = OpenMutex_(#MUTEX_ALL_ACCESS,#False,Application)
; If Hmutex=0
;   ;Si le mutex existe alors l'application est déjà lancée.
;   ;sinon on le crée
;   Hmutex = CreateMutex_(#Null, #True, Application)
;   If Hmutex=0
;     ;Fin du programme mutex non créer
;     End
;   EndIf
; Else
;   ;On recherche l'application
;   ;pour la mettre au premier plan.
;   Handle=FindWindow_(#Null, Application)
;   ShowWindow_(Handle,#SW_HIDE) 
;   ShowWindow_(Handle,#SW_MINIMIZE)
;   ShowWindow_(Handle,#SW_RESTORE) 
;   End
; EndIf
;***************************************************

;l'application est lancée (= 1)
; If AppRunning(Application) = 1
;   Handle=FindWindow_(#Null, Application)
; ;   ShowWindow_(Handle,#SW_HIDE)
; ;   ShowWindow_(Handle,#SW_MINIMIZE)
;   ShowWindow_(Handle,#SW_RESTORE)
;   ShowWindow_(Handle,#SW_MAXIMIZE)
;   ShowWindow_(Handle,#SW_SHOW)
;   MessageRequester("","Handle = "+Str(Handle))
; ;   CheckParam()
;   End
; Else     
;   Init()
;   CheckParam()
; EndIf

;***************************************************
OnErrorGoto(?ShowError)

#MUTEX_ALL_ACCESS =  $1F0001

Hmutex = OpenMutex_(#MUTEX_ALL_ACCESS,#False,#GS_TITLE)
If Hmutex > 0
  ;On recherche l'application
  ;pour la mettre au premier plan.
  Handle=FindWindow_(#Null, #GS_TITLE)
  ShowWindow_(Handle,#SW_HIDE)
  ShowWindow_(Handle,#SW_MINIMIZE)
  ShowWindow_(Handle,#SW_RESTORE)
  LoadTMPFile()
  CheckParam()
  End
Else
  ;Si le mutex existe alors l'application est déjà lancée.
  ;sinon on le crée
  Hmutex = CreateMutex_(#Null, #True, #GS_TITLE) ;Application)
  If Hmutex=0
    ;Fin du programme mutex non créé
    End
  EndIf
  Init()
  CheckParam()
EndIf

; Event loop
Repeat
  ; Affiche ligne et position dans le fichier
  ; A MODIFIER : Le hEdit qui ne fonctionne que sur le
  ;              dernier fichier ouvert, donc créer une liste
  ExSel.CHARRANGE
  PosY = SendMessage_(hEdit, #EM_LINEFROMCHAR, -1,0)
  SendMessage_(hEdit, #EM_EXGETSEL, 0, @ExSel)
  PosX  = ExSel\cpMin - PosY
  NbCar = ExSel\cpMin
 
  StatusBarText(#StatusBar_Win_0,1,"Lig: "+Str(PosY+1)+" Pos: "+Str(PosX+1), #PB_StatusBar_Center)
          
  Event = WaitWindowEvent()
  Select Event
    ; ///////////////////
    Case #WM_RBUTTONDOWN
      DisplayPopupMenu(#Menu_PopUP, WindowID(#Win_0))

    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      Select EventGadget
        Case #Editor
        Case #Panel_Editor
          Position = GetGadgetState(#Panel_Editor)
          SelectElement(ListEditor(),Position)
          Status_Bar()
          SetActiveGadget(ListEditor()\Num_Gadget)
      EndSelect
    ; ///////////////
    Case #PB_Event_Menu
      EventMenu = EventMenu()
      Select EventMenu
        Case #Menu_Nouveau
          CreateEditor()
          
        Case #Menu_Ouvrir
          Open_ReadFile()
          
        Case #Menu_Sauver
          
        Case #Menu_Sauver_Tout

        Case #Menu_Fermer

        Case #Menu_Fermer_Tout
        
        Case #Menu_Printer
          If PrintDlg_(PrintDlg) <> #False
            *DEVNAMES.DEVNAMES = GlobalLock_(PrintDlg\hDevNames)
;             PrinterDeviceName$ = PeekS(*DEVNAMES + *DEVNAMES\wDeviceOffset)
;             Debug "Printer Device Name = " + PrinterDeviceName$
            GlobalUnlock_(PrintDlg\hDevNames)
          EndIf

;         Case #Menu_Apercu
        
        Case #Menu_Imprimer

        Case #Menu_Quitter
          Quit()
          
        Case #Menu_Couper

        Case #Menu_Copier

        Case #Menu_Coller

        Case #Menu_Select_All
        
        Case #Menu_Aide
;           ResetList(ListEditor())
;           ForEach ListEditor()
;             Debug "-------------------------------------------------"
;             Debug "Repertoire du fichier = "+ListEditor()\Repertoire
;             Debug "              fichier = "+ListEditor()\filename
;           Next
        Case #Menu_APropos
          Windows_About()
      EndSelect
    ; //////////////////////
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      Select EventWindow
        Case #Win_0
          Quit()
      EndSelect
  EndSelect
ForEver

End

ShowError:
  Reg_EAX$    = "EAX=0x"+RSet( Str(GetErrorRegister(#PB_OnError_EAX)) ,8,"0")+" "
  Reg_EBX$    = "EBX=0x"+RSet( Str(GetErrorRegister(#PB_OnError_EBX)) ,8,"0")+" "
  Reg_ECX$    = "ECX=0x"+RSet( Str(GetErrorRegister(#PB_OnError_ECX)) ,8,"0")+" "
  Reg_EDX$    = "EDX=0x"+RSet( Str(GetErrorRegister(#PB_OnError_EDX)) ,8,"0")+" "
  Reg_ESI$    = "ESI=0x"+RSet( Str(GetErrorRegister(#PB_OnError_ESI)) ,8,"0")+#CRLF$
  Reg_EDI$    = "EDI=0x"+RSet( Str(GetErrorRegister(#PB_OnError_EDI)) ,8,"0")+" "
  Reg_EBP$    = "EBP=0x"+RSet( Str(GetErrorRegister(#PB_OnError_EBP)) ,8,"0")+" "
  Reg_ESP$    = "ESP=0x"+RSet( Str(GetErrorRegister(#PB_OnError_ESP)) ,8,"0")+" "
  Reg_FFLags$ = "EFL=0x"+RSet( Str(GetErrorRegister(#PB_OnError_FFLags)) ,8,"0")+#CRLF$
  Reg_SegCS$  = "CS =0x"+RSet( Str(GetErrorRegister(#PB_OnError_SegCS)) ,4,"0")+" "+#CRLF$
  Reg_SegSS$  = "SS =0x"+RSet( Str(GetErrorRegister(#PB_OnError_SegSS)) ,4,"0")+#CRLF$+#CRLF$
  
  err$ = Reg_EAX$+Reg_EBX$+Reg_ECX$+Reg_EDX$+Reg_ESI$+Reg_EDI$
  err$ + Reg_EBP$+Reg_ESP$+Reg_FFLags$+Reg_SegCS$+Reg_SegSS$
  
  OpenConsole()
  _BEEP()
  PrintN("Error line : "+Str(GetErrorLineNR())+#CRLF$+GetErrorDescription()+#CRLF$)
  PrintN(err$)
  Print("Press Enter :") : Input()
  
  ;MessageRequester("Error",err$+#CRLF$+"Erreur ligne : "+Str(GetErrorLineNR())+" => "+GetErrorDescription())
  
  CloseConsole()
  End
l'exe se trouve ici : http://flaith.free.fr/pb/WinGS.exe

et les fichiers .gs ici aussi : http://flaith.free.fr/pb/

La compilation s'effectue avec l'option "Activer le numéro de ligne pour 'OnError'"

message d'erreur dès test ouverture du second fichier :
Error line : 156
An attemped read or write to/from an address to which that process isn't allowed
voilou :D
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Salut flaith,

ton erreur est ici à la ligne 143 en ouvrant d'abord l'éditeur puis en cliquant sur un fichier gs

Code : Tout sélectionner

If Left(ListEditor()\FileName,4) <> "<unt"
ta liste chainée est vide ce qui entraine une erreur.

2 conseils car tu écris un truc qui doit tenir la route :

- Avec les listes chainées, il faut toujours tester les fonctions car il est possible qu'elle échouent etc

Code : Tout sélectionner

 if addelement()   ...  else ... endif
                                
c'est d'ailleurs valable pour tous les gadget etc, si on veut un truc qui tienne la route

- utilises les compilerif/compilerelse/compilerendif avec une constante pour le test et tu peux écrire partout des affichages conditionnels de tes variables/listes chainées etc et dans le compilerelse tu écris le code sans affichage des valeurs à surveiller. Il suffit de modifier la constante pour que le test du compiler s'inverse et que tu soit en mode "normal"
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

Salut Denis, et merci

effectivement il manque un "addelement()" quelque part car il reprend toujours l'ancien num_gadget.

Je sais ou chercher maintenant, encore merci !
:)
bernard13
Messages : 1221
Inscription : mer. 05/janv./2005 21:30

Message par bernard13 »

et il sert à quoi cet editeur svp?
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

bernard13 a écrit :et il sert à quoi cet editeur svp?
comme indiqué, c'est un éditeur perso permettant de lire les sources de mon petit interpréteur sous dos.

Ca me permet surtout de programmer un truc qui pourra me servir pour plus tard.

:)

NB: Quand tu demandes à un programmeur à quoi ça sert ce qu'il fait, sache que ça sert toujours à quelque-chose, même s'il ne le sait pas lui-même ;)
bernard13
Messages : 1221
Inscription : mer. 05/janv./2005 21:30

Message par bernard13 »

ok merci
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

:D
Dernière version de l'éditeur :

Code : Tout sélectionner

; Windows
Enumeration
  #Win_0
  #Win_About
EndEnumeration

; Menu bars
Enumeration
  #Menu_Win_0
  #Menu_PopUP
EndEnumeration

; Menu items
Enumeration
  #Menu_Nouveau
  #Menu_Ouvrir
  #Menu_Sauver
  #Menu_Sauver_Sous
  #Menu_Sauver_Tout
  #Menu_Fermer
  #Menu_Fermer_Tout
  #Menu_Printer
  #Menu_Apercu
  #Menu_Imprimer
  #Menu_Quitter
  #Menu_Aide
  #Menu_APropos

  #Menu_Couper
  #Menu_Copier
  #Menu_Coller
  #Menu_Select_All
  
  #Alt_F4
EndEnumeration

; Status bars
Enumeration
  #StatusBar_Win_0
EndEnumeration

; Gadgets
Enumeration
  #Panel_Editor
  #Editor
EndEnumeration

; File
Enumeration 900
  #TMP_FILE
EndEnumeration

Declare Status_Bar()
Declare Open_ReadFile(File.s = "")
Declare Save_WriteFile(File.s = "")
Declare CallBack(WindowID.l, Message.l, wParam.l, lParam.l)
Declare Windows_About()
Declare CreateEditor()
Declare Create_PopUP_Menu()
Declare OpenWindow_Win_0()
Declare CreateRegistryKeys()
Declare Init()
Declare CheckParam()
Declare LoadTMPFile()
Declare Quit()

; ***************************************
; *** Constantes et globales
; ***************************************
#GS_TITLE        = "GScript Editor"
#GS_VERSION      = "V0.1.9Win32"
#GS_TMP_FILENAME = "$LIST$.$$$"
#SonAigue        = 250
#SonGrave        = 150
#Duree           = 100

Global Font_Editor.l, Font_About.l
Global hsb.l, hEdit.l, PosX.l, PosY.l, PosTotal.l, NbCar.l
Global FullPath.s
Global CurrentFile.s, The_File_To_Load.s
Global Gadget_Editor.l = 0, Num_Editor.l = 0
Global PrintDlg.PRINTDLG

Structure GadgetEditor
  Num_Gadget.l
  Num.l
  FileName.s
  Repertoire.s
  hEdit.l
  Modified.b                        ; Modifié (0:non - 1:oui)
EndStructure

Global NewList ListEditor.GadgetEditor()

Font_Editor = LoadFont(0, "Lucida console", 9)
Font_About = LoadFont(1, "Tahoma", 8)

; ***************************************
; *** Procedures
; ***************************************
Procedure _BEEP()
	Beep_(#SonAigue, #Duree)
	Delay(15)
	Beep_(#SonGrave, #Duree*2)
EndProcedure

Procedure.l LOWORD(value.l)
  ProcedureReturn value & $FFFF
EndProcedure

Procedure.l HIWORD(Value.l)
  ProcedureReturn (Value >> 16) & $FFFF
EndProcedure

Procedure Status_Bar()
  StatusBarText(#StatusBar_Win_0,0," File:"+ListEditor()\FileName)
EndProcedure

Procedure.l Open_ReadFile(File.s = "")
Protected filtre.s = "", fichier.s = "", buffer.s = "", RepEnCours.s = "", Chemin.s = ""
Protected filtreDef.l, Dont_Read.l = #False

  RepEnCours = GetCurrentDirectory()
  
  If file = ""
    Filtre = "GScript (*.gs)|*.gs|Include (*.gsi)|*.gsi|Texte (*.txt)|*.txt|Tous les fichiers (*.*)|*.*"
    FiltreDef = 0    ; utiliser  par défaut le premier des trois filtres possibles
    Fichier = OpenFileRequester("Choisissez un fichier à charger", RepEnCours, Filtre, FiltreDef)
  Else
    Fichier = file
  EndIf
  
  If Fichier
    OpenFile(#TMP_FILE,#GS_TMP_FILENAME)
    FileSeek(#TMP_FILE,Lof(#TMP_FILE)) 
    
    Chemin = GetPathPart(fichier)
    Currentfile = RemoveString(fichier, Chemin)
    
    If CountList(ListEditor()) > 0
      ResetList(ListEditor())
      ForEach ListEditor()
        If ListEditor()\Filename = CurrentFile
          Position = ListIndex(ListEditor()) 
          SetGadgetState(#Panel_Editor,Position)
          Dont_Read = #True
          Break
        Else
;           CreateEditor()        
;           AddElement(ListEditor())
;           ListEditor()\Num_Gadget + 1
;           ListEditor()\Num        + 1
        EndIf
      Next
    Else
      MessageRequester("Erreur","Aucune Liste chainée initialisée!")
      End
    EndIf

    If Dont_Read = #False

      ;verif si c'est le 1er untitled, sinon on créé
     If Left(ListEditor()\FileName,4) <> "<unt"
       CreateEditor()
     EndIf

      *Ancien_Element = @ListEditor()
      Position = GetGadgetState(#Panel_Editor)
      SelectElement(ListEditor(),Position)

      If ReadFile(0, fichier)
        buffer = Space(Lof(0))
        If ReadData(0, @buffer, Lof(0))
          zz.l = ListEditor()\Num_Gadget
          ;texte_buf$ = buffer
          SetGadgetText(zz.l, buffer);texte_buf$)
        EndIf
        CloseFile(0)
      Else
        MessageRequester("ERROR","Ne peut lire le fichier "+fichier+"!")
        ProcedureReturn 1
      EndIf
        
      NbLine = CountGadgetItems(ListEditor()\Num_Gadget)
    
      SetGadgetItemText(#Panel_Editor,GetGadgetState(#Panel_Editor),CurrentFile,-1)

      ListEditor()\FileName = CurrentFile
      ListEditor()\Repertoire = Chemin

      ChangeCurrentElement(ListEditor(), *Ancien_Element)

      WriteLong(#TMP_FILE,ListEditor()\Num_Gadget)
      WriteLong(#TMP_FILE,ListEditor()\Num)
      WriteStringN(#TMP_FILE,ListEditor()\Filename)
      WriteStringN(#TMP_FILE,ListEditor()\Repertoire)
      WriteLong(#TMP_FILE,ListEditor()\hEdit)
      WriteByte(#TMP_FILE,ListEditor()\Modified)
      CloseFile(#TMP_FILE)

    EndIf

  EndIf

  Status_Bar()

  SetActiveGadget(ListEditor()\Num_Gadget)
  ProcedureReturn 0
EndProcedure

Procedure.l Save_WriteFile(File.s = "")
Protected filtre.s = "", fichier.s = "", buffer.s = "", FichierParDefaut.s = "", RepEnCours.s = "", Chemin.s = ""
Protected filtreDef.l

  RepEnCours = GetCurrentDirectory()
  
  If file = ""
    FichierParDefaut = ListEditor()\Filename
    Filtre = "GScript (*.gs)|*.gs|Include (*.gsi)|*.gsi|Texte (*.txt)|*.txt|Tous les fichiers (*.*)|*.*"
    FiltreDef = 0    ; utiliser  par défaut le premier des trois filtres possibles
    Fichier = SaveFileRequester("Donnez un nom de fichier", RepEnCours+FichierParDefaut, Filtre, FiltreDef)
    If ReadFile(0,Fichier)
      Select MessageRequester("Note","Le fichier "+Chr(34)+Fichier+Chr(34)+" existe déjà"+#CRLF$+"Désirez-vous l'écraser ?",#PB_MessageRequester_YesNo)
        Case 7  ;7 pour non - 6 pour oui
          ProcedureReturn 0
      EndSelect
    EndIf
  Else
    Fichier = file
  EndIf

  If file = ""
    *Ancien_Element = @ListEditor()
    Chemin = GetPathPart(fichier)
    Currentfile = RemoveString(fichier, Chemin)
  EndIf

  If Fichier
    If CreateFile(0, fichier)
      Buffer = GetGadgetText(ListEditor()\Num_Gadget)
      WriteData(0, @Buffer, Len(Buffer))
      CloseFile(0)
    Else
      MessageRequester("ERROR","Ne peut créer le fichier "+fichier+"!")
      ProcedureReturn 1
    EndIf
  EndIf

  If file = ""
    ListEditor()\FileName = CurrentFile
    ListEditor()\Repertoire = Chemin
    ChangeCurrentElement(ListEditor(), *Ancien_Element)
    SetGadgetItemText(#Panel_Editor,GetGadgetState(#Panel_Editor),CurrentFile,-1)
  EndIf
  
  Status_Bar()

  SetActiveGadget(ListEditor()\Num_Gadget)
  ProcedureReturn 0
EndProcedure

Procedure CallBack(WindowID.l, Message.l, wParam.l, lParam.l)
  WW = WindowWidth(#Win_0) : WH = WindowHeight(#Win_0) - StatusBarHeight(#StatusBar_Win_0) - MenuHeight()
  
  Select Message
    Case #WM_CTLCOLOREDIT
    
    Case #WM_SIZE
      ResizeGadget(#Panel_Editor,0,0,WW,WH)
      
      ResetList(ListEditor())
      ForEach ListEditor()
        ResizeGadget(ListEditor()\Num_Gadget,0,0,WW - 4,WH - GetGadgetAttribute(#Panel_Editor, #PB_Panel_TabHeight) - 2)
      Next      
      
    Case #WM_MENUSELECT
      If lParam = GetMenu_(WindowID)
        Select LOWORD(wParam)
          Case 0
            StatusBarText(#StatusBar_Win_0,0,"Menu Fichier")
          Case 1
            StatusBarText(#StatusBar_Win_0,0,"Menu Edition")
          Case 2
            StatusBarText(#StatusBar_Win_0,0,"Menu Aide")
        EndSelect
      Else
        Select LOWORD(wParam)
          Case 0
            StatusBarText(#StatusBar_Win_0,0,"Nouveau script")
          Case 1
            StatusBarText(#StatusBar_Win_0,0,"Ouvrir un script...")
          Case 2
            StatusBarText(#StatusBar_Win_0,0,"Enregistrer le script")
          Case 3
            StatusBarText(#StatusBar_Win_0,0,"Enregistrer le script sous...")
          Case 4
            StatusBarText(#StatusBar_Win_0,0,"Quitter WinGS")
          Case 5
            StatusBarText(#StatusBar_Win_0,0,"Aide...")
          Case 6
            StatusBarText(#StatusBar_Win_0,0,"A propos de...")
        EndSelect
      EndIf
    Case #WM_EXITMENULOOP
      Position = GetGadgetState(#Panel_Editor)
      SelectElement(ListEditor(),Position)
      Status_Bar()
  EndSelect
  ProcedureReturn #PB_ProcessPureBasicEvents 
EndProcedure

Procedure Windows_About()
  If OpenWindow(#Win_About,10,10,205,140,"About GScript Editor",#PB_Window_SystemMenu|#PB_Window_WindowCentered,WindowID(#Win_0))
    If CreateGadgetList(WindowID(#Win_About))
      ;on récupère le handle de l'icône de la fenêtre de l'application avec 
      ;GetClassLong_(WindowID(#Window), #GCL_HICON)
      ;Merci à Gnozal :)
      ImageGadget(1000,5,5,32,32,GetClassLong_(WindowID(#Win_0), #GCL_HICON))

      TextGadget(1001,40,5,105,18,#GS_TITLE)
        SetGadgetFont(1001, Font_About)
      TextGadget(1002,40,22,105,18,#GS_VERSION)
        SetGadgetFont(1002, Font_About)
      TextGadget(1003,40,59,195,36,"©2007 by Nicolas DJUROVIC")
        SetGadgetFont(1003, Font_About)
      TextGadget(1004,75,74,195,36,"aka "+Chr(34)+"Flaith"+Chr(34))
        SetGadgetFont(1003, Font_About)
        
      ButtonGadget(1005,70,114,60,18,"Ok")
        SetGadgetFont(1004, Font_About)
    EndIf
    
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow 
          aboutquit = 1
  
        Case #PB_Event_Gadget
          Select EventGadget()
            Case 1005
              aboutquit = 1
  
          EndSelect
      EndSelect
    Until aboutquit = 1

    CloseWindow(#Win_About)
  EndIf
EndProcedure

Procedure CreateEditor()

  AddElement(ListEditor())
    Gadget_Editor + 1
    Num_Editor + 1
    
    ListEditor()\Num_Gadget = Gadget_Editor
    ListEditor()\Num        = Num_Editor

    Untitled$ = "<untitled"+RSet(Str(ListEditor()\Num),2,"0")+".gs>"
    Directory$ = GetCurrentDirectory()
    
    ListEditor()\Filename   = Untitled$
    ListEditor()\Repertoire = Directory$
    
  AddGadgetItem(#Panel_Editor, -1, ListEditor()\Filename)
    ListEditor()\hEdit = EditorGadget(ListEditor()\Num_Gadget, 0, 0, WindowWidth(#Win_0) - 4, WindowHeight(#Win_0) - StatusBarHeight(#StatusBar_Win_0) - MenuHeight() - GetGadgetAttribute(#Panel_Editor, #PB_Panel_TabHeight) - 2)

;   a$="      ListEditor()\Num_Gadget = "+Str(ListEditor()\Num_Gadget)+#CRLF$
;   a$+"      ListEditor()\Num        = "+Str(ListEditor()\Num)+#CRLF$
;   a$+"      ListEditor()\Filename   = "+ListEditor()\Filename+#CRLF$
;   a$+"      ListEditor()\Repertoire = "+ListEditor()\Repertoire+#CRLF$
;   a$+"      ListEditor()\hEdit      = "+Str(ListEditor()\hEdit)

  SetGadgetColor(ListEditor()\Num_Gadget, #PB_Gadget_FrontColor, $FFFFFF)
  SetGadgetColor(ListEditor()\Num_Gadget, #PB_Gadget_BackColor, RGB(50,50,50))
  SetGadgetFont(ListEditor()\Num_Gadget, Font_Editor)
  SetActiveGadget(ListEditor()\Num_Gadget)
  SetGadgetState(#Panel_Editor,ListEditor()\Num-1)

  Status_Bar()
EndProcedure

Procedure Create_PopUP_Menu()
  If CreatePopupMenu(#Menu_PopUP)
    MenuItem(#Menu_Couper,     "Couper"+Chr(9)+"Ctrl-X")
    MenuItem(#Menu_Copier,     "Copier"+Chr(9)+"Ctrl-C")
    MenuItem(#Menu_Coller,     "Coller"+Chr(9)+"Ctrl-V")
    MenuBar()
    MenuItem(#Menu_Select_All, "Sélectionner tout"+Chr(9)+"Ctrl-A")
    MenuBar()
    MenuItem(#Menu_Printer,    "Configuration de l'impression...        ")
;     MenuItem(#Menu_Apercu,      "Apercu avant impression")
    MenuItem(#Menu_Imprimer,   "Imprimer"+Chr(9)+"Ctrl-P")
    MenuBar()
    MenuItem(#Menu_Fermer,     "Fermer"+Chr(9)+"Ctrl-W")
  EndIf
EndProcedure

Procedure OpenWindow_Win_0()
  If OpenWindow(#Win_0, 0, 0, 800, 600, "#Win_0", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered)
    If CreateMenu(#Menu_Win_0, WindowID(#Win_0))
      MenuTitle("Fichier")
      MenuItem(#Menu_Nouveau,     "&Nouveau"+Chr(9)+"Ctrl-N")
      MenuItem(#Menu_Ouvrir,      "&Ouvrir..."+Chr(9)+"Ctrl-O")
      MenuItem(#Menu_Sauver,      "&Enregistrer"+Chr(9)+"Ctrl-S")
      MenuItem(#Menu_Sauver_Sous, "Enregistrer sous...")
      MenuItem(#Menu_Sauver_Tout, "Enregistrer tout")
      MenuItem(#Menu_Fermer,      "Fermer"+Chr(9)+"Ctrl-W")
      MenuItem(#Menu_Fermer_Tout, "Fermer tout")
      MenuBar()
      MenuItem(#Menu_Printer,     "Configuration de l'impression...        ")
;       MenuItem(#Menu_Apercu,      "Apercu avant impression")
      MenuItem(#Menu_Imprimer,    "Imprimer"+Chr(9)+"Ctrl-P")
      MenuBar()
      MenuItem(#Menu_Quitter,     "&Quitter")
      MenuTitle("Edition")
      MenuItem(#Menu_Couper,      "Couper                                  "+Chr(9)+"Ctrl-X")
      MenuItem(#Menu_Copier,      "Copier"+Chr(9)+"Ctrl-C")
      MenuItem(#Menu_Coller,      "Coller"+Chr(9)+"Ctrl-V")
      MenuBar()
      MenuItem(#Menu_Select_All,  "Sélectionner tout"+Chr(9)+"Ctrl-A")
      MenuTitle("Aide")
      MenuItem(#Menu_Aide,        "Aide...                                 "+Chr(9)+"F1")
      MenuBar()
      MenuItem(#Menu_APropos,     "A propos de ...")
    EndIf
    
    hsb = CreateStatusBar(#StatusBar_Win_0, WindowID(#Win_0))
    If hsb
      AddStatusBarField(150)        ; Fichier en cours
      AddStatusBarField(120)        ; Ligne/colonne
      AddStatusBarField(60)         ; Statut (Insertion/Ecrasement)
      AddStatusBarField(40)         ; Indication si texte modifié ou pas
      AddStatusBarField(2000)       ; un max pour aller jusqu'au bout 
    EndIf

    If CreateGadgetList(WindowID(#Win_0))
      AddKeyboardShortcut(#Win_0, #PB_Shortcut_N | #PB_Shortcut_Control, #Menu_Nouveau)
      AddKeyboardShortcut(#Win_0, #PB_Shortcut_O | #PB_Shortcut_Control, #Menu_Ouvrir)
      AddKeyboardShortcut(#Win_0, #PB_Shortcut_S | #PB_Shortcut_Control, #Menu_Sauver)
      AddKeyboardShortcut(#Win_0, #PB_Shortcut_W | #PB_Shortcut_Control, #Menu_Fermer)
      AddKeyboardShortcut(#Win_0, #PB_Shortcut_X | #PB_Shortcut_Control, #Menu_Couper)
      AddKeyboardShortcut(#Win_0, #PB_Shortcut_C | #PB_Shortcut_Control, #Menu_Copier)
      AddKeyboardShortcut(#Win_0, #PB_Shortcut_V | #PB_Shortcut_Control, #Menu_Coller)
      AddKeyboardShortcut(#Win_0, #PB_Shortcut_A | #PB_Shortcut_Control, #Menu_Select_All)
      AddKeyboardShortcut(#Win_0, #PB_Shortcut_P | #PB_Shortcut_Control, #Menu_Imprimer)
      AddKeyboardShortcut(#Win_0, #PB_Shortcut_F1                      , #Menu_Aide)
      AddKeyboardShortcut(#Win_0, #PB_Shortcut_F4 | #PB_Shortcut_Alt   , #Alt_F4)

      PanelGadget(#Panel_Editor, 0, 0, WindowWidth(#Win_0), WindowHeight(#Win_0) - StatusBarHeight(#StatusBar_Win_0) - MenuHeight())
        CreateEditor()
      CloseGadgetList()
    EndIf
  EndIf
EndProcedure

; Pris sur la source de l'éditeur de purebasic
Procedure CreateRegistryKeys()
  If GetVersion_() & $FF0000  ; Windows NT/XP

    If RegCreateKeyEx_(#HKEY_CLASSES_ROOT, "Applications\WinGS.exe\shell\open\command", 0, 0, #REG_OPTION_NON_VOLATILE, #KEY_ALL_ACCESS, 0, @NewKey, @KeyInfo) = #ERROR_SUCCESS
      StringBuffer$ = Chr(34)+FullPath+"WinGS.exe"+Chr(34)+" "+Chr(34)+"%1"+Chr(34)
      RegSetValueEx_(NewKey, "", 0, #REG_SZ,  StringBuffer$, Len(StringBuffer$)+1)
      RegCloseKey_(NewKey)
    EndIf

    If RegCreateKeyEx_(#HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.gs", 0, 0, #REG_OPTION_NON_VOLATILE, #KEY_ALL_ACCESS, 0, @NewKey, @KeyInfo) = #ERROR_SUCCESS
      RegSetValueEx_(NewKey, "Application", 0, #REG_SZ,  "WinGS.exe", Len("WinGS.exe")+1)
      RegCloseKey_(NewKey)
    EndIf

    If RegCreateKeyEx_(#HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.gsi", 0, 0, #REG_OPTION_NON_VOLATILE, #KEY_ALL_ACCESS, 0, @NewKey, @KeyInfo) = #ERROR_SUCCESS
      RegSetValueEx_(NewKey, "Application", 0, #REG_SZ,  "WinGS.exe", Len("WinGS.exe")+1)
      RegCloseKey_(NewKey)
    EndIf

  Else  ; The same for Win9x

    If RegCreateKeyEx_(#HKEY_LOCAL_MACHINE, "Software\Classes\WinGS.exe\shell\open\command", 0, 0, #REG_OPTION_NON_VOLATILE, #KEY_ALL_ACCESS, 0, @NewKey, @KeyInfo) = #ERROR_SUCCESS
      StringBuffer$ = Chr(34)+FullPath+"WinGS.exe"+Chr(34)+" "+Chr(34)+"%1"+Chr(34)
      RegSetValueEx_(NewKey, "", 0, #REG_SZ,  StringBuffer$, Len(StringBuffer$)+1)
      RegCloseKey_(NewKey)
    EndIf

    If RegCreateKeyEx_(#HKEY_LOCAL_MACHINE, "Software\CLASSES\.gs", 0, 0, #REG_OPTION_NON_VOLATILE, #KEY_ALL_ACCESS, 0, @NewKey, @KeyInfo) = #ERROR_SUCCESS
      RegSetValueEx_(NewKey, "", 0, #REG_SZ,  "WinGS.exe", Len("WinGS.exe")+1)
      RegCloseKey_(NewKey)
    EndIf

    If RegCreateKeyEx_(#HKEY_LOCAL_MACHINE, "Software\CLASSES\.gsi", 0, 0, #REG_OPTION_NON_VOLATILE, #KEY_ALL_ACCESS, 0, @NewKey, @KeyInfo) = #ERROR_SUCCESS
      RegSetValueEx_(NewKey, "", 0, #REG_SZ,  "WinGS.exe", Len("WinGS.exe")+1)
      RegCloseKey_(NewKey)
    EndIf

  EndIf

EndProcedure

Procedure Init()
  Gadget_Editor = 5000
  Num_Editor = 0
  FullPath = Space(1000)
  GetModuleFileName_(GetModuleHandle_(0), @FullPath, 1000)

  FullPath = GetPathPart(FullPath)

;  CreateRegistryKeys()
  
  If CreateFile(#TMP_FILE,#GS_TMP_FILENAME)
    SetFileAttributes(#GS_TMP_FILENAME, #PB_FileSystem_Hidden)
    OpenWindow_Win_0()
    Create_PopUP_Menu()
    SmartWindowRefresh(#Win_0, #False) 
          
    PrintDlg\hDevMode = 0
    PrintDlg\hDevNames = 0
    PrintDlg\lStructSize = SizeOf(PRINTDLG)
    PrintDlg\Flags = #PD_ALLPAGES

    SetWindowTitle(#Win_0,#GS_TITLE)
    StatusBarText(#StatusBar_Win_0,0,"")
    StatusBarText(#StatusBar_Win_0,4,#GS_VERSION)

    SetWindowCallback(@CallBack())
  Else
    MessageRequester("ERROR","Impossible de créer un fichier temporaire !")
  EndIf
EndProcedure

Procedure CheckParam()
  If CountProgramParameters() > 0
    The_File_To_Load = ProgramParameter()
    Open_ReadFile(The_File_To_Load)
  EndIf
EndProcedure

Procedure LoadTMPFile()
Protected a.l, b.l, c.s, d.s, e.l, f.b

  If ReadFile(#TMP_FILE,#GS_TMP_FILENAME)
    While Eof(#TMP_FILE) = 0
      a = ReadLong(#TMP_FILE)
      b = ReadLong(#TMP_FILE)
      c = ReadString(#TMP_FILE)
      d = ReadString(#TMP_FILE)
      e = ReadLong(#TMP_FILE)
      f = ReadByte(#TMP_FILE)
      
      AddElement(ListEditor())
      ListEditor()\Num_Gadget = a
      ListEditor()\Num        = b
      ListEditor()\Filename   = c
      ListEditor()\Repertoire = d
      ListEditor()\hEdit      = e
      ListEditor()\Modified   = f
    Wend
  EndIf
  
  If LastElement(ListEditor())
    Gadget_Editor = ListEditor()\Num_Gadget
    Num_Editor = ListEditor()\Num
  EndIf
EndProcedure

Procedure Quit()
  GlobalFree_(PrintDlg\hDevNames)
  CreateFile(#TMP_FILE,#GS_TMP_FILENAME)    ;Efface les données
  CloseFile(#TMP_FILE)
  DeleteFile(#GS_TMP_FILENAME)
  End
EndProcedure

;***************************************************
; OnErrorGoto(?ShowError)
;***************************************************

; ***************************************
; *** Programme Principal
; ***************************************
#MUTEX_ALL_ACCESS =  $1F0001

Hmutex = OpenMutex_(#MUTEX_ALL_ACCESS,#False,#GS_TITLE)
If Hmutex > 0
  ;On recherche l'application
  ;pour la mettre au premier plan.
  Handle=FindWindow_(#Null, #GS_TITLE)
  ShowWindow_(Handle,#SW_HIDE)
  ShowWindow_(Handle,#SW_MINIMIZE)
  ShowWindow_(Handle,#SW_RESTORE)
  LoadTMPFile()
;  CheckParam()
  End
Else
  ;Si le mutex existe alors l'application est déjà lancée.
  ;sinon on le crée
  Hmutex = CreateMutex_(#Null, #True, #GS_TITLE) ;Application)
  If Hmutex=0
    ;Fin du programme mutex non créé
    End
  EndIf
  Init()
  CheckParam()
EndIf

; Event loop
Repeat
  ; Affiche ligne et position dans le fichier

  ExSel.CHARRANGE
  hEdit = ListEditor()\hEdit
  PosY = SendMessage_(hEdit, #EM_LINEFROMCHAR, -1,0)
  SendMessage_(hEdit, #EM_EXGETSEL, 0, @ExSel)
  PosTotal = ExSel\cpMin - PosY
  PosX = ExSel\cpMax-(SendMessage_(hEdit,#EM_LINEINDEX,SendMessage_(hEdit,#EM_EXLINEFROMCHAR,0,ExSel\cpMin),0))
  NbCar = ExSel\cpMin

  StatusBarText(#StatusBar_Win_0,1,"Lig: "+Str(PosY+1)+" Col: "+Str(PosX+1), #PB_StatusBar_Center)
          
  Event = WaitWindowEvent()
  Select Event
    ; ///////////////////
    Case #WM_RBUTTONDOWN
      DisplayPopupMenu(#Menu_PopUP, WindowID(#Win_0))

    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      Select EventGadget
        Case #Editor
        Case #Panel_Editor
          Position = GetGadgetState(#Panel_Editor)
          SelectElement(ListEditor(),Position)
          Status_Bar()
          SetActiveGadget(ListEditor()\Num_Gadget)
      EndSelect
    ; ///////////////
    Case #PB_Event_Menu
      EventMenu = EventMenu()
      Select EventMenu
        Case #Menu_Nouveau
          CreateEditor()
          
        Case #Menu_Ouvrir
          Open_ReadFile()
          
        Case #Menu_Sauver
          Save_WriteFile(CurrentFile)
       
        Case #Menu_Sauver_Sous
          Save_WriteFile()

        Case #Menu_Sauver_Tout

        Case #Menu_Fermer

        Case #Menu_Fermer_Tout
        
        Case #Menu_Printer
          If PrintDlg_(PrintDlg) <> #False
            *DEVNAMES.DEVNAMES = GlobalLock_(PrintDlg\hDevNames)
;             PrinterDeviceName$ = PeekS(*DEVNAMES + *DEVNAMES\wDeviceOffset)
;             Debug "Printer Device Name = " + PrinterDeviceName$
            GlobalUnlock_(PrintDlg\hDevNames)
          EndIf

;         Case #Menu_Apercu
        
        Case #Menu_Imprimer

        Case #Menu_Quitter
          Quit()
          
        Case #Menu_Couper

        Case #Menu_Copier

        Case #Menu_Coller

        Case #Menu_Select_All
        
        Case #Menu_Aide
;           ResetList(ListEditor())
;           ForEach ListEditor()
;             Debug "-------------------------------------------------"
;             Debug "Repertoire du fichier = "+ListEditor()\Repertoire
;             Debug "              fichier = "+ListEditor()\filename
;           Next
        Case #Menu_APropos
          Windows_About()
      EndSelect
    ; //////////////////////
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      Select EventWindow
        Case #Win_0
          Quit()
      EndSelect
  EndSelect
ForEver

End

; ShowError:
;   Reg_EAX$    = "EAX=0x"+RSet( Str(GetErrorRegister(#PB_OnError_EAX)) ,8,"0")+" "
;   Reg_EBX$    = "EBX=0x"+RSet( Str(GetErrorRegister(#PB_OnError_EBX)) ,8,"0")+" "
;   Reg_ECX$    = "ECX=0x"+RSet( Str(GetErrorRegister(#PB_OnError_ECX)) ,8,"0")+" "
;   Reg_EDX$    = "EDX=0x"+RSet( Str(GetErrorRegister(#PB_OnError_EDX)) ,8,"0")+" "
;   Reg_ESI$    = "ESI=0x"+RSet( Str(GetErrorRegister(#PB_OnError_ESI)) ,8,"0")+#CRLF$
;   Reg_EDI$    = "EDI=0x"+RSet( Str(GetErrorRegister(#PB_OnError_EDI)) ,8,"0")+" "
;   Reg_EBP$    = "EBP=0x"+RSet( Str(GetErrorRegister(#PB_OnError_EBP)) ,8,"0")+" "
;   Reg_ESP$    = "ESP=0x"+RSet( Str(GetErrorRegister(#PB_OnError_ESP)) ,8,"0")+" "
;   Reg_FFLags$ = "EFL=0x"+RSet( Str(GetErrorRegister(#PB_OnError_FFLags)) ,8,"0")+#CRLF$
;   Reg_SegCS$  = "CS =0x"+RSet( Str(GetErrorRegister(#PB_OnError_SegCS)) ,4,"0")+" "+#CRLF$
;   Reg_SegSS$  = "SS =0x"+RSet( Str(GetErrorRegister(#PB_OnError_SegSS)) ,4,"0")+#CRLF$+#CRLF$
;   
;   err$ = Reg_EAX$+Reg_EBX$+Reg_ECX$+Reg_EDX$+Reg_ESI$+Reg_EDI$
;   err$ + Reg_EBP$+Reg_ESP$+Reg_FFLags$+Reg_SegCS$+Reg_SegSS$
;   err$ + "NumGadget = "+Str(ListEditor()\Num_Gadget)+#CRLF$
;   err$ + "Num       = "+Str(ListEditor()\Num)+#CRLF$
;   err$ + "FileName  = "+ListEditor()\Filename+#CRLF$
;   err$ + "Directory = "+ListEditor()\Repertoire+#CRLF$
;   err$ + "hEdit     = "+Str(ListEditor()\hEdit)+#CRLF$
; 
;   OpenConsole()
;   _BEEP()
;   PrintN("Error line : "+Str(GetErrorLineNR())+#CRLF$+GetErrorDescription()+#CRLF$)
;   PrintN(err$)
;   Print("Press Enter :") : Input()
;   
;   ;MessageRequester("Error",err$+#CRLF$+"Erreur ligne : "+Str(GetErrorLineNR())+" => "+GetErrorDescription())
;   
;   CloseConsole()
;   End
Répondre