[R] Bloquer la modification de ligne dans zone d'édition

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Amesamana
Niveau 5
Niveau 5
Messages : 108
Enregistré le : dim. 09 sept. 2012 16:37
Status : Hors ligne

[R] Bloquer la modification de ligne dans zone d'édition

#1

Message par Amesamana »

Bonjour,

je vous sollicite à nouveau suite à ce sujet
Dans mon projet de programme plusieurs utilisateurs sont amenés à ajouter des modifications.
Si un de ces utilisateurs supprime par exemple les *********** le tri ne fonctionne plus et j'ai derrière des pertes de données !?

Je recherche donc à empêcher la modification de cette ligne *********** qui se répéte toutes les 4 lignes.

Si vous avez une piste :)

merci
#include <Crypt.au3>
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
#include <File.au3>
;~ #include <CLassFichc.au3>
Global Const $FIHCHIER = @HomeDrive & "\test.txt"
Global Const $stabFic = @TempDir & "\test1.txt"
Global Const $stabFic2 = @TempDir & "\test2.txt"
;~ Global $hFileOpen = ""
Global $Val1 = 'Pour test'
Global $FIHC, $Tab, $Ed_DONNEE, $hfile
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 615, 396, 192, 124)
$Input1 = GUICtrlCreateInput("", 16, 24, 153, 21)
$Input2 = GUICtrlCreateInput("", 16, 56, 153, 21)
$Input3 = GUICtrlCreateInput("", 16, 88, 153, 21)
$bt_crypter = GUICtrlCreateButton("Crypter", 16, 136, 153, 25)
$bt_decrypt = GUICtrlCreateButton("Afficher", 16, 184, 153, 25)
$bt_trier = GUICtrlCreateButton("Trier", 16, 236, 153, 25)
$bt_Save = GUICtrlCreateButton("Enregistrer", 16, 282, 153, 25)
$Edit1 = GUICtrlCreateEdit("", 192, 8, 401, 369)


GUICtrlSetData(-1, "")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###


While 1
   $nMsg = GUIGetMsg()
   Switch $nMsg
      Case $GUI_EVENT_CLOSE
         Exit
         FileDelete($stabFic) ; on supprime
;~          FileDelete($stabFic2) ; on supprime
      Case $bt_crypter
         Local $readD1 = GUICtrlRead($Input1)
         Local $readD2 = GUICtrlRead($Input2)
         Local $readD3 = GUICtrlRead($Input3)

         ; on lit et déchiffre le contenu du fichier
         $hfile = FileOpen($FIHCHIER, $FO_BINARY)
         $FIHC = StringEncrypt(False, FileRead($hfile), $Val1)
         FileClose($hfile)

         $FIHC &= "************" & @CRLF
         $FIHC &= "Prénom : "
         $FIHC &= $readD1 & @CRLF
         $FIHC &= "Age : "
         $FIHC &= $readD2 & @CRLF
         $FIHC &= "Ville : "
         $FIHC &= $readD3 & @CRLF

         ; on rechiffre TOUT le contenu (pas seulement ce qui a été ajouté)
         Local $sEncrypted = StringEncrypt(True, $FIHC, $Val1)
         $hfile = FileOpen($FIHCHIER, $FO_OVERWRITE + $FO_BINARY)
         FileWrite($hfile, $sEncrypted)
         FileClose($hfile)

      Case $bt_decrypt
         GUICtrlSetData($Edit1, "")
         Sleep(200)
         $hfile = FileOpen($FIHCHIER, $FO_BINARY)
         Local $rREADF = FileRead($hfile)
         FileClose($hfile)
         Local $sDecrypted = StringEncrypt(False, $rREADF, $Val1)
         GUICtrlSetData($Edit1, $sDecrypted)

      Case $bt_trier
         GUICtrlSetData($Edit1, "") ; On vide GUICtrlCreateEdit
         Sleep(100) ; juste pour s'assurer visuellement de l'action
         Local $hFileOpen = FileOpen($stabFic, 2)
         If $hFileOpen = -1 Then
            MsgBox($MB_SYSTEMMODAL, "", "Une erreur est survenue pendant la lecture du fichier.")
         EndIf
         FileWrite($hFileOpen, $sDecrypted) ; Ecrit dans le fichier le décryptage
         _FileReadToArray($stabFic, $Tab) ; Mise en tableau des données du fichier tab.txt
         _ArrayDisplay($Tab, "") ; Affiche le tableau
         Global $Tab2D[UBound($Tab) / 4][4] ; déclare le tableau 4 colonnes 4 lignes
         $Tab2DLine = 0 ; Initialisation de la valeur de la première ligne du tableau à peupler

         For $i = 1 To UBound($Tab) - 1 Step 4 ; Lecture du tableau $Tab par pas de 4
            ; On commence par vérifier que la première ligne soit celle avec les étoiles.
            If $Tab[$i] = "************" Then
               ; Ensuite on récupère la ligne Prénom, puis Age et enfin la Ville
               $Tab2D[$Tab2DLine][0] = "************" ; on réinscrit
               $Tab2D[$Tab2DLine][1] = $Tab[$i + 1] ; Prénom
               $Tab2D[$Tab2DLine][2] = $Tab[$i + 2] ; Age
               $Tab2D[$Tab2DLine][3] = $Tab[$i + 3] ; Ville
               $Tab2DLine += 1 ; On rajoute 1 pour passer à la ligne suivant
            EndIf
         Next
         _ArraySort($Tab2D, 0, 0, 0, 1) ; tri le prénom
         _FileWriteFromArray($stabFic, $Tab2D)
         _ArrayDisplay($Tab2D, "")
         $rtxt = FileRead($stabFic)
         $txt2 = StringReplace($rtxt, '|', @CRLF) ; on remplace le pipe par un chariot
         FileWrite($stabFic2, $txt2) ; on écrit le résultat dans le fichier
         $rresult = FileRead($stabFic2) ; on lit le fichier
         GUICtrlSetData($Edit1, "") ; On vide GUICtrlCreateEdit
         GUICtrlSetData($Edit1, $rresult) ; on inscrit dans GUICtrlCreateEdit
         FileClose($stabFic2) ; on ferme
         FileDelete($stabFic2) ; on supprime
         FileClose($stabFic) ; on ferme
         save() ; on enregistre

      Case $bt_Save
         save()

   EndSwitch
WEnd

Func StringEncrypt($bEncrypt, $sData, $sPassword)
   _Crypt_Startup() ; Exécute la bibliothèque Crypt.
   Local $sReturn = ''
   If $bEncrypt Then ; Si l'indicateur est défini à True alors chiffrer, sinon déchiffrer.
      $sReturn = _Crypt_EncryptData($sData, $sPassword, $CALG_RC4)
   Else
      $sReturn = BinaryToString(_Crypt_DecryptData($sData, $sPassword, $CALG_RC4))
   EndIf
   _Crypt_Shutdown() ; Arrête la bibliothèque Crypt.
   Return $sReturn
EndFunc   ;==>StringEncrypt

Func save()
   $var = GUICtrlRead($Edit1, 1)
   Local $sEncrypted = StringEncrypt(True, $var, $Val1)
   $hfile = FileOpen($FIHCHIER, 2)
   FileWrite($hfile, $sEncrypted)
   FileClose($hfile)
EndFunc   ;==>save
Modifié en dernier par Amesamana le sam. 14 janv. 2017 19:45, modifié 1 fois.
Avatar du membre
parazitenew
Niveau 7
Niveau 7
Messages : 310
Enregistré le : sam. 10 déc. 2011 15:08
Localisation : Algerie
Status : Hors ligne

Re: [..] Bloquer la modification de ligne dans zone d'édition

#2

Message par parazitenew »

Bonsoir,

Il existe le style "$ES_READONLY" pour les Editbox. Le souci c'est qu'aucune information ne peut être modifiée. Personnellement je te conseillerai d'utiliser une ListView, tu pourras afficher tes infos depuis tes array dessus, tu n'auras plus besoin des *********** et l'utilisateur pourra modifier les infos directement depuis la ListView.
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1037
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: [..] Bloquer la modification de ligne dans zone d'édition

#3

Message par walkson »

Et il y a une erreur
Case $GUI_EVENT_CLOSE
            Exit
            FileDelete($stabFic) ; on supprime
Il faut inverser Exit et FileDelete() :mrgreen:
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Amesamana
Niveau 5
Niveau 5
Messages : 108
Enregistré le : dim. 09 sept. 2012 16:37
Status : Hors ligne

Re: [..] Bloquer la modification de ligne dans zone d'édition

#4

Message par Amesamana »

Bonsoir :)

parazitenew

Je vais essayer avec GUICtrlCreateListView, merci j'avais en effet testé $ES_READONLY et en effet pas de modification possible.
J'ai également cherché à faire le tri si un utilisateur créer des lignes vides, pour ça, ça fonctionne avec StringRegExpReplace($readvar, "(?m)(^\R)", "").
Également cherché à compter avec _FileCountLines pour éviter les erreurs (multiple de 4), et bien d'autres choses pour éviter ce plantage.
Je pense que je vais prendre cette direction :)

walkson

En effet ! Ce code est une base de test, je ne joue pas avec le programme :mrgreen:
Mais tu as raison de relever l'erreur, car je peut la reproduire. :evil:
Merci.
Dois-je modifier mon post ?

Merci pour vos réponses.
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1037
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: [..] Bloquer la modification de ligne dans zone d'édition

#5

Message par walkson »

Une proposition de code: Sachant que text1.txt se présente ainsi

Code : Tout sélectionner

************|Prénom : louis|Age : 30|Ville : paris
************|Prénom : monique|Age : 12|Ville : paris
************|Prénom : paul|Age : 22|Ville : lyon
************|Prénom : pierre|Age : 42|Ville : lyon
************|Prénom : pierre|Age : 42|Ville : lyon
Le réduire a ceci

Code : Tout sélectionner

Prénom : louis|Age : 30|Ville : paris
Prénom : monique|Age : 12|Ville : paris
Prénom : paul|Age : 22|Ville : lyon
Prénom : pierre|Age : 42|Ville : lyon
Prénom : pierre|Age : 42|Ville : lyon
Afin d'afficher le texte dans un array par ligne-colonne comme ceci
#include <File.au3>
#include <Array.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
Local $array
$openfile = FileOpen(@ScriptDir & "\test1.txt",0 )
 _FileReadToArray($openfile,$array,0,"|")
 FileClose($openfile)
 _ArrayDisplay($array)




Global $Form1 = GUICreate("Form1", 263, 438, 192, 124)
Global $ListView1 = GUICtrlCreateListView("", 8, 152, 241, 249)
Global $Input1 = GUICtrlCreateInput("", 16, 8, 225, 21)
Global $Input2 = GUICtrlCreateInput("", 16, 40, 225, 21)
Global $Input3 = GUICtrlCreateInput("", 16, 72, 225, 21)
Global $Button1 = GUICtrlCreateButton("suivant", 64, 104, 113, 33)
GUISetState(@SW_SHOW)
$nbCol = UBound($array,2)
$nbline = UBound($array,1)
For $i = 1 To $nbCol
   _GUICtrlListView_AddColumn($ListView1, "", 80)
Next


_GUICtrlListView_AddArray($ListView1, $array)

Local $a = 0
While 1
 $nMsg = GUIGetMsg()
 Switch $nMsg
  Case $GUI_EVENT_CLOSE
   Exit

    Case $Button1
       GUICtrlSetData($Button1,"Suivant" & $a)
       GUICtrlSetData($Input1,$array[$a][0])
       GUICtrlSetData($Input2,$array[$a][1])
       GUICtrlSetData($Input3,$array[$a][2])
       $a += 1
       If $a > $nbline - 1 Then $a = 0
 EndSwitch
WEnd
On a la solution de parazitenew ou la solution d'utiliser des inputs. A voir...
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Amesamana
Niveau 5
Niveau 5
Messages : 108
Enregistré le : dim. 09 sept. 2012 16:37
Status : Hors ligne

Re: [R] Bloquer la modification de ligne dans zone d'édition

#6

Message par Amesamana »

Bonjour,

Merci pour cette piste :)

En gardant le même fichier soit test1.txt

je fais ceci
Source
#include <Array.au3>
#include <File.au3>
#include <GuiConstants.au3>
#include <GuiEdit.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <WinAPI.au3>

Opt("GuiCloseOnESC", 0)

Global $hEdit, $hDC, $hBrush, $Item = -1, $SubItem = 0

Global $Style = BitOR($WS_CHILD, $WS_VISIBLE, $ES_AUTOHSCROLL, $ES_LEFT)

$hGUI = GUICreate("Test", 400, 400)

Local $array
$openfile = FileOpen(@ScriptDir & "\test1.txt", 0)

_FileReadToArray($openfile, $array, 0, "|")
FileClose($openfile)
_ArrayDisplay($array)

$hListView = _GUICtrlListView_Create($hGUI, "Prénom|Age|Ville", 2, 2, 396, 396, BitOR($LVS_EDITLABELS, $LVS_REPORT))
_GUICtrlListView_AddArray($hListView, $array)

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

GUISetState()

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
   Local $tNMHDR, $hWndFrom, $iCode

   $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
   $hWndFrom = DllStructGetData($tNMHDR, "hWndFrom")
   $iCode = DllStructGetData($tNMHDR, "Code")

   Switch $hWndFrom
      Case $hListView
         Switch $iCode
            Case $NM_DBLCLK
               Local $aHit = _GUICtrlListView_SubItemHitTest($hListView)

               If ($aHit[0] <> -1) And ($aHit[1] = 0) Then
                  $Item = $aHit[0]
                  $SubItem = 0
                  Local $aRect = _GUICtrlListView_GetItemRect($hListView, $Item)
               ElseIf ($aHit[0] <> -1) And ($aHit[1] > 0) Then
                  $Item = $aHit[0]
                  $SubItem = $aHit[1]
                  Local $aRect = _GUICtrlListView_GetSubItemRect($hListView, $Item, $SubItem)
               Else
                  Return $GUI_RUNDEFMSG
               EndIf

               Local $iItemText = _GUICtrlListView_GetItemText($hListView, $Item, $SubItem)
               Local $iLen = _GUICtrlListView_GetStringWidth($hListView, $iItemText)
               $hEdit = _GUICtrlEdit_Create($hGUI, $iItemText, $aRect[0] + 3, $aRect[1], $iLen + 10, 17, $Style)

               _GUICtrlEdit_SetSel($hEdit, 0, -1)
               _WinAPI_SetFocus($hEdit)
               $hDC = _WinAPI_GetWindowDC($hEdit)
               $hBrush = _WinAPI_CreateSolidBrush(0x0000FF)
               FrameRect($hDC, 0, 0, $iLen + 10, 17, $hBrush)
         EndSwitch
   EndSwitch
   Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Func FrameRect($hDC, $nLeft, $nTop, $nRight, $nBottom, $hBrush)
   Local $stRect = DllStructCreate("int;int;int;int")

   DllStructSetData($stRect, 1, $nLeft)
   DllStructSetData($stRect, 2, $nTop)
   DllStructSetData($stRect, 3, $nRight)
   DllStructSetData($stRect, 4, $nBottom)

   DllCall("user32.dll", "int", "FrameRect", "hwnd", $hDC, "ptr", DllStructGetPtr($stRect), "hwnd", $hBrush)
EndFunc   ;==>FrameRect

Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
   Local $iCode = BitShift($wParam, 16)

   Switch $lParam
      Case $hEdit
         Switch $iCode
            Case $EN_KILLFOCUS
               Local $iText = _GUICtrlEdit_GetText($hEdit)
               _GUICtrlListView_SetItemText($hListView, $Item, $iText, $SubItem)
               _WinAPI_DeleteObject($hBrush)
               _WinAPI_ReleaseDC($hEdit, $hDC)
               _WinAPI_DestroyWindow($hEdit)

               $Item = -1
               $SubItem = 0
         EndSwitch
   EndSwitch

   Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND
Il faut que je travaille maintenant pour afficher le fichier sans Prénom, Age, Ville afin d'éviter des soucis.
et de reconstruire le tout pour garder mon affichage de base du programme.
Cela se fera donc via une nouvelle fenêtre.

Merci .
Répondre