_GUICtrlListView_SetColumnWidth und Array

  • 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.

  • Setze Int() vor _GUICtrlListView_SetColumnWidth:

    [autoit]

    #include <Array.au3>
    #include <SQLite.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstants.au3>
    #include <GUIListView.au3>

    [/autoit][autoit][/autoit][autoit]

    Opt("MustDeclareVars", 1)

    [/autoit][autoit][/autoit][autoit]

    __Start()
    Exit

    [/autoit][autoit][/autoit][autoit]

    Func __Start()

    [/autoit][autoit][/autoit][autoit]

    Local $hDB ; Handle für die Datenbank
    Local $aResult, $iRows, $iColumns
    Local $sListViewText = ""
    Local $idMainGUI
    Local $idListView, $ListViewID
    Local $aColumnWidth[0]

    [/autoit][autoit][/autoit][autoit]

    Local $aFenstergroesse = __Fenstergroesse() ; liest die Daten für die Fenstergröße
    ; _ArrayDisplay($aFenstergroesse)
    Local $sNameDB = 'Daten.sqlite'

    [/autoit][autoit][/autoit][autoit]

    _SQLite_Startup()
    If @error Then Return MsgBox(0, '_SQLite_Startup', '@error: ' & @error & @CRLF & '@extended: ' & @extended) * 0

    [/autoit][autoit][/autoit][autoit]

    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

    [/autoit][autoit][/autoit][autoit]

    _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

    [/autoit][autoit][/autoit][autoit]

    For $iC = 0 To $iColumns - 1 ; die Spaltenüberschriften
    $sListViewText &= $aResult[0][$iC] & '|'
    Next

    [/autoit][autoit][/autoit][autoit]

    $idMainGUI = GUICreate('Datenbank', $aFenstergroesse[2], $aFenstergroesse[3], $aFenstergroesse[0], $aFenstergroesse[1], $WS_SIZEBOX)
    $idListView = GUICtrlCreateListView($sListViewText, 0, 30, ($aFenstergroesse[2]) - 2, ($aFenstergroesse[3]) / 2)

    [/autoit][autoit][/autoit][autoit]

    For $iR = 1 To $iRows
    For $iC = 0 To $iColumns - 1
    $ListViewID &= $aResult[$iR][$iC] & '|'
    Next
    GUICtrlCreateListViewItem($ListViewID, $idListView)
    Next

    [/autoit][autoit][/autoit][autoit]

    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

    [/autoit][autoit][/autoit][autoit]

    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, int($aColumnWidth[0])) Then MsgBox(0, '_GUICtrlListView_SetColumnWidth', 'ID', 1)
    ConsoleWrite(_GUICtrlListView_GetColumnWidth($idListView, 0)&@crlf)
    ; so geht es
    ; If Not _GUICtrlListView_SetColumnWidth($idListView, 0, 55) Then MsgBox(0, '_GUICtrlListView_SetColumnWidth', 'ID', 1)
    GUISetState(@SW_SHOW, $idMainGUI)
    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

    [/autoit][autoit][/autoit][autoit]

    $aFenstergroesse = WinGetPos('Datenbank')
    __FensterDatenSchreiben($aFenstergroesse) ; speichern der Fensterdaten in der .ini
    GUIDelete()

    [/autoit][autoit][/autoit][autoit]

    _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

    [/autoit][autoit][/autoit][autoit]

    Return 1

    [/autoit][autoit][/autoit][autoit]

    EndFunc ;==>__Start

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func __Fenstergroesse()

    [/autoit][autoit][/autoit][autoit]

    Local $aFenstergroesse[4]
    Local $sIniDatei = @ScriptDir & '\Daten.ini'

    [/autoit][autoit][/autoit][autoit]

    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

    [/autoit][autoit][/autoit][autoit]

    Return $aFenstergroesse

    [/autoit][autoit][/autoit][autoit]

    EndFunc ;==>__Fenstergroesse

    [/autoit][autoit][/autoit][autoit]

    Func __FensterDatenSchreiben($aFenstergroesse)

    [/autoit][autoit][/autoit][autoit]

    Local $sIniDatei = @ScriptDir & '\Daten.ini'

    [/autoit][autoit][/autoit][autoit]

    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

    [/autoit][autoit][/autoit][autoit]

    EndFunc ;==>__FensterDatenSchreiben

    [/autoit]
  • Ein Blick in die Hilfe zu IniRead bringt die Aufklärung warum explizit eine Umwandlung nötig ist: