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. xTcisloVe

Beiträge von xTcisloVe

  • Skalierende Message Box

    • xTcisloVe
    • 8. Juli 2018 um 18:03
    Zitat von autoiter

    Nein.

    Du kannst mit _ArraySearch den Index ermitteln und mit SetExtended zurückgeben (Return SetExtended(Index, Text). @extended dient im aufrufenden Skript um die Rückgabe des extended-Wertes abzufragen.

    Führe mal folgenden Code aus:

    Code
    $Text = SetExtended(10, "Test-Text")
    
    MsgBox(0, "Inhalt der Variable $Text = " & $Text, "@extended = " & @extended)

    Dann wäre im Fall von Button 1 ja

    Code
    switch @extended
        case 10 ;-> = Button 1 pressed.
    
    .....
    
    switch $Text
        case "Test-Text" ;-> = Button 1 pressed.
    ....


    Oder irre ich?

    Ich mein das ist auch aktuell nicht mein problem...

    Wenn ich button 1 drücke wie bekomme ich den return code 1?

    Code
    While 1
        $Msg = GUIGetMsg()
            Switch $Msg
                Case $GUI_EVENT_CLOSE
                    GUIDelete($hGUI)
                    Return -888888
    
                Case $Btn_Start To $Btn_End
                    GUIDelete($hGUI)
                    local $aIndex = StringSplit($Buttons, ",")
                    Dim $bIndex[($aIndex[0] + 1)]
                    For $i = 1 To $bIndex[0]
                        $x = $i
                    Next
                        Return $x
    
            EndSwitch
    Alles anzeigen


    Das war mein letzter versuch aber das klappt halt nicht :D

  • Skalierende Message Box

    • xTcisloVe
    • 8. Juli 2018 um 16:08
    Zitat von alpines

    Deine anderen Cases werden niemals eintreten da die Switch-Anweisung immer (und ohne Ausnahme) in den 1. Case reinspringen wird.

    Wenn du nicht weißt was wir mit @extended meinen guck dir einfach mal die Funktion SetExtended in der Hilfe an.

    Wollte mit der Funktion oben nur schauen welchen Wert ich erhalte :D

    Ich habe gerade probleme damit den richtigen Rückgabewert überhaupt zu erhalten, keine ahnung wie ich den array erstellen soll oder ob ich ihn brauche... bastel seit 1 stunde an ner for schelife dafür aber klappt nicht :D

    Ich könnte doch mit _ArraySearch den SetExtended(z.B 1) machen je nach Button und dann Return @extended ?

    Aber ich komme gerade nicht dahinter

  • Skalierende Message Box

    • xTcisloVe
    • 8. Juli 2018 um 15:12
    Zitat von autoiter

    Oder gib beides zurück. Schau dir mal SetError an.

    Stett Return $Return könntest du Return SetError(0, $iIndex, $Return) zurückgeben. @error wäre hier Null, @extended könnte der Index sein und $Return weiterhin der Text.

    Zitat von alpines

    Daran dachte ich auch, aber realistisch gesehen braucht man ja keinen String zurückzugeben.

    Wenn man keinen Errorcode setzen will sollte man aber lieber der Form halber SetExtended nehmen (auch wenn da kein großer Unterschied ist).


    Ich verstehe gerade nicht was ihr meint aber mein Problem habe ich "gelöst" :D :D

    Gefällt mir aber nicht

    C
    #include <GUIconstants.au3>
    #include <GUIConstantsEx.au3>
    #include <Array.au3>
    #include "StringSize.au3"
    
    Example()
    exit
    
    Func Example()
    $PressedButton = _sMsgBox("Title", "Yes,No,3,4,5,6,7,8,9,10", 30, Default, 10, "This is Line 1" & @LF & @LF & "This is Line 3", 6)
            Switch $PressedButton
                case $PressedButton ;--> Any button pressed.
                    MsgBox(0, "You pressed: " & $PressedButton, "You pressed: " & $PressedButton, 10)
                case -999999 ;--> Timer expired.
                    MsgBox(0, "You pressed: " & $PressedButton, "Timer expired", 10)
                case -888888 ;--> Message Box closed with x.
                    MsgBox(0, "You pressed: " & $PressedButton, "GUI closed with X", 10)
            EndSwitch
    EndFunc
    
    Func _sMsgBox($Title, $Buttons, $Button_Width, $Button_Height, $Button_Seperator, $Label_Text, $TimeOut)
        if $Buttons = "" Then
            MsgBox(0, "ERROR", "ERROR - No Button defined.")
            Return "ERROR"
        EndIf
    
        If $Title = Default Or $Title = "" Then $Title = "Title"
    
        If $Button_Width = Default Or $Button_Width = "" Then $Button_Width= 100
    
        If $Button_Height = Default Or $Button_Height = "" Then $Button_Height= 30
    
        If $Button_Seperator = Default Or $Button_Seperator = "" Then $Button_Seperator= 15
    
        If $TimeOut = Default Or $TimeOut = "" Then $TimeOut= 0
    
        If $TimeOut <> 0 Then
            local $Timer=TimerInit()
            local $Time=TimerInit()
            local $CurrentTimer = $TimeOut-1, $CurrentTimerTemp
        EndIf
    
        local $aButtons = StringSplit($Buttons, ",")
        Dim $Button_[($aButtons[0] + 1)]
    
        $Button_[1] = $Button_Seperator
        Local $GUI_Width_Math = $Button_[1]
    
        For $i = 1 To $aButtons[0]
            $Button_[$i] = $Button_Width+$Button_[$i-1]+$Button_Seperator
            $GUI_Width_Math = $Button_[$i]
        Next
    
        local $GUI_Width = $GUI_Width_Math+$Button_Seperator
    
        Local $Max_Label_Width = $GUI_Width-$Button_Seperator
        local $Label_StringSize = _StringSize($Label_Text, Default, Default, Default, Default, $Max_Label_Width)
        Local $Label_Width = $Label_StringSize[2]
        Local $Label_Height = $Label_StringSize[3]
        Local $GUI_Height = $Button_Seperator+$Label_Height+$Button_Seperator+$Button_Height+$Button_Seperator
        Local $Button_Top = $Button_Seperator+$Label_Height+$Button_Seperator
    
    
        Dim $GUI_Button_[($aButtons[0] + 1)]
    
        local $hGUI = GUICreate($Title, $GUI_Width, $GUI_Height)
        GUISetStyle(BitOR($WS_CAPTION, $WS_POPUPWINDOW) )
    
        GUICtrlCreateLabel($Label_StringSize[0], $Button_Seperator, $Button_Seperator, $Label_StringSize[2], $Label_StringSize[3])
    
        local $ButtonMath = $Button_Seperator
        $Btn_Start = GUICtrlCreateDummy()
    
        For $i = 1 To $aButtons[0]
            $x = $ButtonMath
            $GUI_Button_[$i] = GUICtrlCreateButton($aButtons[$i], $x, $Button_Top, $Button_Width, $Button_Height)
            $ButtonMath = $x + $Button_Width + $Button_Seperator
        Next
        $Btn_End = GUICtrlCreateDummy()
        GUISetState ()
    
        While 1
        $Msg = GUIGetMsg()
            Switch $msg
                Case $GUI_EVENT_CLOSE
                    GUIDelete($hGUI)
                    Return -888888
    
                Case $Btn_Start To $Btn_End
                    GUIDelete($hGUI)
                    Return $msg - 4
    
            EndSwitch
        If $TimeOut <> 0 Then
            If TimerDiff($Timer) >= $TimeOut*1000 then
                GUIDelete($hGUI)
                Return -999999
            Else
                If TimerDiff($Time) >= 1000 then
                    WinSetTitle($hGUI, "", "[" & $CurrentTimer & "] - " & $Title)
                    $CurrentTimerTemp = $CurrentTimer
                    $CurrentTimer = $CurrentTimerTemp-1
                    $Time=TimerInit()
                EndIf
            EndIf
        EndIf
        Wend
    EndFunc
    ;;;;;;;;;;AUTHOR: XTCISLOVE;;;;;;;;;;
    Alles anzeigen
  • Skalierende Message Box

    • xTcisloVe
    • 8. Juli 2018 um 14:40
    Zitat von alpines

    Setzen wenn du reinkommst und wiederherstellen wenn du rauskommst. Ich weiß allerdings nicht ob für Events registrierte Funktionen ihre Gültigkeit verlieren wenn du den OnEventMode rausnimmst und wieder aktivierst.

    Werde ich mir mal ansehen müssen.

    Zitat von alpines

    Ich habs ohne zu testen einfach in den Foreneditor getippt. Was meinst du denn mit falsch anordnen?

    Die Texte die in den Buttons stehen sind doch egal, du willst nur herausfinden ob nach einem leeren Button ein nichtleerer Button kommt und dann sofort abbrechen.

    Und das Array prüft nur von links nach rechts durch, die Anordnung in dem Array soll so bleiben wie sie ist.

    Da hast du recht, fällt aber jetzt flach.

    Zitat von alpines

    Ja wenn du es richtig formuliert hättest und die die Fälle rausnimmst die nicht erlaubt sind dann bräuchtest du das auch nicht, und so macht man es für gewöhnlich.

    Wollte ich erst, klang aber komplizierter :D


    Ich brauche das jetzt nicht mehr, da ich jetzt dynamische Buttons habe.

    Aktuell ist es aber so, das ich den Button Namen returne, den der User festgelegt hat. Also wenn er "Yes" drückt dann kommt "Yes" zurück.

    Das würde ich gerne anders gestalten.


    C
    #include <GUIconstants.au3>
    #include <GUIConstantsEx.au3>
    #include <Array.au3>
    #include "StringSize.au3"
    
    Example()
    exit
    
    Func Example()
    $PressedButton = _sMsgBox("Title", "Yes,No,Button 3,Button 4", Default, Default, Default, "This is Line 1" & @LF & @LF & "This is Line 3", 10)
            Switch $PressedButton
                case "Yes" ;--> Button 1 pressed.
                    MsgBox(0, "You pressed: " & $PressedButton, "You pressed: " & $PressedButton, 10)
                case "No" ;--> Button 2 pressed.
                    MsgBox(0, "You pressed: " & $PressedButton, "You pressed: " & $PressedButton, 10)
                case "Button 3" ;--> Button 3 pressed.
                    MsgBox(0, "You pressed: " & $PressedButton, "You pressed: " & $PressedButton, 10)
                case "Button 4" ;--> Button 4 pressed.
                    MsgBox(0, "You pressed: " & $PressedButton, "You pressed: " & $PressedButton, 10)
                case -999999 ;--> Timer expired.
                    MsgBox(0, "You pressed: " & $PressedButton, "Timer expired", 10)
                case -888888 ;--> Message Box closed with x.
                    MsgBox(0, "You pressed: " & $PressedButton, "GUI closed with X", 10)
            EndSwitch
    EndFunc
    
    Func _sMsgBox($Title, $Buttons, $Button_Width, $Button_Height, $Button_Seperator, $Label_Text, $TimeOut)
        if $Buttons = "" Then
            MsgBox(0, "ERROR", "ERROR - No Button defined.")
            Return "ERROR"
        EndIf
    
        If $Title = Default Or $Title = "" Then $Title = "Title"
    
        If $Button_Width = Default Or $Button_Width = "" Then $Button_Width= 100
    
        If $Button_Height = Default Or $Button_Height = "" Then $Button_Height= 30
    
        If $Button_Seperator = Default Or $Button_Seperator = "" Then $Button_Seperator= 15
    
        If $TimeOut = Default Or $TimeOut = "" Then $TimeOut= 0
    
        If $TimeOut <> 0 Then
            local $Timer=TimerInit()
            local $Time=TimerInit()
            local $CurrentTimer = $TimeOut-1, $CurrentTimerTemp
        EndIf
    
        local $aButtons = StringSplit($Buttons, ",")
        Dim $Button_[($aButtons[0] + 1)]
    
        $Button_[1] = $Button_Seperator
        Local $GUI_Width_Math = $Button_[1]
    
        For $i = 1 To $aButtons[0]
            $Button_[$i] = $Button_Width+$Button_[$i-1]+$Button_Seperator
            $GUI_Width_Math = $Button_[$i]
        Next
    
        local $GUI_Width = $GUI_Width_Math+$Button_Seperator
    
        Local $Max_Label_Width = $GUI_Width-$Button_Seperator
        local $Label_StringSize = _StringSize($Label_Text, Default, Default, Default, Default, $Max_Label_Width)
        Local $Label_Width = $Label_StringSize[2]
        Local $Label_Height = $Label_StringSize[3]
        Local $GUI_Height = $Button_Seperator+$Label_Height+$Button_Seperator+$Button_Height+$Button_Seperator
        Local $Button_Top = $Button_Seperator+$Label_Height+$Button_Seperator
    
    
        Dim $GUI_Button_[($aButtons[0] + 1)]
    
        local $hGUI = GUICreate($Title, $GUI_Width, $GUI_Height)
        GUISetStyle(BitOR($WS_CAPTION, $WS_POPUPWINDOW) )
    
        GUICtrlCreateLabel($Label_StringSize[0], $Button_Seperator, $Button_Seperator, $Label_StringSize[2], $Label_StringSize[3])
    
        local $ButtonMath = $Button_Seperator
        $Btn_Start = GUICtrlCreateDummy()
    
        For $i = 1 To $aButtons[0]
            $x = $ButtonMath
            $GUI_Button_[$i] = GUICtrlCreateButton($aButtons[$i], $x, $Button_Top, $Button_Width, $Button_Height)
            $ButtonMath = $x + $Button_Width + $Button_Seperator
        Next
        $Btn_End = GUICtrlCreateDummy()
        GUISetState ()
    
        While 1
        $Msg = GUIGetMsg()
            Switch $msg
                Case $GUI_EVENT_CLOSE
                    GUIDelete($hGUI)
                    Return -888888
    
                Case $Btn_Start To $Btn_End
                    local $Return = GUICtrlRead($Msg)
                    GUIDelete($hGUI)
                    Return $Return
    
            EndSwitch
        If $TimeOut <> 0 Then
            If TimerDiff($Timer) >= $TimeOut*1000 then
                GUIDelete($hGUI)
                Return -999999
            Else
                If TimerDiff($Time) >= 1000 then
                    WinSetTitle($hGUI, "", $Title & " - [" & $CurrentTimer & "] ")
                    $CurrentTimerTemp = $CurrentTimer
                    $CurrentTimer = $CurrentTimerTemp-1
                    $Time=TimerInit()
                EndIf
            EndIf
        EndIf
        Wend
    EndFunc
    ;;;;;;;;;;AUTHOR: XTCISLOVE;;;;;;;;;;
    Alles anzeigen
  • Skalierende Message Box

    • xTcisloVe
    • 8. Juli 2018 um 09:40
    Zitat von alpines

    Dein UDF-Header sieht ein wenig merkwürdig aus, es wäre schöner wenn du ihn einheitlich gestaltest. Du verwendest nämlich die Standardmethode und dann noch was von dir.

    Statt den Author oben reinzuschreiben gehört er eigentlich in das Author-Feld.

    Aber das sind ja keine funktionalen Sachen, also gehen wir mal dahin:

    AutoIt
    MsgBox(0, "ERROR", "ERROR - Button 1 undefined or no button defined.", 10)

    Dein UDF zeigt MsgBoxen mit einem Timeout an wenn ein Fehler passiert ist, aber du sagst nirgends in deiner UDF oder bietest dem Programmierer die Möglichkeit den Timeout anzupassen ggf. wegzulassen.

    Das kann eventuell zu Inkonsistenzen im Programmworkflow führen, wenn der Programmierer davon ausgeht, dass der User die Nachricht wegklickt aber sie von alleine verschwindet etc.

    AutoIt
    Local $ErrorHandle1 = 1
    Local $ErrorHandle2 = 1
    Local $ErrorHandle3 = 1
    Local $ErrorHandle4 = 1
    if $Button_2 = "" Then Local $ErrorHandle1 = 0
    if $Button_3 = "" Then Local $ErrorHandle2 = 0
    if $Button_4 = "" Then Local $ErrorHandle3 = 0
    if $Button_5 = "" Then Local $ErrorHandle4 = 0
    local $ErrorHandle = $ErrorHandle1 & $ErrorHandle2 & $ErrorHandle3 & $ErrorHandle4
    Switch $ErrorHandle
        case "0000", "1111", "1000", "1100", "1110"
            sleep(200)
        case Else
        MsgBox(0, "ERROR", "You, messed up button order, try again.", 10)
        Return "ERROR"
    EndSwitch
    Alles anzeigen

    Deine Abfrage "0000" ist redundant, da dieser Fall niemals eintreten kann (siehe If-Verzweigung vorher).

    Das Sleep ist ebenfalls unnötig, du bremst damit nur das Skript aus, wenn du unbedingt das Konstrukt beibehalten willst lass die Zeile frei.

    Du returnst bei diesem Fehler "ERROR" aber bei dem Fehler davor war es "Error", das ist ebenfalls nicht gut, standardisiere deine Rückgaben oder verwende gleich SetError.

    Damit kannst du einfach 0 zurückgeben und im Error-Code die Fehlermeldung codieren.

    Du hättest das ganze schöner in einer For-Schleife zusammenfassen können, etwa so:

    AutoIt
    Local $aButtons[] = [$Button_2, $Button_3, $Button_4, $Button_5], $bError = False
    
    For $i = 0 To UBound($aButtons) - 2
        If $aButtons[$i] = "" Then
            For $j = $i + 1 To UBound($aButtons) - 1
                If $aButtons[$j] <> "" Then
                    $bError = True
                    ExitLoop 2
                EndIf
            Next
        EndIf
    Next
    Alles anzeigen

    Einfach die Texte in ein Array schreiben und durchlaufen, findest du einen leeren Eintrag läufst du das Array ab dem nächsten Eintrag bis zum Ende durch.

    Findest du dorte einen Eintrag der nicht leer ist, so ist ein Fehler aufgetreten.

    AutoIt
    if $Title = Default Then $Title = "Title"
    if $Title = "" Then $Title = "Title"

    Wieso fasst du die If-Abfragen nicht zusammen? If $Title = Default Or $Title = "" Then $Title = "Title" sieht doch viel schöner, kompakter und kürzer aus?

    AutoIt
    if not $Button_1 = "" Then
        Local $Button_1Left = $Button_Seperator
        Local $GUI_Width_Math = $Button_1Left
    EndIf

    Du vergleichst case-insensitiv $Button_1 mit dem Leerstring und negierst das Ergebnis. Würdest du einen case-sensitiven Vergleich verwenden würde ich das "Not" ja noch verstehen aber so

    hättest du lieber If $Button_1 <> "" Then verwenden können, der Ungleichoperator "<>" ist case-insensitiv.

    // NACHTRAG: Ich war mir unschlüssig aber habe nochmal nachgeschaut.

    Die Operatorrangfolge ist so gestaltet, dass das "Not" am stärksten bindet, d.h. erst wird der Inhalt von $Button_1 negiert (Strings sind grundsätzlich immer True soweit ich weiß, bis auf den Leerstring) und dann verglichen.

    Deine Wahrheitstabelle bleibt zwar nach wie vor richtig, aber ich bin mir 100%ig sicher, dass du das nicht wusstest. Strings auf keinen Fall so behandeln!

    Setze entweder eine Klammer um dem Vergleich (wenn du die Schreibweise so behalten willst) oder nimm den von mir vorgeschlagenen Ungleichoperator.

    AutoIt
    $hGUI = GUICreate($Title, $GUI_Width, $GUI_Height)

    Bisher hattest du schön die Konsistenz mit dem Local-Statement beibehalten aber hier fehlts. Technisch gesehen ist es nicht notwendig, da vom Interpreter automatisch der lokale Scope gewählt wird,

    aber der Vollständigkeit halber hättest du es hier auch noch hinsetzen können.

    AutoIt
    GUISetStyle(BitOR($WS_CAPTION, $WS_POPUPWINDOW) )

    Wieso setzt du die Styles nicht direkt beim Erstellen der GUI? Dafür ist der "style"-Parameter da?

    AutoIt
    if not $Button_1 = "" Then
        Local $Button_1Left = $Button_Seperator
        Local $GUI_Width_Math = $Button_1Left
    EndIf
    if not $Button_2 = "" Then
        Local $Button_2Left = $Button_Width+$Button_1Left+$Button_Seperator
        Local $GUI_Width_Math = $Button_2Left
    EndIf
    if not $Button_3 = "" Then
        Local $Button_3Left = $Button_Width+$Button_2Left+$Button_Seperator
        Local $GUI_Width_Math = $Button_3Left
    EndIf
    if not $Button_4 = "" Then
        Local $Button_4Left = $Button_Width+$Button_3Left+$Button_Seperator
        Local $GUI_Width_Math = $Button_4Left
    EndIf
    if not $Button_5 = "" Then
        Local $Button_5Left = $Button_Width+$Button_4Left+$Button_Seperator
        Local $GUI_Width_Math = $Button_5Left
    EndIf
    
    ; ............
    
    if not $Button_1 = "" Then
        $GUI_Button_1 = GUICtrlCreateButton($Button_1, $Button_1Left, $Button_Top, $Button_Width, $Button_Height, $BS_DEFPUSHBUTTON)
    EndIf
    if not $Button_2 = "" Then
        $GUI_Button_2 = GUICtrlCreateButton($Button_2, $Button_2Left, $Button_Top, $Button_Width, $Button_Height)
    EndIf
    if not $Button_3 = "" Then
        $GUI_Button_3 = GUICtrlCreateButton($Button_3, $Button_3Left, $Button_Top, $Button_Width, $Button_Height)
    EndIf
    if not $Button_4 = "" Then
        $GUI_Button_4 = GUICtrlCreateButton($Button_4, $Button_4Left, $Button_Top, $Button_Width, $Button_Height)
    EndIf
    if not $Button_5 = "" Then
        $GUI_Button_5 = GUICtrlCreateButton($Button_5, $Button_5Left, $Button_Top, $Button_Width, $Button_Height)
    EndIf
    Alles anzeigen

    Hätte alles super in eine For-Schleife gepasst und hättest du den Arraytrick verwendet (den ich bisschen weiter oben in dieser Antwort gepostet hatte), hättest du das hier um einige Zeilen kürzen können.

    AutoIt
    $Msg = GUIGetMsg()

    Betreibe ich mein Skript im OnEventModus, dann wars das mit deiner UDF und ich kann keine Buttons mehr anklicken.

    Du musst abfragen in welchem Modus du dich befindest und je nach dem agieren (oder den Modus setzen und wiederherstellen.)

    Das sind jetzt so die Dinge die mir beim Überfliegen mal aufgefallen sind. Es wäre schön wenn du die UDF variabler gestalten würdest indem du X Buttons erlaubst und diese alle dynamisch erstellt und angepasst werden.

    5 Buttons hardzucoden ist nicht gerade die feine Art.

    AutoIt
    Return

    Das kann auch komplett weg, es existiert nämlich kein Codepfad, der das letzte Return in deiner Funktion noch auslösen könnte.

    Zur Funktionalität selbst (bis auf die Dinge dich angeprangert habe) bleibt mir nur eins zu sagen: Läuft wenn die Voraussetzungen gegeben sind.

    Das meiste was ich hier bemängle sind eher Stilsachen als Funktionalität, dennoch liest sich ein sauber formatierter Code der bestimmten Richtlinien folgt einfach schöner und ermöglicht

    dir den Wiedereinstieg nach ein paar Wochen wesentlich schneller wenn du nicht mehr weißt wo oben und unten ist.

    Damit will ich dir nicht einreden du sollst hier das machen was wir wollen sondern dir ein eigenes System überlegen (oder eins adaptieren) und damit arbeiten.

    Code einrücken, Variablen gut benennen, einfach ein bisschen Konsistenz reinbringen, dann sieht das ganze viel besser aus!

    Der Anfang ist für deinen Kenntnisstand in Ordnung aber es ist noch Luft nach oben.

    Also beim nächsten Mal weniger Pillen schmeißen und fleißiger coden. ;)

    Nachtrag beachten!!!

    Alles anzeigen

    Hallo, danke für die Antwort.

    1. Ich habe den Timeout aus der Error Message raus genommen und beides auf "ERROR" gesetzt. Das mit dem Set error sehe ich mir gleich mal, wollte die for schleifen sowieso lernen.

    2. Ich habe auch gedacht "0000" wäre redundant, ist es aber nicht. Da ich hier nur Button 2-5 Abfrage kann der Fall "0000" sehr wohl eintreten, nämlich wenn der User nur 1 Button möchte, was dann eigtl. "10000" bedeuten würde, vlt. habe ich dich aber auch falsch verstanden.

    3. If $Title = Default Or $Title = "" Then $Title = "Title" - Weil ich es nicht wusste :D

    4. If $Button_1 <> "" Then weil ich es nicht wusste, gefällt mir sowieso besser.

    5. local $hGUI = GUICreate($Title, $GUI_Width, $GUI_Height) - hatte ich übersehen.

    6. GUISetStyle(BitOR($WS_CAPTION, $WS_POPUPWINDOW) ) - Hatte mich sowieso gefragt wofür ich den überhaupt setze?

    7. Ich hab die Buttons nicht in ein Array oder so gepackt, da meine heutige Herausforderung ist so viele Buttons zuzulassen wie der User möchte.

    8. Das mit dem Event Mode muss ich mir noch durchlesen, checke ich noch nicht. :D Oder reicht das:

    Opt("GUIOnEventMode", 0) ?


    Jetzt mache ich mich an die dynamischen buttons :P


    Edit: Das schmeißt mich nicht raus wenn ich die buttons falsch ordne, aber ich verstehe es auch noch nicht ganz muss ich mal rum probieren mit.

    Code
    Local $aButtons[] = [$Button_2, $Button_3, $Button_4, $Button_5], $bError = False
    For $i = 0 To UBound($aButtons) - 2
        If $aButtons[$i] = "" Then
            For $j = $i + 1 To UBound($aButtons) - 1
                If $aButtons[$j] <> "" Then
                    $bError = True
                    ExitLoop 2
                EndIf
            Next
        EndIf
    Next
    Alles anzeigen
  • Skalierende Message Box

    • xTcisloVe
    • 7. Juli 2018 um 23:30
    Zitat von Bitnugger

    Du solltest dir mal die UDF _ExtMsgBox anschauen, denn aus dem Code kannst du sicher einiges für dein Projekt extrahieren, vor allem die Übergabe der Parameter.

    Hier mal ein Script (inkl. Demo) von @Yashied, dass ich an einigen Stellen korrigiert habe und mit dem die benötigte Breite und Höhe von Texten (auch mehrzeilige und auch mit Tabs) in Pixeln ermitteln werden kann.

    AutoIt: _GetTabbedStringSizeEx.au3
    ;-- TIME_STAMP   2018-07-05 11:07:22   v 1.1
    
    #Region ;************ Includes ************
    #include <GUIConstantsEx.au3>
    #EndRegion ;************ Includes ************
    
    ;~ By Yashied, May 29, 2012 in AutoIt Example Scripts
    ;~ PRESS Ctrl+Shift+O --> https://www.autoitscript.com/forum/topic/140975-gettabbedstringsizeex/
    ;~ Modified by Bitnugger
    
    Opt('MouseCoordMode', 2)
    
    Global $aFont = [6.0, 6.8, 7.5, 8.3, 9.0, 9.8, 10.5, 11.3, 12.0, 12.8, 13.5, 14.3, 15.0, 15.8]
    
    Global $sText = '#1' & @TAB & '0B7' & @TAB & '#2' & @TAB & '01F' & @TAB & '#3' & @TAB & '2FF' & @TAB & '#4' & @TAB & '077' & @CRLF & _
            'COMPRESS_COPY' & @TAB & '+' & @TAB & 'PREFIX_PLATFORM' & @TAB & '+' & @TAB & 'TEST' & @TAB & '+' & @TAB & 'WIN7_PROGRESSBAR' & @TAB & '+' & @CRLF & _
            'COMPRESS_BCJ' & @TAB & '+' & @TAB & 'PREFIX_WAITALL' & @TAB & '+' & @TAB & 'LANG' & @TAB & '+' & @TAB & 'RTF_CONTROL' & @TAB & '+' & @CRLF & _
            'COMPRESS_BCJ2' & @TAB & '+' & @TAB & 'PREFIX_HIDCON' & @TAB & '+' & @TAB & 'ELEVATION' & @TAB & '+' & @TAB & 'IMAGES' & @TAB & '+' & @CRLF & _
            'COMPRESS_DEFLATE' & @TAB & '-' & @TAB & 'PREFIX_NOWAIT' & @TAB & '+' & @TAB & 'CHECK_RAM' & @TAB & '+' & @CRLF & _
            'COMPRESS_LZMA' & @TAB & '+' & @TAB & 'PREFIX_FORCENOWAIT' & @TAB & '+' & @TAB & 'CHECK_FREE_SPACE' & @TAB & '+' & @CRLF & _
            'COMPRESS_LZMA2' & @TAB & '+' & @TAB & '' & @TAB & '' & @TAB & 'BEGINPROMPTTIMEOUT' & @TAB & '+' & @CRLF & _
            'COMPRESS_PPMD' & @TAB & '-' & @TAB & '' & @TAB & '' & @TAB & 'CONFIG_PLATFORM' & @TAB & '+' & @CRLF & _
            'CRYPTO' & @TAB & '+' & @TAB & '' & @TAB & '' & @TAB & 'EARLY_PASSWORD' & @TAB & '+' & @CRLF & _
            'VOLUMES' & @TAB & '-' & @TAB & '' & @TAB & '' & @TAB & 'VOLUME_NAME_STYLE' & @TAB & '-' & @CRLF & _
            'PROTECT' & @TAB & '-' & @TAB & '' & @TAB & '' & @TAB & 'ENVIRONMENT_VARS' & @TAB & '+'
    
    Global $aNoAlignText = [ _
            'A not very long string string' & @TAB & 'with' & @TAB & 'tab' & @TAB & 'characters' & @CRLF & 'in' & @TAB & 'two lines!', _
            'A not very long string WITHOUT tab characters' & @CRLF & 'in two lines!', _
            'A NOT VERY LONG STRING STRING WITHOUT TAB CHARACTERS IN ONE LINE!']
    
    ; Align text
    For $i = 0 To UBound($aFont) - 1
        _Form($sText, 'Segoe UI', $aFont[$i])
    Next
    
    ; No align text
    For $i = 0 To UBound($aNoAlignText) - 1
        $sText = $aNoAlignText[$i]
        For $j = 0 To UBound($aFont) - 1
            _Form($sText, 'Segoe UI', $aFont[$j], False)
        Next
    Next
    
    Func _Form($sText, $sFontName, $nFontSize, $bAlignment = True)
        Local $hForm, $idButton_OK, $aPos, $aSize
    
        $hForm = GUICreate(StringFormat('%s - %.1f', $sFontName, $nFontSize), 0, 0)
        GUISetFont(9.0, 400, 0, 'Segoe UI')
        GUISetBkColor(0x008B8B)
        GUICtrlCreateLabel('', 10, 10)
        GUICtrlSetFont(-1, $nFontSize, 400, 0, $sFontName)
        GUICtrlSetColor(-1, 0x5CE8DF)
        GUICtrlSetBkColor(-1, 0x668B8B)
    
        $aSize = _GetTabbedStringSizeEx(-1, $sText, $bAlignment)
        If Not @error Then
            GUICtrlSetPos(-1, -1, -1, $aSize[0], $aSize[1])
            GUICtrlSetData(-1, $sText)
        EndIf
        $aPos = WinGetPos($hForm)
        WinMove($hForm, '', (@DesktopWidth - ($aPos[2] + $aSize[0] + 20)) / 2, (@DesktopHeight - ($aPos[3] + $aSize[1] + 70)) / 2, $aPos[2] + $aSize[0] + 20, $aPos[3] + $aSize[1] + 70)
        GUICtrlCreateGraphic(0, 0, $aSize[0] + 20, $aSize[1] + 20)
        GUICtrlSetBkColor(-1, 0x00ABAB)
        GUICtrlSetState(-1, $GUI_DISABLE)
        GUICtrlCreateGraphic(0, $aSize[1] + 20, $aSize[0] + 20, 1)
        GUICtrlSetBkColor(-1, 0x00DBDB)
        GUICtrlSetState(-1, $GUI_DISABLE)
        $idButton_OK = GUICtrlCreateButton('OK', ($aSize[0] + 20) / 2 - 37, $aSize[1] + 32, 88, 27)
        GUICtrlSetState(-1, BitOR($GUI_DEFBUTTON, $GUI_FOCUS))
        GUISetState()
    
        MouseMove(($aSize[0] + 20) / 2 + 7, $aSize[1] + 46, 0)
    
        While 1
            Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                    Exit
                Case $idButton_OK
                    ExitLoop
            EndSwitch
        WEnd
    
        GUIDelete($hForm)
    EndFunc   ;==>_Form
    
    Func _GetTabbedStringSizeEx($idCtrl, ByRef $sString, $bAlignment = True)
        Local $iW = 0, $iH, $tTM, $pTM, $hDC = 0, $hSv = 0, $aTemp, $aSize, $aData, $aTabs, $aText, $sText = '', $iError, $iTabStops, $vRet
    
        #cs
            Global Const $tagTEXTMETRIC = "long tmHeight;long tmAscent;long tmDescent;long tmInternalLeading;long tmExternalLeading;" & _
            "long tmAveCharWidth;long tmMaxCharWidth;long tmWeight;long tmOverhang;long tmDigitizedAspectX;long tmDigitizedAspectY;" & _
            "wchar tmFirstChar;wchar tmLastChar;wchar tmDefaultChar;wchar tmBreakChar;byte tmItalic;byte tmUnderlined;byte tmStruckOut;" & _
            "byte tmPitchAndFamily;byte tmCharSet"
        #ce
    
    ;~  Local $tTM = DllStructCreate($tagTEXTMETRIC)
        Local $tTM = DllStructCreate('long;long;long;long;long;long;long;long;long;long;long;wchar;wchar;wchar;wchar;byte;byte;byte;byte;byte')
        Local $pTM = DllStructGetPtr($tTM)
        Local $tData = DllStructCreate('long;long')
        Local $pData = DllStructGetPtr($tData)
        Local $aResult[2] = [0, 0]
    
        If Not IsHWnd($idCtrl) Then $idCtrl = GUICtrlGetHandle($idCtrl)
        If Not $idCtrl Then Return SetError(1, 0, 0)
    
        Do
            $iError = 1
            $vRet = DllCall('user32.dll', 'ptr', 'GetDC', 'hwnd', $idCtrl)
            If (@error) Or (Not $vRet[0]) Then ExitLoop
            $hDC = $vRet[0]
            $vRet = DllCall('user32.dll', 'ptr', 'SendMessageW', 'hwnd', $idCtrl, 'uint', 0x0031, 'wparam', 0, 'lparam', 0)
            If (@error) Or (Not $vRet[0]) Then ExitLoop
            $vRet = DllCall('gdi32.dll', 'ptr', 'SelectObject', 'hwnd', $hDC, 'ptr', $vRet[0])
            If (@error) Or (Not $vRet[0]) Then ExitLoop
            $hSv = $vRet[0]
            $vRet = DllCall('gdi32.dll', 'int', 'GetTextMetricsW', 'hwnd', $hDC, 'ptr', $pTM)
            If (@error) Or (Not $vRet[0]) Then
                ExitLoop
            EndIf
            $iTabStops = 8 * DllStructGetData($tTM, 6) ; tmAveCharWidth
            If Not $iTabStops Then ExitLoop
            $aData = StringRegExp($sString, '(?m).+[^\R]', 3)
            If @error Then Return SetError(2, 0, 0)
    
            $iH = UBound($aData)
            If ($iH > 0) And ($bAlignment) Then
                For $i = 0 To $iH - 1
                    $aTemp = StringSplit($aData[$i], @TAB)
                    If $iW < $aTemp[0] Then $iW = $aTemp[0]
                Next
                Dim $aText[$iH][$iW]
                Dim $aSize[$iH][$iW]
                For $i = 0 To $iH - 1
                    $aTemp = StringSplit($aData[$i], @TAB)
                    For $j = 0 To $iW - 1
                        Select
                            Case $aTemp[0] < $j + 1
                                $aText[$i][$j] = 0
                                $aSize[$i][$j] = -1
                            Case $aTemp[0] = $j + 1
                                $aText[$i][$j] = $aTemp[$j + 1]
                                $aSize[$i][$j] = -1
                            Case Else
                                $aText[$i][$j] = $aTemp[$j + 1]
                                $vRet = DllCall('gdi32.dll', 'int', 'GetTextExtentPoint32W', 'hwnd', $hDC, 'wstr', $aTemp[$j + 1], 'int', StringLen($aTemp[$j + 1]), 'ptr', $pData)
                                If (Not @error) And ($vRet[0]) Then
                                    $aSize[$i][$j] = DllStructGetData($tData, 1)
                                Else
                                    $aSize[$i][$j] = 0
                                EndIf
                        EndSelect
                    Next
                Next
                Dim $aTabs[$iW]
                For $j = 0 To $iW - 1
                    $aTabs[$j] = 1
                    For $i = 0 To $iH - 1
                        If $aSize[$i][$j] <> -1 Then
                            If $aSize[$i][$j] < $iTabStops Then
                                $aSize[$i][$j] = 1
                            Else
                                $aSize[$i][$j] = Floor($aSize[$i][$j] / $iTabStops) + 1
                                If $aTabs[$j] < $aSize[$i][$j] Then $aTabs[$j] = $aSize[$i][$j]
                            EndIf
                        EndIf
                    Next
                Next
                Dim $aData[$iH]
                For $i = 0 To $iH - 1
                    $aData[$i] = ''
                    For $j = 0 To $iW - 1
                        If IsString($aText[$i][$j]) Then
                            $aData[$i] &= $aText[$i][$j]
                            If $aSize[$i][$j] <> -1 Then $aSize[$i][$j] = $aTabs[$j] - $aSize[$i][$j]
                            For $k = 1 To $aSize[$i][$j] + 1
                                $aData[$i] &= @TAB
                            Next
                        Else
                            ExitLoop
                        EndIf
                    Next
                    $sText &= $aData[$i] & @CRLF
                Next
            EndIf
    
            $iError = 1
            DllStructSetData($tData, 1, $iTabStops)
            For $i = 0 To $iH - 1
                $vRet = DllCall('user32.dll', 'dword', 'GetTabbedTextExtentW', 'hwnd', $hDC, 'wstr', $aData[$i], 'int', StringLen($aData[$i]), 'int', 1, 'ptr', $pData)
                If (Not @error) And ($vRet[0]) Then
                    $aResult[1] += BitShift($vRet[0], 16)
                    $vRet = BitAND($vRet[0], 0xFFFF)
                    If $aResult[0] < $vRet Then $aResult[0] = $vRet
                Else
                    ExitLoop 2
                EndIf
            Next
            $iError = 0
        Until 1
        If $hSv Then DllCall('gdi32.dll', 'ptr', 'SelectObject', 'hwnd', $hDC, 'ptr', $hSv)
        If $hDC Then DllCall('user32.dll', 'int', 'ReleaseDC', 'hwnd', $idCtrl, 'hwnd', $hDC)
        If $iError Then Return SetError(1, 0, 0)
        If $bAlignment Then $sString = StringTrimRight($sText, 2)
    
        Return $aResult
    EndFunc   ;==>_GetTabbedStringSizeEx
    Alles anzeigen

    Danke jetzt erst gelesen, ich werde es mir mal ansehen!

  • Skalierende Message Box

    • xTcisloVe
    • 7. Juli 2018 um 23:29

    Habe viel geändert alpines  autoiter .

    Würde mich freuen wenn ihr es euch anseht.

  • Skalierende Message Box

    • xTcisloVe
    • 3. Juli 2018 um 19:02
    Zitat von autoiter

    Alles klar. Jetzt habe ich deine Edits gelesen. Ich wünsche dir viel Erfolg. Ich denke auch, die Arrays werden funktionieren und du schaffst das. Falls du Probleme hast und nicht weiter kommst, melde dich einfach hier

    Das kannst du einmal ganz einfach selber ermitteln. Dafür gibt es die Funktion StrinLen. Damit kannst du dir die Anzahl der Zeichen des Strings ausgeben lassen und entsprechend reagieren.

    (Wenn man alles bedenken möchte, müsste man auch noch weitere Parameter berücksichtigen. Etwa die verwendete Schriftart (bei dir jetzt kein Problem, weil du die gar nicht editierst, wenn ich das nicht übersehen habe) oder die Bildschirmskalierung (Wenn jemand die Texte in Windows als grundsätzlich größer skaliert eingestellt hat - machen bspw. Leute an Fernsehern oder mit Laptop mit sehr hoher Auflösung). Das war jetzt aber ein nicht soo wichtiger Hinweis.

    Was du dir mal anschauen könntest wäre: https://www.autoitscript.com/forum/topic/11…sion-16-aug-11/

    EDIT:

    Dafür kannst du den Style: $SS_CENTER benutzen.

    Alles anzeigen

    Klingt sehr interessant, das wird den Job wohl erledigen. Ich hatte den GUI Font eingebaut und benutze ihn auch zur Berechnung, führt nur leider zu schlechten Ergebnissen wenn ich den User ihn ändern lasse.

    Okay $SS_CENTER ist gut , dann hab ich quasi GuiWidth = StrinLen($Line1) + z.B $ButtonSeperator(Sieht gut aus dann haben alle Buttons den selben Abstand zum Rand und zueinander.

    ich lege dann vorher die maximal breite des fensters mit anzahl der buttons und der buttongröße fest und mache dann einen Zeilenumbruch oder vergrößere die Zeile entsrechend?


    Ich will auch erstmal ausprobieren dann benutze ich den Link glaube ich erst. Mal sehen.


    edit: das mit den for schleifen muss ich auch noch lernen :D

  • Skalierende Message Box

    • xTcisloVe
    • 3. Juli 2018 um 18:43

    autoiter

    Hab mir mal einen "ErrorHandle" überlegt.

    Funktioniert wunderbar, ist aber wohl nicht ganz so elegant :D

    Code
    if $Button1 = "" Then
        MsgBox(0, "ERROR", "ERROR - Button 1 undefined or no button defined.", 10)
        Return "Error"
    EndIf
    Local $ErrorHandle1 = 1
    Local $ErrorHandle2 = 1
    Local $ErrorHandle3 = 1
    Local $ErrorHandle4 = 1
    if $Button2 = "" Then Local $ErrorHandle1 = 0
    if $Button3 = "" Then Local $ErrorHandle2 = 0
    if $Button4 = "" Then Local $ErrorHandle3 = 0
    if $Button5 = "" Then Local $ErrorHandle4 = 0
    local $ErrorHandle = $ErrorHandle1 & $ErrorHandle2 & $ErrorHandle3 & $ErrorHandle4
    Switch $ErrorHandle
        case "1111", "1000", "1100", "1110"
            sleep(200)
        case Else
        MsgBox(0, "ERROR", "You, messed up button order, try again.", 10)
        Return "ERROR"
    EndSwitch
    Alles anzeigen
  • Skalierende Message Box

    • xTcisloVe
    • 3. Juli 2018 um 18:11
    Zitat von autoiter

    Lade doch mal SciTE4AutoIt3 und öffne das Skript darin. Dann starte dein Beispiel mal nachdem du "Button 3" in "" geändert hast. Was zeigt dir die Konsole an?

    Das Problem ist hier mehr, dass du jeden weiteren Button nur auf sich selbst prüfst. Wenn der Button-Text nicht leer ist, gehst du davon aus, dass auch die vorigen gefüllt waren. Dein Skript stürzt ab.

    Das musst du nicht direkt korrigieren. Immerhin kannst du auch einen klar denkenden Nutzer erwarten. Aber es könnte schon sein, dass das mal jemand versucht, weil er vllt. einfach den Abstand zwischen den Buttons möchte oder so. Da fehlt etwas das Fehler-Handling dahingehend das sich mal ein Nutzer anders verhält als du erwartest. Aber das sind jetzt einfach Gedanken zu möglichen Verbesserungen (und möglichen Kürzungen des Skripts). Prinzipiell kann jemand, der das Skript hier findet und eine Message Box mit eigenen Buttons braucht, das Ding auch verwenden und ist glücklich. Daher will ich nicht vergessen zu sagen, danke fürs teilen :thumbup:

    Gerne doch, und danke für die Hilfe.

    Wenn ich den Button 3 rausnehme stürzt mein Script ab, weil der Button 3 = "" ist wurde er nicht berechnet und fehlt somit bei der Berechnung für die Position von Button 4 :D


    Du kannst gerne meinen letzten Post nochmal lesen, den hab ich mehrfach editiert.

    Gibt es ein Referenz wo ich den Zusammenhang zwischen GUI FONT und GUI Größe finde wäre das gut.

    Also GUI Größe = LängsteTextzeile (z.B 20 Zeichen) X GUIFONT(z.B 12) + (Textzeile Position 1 x 2 {z.B 20 x 2})

    Das man so immer den selben Abstand Links und Rechts erhält egal wie lang die Zeile ist.

  • Skalierende Message Box

    • xTcisloVe
    • 3. Juli 2018 um 17:23
    Zitat von autoiter

    Hallo xTcisloVe

    Ich rate dir dringend zu einer für AutoIt besser geeigneten Entwicklungsumgebung. Das oben erwähnte SciTE4AutoIt3 oder ISN AutoIt Studio.

    SciTE4AutoIt3 kannst du dort laden wo du wohl auch AutoIt her hast.

    https://www.autoitscript.com/site/autoit/downloads/

    Hier den AutoIt Script Editor herunterladen. Einfach installieren -> fertig. In dieser Version von SciTE hast du viele eingebaute Tools, die dir bei der Arbeit mit AutoIt-Code helfen. Syntax-Check usw. Außerdem kannst du z.B. sehr gut die Hilfe erreichen. Wenn du dich etwa fragst, was macht _ArraySearch, dann genügt es, dass du den Befehl mit dem Mauszeiger anklickst und dann F1 drückst. Du landest direkt in der Hilfe zu dieser Funktion. Bei fast allen Funktionen findest du Beispielcode, den du direkt ausführen kannst, um dir die Wirkung genauer anzuschauen.

    Leider geht das bei deinem Code nicht so einfach. Es treten dann Probleme auf, wenn jemand weniger als 5 Buttons verwendet. Hier fehlt dann einfach ein Wert..

    Der Hinweis mit den Arrays war aber richtig. Nur solltest du, wenn du mal ernsthaft den Umbau planst, vielleicht noch früher mit auf Arrays setzen und schon den ganzen oberen Bereich mit der Erstellung der Controls mit Arrays und For To-Schleifen machen. Da kannst du vielleicht mal nach "GUI Controls dynamisch erstellen" oder so etwas suchen. Ist jetzt aber nicht sofort nötig.

    Damit dein Skript aber jetzt direkt immer funktioniert, kannst du die Buttons mit einem nie eintretenden Pseudo-Wert vorbelegen. (Das ist echt nicht elegand. Würde aber erst einmal funktionieren).

    Etwa so:

    Code
    If $hGUIButton1 = "" Then $hGUIButton1 = -999999
    If $hGUIButton2 = "" Then $hGUIButton2 = -999999
    If $hGUIButton3 = "" Then $hGUIButton3 = -999999
    If $hGUIButton4 = "" Then $hGUIButton4 = -999999
    If $hGUIButton5 = "" Then $hGUIButton5 = -999999

    Noch ein kleiner Hinweis. Bei UDF-Dateien, die man in andere Skripte einbinden soll. Ist es angebracht über den #include-Anweisungen die folgende Anweisung anzugeben: #include-once

    Das sorgt dafür, dass Dateien nur einmal eingebunden werden und nicht mehrfach, wenn die gleiche Anweisung etwa noch einmal im eigentlichen Skript vorhanden ist.

    PS: Ich würde statt deiner Variante Return $msg-2 doch eine der von Bitnugger vorgeschlagenen Varianten nehmen, weil sie eindeutiger sind. Wenn du mal etwas an dem Skript änderst, könnte es sein, dass die IDs nicht mehr zu dieser Auswertung passen.

    EDIT: Da war ich gerade am Schreiben als du den letzten Post gemacht hast. Einen Teil der Frage habe ich dir schon beantwortet. Wenn du die Buttons mit Werten vorbelegst brauchst du das nicht fünfmal wiederholen und fragen ob der Button benutzt wird.

    Allerdings gilt das nur, wenn jemand nicht einfach einen Button auslässt (etwa Button 1 benutzt, Button 2 nicht aber dann Button 3). Hier fehlt ein Fehler-Handling, über dass du dir noch Gedanken machen könntest. Andererseits denke ich, mit etwas gutem Willen macht niemand so etwas ;)

    Alles anzeigen

    Vielen Dank.

    Ich hab den Script Editor installiert, nur nie benutzt. :D Mache ich ab jetzt.

    Das mit dem Pseudo Wert hab ich mir auch schon gedacht, hatte ich aber wohl falsch umgesetzt :D
    -Getestet, funktioniert. :D Danke.

    Meinst du das mit Fehlerhandling? Steht ganz am Anfang der Funktion:

    Code
    if $Button1 = "" Then
        MsgBox(0, "ERROR", "ERROR - Button 1 undefined or no button defined.", 10)
        Return
    EndIf



    PS: Sonntag werde ich wohl die ganzen Berechnungen neu schreiben mit Hilfe von Arrays, ich weiß jetzt schon wie also im Kopf funktioniert es :D

    Ich muss andere Grundlagen zur Berechnung nehmen, damit man die Werte variabler setzen kann, ohne das es komisch aussieht. :D

    Im Grunsatz finde ich das ganze schon solide. :D

    Würde auch gerne die Breite des GUI´s anhand der Länge, der längsten Textzeile berechnen. Und auch die breite der Buttons, ich muss nur noch heraus finden wie die zueinander stehen. Aber hört sich schon mal geil an :D

    Auch interessant wäre, nur eine Textzeile zu machen, die automatisch in die nächste übergeht sobald die breite des GUIs erreicht ist, die vorher anhand der Anzahl der Buttons berechnet wurde. Was eigtl. besser klingt. Mal sehen :D

  • Skalierende Message Box

    • xTcisloVe
    • 3. Juli 2018 um 16:45

    Meine Aktuelle Lösung ist:

    Code
    if not $Button5 = "" Then
        GUISetState()
        While 1
        $msg = GUIGetMsg()
        Sleep(10)
        Local $iIndex, $aArray = [[$GUI_EVENT_CLOSE, 0], [$hGUIButton1, 1], [$hGUIButton2, 2], [$hGUIButton3, 3], [$hGUIButton4, 4], [$hGUIButton5, 5]]
            Switch $msg
                Case $GUI_EVENT_CLOSE, $hGUIButton1, $hGUIButton2, $hGUIButton3, $hGUIButton4, $hGUIButton5
                    $iIndex = _ArraySearch($aArray, $msg)
                    GUIDelete()
                    Return $aArray[$iIndex][1]
            EndSwitch
        WEnd
    EndIF
    Alles anzeigen


    Das Problem ist aber das ich diese Funktion ja 5 mal brauche, also:

    Code
    if not $Button5 = "" Then
        GUISetState()
        While 1
        $msg = GUIGetMsg()
        Sleep(10)
        Local $iIndex, $aArray = [[$GUI_EVENT_CLOSE, 0], [$hGUIButton1, 1], [$hGUIButton2, 2], [$hGUIButton3, 3], [$hGUIButton4, 4], [$hGUIButton5, 5]]
            Switch $msg
                Case $GUI_EVENT_CLOSE, $hGUIButton1, $hGUIButton2, $hGUIButton3, $hGUIButton4, $hGUIButton5
                    $iIndex = _ArraySearch($aArray, $msg)
                    GUIDelete()
                    Return $aArray[$iIndex][1]
            EndSwitch
        WEnd
    EndIF
    if not $Button4 = "" Then
        GUISetState()
        While 1
        $msg = GUIGetMsg()
        Sleep(10)
        Local $iIndex, $aArray = [[$GUI_EVENT_CLOSE, 0], [$hGUIButton1, 1], [$hGUIButton2, 2], [$hGUIButton3, 3], [$hGUIButton4, 4]]
            Switch $msg
                Case $GUI_EVENT_CLOSE, $hGUIButton1, $hGUIButton2, $hGUIButton3, $hGUIButton4
                    $iIndex = _ArraySearch($aArray, $msg)
                    GUIDelete()
                    Return $aArray[$iIndex][1]
            EndSwitch
        WEnd
    EndIF
    if not $Button3 = "" Then
        GUISetState()
        While 1
        $msg = GUIGetMsg()
        Sleep(10)
        Local $iIndex, $aArray = [[$GUI_EVENT_CLOSE, 0], [$hGUIButton1, 1], [$hGUIButton2, 2], [$hGUIButton3, 3]]
            Switch $msg
                Case $GUI_EVENT_CLOSE, $hGUIButton1, $hGUIButton2, $hGUIButton3
                    $iIndex = _ArraySearch($aArray, $msg)
                    GUIDelete()
                    Return $aArray[$iIndex][1]
            EndSwitch
        WEnd
    EndIF
    if not $Button2 = "" Then
        GUISetState()
        While 1
        $msg = GUIGetMsg()
        Sleep(10)
        Local $iIndex, $aArray = [[$GUI_EVENT_CLOSE, 0], [$hGUIButton1, 1], [$hGUIButton2, 2]]
            Switch $msg
                Case $GUI_EVENT_CLOSE, $hGUIButton1, $hGUIButton2
                    $iIndex = _ArraySearch($aArray, $msg)
                    GUIDelete()
                    Return $aArray[$iIndex][1]
            EndSwitch
        WEnd
    EndIF
    if not $Button1 = "" Then
        GUISetState()
        While 1
        $msg = GUIGetMsg()
        Sleep(10)
        Local $iIndex, $aArray = [[$GUI_EVENT_CLOSE, 0], [$hGUIButton1, 1]]
            Switch $msg
                Case $GUI_EVENT_CLOSE, $hGUIButton1
                    $iIndex = _ArraySearch($aArray, $msg)
                    GUIDelete()
                    Return $aArray[$iIndex][1]
            EndSwitch
        WEnd
    EndIF
    Alles anzeigen

    Und es ändert sich ja nur das hier:


    Code
    Local $iIndex, $aArray = [[$GUI_EVENT_CLOSE, 0], [$hGUIButton1, 1], [$hGUIButton2, 2], [$hGUIButton3, 3], [$hGUIButton4, 4], [$hGUIButton5, 5]]
    
    Case $GUI_EVENT_CLOSE, $hGUIButton1, $hGUIButton2, $hGUIButton3, $hGUIButton4, $hGUIButton5

    Das muss sich doch anders als in 5 Funktionen realisieren lassen?

  • Skalierende Message Box

    • xTcisloVe
    • 3. Juli 2018 um 16:25
    Zitat von autoiter

    Benutzt du SciTE als Entwicklungsumgebung?

    Nein, Notepad++ warum?

    Zitat von Bitnugger

    Damit bist du schon mal knapp auf halbem Wege richtig...

    Wichtig ist es, zu wissen, dass die Controls (Button, Label, ...) bei der Erstellung immer mit einer aufsteigenden ID durchnummeriert werden. Um ein Return in ähnlicher Art zu realisieren, wie du es im Sinn hattest, kannst du die IDs in einem Array speichern und dann einfach mit Return $aArray[$iIndex] die Funktion verlassen.

    Hier mal eine kleine Hilfe für den Start...

    AutoIt
    ; So wäre es von der Syntax her richtig...
    Switch $msgcase
        Case $hGUIButton1, $hGUIButton2, $hGUIButton3, $hGUIButton4, $hGUIButton5, $GUI_EVENT_CLOSE
        Return 1
    EndSwitch
    ;~ Aber das würde ja nicht wie gewollt funktionieren...
    
    ;~ So ginge es wie gewünscht... wäre aber uncool...
    Switch $msgcase
            Case $GUI_EVENT_CLOSE
                Return 0 ; oder Exit
            Case $hGUIButton1
                Return 1
            Case $hGUIButton2
                Return 2
            Case $hGUIButton3
                Return 3
            Case $hGUIButton4
                Return 4
            Case $hGUIButton5
                Return 5
    EndSwitch
    
    ;~ Etwas eleganter geht es so...
    
    #include <Array.au3> ; Brauchen wir für die Funktion _ArraySearch... ginge aber auch mit einer For..To..Next-Schleife 
    
    Local $iIndex, $aArray = [[$hGUIButton1, 1], [$hGUIButton2, 2], [$hGUIButton3, 3], [$hGUIButton4, 4], [$hGUIButton5, 5]]
    Switch $msgcase
        Case $GUI_EVENT_CLOSE
            Exit
        Case $hGUIButton1, $hGUIButton2, $hGUIButton3, $hGUIButton4, $hGUIButton5
            $iIndex = _ArraySearch($aArray, $msgcase) ; $aArray[$iIndex][0] = ID des Controls
            Return $aArray[$iIndex][1] ; Gewünschter Rückgabewert
    EndSwitch
    
    ;~ Wenn die Controls alle in direkter Folge erstellt wurden, was bei $hGUIButton1 bis $hGUIButton5 anzunehmen ist, geht es so viel kürzer.
    
    Switch $msgcase
        Case $GUI_EVENT_CLOSE
            Exit
        Case $msgcase, $hGUIButton1 $hGUIButton2, $hGUIButton3, $hGUIButton4, $hGUIButton5
            Return $msgcase - $hGUIButton1 + 1 ; Gewünschter Rückgabewert
    EndSwitch
    Alles anzeigen

    Vielen Dank für die umfangreiche Antwort.

    Das ist die Lösung die ich gewählt habe.

    Code
    Switch $msg
                Case $hGUIButton1, $hGUIButton2, $hGUIButton3, $hGUIButton4, $hGUIButton5
                    GUIDelete()
                    Return $msg-2            
                Case $GUI_EVENT_CLOSE
                    GUIDelete()
                    Return 6
    EndSwitch

    Hier verstehe ich auch warum ich den richtigen Return Code bekomme, da ich getestet habe welchen Wert $msg hat, wenn ich Button 1 drücke und das habe ich dann einfach so fortgesetzt.

    Kannst du mir evtl. den Unterschied erklären und warum ich bei deiner Variante auf den richtigen Wert komme?

    Vielen vielen vielen Dank für das Beispiel mit dem Array, das wird mir so oft weiter helfen! Danke!

  • Skalierende Message Box

    • xTcisloVe
    • 2. Juli 2018 um 22:16
    Zitat von alpines

    Du könntest ein Array erstellen und zu jedem Handle ein Returnwert speichern (oder ihn einfach berechnen) und dann returnen.

    Okay hab die Lösung gefunden, gibt es noch ne Möglichkeit das ins eins zu packen? Es ändert sich ja nur das:

    Code
    Case $hGUIButton1, $hGUIButton2, $hGUIButton3, $hGUIButton4, $hGUIButton5

    Dafür muss ich aber das machen:

    Code
    if not $Button5 = "" Then
        GUISetState()
        While 1
        $msg = GUIGetMsg()
        Sleep(10)
            Switch $msg
                Case $hGUIButton1, $hGUIButton2, $hGUIButton3, $hGUIButton4, $hGUIButton5
                    GUIDelete()
                    Return $msg-2            
                Case $GUI_EVENT_CLOSE
                    GUIDelete()
                    Return 6
            EndSwitch
        WEnd
    EndIF
    if not $Button4 = "" Then
        GUISetState()
        While 1
        $msg = GUIGetMsg()
        Sleep(10)
            Switch $msg
                Case $hGUIButton1, $hGUIButton2, $hGUIButton3, $hGUIButton4
                    GUIDelete()
                    Return $msg-2            
                Case $GUI_EVENT_CLOSE
                    GUIDelete()
                    Return 6
            EndSwitch
        WEnd
    EndIF
    if not $Button3 = "" Then
        GUISetState()
        While 1
        $msg = GUIGetMsg()
        Sleep(10)
            Switch $msg
                Case $hGUIButton1, $hGUIButton2, $hGUIButton3
                    GUIDelete()
                    Return $msg-2            
                Case $GUI_EVENT_CLOSE
                    GUIDelete()
                    Return 6
            EndSwitch
        WEnd
    EndIF
    if not $Button2 = "" Then
        GUISetState()
        While 1
        $msg = GUIGetMsg()
        Sleep(10)
            Switch $msg
                Case $hGUIButton1, $hGUIButton2
                    GUIDelete()
                    Return $msg-2            
                Case $GUI_EVENT_CLOSE
                    GUIDelete()
                    Return 6
            EndSwitch
        WEnd
    EndIF
    if not $Button1 = "" Then
        GUISetState()
        While 1
        $msg = GUIGetMsg()
        Sleep(10)
            Switch $msg
                Case $hGUIButton1
                    GUIDelete()
                    Return $msg-2            
                Case $GUI_EVENT_CLOSE
                    GUIDelete()
                    Return 6
            EndSwitch
        WEnd
    EndIF
    Alles anzeigen
  • Skalierende Message Box

    • xTcisloVe
    • 2. Juli 2018 um 21:36
    Zitat von autoiter

    Ah, ich hatte schon eine dahingehend korrigierte Version geladen. Das hat xTcisloVe geändert.

    Apropos Monster. Ja, es gibt in dieser Funktion einiges an Verbesserungspotential. Wenn xTcisloVe da Fragen hat, helfen wir ja gerne. Aber grundsätzlich mal danke fürs teilen.

    Ja z.B muss es ja möglich sein z.B den switch zu verkürzen also

    Code
    switch $msgcase $hGUIButton1, $hGUIButton2, $hGUIButton3, $hGUIButton4, $hGUIButton5, $GUI_EVENT_CLOSE
    Return                     1,            2,            3,            4,            5,                6
    EndSwitch

    Ich weiß das geht so nicht, aber ich hoffe man versteht was ich meine

  • Skalierende Message Box

    • xTcisloVe
    • 2. Juli 2018 um 19:49
    Zitat von autoiter

    Eben habe ich das Skript mal ausgeführt. Nach Klick auch Button eins verschwand die Box, es gab aber keine Rückmeldung.

    Dann ist mir aufgefallen, dass du versuchst den String auszuwerten:

    Code
    Switch $PressedButton
        case "Button1" ;--> Button 1 pressed.
            MsgBox(0, "Which button was pressed?", "Button 1 pressed", 10)

    Allerdings ist der Inhalt von $PressedButton nicht dieser String sondern nur 1. Du müsstest also nur die Zahlen auswerten. Hast du das kurz vor der Veröffentlichung geändert?

    Das Beispiel war noch vor der Änderung die ich wegen alpines gemacht habe :D ist jetzt geändert.

  • Skalierende Message Box

    • xTcisloVe
    • 2. Juli 2018 um 18:40
    Zitat von alpines

    Auf keinen Fall so den Button auswerten!!!

    NIEMALS sollte in Funktionen globale Variablen deklariert werden und schon gar nicht als Auswertung so wie du es gmacht hast.

    Warum? Der User kann bereits eine Variable mit dem Titel "PressedButton" (ist nicht abwegig) erstellt haben und wenn er dein Skript einbindet ist der Inhalt Geschichte.

    Lass dir wie die Standardmsgbox lieber den gedrückten Button als Rückgabewert der Funktion geben, das ist nicht nur viel sicherer, sondern sieht auch noch schöner aus und erleichtert das Lesen deines Codes!

    Okay danke, nur absolut keine Ahnung wie das geht. Ein Tipp?

  • Skalierende Message Box

    • xTcisloVe
    • 2. Juli 2018 um 17:57

    Hallo,
    nach etlichen Updates, ist es soweit, meine Skalierende MessageBox noch einmal vorzustellen.

    Update: 18.07.2018

    -Danke an: alpines und autoiter

    Was kann die Message Box?
    -So viele Buttons wie du möchtest.

    -Die höhe skaliert mit dem Text den du eingibst. Wenn eine Line zu lang ist, verbreitert sich die messagebox.

    -Autoclose-Timeout. (Sekunden werden im Titel angezeigt)

    -Default Button festlegen.

    - Button Timeout (Sekunden werden im Button angezeigt)

    -Einstellen von:

    -Button-Breite

    -Button-Höhe

    -Abstand zwischen den Buttons

    -Abstand zwischen dem Rand der Box und dem ersten bzw. letzten Button

    -Abstand zwischen dem unteren Rand und den Buttons.
    -Abstand zwischen dem oberen Rand und dem Label bzw. Abstand zwischen dem ersten Button und dem unteren Rand des Labels.

    -Hintergrundfarbe

    -Transparenz

    -Textfarbe

    -Labelfarbe

    -Buttonfarbe

    -Icon

    -Button/ Label Style.

    -

    Hier ist die UDF: ScalingMessageBox.au3


    Hier mal was zum testen:

    Code
    #include "ScalingMessageBox.au3"
    
    Example1()
    Exit
    
    Func Example1() ;-> Simple Yes or No Box.
    $PressedButton = _sMsgBox("Test", 4, "Continue?", "to=Yes,20;Icon=0;tr=20")
            switch @extended
                case 0 ;--> Message Box closed by User or Autoclose.
                    MsgBox(0, @extended,  $PressedButton, 10)
    
                case 1 ;--> Yes button pressed.
                    MsgBox(0, @extended, $PressedButton, 10)
    
                case 2 ;--> No button pressed.
                    MsgBox(0, @extended, $PressedButton, 10)
            EndSwitch
    EndFunc
    Alles anzeigen

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™