Okay, verstanden. Die drei unterschiedlichen Listen von Error-Codes baue ich jetzt aber nicht noch ein.
Bitte nutzt die Alternative.
Okay, verstanden. Die drei unterschiedlichen Listen von Error-Codes baue ich jetzt aber nicht noch ein.
Bitte nutzt die Alternative.
Genau, der Sektionsheader sollte in der Reihenfolge erhalten bleiben. Ich habe lange gesucht und nichts dazu gefunden. Dass nun IniWriteSection($sFilePath, $iniSection, '') genau das macht, was ich wollte, ist nirgends dokumentiert.
Naja, egal. Danke für den Hinweis! Das Programm ist nun schlanker und die Funktion überflüssig. Wenigstens habe ich in der Zeit mit dem "Problem" auch etwas zu Arrays gelernt.
Bei INI-Dateien mit mehr als 5 Keys pro Section fand ich es etwas umständlich, die Keys zu suchen, welche keinen Wert mehr haben. Also überlegte ich mir einen einfacheren Weg. Gut, es hat eine ganze Weile gedauert, bis es wie gewünscht funktionierte. Nun möchte ich die Funktion mit Euch teilen.
Mit _ini_delete_keys werden alle Keys einer Section gelöscht. Eine Fehler- bzw. Erfolgsausgabe gibt es nicht.
#include <Array.au3>
#include <File.au3>
; #FUNCTION# ====================================================================================================================
; Name ..........: _ini_delete_keys
; Description ...: Delete all keys of one INI-section
; Syntax ........: _ini_delete_keys($iniSection, $sFilePath)
; Parameters ....: $iniSection - The section in which all keys should be deleted.
; $sFilePath - The path to the INI-file
; Return values .: None
; Author ........: MacG (https://autoit.de)
; ===============================================================================================================================
Func _ini_delete_keys($iniSection, $sFilePath)
Local $aFileData
_FileReadToArray($sFilePath, $aFileData)
For $i = 1 To $aFileData[0]
If StringInStr($aFileData[$i], $iniSection) Then
$iDelBegin = $i + 1
For $j = $iDelBegin To $aFileData[0]
If StringInStr($aFileData[$j], '[') Then
$iDelEnd = $j - 1
ExitLoop
EndIf
Next
ExitLoop
EndIf
Next
For $i = $iDelBegin To $iDelEnd
_ArrayDelete($aFileData, $iDelBegin)
Next
_ArrayInsert($aFileData, $iDelBegin, '') ;add a blank line to the section
_FileWriteFromArray($sFilePath, $aFileData, 1)
EndFunc ;==>_ini_delete_keys
Alles anzeigen
Direkt danach schreibe ich in meinem Programm die Keys dieser Section erneut in die INI-Datei. Damit sind die Keys auch immer gut sortiert, auch wenn mal später noch ein Key hinzugefügt wird.
EDIT:
Wie es weiter unten steht, nutzt: IniWriteSection($sFilePath, $iniSection, '') es bewirkt genau das Gleiche.
Vielen Dank für die zusätzlichen Erläuterungen.
Vielen Dank! Es lag also hauptsächlich am gleichen Namen für die Tabelle für die Sortier- und Auslesefunktion. Dass man da nicht von selbst drauf kommt?!
Das _GUICtrlListView_Create ist anscheinend umfangreicher. Ich benötige die Tabelle nur bei den Einstellungen vom Programm. Sie ist also nicht der Hauptarbeitsbereich.
Euch weiterhin Frohe Ostern!
Ich probiere schon seit einer Ewigkeit herum und finde den Fehler nicht. Wenn ich keine Zeile in der Tabelle auswähle, wird immer die erste Zeile ausgelesen. Auch nach dem ich die Tabelle mit Klick auf eine Spalte neu sortiert habe.
Wähle ich aber eine Zeile aus, kommt kein Ergebnis. Da der Rückgabewert der Zeilennummer größer als die verfügbaren Zeilen in der Tabelle ist.
Also habe ich einen Korrekturwert von 9 eingetragenen. Danach habe ich festgestellt, dass ich die neu sortierte Tabelle nicht auslesen kann. Es wird meist eine andere als die selektierte Zeile ausgelesen.
Ist es nicht möglich, eine sortierte Tabelle auszulesen?
Im späteren Programm wird die Liste über vier Arrays gefüttert, für jede Spalte einen. Die Länge kann variieren.
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>
Global $hListView
Local $iExListViewStyle = BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES, $LVS_EX_DOUBLEBUFFER)
GUICreate("ListView", 300, 300)
$hListView = GUICtrlCreateListView("ID|Name|Min|Max", 10, 10, 280, 180, -1)
_GUICtrlListView_SetExtendedListViewStyle($hListView, $iExListViewStyle)
$ThrottleButton = GUICtrlCreateButton("Lesen:", 10, 200, 100, 20)
$ThrottleID = GUICtrlCreateInput("", 120, 200, 35, 20)
$ThrottleSteps = GUICtrlCreateInput("", 165, 200, 35, 20)
$ThrottleMin = GUICtrlCreateInput("", 210, 200, 35, 20)
$ThrottleMax = GUICtrlCreateInput("", 255, 200, 35, 20)
GUICtrlCreateListViewItem("90|more_a|0|1", $hListView)
GUICtrlCreateListViewItem("7|more_s|0|1", $hListView)
GUICtrlCreateListViewItem("6|more_se|0|1", $hListView)
GUICtrlCreateListViewItem("5|more_f|0|1", $hListView)
GUICtrlCreateListViewItem("4|more_v|0|2", $hListView)
GUICtrlCreateListViewItem("3|more_d|-1|1", $hListView)
GUICtrlCreateListViewItem("2|more_z|0|80", $hListView)
GUICtrlCreateListViewItem("1|more_e|0|100", $hListView)
GUISetState(@SW_SHOW)
_GUICtrlListView_RegisterSortCallBack($hListView)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
Case $idListView
; Kick off the sort callback
_GUICtrlListView_SortItems($hListView, GUICtrlGetState($hListView))
Case $ThrottleButton
$iSelected = GUICtrlRead($hListView) - 9 ;ohne die 9 wird keine ausgewählte Zeile ausgelesen, da der Rückgabewert größer als die Länge der Liste ist
$aLV = _GUICtrlListView_GetItemTextArray($hListView, $iSelected)
GUICtrlSetData($ThrottleID, $aLV[1])
GUICtrlSetData($ThrottleSteps, $aLV[2])
GUICtrlSetData($ThrottleMin, $aLV[3])
GUICtrlSetData($ThrottleMax, $aLV[4])
; MsgBox(0,"Ergebnis:",$iSelected & $aLV[1] & $aLV[2] & $aLV[3] & $aLV[4])
EndSwitch
WEnd
_GUICtrlListView_UnRegisterSortCallBack($hListView)
GUIDelete()
Alles anzeigen
Die GUI steht, das war Einiges an Arbeit und die war recht lehrreich.
Das Ändern der Größe funktioniert soweit wunderbar. Wenn man es übertreibt, wird es unansehnlich. Die, vor dem Start, anpassbare Fenstergröße sollte da Abhilfe schaffen.
Die Tipps zu DPI und Höhe von alpines sind noch nicht eingeflossen. Nur ein Skalieren zu erlauben, klingt verlockend. Mir würde es reichen. Nur wie lege ich das fest? Dazu konnte ich nichts finden.
Edit: das könnte es sein, gefunden auf Autoscript.com
alpines die 136 half mir weiter
Kanashius ob ich es schaffe Deinen Code zu verstehen, muss ich mal sehen
Ich hatte heute erst wieder Zeit an der GUI zu arbeiten. Warum die weiße Schrift der Gruppen nicht funktionierte lag an den Themes von Windows. Die lassen kein Einfärben zu, siehe Hilfe zu GUICtrlSetColor. Deshalb habe ich jeder Gruppe
DllCall("UxTheme.dll", "int", "SetWindowTheme", "hwnd", GUICtrlGetHandle($Group1), "wstr", 0, "wstr", 0)
hinzugefügt.
Danke! Du hast ja den zweiten Schritt vor meinem ersten ausgeführt.
Das sind eine Menge Infos, die ich mal verarbeiten muss.
Die Zahl 136 bei der Formel für die Schriftgröße ist ein Erfahrungswert von Dir? Bzw. sollte diese Zahl abhängig vom DPI-Wert sein?
Und noch eine letzte Frage für heute: Kann man eine minimale Größe für das Fenster festlegen, oder nur für Controls?
Mach ich, nur ohne Koda. Da dessen Ergebnis irgendwie nicht funktioniert. Und bei einem erneuten Koda-Aufruf der kxf-Datei sind die Labels kleiner und verschoben.
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
Local $Blink = 1, $sec = @SEC
#Region ### START Koda GUI section ### Form=G:\AutoIt\TS-Fireman\Koda LOD-GUI.kxf
$Form1 = GUICreate("LOD - Main Operation Screen", 1001, 751, -1, -1)
GUISetBkColor(0x000000)
$Group2 = GUICtrlCreateGroup("Unit ID", 665, 0, 332, 75, BitOR($GUI_SS_DEFAULT_GROUP,$BS_CENTER))
GUICtrlSetFont(-1, 16, 400, 0, "Arial")
GUICtrlSetColor(-1, 0xFFFFFF)
$Label8 = GUICtrlCreateLabel("ARR 4004", 717, 32, 221, 40, $SS_CENTER)
GUICtrlSetFont(-1, 24, 400, 0, "Arial")
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group3 = GUICtrlCreateGroup("", 0, 250, 87, 82)
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group4 = GUICtrlCreateGroup("", 85, 250, 87, 82)
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group5 = GUICtrlCreateGroup("", 170, 250, 87, 82)
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group6 = GUICtrlCreateGroup("", 255, 250, 87, 82)
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group7 = GUICtrlCreateGroup("", 340, 250, 87, 82)
GUICtrlSetColor(-1, 0xFFFFFF)
$Label13 = GUICtrlCreateLabel("HEAD" & @CRLF & "LIGHTS", 345, 260, 77, 67, $SS_CENTER) ;editiert
GUICtrlSetFont(-1, 16, 800, 0, "Arial") ;editiert
GUICtrlSetColor(-1, 0x000000)
GUICtrlSetBkColor(-1, 0xFFFBF0)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group8 = GUICtrlCreateGroup("", 573, 250, 87, 82)
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group9 = GUICtrlCreateGroup("", 658, 250, 87, 82)
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group10 = GUICtrlCreateGroup("", 743, 250, 87, 82)
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group11 = GUICtrlCreateGroup("", 828, 250, 87, 82)
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group12 = GUICtrlCreateGroup("", 913, 250, 87, 82)
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group13 = GUICtrlCreateGroup("", 425, 250, 150, 82)
GUICtrlSetColor(-1, 0xFFFFFF)
$Alerter = GUICtrlCreateLabel("ALERTER", 429, 259, 143, 70, BitOR($SS_CENTER,$SS_CENTERIMAGE))
GUICtrlSetFont(-1, 18, 800, 0, "Arial")
GUICtrlSetColor(-1, 0x000000)
GUICtrlSetBkColor(-1, 0xFF0000)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group14 = GUICtrlCreateGroup("", 573, 332, 87, 82)
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group15 = GUICtrlCreateGroup("", 658, 332, 87, 82)
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group16 = GUICtrlCreateGroup("", 743, 332, 87, 82)
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group17 = GUICtrlCreateGroup("", 828, 332, 87, 82)
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group18 = GUICtrlCreateGroup("", 913, 332, 87, 82)
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group20 = GUICtrlCreateGroup("", 403, 332, 87, 82)
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group21 = GUICtrlCreateGroup("", 488, 332, 87, 82)
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group19 = GUICtrlCreateGroup("ER", 2, 0, 165, 150, BitOR($GUI_SS_DEFAULT_GROUP,$BS_CENTER))
GUICtrlSetFont(-1, 16, 400, 0, "Arial")
GUICtrlSetColor(-1, 0xFFFFFF)
$Label1 = GUICtrlCreateLabel("111", 20, 48, 136, 93, $SS_CENTER)
GUICtrlSetFont(-1, 60, 400, 0, "Arial")
GUICtrlSetColor(-1, 0x00FF00)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group22 = GUICtrlCreateGroup("BP", 170, 0, 165, 150, BitOR($GUI_SS_DEFAULT_GROUP,$BS_CENTER))
GUICtrlSetFont(-1, 16, 400, 0, "Arial")
GUICtrlSetColor(-1, 0xFFFFFF)
$Label2 = GUICtrlCreateLabel("110", 188, 48, 136, 93, $SS_CENTER)
GUICtrlSetFont(-1, 60, 400, 0, "Arial")
GUICtrlSetColor(-1, 0x00FF00)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group23 = GUICtrlCreateGroup("Rear", 2, 152, 80, 75, BitOR($GUI_SS_DEFAULT_GROUP,$BS_CENTER))
GUICtrlSetFont(-1, 16, 400, 0, "Arial")
GUICtrlSetColor(-1, 0xFFFFFF)
$Label3 = GUICtrlCreateLabel("111", 14, 184, 58, 40, $SS_CENTER)
GUICtrlSetFont(-1, 24, 400, 0, "Arial")
GUICtrlSetColor(-1, 0x00FF00)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group24 = GUICtrlCreateGroup("Flow", 86, 152, 80, 75, BitOR($GUI_SS_DEFAULT_GROUP,$BS_CENTER))
GUICtrlSetFont(-1, 16, 400, 0, "Arial")
GUICtrlSetColor(-1, 0xFFFFFF)
$Label4 = GUICtrlCreateLabel("31", 98, 184, 58, 40, $SS_CENTER)
GUICtrlSetFont(-1, 24, 400, 0, "Arial")
GUICtrlSetColor(-1, 0x00FF00)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group1 = GUICtrlCreateGroup("MPH", 340, 0, 320, 150, BitOR($GUI_SS_DEFAULT_GROUP,$BS_CENTER))
GUICtrlSetFont(-1, 16, 400, 0, "Arial")
GUICtrlSetColor(-1, 0xFFFFFF)
$Label7 = GUICtrlCreateLabel("4.1", 428, 32, 144, 116, $SS_CENTER)
GUICtrlSetFont(-1, 75, 400, 0, "Arial")
GUICtrlSetColor(-1, 0x00FF00)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group25 = GUICtrlCreateGroup("Main", 170, 152, 80, 75, BitOR($GUI_SS_DEFAULT_GROUP,$BS_CENTER))
GUICtrlSetFont(-1, 16, 400, 0, "Arial")
GUICtrlSetColor(-1, 0xFFFFFF)
$Label5 = GUICtrlCreateLabel("132", 182, 184, 58, 40, $SS_CENTER)
GUICtrlSetFont(-1, 24, 400, 0, "Arial")
GUICtrlSetColor(-1, 0x00FF00)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group26 = GUICtrlCreateGroup("BC", 254, 152, 80, 75, BitOR($GUI_SS_DEFAULT_GROUP,$BS_CENTER))
GUICtrlSetFont(-1, 16, 400, 0, "Arial")
GUICtrlSetColor(-1, 0xFFFFFF)
$Label6 = GUICtrlCreateLabel("0", 266, 184, 58, 40, $SS_CENTER)
GUICtrlSetFont(-1, 24, 400, 0, "Arial")
GUICtrlSetColor(-1, 0x00FF00)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group27 = GUICtrlCreateGroup("Distance Counter", 665, 75, 332, 75, BitOR($GUI_SS_DEFAULT_GROUP,$BS_CENTER))
GUICtrlSetFont(-1, 16, 400, 0, "Arial")
GUICtrlSetColor(-1, 0xFFFFFF)
$Label9 = GUICtrlCreateLabel("0 feet", 717, 107, 220, 40, $SS_RIGHT)
GUICtrlSetFont(-1, 24, 400, 0, "Arial")
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group28 = GUICtrlCreateGroup("Power", 340, 152, 320, 75, BitOR($GUI_SS_DEFAULT_GROUP,$BS_CENTER))
GUICtrlSetFont(-1, 16, 400, 0, "Arial")
GUICtrlSetColor(-1, 0xFFFFFF)
$Label10 = GUICtrlCreateLabel("120 Amps", 488, 184, 148, 40, $SS_RIGHT)
GUICtrlSetFont(-1, 24, 400, 0, "Arial")
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group29 = GUICtrlCreateGroup("Throttle", 665, 152, 164, 75, BitOR($GUI_SS_DEFAULT_GROUP,$BS_CENTER))
GUICtrlSetFont(-1, 16, 400, 0, "Arial")
GUICtrlSetColor(-1, 0xFFFFFF)
$Label11 = GUICtrlCreateLabel("N 1", 717, 184, 54, 40, $SS_RIGHT)
GUICtrlSetFont(-1, 24, 400, 0, "Arial")
GUICtrlSetColor(-1, 0x00FF00)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group30 = GUICtrlCreateGroup("Reverser", 833, 152, 164, 75, BitOR($GUI_SS_DEFAULT_GROUP,$BS_CENTER))
GUICtrlSetFont(-1, 16, 400, 0, "Arial")
GUICtrlSetColor(-1, 0xFFFFFF)
$Label12 = GUICtrlCreateLabel("FWD", 853, 184, 120, 40, $SS_CENTER)
GUICtrlSetFont(-1, 24, 400, 0, "Arial")
GUICtrlSetColor(-1, 0x00FF00)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
_BlinkText($Alerter, 0xFF0000)
GUICtrlSetData($Label6, $sec)
WEnd
Func _BlinkText($BlinkLabel,$BlinkColor)
If @SEC <> $sec Then
$sec = @SEC
If $Blink Then
GUICtrlSetBkColor($BlinkLabel, 0x000000)
Else
GUICtrlSetBkColor($BlinkLabel, $BlinkColor)
EndIf
$Blink = Not $Blink
EndIf
EndFunc
Alles anzeigen
Für die Standard Resizing-Funktionen ist es also unerheblich wie die Anordnung für die Fenstergröße beim Start erstellt wird.
Dann kann ich ja mit der Erstellung der GUI anfangen und dann die Optionen der GUICtrlSetResizing hinzufügen und schauen wie es sich auswirkt. Das Beispielskript der Funktion gib einiges her, zeigt aber auch deren Schwächen auf (Überlagerung etc.). Ich bin gespannt auf mein Ergebnis
Danke!
Eine Menge ist es nicht, mehr als eine Hand voll vielleicht. Das ein oder andere kann ich vorstellen. Aber meist habe ich vorhandene Scripte nur an meine Bedürfnisse angepasst oder zusammengebracht. Wie eine Joystick_UDF und das Beispielskipt TCPSend.au3, welche die Grundlage für meinen TCP-Client bilden. Und dann noch Tage meiner Freizeit, um meine Vorstellungen, und die anderer User, einzubinden.
Bisher bin ich bei AutoIt gut mit einem statischen GUI ausgekommen. Jetzt möchte ich eine Anzeige erstellen, welche mit unterschiedlichen Fenstergrößen läuft. Vollbild auf einem kleinen Zusatzmonitor ist das Ziel. Nur sind eben die Auflösungen nicht immer gleich und dann kommt noch das Seitenverhältnis hinzu. Früher waren es 4:3 und heutzutage ist irgendetwas um die 16:9 der Standard.
Ich habe schon GUIs mit Variablen erstellt. Wer hat zum Beispiel Lust, bei 32 möglichen Joystick-Tasten für jede einzelne die Position eines Radio-Buttons festzulegen. Ich hatte sie nicht.
Da ich ein Display aus einer realen Lokomotive darstellen möchte, werde ich da auch mit Variablen arbeiten. Mit Koda habe ich den Anhang erstellt, aber als Script wird mir z.Bsp. die Gruppenbezeichnung nicht angezeigt. Deshalb wieder per Hand und besser (siehe "HEAD" eigentlich HEADLIGHTS zweizeilig).
Die Koordinaten und die Größe der Gruppen und Labels möchte ich anhand der Aufteilung festlegen. Hier mal als Beispiel:
für die ganz rechte obere Gruppe "Unit ID" etwa so:
für die Gruppe "Distance Counter" darunter so:
usw.
Ist dies denn für die Veränderung der Fenstergröße hilfreich, wenn die GUI mit Variablen erstellt wird? Oder muss ich ganz anders ansetzen?
Bezüglich Seitenverhältnis muss wohl eine zweite GUI her, das Vorbild ist halt 4:3 und das passt einfach nicht auf 16:9.
Ich bin 43 und selbständiger Zahntechniker. Seit 10 Jahren nutze ich AutoIt für kleinere Programme, wie einen FTP-Uploader und einen TCP-Client für das Spiel "Train Simulator".
Letzterer setzt Bewegungen von Joysticks und dessen Tasten in Befehle für das Spiel um. Jetzt bin ich dabei, einen weiteren TCP-Client zu schreiben, welcher Daten vom Spiel anzeigen soll. Mehr zu meinen Problemchen schreibe ich in einem anderen Topic.
Viele Grüße