Petit programme

Programmation d'applications complexes
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Petit programme

Message par Guimauve »

Bonjour à tous.

J'ai trouvé le code source d'un programme pour prendre des notes rapides. Je ne sais pas qui l'a programmé mais le source n'était pas complet. Je l'ai complété avec un bout de code de Freak, revu et amélioré. Je place ici le source complet. J'ai pas vu de bogue dans cette version. Je travaille à ajouter une fonction Chercher/Remplacer/Enlever/Inserer

Il est possible de traduire le programme dans toute les langues possibles.
Il suffit simplement de modifier le fichier Language.pref.

Code : Tout sélectionner

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Programme de petites notes
; Version 1.1003
; Programmation = OK
; Programmé par : Guimauve
; Date : 28 Février 2004
; Codé avec PureBasic V3.81
; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; >>>>>>>>>>>>> TRÈS IMPORTANT >>>>>>>>>>>>>>
; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; SI VOUS TESTER LE CODE VOUS DEVEZ COMPILER
; L'ÉXÉCUTABLE LE SAUVEGARDER DANS LE MÊME
; RÉPERTOIRE QUE LE SOURCE OU VOUS ASSURER
; LES FICHIER "Petites Notes.pref" ET "Language.pref" SE
; TROUVENT DANS LE RÉPERTOIRE DU SOURCE.
; CECI EST DÛ LA COMMANDE DE REDÉMMARAGE DU
; PROGRAMME.

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<<<<<<<< TRÈS IMPORTANT <<<<<<<<<<<<<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; German forum: http://robsite.de/php/pureboard/viewtopic.php?t=1442&highlight=
; Author: Freak
; Date: 22. June 2003

; Update from 12. July 2003 (http://purebasic.myforums.net/viewtopic.php?t=6666&highlight=)
; added background color procedure, needs RichEdit2.0+ (RICHED20.DLL or RICHED32.DLL, RICHED.DLL is RichEdit 1.0)

; * English description:
; Let's you modify the attributes of the selected Text in a EditorGadget()
; I included the Editor_Select() function, so you can modify whatever you
; want, by first selecting it.

; * Deutsche Beschreibung:
; Mit den Funktionen kann man die Attribute des selektierten Texted
; ändern, desshalb hab ich noch die Editor_Select() funktion gemacht, um
; einen bestimmten bereich zu selektieren.


; Selects Text inside an EditorGadget
; Line numbers range from 0 to CountGadgetItems(#Gadget)-1
; Char numbers range from 1 to the length of a line
; Set Line numbers to -1 to indicate the last line, and Char
; numbers to -1 to indicate the end of a line
; selecting from 0,1 to -1, -1 selects all.

Structure CHARFORMAT2_
     cbSize.l
     dwMask.l
     dwEffects.l
     yHeight.l
     yOffset.l
     crTextColor.l
     bCharSet.b
     bPitchAndFamily.b
     szFaceName.b[#LF_FACESIZE]
     _wPad2.w
     wWeight.w
     sSpacing.w
     crBackColor.l
     lcid.l
     dwReserved.l
     sStyle.w
     wKerning.w
     bUnderlineType.b
     bAnimation.b
     bRevAuthor.b
     bReserved1.b
EndStructure

Procedure Editor_BackColor(Gadget, Color.l)
     format.CHARFORMAT2_
     format\cbSize = SizeOf(CHARFORMAT2_)
     format\dwMask = $4000000 ; = #CFM_BACKCOLOR
     format\crBackColor = Color
     SendMessage_(GadgetID(Gadget), #EM_SETCHARFORMAT, #SCF_SELECTION, @format)
EndProcedure

Procedure Editor_Select(Gadget, LineStart.l, CharStart.l, LineEnd.l, CharEnd.l)
     sel.CHARRANGE
     sel\cpMin = SendMessage_(GadgetID(Gadget), #EM_LINEINDEX, LineStart, 0) + CharStart - 1
     
     If LineEnd = -1
          LineEnd = SendMessage_(GadgetID(Gadget), #EM_GETLINECOUNT, 0, 0) - 1
     EndIf
     sel\cpMax = SendMessage_(GadgetID(Gadget), #EM_LINEINDEX, LineEnd, 0)
     
     If CharEnd = -1
          sel\cpMax + SendMessage_(GadgetID(Gadget), #EM_LINELENGTH, sel\cpMax, 0)
     Else
          sel\cpMax + CharEnd - 1
     EndIf
     SendMessage_(GadgetID(Gadget), #EM_EXSETSEL, 0, @sel)
EndProcedure

; Set the Text color for the Selection
; in RGB format
Procedure Editor_Color(Gadget, Color.l)
     format.CHARFORMAT
     format\cbSize = SizeOf(CHARFORMAT)
     format\dwMask = #CFM_COLOR
     format\crTextColor = Color
     SendMessage_(GadgetID(Gadget), #EM_SETCHARFORMAT, #SCF_SELECTION, @format)
EndProcedure

; Set Font Size for the Selection
; in pt
Procedure Editor_FontSize(Gadget, Fontsize.l)
     format.CHARFORMAT
     format\cbSize = SizeOf(CHARFORMAT)
     format\dwMask = #CFM_SIZE
     format\yHeight = FontSize * 20
     SendMessage_(GadgetID(Gadget), #EM_SETCHARFORMAT, #SCF_SELECTION, @format)
EndProcedure

; Set Font for the Selection
; You must specify a font name, the font doesn't need
; to be loaded
Procedure Editor_Font(Gadget, FontName.s)
     format.CHARFORMAT
     format\cbSize = SizeOf(CHARFORMAT)
     format\dwMask = #CFM_FACE
     PokeS(@format\szFaceName, FontName)
     SendMessage_(GadgetID(Gadget), #EM_SETCHARFORMAT, #SCF_SELECTION, @format)
EndProcedure

; Set Format of the Selection. This can be a combination of
; the following values:
; #CFM_BOLD
; #CFM_ITALIC
; #CFM_UNDERLINE
; #CFM_STRIKEOUT
Procedure Editor_Format(Gadget, Flags.l)
     format.CHARFORMAT
     format\cbSize = SizeOf(CHARFORMAT)
     format\dwMask = #CFM_ITALIC | #CFM_BOLD | #CFM_STRIKEOUT | #CFM_UNDERLINE
     format\dwEffects = Flags
     SendMessage_(GadgetID(Gadget), #EM_SETCHARFORMAT, #SCF_SELECTION, @format)
EndProcedure


; Énumeration des Constantes
Enumeration
     
     ; Constante pour le programme
     #Fenetre
     #Popupmenu
     #Editeur
     
     ; Constante du popupmenu
     #Couper
     #Copier
     #Coller
     #Selection
     #Nouveau
     #Ouvrir
     #Sauver
     #Sauversous
     #Caractere
     #Position0
     #Position1
     #Position2
     #Visibilite
     #Quitter
     
     ; Constante pour le fichier txt
     #Petites_notes_txt
     
EndEnumeration

Global repertoire$
Global fontname$, fontsize.l, red.l, green.l, blue.l
Global OptionAffichage$
Global Programmenom$
Global Menutxt01$
Global Menutxt02$
Global Menutxt03$
Global Menutxt04$
Global Menutxt05$
Global Menutxt06$
Global Menutxt07$
Global Menutxt08$
Global Menutxt09$
Global Menutxt10$
Global Menutxt11$
Global Menutxt12$
Global Menutxt13$
Global Menutxt14$
Global Menutxt15$
Global Menutxt16$
Global Savefiletxt01$
Global Savefiletxt02$
Global Savefiletxt03$
Global Warningtxt01$
Global Warningtxt02$
Global Warningtxt03$
Global Warningtxt04$
Global Errortxt01$
Global position_fenetre.l
Global textebuffer$


; Gestion des préférences de l'utilisateur
; Choix des caratères et la grosseur du texte

Procedure CreateFontPref(mode.b)
     
     If mode = 0 ; Créer le fichier par défault
          
          If CreatePreferences("Petites Notes.pref")
               WritePreferenceString("FontName", "Courier New" )
               WritePreferenceLong("FontSize", 8)
               WritePreferenceLong("Red", 0)
               WritePreferenceLong("Green", 0)
               WritePreferenceLong("Blue", 0)
               PreferenceComment(" Position on screen : 0 = Centred ; 1 = Lower Right ; 2 = Upper Right")
               WritePreferenceLong("Position on screen", 2)
               WritePreferenceString("Always on top", "Yes")
               ClosePreferences()
          EndIf
          
     Else ; Remplacer le fichier avec les nouvelles valeurs
          
          If CreatePreferences("Petites Notes.pref")
               WritePreferenceString("FontName", fontname$)
               WritePreferenceLong("FontSize", fontsize)
               WritePreferenceLong("Red", red)
               WritePreferenceLong("Green", green)
               WritePreferenceLong("Blue", blue)
               PreferenceComment(" Position on screen : 0 = Centred ; 1 = Lower Right ; 2 = Upper Right")
               WritePreferenceLong("Position on screen", position_fenetre)
               WritePreferenceString("Always on top", OptionAffichage$)
               ClosePreferences()
          EndIf
     EndIf
     
EndProcedure


Procedure SetEditorUserPref()
     
     Editor_Select(#Editeur, 0, 1, -1, -1)
     Editor_Font(#Editeur, fontname$)
     Editor_FontSize(#Editeur, fontsize)
     Editor_Color(#Editeur, RGB(red, green, blue))
     Editor_Format(#Editeur, 0)
     Editor_Select(#Editeur, 0, 0, 0, 0)
     
EndProcedure


; Procedure de redimensionnement de la fenètre
Procedure WindowResize(WindowID, Message, wParam, lParam)
     
     Result = #PB_ProcessPureBasicEvents
     
     If Message = #WM_SIZE
          
          ResizeGadget(#Editeur, 2, 2, WindowWidth() - 4, WindowHeight() - 4)
          
          ReturnValue = 1
          
     EndIf
     
     ProcedureReturn Result
     
EndProcedure


Procedure Ouvrir()
     
     repertoire$ = OpenFileRequester(Menutxt06$, "C:\", Savefiletxt02$ + "(*.txt)|*.txt|" + Savefiletxt03$ + "(*.*)| *.*", 0)
     
     If OpenFile(#Petites_notes_txt, repertoire$)
          
          ; On vide l'éditeur si un fichier est ouvert
          ClearGadgetItemList(#Editeur)
          
          ; Puis ajoute dans l'éditeur le contenu du fichier txt
          Repeat
               
               AddGadgetItem(#Editeur, -1, ReadString())
               
          Until Eof(#Petites_notes_txt)
          
          CloseFile(#Petites_notes_txt)
          
          ; On prend tout le texte et on lui applique les préférences de l'utilisateur
          ; Choix de la police de caractère, la grosseur et la couleur du texte.
          SetEditorUserPref()
          
     EndIf
     
EndProcedure

Procedure.l savingtxt()
     
     If OpenFile(#Petites_notes_txt, repertoire$) = 0
          MessageRequester(Programmenom$, Errortxt01$, #MB_ICONWARNING)
          
     Else
          
          For n = 0 To CountGadgetItems(#Editeur) - 1 ; On lit chaque ligne de l'EditorGadget, puis on l'enregistre dans le fichier
               
               WriteStringN(GetGadgetItemText(#Editeur, n, 0)) ; permet d'écrire dans le fichier en cours puis ajoute un saut de ligne
               
          Next
          
          CloseFile(#Petites_notes_txt) ; on ferme le fichier
          
     EndIf
EndProcedure

Procedure.l save_notes_txt()
     
     ; On demande à l'utilisateur le répertoire et le nom du fichier à sauvegarder
     repertoire$ = SaveFileRequester(Savefiletxt01$, "C:\", Savefiletxt02$ + " (*.txt)|*.txt|" + Savefiletxt03$ + " (*.*)| *.*", 0)
     
     ; L'adresse repertoire est non nulle, donc on sauvegarde le fichier
     If repertoire$ <> ""
          
          ; On prend les informations pour la sauvegarde
          ; N.B. Ces informations sont utiles seulement dans le cas où
          ; l'adresse repertoire n'est pas complète.
          nomfichier$ = GetFilePart(repertoire$)
          repertoiresauve$ = GetPathPart(repertoire$)
          
          If GetExtensionPart(repertoire$) = ""
               ; Si l'extension est Null on reconstruit le chemin complet
               repertoire$ = repertoiresauve$ + nomfichier$ + ".txt"
          EndIf
          
          If Right(repertoire$, 5) = "..txt"
               ; Si l'extension possède 2 points on reconstruit le chemin complet
               repertoire$ = repertoiresauve$ + nomfichier$ + "txt"
          EndIf
          
          ; On vérifie si le fichier existe déja dans le répertoire spécifié
          If FileSize(repertoire$) > - 1
               
               If MessageRequester(Programmenom$, Warningtxt01$, #MB_YESNO | #MB_ICONWARNING) = #IDYES
                    DeleteFile(repertoire$)
               EndIf
               
          EndIf
          
          savingtxt()
          
     EndIf
     
EndProcedure


Procedure SauverAvantSortir()
     
     ; Le répertoire de travail est connu et le texte à été modifié depuis la dernière sauvegarde
     If repertoire$ <> "" And GetGadgetText(#Editeur) <> textebuffer$
          If MessageRequester(Programmenom$, Warningtxt03$ + Chr(10) + Chr(10) + Warningtxt04$, #MB_YESNO | #MB_ICONWARNING) = #IDYES
               savingtxt()
          EndIf
          
          ; Le répertoire de travail est null et il y a du texte dans l'éditeur
     ElseIf repertoire$ = "" And GetGadgetText(#Editeur) <> ""
          If MessageRequester(Programmenom$, Warningtxt02$ + Chr(10) + Chr(10) + Warningtxt04$, #MB_YESNO | #MB_ICONWARNING) = #IDYES
               save_notes_txt()
          EndIf
          
     EndIf
EndProcedure

If OpenPreferences("Petites Notes.pref") = 0
     ; Le fichier n'existe pas, on créer celui par défaut
     CreateFontPref(0)
     ; Le fichier Petites Notes.pref est créé. On relance le programme.
     RunProgram("Petites notes.exe")
     ; Puis on ferme le programme qui à généré le fichier Petites Notes.pref
     ; afin de ne pas avoir 2 programmes qui tournent en même temps.
     End
     
Else
     
     fontname$ = ReadPreferenceString("FontName", "Courier New")
     fontsize = ReadPreferenceLong("FontSize", 8)
     red = ReadPreferenceLong("Red", 0)
     green = ReadPreferenceLong("Green", 0)
     blue = ReadPreferenceLong("Blue", 0)
     position_fenetre = ReadPreferenceLong("Position on screen", 2)
     OptionAffichage$ = ReadPreferenceString("Always on top", "Yes")
     ClosePreferences()
     
EndIf

; Chargement des textes pour le programme
; Si le fichier Langage.pref n'est pas trouvé dans le répertoire
; du programme, le programme génère le fichier Langage.pref en
; Français et se relance de lui-même

If OpenPreferences("Language.pref") = 0
     CreatePreferences("Language.pref")
     WritePreferenceString("Program name", "Petites Notes")
     WritePreferenceString("Menu txt 01", "Couper")
     WritePreferenceString("Menu txt 02", "Copier")
     WritePreferenceString("Menu txt 03", "Coller")
     WritePreferenceString("Menu txt 04", "Selectioner tout")
     WritePreferenceString("Menu txt 05", "Nouveau")
     WritePreferenceString("Menu txt 06", "Ouvrir")
     WritePreferenceString("Menu txt 07", "Enregistrer")
     WritePreferenceString("Menu txt 08", "Enregistrer sous")
     WritePreferenceString("Menu txt 09", "Choix de la Police")
     WritePreferenceString("Menu txt 10", "Position dans l'écran")
     WritePreferenceString("Menu txt 11", "Au centre")
     WritePreferenceString("Menu txt 12", "En bas à droite")
     WritePreferenceString("Menu txt 13", "En haut à droite")
     WritePreferenceString("Menu txt 14", "Toujours visible")
     WritePreferenceString("Menu txt 15", "Quitter")
     WritePreferenceString("Save File txt 01", "Enregistrer sous")
     WritePreferenceString("Save File txt 02", "Fichier texte")
     WritePreferenceString("Save File txt 03", "Tout les fichiers")
     WritePreferenceString("Warning txt 01", "Ce fichier existe déja. Voulez-vous remplacer le fichier ?")
     WritePreferenceString("Warning txt 02", "Le contenu des petites notes n'a pas été sauvegardé.")
     WritePreferenceString("Warning txt 03", "Le contenu des petites notes a été modifié.")
     WritePreferenceString("Warning txt 04", "Voulez-vous sauvegarder maintenant ?")
     WritePreferenceString("Error txt 01", "Erreur ! Impossible d'ouvrir le fichier.")
     ClosePreferences()
     ; Le fichier Language.pref en français est créé. On relance le programme.
     RunProgram("Petites notes.exe")
     ; Puis on ferme le programme qui à généré le fichier Language.pref en français
     ; afin de ne pas avoir 2 programmes qui tournent en même temps.
     End
     
Else
     
     Programmenom$ = ReadPreferenceString("Program name", "Petites Notes")
     Menutxt01$ = ReadPreferenceString("Menu txt 01", "Couper")
     Menutxt02$ = ReadPreferenceString("Menu txt 02", "Copier")
     Menutxt03$ = ReadPreferenceString("Menu txt 03", "Coller")
     Menutxt04$ = ReadPreferenceString("Menu txt 04", "Selectioner tout")
     Menutxt05$ = ReadPreferenceString("Menu txt 05", "Nouveau")
     Menutxt06$ = ReadPreferenceString("Menu txt 06", "Ouvrir")
     Menutxt07$ = ReadPreferenceString("Menu txt 07", "Enregistrer")
     Menutxt08$ = ReadPreferenceString("Menu txt 08", "Enregistrer sous")
     Menutxt09$ = ReadPreferenceString("Menu txt 09", "Choix de la Police")
     Menutxt10$ = ReadPreferenceString("Menu txt 10", "Position dans l'écran")
     Menutxt11$ = ReadPreferenceString("Menu txt 11", "Au centre")
     Menutxt12$ = ReadPreferenceString("Menu txt 12", "En bas à droite")
     Menutxt13$ = ReadPreferenceString("Menu txt 13", "En haut à droite")
     Menutxt14$ = ReadPreferenceString("Menu txt 14", "Toujours visible")
     Menutxt15$ = ReadPreferenceString("Menu txt 15", "Quitter")
     Savefiletxt01$ = ReadPreferenceString("Save File txt 01", "Enregistrer sous")
     Savefiletxt02$ = ReadPreferenceString("Save File txt 02", "Fichier texte")
     Savefiletxt03$ = ReadPreferenceString("Save File txt 03", "Tout les fichiers")
     Warningtxt01$ = ReadPreferenceString("Warning txt 01", "Ce fichier existe déja. Voulez-vous remplacer le fichier ?")
     Warningtxt02$ = ReadPreferenceString("Warning txt 02", "Les petites notes n'ont pas été sauvegardé.")
     Warningtxt03$ = ReadPreferenceString("Warning txt 03", "Les petites notes ont été modifié.")
     Warningtxt04$ = ReadPreferenceString("Warning txt 04", "Voulez-vous sauvegarder maintenant ?")
     Errortxt01$ = ReadPreferenceString("Error txt 01", "Erreur ! Impossible d'ouvrir le fichier.")
     ClosePreferences()
     
EndIf

; Variable pour la dimension et la position de la fenètre
; LargeurFenetre = 300
; HauteurFenetre = 225

; Création de la fenètre

#Windows_style = #PB_Window_SystemMenu | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget

If OpenWindow(#Fenetre, GetSystemMetrics_(#SM_CXSCREEN) - 300 - (GetSystemMetrics_(#SM_CXEDGE) * 15), 20, 300, 225, #Windows_style, Programmenom$)
     
     ; On créé le PopupMenu
     CreatePopupMenu(#Popupmenu)
     MenuItem(#Couper, Menutxt01$ + Chr(9) + "Ctrl+X")
     MenuItem(#Copier, Menutxt02$ + Chr(9) + "Ctrl+C")
     MenuItem(#Coller, Menutxt03$ + Chr(9) + "Ctrl+V")
     MenuItem(#Selection, Menutxt04$ + Chr(9) + "Ctrl+A")
     MenuBar()
     MenuItem(#Nouveau, Menutxt05$ + Chr(9) + "Ctrl+N")
     MenuItem(#Ouvrir, Menutxt06$ + Chr(9) + "Ctrl+O")
     MenuItem(#Sauver, Menutxt07$ + Chr(9) + "Ctrl+S")
     MenuItem(#Sauversous, Menutxt08$)
     MenuBar()
     MenuItem(#Caractere, Menutxt09$)
     MenuBar()
     OpenSubMenu(Menutxt10$)
          MenuItem(#Position0, Menutxt11$)
          MenuItem(#Position1, Menutxt12$)
          MenuItem(#Position2, Menutxt13$)
     CloseSubMenu()
     MenuBar()
     MenuItem(#Visibilite, Menutxt14$)
     MenuBar()
     MenuItem(#Quitter, Menutxt15$)
     
     AddKeyboardShortcut(#Fenetre, #PB_Shortcut_Control | #PB_Shortcut_X, #Couper)
     AddKeyboardShortcut(#Fenetre, #PB_Shortcut_Control | #PB_Shortcut_C, #Copier)
     AddKeyboardShortcut(#Fenetre, #PB_Shortcut_Control | #PB_Shortcut_V, #Coller)
     AddKeyboardShortcut(#Fenetre, #PB_Shortcut_Control | #PB_Shortcut_A, #Selection)
     AddKeyboardShortcut(#Fenetre, #PB_Shortcut_Control | #PB_Shortcut_N, #Nouveau)
     AddKeyboardShortcut(#Fenetre, #PB_Shortcut_Control | #PB_Shortcut_O, #Ouvrir)
     AddKeyboardShortcut(#Fenetre, #PB_Shortcut_Control | #PB_Shortcut_S, #Sauver)
     
     If CreateGadgetList(WindowID())
          
          EditorGadget(#Editeur, 2, 2, 300 - 4, 225 - 4)
          
     EndIf
     
     SetWindowCallback(@WindowResize())
     
EndIf

SetEditorUserPref()

If OptionAffichage$ = "Yes"
     SetMenuItemState(#Popupmenu, #Visibilite, 1)
     SetWindowPos_(WindowID(), #HWND_TOPMOST, 0, 0, 0, 0, #SWP_NOMOVE | #SWP_NOSIZE)
Else
     SetMenuItemState(#Popupmenu, #Visibilite, 0)
     SetWindowPos_(WindowID(), #HWND_NOTOPMOST, 0, 0, 0, 0, #SWP_NOMOVE | #SWP_NOSIZE)
EndIf

; Au centre
If position_fenetre = 0
     SetMenuItemState(#Popupmenu, #Position0, 1)
     SetMenuItemState(#Popupmenu, #Position1, 0)
     SetMenuItemState(#Popupmenu, #Position2, 0)
     MoveWindow((GetSystemMetrics_(#SM_CXSCREEN) / 2) - (WindowWidth() / 2), (GetSystemMetrics_(#SM_CYSCREEN) / 2) - (WindowHeight() / 2))
     
     ; En bas à Droite
ElseIf position_fenetre = 1
     SetMenuItemState(#Popupmenu, #Position0, 0)
     SetMenuItemState(#Popupmenu, #Position1, 1)
     SetMenuItemState(#Popupmenu, #Position2, 0)
     MoveWindow(GetSystemMetrics_(#SM_CXSCREEN) - WindowWidth() - (GetSystemMetrics_(#SM_CXEDGE) * 15), GetSystemMetrics_(#SM_CYSCREEN) - WindowHeight() - (GetSystemMetrics_(#SM_CYMIN) * 2))
     
Else ; En haut à Droite
     SetMenuItemState(#Popupmenu, #Position0, 0)
     SetMenuItemState(#Popupmenu, #Position1, 0)
     SetMenuItemState(#Popupmenu, #Position2, 1)
     MoveWindow(GetSystemMetrics_(#SM_CXSCREEN) - WindowWidth() - (GetSystemMetrics_(#SM_CXEDGE) * 15), 20)
     
EndIf

Repeat
     
     EventID = WaitWindowEvent()
     
     Select EventID
               
          Case #PB_EventMenu
               
               Select EventMenuID()
                         
                    Case #Couper
                         SendMessage_(getfocus_(), #WM_CUT, 0, 0)
                         
                    Case #Copier
                         SendMessage_(getfocus_(), #WM_COPY, 0, 0)
                         
                    Case #Coller
                         SendMessage_(getfocus_(), #WM_PASTE, 0, 0)
                         ; Après avoir coller un texte, on applique les options d'affichage à tout le texte
                         SetEditorUserPref()
                         
                    Case #Selection
                         Editor_Select(#Editeur, 0, 1, -1, -1)
                         
                    Case #Nouveau
                         ClearGadgetItemList(#Editeur)
                         ; Après avoir vidé l'éditorgadget on doit remettre les options d'affichage
                         SetEditorUserPref()
                         ; On s'assure que textebuffer et le répertoire de travail sont vide pour ne pas avoir
                         ; de bogue s'il y a eu une sauvegarde depuis que le programme est lancé.
                         textebuffer$ = ""
                         repertoire$ = ""
                         
                    Case #Ouvrir
                         Ouvrir()
                         textebuffer$ = GetGadgetText(#Editeur)
                         
                    Case #Sauver
                         
                         If repertoire$ <> ""
                              savingtxt()
                              textebuffer$ = GetGadgetText(#Editeur)
                         Else
                              save_notes_txt()
                              textebuffer$ = GetGadgetText(#Editeur)
                         EndIf
                         
                    Case #Sauversous
                         save_notes_txt()
                         textebuffer$ = GetGadgetText(#Editeur)
                         
                    Case #Caractere
                         
                         If FontRequester(fontname$, fontsize, #PB_FontRequester_Effects) = 1
                              
                              fontname$ = SelectedFontName()
                              fontsize = SelectedFontSize()
                              red = Red(SelectedFontColor())
                              green = Green(SelectedFontColor())
                              blue = Blue(SelectedFontColor())
                              
                              SetEditorUserPref()
                              
                              CreateFontPref(1)
                              
                         EndIf
                         
                    Case #Position0 ; Position au centre de la fenètre
                         MoveWindow((GetSystemMetrics_(#SM_CXSCREEN) / 2) - (WindowWidth() / 2), (GetSystemMetrics_(#SM_CYSCREEN) / 2) - (WindowHeight() / 2))
                         SetMenuItemState(#Popupmenu, #Position0, 1)
                         SetMenuItemState(#Popupmenu, #Position1, 0)
                         SetMenuItemState(#Popupmenu, #Position2, 0)
                         position_fenetre = 0
                         CreateFontPref(1)
                         
                    Case #Position1 ; Position en bas à droite de la fenètre
                         MoveWindow(GetSystemMetrics_(#SM_CXSCREEN) - WindowWidth() - (GetSystemMetrics_(#SM_CXEDGE) * 15), GetSystemMetrics_(#SM_CYSCREEN) - WindowHeight() - (GetSystemMetrics_(#SM_CYMIN) * 2))
                         SetMenuItemState(#Popupmenu, #Position0, 0)
                         SetMenuItemState(#Popupmenu, #Position1, 1)
                         SetMenuItemState(#Popupmenu, #Position2, 0)
                         position_fenetre = 1
                         CreateFontPref(1)
                         
                    Case #Position2 ; Position en haut à droite de la fenètre
                         MoveWindow(GetSystemMetrics_(#SM_CXSCREEN) - WindowWidth() - (GetSystemMetrics_(#SM_CXEDGE) * 15), 20)
                         SetMenuItemState(#Popupmenu, #Position0, 0)
                         SetMenuItemState(#Popupmenu, #Position1, 0)
                         SetMenuItemState(#Popupmenu, #Position2, 1)
                         position_fenetre = 2
                         CreateFontPref(1)
                         
                    Case #Visibilite
                         
                         If GetMenuItemState(#Popupmenu, #Visibilite) ; L'option de la fenètre toujours visible n'est pas activé
                              SetWindowPos_(WindowID(), #HWND_NOTOPMOST, 0, 0, 0, 0, #SWP_NOMOVE | #SWP_NOSIZE)
                              SetMenuItemState(#Popupmenu, #Visibilite, 0)
                              OptionAffichage$ = "No"
                              CreateFontPref(1)
                              
                         Else ; L'option est activé
                              SetWindowPos_(WindowID(), #HWND_TOPMOST, 0, 0, 0, 0, #SWP_NOMOVE | #SWP_NOSIZE)
                              SetMenuItemState(#Popupmenu, #Visibilite, 1)
                              OptionAffichage$ = "Yes"
                              CreateFontPref(1)
                              
                         EndIf
                         
                    Case #Quitter
                         EventID = #PB_EventCloseWindow
                         
               EndSelect
               
          Case #WM_RButtonDown
               ; On affiche le PopupMenu
               DisplayPopupMenu(#Popupmenu, WindowID())
               
     EndSelect
     
Until EventID = #PB_EventCloseWindow

SauverAvantSortir()

End
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

sympa :D

si tu veux un coup de main pour la recherche, j'ai déjà fais ce genre de code alors tu n'hésite pas.

moi je verrai bien un accrochage de la fenêtre sur les bord de l'écran et la possiblité d'ajouter une barre d'outils.
vraiment sympa et bien minimaliste, du tonnerre :wink:
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

À vrai dire je cherchais un petit programme pour prendre des notes lorsque je débogue un programme. Bloc Note est bien pour faire ce genre de chose, l'ennui c'est qu'il ne reste pas au dessus des autres programmes lorsque l'on clique à coté de sa fenètre.

Ceux qui l'on testé vous avez remarqué que la fenetre n'est pas collé complètement à droite. C'est pour ne pas cacher la barre de défilement vertical du programme qui se trouve en dessous. (La plupart du temps PB avec la fenètre maximisé)
moi je verrai bien un accrochage de la fenêtre sur les bord de l'écran et la possiblité d'ajouter une barre d'outils.
Je pourrais peut-être l'ajouter, si on m'explique comment faire pour qu'un programme s'accroche sur le bord de la fenètre. Pour la barre d'outil, pourquoi pas, je pourrais facilement ajouter un option entre avoir seulement le menu contextuel ou un menu et une barre d'outil. Pour la fonction de recherche et remplacement, j'ai presque terminé, il me reste à trouver et corriger les bogues s'il y en a.

Merci à toi Soldat.

A+
Guimauve
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Pour l'accrochage de la fenêtre sur les bords :

Code : Tout sélectionner

#SizeWindowX = 300
#SizeWindowY = 200

Procedure Open_Window()
  If OpenWindow(0, 0, 0, #SizeWindowX, #SizeWindowY, #PB_Window_ScreenCentered, "Fenêtre")
    If CreateGadgetList(WindowID())
      TextGadget(1 ,3, #SizeWindowY - 18, #SizeWindowX - 6, 15, "Alt + F4 pour quitter")
    EndIf
  EndIf
EndProcedure



Procedure Deplace()
  
  ; Dimension de la fenêtre avec prise en comptes des bords
  GetWindowRect_(WindowID(), @Taille_Fenetre.rect)
  Largeur_Fenetre = Taille_Fenetre\Right - Taille_Fenetre\Left
  Hauteur_Fenetre = Taille_Fenetre\Bottom - Taille_Fenetre\top
  Largeur_Bordure = (Largeur_Fenetre - WindowWidth()) / 2
  Hauteur_Titre = Hauteur_Fenetre - WindowHeight() - Largeur_Bordure
  
  ; Dimension de l'écran
  SystemParametersInfo_(#SPI_GETWORKAREA, 0, @Taille_Ecran.RECT, 0)
  Largeur_Ecran = Taille_Ecran\Right - Taille_Ecran\Left
  Hauteur_Ecran = Taille_Ecran\Bottom - Taille_Ecran\top
  
  ; Position de la fenêtre
  PosWinX = WindowX()
  PosWinY = WindowY()
  
  ; Ajustement sur les X
  If Abs(PosWinX) <= 12 ; Si fenêtre placé contre le bord droit de l'écran
    MoveWindow(0, PosWinY) ; On aligne sur le bord droit de l'écran
    PosWinX = WindowX() ; Nouvelle position de la fenêtre
  ElseIf Abs(PosWinX + Largeur_Fenetre - Largeur_Ecran) <= 12 ; Si fenêtre placé contre le bord gauche de l'écran
    MoveWindow(Largeur_Ecran - Largeur_Fenetre, PosWinY) ; On aligne sur le bord gauche de l'écran
    PosWinX = WindowX() ; Nouvelle position de la fenêtre
  EndIf
  
  ; Ajustement sur les Y
  If Abs(PosWinY) <= Hauteur_Titre / 2 ; Si fenêtre placé contre le haut de l'écran
    MoveWindow(PosWinX, 0) ; On aligne sur le haut de l'écran
  ElseIf Abs(PosWinY + Hauteur_Fenetre - Hauteur_Ecran) <= 12
    MoveWindow(PosWinX, Hauteur_Ecran - Hauteur_Fenetre)
  EndIf
  
EndProcedure




; Debut du programme

Open_Window()

Repeat
  
  Event = WaitWindowEvent()
  
  If Event = 161
    Deplace()
  EndIf
  
Until Event = #PB_EventCloseWindow

tu peux ajouter de nouvelle position dans les conditions, pour exemple pour pouvoir la barre de défilement
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

Merci pour l'exemple, je vais voir ce que je peux faire. :wink:

A+

Guimauve
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

une correction de mon exemple pour qu'il prenne en compte le fait que la barre des taches de windows soit en bas, en haut, à gauche ou a droite.

Code : Tout sélectionner

#SizeWindowX = 300
#SizeWindowY = 200

Procedure Open_Window()
  If OpenWindow(0, 0, 0, #SizeWindowX, #SizeWindowY, #PB_Window_ScreenCentered, "Fenêtre")
    If CreateGadgetList(WindowID())
      TextGadget(1 ,3, #SizeWindowY - 18, #SizeWindowX - 6, 15, "Alt + F4 pour quitter")
    EndIf
  EndIf
EndProcedure



Procedure Deplace()
  
  ; Dimension de la fenêtre avec prise en comptes des bords
  GetWindowRect_(WindowID(), @Taille_Fenetre.rect)
  Largeur_Fenetre = Taille_Fenetre\Right - Taille_Fenetre\Left
  Hauteur_Fenetre = Taille_Fenetre\Bottom - Taille_Fenetre\top
  
  ; Dimension de l'écran
  SystemParametersInfo_(#SPI_GETWORKAREA, 0, @Taille_Ecran.RECT, 0)
  
  ; Position de la fenêtre
  PosWinX = WindowX()
  PosWinY = WindowY()
  
  ; Ajustement sur les X
  If Abs(PosWinX - Taille_Ecran\Left) <= 12 ; Si fenêtre placé contre le bord droit de l'écran
    MoveWindow(Taille_Ecran\Left, PosWinY) ; On aligne sur le bord droit de l'écran
    PosWinX = WindowX() ; Nouvelle position de la fenêtre
  ElseIf Abs(PosWinX + Largeur_Fenetre - Taille_Ecran\Right) <= 12 ; Si fenêtre placé contre le bord gauche de l'écran
    MoveWindow(Taille_Ecran\Right - Largeur_Fenetre, PosWinY) ; On aligne sur le bord gauche de l'écran
    PosWinX = WindowX() ; Nouvelle position de la fenêtre
  EndIf
  
  ; Ajustement sur les Y
  If Abs(PosWinY - Taille_Ecran\top) <= 12 ; Si fenêtre placé contre le haut de l'écran
    MoveWindow(PosWinX, Taille_Ecran\top) ; On aligne sur le haut de l'écran
  ElseIf Abs(PosWinY + Hauteur_Fenetre - Taille_Ecran\Bottom) <= 12
    MoveWindow(PosWinX, Taille_Ecran\Bottom - Hauteur_Fenetre)
  EndIf
  
EndProcedure




; Debut du programme

Open_Window()

Repeat
  
  Event = WaitWindowEvent()
  
  If Event = 161
    Deplace()
  EndIf
  
Until Event = #PB_EventCloseWindow

Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

Nouveaux dévellopements

1. Pour la barre d'outil pas de problème ça marche nickel. Facile à ajouter, parcontre elle est toujours visible, on ne peut pas l'enlever et je pense que c'est mieux comme ça.
2. Pour l'accrochage sur le bord de l'écran, ça marche nickel. Parcontre, j'ai dû ajouter la mémorisation de la position(x,y) de la fenètre.
3. J'ai ajouté la mémorisation de la dimension de la fenètre. Comme ça l'utilisateur peut dimensionner la fenètre à la grandeur désirée.


Le dernier problème est la fonction Chercher/Remplacer. Pour le moment, ça marche nickel sauf que si on effectue 2 fois le même rechercher-remplacer ça détruit le texte.
si tu veux un coup de main pour la recherche, j'ai déjà fais ce genre de code alors tu n'hésite pas.
Pour la fonction de recherche et remplacement, j'ai presque terminé, il me reste à trouver et corriger les bogues s'il y en a.


Est-ce que j'ai le droit de changer d'idée ?

Voiçi mon code :

Code : Tout sélectionner

Select EventGadgetID() ; La gestion des évenements
          
     Case #Bouton_remplacer
          
          If GetGadgetState(#Remplacer_txt) = 1
               
               ; On vérifie si la ligne de l'éditeur contient du texte, si oui remplacer le texte
               If GetGadgetItemText(#Editeur, ligne, 0) <> ""
                    
                    SetGadgetItemText(#Editeur, ligne, (Remplace(GetGadgetItemText(#Editeur, ligne, 0), GetGadgetText(#Mots_a_chercher), GetGadgetText(#Mots_a_remplacer))), 0)
                    SetEditorUserPref()
                    
               EndIf
               
               ligne = ligne + 1
               
          EndIf
          EventID = #PB_EventCloseWindow
          
     Case #Bouton_remplacer_tout
          
          If GetGadgetState(#Remplacer_txt) = 1
               
               For ligne = 0 To CountGadgetItems(#Editeur) - 1
                    
                    ; On vérifie si la ligne de l'éditeur contient du texte, si oui remplacer le texte
                    If GetGadgetItemText(#Editeur, ligne, 0) <> ""
                         
                         Mots_a_chercher$ = GetGadgetText(#Mots_a_chercher)
                         Mots_a_remplacer$ = GetGadgetText(#Mots_a_remplacer)
                         
                         If Mots_a_chercher$ <> ""
                              SetGadgetItemText(#Editeur, ligne, (Remplace(GetGadgetItemText(#Editeur, ligne, 0), Mots_a_chercher$, Mots_a_remplacer$ )), 0)
                              SetEditorUserPref()
                         EndIf
                    EndIf
                    
               Next ligne
               
          EndIf
          EventID = #PB_EventCloseWindow
          
     Case #Bouton_annuler
          EventID = #PB_EventCloseWindow
          
          
EndSelect


Procedure.s Remplace(Chaine$, AncienneChaine$, NouvelleChaine$)
     
     Debut_de_la_chaine$ = Left(Chaine$, FindString(Chaine$, AncienneChaine$, 1) - 1)
     Fin_de_la_chaine$ = Right(Chaine$, Len(Chaine$) - (FindString(Chaine$, AncienneChaine$, 1) + Len(AncienneChaine$) - 1))
     
     ProcedureReturn Debut_de_la_chaine$ + NouvelleChaine$ + Fin_de_la_chaine$
EndProcedure
Je ne vois pas pourquoi ça peut effectuer un remplacement 2 fois de suite.
Logiquement le remplacement ne se fait pas si l'ancienne chaine n'est pas trouver. #hein

À l'aide...

A+
Guimauve
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

bon, 1ère remarque :
si tu as plusieurs mot à remplacer dans la même ligne, ça fait comment ?

visiblement, tu ne remplace que le premier.

sinon, je voit pas de problème
il me faurdait le code complet. envoie par mail si c'est trop gros.
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

visiblement, tu ne remplace que le premier.
J'avais pas remarquer ce bogue. Je vais monter une version simplifiée pour tester le problème.

A+
Guimauve
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

Voici le code source pour faire des test :

Code : Tout sélectionner

Enumeration
     #fenetre_principale
     #Fenetre_recherche
     #Editeur
     #Bouton_lancer_recherche
     #Chercher_txt
     #Mots_a_chercher
     #Remplacer_txt
     #Mots_a_remplacer
     #Bouton_suivant
     #Bouton_remplacer
     #Bouton_remplacer_tout
     #Bouton_annuler
EndEnumeration

Declare.s Remplace(Chaine$, AncienneChaine$, NouvelleChaine$)
Declare Recherche()

If OpenWindow(#fenetre_principale, 100, 200, 300, 250, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget, "Tester Chercher/remplacer")
     If CreateGadgetList(WindowID(#fenetre_principale))  
          EditorGadget(#Editeur, 2, 2, WindowWidth() - 4, WindowHeight() - 40)
          ButtonGadget(#Bouton_lancer_recherche, 10, WindowHeight() - 30, 75, 20, "Recherche")
     EndIf
EndIf

Repeat
     EventID = WaitWindowEvent()
     
     If EventID = #PB_EventGadget
          
          Select EventGadgetID() ; La gestion des évenements
                    
               Case #Bouton_lancer_recherche
                    Recherche()
                    
          EndSelect
     EndIf
     
Until EventID = #PB_EventCloseWindow
End


Procedure Recherche()
   
     ; Création de la fenêtre Recherche et remplace
     If OpenWindow(#Fenetre_recherche, 0, 0, 460, 160, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "Chercher/remplacer")
          
          If CreateGadgetList(WindowID(#Fenetre_recherche))
               
               TextGadget(#Chercher_txt, 10, 30, 120, 20, "Chercher", #PB_Text_Center)
               StringGadget(#Mots_a_chercher, 120, 30, 120, 20, "")
               CheckBoxGadget(#Remplacer_txt, 10, 60, 100, 20, "Remplacer", #PB_CheckBox_Center)
               StringGadget(#Mots_a_remplacer, 120, 60, 120, 20, "")
               
               ButtonGadget(#Bouton_suivant, 10, 100, 100, 24, "Suivant")
               ButtonGadget(#Bouton_remplacer, 120, 100, 100, 24, "Remplacer")
               ButtonGadget(#Bouton_remplacer_tout, 230, 100, 100, 24, "Remplacer tout")
               ButtonGadget(#Bouton_annuler, 340, 100, 100, 24, "Annuler")
               
          EndIf
          
     EndIf
     
     DisableGadget(#Mots_a_remplacer, 1)
     
     Repeat
          
          If GetGadgetState(#Remplacer_txt) = 0
               DisableGadget(#Mots_a_remplacer, 1)
               DisableGadget(#Bouton_remplacer, 1)
               DisableGadget(#Bouton_remplacer_tout, 1)
          Else
               DisableGadget(#Mots_a_remplacer, 0)
               DisableGadget(#Bouton_remplacer, 0)
               DisableGadget(#Bouton_remplacer_tout, 0)
          EndIf
          
          EventID = WaitWindowEvent()
          
          If EventID = #PB_EventGadget
               
               Select EventGadgetID() ; La gestion des évenements
                         
                    Case #Bouton_remplacer
                         
                         If GetGadgetState(#Remplacer_txt) = 1
                              
                              ; On vérifie si la ligne de l'éditeur contient du texte, si oui remplacer le texte
                              If GetGadgetItemText(#Editeur, ligne, 0) <> ""
                                   
                                   SetGadgetItemText(#Editeur, ligne, (Remplace(GetGadgetItemText(#Editeur, ligne, 0), GetGadgetText(#Mots_a_chercher), GetGadgetText(#Mots_a_remplacer))), 0)
                                   
                                   
                              EndIf
                              
                              ligne = ligne + 1
                              
                         EndIf
                         EventID = #PB_EventCloseWindow
                         
                    Case #Bouton_remplacer_tout
                         
                         If GetGadgetState(#Remplacer_txt) = 1
                              
                              For ligne = 0 To CountGadgetItems(#Editeur) - 1
                                   
                                   ; On vérifie si la ligne de l'éditeur contient du texte, si oui remplacer le texte
                                   If GetGadgetItemText(#Editeur, ligne, 0) <> ""
                                        
                                        Mots_a_chercher$ = GetGadgetText(#Mots_a_chercher)
                                        Mots_a_remplacer$ = GetGadgetText(#Mots_a_remplacer)
                                        
                                        If Mots_a_chercher$ <> ""
                                             SetGadgetItemText(#Editeur, ligne, (Remplace(GetGadgetItemText(#Editeur, ligne, 0), Mots_a_chercher$, Mots_a_remplacer$ )), 0)
                                        EndIf
                                   EndIf
                                   
                              Next ligne
                              
                         EndIf
                         EventID = #PB_EventCloseWindow
                         
                    Case #Bouton_annuler
                         EventID = #PB_EventCloseWindow
                         
                         
               EndSelect
          EndIf
     Until EventID = #PB_EventCloseWindow
     
     ; On ferme la Fenètre Cherche/Remplacer
     CloseWindow(#Fenetre_recherche)
     
EndProcedure


Procedure.s Remplace(Chaine$, AncienneChaine$, NouvelleChaine$)
     
     Debut_de_la_chaine$ = Left(Chaine$, FindString(Chaine$, AncienneChaine$, 1) - 1)
     Fin_de_la_chaine$ = Right(Chaine$, Len(Chaine$) - (FindString(Chaine$, AncienneChaine$, 1) + Len(AncienneChaine$) - 1))
     
     ProcedureReturn Debut_de_la_chaine$ + NouvelleChaine$ + Fin_de_la_chaine$
EndProcedure
Il y a un autre problème, j'aimerais bien pourvoir initialiser la variable ligne à la ligne courante dans l'éditeur. Tout les trucs que j'ai testé jusqu'à maintenant non pas marché.

A+
Guimauve
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Code : Tout sélectionner

Enumeration
  #fenetre_principale
  #Fenetre_recherche
  #Editeur
  #Bouton_lancer_recherche
  #Chercher_txt
  #Mots_a_chercher
  #Remplacer_txt
  #Mots_a_remplacer
  #Bouton_suivant
  #Bouton_remplacer
  #Bouton_remplacer_tout
  #Bouton_annuler
EndEnumeration

; Régis : Ajout de 2 variables globales
Global Ligne.l, Index.l
; Ligne = numéro de la ligne
; Index = position sur la ligne

Declare.s Remplace(Chaine$, AncienneChaine$, NouvelleChaine$)
Declare Recherche()

If OpenWindow(#fenetre_principale, 100, 200, 300, 250, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget, "Tester Chercher/remplacer")
  If CreateGadgetList(WindowID(#fenetre_principale))
    EditorGadget(#Editeur, 2, 2, WindowWidth() - 4, WindowHeight() - 40)
    ButtonGadget(#Bouton_lancer_recherche, 10, WindowHeight() - 30, 75, 20, "Recherche")
  EndIf
EndIf

Repeat
  EventID = WaitWindowEvent()
  
  If EventID = #PB_EventGadget
    
    Select EventGadgetID() ; La gestion des évenements
        
      Case #Bouton_lancer_recherche
        Recherche()
        
    EndSelect
  EndIf
  
Until EventID = #PB_EventCloseWindow
End


Procedure Recherche()
  
  ; Création de la fenêtre Recherche et remplace
  If OpenWindow(#Fenetre_recherche, 0, 0, 460, 160, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "Chercher/remplacer")
    
    If CreateGadgetList(WindowID(#Fenetre_recherche))
      
      TextGadget(#Chercher_txt, 10, 30, 120, 20, "Chercher", #PB_Text_Center)
      StringGadget(#Mots_a_chercher, 120, 30, 120, 20, "")
      CheckBoxGadget(#Remplacer_txt, 10, 60, 100, 20, "Remplacer", #PB_CheckBox_Center)
      StringGadget(#Mots_a_remplacer, 120, 60, 120, 20, "")
      
      ButtonGadget(#Bouton_suivant, 10, 100, 100, 24, "Suivant")
      ButtonGadget(#Bouton_remplacer, 120, 100, 100, 24, "Remplacer")
      ButtonGadget(#Bouton_remplacer_tout, 230, 100, 100, 24, "Remplacer tout")
      ButtonGadget(#Bouton_annuler, 340, 100, 100, 24, "Annuler")
      
    EndIf
    
  EndIf
  
  DisableGadget(#Mots_a_remplacer, 1)
  
  Repeat
    
    If GetGadgetState(#Remplacer_txt) = 0
      DisableGadget(#Mots_a_remplacer, 1)
      DisableGadget(#Bouton_remplacer, 1)
      DisableGadget(#Bouton_remplacer_tout, 1)
    Else
      DisableGadget(#Mots_a_remplacer, 0)
      DisableGadget(#Bouton_remplacer, 0)
      DisableGadget(#Bouton_remplacer_tout, 0)
    EndIf
    
    EventID = WaitWindowEvent()
    
    If EventID = #PB_EventGadget
      
      Select EventGadgetID() ; La gestion des évenements
          
        Case #Bouton_remplacer
          
          If GetGadgetState(#Remplacer_txt) = 1
            
            ; On vérifie si la ligne de l'éditeur contient du texte, si oui remplacer le texte
            
            Nouveau_Text.s = Remplace(GetGadgetItemText(#Editeur, ligne, 0), GetGadgetText(#Mots_a_chercher), GetGadgetText(#Mots_a_remplacer))
            If Nouveau_Text
              SetGadgetItemText(#Editeur, ligne, Nouveau_Text, 0)
            Else
              ligne = ligne + 1
            EndIf
            
          EndIf
          EventID = #PB_EventCloseWindow
          
        Case #Bouton_remplacer_tout
          
          If GetGadgetState(#Remplacer_txt) = 1
            
            For ligne = 0 To CountGadgetItems(#Editeur) - 1
              
              ; On vérifie si la ligne de l'éditeur contient du texte, si oui remplacer le texte
              Repeat
                Nouveau_Text.s = Remplace(GetGadgetItemText(#Editeur, ligne, 0), GetGadgetText(#Mots_a_chercher), GetGadgetText(#Mots_a_remplacer))
                If Nouveau_Text ; si on peut remplacer un texte
                  SetGadgetItemText(#Editeur, ligne, Nouveau_Text, 0)
                EndIf
              Until Nouveau_Text = "" ; jusqu'à ce qu'on est remplacé tous les mots recherché de la ligne
              
            Next ligne
            
          EndIf
          EventID = #PB_EventCloseWindow
          
        Case #Bouton_annuler
          EventID = #PB_EventCloseWindow
          
          
      EndSelect
    EndIf
  Until EventID = #PB_EventCloseWindow
  
  ; On ferme la Fenètre Cherche/Remplacer
  CloseWindow(#Fenetre_recherche)
  
EndProcedure


Procedure.s Remplace(Chaine$, AncienneChaine$, NouvelleChaine$)
  
  Index = FindString(Chaine$, AncienneChaine$, Index) ; On part de l'index (position sur la ligne) pour continuer à cherhcer
  If Index <> 0 ; si un texte recherché est trouvé
    Debut_de_la_chaine$ = Left(Chaine$, Index - 1)
    Fin_de_la_chaine$ = Right(Chaine$, Len(Chaine$) - Index + Len(AncienneChaine$) - 1)
    ProcedureReturn Debut_de_la_chaine$ + NouvelleChaine$ + Fin_de_la_chaine$
  Else ; sinon, on ne remplace pas
    ProcedureReturn ""
  EndIf
  
EndProcedure
j'ai corrigé le problème du remplacement qui ne marchait pas car tu ne testait pas si le texte cherché était trouvé ou pas, du coup, tu remplacais du texte sur chaque ligne même si on ne trouvait rien à remplacer.

sinon, j'ai ajouté la recherche dans le cas ou plusieur mot recherché sont présent sur une ligne.

donc changement dans la procedure "remplace()", j'ai ajouté 2 global au début et changement dans la gestion des évènement de la fenêtre recherché.

et pour la position du curseur, aucune idée mais il me semble en avoir entendu parler sur le forum fr, fait une recherche ici ou sur le musée.
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

Je pense qu'a minuit hier soir j'étais trop fatigué pour voir l'utilité de faire quelque test sur les chaînes comme dans la solution que tu me propose.

Merci à toi pour la solution.

Et pendant que tu t'es amuser à corriger mon problème, j'ai ajouter l'option de retour à la ligne automatique. Et ça marche nickel. Merci à celui qui l'a coder.

Code : Tout sélectionner

If OpenWindow(0, 0, 0, 300, 260, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget |#PB_Window_ScreenCentered, "PureBasic Window")
     If CreateGadgetList(WindowID(0))
          EditorGadget(1, 2, 2, 296, 240)
          SendMessage_(GadgetID(1), #EM_SETTARGETDEVICE, #NULL, 0)
          ; SendMessage_(GadgetID(0), #EM_SETTARGETDEVICE, #NULL, $FFFFFF) ; to turn word-wrap off again (use just a huge value, stands for line width)
          SetGadgetText(1, "This text gets wrapped, but I think line numbers won't be properly handled now, so be careful.")
     EndIf
EndIf
Repeat
     
Until WaitWindowEvent() = #PB_Event_CloseWindow
End
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

ça m'intéresse, je prend :wink:
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

J'ai de mauvaise nouvelle, ça marche pas. :cry: :(

J'ai regardé comment Fred à fait dans l'éditeur de PB. Il semble que les fonctions de recherche/remplacer/remplacer tout sont toutes codé dans la DLL RICHEDIT.

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

Message par Chris »

Ben moi, j'ai fait comme ça, et ca va bien :lol:

Code : Tout sélectionner

;- Retraits : pour dégager la barre de tâches, ou les scrollbars, par exemple
RetraitH = 32 ; Retrait Horizontal
RetraitV = 32 ; Retrait Vertical

;- Largeurs et Hauteurs du Bloc-Notes
Largeur = 300 ; Largeur du Bloc-Notes
Hauteur = 200 ; Hauteur du Bloc-Notes

;- Dimensions de l'écran
Window_Width = GetSystemMetrics_(#SM_CXSCREEN)
Window_Height = GetSystemMetrics_(#SM_CYSCREEN)

If FindWindow_("Notepad",#NULL) = 0
  RunProgram("Notepad") : Delay(100)
  hNotepad = FindWindow_("Notepad",#NULL)
  SetWindowPos_(hNotepad,#HWND_TOPMOST,Window_Width - (Largeur+RetraitH),RetraitV,Largeur,Hauteur,#SWP_SHOWWINDOW)
EndIf

Repeat
  If FindWindow_("Notepad",#NULL) = 0
    End
  EndIf
Until hNotepad = 0
Pourquoi se casser la tête quand on peut faire autrement... Hein!!!

Chris :)
Répondre