Page 1 sur 2

[R] Ajuster GUICtrlCreateEdit avec la fonction _FileCountLines

Posté : dim. 06 sept. 2020 15:51
par Boulanza
Bonjour,
Sur la fenêtre de la Gui du code ci-dessous, je ne peux lire que la première page soit: 40 lignes max. Cette restriction est dû à la présence de la fonction "GUICtrlSetState($_FrhEdit,$GUI_DISABLE)" qui me permet d’interdire copier-coller. Or, mon ficher texte contient plus de 122 lignes/3pages.
Je vous prie de m'aider à rendre le script capable de lire les deux pages restantes en cliquant sur le bouton "Page suivante", soit donc:
- de 1 à la 40 lignes
- de 41 à la 81 lignes
- de 82 à 122 lignes
Vos suggestions svp. Merci
Cordialement.

Code : Tout sélectionner

#include <GuiEdit.au3>
#include <EditConstants.au3>
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#Include <Array.au3>
#Include <File.au3>

Opt('MustDeclareVars', 1)
_Main1()
Func _Main1()
	Global $_FrhEdit, $FrOrigine001, $FrButton1, $FrOrigine002, $FrButton2,$text, $text2

Local $fichier, $nbr_lignes, $fp, $contenu, $lignes
;==========================================
$fichier = "est.txt" ; 200 lignes
$nbr_lignes = _FileCountLines($fichier)
; On lit les premières 40 lignes
$fp = FileOpen($fichier, 0) $nbr_lignes = 40 ; C'est le maximum lisible
Local[/br]
$contenu = ""
For $i = 1 To $nbr_lignes
    $lignes = FileReadLine($fp, $i)
    $contenu = $contenu & $lignes & @CRLF
Next
;~ FileClose($fp)
; MsgBox(16384, "", $contenu)
;===============================================
	Local $Wow64 = ""
	If @AutoItX64 Then $Wow64 = "\Wow6432Node"
	Local $sFile = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE" & $Wow64 & "\AutoIt v3\AutoIt", "InstallDir") & "\include\changelog.txt"
	Local $msg, $Label2, $ButValid1, $ButValid2

	$FrOrigine001 = GUICreate("Nos Conditions :", 1220, 900, -1, -1)

	$_FrhEdit = GUICtrlCreateEdit($contenu, 2, 2, 1215, 800, BitOR($ES_WANTRETURN, $WS_VSCROLL))
 	GUICtrlSetState($_FrhEdit,$GUI_DISABLE)

	GUICtrlSetBkColor(-1, 0xFFFFFF)
     GUICtrlSetFont($_FrhEdit, 12, 900, 0, "Ariel")
	GUISetState()

	$FrButton1 = GUICtrlCreateButton("Oui j'accepte", 420, 860, 121, 25, 0)
	$FrButton2 = GUICtrlCreateButton("Page suivante", 580, 860, 121, 25, 0)
	GUISetBkColor(0x00066CC)

	$FrOrigine002 = GUICtrlCreateLabel("Acceptez-vous les termes de ce contrat ?", 400, 820, 437, 20)
		GUICtrlSetColor(-1, 0xFCF8F8)
	GUICtrlSetFont($FrOrigine002, 12, 900, 0, "Ariel")
GUISetState()
GUISetState (@SW_SHOW)

	While 1
	$msg = GUIGetMsg()
	Select
	Case $msg = $GUI_EVENT_CLOSE
	ExitLoop
	Case $msg = $FrButton1
Exit
	Case $msg = $FrButton2
;GUICtrlSetState($_FrhEdit,$GUI_ENABLE)
	EndSelect
	WEnd
EndFunc   ;==>_Main

Re: [..] Ajuster GUICtrlCreateEdit avec la fonction _FileCountLines

Posté : dim. 06 sept. 2020 18:01
par walkson
Bonjour,
Et pourquoi ne pas tout mettre sur un édit ?

Code : Tout sélectionner

#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

	$text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus." & @CRLF
	$text &= "Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor." & @CRLF
	$text &= "Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper congue, euismod non, mi." & @CRLF
	$text &= "Proin porttitor, orci nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl sit amet erat." & @CRLF
	$text &= "Duis semper. Duis arcu massa, scelerisque vitae, consequat in, pretium a, enim." & @CRLF
	$text &= "Pellentesque congue. Ut in risus volutpat libero pharetra tempor. Cras vestibulum bibendum augue. Praesent egestas leo in pede." & @CRLF
	$text &= "Praesent blandit odio eu enim. Pellentesque sed dui ut augue blandit sodales." & @CRLF
	$text &= "Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aliquam nibh." & @CRLF
	$text &= "Mauris ac mauris sed pede pellentesque fermentum. Maecenas adipiscing ante non diam sodales hendrerit." & @CRLF

	For $i = 1 To 10
		$text &= $text
	Next

#Region ### START Koda GUI section ### Form=
Global $Form1 = GUICreate("Form1", 873, 720, 412, 150)
Global $Edit1 = GUICtrlCreateEdit("", 24, 24, 825, 673, BitOR($GUI_SS_DEFAULT_EDIT,$ES_READONLY))

GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
GUICtrlSendMsg ( $Edit1 , $EM_LIMITTEXT , - 1 , 0 )
GUICtrlSetData($Edit1, $text)
$aa = StringSplit($text,@CRLF)
MsgBox(0,"","Nb lignes " & $aa[0] & @CRLF & "Nb caractères " & StringLen($text))
While 1
 $nMsg = GUIGetMsg()
 Switch $nMsg
  Case $GUI_EVENT_CLOSE
   Exit

 EndSwitch
WEnd

Avec $ES_READONLY les copié-collé ne fonctionne pas et le GUICtrlSetState($_FrhEdit,$GUI_DISABLE) est inutile
Mon code renvoie 18433 lignes et 877568 carractères, ce devrait être suffisant....
En même temps, ça répond à la demande de TommyDDR https://www.autoitscript.fr/forum/viewtopic.php?t=3659
(mieux vaut tard que jamais :mrgreen: )

Re: [..] Ajuster GUICtrlCreateEdit avec la fonction _FileCountLines

Posté : dim. 06 sept. 2020 18:23
par Boulanza
Bonjour walkson,
Merci pour votre suggestion.
Votre code sans GUICtrlSetState($Edit1,$GUI_DISABLE) est copiable par tout intrus donc falsifiable.
j'ai trouvé une astuce pour garder GUICtrlSetState($Edit1,$GUI_DISABLE) dans mon scripte en remplaçant manuellement:
- For $i = 1 To 40
- For $i = 41 To 81
- For $i = 82 To 122
Je cherche à optimiser cela.

Re: [..] Ajuster GUICtrlCreateEdit avec la fonction _FileCountLines

Posté : dim. 06 sept. 2020 18:31
par walkson
On peut le copier mais on ne peut pas coller (désactivé) donc le document n'est pas modifiable !

Re: [..] Ajuster GUICtrlCreateEdit avec la fonction _FileCountLines

Posté : dim. 06 sept. 2020 18:36
par Boulanza
Si, on peut le copier et le coller sans problème ...

Re: [..] Ajuster GUICtrlCreateEdit avec la fonction _FileCountLines

Posté : dim. 06 sept. 2020 18:42
par mikell
Vous me désolez avec votre histoire d'Edit, alors je vous suggère d'essayer l'un des deux codes ci-dessous

L'edit est complètement verrouillée (ce que la votre n'était pas) ce qui signifie : inertie totale au clic gauche (pas de sélection possible), au clic droit (pas de menu contextuel). Notez que Ctrl-C et Ctrl-V ne fonctionnent pas non plus
En fait les seules choses qui marchent sur cet Edit ce sont les barres de scroll Image

#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPIRes.au3>
#include <WinAPIShellEx.au3>

$gui = GUICreate("My GUI edit", 250, 130)
$edit = GUICtrlCreateEdit("", 10, 10, 230, 100, $ES_AUTOVSCROLL + $WS_VSCROLL)
GUISetState()

GUICtrlSetData($edit, "AutoIt v3 is a freeware BASIC-like scripting language designed for automating the Windows GUI and general scripting. It uses a combination of simulated keystrokes, mouse movement and window control manipulation in order to automate tasks in a way not possible or reliable with other languages ")

$hEdit = GUICtrlGetHandle($edit)
$pEditProc = DllCallbackGetPtr(DllCallbackRegister("EditProc", "lresult", "hwnd;uint;wparam;lparam;uint_ptr;dword_ptr"))
_WinAPI_SetWindowSubclass($hEdit, $pEditProc, 9999, 0)
_WinAPI_HideCaret($hEdit)  ; pas de curseur


While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                _WinAPI_RemoveWindowSubclass($hEdit, $pEditProc, 9999)
                ExitLoop
        EndSwitch
WEnd

Func EditProc($hWnd, $iMsg, $wParam, $lParam, $iSubclassId, $pData)
  Switch $iMsg
    Case $WM_CONTEXTMENU, $WM_PASTE, $WM_LBUTTONDOWN, $WM_LBUTTONDBLCLK, $WM_RBUTTONDOWN
      Return 0
  EndSwitch
  Return _WinAPI_DefSubclassProc($hWnd, $iMsg, $wParam, $lParam)
EndFunc

#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPIRes.au3>
#include <WinAPI.au3>

$gui = GUICreate("My GUI edit", 250, 130)
$edit = GUICtrlCreateEdit("", 10, 10, 230, 100, $ES_AUTOVSCROLL + $WS_VSCROLL)
GUISetState()

GUICtrlSetData($edit, "AutoIt v3 is a freeware BASIC-like scripting language designed for automating the Windows GUI and general scripting. It uses a combination of simulated keystrokes, mouse movement and window control manipulation in order to automate tasks in a way not possible or reliable with other languages ")

$hEdit = GUICtrlGetHandle($edit)
$wProcHandle = DllCallbackRegister("_WindowProc", "ptr", "hwnd;uint;wparam;lparam")
$wProcOld = _WinAPI_SetWindowLong($hEdit, $GWL_WNDPROC, DllCallbackGetPtr($wProcHandle))
_WinAPI_HideCaret($hEdit)  ; pas de curseur

While 1
   Switch GUIGetMsg()
      Case $GUI_EVENT_CLOSE
         GUIDelete($gui)
         DllCallbackFree($wProcHandle)
         Exit
   EndSwitch
WEnd

Func _WindowProc($hWnd, $Msg, $wParam, $lParam)
    Switch $hWnd
        Case $hEdit
            Switch $Msg
                Case $WM_CONTEXTMENU, $WM_PASTE, $WM_LBUTTONDOWN, $WM_LBUTTONDBLCLK, $WM_RBUTTONDOWN
                    ToolTip("interdit !")
                    Sleep(1000)
                    ToolTip("")
                    Return 0
             EndSwitch
    EndSwitch
    Local $aRet = DllCall("user32.dll", "int", "CallWindowProc", "ptr", $wProcOld, _
                          "hwnd", $hWnd, "uint", $Msg, "wparam", $wParam, "lparam", $lParam)
    Return $aRet[0]
EndFunc

Re: [..] Ajuster GUICtrlCreateEdit avec la fonction _FileCountLines

Posté : dim. 06 sept. 2020 19:13
par walkson
Vous me désolez avec votre histoire d'Edit
Moi aussi :(
On ne doit pas avoir le même Autoit !
Sans titre.jpg
Sans titre.jpg (43.26 Kio) Vu 2819 fois
On voit visiblement que Annuler,couper, copier,coller et supprimer sont désactivés ! ctrl+c et ctrl+v ne fonctionnent pas, mais bon... :(

Re: [..] Ajuster GUICtrlCreateEdit avec la fonction _FileCountLines

Posté : dim. 06 sept. 2020 19:20
par mikell
Non, mais pas le même Windows certainement :mrgreen:
J'ai édité les 2 codes. Tu peux tester ?

Re: [..] Ajuster GUICtrlCreateEdit avec la fonction _FileCountLines

Posté : dim. 06 sept. 2020 19:26
par Boulanza
Bonjour walkson,
Je vous prie d'accepter Monsieur walkson mes excuses... Je compte beaucoup sur votre compréhension ainsi que celle des intervenants.
Je regrette que l'edit est complètement copiable avec : clic gauche (pas de sélection possible), au clic droit (pas de menu contextuel). Notez que Ctrl-C et Ctrl-V.
Avec Ctrl-A la copie est possible.
Cordialement.

Re: [..] Ajuster GUICtrlCreateEdit avec la fonction _FileCountLines

Posté : dim. 06 sept. 2020 19:28
par walkson
je viens de tester les 2 codes et l'édit est inaccessible mais on peut utiliser la barre du scroll, donc IMPECCABLE.

Re: [..] Ajuster GUICtrlCreateEdit avec la fonction _FileCountLines

Posté : dim. 06 sept. 2020 19:32
par Boulanza
Avec Ctrl-A la copie est possible.

Re: [..] Ajuster GUICtrlCreateEdit avec la fonction _FileCountLines

Posté : dim. 06 sept. 2020 19:35
par mikell
Merci. Tu m'as fait peur :mrgreen:
En fait ces codes sont souples, avec $WM_LBUTTONDOWN et $WM_LBUTTONDBLCLK il suffisait de rajouter $WM_RBUTTONDOWN... sorry

Edit pour le Ctrl-A : rajouter $WM_KEYDOWN

Re-Edit : quand même, (hormis le côté fun) un Edit inaccessible ça n'existe pas. Avec Resource Hacker par exemple on fait des merveilles :roll:

Re: [..] Ajuster GUICtrlCreateEdit avec la fonction _FileCountLines

Posté : dim. 06 sept. 2020 21:11
par Boulanza
Bonsoir,
Je viens de tester votre proposition... La copie Avec Ctrl-A et Ctrl-A est toujours bossible. Voir code 1.
Code 1

Code : Tout sélectionner

 Case $WM_CONTEXTMENU, $WM_PASTE, $WM_LBUTTONDOWN, $WM_LBUTTONDBLCLK, $WM_RBUTTONDOWN,$WM_KEYDOWN
                    ToolTip("interdit !")
                    Sleep(1000)
                    ToolTip("")
                    Return 0
Je pense qu'Il faut bloquer le raccourci clavier voir code 2, malheuresement il faut redémarrer le PC pour l'activer et pour le désactiver => ce n'est pas commode...
Code 2

Code : Tout sélectionner

;~ $Reg = RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout", "Scancode Map")
;~ 	If ($Reg = "") Then RegWrite("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout\", "Scancode Map", "REG_BINARY", "0x00000000000000000300000000001D0000001DE000000000")
Cordialement.

Re: [..] Ajuster GUICtrlCreateEdit avec la fonction _FileCountLines

Posté : dim. 06 sept. 2020 21:30
par jchd
Euh, et si quelqu'un modifie le contenu de est.txt ?
Ca sert à quoi toutes ces pseudo-restrictions ?

Re: [..] Ajuster GUICtrlCreateEdit avec la fonction _FileCountLines

Posté : dim. 06 sept. 2020 21:49
par Boulanza
Bonsoir,
La solution est : " GUICtrlSetState($Edit1,$GUI_DISABLE) " pour interdire radicalement copier-coller.
j'ai trouvé une astuce pour garder GUICtrlSetState($Edit1,$GUI_DISABLE) dans mon scripte en remplaçant manuellement:
- For $i = 1 To 40
- For $i = 41 To 81
- For $i = 82 To 122
En optimisant cela, je crie que notre problème n'aura pas lieu d’être.
comptant sur votre savoir faire.
Cordialement.

Re: [..] Ajuster GUICtrlCreateEdit avec la fonction _FileCountLines

Posté : mar. 08 sept. 2020 16:09
par Boulanza
Bonjour,
Pour mikell et walkson, vous codes ne protègent rien contre "Ctrl+a Ctrl+c Ctrl+v" sauf dans la condition que:
Case $WM_CONTEXTMENU, $WM_PASTE, $WM_LBUTTONDOWN, $WM_LBUTTONDBLCLK, $WM_RBUTTONDOWN,$WM_KEYDOWN
ToolTip("interdit !")
Sleep(1000)
ToolTip("")
Return 0
tourne en boucle boucle. Est ce possible ?
Cordialement.

Re: [R] Ajuster GUICtrlCreateEdit avec la fonction _FileCountLines

Posté : mar. 08 sept. 2020 18:59
par Boulanza
J'abandonne ce sujet non achevé.

Re: [R] Ajuster GUICtrlCreateEdit avec la fonction _FileCountLines

Posté : mer. 09 sept. 2020 00:47
par walkson
Faut pas :mrgreen:

Code : Tout sélectionner

#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <File.au3>
#include <Array.au3>
	If Not FileExists(@ScriptDir & "\text.txt") Then ;construction du texte
	$text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus." & @CRLF
	Local $text1
	For $i = 1 To 122
		$text1 &= $i & $text
	Next

	FileWrite(@ScriptDir & "\text.txt",$text1)
	EndIf
Global $Form1 = GUICreate("Form1", 873, 800)
Global $Edit1 = GUICtrlCreateEdit("", 24, 24, 825, 673, $ES_READONLY)
GUICtrlSetState(-1,$GUI_DISABLE)
GUICtrlSetBkColor(-1, 0xFFFFFF)
GUICtrlSetFont(-1, 10, 900, 0, "Ariel")
Global $button = GUICtrlCreateButton("suivant",350,700,100,25)
GUISetState(@SW_SHOW)

$aa = _FileCountLines(@ScriptDir & "\text.txt")
MsgBox(0,"","Nb lignes " & $aa )
Local $array[3];variable texte
Local $array_1[3][2] = [[1,40],[41,81],[82,122]];variable position
;_ArrayDisplay($array_1)
Local $lire,  $a = 0
For $y = 0 To 2
$x = $array_1[$y][0]
$w = $array_1[$y][1]
	For $i = $x To $w
		$lire &= FileReadLine(@ScriptDir & "\text.txt",$i)  & @CRLF

	Next
$array[$y] = $lire
$lire = ""

Next
GUICtrlSetData($Edit1, $array[$a])
While 1
 $nMsg = GUIGetMsg()
 Switch $nMsg
  Case $GUI_EVENT_CLOSE
   Exit
	 Case $button
		 $a += 1
		 If $a > 2 Then $a = 0
		 GUICtrlSetData($Edit1, $array[$a])


 EndSwitch
WEnd

Re: [R] Ajuster GUICtrlCreateEdit avec la fonction _FileCountLines

Posté : mer. 09 sept. 2020 11:32
par Boulanza
Bonjour walkson,
Bravo, c'est très professionnel, c'est parfait.
Je vais tester votre code sur tous les possibilités de copier-coller puis je revient vers vous.
Encore une fois merci pour Autoit comme système de programmation et à ses créateurs et à ses responsables.
Cordialement.

Re: [R] Ajuster GUICtrlCreateEdit avec la fonction _FileCountLines

Posté : mer. 09 sept. 2020 12:01
par Boulanza
La suggestion de walkson : Et pourquoi ne pas tout mettre sur un édit ?
Effectivement Monsieur walkson, pour éviter la copie illicite, il faut éviter le fichier .txt.
Je revient donc vers vous pour vous demander svp de modifier votre code (oeuvre) en le mettant sur un édtit. Par exemple:

Code : Tout sélectionner

 $text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus." & @CRLF
	$text &= "Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor." & @CRLF
	$text &= "Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper congue, euismod non, mi." & @CRLF
	$text &= "Proin porttitor, orci nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl sit amet erat." & @CRLF
	$text &= "Duis semper. Duis arcu massa, scelerisque vitae, consequat in, pretium a, enim." & @CRLF
	$text &= "Pellentesque congue. Ut in risus volutpat libero pharetra tempor. Cras vestibulum bibendum augue. Praesent egestas leo in pede." & @CRLF
	$text &= "Praesent blandit odio eu enim. Pellentesque sed dui ut augue blandit sodales." & @CRLF
	$text &= "Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aliquam nibh." & @CRLF
	$text &= "Mauris ac mauris sed pede pellentesque fermentum. Maecenas adipiscing ante non diam sodales hendrerit." & @CRLF
Cordialement.