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

Beiträge von BugFix

  • Statusbar small

    • BugFix
    • 7. April 2020 um 20:31
    Zitat von Oscar

    Aber es fehlt noch eine Funktion "SetFont" (mit Fontgröße und Schriftart).

    Ja, klingt vernünftig.

    Dabei ist mir noch aufgefallen, dass ich einen kleinen Fehler drin habe: Beim Positionieren der Statusbar muss ich ja das Fenster um die Höhe der Statusbar vergrößern. - Das fehlt im Moment noch.

    To-Do:

    - Breitenangabe für alle Parts erledigt

    - Beim Positionieren der Statusbar Fenster um die Höhe der Bar vergrößern gestrichen - s. Hinweis

    - Funktionen für Fontgröße und -art erledigt, aber keine extra Funktion, sondern Parameter beim Erstellen

    - Funktionen für Color und BackColor erledigt

  • Statusbar small

    • BugFix
    • 7. April 2020 um 18:41

    Mir ist gerade was aufgefallen:

    Es kann ja durchaus sein, dass ich für den letzten Part (den ich derzeit automatisch anpassen lasse) einen fixen Wert möchte. Also werde ich das noch ändern und dann für die Partgrößen auch je Part einen Wert pro Part anfordern.

    Aber nicht mehr heute.

  • Statusbar small

    • BugFix
    • 7. April 2020 um 17:15

    EDIT 04.03.2022

    v 0.3

    • neu: _StatusbarSetOnEvent
    • neu: $g_iStatusAlignLeft, speichert den Standard-Status eines neu erstellten Parts
    • gefixed: Fehler beim Wechsel zwischen Nicht-Standard-Status (__StatusbarSetPartAlign)

    EDIT 08.04.2020

    Ich habe die UDF noch etwas angepasst:

    Ich habe mir hier eine minimale Statusbar-Funktion erstellt. Die existierende UDF ist mir einerseits etwas zu überladen und andererseits zu unkomfortabel.

    Folgende Funktionen bietet meine UDF:

    • _StatusbarCreate (erstellt die Statusbar optional mit Text und dessen Ausrichtung, sowie Fontname, -größe, -style als extra Parameter)
    • _StatusbarSetText (ändert den Inhalt einer/mehrerer Parts)
    • _StatusbarSetAlign (ändert die Ausrichtung eines/mehrerer Parts)
    • _StatusbarSetColors (ändert die Text- und/oder Hintergrundfarbe einzelner/mehrer Parts)

    Ich habe mich zwar etwas an der bestehenden Statusbar-UDF orientiert, es gibt aber einige markante Unterschiede:

    • Die Breite der Parts wird angegeben (nicht die rechte Position).
    • Es sind nur die Breiten für n-1 Parts anzugeben, der letzte Wert wird aus dem verbleibenden Platz ermittelt!
    • Es sind für die Breite alle Parts anzugeben
    • Es kann als Breite "-1" übergeben werden. Für diese(n) Part(s) wird der verbleibende Platz mit anderen auf "-1" gesetzten Parts gleichmäßig aufgeteilt.
    • Bei der Breitenbestimmung entstehende (Rundungs)Differenzen werden zur Korrektur auf das letzte mit "-1", alternativ auf das letzte Part angewendet. 
    • Es existiert ein extra Parameter beim Erstellen, sowie eine eigene Funktion für die Ausrichtung der Parts.
    • Alle Parameter (Partbreite, Part-Index, Texte, Ausrichtung) können wahlweise als separierter String (Opt("GuiDataSeparatorChar")) oder Array übergeben werden
    • Die Text- und/oder Hintergrundfarbe einzelner/mehrerer/aller Parts kann per Funktion gesetzt werden

    Hier ein Bsp. Skript zur Veranschaulichung. Details sind den Funktionsbeschreibungen zu entnehmen.

    AutoIt: statusbar_small_Bsp.au3
    ;-- TIME_STAMP   2022-02-28 14:53:49
    
    Opt('MustDeclareVars', 1)
    
    #include 'statusbar_small.au3'
    
    Global $g_aStBar, $g_iPartTime, $g_idMsg, $g_idNext
    
    _Example_1()
    _Example_2()
    _Example_3()
    _Example_4()
    _Example_5()
    _Example_6()
    _Example_7()
    
    
    Func _Example_1()
        Local $hGui = GUICreate('Test Statusbar small - [ 1 ]', -1, -1, -1, -1, 0x00040000)
        GUICtrlCreateButton('', 0, 0, 1, 1) ; catch focus
        GUICtrlCreateEdit('• size of parts as array passed' & @CRLF & _
                          '• text of parts as string passed' & @CRLF & _
                          '• align for parts as string passed' & @CRLF & _
                          '• font + style defined' & @CRLF, _
                          10, 10, 380, 150)
        GUICtrlSetFont(-1, 9, Default, Default, 'Consolas')
        $g_idMsg = GUICtrlCreateInput('', 10, 180, 380, 20)
        $g_idNext = GUICtrlCreateLabel('', 10, 220, 300, 17)
        GUICtrlSetColor(-1, 0xFF0000)
    
        Local $aParts[] = [-1,-1,-1,80] ; 4.th part fix
        $g_aStBar = _StatusbarCreate($hGui, _
                  $aParts, _
                  'Date|' & StringFormat('%d-%02d-%d', @YEAR, @MON, @MDAY) & '|Time|' & StringFormat('%02d:%02d:%02d', @HOUR, @MIN, @SEC), _
                  'l|c|l|c', _    ; Align: left|center|left|center
                  'Verdana|11|3') ; bold+italic
    
        $g_iPartTime = 3
        AdlibRegister(_Time, 1000)
        GUISetState()
    
        _Msg("Font: Verdana, Size: 11, Style: bold & italic, Align: center")
        Local $timer = TimerInit()
        Do
            If TimerDiff($timer) >= 3000 And GUICtrlRead($g_idNext) = '' Then
                _Next("Close window to display the next example.")
            EndIf
        Until GUIGetMsg() = -3
        AdlibUnRegister(_Time)
        GUIDelete($hGui)
    
        Return
    EndFunc
    
    
    Func _Example_2()
        Local $hGui = GUICreate('Test Statusbar small - [ 2 OnTop]', -1, -1, -1, -1, 0x00040000)
        GUICtrlCreateButton('', 0, 0, 1, 1) ; catch focus
    
        Local $aParts[] = [-1,-1,-1,80] ; 4.th part fix
        $g_aStBar = _StatusbarCreate($hGui, _
                  $aParts, _
                  'Date|' & StringFormat('%d-%02d-%d', @YEAR, @MON, @MDAY) & '|Time|' & StringFormat('%02d:%02d:%02d', @HOUR, @MIN, @SEC), _
                  'l|c|l|c', _          ; Align: left|center|left|center
                  'Verdana|11|3', _     ; bold+italic
                  True)                 ; position On Top
        Local $yTop = $g_aStBar[0][2]   ; the height of the status bar
        GUICtrlCreateEdit('• position on top' & @CRLF & _
                          '• size of parts as array passed' & @CRLF & _
                          '• text of parts as string passed' & @CRLF & _
                          '• align for parts as string passed' & @CRLF & _
                          '• font + style defined' & @CRLF, _
                          10, $yTop+10, 380, 150)
        GUICtrlSetFont(-1, 9, Default, Default, 'Consolas')
        $g_idMsg = GUICtrlCreateInput('', 10, $yTop+180, 380, 20)
        $g_idNext = GUICtrlCreateLabel('', 10, $yTop+220, 300, 17)
        GUICtrlSetColor(-1, 0xFF0000)
    
    
        $g_iPartTime = 3
        AdlibRegister(_Time, 1000)
        GUISetState()
    
        _Msg("Font: Verdana, Size: 11, Style: bold & italic, Align: center")
        Local $timer = TimerInit()
        Do
            If TimerDiff($timer) >= 3000 And GUICtrlRead($g_idNext) = '' Then
                _Next("Close window to display the next example.")
            EndIf
        Until GUIGetMsg() = -3
        AdlibUnRegister(_Time)
        GUIDelete($hGui)
    
        Return
    EndFunc
    
    
    Func _Example_3()
        Local $hGui = GUICreate('Test Statusbar small - [ 3 ]', -1, -1, -1, -1, 0x00040000)
        GUICtrlCreateButton('', 0, 0, 1, 1)
        GUICtrlCreateEdit('• size of parts as string passed' & @CRLF & _
                          '• text of parts as string passed' & @CRLF & _
                          '• align for parts as string passed' & @CRLF & _
                          '• font + style defined' & @CRLF, _
                          10, 10, 380, 150)
        GUICtrlSetFont(-1, 9, Default, Default, 'Consolas')
        $g_idMsg = GUICtrlCreateInput('', 10, 180, 380, 20)
        $g_idNext = GUICtrlCreateLabel('', 10, 220, 300, 17)
        GUICtrlSetColor(-1, 0xFF0000)
    
        $g_aStBar = _StatusbarCreate($hGui, _
                  '-1|80|-1', _
                  StringFormat('%d-%02d-%d', @YEAR, @MON, @MDAY) & '|Time|' & StringFormat('%02d:%02d:%02d', @HOUR, @MIN, @SEC), _
                  'c|r|c', _            ; Align: center|right|center
                  'Comic Sans MS|11|2') ; italic
    
        $g_iPartTime = 2
        AdlibRegister(_Time, 1000)
        GUISetState()
    
        _Msg("Font: Comic Sans MS, Size: 11, Style: italic, Align: center | right | center")
        Local $timer = TimerInit()
        Do
            If TimerDiff($timer) >= 3000 And GUICtrlRead($g_idNext) = '' Then
                _Next("Close window to display the next example.")
            EndIf
        Until GUIGetMsg() = -3
        AdlibUnRegister(_Time)
        GUIDelete($hGui)
    
        Return
    EndFunc
    
    
    Func _Example_4()
        Local $hGui = GUICreate('Test Statusbar small - [ 4 ]', -1, -1, -1, -1, 0x00040000)
        GUICtrlCreateButton('', 0, 0, 1, 1)
        GUICtrlCreateEdit('• size of parts as string passed' & @CRLF & _
                          '• text of parts as string passed' & @CRLF & _
                          '• align for parts as array passed' & @CRLF, _
                          10, 10, 380, 150)
        GUICtrlSetFont(-1, 9, Default, Default, 'Consolas')
        $g_idMsg = GUICtrlCreateInput('', 10, 180, 380, 20)
        $g_idNext = GUICtrlCreateLabel('', 10, 220, 300, 17)
        GUICtrlSetColor(-1, 0xFF0000)
    
        Local $aText[] = ['Date',StringFormat('%d-%02d-%d', @YEAR, @MON, @MDAY),'Time',StringFormat('%02d:%02d:%02d', @HOUR, @MIN, @SEC)]
        Local $aAlign[] = ['c','r','c','r']
        $g_aStBar = _StatusbarCreate($hGui, _
                  '-1|90|-1|90', _
                  $aText, _
                  $aAlign) ; Align: center|right|center|right
    
        $g_iPartTime = 3
        AdlibRegister(_Time, 1000)
        GUISetState()
    
        _Msg("Font/Size/Style: default(Arial/9/none), Align: center | right | center | right")
        Local $timer = TimerInit()
        Do
            If TimerDiff($timer) >= 3000 And GUICtrlRead($g_idNext) = '' Then
                _Next("Close window to display the next example.")
            EndIf
        Until GUIGetMsg() = -3
        AdlibUnRegister(_Time)
        GUIDelete($hGui)
    
        Return
    EndFunc
    
    
    Func _Example_5()
        Local $hGui = GUICreate('Test Statusbar small - [ 5 ]', -1, -1, -1, -1, 0x00040000)
        GUICtrlCreateButton('', 0, 0, 1, 1)
        GUICtrlCreateEdit('• statusbar with one part' & @CRLF & _
                          '• change align 4 times (each 3s)' & @CRLF, _
                          10, 10, 380, 150)
        GUICtrlSetFont(-1, 9, Default, Default, 'Consolas')
        $g_idMsg = GUICtrlCreateInput('', 10, 180, 380, 20)
        $g_idNext = GUICtrlCreateLabel('', 10, 220, 300, 17)
        GUICtrlSetColor(-1, 0xFF0000)
    
        $g_aStBar = _StatusbarCreate($hGui, -1, StringFormat('%02d:%02d:%02d', @HOUR, @MIN, @SEC)) ; Align: left
    
        $g_iPartTime = 0
        Local $done = 0, $timer = TimerInit()
        AdlibRegister(_Time, 1000)
        GUISetState()
    
        _Msg("Align: left")
    
    
        Do
            If TimerDiff($timer) >= 12000 And $done = 3 Then
                _StatusbarSetAlign($g_aStBar, '0', 'l')
                $done = 4
                _Msg("Align changed to: left")
                _Next("Close window to display the next example.")
            EndIf
            If TimerDiff($timer) >= 9000 And $done = 2 Then
                _StatusbarSetAlign($g_aStBar, '0', 'c')
                $done = 3
                _Msg("Align changed to: center")
            EndIf
            If TimerDiff($timer) >= 6000 And $done = 1 Then
                _StatusbarSetAlign($g_aStBar, '0', 'r')
                $done = 2
                _Msg("Align changed to: right")
            EndIf
            If TimerDiff($timer) >= 3000 And $done = 0 Then
                _StatusbarSetAlign($g_aStBar, '0', 'c')
                $done = 1
                _Msg("Align changed to: center")
            EndIf
        Until GUIGetMsg() = -3
        AdlibUnRegister(_Time)
        GUIDelete($hGui)
    
        Return
    EndFunc
    
    
    Func _Example_6()
        Local $hGui = GUICreate('Test Statusbar small - [ 6 ]', -1, -1, -1, -1, 0x00040000)
        GUICtrlCreateButton('', 0, 0, 1, 1)
        GUICtrlCreateEdit('• set colors 5 times (each 3s)' & @CRLF, _
                          10, 10, 380, 150)
        GUICtrlSetFont(-1, 9, Default, Default, 'Consolas')
        $g_idMsg = GUICtrlCreateInput('', 10, 180, 380, 20)
        $g_idNext = GUICtrlCreateLabel('', 10, 220, 300, 17)
        GUICtrlSetColor(-1, 0xFF0000)
    
        $g_aStBar = _StatusbarCreate($hGui, _
                  '-1|-1', _
                  StringFormat('%02d.%02d.%d', @MDAY, @MON, @YEAR) & '|' & StringFormat('%02d:%02d:%02d', @HOUR, @MIN, @SEC), _
                  'c|c', _               ; Align: center
                  'Times New Roman|12|0') ; Style 0=normal
    
        $g_iPartTime = 1
        Local $done = 0, $timer = TimerInit()
        AdlibRegister(_Time, 1000)
        GUISetState()
    
        _Msg("Start with default colors")
    
        Do
            If TimerDiff($timer) >= 15000 And $done = 4 Then
                _StatusbarSetColors($g_aStBar, 1, 0x0022FF, 0xEFEF00)   ; blue/yellow Part 2
                $done = 5
                _Msg("Colouring right part change: FG-Blue | BG-Yellow")
                _Next("Close window to display the next example.")
            EndIf
            If TimerDiff($timer) >= 12000 And $done = 3 Then
                _StatusbarSetColors($g_aStBar, 0, 0xEFEF00, 0x0022FF)   ; yellow/blue Part 1
                $done = 4
                _Msg("Colouring left part change: FG-Yellow | BG-Blue")
            EndIf
            If TimerDiff($timer) >= 9000 And $done = 2 Then
                _StatusbarSetColors($g_aStBar)                         ; default colors all parts
                $done = 3
                _Msg("Colouring all parts change: Default")
            EndIf
            If TimerDiff($timer) >= 6000 And $done = 1 Then
                _StatusbarSetColors($g_aStBar, -1, 0x0022AA, 0xFF0000) ; blue/red
                $done = 2
                _Msg("Colouring all parts change: FG-Blue | BG-Red")
            EndIf
            If TimerDiff($timer) >= 3000 And $done = 0 Then
                _StatusbarSetColors($g_aStBar, -1, 0xFF0000, 0x0022AA) ; red/blue
                $done = 1
                _Msg("Colouring all parts: FG-Red | BG-Blue")
            EndIf
        Until GUIGetMsg() = -3
        AdlibUnRegister(_Time)
        GUIDelete($hGui)
    
        Return
    EndFunc
    
    
    Func _Example_7()
        Opt('GUIOnEventMode', 1)
        Local $hGui = GUICreate('Test Statusbar small - [ 7 OnEvent-Mode ]', -1, -1, -1, -1, 0x00040000)
        GUISetOnEvent(-3, __Ex7_Exit)
        GUICtrlCreateButton('', 0, 0, 1, 1)
        GUICtrlCreateEdit('• All parts of the statusbar assigned with an event' & @CRLF & _
                          '• Click on the parts to see the result' & @CRLF, _
                          10, 10, 380, 150)
        GUICtrlSetFont(-1, 9, Default, Default, 'Consolas')
        $g_idMsg = GUICtrlCreateInput('', 10, 180, 380, 20)
        $g_idNext = GUICtrlCreateLabel('', 10, 220, 300, 17)
        GUICtrlSetColor(-1, 0xFF0000)
    
        $g_aStBar = _StatusbarCreate($hGui, _
                  '-1|-1|-1|-1', _
                  'Date|' & StringFormat('%02d.%02d.%d', @MDAY, @MON, @YEAR) & '|Time|' & StringFormat('%02d:%02d:%02d', @HOUR, @MIN, @SEC), _
                  'l|c|l|c', _            ; Align: left|center|left|center
                  'Times New Roman|12|0') ; Style 0=normal
        _StatusbarSetOnEvent($g_aStBar, __Ex7_EventPart_0, 0, 0)
        _StatusbarSetOnEvent($g_aStBar, __Ex7_EventPart_1, 1, 1)
        _StatusbarSetOnEvent($g_aStBar, __Ex7_EventPart_2, 2, 2)
        _StatusbarSetOnEvent($g_aStBar, __Ex7_EventPart_3, 3, 3)
    
    ;   or one function for all parts:
    ;~     _StatusbarSetOnEvent($g_aStBar, __Ex7_EventAllParts)
    
        $g_iPartTime = 3
        Local $done = 0, $timer = TimerInit()
        AdlibRegister(_Time, 1000)
        GUISetState()
    
        While True
            If TimerDiff($timer) >= 3000 And GUICtrlRead($g_idNext) = '' Then
                _Next("Close window to exit.")
            EndIf
            Sleep(20)
        WEnd
    
    EndFunc
    
    Func __Ex7_EventPart_0()
        _Msg('Clicked on "Date"')
    EndFunc
    
    Func __Ex7_EventPart_1()
        _Msg('Clicked on the Date-Value')
    EndFunc
    
    Func __Ex7_EventPart_2()
        _Msg('Clicked on "Time"')
    EndFunc
    
    Func __Ex7_EventPart_3()
        _Msg('Clicked on the Time-Value')
    EndFunc
    
    Func __Ex7_EventAllParts()
        Switch @GUI_CtrlId
            Case $g_aStBar[0][0] ; ID = [part-index][0]
                _Msg('Clicked on "Date"')
            Case $g_aStBar[1][0]
                _Msg('Clicked on the Date-Value')
            Case $g_aStBar[2][0]
                _Msg('Clicked on "Time"')
            Case $g_aStBar[3][0]
                _Msg('Clicked on the Time-Value')
        EndSwitch
    EndFunc
    
    Func __Ex7_Exit()
        Exit
    EndFunc
    
    
    Func _Time()
        _StatusbarSetText($g_aStBar, $g_iPartTime, StringFormat('%02d:%02d:%02d', @HOUR, @MIN, @SEC))
    EndFunc
    
    
    Func _Msg($_sMsg)
        GUICtrlSetData($g_idMsg, $_sMsg)
    EndFunc
    
    
    Func _Next($_sMsg)
        GUICtrlSetData($g_idNext, $_sMsg)
    EndFunc
    Alles anzeigen

    Galerie auf github:BugFix/AutoIt-Scripts

    DL bisher: 143

    Dateien

    statusbar_small.au3 17,2 kB – 359 Downloads statusbar_small_Bsp.au3 11,85 kB – 313 Downloads
  • MsgBox verlangsamt den Skriptablauf unter Win 10

    • BugFix
    • 5. April 2020 um 14:24

    Ich habe mal einen Test mit nim gemacht.

    Code
    import times, winim/lean
    
    
    proc CalcTime(title: string): float =
      var 
        counter: int
        diff: float
      let timer = cpuTime()
      for i in 1..10000000: counter += 1
      diff = cpuTime() - timer
      #echo title, "Elapsed time = ", diff
      result = diff
    
    var 
      minTimeBefore: float = 1.0
      maxTimeBefore: float
      meanTimeBefore: float
      minTimeAfter: float = 1.0
      maxTimeAfter: float
      meanTimeAfter: float
      currentTime: float
    
    for i in 1..10:
      currentTime = CalcTime("Before MsgBox\t")
      if currentTime < minTimeBefore:
        minTimeBefore = currentTime
      elif currentTime > maxTimeBefore:
        maxTimeBefore = currentTime
      meanTimeBefore += currentTime
    
      MessageBox(0, "Round " & $i, "Nim is Powerful", 0)
      currentTime = CalcTime("After MsgBox\t")
      if currentTime < minTimeAfter:
        minTimeAfter = currentTime
      elif currentTime > maxTimeAfter:
        maxTimeAfter = currentTime
      meanTimeAfter += currentTime
    
    meanTimeBefore = meanTimeBefore / 10
    meanTimeAfter = meanTimeAfter / 10
    
    echo "Kürzeste Zeit vor MsgBox  \t", minTimeBefore
    echo "Kürzeste Zeit nach MsgBox \t", minTimeAfter
    echo "Längste Zeit vor MsgBox   \t", maxTimeBefore
    echo "Längste Zeit nach MsgBox  \t", maxTimeAfter
    echo "Mittlere Zeit vor MsgBox  \t", meanTimeBefore
    echo "Mittlere Zeit nach MsgBox \t", meanTimeAfter
    Alles anzeigen

    Ergebnis:

    Code
    Kürzeste Zeit vor MsgBox      0.09299999999999997
    Kürzeste Zeit nach MsgBox     0.08800000000000008
    Längste Zeit vor MsgBox       0.09400000000000031
    Längste Zeit nach MsgBox      0.1029999999999998
    Mittlere Zeit vor MsgBox      0.09490000000000003
    Mittlere Zeit nach MsgBox     0.09459999999999999

    System: Win10 Pro x64, Build 18362

    Hier hat es keinerlei Einfluß auf die Geschwindigkeit. Wie bereits vermutet, könnte das eine gezielte Attacke von $MS gegen AutoIt sein. (Anordnung durch das Trumpeltier? :rofl:)

  • MsgBox verlangsamt den Skriptablauf unter Win 10

    • BugFix
    • 4. April 2020 um 19:37

    [OT - zumindest etwas]

    Unser Datenschutzverantwortlicher hatte mich letztens darauf hingewiesen, dass zwingend auf Windows 10 umgestellt werden müsse um der DSGVO gerecht werden zu können. Ich sagte ihm, dass er den Tag in unsrem Unternehmen eher nicht erleben wird. Er wirkte etwas verdutzt. Daraufhin habe ich ihm nochmals erklärt, dass es einen einfachen Weg gibt personenbezogene Daten von Windows-Schwachstellen fernzuhalten: Intranet! Keiner unserer Warenwirtschafts-PC hat irgendeine Möglichkeit ins INet zu verbinden, sind alle in einem eigenen Netz. Eigene Kabel und Switches - ebenso haben die extra Internet-PC ein komplett eigenes Hardware-Netz.

    Und wenn ich dann so sehe, was mit Win10 in steter Regelmäßigkeit für Probleme auftreten, müsste ich schon mit dem Klammerbeutel gepudert sein um solchen Dreck in die Firma zu integrieren.

    [/OT]

  • Schönheitswettbewerb der Syntax-Parameter im PSPad4AutoIt3 CallTipViewer

    • BugFix
    • 1. April 2020 um 08:21

    Mal als Idee:

    Orientiere dich nicht zu stark an SciTE, sondern drück deinem Projekt mehr deinen individuellen Stempel auf.

    Zur Calltip Anzeige optionaler und nicht-optionaler Parameter legst du einfach fest, dass z. B. die festen Parameter schwarz und die optionalen dunkelgrün (oder wie es dir gefällt) angezeigt werden. Und wenn du mit dem Cursor an der entsprechenden Position bist, wechselst du zu Textstyle fett. Damit ist die Anzeige schlank und es ist Klarheit ob optional oder nicht.

  • Schönheitswettbewerb der Syntax-Parameter im PSPad4AutoIt3 CallTipViewer

    • BugFix
    • 31. März 2020 um 23:26

    OT Professor Bernd

    Sorry, aber du solltest vielleicht nicht ganz so dünnhäutig sein. Ich sehe halt einige Dinge aus einem anderen Winkel als du. Und eine Diskussion, in der alle Argumente bereits 2-mal ausgetauscht wurden muss man nicht bis zum St. Nimmerleinstag fortführen.

    Wenn du hier im Forum postest, musst du damit rechnen, dass es Pro und Kontra gibt. Dass du daraus jetzt den Bogen zu deiner Person spannst ist totaler Quatsch. Hältst du es tatsächlich für wahrscheinlich, dass irgendjemand seine Zeit damit vertut, gezielt die Beiträge eines Users zu "dissen"?

    Ich halte es mal dem pandemiebedingten Quarantänekoller zugute.

  • Schönheitswettbewerb der Syntax-Parameter im PSPad4AutoIt3 CallTipViewer

    • BugFix
    • 31. März 2020 um 21:35

    Diese Syntax wird verwendet in Funktionsbeschreibungen der Hilfe. Da ist das völlig OK, da sichtbar ist mit welchem Wert der optionale Parameter vorbelegt wird.

    In einem Calltip halte ich das für nicht angemessen, da ein dort zugewiesener Wert mir automatisch sagt: der Parameter ist optional. Die eckigen Klammern führen hier nur zu optischer "Überfülle".

    Nicht falsch verstehen, manchmal ist genau sein zu viel des Guten.

  • Schönheitswettbewerb der Syntax-Parameter im PSPad4AutoIt3 CallTipViewer

    • BugFix
    • 31. März 2020 um 21:17

    Ich verstehe den Sinn der eckigen Klammern hier nicht.

    Entweder zeigst du die optionalen Variablen mit Wert an, dann ist klar, dass diese optional sind, oder du zeigst die Klammern zur Kennzeichnung von optional - dann bitte aber ohne Wertzuweisung.

  • Volumenschattenkopie (VSS) unter Win10

    • BugFix
    • 31. März 2020 um 14:22

    Mal ganz dumme Frage: Arbeitet ihr rund um die Uhr oder warum erfolgen Zugriffe während der Datensicherung?

    Ich erledige das alles zwischen 23:00 und 5:00. Zur Sicherung wird die Datenbank dann erst kopiert dann neu indexiert und all der unnütze Schattenmüll entsorgt. Die nun frisch gereinigte DB wird gepackt und die ZIP auf den Backupspeicher geschoben, während die saubere Kopie nun die Original DB ersetzt. (alles natürlich nur bei Erfolg der vorherigen Operation). In 20 Jahren ist meine DB von anfangs ca. 400 MB auf jetzt knapp 2 GB angewachsen aber unverändert schnell. Und seit ich vor etwa 5 Jahren die tägliche Reindexierung eingeführt habe, ist nie wieder ein DB-Problem aufgetreten.

  • WinMove zerstört Label

    • BugFix
    • 28. März 2020 um 18:59

    OMG, steht bei ControlMove leider nicht in der Hilfe, aber wir hatten das Problem schonmal irgendwann. Änderungen von ControlMove werden NICHT im Fenster gespeichert und sind nur temporär. Für fixe Änderung muss man GUICtrlSetPos verwenden.

    Zum Glück ist mir das noch eingefallen, trotzdem Danke für deine Mühe. ;)

  • WinMove zerstört Label

    • BugFix
    • 28. März 2020 um 18:05

    Ich habe mir eine Art dynamische MsgBox erstellt (InfoBox). Dient in erster Linie dazu, Key-Value Paare anzuzeigen. Man kann z.B. die Datensätze einer CSV Datei Satz für Satz anzeigen und die Feldnamen und -Inhalte werden anhand ihrer Länge sauber positioniert. Dazu werden die Label, die die Werte anzeigen, in ihrer Höhe verändert um Multilinefähig zu sein.

    Dabei ist mir übrigens aufgefallen, dass bei Verwendung von GuiCtrlSetData() der neue Inhalt das Label nicht beeinflusst. D.h. man muss es immer wieder löschen und neu erstellen um Werte in dynamischer Größe anzeigen zu können.

    Nun die entsprechenden Berechnungen funktionieren auch wie erwartet. Das einzige Problem: Wenn ich aufgrund veränderter Labelpositionen auch das Fenster in der Größe ändern muss, werden die Multiline-Label geschrottet und die ganze Anzeige fliegt mir um die Ohren. Die Problemfunktion ist tatsächlich WinMove. Kommentiere ich den Aufruf aus, wird alles korrekt positioniert (z.T. dann ausserhalb des sichtbaren Bereiches).

    Das Verhalten kann ich in keiner anderen Konstellation rekonstruieren. Einfache GUI mit mehrzeiligem Label - WinMove - alles ist gut.

    Ich habe im Moment keine Idee. Vielleicht seht ihr mehr als ich.

    Hier das Skript, der betreffende Bereich ist markiert:


    [EDIT] Lösung: GUICtrlSetPos statt ControlMove verwenden

    AutoIt
    ;-- TIME_STAMP   2020-03-28 14:07:26
    
    Local $oAdressBox = _InfoBoxCreate('Meine Adressen', 'Name;Vorname;Strasse Nr;PLZ;Ort;Geburtstag', -1, -1, -1, -1, -1, ';')
    Local $csv = _
    'Meier;Johannes;Grubenweg 18;12345;Münchhausenhofen;01.04.1985' & @LF & _
    'Name der so lang ist, dass er breiter ist, als die zur Verfügung stehende ValueLabel-Breite;Kurt;Am Hänschenhof 33;89553;Burghausenhofen;12.12.1991' & @LF & _
    'Müller;Irma;Am Alten Forstweg 125;33778;Musterwertshausen;23.12.1956'
    
    Local $aCSV = StringSplit($csv, @LF, 1)
    For $i = 1 To $aCSV[0]
        _InfoBoxShow($oAdressBox, $aCSV[$i], -1, ';')
    Next
    
    
    
    Func _InfoBoxCreate($_sTitle, $_sKeyNames, $_xPos=-1, $_yPos=-1, $_wSize=400, $_hSize=200, _
                        $_iMargin=15, $_sDelim=Opt("GUIDataSeparatorChar"))
        If $_wSize = -1 Then $_wSize = 400
        If $_hSize = -1 Then $_hSize = 200
        If $_iMargin = -1 Then $_iMargin = 15
        Local $oInfoBox = ObjCreate("Scripting.Dictionary")
        Local $aSplit = StringSplit($_sKeyNames, $_sDelim, 1)
        $oInfoBox.Add('__Title__', $_sTitle)
        $oInfoBox.Add('__iMargin__', $_iMargin)
        $oInfoBox.Add('__maxLenKey__', Int(($_wSize-$_iMargin)/4)) ; 25% von Fensterbreite abzgl. 1*Rand
        $oInfoBox.Add('__maxLenVal__', $_wSize-$oInfoBox.Item('__maxLenKey__')-$_iMargin-10) ; Platz rechts von Key, abzgl. Abstand zu Key(10) und 1*Rand
        $oInfoBox.Add('__hWnd__', GUICreate('', $_wSize, $_hSize, $_xPos, $_yPos, BitOR(0x00800000,0x80000000))) ; WS_BORDER,WS_POPUP
        GUISetFont(10, 400, Default, 'Courier New', HWnd($oInfoBox.Item('__hWnd__')))
        GUISetBkColor(0xFFFFFF)
        Local $sTitle = GUICtrlCreateLabel($_sTitle, 10, 10, $_wSize-20) ; Titelposition fix mit Abstand 10 zu Fensterrändern
        GUICtrlSetColor(-1, 0x000080)
        GUICtrlSetFont(-1, 11, 600, Default, 'Consolas')
        Local $yKey, $yNew = 35, $aNewY, $aKeyID[$aSplit[0]][6]  ; [[ID-Key, maxY-Key, ID-Val, maxY-Val, iHeightKey, iHeightVal]]
        For $i = 1 To $aSplit[0]
            $oInfoBox.Add($aSplit[$i], '')
            $aKeyID[$i-1][0] = GUICtrlCreateLabel($aSplit[$i], 15, $yNew, $oInfoBox.Item('__maxLenKey__'))
            GUICtrlSetColor(-1, 0x8181C0)
            $aNewY = __InfoBox_NewY(HWnd($oInfoBox.Item('__hWnd__')), $aKeyID[$i-1][0], $yNew, $oInfoBox.Item('__maxLenKey__'))
            ControlMove(HWnd($oInfoBox.Item('__hWnd__')), '', $aKeyID[$i-1][0], $aNewY[1], $aNewY[2], _
                        $oInfoBox.Item('__maxLenKey__'), $yNew+$aNewY[0])
            $aKeyID[$i-1][1] = $yNew+$aNewY[0] ; maxPosY Label
            $aKeyID[$i-1][4] = $aNewY[0]       ; Höhe Label
            $yNew += $aNewY[0] +10
        Next
        $oInfoBox.Add('__aKeyID__', $aKeyID)
        $oInfoBox.Add('__cClose__', GUICtrlCreateButton('OK', $_wSize-75, $yNew, 60, 22, 0x0001)) ; $BS_DEFPUSHBUTTON
        $yNew += 32 ; Buttonhöhe + Diff 10
        ; Resizen Window
        Local $aWin = WinGetPos(HWnd($oInfoBox.Item('__hWnd__')))
        WinMove(HWnd($oInfoBox.Item('__hWnd__')), '', $aWin[0], $aWin[1], $aWin[2], $yNew )
        Return $oInfoBox
    EndFunc
    
    
    Func _InfoBoxShow(ByRef $_oBox, $_sText, $_sTitle=-1, $_sDelim=Opt("GUIDataSeparatorChar"))
        Local $hWnd = HWnd($_oBox.Item('__hWnd__'))
        Local $hLast = GUISwitch($hWnd)
        If $_sTitle <> -1 Then
            $_oBox.Item('__Title__') = $_sTitle
            GUICtrlSetData($_oBox.Item('__Title__'), $_sTitle)
        EndIf
        Local $aID = $_oBox.Item('__aKeyID__')
        Local $aVal = StringSplit($_sText, $_sDelim, 1)
        Local $yNew = 35, $aNewY, $aPos
        ; alle Val-Label erstellen
        For $i = 1 To $aVal[0]
            ; Val setzen, dazu muss Ctrl neu erstellt werden um korrekte Größe zu ermitteln
            ; GUICtrlSetData() verändert nicht die Ctrl-Größe!
            GUICtrlDelete($aID[$i-1][2])
            $aID[$i-1][2] = GUICtrlCreateLabel($aVal[$i], ($_oBox.Item('__iMargin__')+ _
                                               $_oBox.Item('__maxLenKey__')+10), $yNew)
            GUICtrlSetColor(-1, 0x000080)
            ; Platzbedarf ermitteln
            $aNewY = __InfoBox_NewY($hWnd, $aID[$i-1][2], $yNew, $_oBox.Item('__maxLenVal__'))
            $aID[$i-1][3] = $yNew +$aNewY[0] ; maxPosY Label
            $aID[$i-1][5] = $aNewY[0]        ; Höhe Label
            If $aNewY[0] > 25 Then ; mehr als 1 Zeile
                ControlMove($hWnd, '', $aID[$i-1][2], $aNewY[1], $aNewY[2], _
                            $_oBox.Item('__maxLenVal__'), $yNew+$aNewY[0])
            EndIf
            $yNew += $aNewY[0] +10
        Next
    
        Local $yLastKey, $yLastVal, $bChanged = False
        For $i = 1 To UBound($aID) -1 ; erstes Ctrl überspringen, da keine untersch. y-Pos möglich
            $yLastKey = $aID[$i-1][1]
            $yLastVal = $aID[$i-1][3]
            If $yLastKey = $yLastVal Then
                $yNew = $yLastKey +10
            ElseIf $yLastKey < $yLastVal Then ; Value vertikal Size > Key vertikal Size
                $yNew = $yLastVal +10
            Else                              ; Value vertikal Size < Key vertikal Size
                $yNew = $yLastKey +10
            EndIf
            If $yNew <> $aID[$i][4] - $aID[$i][1] Then ; Key muss verschoben werden
                $aPos = ControlGetPos($hWnd, '', $aID[$i][0])
                $aID[$i][1] = $yNew+$aID[$i][4]
                ControlMove($hWnd, '', $aID[$i][0], $aPos[0], $yNew, $aPos[2], $aID[$i][1])
                $bChanged = True
            EndIf
            If $yNew <> $aID[$i][5] - $aID[$i][3] Then ; Val muss verschoben werden
                $aPos = ControlGetPos($hWnd, '', $aID[$i][2])
                $aID[$i][3] = $yNew+$aID[$i][5]
                ControlMove($hWnd, '', $aID[$i][2], $aPos[0], $yNew, $aPos[2], $aID[$i][3])
                $bChanged = True
            EndIf
        Next
    
        ; OK-Button verschieben und Fenster Resizen
        If $bChanged Then
            $yNew =  $aID[UBound($aID)-1][3] +10
            $aPos = ControlGetPos($hWnd, '', $_oBox.Item('__cClose__'))
            ControlMove($hWnd, '', $_oBox.Item('__cClose__'), $aPos[0], $yNew)
            Local $aWin = WinGetPos($hWnd)
    ;###################################################################################################
    ; WinMove zerschießt die Labelgröße, aber nur hier im Skript. Wird es auskommentiert, bleiben die
    ; Label in richtiger Größe erhalten. Wenn Button 'OK' nicht sichtbar ist - mit <Enter> bestätigen.
            WinMove($hWnd, '', $aWin[0], $aWin[1], $aWin[2], $yNew+10)
    ;###################################################################################################
        EndIf
    
        $_oBox.Item('__aKeyID__') = $aID
        GUISetState(@SW_SHOW, $hWnd)
    
        Local $opt = Opt('GUIOnEventMode', 0)
        Do
        Until GUIGetMsg() = $_oBox.Item('__cClose__')
    
        GUISetState(@SW_HIDE, $hWnd)
        Opt('GUIOnEventMode', $opt)
        GUISwitch($hLast)
    EndFunc
    
    
    Func __InfoBox_NewY($_hGui, $_cCtrl, $_yLast, $_maxLenCtrl)
        Local $aSize = ControlGetPos($_hGui, '', $_cCtrl)
        Local $lenText = $aSize[2]
        Local $factorLines = Ceiling($lenText / $_maxLenCtrl) ; Anzahl Zeilen für vorhandene Labelbreite
        Local Const $rowHeight = 17
        Local $hSizeLabel = $rowHeight*$factorLines
        Local $aRet[] = [$hSizeLabel, $aSize[0], $aSize[1]]
        Return $aRet
    EndFunc
    Alles anzeigen
  • Reguläre Ausdrücke n-Mal wiederholt

    • BugFix
    • 27. März 2020 um 12:39

    Eckige Klammern bilden eine Klasse. Du kannst dort z B. mehrere Zeichen, die an dieser Stelle, in beliebiger Folge, auftreten dürfen zusammenfassen. Außerhalb der Klammer kannst du dann die üblichen Multiplier setzen: + oder *.

    Es gibt auch vorgefertigte Klassen, kannst du im Detail in der Hilfe zu StringRegEx nachlesen.

    Um das mehrfache Auftreten zu matchen, bildest du eine Gruppe durch (...) und setzt das Flag 3 in der Abfrage. Dann hast du ein Ergebnisarray mit den Treffern.

  • Allgemeiner Meinungsaustausch zum Thema "Corona"

    • BugFix
    • 26. März 2020 um 10:16

    homeoffice.jpeg

    #HOMEOFFICE

  • Debugger für AutoIt3 - sinnfrei oder sinnvoll?

    • BugFix
    • 25. März 2020 um 18:50

    Wie Oscar korrekt sagte, ist mit der Ausgabe in die Konsole alles geregelt.

    Das, was man von einem Debugger sonst so geliefert bekommt, ist in AutoIt aufgrund der Sprache von vornherein ausgeschlossen: z.B. Prüfen auf Typunverträglichkeit Diese Fehler kann man in AutoIt nicht aufdecken durch den allmächtigen Datentyp "variant".

  • Debugger für AutoIt3 - sinnfrei oder sinnvoll?

    • BugFix
    • 25. März 2020 um 18:29
    Zitat von Professor Bernd

    Nun ist schon des öfteren von BugFix als sinnfrei bezeichnet worden, für AutoIt einen Debugger zu erstellen, oder zu benutzen.

    :rofl:

    Ein funktionierender Debugger kann durchaus hilfreich sein (auch wenn ich ihn in meinen 14 Jahren mit AutoIt nie wirklich vermisst habe). Meine Ablehnung bezog sich ganz speziell auf den/die existierenden Produkte.

  • SciTE - Option "MustDeclareVars" mittels Property automatisch setzen

    • BugFix
    • 25. März 2020 um 17:53

    Deswegen ich zitiere mich selber

    Zitat

    Deshalb mein Verweis auf Alien, damit kann ich die WinAPI für Lua nutzbar machen.

    Alles was du ansprichst bedarf zusätzlicher Module in Lua, wenn ich es in reinem Lua lösen will.

    Ich denke wir machen dann erst mal ein Break an dieser Stelle.

  • SciTE - Option "MustDeclareVars" mittels Property automatisch setzen

    • BugFix
    • 25. März 2020 um 16:24
    Zitat von Professor Bernd

    Warum sollte das den nicht greifen? Die Quell-Datei existiert doch und kann geprüft werden. Wenn die Quell-Datei existiert, war sich schon gespeichert. Ist keine Option (mustdeclarevars) drin, kann davon ausgeganen werden, dass sie auch beim Speichern nicht eingefügt werden soll.

    Die Aussage von mir war keine Vermutung, sondern eine durch mein Skript (das die Prüfung ja vornimmt) validierte Beschreibung des Ist-Zustandes.

    Noch mal:

    Wenn die Option NUR bei NEUER Datei eingefügt werden soll, ist aktuell folgendes Verhalten:

    Wenn das Bevor-Speichern Ereignis ausgelöst wird, erfolgt im Ereignis-Handler die Abfrage, ob die Datei, deren Name zum Speichern übergeben wird, bereits existiert. Dabei ist NICHT ersichtlich ob es vielleicht eine Datei identischen Inhalts gibt. Existiert die Datei, wird die Funktion verlassen.

    <Speichern> einer bereits existierenden Datei

    Die Abfrage auf Existenz ist wahr und die Funktion wird verlassen. --> OK

    <Speichern-Als> einer existierenden Datei unter neuem Namen

    Es wird der Datei-Speichern-Unter-Dialog aufgerufen. Der Dateiname aus dem Dialog wird verwendet. Der Name ist neu und somit wird die Option eingefügt. Beim Speichern unter wird mit Schliessen des Dialogfensters der Tab mit der Quelldatei geschlossen. Es kann auf dem Weg nicht festgestellt werden, ob die (zuletzt offene Datei) inhaltlich mit der Zieldatei übereinstimmt und somit nur umbenannt wird.

    <Speichere Kopie>

    Ist analog, wie bei <Speichern-Als>


    Das vermutliche interne Verhalten, woraus das resultiert, habe ich in meinem letzten Post beschrieben.

    Eine Abfrage der Existenz der Quelldatei im Falle von <Speichern-Als>/<Speichern Kopie> ist somit nicht realisierbar, da der Name der jeweiligen Datei zum Ereignis-Moment NICHT abfragbar ist.

    Zitat von Professor Bernd

    Ist keine Option (mustdeclarevars) drin, kann davon ausgeganen werden, dass sie auch beim Speichern nicht eingefügt werden soll.

    Dann funktioniert ja die ganze Einfügeautomatik, die ich ja bei neuen Skripten WILL nicht mehr. Und ich kann alles einfach von Hand eintragen.

  • SciTE - Option "MustDeclareVars" mittels Property automatisch setzen

    • BugFix
    • 25. März 2020 um 15:32
    Zitat von Professor Bernd

    Man hat eine Datei geöffnet und will sie speichern als Kopie. Also existiert die Quell-Datei schon und man kann

    Ich frage ja ab: if mustdeclare == 1 and shell.fileexists(fname) then return end.

    Das greift aber nicht bei Dateien, die mit "Speichern-Als", "Speichere Kopie" gesichert werden sollen. Denn die Zieldateien existieren ja nicht, somit sind es Neudateien und die Option wird eingefügt.

    Das eigentlich Paradoxe ist, dass bei "Speichern-Als", "Speichere Kopie" AUCH in die Quelldatei, die bisher keine Option hatte, diese eingefügt wird. Anscheinend wird aus der Quelldatei zuerst die Zieldatei erstellt (durch umbenennen? - Quelle existiert dann nicht mehr). Danach wird die Quelle neu erstellt, was für uns nicht weiter sichtbar ist, da sie ihren alten Namen trägt. Zum Zeitpunkt des Speicherns ist sie dann aber AUCH neu und die Option wird eingefügt. - Das wäre zumindest für mich eine plausible Erklärung. Bleibt jetzt die Frage, wie man an diese Ereignisse kommt. Deshalb mein Verweis auf Alien, damit kann ich die WinAPI für Lua nutzbar machen.

  • SciTE - Option "MustDeclareVars" mittels Property automatisch setzen

    • BugFix
    • 25. März 2020 um 13:50

    Das passiert ja, aber es ist nicht in allen Fällen aussagekräftig:

    - Options-Flag: nur bei neuen Dateien Option einfügen

    - Datei ohne Option ist offen und soll gespeichert werden als Kopie (da z.B. schreibgeschützte Datei)

    --> die Kopie existiert noch nicht, somit wird die Option eingetragen (will ich in dem Moment ja nicht)


    Das Problem ist, dass das Ereignis (OnBeforeSave) mir nicht mitteilt, welcher Menübefehl davor gestartet wurde (save, saveAs, savAsCopy). Somit sind nicht alle Szenarien durchspielbar. Eventuell werde ich den Zugriff mit Alien erweitern, aber das schaue ich mir noch in Ruhe an.

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™