Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > AutoIt
You last visited: Today at 10:18

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



[Release] GUI Inhalt dynamisch speichern

Discussion on [Release] GUI Inhalt dynamisch speichern within the AutoIt forum part of the Coders Den category.

Reply
 
Old   #1
 
Achat's Avatar
 
elite*gold: 528
Join Date: Jan 2012
Posts: 2,127
Received Thanks: 2,404
[Release] GUI Inhalt dynamisch speichern

Hi epvp!

Damit könnt ihr GUI Inhalte (Checkbox/Radio/Input/etc.) dynamisch speichern und laden:

Code:
; #FUNCTION# ====================================================================================================================
; Name ..........: _GUICtrlSaveState
; Description ...: Saves the state/text of gui controls
; Return values .: none
; Author ........: Achat
; Remarks .......: _GUICtrlLoadState()
; ===============================================================================================================================
Func _GUICtrlSaveState()
	Local Const $sINI = @ScriptDir & '\GUICtrlState.ini'
	For $i = 0 To 4096
		Local $vRead = GUICtrlRead($i)
		Local $vHandle = GUICtrlGetHandle($i)
		If Not ($vRead == 0 And $vHandle == 0) Then
			If IsInt($vRead) Then
				IniWrite($sINI, 'GuiCtrlState_CheckboxRadio', $i, StringRegExpReplace($vRead, '4', '0'))
			Else
				IniWrite($sINI, 'GuiCtrlState_Text', $i, StringToBinary($vRead))
			EndIf
		EndIf
	Next
	Local $sRead = FileRead($sINI)
	If Not StringRegExp($sRead, '^;.+') Then
		FileDelete($sINI)
		FileWrite($sINI, ';Please do not modify this file.' & @CRLF & $sRead)
	EndIf
EndFunc   ;==>_GUICtrlSaveState

; #FUNCTION# ====================================================================================================================
; Name ..........: _GUICtrlLoadState
; Description ...: Load the state/text of gui controls
; Return values .: none
; Author ........: Achat
; Remarks .......: _GuiCtrlSaveState()
; ===============================================================================================================================
Func _GUICtrlLoadState()
	Local Const $sINI = @ScriptDir & '\GUICtrlState.ini'
	Local $aCheckboxRadio = IniReadSection($sINI, 'GuiCtrlState_CheckboxRadio')
	Local $aText = IniReadSection($sINI, 'GuiCtrlState_Text')
	For $i = 1 To UBound($aCheckboxRadio) - 1
		GUICtrlSetState($aCheckboxRadio[$i][0], StringRegExpReplace($aCheckboxRadio[$i][1], '0', '4'))
	Next
	For $i = 1 To UBound($aText) - 1
		If Not GUICtrlGetHandle($aText[$i][0]) = 0 Then GUICtrlSetData($aText[$i][0], BinaryToString($aText[$i][1]))
	Next
EndFunc   ;==>_GUICtrlLoadState
Beispiel:

Code:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
#region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 615, 438, 192, 124)
$Checkbox1 = GUICtrlCreateCheckbox("Checkbox1", 64, 32, 137, 41)
$Input1 = GUICtrlCreateInput("Input1", 56, 80, 185, 21)
$Button1 = GUICtrlCreateButton("Button1", 56, 120, 121, 17)
$Checkbox2 = GUICtrlCreateCheckbox("Checkbox2", 224, 128, 81, 33)
$Button2 = GUICtrlCreateButton("2222", 80, 248, 457, 137)
GUISetState(@SW_SHOW)
#endregion ### END Koda GUI section ###
#region ### START Koda GUI section ### Form=
$Form11 = GUICreate("Form2", 615, 438, 0, 0)
$Checkbox11 = GUICtrlCreateCheckbox("Checkbox1", 64, 32, 137, 41)
$Input11 = GUICtrlCreateInput("Input1", 56, 80, 185, 21)
$Button11 = GUICtrlCreateButton("Button1", 56, 120, 121, 17)
$Checkbox12 = GUICtrlCreateCheckbox("Checkbox2", 224, 128, 81, 33)
$Button12 = GUICtrlCreateButton("2222", 80, 248, 457, 137)
GUISetState(@SW_SHOW)
#endregion ### END Koda GUI section ###
_GUICtrlLoadState()
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			_GUICtrlSaveState()
			Exit

	EndSwitch
WEnd

; #FUNCTION# ====================================================================================================================
; Name ..........: _GUICtrlSaveState
; Description ...: Saves the state/text of gui controls
; Return values .: none
; Author ........: Achat
; Remarks .......: _GUICtrlLoadState()
; ===============================================================================================================================
Func _GUICtrlSaveState()
	Local Const $sINI = @ScriptDir & '\GUICtrlState.ini'
	For $i = 0 To 4096
		Local $vRead = GUICtrlRead($i)
		Local $vHandle = GUICtrlGetHandle($i)
		If Not ($vRead == 0 And $vHandle == 0) Then
			If IsInt($vRead) Then
				IniWrite($sINI, 'GuiCtrlState_CheckboxRadio', $i, StringRegExpReplace($vRead, '4', '0'))
			Else
				IniWrite($sINI, 'GuiCtrlState_Text', $i, StringToBinary($vRead))
			EndIf
		EndIf
	Next
	Local $sRead = FileRead($sINI)
	If Not StringRegExp($sRead, '^;.+') Then
		FileDelete($sINI)
		FileWrite($sINI, ';Please do not modify this file.' & @CRLF & $sRead)
	EndIf
EndFunc   ;==>_GUICtrlSaveState

; #FUNCTION# ====================================================================================================================
; Name ..........: _GUICtrlLoadState
; Description ...: Load the state/text of gui controls
; Return values .: none
; Author ........: Achat
; Remarks .......: _GuiCtrlSaveState()
; ===============================================================================================================================
Func _GUICtrlLoadState()
	Local Const $sINI = @ScriptDir & '\GUICtrlState.ini'
	Local $aCheckboxRadio = IniReadSection($sINI, 'GuiCtrlState_CheckboxRadio')
	Local $aText = IniReadSection($sINI, 'GuiCtrlState_Text')
	For $i = 1 To UBound($aCheckboxRadio) - 1
		GUICtrlSetState($aCheckboxRadio[$i][0], StringRegExpReplace($aCheckboxRadio[$i][1], '0', '4'))
	Next
	For $i = 1 To UBound($aText) - 1
		If Not GUICtrlGetHandle($aText[$i][0]) = 0 Then GUICtrlSetData($aText[$i][0], BinaryToString($aText[$i][1]))
	Next
EndFunc   ;==>_GUICtrlLoadState
Viel Spaß

MfG
Achat is offline  
Thanks
1 User
Old 02/14/2013, 23:38   #2
 
butter123's Avatar
 
elite*gold: 95
Join Date: May 2011
Posts: 982
Received Thanks: 189
habs nur kurz überflogen, dynamisch heißt es wird das was als letztes ausgewählt wurde beim nächsten start wieder ausgewählt? klingt gut^^
butter123 is offline  
Old 02/15/2013, 00:22   #3
 
Achat's Avatar
 
elite*gold: 528
Join Date: Jan 2012
Posts: 2,127
Received Thanks: 2,404
Statt jedes Control einzeln speichern/laden zu müssen wie z.B.
Code:
GUICtrlSetData($Input1, IniRead($sINI, 'GUI', 'Input1', '1'))
GUICtrlSetData($Input2, IniRead($sINI, 'GUI', 'Input2', '2'))
GUICtrlSetData($Input3, IniRead($sINI, 'GUI', 'Input3', '3'))
GUICtrlSetData($Input4, IniRead($sINI, 'GUI', 'Input4', ''))
;etc

IniWrite($sINI, 'GUI', 'Input1', GUICtrlRead($Input1))
IniWrite($sINI, 'GUI', 'Input2', GUICtrlRead($Input2))
IniWrite($sINI, 'GUI', 'Input3', GUICtrlRead($Input3))
;etc.
übernimmt das nur eine Funktion.

Code:
_GUICtrlLoadState()
_GUICtrlSaveState()
Somit muss man auch nicht mehr neue Iniwrite/Guictrlsetdata Befehle für neue GUI - Controls hinzufügen.

MfG
Achat is offline  
Old 02/15/2013, 00:43   #4
 
lolkop's Avatar
 
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
Quote:
Originally Posted by Achat View Post
Statt jedes Control einzeln speichern/laden zu müssen wie z.B.
Code:
GUICtrlSetData($Input1, IniRead($sINI, 'GUI', 'Input1', '1'))
GUICtrlSetData($Input2, IniRead($sINI, 'GUI', 'Input2', '2'))
GUICtrlSetData($Input3, IniRead($sINI, 'GUI', 'Input3', '3'))
GUICtrlSetData($Input4, IniRead($sINI, 'GUI', 'Input4', ''))
;etc

IniWrite($sINI, 'GUI', 'Input1', GUICtrlRead($Input1))
IniWrite($sINI, 'GUI', 'Input2', GUICtrlRead($Input2))
IniWrite($sINI, 'GUI', 'Input3', GUICtrlRead($Input3))
;etc.
übernimmt das nur eine Funktion.

Code:
_GUICtrlLoadState()
_GUICtrlSaveState()
Somit muss man auch nicht mehr neue Iniwrite/Guictrlsetdata Befehle für neue GUI - Controls hinzufügen.

MfG
grundsätzlich sollte man immer nur das speichern, was ABSOLUT notwendig ist, da festplatten aktionen immer die langsamsten sind. abgesehn davon hat der user so die möglichkeit das sämtliche textstellen des programms mit einem einfachen editor zu ändern, was ebenfalls nicht schön ist.

in jedem erdenklichen falle sollte der programmierer immer darauf achten, das das programm nur das nötigste tut... dieses beispiel hier ist in meinen augen definitiv ein schritt in die falsche richtung.
lolkop is offline  
Old 02/15/2013, 14:47   #5
 
Achat's Avatar
 
elite*gold: 528
Join Date: Jan 2012
Posts: 2,127
Received Thanks: 2,404
Quote:
Originally Posted by lolkop View Post
grundsätzlich sollte man immer nur das speichern, was ABSOLUT notwendig ist, da festplatten aktionen immer die langsamsten sind. abgesehn davon hat der user so die möglichkeit das sämtliche textstellen des programms mit einem einfachen editor zu ändern, was ebenfalls nicht schön ist.


Dazu müsste ich irgendwie herausfinden, ob das Control ein Button/Input/Checkbox etc. ist. Es soll ja nur das gespeichert werden, was der User auch verändern kann (Input Inhalt etc.).

Ein weiteres Problem ist, da ja die Nummern von den Controls gespeichert werden, dass sich die Reihenfolge dieser Nummern ändert, wenn Controls entfernt oder hinzugefügt werden.
Ich müsste also die Nummer des Controls in den Variablennamen auflösen
Code:
Global $Input1 = GUICtrlCreateInput("Input1", 0, 0, 20, 20)
Also nicht den Wert von $Input1 speichern, sondern den Variablennamen, damit der Text eindeutig zu $Input1 zugeordnet werden kann.

Inhalt der *.ini
Code:
[GuiCtrlState_Text]
4=Input1
Es sollte aber so aussehen
Code:
[GuiCtrlState_Text]
$Input1=Input1
MfG
Achat is offline  
Old 02/15/2013, 15:12   #6
 
lolkop's Avatar
 
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
Quote:
Originally Posted by Achat View Post
Dazu müsste ich irgendwie herausfinden, ob das Control ein Button/Input/Checkbox etc. ist. Es soll ja nur das gespeichert werden, was der User auch verändern kann (Input Inhalt etc.).
auch das wäre nicht wirklich sinnvoll, da dynamische programme ohnehin viele controls abhängig vom zustand anderer controls setzen sollten.

denkbar sinnvoll wäre eine funktion, welche beispielsweise zu speichernde controls aufnehmen kann

beispiel:
Code:
GuiCreate(...)
[...]
$x = GuiCtrlCreate...
SetControlToBeSaved($x) ;eventeuell auch -1 als parameter ermöglichen
$y = GuiCtrlCreate...
SetControlToBeSaved($y)
[...]

LoadControlSettings()

While True
    Switch GuiGetMsg()
        Case -3
            SaveControlSettings()
            Exit
        [...]
    EndSwitch
WEnd
SetControlToBeSafed könnte in diesem beispiel sämtliche gewünschten controls in ein array sichern (im besten falle hier nicht die ControlId, sondern den variablen namen).

LoadControlSettings würde von sämtlichen variablen im array die settings aus der settingsdatei laden

SaveControlSettings würde von sämtlichen variablen im array die settings in der settingsdatei speichern
lolkop is offline  
Thanks
1 User
Old 02/15/2013, 23:46   #7
 
Achat's Avatar
 
elite*gold: 528
Join Date: Jan 2012
Posts: 2,127
Received Thanks: 2,404
Man kann Variablennamen leider nicht ausgeben lassen.



Bei deinem Beispiel wäre ich dann wieder dabei, für jedes Control einzeln festzulegen, dass es gespeichert wird. Bei etwa 100+ Gui Controls ist das etwa der selbe Aufwand wie vorher auch

MfG
Achat is offline  
Old 02/16/2013, 00:29   #8
 
lolkop's Avatar
 
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
Quote:
Originally Posted by Achat View Post
Man kann Variablennamen leider nicht ausgeben lassen.



Bei deinem Beispiel wäre ich dann wieder dabei, für jedes Control einzeln festzulegen, dass es gespeichert wird. Bei etwa 100+ Gui Controls ist das etwa der selbe Aufwand wie vorher auch

MfG
der punkt ist je eben, das genau das der fall sein MUSS, weil man keine überflüssigen controls speichern will/sollte/darf...

abgesehen davon ist es natürlich immer möglich variablen als strings zu übergeben. ob das ganze nun einfacher vom code her ist, bleibt natürlich fraglich, jedoch sollte klar sein, das diese methode deutlich übersichtlicher und sauber programmiert wäre, als später für jedes control einzeln die selben aktionen durchzuführen.
lolkop is offline  
Thanks
1 User
Reply


Similar Threads Similar Threads
[Release]Arius2 Client Inhalt
01/31/2013 - Metin2 PServer Guides & Strategies - 19 Replies
-DELETED- __________ Client scheint schon Pub zu sein. Dann Release ich eben die Serverfiles von Arius2.
OriginReallife.De NEU! DYNAMISCH!
09/08/2012 - Grand Theft Auto - 1 Replies
Kommt einfach anschauen unbeschreiblich geil! IP:176.9.46.83:5252
[Release]Sinnvoller Inhalt
07/11/2012 - Metin2 PServer Guides & Strategies - 8 Replies
Heyho, bla bla bla Benutzt einfach den DE-Client, das sollte reichen.... Wenn ihr die aber falsch entpacket(was so ziemlich 99% von euch machen werden) werdet ihr einen Text ausgegeben bekommen der ungefähr so aussieht: Ιs€
Hilfe in Cinema 4d ? Datei Speichern mit transparentem hintergrund Speichern ?
09/29/2011 - elite*gold Trading - 10 Replies
^this. Melde euch bei mir, wenn es klappt, bekommt ihr bisschen egold.
Gui grösse verändern (dynamisch)
09/21/2009 - AutoIt - 2 Replies
hey ho ich such das jetzt schon ne weile.. ich weis garned ob das überhaupt geht.. (vtl. geht das auch nur bei mir nicht und für alle andern isses so normal dass es nirgend steht xD) ich möchte das fenster von meinem gui nach dem ich das programm ausgeführt habe verändern können (so wie halt bei den windowsfenstern dass dann das pfeilchen kommt welches auf bede seiten zeigt ..) wie genau mand em sagt ... KA vtl. dynamisch oder so xD ich hoffe mal ihr versteht was ich meine und dass...



All times are GMT +2. The time now is 10:18.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.