1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Bernhard65

Beiträge von Bernhard65

  • Automatische Scrollbar für ein GUI-Fenster

    • Bernhard65
    • 4. Januar 2020 um 13:06

    Leider stehe ich schon wieder vor einem kleinen Problem und finde die (vermutlich einfache) Lösung nicht.

    Für ein kleines Materialverwaltungsprogramm möchte ich eine Tabelle erstellen mit (theoretisch) unbegrenzte Anzahl Spalten. Dazu habe ich mir gedacht das ich ein Konfigurationsfenster erstellen mit der ich in der Tabelle Spalten hinzufügen und löschen kann.

    Als Beispiel hab ich ein kleines Programm das dies (mit Buttons) macht, jedoch mein Problem ist, das dieses Fenster (und auch Desktop) irgendwann zu klein wird. Ich möchte deshalb nicht die Fenstergröße ändern, sondern das am rechten Rand die vertikale Scrollbar 'erscheint' sobald die Objekte nicht mehr in das Fenster passen.

    Wenn ich das Fenster grösser ziehe sehe ich die erstellten Buttons, jedoch nur solange mein Desktop dafür ausreicht.

    Ich habe bei GUICreate zwar die Option $WS_VSCROLL mit angegeben, aber die bewirkt, außer dass eine Scrollbar rechts angezeigt wird, rein gar nichts.

    Geht das irgendwie anders? Irgendwie finde ich da keine Lösung.

    Mit der Suche komme ich nicht richtig weiter, entweder finde ich hunderte Einträge (die mir nicht helfen) oder gar nichts.

    Vermutlich ist das in AutiIt wieder recht simple, ich bräuchte da mal einen Tipp.

    Danke schon mal.

    AutoIt
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <Array.au3>
    
    Global $hMainGui
    Global $IDButtonLabels
    Global $aButtonIDs[0]
    
    Opt("GUIOnEventMode", 1) ; Change to OnEvent mode
    Opt("GUIResizeMode", BitOR($GUI_DOCKLEFT, $GUI_DOCKTOP, $GUI_DOCKSIZE))
    
    Start_MainGUI()
    
    While 1
        Sleep(100) ; Sleep to reduce CPU usage
    WEnd
    
    ;----------------------------------------------------------------------------------------
    
    Func Start_MainGUI()
    
        $hMainGui = GUICreate("Beispiel", 350, 200, -1, -1, BitOR($WS_SIZEBOX, $WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_VSCROLL, $WS_SYSMENU, $WS_MAXIMIZEBOX))
        GUISetOnEvent($GUI_EVENT_CLOSE, "CloseButton")
    
        GUICtrlCreateButton("Add Button", 10, 10, 90)
        GUICtrlSetOnEvent(-1, "AddButton")
        GUICtrlCreateButton("Delete Button", 110, 10, 90)
        GUICtrlSetOnEvent(-1, "DeleteButton")
        $IDButtonLabels = GUICtrlCreateLabel("Buttons:0", 10, 40)
    
        GUISetState(@SW_SHOW, $hMainGui)
    EndFunc   ;==>Start_MainGUI
    
    Func AddButton()
        $NextButton = UBound($aButtonIDs)
        _ArrayAdd($aButtonIDs, GUICtrlCreateButton("Button " & $NextButton, 10, ($NextButton * 40) + 80, 100))
        GUICtrlSetData($IDButtonLabels, "Buttons:" & $NextButton + 1)
    EndFunc   ;==>AddButton
    
    Func DeleteButton()
        Local $count = UBound($aButtonIDs)
        If $count Then
            GUICtrlDelete($aButtonIDs[$count - 1])
            _ArrayDelete($aButtonIDs, $count - 1)
            GUICtrlSetData($IDButtonLabels, "Buttons:" & $count - 1)
        EndIf
    EndFunc   ;==>DeleteButton
    
    Func CloseButton()
        GUIDelete($hMainGui)
        Exit
    EndFunc   ;==>CloseButton
    Alles anzeigen
  • Fragen zu RichEdit Control

    • Bernhard65
    • 2. Januar 2020 um 13:31

    So, bin wieder zurück und habe jetzt nochmal genau nachgeschaut.

    Ich habe Windows 7 64 Bit mit Aero aktiviert. Wenn ich Aero ausschalte ändert sich aber trotzdem nichts.

    Zur Verdeutlichung meiner Frage 1 habe ich mal ein paar Screenshots angehängt.

    Image1.jpgImage2.jpgImage3.jpgImage4.jpgImage5.jpg


    Ist zwar nicht dramatisch diese 'Eigenart', aber wenn man das irgendwie abstellen kann, wäre ich für einen Tipp dankbar.

    (Außer Windows 10 installieren. Will noch etwas warten)

  • Fragen zu RichEdit Control

    • Bernhard65
    • 28. Dezember 2019 um 23:26

    Also, ich habe Win7 64bit und Aero nicht aktiviert.

    Wird bei Prof Bernd's Lösung zu Frage 2 auch RTF formatierter Text kopiert. Das wäre für mich schon wichtig.

    Im Moment kann ich leider nichts testen, da ich ein paar Tage in Urlaub bin.

    Werde dann noch mal ausführlicher Antworten.

  • Fragen zu RichEdit Control

    • Bernhard65
    • 26. Dezember 2019 um 18:24

    Danke für die schnelle Info.

    Zu Frage 1:

    Wenn das wirklich ein Fehler ist kann man das 'irgendwo melden'?

    Zu Frage2:

    $ES_NOHIDESEL ist mir nicht aufgefallen.

    Funktioniert jetzt bei selektiertem Text sehr gut, falls der komplette Text in die Zwischenablage kopiert wird sieht das meiner Meinung nach immer noch etwas bescheiden aus.

    Zu Frage 3:

    WM_GETMINMAXINFO, Klasse genau was ich gesucht habe.


    Zitat

    Tip zum Schluß: Zum formatieren des AutoIt-Scripts kannst Du [STRG] + [t] verwenden.

    Mein Text war schon richtig formatiert. Beim Einfügen habe ich aber vermitlich irgendetwas falsch gemacht.

    Habe mich nochmal schlau gemacht und deswegen den Code im ersten Beitrag nochmal richtig formatiert eingefügt.

    (STRG-T kannte ich aber trotzdem noch nicht)

  • Fragen zu RichEdit Control

    • Bernhard65
    • 26. Dezember 2019 um 11:28

    Leider habe ich wieder mal ein paar Fragen und zwar diesmal um das RichEdit Control.

    Als Beispiel hab ich unten mal einen Code angefügt

    Bitte schaut doch mal ob ihr da noch Fehler bzw. Verbesserungen findet.

    Dies ist wieder nur ein Auszug, der Rest ist aber für meine Fragen nicht wichtig.

    Frage 1

     Zuerst eine Frage ob da nicht ein ‚Fehler‘ selbst im RichEdit Control ist.

    Wenn ihr das Beispielprogramm startet und dann mit der Bild-Runter Taste ganz nach unten scrollt ist im Anzeigefenster so ca. die Hälfte vom Text sichtbar (Zeile 82 -100). Die andere Hälfte ist leer. Scroll ich nun mit der Maus (Mausrad oder Slider am rechten Rand) langsam nach oben, springt plötzlich der Inhalt an den unteren Rand des RichEdit Fenster. Sieht irgendwie unschön aus, oder?

    Sollte die Bild-runter Taste eigentlich nur soweit springen das die letzte Textzeile am unteren Rand steht? (Geht auch mit Slider Page Down falsch)

    Frage 2

     Ich habe eine Funktion mit der ich den Text in die Zwischenablage kopiere. Falls ein Text selektiert ist nur diesen kopieren und falls kein Text selektiert ist den kompletten Text. Geht ja auch soweit, jedoch „blinkt“ der Text beim Kopieren kurz weil beim Aufrufen der Funktion ClipboardButton der Text nicht mehr selektiert ist. Beim kompletten Text muß ich zudem den Text ja erst selektieren und wieder deselektieren. Sieht man auch irgendwie als kurzes „Blinken“. Sieht auch irgendwie unschön aus.

    Frage 3

     Das Editor-Fenster soll in der Größe veränderbar sein. Habe ich mit der Funkt WM_SIZE gelöst (gefunden). Funktioniert ja soweit gut, selbst die Position der drei Buttons wird mit angepasst.

    Was aber schöner wäre, wenn man das Fenster nur bis zu einer bestimmten Größe verkleinern könnte. So kann man es ja komplett zusammenschieben. Auch irgendwie unschön.


    Ich hoffe das sind nicht zu viele Fragen auf einmal.

    Alles ja nicht wirklich gravierend, aber eventuell gibt’s auch hier bessere Lösungen.

    Danke schon mal und noch schöne Weihnachten.


    AutoIt
    #include <MsgBoxConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiRichEdit.au3>
    #include <WindowsConstants.au3>
    
    Opt("GUIOnEventMode", 1) ; Change to OnEvent mode
    
    Local $hEditorGui = GUICreate("Mini Editor", 500, 600, -1, -1, BitOR($WS_SIZEBOX, $WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU))
    GUISetOnEvent($GUI_EVENT_CLOSE, "CloseButton")
    Local $IDClipboardButton = GUICtrlCreateButton("In Zwischenablage kopieren", 10, 560, 160)
    GUICtrlSetOnEvent(-1, "ClipboardButton")
    Local $IDSaveButton = GUICtrlCreateButton("Speichern", 200, 560, 80)
    GUICtrlSetOnEvent(-1, "SaveButton")
    Local $IDCloseButton = GUICtrlCreateButton("Abbrechen", 320, 560, 80)
    GUICtrlSetOnEvent(-1, "CloseButton")
    Local $hRichEdit = _GUICtrlRichEdit_Create($hEditorGui, "", 10, 10, 480, 540, BitOR($ES_MULTILINE, $ES_WANTRETURN, $WS_VSCROLL, $WS_HSCROLL))
    
    ; Fenster mit Testzeilen füllen
    For $x = 0 To 100
        _GUICtrlRichEdit_AppendText($hRichEdit, "Zeile " & $x & ": Dies ist ein Beispieltext." & @CRLF)
    Next
    
    ; Cursorpos an den Textanfang
    _GUICtrlRichEdit_SetSel($hRichEdit, 0, 0)
    GUISetState(@SW_SHOW, $hEditorGui)
    
    ; Funktion um das Fenster bei Grössenänderung anzupassen
    GUIRegisterMsg($WM_SIZE, "WM_SIZE") ; Register the function
    
    While 1
        Sleep(100)
    WEnd
    
    
    ;------------------------------------------------------------------------------------------------------
    ;  ab hier Funktionen
    ;------------------------------------------------------------------------------------------------------
    
    ; Fenstergrösse ändern (für Editor Fenster)
    Func WM_SIZE($hWnd, $iMsg, $wParam, $lParam)
        Local $iWidth = _WinAPI_LoWord($lParam)
        Local $iHeight = _WinAPI_HiWord($lParam)
    
        If $iWidth < 400 Then
            _WinAPI_MoveWindow($hRichEdit, 10, 10, $iWidth - 20, $iHeight - 120)
            If $iWidth < 170 Then
                GUICtrlSetData($IDClipboardButton, "In Zwisch...")
                GUICtrlSetPos($IDClipboardButton, 10, $iHeight - 100, 80)
            Else
                GUICtrlSetData($IDClipboardButton, "In Zwischenablage kopieren")
                GUICtrlSetPos($IDClipboardButton, 10, $iHeight - 100, 160)
            EndIf
            GUICtrlSetPos($IDSaveButton, 10, $iHeight - 70)
            GUICtrlSetPos($IDCloseButton, 10, $iHeight - 40)
        Else
            _WinAPI_MoveWindow($hRichEdit, 10, 10, $iWidth - 20, $iHeight - 60)
            GUICtrlSetPos($IDClipboardButton, 10, $iHeight - 40)
            GUICtrlSetPos($IDSaveButton, 200, $iHeight - 40)
            GUICtrlSetPos($IDCloseButton, 320, $iHeight - 40)
        EndIf
        Return 0
    
        ;Return  $GUI_RUNDEFMSG
    EndFunc   ;==>WM_SIZE
    
    
    ; kompletten oder nur selektierten Text in Zwischenablage
    Func ClipboardButton()
        ; akt. Cursorpos merken
        Local $aPos = _GUICtrlRichEdit_GetSel($hRichEdit)
        ; Pos des Anzeigefensters merken
        $aScrollpos = _GUICtrlRichEdit_GetScrollPos($hRichEdit)
    
        If _GUICtrlRichEdit_IsTextSelected($hRichEdit) Then
            ;Text wurde selektiert und nur dieser wird kopiert
            _GUICtrlRichEdit_SetSel($hRichEdit, $aPos[0], $aPos[1])
            _GUICtrlRichEdit_Copy($hRichEdit)
        Else
            ; kompletter Text soll kopiert werden
            _GUICtrlRichEdit_SetSel($hRichEdit, 0, -1)
            _GUICtrlRichEdit_Copy($hRichEdit)
            ; alte Cursorpos wieder herstellen
            _GUICtrlRichEdit_SetSel($hRichEdit, $aPos[0], $aPos[1])
        EndIf
    
        ; Fensterausschnitt wieder herstellen
        _GUICtrlRichEdit_SetScrollPos($hRichEdit, $aScrollpos[0], $aScrollpos[1])
    EndFunc   ;==>ClipboardButton
    
    Func SaveButton()
        MsgBox($MB_OK, "INFO", "Speichern wurde gedrückt", 3, $hEditorGui)
    EndFunc   ;==>SaveButton
    
    Func CloseButton()
        Exit
    EndFunc   ;==>CloseButton
    Alles anzeigen

    Beitrag bearbeitet: Textformatierung nochmal geändert

  • OK-Button erkennen

    • Bernhard65
    • 20. Dezember 2019 um 17:32

    Super,

    genau was ich gemeint hatte.

    Danke

  • OK-Button erkennen

    • Bernhard65
    • 20. Dezember 2019 um 14:19

    Naja, das es für das Optionen-Anzeige-Fenster noch viele (bessere) Lösungen gibt (Control-Gruppen, Tab-Control...) möchte ich gar nicht bestreiten.

    Mir ging es ja eigentlich eher darum, wie man aus dem @GUI_WinHandle die enthaltenen Objekte in dem Fenster ermitteln kann, um dann Status, Texte, usw. abzufragen.

    Falls das jemand weiß, ich wäre sehr interessiert daran (ohne dass ich vorher die Obiekt-IDs alle speichern muss).


    BTW: In meinem letztem Skript habe ich natürlich noch einen Fehler in Zeile 103

    Statt

    AutoIt
    GUISetState(@SW_HIDE,@GUI_WinHandle)

    muß es natürlich

    AutoIt
    GUIDelete(@GUI_WinHandle)

    heißen.

    Sonst entstehen wirklich Speicher-Leaks.

    Habe inzwischen zu Multiple GUIs diese Seite gefunden

    https://www.autoitscript.com/wiki/Managing_Multiple_GUIs

  • OK-Button erkennen

    • Bernhard65
    • 18. Dezember 2019 um 11:02

    Ist das Problem mit dem Speicherleck wirklich so gravierend?

    Ich finde die Erstellung aller Fenster am Programmstart und dann mit SHOW und HIDE irgendwie nicht sehr elegand?

    Ich habe nämlich jetzt für das gemeinsame Optionsfenter eine Lösung gefunden:

    AutoIt
    #include <GUIConstantsEx.au3>
    #include <Array.au3>
    
    ; Beispiel-Optionen,
    Global $aOpt1[][3] = [[1,TRUE],[2,TRUE],[3,FALSE],[4,TRUE],[5,TRUE],[6,TRUE],[7,FALSE],[8,FALSE],[9,TRUE],[10,FALSE] ]
    Global $aOpt2[][3] = [[11,TRUE],[12,TRUE],[13,FALSE],[14,TRUE],[15,TRUE] ]
    Global $aOpt3[][3] = [[16,TRUE],[17,TRUE],[18,FALSE],[19,TRUE],[20,TRUE],[21,TRUE],[22,FALSE] ]
    ;Array mit allen Option-Arrays und Index welche Opt 'aktiv', -1 = keins, sonst 1 bis 3
    Global $aAll[] = [ -1, $aOpt1, $aOpt2, $aOpt3]
    
    
    Opt("GUIOnEventMode", 1)
    
    ; HauptFenster anlegen
    Local $hMainGUI = GUICreate("Beispiel", 400, 60)
    GUISetOnEvent($GUI_EVENT_CLOSE, "CloseButton")
    
    GUICtrlCreateButton("Optionen1 (1-10)", 30, 20,100)
    GUICtrlSetOnEvent(-1, "Opt1")
    
    GUICtrlCreateButton("Optionen2 (11-15)", 150, 20,100)
    GUICtrlSetOnEvent(-1, "Opt2")
    
    GUICtrlCreateButton("Optionen3 (16-22)", 270, 20,100)
    GUICtrlSetOnEvent(-1, "Opt3")
    
    GUISetState(@SW_SHOW, $hMainGUI)
    
    While 1
    Sleep(100) ; Sleep
    WEnd
    
    ;-----------------------------------------------------
    
    Func CloseButton()
    Exit
    EndFunc
    
    
    Func Opt1()
    OptionsWindow(1)
    EndFunc
    
    Func Opt2()
    OptionsWindow(2)
    EndFunc
    
    Func Opt3()
    OptionsWindow(3)
    EndFunc
    
    
    ; gemeinsames Optionen-Fenster, Fenstergrösse und Positionen werden nach Anzahl Optionen berechnet
    Func OptionsWindow($iIndex)
    
    if $iIndex >= 1 AND $iIndex < UBound($aAll) Then
    $aAll[0] = $iIndex
    Local $aOptionen = $aAll[$iIndex]
    Else
    Return
    EndIf
    
    Local $iObj = UBound($aOptionen)
    
    Local $hOptionsGUI = GUICreate("Optionen", 250,100+($iObj*20))
    GUISetOnEvent($GUI_EVENT_CLOSE, "CloseOptionsButton")
    
    GUICtrlCreateGroup("", 10, 10, 230, 30+($iObj*20))
    For $x = 0 to $iObj-1
    $aOptionen[$x][2] = GUICtrlCreateCheckbox("Option " & $aOptionen[$x][0], 20, 30 + ($x*20))	; Optionstext aus Spalte 0
    If $aOptionen[$x][1] Then GUICtrlSetState(-1,$GUI_CHECKED)					; ob Checked/Unckecked aus Spalte 1
    Next
    $aAll[$iIndex] = $aOptionen
    
    ; einen gemeinsamen Button für OK
    GUICtrlCreateButton("OK", 20, 60+($iObj*20), 80)
    GUICtrlSetOnEvent(-1, "OKOptionsButton")
    ; und einen gemeinsamen Button für Close
    GUICtrlCreateButton("Abbrechen", 150, 60+($iObj*20), 80)
    GUICtrlSetOnEvent(-1, "CloseOptionsButton")
    
    GUISetState(@SW_SHOW,$hOptionsGUI)
    EndFunc
    
    
    ; Close ist kein Problem, es müssen keine Checkboxen abgefragt werden
    Func CloseOptionsButton()		; gemeinsame CloseButton-Funktion für alle Options-Fenster
    $aAll[0] = -1							; Index zurücksetzen
    GUIDelete(@GUI_WinHandle)		; aktives Optionen-Fenster löschen
    EndFunc
    
    
    Func OKOptionsButton()
    Local $iIndex = $aAll[0]				; aktuelles Optionsfenster 1-3
    Local $aOptionen = $aAll[$iIndex]	; Array aus Array holen
    For $x = 0 to UBound($aOptionen)-1	; alle gesicherden ObjIDs durchgehen
    $aOptionen[$x][1] = _IsChecked($aOptionen[$x][2])	; und prüfen ob Checked/Unchecked
    Next
    $aAll[$iIndex] = $aOptionen			; Array in Array zurückschreiben
    
    $aAll[0] = -1								; Index zurücksetzen
    
    GUISetState(@SW_HIDE,@GUI_WinHandle)	; aktives Optionen-Fenster löschen
    EndFunc
    
    Func _IsChecked($idControlID)
    Return BitAND(GUICtrlRead($idControlID), $GUI_CHECKED) = $GUI_CHECKED
    EndFunc
    Alles anzeigen


    Funktioniert sehr gut.

    Alle Optionen werden bei OK ausgelesen und bei erneutem Aufruf sind die Optionen dementsprechend wieder gesetzt.

    Aber wenn das mit dem Speicherleck so grosse Probleme bereitet muss ich das wohl doch anders machen.

  • Array mit Arrays

    • Bernhard65
    • 18. Dezember 2019 um 10:14

    Danke BugBix,

    dein Vorschlag gefällt mir.

    Werde ich so übernehmen.

    :klatschen:

  • OK-Button erkennen

    • Bernhard65
    • 17. Dezember 2019 um 23:32

    Leider gleich noch eine Frage:

    Ich habe ein Programm wo ich viele Optionen (Checkbox) habe.

    Die Optionen habe ich in verschiedene Fenster aufgeteilt um es für den Anwender etwas übersichtlicher zu machen.

    Da die Optionen-Fenster aber immer gleich ausschauen habe ich mir gedacht dass ich eine Funktion für alle Fenster mache.

    Meine Funktion funktioniert ja eigentlich, jetzt kommt wieder das aber:

    Ich habe einen Close- und OK-Button.

    Wie erkenne ich beim OK-Button welche Optionen angezeigt wurden?

    Natürlich habe ich wieder ein Beispiel:

    AutoIt: Beispiel
    #include <GUIConstantsEx.au3>
    #include <Array.au3>
    
    ; Beispiel-Optionen,
    Global $aOpt1[][] = [[1,TRUE],[2,TRUE],[3,FALSE],[4,TRUE],[5,TRUE],[6,TRUE],[7,FALSE],[8,FALSE],[9,TRUE],[10,FALSE] ]
    Global $aOpt2[][] = [[11,TRUE],[12,TRUE],[13,FALSE],[14,TRUE],[15,TRUE] ]
    Global $aOpt3[][] = [[16,TRUE],[17,TRUE],[18,FALSE],[19,TRUE],[20,TRUE],[21,TRUE],[22,FALSE] ]
    
    
    Opt("GUIOnEventMode", 1)
    
    ; HauptFenster anlegen
    Local $hMainGUI = GUICreate("Beispiel", 400, 60)
    GUISetOnEvent($GUI_EVENT_CLOSE, "CloseButton")
    
    GUICtrlCreateButton("Optionen1 (1-10)", 30, 20,100)
    GUICtrlSetOnEvent(-1, "Opt1")
    
    GUICtrlCreateButton("Optionen2 (11-15)", 150, 20,100)
    GUICtrlSetOnEvent(-1, "Opt2")
    
    GUICtrlCreateButton("Optionen3 (16-22)", 270, 20,100)
    GUICtrlSetOnEvent(-1, "Opt3")
    
    GUISetState(@SW_SHOW, $hMainGUI)
    
    While 1
    Sleep(100) ; Sleep
    WEnd
    
    ;-----------------------------------------------------
    
    Func CloseButton()
    Exit					;Programm verlassen
    EndFunc
    
    
    Func Opt1()
    OptionsWindow("Optionen 1",$aOpt1)
    EndFunc
    
    Func Opt2()
    OptionsWindow("Optionen 2",$aOpt2)
    EndFunc
    
    Func Opt3()
    OptionsWindow("Optionen 3",$aOpt3)
    EndFunc
    
    
    ; gemeinsames Optionen-Fenster, Fenstergrösse und Positionen werden nach Anzahl Optionen berechnet
    Func OptionsWindow($sTitel,$aOptionen)
    ;_ArrayDisplay($aOptionen,"Optionen")
    Local $iObj = UBound($aOptionen)
    
    Local $hOptionsGUI = GUICreate($sTitel, 250,100+($iObj*20))
    GUISetOnEvent($GUI_EVENT_CLOSE, "CloseOptionsButton")
    
    GUICtrlCreateGroup($sTitel, 10, 10, 230, 30+($iObj*20))
    For $x = 0 to $iObj-1
    GUICtrlCreateCheckbox("Option " & $aOptionen[$x][0], 20, 30 + ($x*20))	; Optionstext aus Spalte 0
    If $aOptionen[$x][1] Then GUICtrlSetState(-1,$GUI_CHECKED)					; ob Checked/Unckecked aus Spalte 1
    Next
    
    ; einen gemeinsamen Button für OK
    GUICtrlCreateButton("OK", 20, 60+($iObj*20), 80)
    GUICtrlSetOnEvent(-1, "OKOptionsButton")
    ; und einen gemeinsamen Button für Close
    GUICtrlCreateButton("Abbrechen", 150, 60+($iObj*20), 80)
    GUICtrlSetOnEvent(-1, "CloseOptionsButton")
    
    GUISetState(@SW_SHOW,$hOptionsGUI)
    $iOptionsArrayIndex = 0
    EndFunc
    
    
    ; Close ist kein Problem, es müssen keine Checkboxen abgefragt werden
    Func CloseOptionsButton()		; gemeinsame CloseButton-Funktion für alle Options-Fenster
    GUIDelete(@GUI_WinHandle)		; aktives Optionen-Fenster löschen
    EndFunc
    
    
    Func OKOptionsButton()
    ; wie erkenne ich hier welches Options-Fenster aktiv war um die Checkboses auszulesen und ins entsprechende Arry zu schreiben?
    ; kann man den Fenster-Titel abfragen (o.ä.) und die erzeugten Opjekte (Checkboses) abfragen
    ; event. geht das irgend wie über das @GUI_WinHandle
    
    ; hier würde ich gerne die Checkboxes abfragen
    ; Anzahl Checkboxes und dazugehörige ObjektID
    
    ;~ 	For $x = 0 to UBound( $ANZAHL )
    ;~ 		$aOptionen[$x][1] = _IsChecked(  $ObjectID  )
    ;~ 	Next
    
    GUISetState(@SW_HIDE,@GUI_WinHandle)	; aktives Optionen-Fenster löschen
    EndFunc
    Alles anzeigen


    Es geht mir da um die Funktion OKOptionsButton() ganz am Ende.

    Gebt mir bitte mal einen Tip wie ich das lösen kann.

    Vermutlich gibts da ja aber auch eine ganz andere (einfachere?) Lösung.

    Danke, schon mal im vorraus.

  • Array mit Arrays

    • Bernhard65
    • 17. Dezember 2019 um 23:17

    Super,

    Danke euch beiden für die schnelle Antwort.

    D.h.:

    in meinem Beispiel ich würde das dann so schreiben:

    AutoIt
    ; Temp-Array vom ersten inneren Array erzeugen
    Global $aTemp = $aDatum[0]
    ; dies ist jetzt aber nur eine Kopie vom Array $aWochentage
    $aTemp[0][1] = "Neuer Montag"
    $aDatum[0] = $aTemp		; geändertes Temp-Array zurückschreiben

    bzw. über Return

  • Array mit Arrays

    • Bernhard65
    • 17. Dezember 2019 um 22:05

    Hallo an Alle,

    ich habe leider wieder ein kleines (Verständnis) Problem.

    Ich würde gerne ein Array mit Arrays als Inhalt erstellen.

    Funktioniert ja soweit eigentlich, aber wenn ich auf das innere Array schreiben will geht das nur über einen Funktionsaufruf mit Variable ByRef.

    Ist das die einzige Lösung?

    Ich habe früher viel in C programmiert und da geht das mit Pointer etwas einfacher...

    Schaut euch bitte mal mein Beispiel an.

    (Es ist nur ein Beispiel, ohne tieferen Sinn)

    Das Array-Tut von BugFix hab ich gelesen, aber leider greift er bei seinem Beispiel nur lesend auf das innere Array zu.

    Vermutlich geht das doch einfacher oder vielleicht gibts dafür eine UDF.

    Sorry, aber wie gesagt ich komme von C und muss mich noch etwas einarbeiten.

    Bitte um Aufklärung,

    Danke.


    AutoIt: Array mit Arrays Beispiel
    #include <Array.au3>
    
    Global $aWochentage[][] = _
    [ _
    [ 1, "Montag","Monday"], _
    [ 2, "Dienstag","Tuesday"], _
    [ 3, "Mittwoch","Wednesday"], _
    [ 4, "Donnerstag","Thursday"], _
    [ 5, "Freitag","Friday"], _
    [ 6, "Samstag","Saturday"], _
    [ 7, "Sonntag","Sunday" ] _
    ]
    
    Global $aMonate[][] = _
    [ _
    [1, "Januar","January"], _
    [2, "Februar","February"], _
    [3, "März","March"], _
    [4, "April","April"], _
    [5, "Mai","May"], _
    [6, "Juni","June"], _
    [7, "Juli","July"], _
    [8, "August","August"], _
    [9, "September","September"], _
    [10,"Oktober","October"], _
    [11,"November","November"], _
    [12,"Dezember","December"] _
    ]
    
    Global $aDatum[] = [$aWochentage,$aMonate]
    
    ; Array mit zwei Arrays
    _ArrayDisplay($aDatum,"Array mit zwei Arrays")
    
    ; Erstes innere Array
    _ArrayDisplay($aDatum[0],"Wochentage (Original)")
    
    ; Zweites innere Array
    _ArrayDisplay($aDatum[1],"Monate (Original)")
    
    ; wäre schön, geht aber nicht
    ;($aDatum[0])[0][1] = "Neuer Montag"
    
    
    ; Temp-Array vom ersten inneren Array erzeugen
    Global $aTemp = $aDatum[0]
    ; dies ist jetzt aber nur eine Kopie vom Array $aWochentage
    $aTemp[0][1] = "Neuer Montag"
    
    ; Array $aTemp hat sich geändert
    _ArrayDisplay($aTemp,"$aTemp")
    
    ; Array $aWochentage hat sich (natürlich) nicht geändert
    _ArrayDisplay($aDatum[0],"Wochentage (nicht geändert)")
    
    
    ; Wie schreib ich den nun in Array $aWochentage???
    ; Geht das nur über einen Funktionsaufruf ?
    
    Schreib_in_inneres_Array($aDatum[0])
    
    ; Array $aWochentage hat sich (natürlich) nicht geändert
    _ArrayDisplay($aDatum[0],"Wochentage (geändert)")
    
    
    
    Func Schreib_in_inneres_Array(ByRef $aArray)
    $aArray[0][1] = "Neuer Montag"
    EndFunc
    Alles anzeigen
  • Problem mit MsgBox und individuellen Tasten

    • Bernhard65
    • 4. Dezember 2019 um 10:44

    @Musashi

    Danke, der Link hilft mir schon weiter.

    Spart mir einige Sucharbeit.

  • Problem mit MsgBox und individuellen Tasten

    • Bernhard65
    • 4. Dezember 2019 um 09:51

    So, ich möchte mich nochmal melden.

    Ich habe mir jetzt den Link von autoiter genau angeschaut und muss sagen

    Wow, die UDF ExtMsgBox hat alles was mein Herz begehrt.

    Hab natürlich die alte Lösung komplett raus geschmissen und durch diese ersetzt.


    Aber warum steht den diese Funktion nicht unter den Benutzerdefinierte Funktionsreferenz?

    https://autoit.de/onlinehilfe/online/html/libfunctions.htm

    Das würde doch Sinn machen, oder?

    So habe ich eigentlich nur durch Hilfe von euch von dieser UDF erfahren.

    Ein extra Danke an autoiter für den Link und natürlich an Melba23 der diese UDF erstellt hat.

    :klatschen:

  • Problem mit MsgBox und individuellen Tasten

    • Bernhard65
    • 3. Dezember 2019 um 23:07

    Hallo Xenon,

    du bist klasse.

    Variante 2 funktioniert prima.

    Scheint mir auch die sauberere (und einfachere) Lösung zu sein.

    Ein großes DANKE von mir! :klatschen:

    autoiter

    Ich verstehe zwar nicht was du mit

    (Ich musste etwas lachen, als ich deine Selbstbeschreibung las und dann "DllCallbackRegister, _WinAPI_SetWindowsHookEx, ... Das passte nicht ganz) :)

    meinst, aber Danke für den Link mit der UDF. Das schau ich mir auf jeden Fall noch genauer an.

    Ich dachte mir schon das dieses Problem mit der MsgBox bestimmt schon mehrere hatten, aber in diesem Forum hab ich nur auf die Lösung gefunden so wie ich sie oben verwendet habe. Ich dem Link von mir oben gibt es zwar noch eine zweite Lösung von L3viathan, die hat aber auch nicht so richtig funktioniert.

    Eventuell muss ich mich halt auch öfters im englischen AutoIt Forum 'herumtreiben'.

    Danke an euch, ich bin erst mal zufrieden.:)


    Hab zwar noch ein ganz anderes Problem, schau aber erst mal ob ich es selbst lösen kann.

  • Problem mit MsgBox und individuellen Tasten

    • Bernhard65
    • 3. Dezember 2019 um 12:01

    Hallo erst mal an Alle.

    Ich bin ganz neu hier und habe seit einer Woche, nach sehr, sehr langer Zeit, mal wieder ein kleineres Programm mit AutoIt geschrieben.

    In meinem Programm wollte ich auch eine MsgBox mit individuellen Buttons haben.

    Dazu habe ich eine neue MsgBox Funktion erstellt.

    So wie hier von funkey beschrieben:

    MsgBox - Beschreibung der Buttons

    Die MsgBox funktioniert ja (eigentlich), aber sobald die neue MsgBox beendet wird sind die ersten drei Buttons meiner MainGUI auch umbeschriftet.

    Ich habe leider keine Ahnung warum das so ist?

    Wie die Routine von funkey funktioniert versteh ich leider nicht so ganz und deshalb habe ich überhaupt keine Ahnung wo da der Fehler liegt.

    Zum Testen habe ich mal ein kleines Programm erstellt wo man das wunderbar nachvollziehen kann.

    Wäre schön wenn mir mal jemand auf die Sprünge helfen könnte.

    Danke schon mal.


    Testprogramm:

    #include <MsgBoxConstants.au3>

    #include <GUIConstantsEx.au3>

    #include <WinAPI.au3>

    Opt("GUIOnEventMode", 1) ; Change to OnEvent mode

    ; HauptFenster anlegen

    Local $hMainGUI = GUICreate("Test", 200, 160)

    GUISetOnEvent($GUI_EVENT_CLOSE, "CloseButton")

    GUICtrlCreateButton("Button 1", 10, 10, 180)

    GUICtrlSetOnEvent(-1, "Button1")

    GUICtrlCreateButton("Button 2", 10, 40, 180)

    GUICtrlSetOnEvent(-1, "Button2")

    GUICtrlCreateButton("Button 3", 10, 70, 180)

    GUICtrlSetOnEvent(-1, "Button3")

    Local $IDallclose = GUICtrlCreateButton("Close", 10, 130, 180)

    GUICtrlSetOnEvent($IDallclose, "CloseButton")

    GUISetState(@SW_SHOW, $hMainGUI)

    While 1

    Sleep(100)

    WEnd


    Func Button1()

    MsgBoxNew($MB_ABORTRETRYIGNORE,"Titel", "Neue drei Tastenbox mit selbst beschriftbaren Tasten")

    EndFunc

    Func Button2()

    MsgBox($MB_OK, "","Button 2 gedrückt")

    EndFunc

    Func Button3()

    MsgBox($MB_OK, "","Button 3 gedrückt")

    EndFunc

    Func CloseButton()

    Exit

    EndFunc


    ; Tasten von MainGUI werden umbeschriftet???

    ; MsgBox - Beschreibung der Buttons

    ;

    Func MsgBoxNew($flag, $title, $text)

    Local $hProcMsgBox = DllCallbackRegister("CbtHookProcMsgBox", "int", "int;int;int")

    Local $TIDMsgBox = _WinAPI_GetCurrentThreadId()

    Global $hHookMsgBox = _WinAPI_SetWindowsHookEx($WH_CBT, DllCallbackGetPtr($hProcMsgBox), 0, $TIDMsgBox)

    Local $iRet = MsgBox($MB_ABORTRETRYIGNORE, $title, $text, 0)

    _WinAPI_UnhookWindowsHookEx($hHookMsgBox)

    DllCallbackFree($hProcMsgBox)

    Return $iRet

    EndFunc

    Func CbtHookProcMsgBox($nCode, $wParam, $lParam)

    Local $RET = 0, $hBitmap = 0, $xWnd = 0

    If $nCode < 0 Then

    $RET = _WinAPI_CallNextHookEx($hHookMsgBox, $nCode, $wParam, $lParam)

    Return $RET

    EndIf

    Switch $nCode

    Case 5 ;5=HCBT_ACTIVATE

    _WinAPI_SetDlgItemText($wParam, 3, "Ja")

    _WinAPI_SetDlgItemText($wParam, 4, "Nein")

    _WinAPI_SetDlgItemText($wParam, 5, "Vielleicht")

    EndSwitch

    Return

    EndFunc ;==>CbtHookProcMsgBox

    Func _WinAPI_SetDlgItemText($hDlg, $nIDDlgItem, $lpString)

    Local $aRet = DllCall('user32.dll', "int", "SetDlgItemText", "hwnd", $hDlg, "int", $nIDDlgItem, "str", $lpString)

    Return $aRet[0]

    EndFunc ;==>_WinAPI_SetDlgItemText

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™