_GUICtrlListView_SetColumnWidth() - keine Funktion bei Aufruf mit Array-Variabel

  • Moin Forum,

    ich habe gerade wieder ein sehr merkwürdiges Problem das ich mir nicht ganz erklären kann. Wäre super wenn da jemand nen Tipp hätte:

    Hintergrund: Ich habe ein Script mit einer ListView das ich nun um eine, eigentlich, einfache Option erweitern wollte - Das Speichern und Laden der vom Nutzer veränderten Spaltenbreite in die Registry.

    Problem: Aus einen mir unerklärlichen Grund funktioniert der Aufruf, nach auslesen der Werte aus der Registry in ein Array, von _GUICtrlListView_SetColumnWidth() zum ändern der Breite nicht.

    Noch merkwürdiger - Es wird entweder keine Änderung durchgeführt, oder jede Spalte bekommt sporadisch eine Vergrößerung mit Werten > 2000, obwohl sowohl in Registry als auch beim Auslesen der Variabel die richtigen Werte stehen. Und nun der Hammer - wenn ich statt der Array-Variabel direkt die Breite übergebe, funktioniert die Änderung ohne Probleme! 8|

    Ich habe nun schon so viel ausprobiert und sitze bereits mehrere Tage daran, dass ich nun mein Skript mittlerweile auf das absolute Minimum runtergebrochen habe.

    Ich habe nun mittlerweile sogar die Includes gegen neuere Versionen getauscht um einen vermeintlichen Bug in diesen auszuschließen.

    Der in die Registry geschriebene String für die Spaltenbreite sieht dann z.B. so aus:

    Code
    50;59;712;77;60;66;1504;124;125;260;156;227;127;165;327;354;419;321;203;509;516;313;458;569;314;150;545;178

    Habe die Reg die das Prog anlegt mal exportiert und hier angehängt: RegExport.zip

    • Offizieller Beitrag

    Es gibt häufig Probleme, wenn ein mit nativer Funktion erstelltes Control in UDF genutzt werden soll, da diese in der Regel ein Handle statt einer ID erwarten.

    _GuiCtrlListViewSetColumnWidth switcht und ruft bei Übergabe eines Handle _SendMessage($hWnd, $LVM_SETCOLUMNWIDTH, $iCol, $iWidth) und bei Übergabe einer ID GUICtrlSendMsg($hWnd, $LVM_SETCOLUMNWIDTH, $iCol, $iWidth) auf.

    Somit sollte das in beiden Fällen funktionieren. - Aber versuche es doch mal mit

    _GUICtrlListView_SetColumnWidth(GUICtrlGetHandle($ListView_Overview), ... )

  • Oha, hätte nicht gedacht das es Unterschiede beim Aufruf mit Handle oder ID gibt, immerhin wird auch in den Bsp. der Hilfe der Aufruf mit der ID durchgeführt.

    Aber, tatsächlich funktioniert es nun mit GUICtrlGetHandle() ohne Probleme! :klatschen:

    Vielen Dank für den heißen Tipp BugFix, jetzt kann ich endlich weiter machen! :thumbup:

  • Tipp1:

    Code
    if RegRead("HKEY_CURRENT_USER\Software\PCF-Doku-Tool\User-Options","Auto Read-In Data") == False Then $Switch_AutoReadInData = False
    if RegRead("HKEY_CURRENT_USER\Software\PCF-Doku-Tool\User-Options","Save ListView Width") == True Then    $Switch_SaveLVwidht = True

    Solte so auch reichen:

    Code
    $Switch_AutoReadInData = RegRead("HKEY_CURRENT_USER\Software\PCF-Doku-Tool\User-Options","Auto Read-In Data")
    $Switch_SaveLVwidht    = RegRead("HKEY_CURRENT_USER\Software\PCF-Doku-Tool\User-Options","Save ListView Width")

    Tipp2:

    Deine Zuordnung kannst du in eine Schleife packen:

    Code
    For $x = 1 To $LVwidth[0]
      _GUICtrlListView_SetColumnWidth($ListView_Overview, $x, $LVwidth[$x])
    Next

    Tipp 3:

    Unschön:

    Code
    if $Switch_SaveLVwidht == True Then $SavedLVwidth_String = RegRead("HKEY_CURRENT_USER\Software\PCF-Doku-Tool\User-Options","LV-Saved-Width")

    Besser:

    Code
    if $Switch_SaveLVwidht Then $SavedLVwidth_String = RegRead("HKEY_CURRENT_USER\Software\PCF-Doku-Tool\User-Options","LV-Saved-Width")

    Geschmackssache:

    ich hätte diese beiden getauscht (GUI erst anzeigen, wenn diese korrekt eingestellt ist):

    GUISetState(@SW_SHOW)

    _GetDataArray()

    2 Mal editiert, zuletzt von Moombas (12. März 2021 um 13:25)

  • Gofel: Klasse! Das funktioniert tatsächlich auch. Hatte erst mit Binary() und String() probiert. Aber Number() gibts ja auch und macht mehr Sinn...:S

    Moombas: Ja, ich weiß das ich nicht immer den saubersten / ordentlichsten Schreibstil beim programmieren habe. Du hast natürlich Recht, so gehts auch bzw. besser! ^^

  • Es geht ja nicht nur um "besser", ich hab mal gelernt man prüft nicht auf "True" :) Und der Rest macht es halt übersichtlicher.

    Je nach Umfang kommen sonst ettliche Zeilen zusammen, wo man schnell den Überblick verlieren kann.