Variable Anzahl von Bildern in einer Gui anzeigen und damit verbundene Probleme

  • Hallo.
    Ich habe hier gestern schon eine kleine Frage zu meinem Script geäußert und auf Wunsch von Oscar, der mir umbedingt bei der Fehlersuche helfen will ;) möchte ich nun mal mein script zeigen. Bis jetzt hab ich noch jedes Problem selbst gelöst, aber hier komm ich einfach nicht weiter.

    Beschreibung:
    Dem Programm geht mein PhotoImporter vorraus, der die Bilder von meiner Kamera importiert. Die Namen der importierten Bilder werden in einer txt-Datei gespeichert und sollen dann im PhotoViewer (das Programm hier) angezeigt werden.
    Aber in dieser Version wird das nicht berücksichtig und es werden nur Bilder aus dem Pics Ordner (der ist mit in der zip-Datei) geladen und angezeigt. Die Probleme stehen in der au3-Datei mit dabei.

    Wichtig:
    Bitte 3.2.11.0 Beta verwenden

    Quelltext nur zum anschauen; zum Testen bitte die angehängte Datei mit Testbildern benutzen.

    Spoiler anzeigen
    [autoit]


    ;(c)fraengers 2008
    ;AutoIt 3.2.11.0 beta
    ;PhotoViewer

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

    #cs
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    !!!!WICHTIG: AUTOIT 3.2.11.0 BETA VERWENDEN!!!!
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    PROBLEME

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

    Wenn amn den Bildern beim Laden zuschaut, wird währendessen nur die erste Reihe richtig angezeigt.
    Bei den Folgenden Reihen wir nur ein Streifen des Bildes angzeigt.In diesem Status ist es möglich
    auch die Bilder der zweiten/dritten Reihe anzuklicken und es wird auch registriert. Wenn dann alle
    Bilder geladen sind kann man die erste Bilderreihe anklicken und es passiert auch was. Wenn man die
    anderen anklickt passiert nur mit einer Chance von vielleicht 1:50 was.

    Die Funktion view() soll aufgerufen, wenn ein Bild angeklickt wurde. Diese soll dann in einem neuen
    Fenster angezeigt werden. Bei klick auf das Bild soll das Fenster wieder geschlossen werden. Bei klick
    auf den Button soll das Bild mit Photoshop geöffnent werden. Nur ich verstehe nicht, wie man das mit
    OnEvent Modus löst.

    (Scrollbar funktioniert noch nicht optimal. Hier hackt es an der Berechnung der maximalen Scrollhöhe)


    /PROBLEME
    #ce

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

    #Region######Include#############################
    #include <GUIConstantsEx.au3>
    #include <GUIScrollBars.au3>
    #include <File.au3>
    #include <Array.au3>
    #include <WindowsConstants.au3>
    #include <ScrollBarConstants.au3>
    #Include <Misc.au3>
    #EndRegion###Include#############################
    Opt("GUIOnEventMode", 1)
    #Region#####Var##################################
    Dim $pic[1000], $label[1000], $pic_date[1000], $pic_size[1000], $ar_pics[1], $show
    $run = 0
    $var_x = 0
    $var_y = 0
    ;Bildgröße
    $pic_size_x = 240
    $pic_size_y = 160
    ;Guigröße
    $gui_width = 900
    $gui_heigth = 600
    #EndRegion###Var#################################

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

    #Region#####GUI##################################
    $gui = GUICreate("PhotoViewer", $gui_width, $gui_heigth, -1, -1, BitOR($WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU))
    GUISetBkColor(0x222222);Hintergrundfarbe => Dunkelgrau
    GUISetOnEvent($GUI_EVENT_CLOSE, "close")

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

    ;###########################################################
    ;~ $destpath = IniRead(@ScriptDir & "\photoimporter.ini", "Settings", "Ziel", "NA")
    ;~ $pic_path = $destpath
    ;~ _FileReadToArray($destpath & "\imp_logfile.txt", $ar_pics)
    ;~ _ArrayDelete($ar_pics, 1)

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

    $destpath = @ScriptDir & "\pics\"
    $pic_path = $destpath
    $ar_pics = _FileListToArray($pic_path, "*.jpg", 1)
    _ArraySort($ar_pics, 0, 1)
    ;###########################################################

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

    ;~ $preview = GUICreate("Vorschau wird erstellt", 140, 35, -1, -1, $WS_POPUP + $WS_BORDER)
    ;~ $lab_preview = GUICtrlCreateLabel("Vorschau wird erstellt...", 15, 10)
    ;~ GUISetState(@SW_SHOW,$gui)
    ;~ GUISetState(@SW_SHOW,$preview)
    ;~ GUISwitch($gui)

    $pic_x = $gui_width
    $pic_y = $gui_heigth

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

    $1 = ($gui_width + 40) / ($pic_size_x + 15 + 15);40/2 = 20 ist min.abstand zum linken/rechten Rand
    $1 = StringSplit($1, ".");Wie oft passen die Bilder horizontal ins Fenster? Ergebnis wird beim , (.) zerteilt...
    $pic_xn = $1[1];...und nur die Zahl vorm , (.) wird verwendet

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

    $l_space = ((($gui_width) - (($pic_xn * ($pic_size_x + 30)) - 30)) / 2)-5;Abstand vom linken Rand wird ermittelt, um die Bilder mittig im GUI zu plazieren -5 für Scrollbar
    GUISetState()
    For $i = 1 To UBound($ar_pics)-1; Bilder und Label werden plaziert
    ;Bilder
    $pic[$i] = GUICtrlCreatePic($pic_path & $ar_pics[$i], ($l_space) + ($var_x * ($pic_size_x + 30)), 30 + ($var_y * ($pic_size_y + 40)), $pic_size_x, $pic_size_y)
    GUICtrlSetOnEvent($pic[$i], "view")
    ;Datum
    $pic_getdate = FileGetTime($pic_path & $ar_pics[$i], 1)
    If Not @error Then $pic_date[$i] = $pic_getdate[2] & "." & $pic_getdate[1] & "." & $pic_getdate[0] & " " & $pic_getdate[3] & ":" & $pic_getdate[4] & ":" & $pic_getdate[5]
    ;Größe
    $pic_getsize = FileGetSize($pic_path & $ar_pics[$i])
    $pic_size[$i] = Round($pic_getsize / 1048576, 2)
    ;Label
    $label[$i] = GUICtrlCreateLabel($ar_pics[$i] & " | " & $pic_date[$i] & " | " & $pic_size[$i] & "M", ($l_space) + ($var_x * ($pic_size_x + 30)), (40 + $pic_size_y) + ($var_y * ($pic_size_y + 40)), $pic_size_x, $pic_size_y)
    GUICtrlSetColor($label[$i], 0xffffff)
    $run = $run + 1;nicht wichtig nur zu Testzwecken
    $var_x = $var_x + 1;wenn ein Bild plaziert wurde wird var_x um 1 erhöht um dann nächste Runde das nächste Bild weiter rechts zu plazieren

    If $var_x = $pic_xn Then;wenn var_x gleich der vorher berechneten Bilderanzahl pro Reihe ist...
    $var_x = 0;... wird var_x wieder auf 0 gesetzt...
    $var_y = $var_y + 1;... und var_y um eins erhöht um in die nächste Zeile zu kommen
    EndIf
    Next

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

    #EndRegion###GUI#################################
    ;~ GUIDelete($preview)
    #Region#####SCROLLBAR############################
    GUIRegisterMsg($WM_SIZE, "WM_SIZE")
    GUIRegisterMsg($WM_VSCROLL, "WM_VSCROLL")
    GUIRegisterMsg($WM_HSCROLL, "WM_HSCROLL")

    $h = ($var_y * ($pic_size_y + 40))/15;warum? ich weis es nicht...
    _GUIScrollBars_Init($gui,0,$h)
    _GUIScrollBars_ShowScrollBar($gui, $SB_HORZ, False);Deaktiviert Horizontalscroll
    #EndRegion###SCROLLBAR###########################

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

    While 1
    Sleep(20)
    WEnd

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

    #Region#####Funktions############################
    Func view();Soll ein Fenster mit den Angeklickten Bild öffnen
    For $i = 1 To UBound($ar_pics)-1
    If @GUI_CTRLID = $pic[$i] Then
    MsgBox(0,"","Hier soll später noch ein Fenster kommen, das das angeklickte Bild in groß zeigt.")
    ;~ GUISetOnEvent($GUI_EVENT_CLOSE, "show_close")
    ;~ $show = GUICreate($ar_pics[$i], 930, 650, -1, -1, $WS_POPUP)
    ;~ GUISetOnEvent($show, "show_close")
    ;~ $show_pic = GUICtrlCreatePic($pic_path & $ar_pics[$i], 15, 15, 900, 600)
    ;~ GUICtrlSetOnEvent($show_pic, "show_close")
    ;~ GUISetBkColor(0x222222);Hintergrundfarbe => Dunkelgrau
    ;~ $btn_ps = GUICtrlCreateButton("Mit Photoshop öffnen...", 370, 620, 140, 20)
    ;~ GUICtrlSetOnEvent($btn_ps, "start_ps")
    ;~ GUISetState()
    ;~ Sleep(100)
    ;~ While 1
    ;~ Sleep(20)
    ;~ WEnd

    EndIf
    Next
    EndFunc

    ;~ Func show_close()
    ;~ GUIDelete($show)

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

    ;~ EndFunc

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

    ;~ Func start_ps()
    ;~ MsgBox(0,"Bild mit ...", "...Photoshop öffnen.")
    ;~ GUIDelete($show)
    ;~ EndFunc

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

    Func close()
    Exit
    EndFunc

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

    Func WM_SIZE($hWnd, $Msg, $wParam, $lParam)
    ...
    EndFunc ;==>WM_SIZE

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

    Func WM_HSCROLL($hWnd, $Msg, $wParam, $lParam)
    ...
    EndFunc ;==>WM_HSCROLL

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

    Func WM_VSCROLL($hWnd, $Msg, $wParam, $lParam)
    ...
    EndFunc ;==>WM_VSCROLL
    #EndRegion###Functions###########################

    [/autoit]

    P.S. Ich nehm auch gern Kritik bezüglich meines Programmierstils entgegen.

    • Offizieller Beitrag

    Fehler schon gefunden. :)

    Zeile 96:

    [autoit]


    $label[$i] = GUICtrlCreateLabel($ar_pics[$i] & " | " & $pic_date[$i] & " | " & $pic_size[$i] & "M", ($l_space) + ($var_x * ($pic_size_x + 30)), (40 + $pic_size_y) + ($var_y * ($pic_size_y + 40)), $pic_size_x, $pic_size_y)

    [/autoit]

    ändern in:

    [autoit]


    $label[$i] = GUICtrlCreateLabel($ar_pics[$i] & " | " & $pic_date[$i] & " | " & $pic_size[$i] & "M", ($l_space) + ($var_x * ($pic_size_x + 30)), (40 + $pic_size_y) + ($var_y * ($pic_size_y + 40)), $pic_size_x, 20)

    [/autoit]

    Die Label sind viel zu groß und überdecken die Bilder. Das führt dazu, dass man sie nicht mehr anklicken kann.

    Die Zeilen 79...81:

    [autoit]


    $1 = ($gui_width + 40) / ($pic_size_x + 15 + 15);40/2 = 20 ist min.abstand zum linken/rechten Rand
    $1 = StringSplit($1, ".");Wie oft passen die Bilder horizontal ins Fenster? Ergebnis wird beim , (.) zerteilt...
    $pic_xn = $1[1];...und nur die Zahl vorm , (.) wird verwendet

    [/autoit]

    kannst Du kürzen, in:

    [autoit]


    $pic_xn = Int(($gui_width + 40) / ($pic_size_x + 15 + 15));40/2 = 20 ist min.abstand zum linken/rechten Rand
    ;$1 = StringSplit($1, ".");Wie oft passen die Bilder horizontal ins Fenster? Ergebnis wird beim , (.) zerteilt... *** Zeile löschen ***
    ;$pic_xn = $1[1];...und nur die Zahl vorm , (.) wird verwendet *** Zeile löschen ***

    [/autoit]
  • Eigentlich ganz einfach wenn ich mir das so anschaue. Na viele Danke.

    Jetzt hab ich eigentlich nur noch das Problem mit dem aufrufen des neuen Fensters mit dem angeklickten Bild drin. (vgl. Z.125ff). Ich habe bis jetzt noch nicht mit dem OnEvent Sachen gearbeitet und drum auch nicht viel Ahnung.

    Aber so wie ich das sehe, kann ich in der Funktion (=> view() ) das neue Fenster nicht mit GUIMsgGet() auswerten oder?!
    Und so wie ich es versucht habe (hinter den ;~ ) , klappes es auch nicht.

    edit: ach ja und mit dem Scrollen bin ich auch noch nicht zufrieden, da mir nicht klar ist, wie ich die Länge des zu scrollenden Bereiches in Abhängigkeit der benötigten Länge bestimmen kann.

    • Offizieller Beitrag

    Das mit dem View-Fenster kannst Du auch so schreiben, dass Du ein zusätzliches GUI-Fenster erstellst und wenn ein Bild angezeigt werden soll, dann mit GUISetState($GUI_SHOW, $show) das Fenster und das Bild mit GUICtrlSetImage anzeigen lassen. Bei den OnEvent-Funktionen dann nur das Fenster wieder verstecken mit GUISetState($GUI_HIDE, $show). Für das anzeigen lassen mit Photoshop vielleicht noch der Hinweis auf ShellExecute. Schau Dir dazu mal die Hilfe-Datei an.

    Eine Lösung für das Problem mit dem Scrollbereich ist mir auch noch nicht eingefallen. Dazu habe ich mich mit den Funktionen noch zu wenig beschäftigt. Ich schreibe zur Zeit auch gerade an einem dringenden Projekt, so dass ich auch nicht all zu viel Zeit habe.

  • Woa Wahnsinn es funktioniert soweit. Ich kanns gar nicht glauben... Danke Dir. :thumbup:

    Aber ein kleines Problem hab ich noch: Und zwar das mit dem ShellExecute.
    Es wird zwar das Bild geöffnet, aber nur mit der Bild- und Faxanzeige. Ist jetzt nicht umbedingt schlecht, aber es wäre doch schön wenns mit PS geöffnent werden würde.
    Da gibts jetzt die Optionen "parameters" und "working dir" ... äh ja damit kann ich jetzt nicht viel anfangen.

    Was muss denn da rein? Oder kann ich das irgendwie rausfinden, was da rein muss (auch um dann mal andere Programme aufrufen zu können)

    edit: Habs schon geschafft :D

    Einmal editiert, zuletzt von fraengers (4. Februar 2008 um 16:33)

  • ShellExecute führt das zum Dateityp in der Registry eingetragene Stadtartprogramm aus. Das muss man in der Registry umstellen. Normalerweise habe aber solche Programme immer irgendwo ne Option das solche Dateien immer mitdiesem Programm geöffnet werden. Ändern geht im Explorer bei Extras -> Ordneroptionen -> Dateitypen Rest sollte klar sein.

    Projekte: Keine größeren (und fertigen)
    Gegen Internetzensur:
    https://epetitionen.bundestag.de/index.php?acti…s;petition=3860
    (Zeichnungsfrist abgelaufen)
    __________________________________________________________________________________________________________________________________
    Dieser Beitrag wurde bereits 264 mal editiert, zuletzt von »Fast2« (30. Februar 2009, 12:99)

  • Das hab ich mir so ähnlich schon auch gedacht.
    Aber jetzt hab ichs so gemacht:

    [autoit]

    ShellExecute("C:\Adobe\Adobe Photoshop CS2\Photoshop.exe", $Bild_xy)

    [/autoit]

    Klappt wunderbar

    • Offizieller Beitrag

    Wie Fast2 schon schrieb kann man mit ShellExecute auch die Bilder direkt aufrufen, dann wird das Standard-Bildanzeigeprogramm benutzt. So, wie Du es jetzt gemacht hast, war es aber von mir gemeint. Wenn das Script auf das Beenden des gestarteten Programms (hier: Photoshop) warten soll, dann kann man auch ShellExecuteWait benutzen. Das kann ganz hilfreich sein, wenn man das Bild mit Photoshop ändert und man dann im Script das geänderte Bild weiterverwenden will.