Hallo,
ich möchte die Spaltenbreite aus einer .ini-Datei lesen und am Ende des Programms wieder dahin schreiben. Soweit funktioniert auch alles. Aber _GUICtrlListView_SetColumnWidth will nicht so, wie ich will
Schreibe ich den Wert als Zahl hinein, so funktioniert es einwandfrei. Kommt der Wert aus einer Variablen (in dem Fall ein Array) spinnt es rum. Bei jedem Aufruf ist die Spalte unterschiedlich breit - obwohl der Wert im Array stimmt.
Anbei ein Minimalbeispiel, bei dem sich der Fehler reproduzieren läßt (einfach öfter aufrufen und die Breite der ID beobachten - und parallel dazu die Einträge in der .ini) - sqlite.dll ist erforderlich, alles andere wird angelegt
Es wäre schön, wenn jemand eine Idee hätte, an was das liegt.
Danke an alle, die sich damit beschäftigen.
#include <Array.au3>
#include <SQLite.au3>
#include <WindowsConstants.au3>
#include <GUIConstants.au3>
#include <GUIListView.au3>
Opt("MustDeclareVars", 1)
__Start()
Exit
Func __Start()
Local $hDB ; Handle für die Datenbank
Local $aResult, $iRows, $iColumns
Local $sListViewText = ""
Local $idMainGUI
Local $idListView, $ListViewID
Local $aColumnWidth[0]
Local $aFenstergroesse = __Fenstergroesse() ; liest die Daten für die Fenstergröße
; _ArrayDisplay($aFenstergroesse)
Local $sNameDB = 'Daten.sqlite'
_SQLite_Startup()
If @error Then Return MsgBox(0, '_SQLite_Startup', '@error: ' & @error & @CRLF & '@extended: ' & @extended) * 0
If FileExists($sNameDB) Then
$hDB = _SQLite_Open($sNameDB)
If @error Then Return MsgBox(0, '_SQLite_Open', '@error: ' & @error & @CRLF & '@extended: ' & @extended) * 0
Else
$hDB = _SQLite_Open($sNameDB) ; erstellt die DB
If @error Then Return MsgBox(0, '_SQLite_Open', '@error: ' & @error & @CRLF & '@extended: ' & @extended) * 0
; SQLite-Anweisung muß in einer Zeile erfolgen
_SQLite_Exec($hDB, 'CREATE TABLE Kunden (ID INTEGER PRIMARY KEY AUTOINCREMENT, Kundennummer TEXT, Firma TEXT, Name TEXT, Vorname TEXT, StrasseNr TEXT, PLZ TEXT, Ort TEXT, Telefon TEXT, EMail TEXT, Homepage TEXT, Anrede TEXT, Land TEXT);')
EndIf
_SQLite_GetTable2d($hDB, 'Select * FROM Kunden; ', $aResult, $iRows, $iColumns) ; liest die Daten aus der DB
If @error Then Return MsgBox(0, '_SQLite_GetTable2d', '@error: ' & @error & @CRLF & '@extended: ' & @extended) * 0
For $iC = 0 To $iColumns - 1 ; die Spaltenüberschriften
$sListViewText &= $aResult[0][$iC] & '|'
Next
$idMainGUI = GUICreate('Datenbank', $aFenstergroesse[2], $aFenstergroesse[3], $aFenstergroesse[0], $aFenstergroesse[1], $WS_SIZEBOX)
$idListView = GUICtrlCreateListView($sListViewText, 0, 30, ($aFenstergroesse[2]) - 2, ($aFenstergroesse[3]) / 2)
GUISetState(@SW_SHOW, $idMainGUI)
For $iR = 1 To $iRows
For $iC = 0 To $iColumns - 1
$ListViewID &= $aResult[$iR][$iC] & '|'
Next
GUICtrlCreateListViewItem($ListViewID, $idListView)
Next
For $i = 0 To $iColumns - 1 ; liest die Spaltenbreite
_ArrayAdd($aColumnWidth, IniRead(@ScriptDir & '\Daten.ini', 'Listview', $i, 70))
If @error Then MsgBox(0, '_ArrayAdd', '@error: ' & @error & @CRLF & '@extended: ' & @extended)
Next
If IsArray($aColumnWidth) Then
; _ArrayDisplay($aColumnWidth) ; die gelesenen Werte stimmen
Else
MsgBox(0, '', '$aColumnWidth ist kein Array', 1)
Return 0
EndIf
; hier sollte die Spaltenbreite gesetzt werden
If Not _GUICtrlListView_SetColumnWidth($idListView, 0, $aColumnWidth[0]) Then MsgBox(0, '_GUICtrlListView_SetColumnWidth', 'ID', 1)
; so geht es
; If Not _GUICtrlListView_SetColumnWidth($idListView, 0, 55) Then MsgBox(0, '_GUICtrlListView_SetColumnWidth', 'ID', 1)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
For $i = 0 To _GUICtrlListView_GetColumnCount($idListView) - 1 ; speichert die Spaltenbreiten in der .ini
If IniWrite(@ScriptDir & '\Daten.ini', 'Listview', $i, _
_GUICtrlListView_GetColumnWidth($idListView, $i)) <> 1 Then _
MsgBox(0, 'IniWrite', 'Fehler beim Schreiben der ' & $i & ' .ten Spalte', 1)
Next
ExitLoop
EndSwitch
WEnd
$aFenstergroesse = WinGetPos('Datenbank')
__FensterDatenSchreiben($aFenstergroesse) ; speichern der Fensterdaten in der .ini
GUIDelete()
_SQLite_Close()
If @error Then Return MsgBox(0, '_SQLite_Close', '@error: ' & @error & @CRLF & '@extended: ' & @extended) * 0
_SQLite_Shutdown()
If @error Then Return MsgBox(0, '_SQLite_Shutdown', '@error: ' & @error & @CRLF & '@extended: ' & @extended) * 0
Return 1
EndFunc ;==>__Start
Func __Fenstergroesse()
Local $aFenstergroesse[4]
Local $sIniDatei = @ScriptDir & '\Daten.ini'
If FileExists($sIniDatei) Then
$aFenstergroesse[0] = IniRead($sIniDatei, 'Fenster', 'X', 0)
$aFenstergroesse[1] = IniRead($sIniDatei, 'Fenster', 'Y', 0)
$aFenstergroesse[2] = IniRead($sIniDatei, 'Fenster', 'Breite', -1)
$aFenstergroesse[3] = IniRead($sIniDatei, 'Fenster', 'Hoehe', -1)
Else
$aFenstergroesse[0] = -1
$aFenstergroesse[1] = -1
$aFenstergroesse[2] = 1200
$aFenstergroesse[3] = 700
EndIf
Return $aFenstergroesse
EndFunc ;==>__Fenstergroesse
Func __FensterDatenSchreiben($aFenstergroesse)
Local $sIniDatei = @ScriptDir & '\Daten.ini'
If IniWrite($sIniDatei, 'Fenster', 'X', $aFenstergroesse[0]) <> 1 Then _
Return MsgBox(0, '__FensterDatenSchreiben', 'Fehler beim Schreiben der X-Position') * 0
If IniWrite($sIniDatei, 'Fenster', 'Y', $aFenstergroesse[1]) <> 1 Then _
Return MsgBox(0, '__FensterDatenSchreiben', 'Fehler beim Schreiben der Y-Position') * 0
If IniWrite($sIniDatei, 'Fenster', 'Breite', $aFenstergroesse[2] - 14) <> 1 Then _
Return MsgBox(0, '__FensterDatenSchreiben', 'Fehler beim Schreiben der Fensterbreite') * 0
If IniWrite($sIniDatei, 'Fenster', 'Hoehe', $aFenstergroesse[3] - 14) <> 1 Then _
Return MsgBox(0, '__FensterDatenSchreiben', 'Fehler beim Schreiben der Fensterhöhe') * 0
Return 1
EndFunc ;==>__FensterDatenSchreiben
Alles anzeigen