Problem mit dynamisch erzeugten Buttons

  • Hi,

    ich habe ein Script, welches mir die Startmenüeinträge ausließt und mir darauß dann Buttons auf einer GUI erzeugt. Funktioniert soweit auch ganz gut, bis auf das Problem, dass immer mal wieder ein Button fehlt. Ich finde aber einfach nicht den Fehler:

    Spoiler anzeigen
    [autoit]

    #include <Misc.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <Array.au3>
    $search = FileFindFirstFile(@ProgramsCommonDir & "\*.*")
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 1000, @DesktopHeight, 0, 0, BitOR($WS_POPUP, $WS_CLIPSIBLINGS))
    $anzahly = 1
    $buttonx = 10
    $buttony = -100
    While 1
    $file = FileFindNextFile($search)
    $dir = @extended
    If @error Then ExitLoop
    If StringInStr($file, ".lnk") Then
    If $anzahly < Int((@DesktopHeight - 10) / 110) Then
    $anzahly = $anzahly + 1
    $buttony = $buttony + 110
    Else
    $anzahly = 1
    $buttony = 10
    $buttonx = $buttonx + 110
    EndIf
    _lnkdetail("", $file, $buttonx, $buttony)
    ElseIf $dir = 1 Then
    $secondsearch = FileFindFirstFile(@ProgramsCommonDir & "\" & $file & "\*.*")
    $secondpfad = $file & "\"
    While 1
    $secondfile = FileFindNextFile($secondsearch)
    If @error Then ExitLoop
    If StringInStr($secondfile, ".lnk") Then
    If $anzahly < Int((@DesktopHeight - 10) / 110) Then
    $anzahly = $anzahly + 1
    $buttony = $buttony + 110
    Else
    $anzahly = 1
    $buttony = 10
    $buttonx = $buttonx + 110
    EndIf
    _lnkdetail($secondpfad, $secondfile, $buttonx, $buttony)
    EndIf
    WEnd
    EndIf
    WEnd
    FileClose($search)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    $maus = 0
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

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

    Func _lnkdetail($pfad, $file, $buttonx, $buttony)
    $details = FileGetShortcut(@ProgramsCommonDir & "\" & $pfad & $file)
    If Not StringInStr($details[0], "C:\Windows\Installer") > 0 Then
    $Button1 = GUICtrlCreateButton($file, $buttonx, $buttony, 100, 100)
    EndIf
    EndFunc ;==>_lnkdatail

    [/autoit]

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

    4 Mal editiert, zuletzt von chip (19. Oktober 2010 um 12:48)

  • hallo,

    schau doch mal bei den fehlenden buttons, wie die entsprechenden programme
    installiert wurden. evtl. ja nur für den aktuellen user anstatt für alle. vielleicht ist
    das die ursache.

  • Die ausgelesene Werte stimmen schon, nur die Erzeugung der Buttons hat einen Fehler.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Hab das ganze mal zum Spaß gekürzt.

    Edit: Alles geändert^^

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <Array.au3>
    #include "_RecursiveFileListToArray.au3"

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

    $aLnk = _RecursiveFileListToArray(@ProgramsCommonDir, 'lnk', 1)
    For $i = $aLnk[0] To 1 Step -1
    $details = FileGetShortcut($aLnk[$i])
    If Not StringInStr($details[0], @WindowsDir & "\Installer") > 0 Then _ArrayDelete($aLnk, $i)
    Next
    $aLnk[0] = UBound($aLnk) - 1
    Dim $aButton[$aLnk[0]+1] = [$aLnk[0]]
    $anzahlymax = Int((@DesktopHeight - 10) / 110)

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

    $Form1 = GUICreate("Form1", Floor($aLnk[0]/$anzahlymax)*110 + 120, @DesktopHeight, 0, 0, BitOR($WS_POPUP, $WS_CLIPSIBLINGS))
    For $i = 1 To $aLnk[0]
    $aButton[$i] = GUICtrlCreateButton(StringTrimLeft($aLnk[$i], StringInStr($aLnk[$i], "\", 0, -1)), Floor(($i-1)/$anzahlymax)*110 + 10, Mod(($i-1),$anzahlymax)*101+10, 100, 100)
    Next
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $aButton[1] to $aButton[$aButton[0]]
    MsgBox(0,"", $aLnk[$nMsg])
    EndSwitch
    WEnd

    [/autoit]

    Durch das erstellen meiner Version hab ich jetzt auchnoch deinen Fehler gefunden^^.

    Und zwar sind die leeren Stellen die Buttons die du nicht erstellst weil (Not StringInStr($details[0], "C:\Windows\Installer") > 0) False ist
    Und du aber trotzdem die Position weiterzählst.

    Übrigens hast du einige unsaubere/fehlerhafte Dinge im Script.
    Not StringInStr($details[0], "C:\Windows\Installer") > 0 ist das gleiche wie StringInStr($details[0], "C:\Windows\Installer") <= 0
    Einige includes werden nicht benötigt
    Zwei zähler für die y-Koordinate sind eigentlich einer zuviel. ($anzahly und $buttony)
    FileClose($search) macht keinen Sinn

  • Also ist zwar jetzt kürzer, allerdings werden nun die Verknüpfungen in den Ordner nichtmehr berücksichtig und nur noch die Verknüpfungen direkt im Startmenüordner angelegt.

    Ob man nun schreibt "Not StringInStr($details[0], "C:\Windows\Installer") > 0" oder "StringInStr($details[0], "C:\Windows\Installer") <= 0" macht denke ich keinen großen Unterschied ;).

    Das mit den includes ist richtig, weil in dem Script eigentlich noch eingie anderen Funktionen drin sind die ich der Übersichtheitshalber rausgenommen habe.

    Warum macht "FileClose($search)" keinen Sinn? Ich benutze sie doch auch "$search = FileFindFirstFile(@ProgramsCommonDir & "\*.*")"

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Oh ok dass FileClose auch für das Schließen des Suchhandles zuständig ist wusste ich nicht. Auch was gelernt :)
    Not > oder <= ist halt einfach eine Sache der Lesbarkeit. Wenn du damit zurechtkommst ok^^
    Aber als Außenstehender muss man da erstmal überlegen was du überhaupt machst

    Zitat

    Verknüpfungen in den Ordner nichtmehr berücksichtig


    In welchem Ordner?

    Das Problem an sich war ja nur dass er einige Buttons fehlen, bzw Leerräume entstehen.
    Und das hab ich beschrieben wieso das so ist ;)

    Edit: nur um das nochmal festzuhalten:
    Welche Version du nimmst liegt natürlich zu 100% bei dir. Ich seh meine jetzt auch nicht unbedingt als Verbesserung, sondern eher als Alternative.

  • Problem an deinem ist, dass es nichtmehr Recursive arbeitet, sprich wenn im Startmenü nun noch ein Ordner "Adobe" ist, dann werden die Verknüpfungen darin nichtmehr berrücksichtig.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Ich finde deines aber besser hehe. Habs also nun in deinem korrigiert und nun läuft es :) . Das "$aLnk[0] = UBound($aLnk) - 1" war außerhlab der Schleife.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.