|
You last visited: Today at 10:18
Advertisement
[Release] GUI Inhalt dynamisch speichern
Discussion on [Release] GUI Inhalt dynamisch speichern within the AutoIt forum part of the Coders Den category.
02/14/2013, 22:25
|
#1
|
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
|
|
|
02/14/2013, 23:38
|
#2
|
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^^
|
|
|
02/15/2013, 00:22
|
#3
|
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
|
|
|
02/15/2013, 00:43
|
#4
|
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
|
Quote:
Originally Posted by Achat
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.
|
|
|
02/15/2013, 14:47
|
#5
|
elite*gold: 528
Join Date: Jan 2012
Posts: 2,127
Received Thanks: 2,404
|
Quote:
Originally Posted by lolkop
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
|
|
|
02/15/2013, 15:12
|
#6
|
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
|
Quote:
Originally Posted by Achat
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
|
|
|
02/15/2013, 23:46
|
#7
|
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
|
|
|
02/16/2013, 00:29
|
#8
|
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
|
Quote:
Originally Posted by Achat
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.
|
|
|
|
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.
|
|