Schleifenproblem

  • Hallo,

    ich habe hier mal in aller Reduziertheit mein Problem aufgeschrieben. Zur Reproduzierung ist die anliegende Datei und ein jpg notwendig. Folgendes gelingt mir nicht:

    - Case $iBild (Ansprechbarkeit des Controls, das auf Tab3 im Scrollfenster erscheint)

    ... in Verbindung mit dem Umschalten der Tabs und dem dann folgenden erneuten Anklicken des Bildes.

    Dank und Gruß
    Thomas

    Spoiler anzeigen
  • Ich hab leider nicht die Zeit um dir mehr als einen quick & dirty "hack" zu basteln ^^. Dein Problem ist, dass in der Hauptschleife schon $msg mit $iBild verglichen wird, bevor diese Variable initialisiert wurde. GUIGetMsg gibt 0 zurück, wenn kein Event registriert wurde, deswegen wird ununterbrochen der Code im "Case $iBild" Zweig ausgeführt. Folgender Code funktioniert zwar, aber ich würde dir dringend empfehlen das umzustrukturieren. Eventuell ist der OnEventMode (Opt("GUIOnEventMode", 1)) hier besser geeignet als eine Schleife mit GUIGetMsg.

    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <StructureConstants.au3>
    #include <GUIScrollBars.au3>
    #include <ScrollBarConstants.au3>
    #include "GuiScroll.au3" ; -> https://autoit.de/index.php?page…2464#post162464
    #include <ScreenCapture.au3>

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

    Global $iBild = 9999 ;Variable auf einen Wert setzen der nie angenommen wird.

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

    startGui()

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

    Func startGui()
    global $mainGui = GUIcreate("Titel", 600, 600)

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

    $tab = GUICtrlCreateTab(-1,-1,600,600)
    $tab1 = GUICtrlCreateTabItem("Tab1")
    GUICtrlSetState(-1, $GUI_SHOW)
    $tab2 = GUICtrlCreateTabItem("Tab2")
    $tab3 = GUICtrlCreateTabItem("Tab3")
    $buttonStart = GUIctrlcreatebutton("start", 10, 30,120,30)
    $tab4 = GUICtrlCreateTabItem("Tab4")
    $tab5 = GUICtrlCreateTabItem("Tab5")
    GUICtrlCreateTabItem("")

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

    GUIsetstate()

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

    $hGroup2 = GUICreate("",270,170,235,25,BitOR($WS_POPUP,$WS_BORDER,$WS_GROUP,$WS_VSCROLL,$WS_CLIPSIBLINGS),$WS_EX_MDICHILD,$mainGui)
    GUISetBkColor(0xffffff)
    GUICtrlCreateButton("Testbutton", 10, 170, 100, 25)
    Scrollbar_Create($hGroup2, $SB_VERT, 170 + 25) ; alle 3 Top-Werte (170 auch für Button und GuiCreate) einstellen um den Scrollpunkt festzulegen! +25 macht 25 Pix scrollbar
    Scrollbar_Step(10, $hGroup2, $SB_VERT)

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

    While 1
    $msg = GUIgetmsg()
    Switch $msg
    Case $tab
    If GUICtrlRead($tab, 1) = $tab3 Then
    GUISetState(@SW_SHOW, $hGroup2)
    WinActivate($mainGui)
    $iBild = _Bildvorschau($hGroup2,@ScriptDir & "\bild.jpg")
    Else
    GUISetState(@SW_HIDE, $hGroup2)
    EndIf
    Case $iBild
    MsgBox("","Button gedrückt...","")
    Case $buttonStart
    ConsoleWrite("start()")
    Case $GUI_EVENT_CLOSE
    ConsoleWrite("exit" & @CRLF)
    EndSwitch
    WEnd
    EndFunc ; ==> startGui()

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

    Func _Bildvorschau($hGui,$sImage)
    Local Const $iWidth = 100, $iHeight = 100 ; Soll-Vorschaugroesse
    Local Const $iX = 10, $iY = 10 ; x und y Abstand
    GUISwitch($hGUI)
    _GDIPlus_Startup() ;initialize GDI+
    Local $hImage = _GDIPlus_BitmapCreateFromFile($sImage)
    Local $hBitmap = _GDIPlus_ImageResize($hImage, $iWidth, $iHeight)
    Local $hHBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)

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

    $cPic = GUICtrlCreatePic("", $iX, $iY, $iWidth, $iHeight)
    GUICtrlSendMsg($cPic, 0x0172, 0, $hHBitmap)

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

    _WinAPI_DeleteObject($hHBitmap)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()
    Return $cPic
    EndFunc

    [/autoit]

    Vielleicht hat jemand anderes ja eine saubere Lösung parat ;).

  • Es sollen aber am Ende mehrere dieser Bilder geladen werden, wo jedes als "Link" dienen soll (wie Button1, 2,3...). Bin mir jetzt nicht sicher, ob ich Dich richtig verstehe...

    • Offizieller Beitrag

    Wie viele sollen denn geladen werden?
    Oder ist das keine feste Anzahl?
    In dem Fall wäre der OnEventMode besser geeignet, weil man dort eine Funktion als Event angeben kann und mit @GUI_CtrlId die entsprechende ControlID erhält.
    Beim dynamischen erstellen der Pic-Controls ist es aber immer ratsam diese auch wieder zu löschen, bevor man wieder neue erstellt. Ansonsten gibt's irgendwann einen Absturz (Anzahl der GUI-Elemente ist begrenzt).

  • Es gibt keine feste Anzahl. Größenordnung aber mal etwa 10 Stück ... Mit dem OnEventMode habe ich schon angefangen zu experimentieren. Es hakt aber immer irgendwo in Sachen Schleife, weil eine unbestimmte Anzahl an Controls, die beim Start gar nicht existieren, erst generiert werden. Alleine wenn ich das Tab umschalte und wieder zurück schalte, sollen diese Controls weiter aktiv sein...

    Deshalb bin ich nochmal auf das o.g. einfache Beispiel zurück geswitcht. Ich teste das heute Abend - auch mit der definierten Variable von name22 (->Danke!).

  • Das ist schon klar, dass ich den OnEventMode hier im Beispiel nicht benutze :) Ich wollte nur sagen, dass ich schon mehrere Anläufe - auch im OnEventMode (auch kombiniert mit dem MsgLoopMode mit ->An/Aus) und auch i.V.m. DummyControls - unternommen habe, die immer an irgendeinem Punkt gehakt haben. Alleine das Problem nach dem Umschalten (plus zurückschalten) der Tabs ...

    Ich werde aber nochmal starten ...

  • Ich nochmal... Das Hauptproblem ist nicht die Schleife an sich, sondern die Frage, wie ich das Bildbeispiel ansprechen kann. Ich habe jetzt entgegen dem Quelltext oben (->name22), den "Case $iBild" hier durch "Case 11" ersetzt. Mit der ID des Bildes (wenn ich sie so einsetze) funktioniert das immer. Man kann also nach Tab3 gehen, aufs Bild klicken, dann auf einen anderen Tab wechseln und wieder auf Tab3 gehen und Draufklicken. Wie aber kann ich da eine Variable setzen, mit der es so funktioniert? Vor allem wenn ich vorher noch mehrere Bilder mit ID, etc., in ein Array schreiben würde und z.B. einen "Case $aArray[2][3]" quasi setzen wollen würde? Die Bilder befinden sich alle innerhalb von $hGroup2.

    Ich sitze hier irgendwo auf dem Schlauch...

    Spoiler anzeigen