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

  • Incorrect Number of subscripts bei _GUICtrlListView_AddArray

    • BugFix
    • 16. April 2018 um 15:51

    Einfach mal das Neuzeichnen initiieren ( _WinAPI_RedrawWindow( Handle_Listview ) ).

  • [Gelöst] WinGetPos liefert unterschiedliche Werte...

    • BugFix
    • 16. April 2018 um 12:42

    Bei mir passt es, Win7 Pro x64

  • delete query funktioniert in der workbench, aber nicht in Autoit

    • BugFix
    • 16. April 2018 um 11:58
    Zitat von lloid

    Vielmehr waren es die Kombinationen von Gänsefüßchen

    Aus diesem Grund verweise ich gerne mal wieder auf die (leider viel zu oft vernachlässigte) Funktion StringFormat.

    Das macht die Angelegenheit auch viel besser lesbar. ;)

    C
    $query = StringFormat("DELETE FROM `%s`.`%s` WHERE `%s`='%s' AND `%s`='%s'", $MySQLDbName, $MySQLTimeTable, _
             $MySQLTableUser, $ListViewArr[$ArrLine][1], $MySQLTableTimeIndex, $ListViewArr[$ArrLine][0])
  • _GUICtrlListView_MoveItem -- markierten Eintrag im Listview auf/ab verschieben

    • BugFix
    • 10. April 2018 um 11:12

    Habe die Funktion jetzt umgeschrieben. Nun ist auch ein Verschieben bei Mehrfachauswahl möglich. Die markierten Zeilen müssen nicht zusammenhängend sein.

    C
    #Include <GuiListView.au3>
    
    Example()
    
    Func Example()
        GUICreate("Move selected Item", 400, 400)
        Local $listview = GUICtrlCreateListView("col_0|col_1 |col_2 |col_3 ", 10, 10, 350, 380, $LVS_SHOWSELALWAYS)
        Local $hLV = GuiCtrlGetHandle($listview)
        Local $down = GUICtrlCreateButton('/\', 370, 10, 15, 15)
        Local $up = GUICtrlCreateButton('\/', 370, 26, 15, 15)
        For $i = 1 To 20
            GUICtrlCreateListViewItem(StringFormat("%02i|%02i_col_1|%02i_col_2|%02i_col_3", $i, $i, $i, $i), $listview)
        Next
        GUISetState()
    
        While 1
            Switch GUIGetMsg()
                Case $up
                    _GUICtrlListView_MoveItem($hLV, 1)
                Case $down
                    _GUICtrlListView_MoveItem($hLV, -1)
                Case -3
                    Exit
            EndSwitch
        WEnd
    EndFunc ;==>Example
    
    
    
    ;===============================================================================
    ; Function Name....: _GUICtrlListView_MoveItem
    ; Description......: Verschiebt den Inhalt eines od. mehrerer (bei Multilineselektion) markierter Item um jeweils eine Position auf-/abwärts
    ; Parameter(s).....: $_hWnd Listview-ID oder /-Handle
    ; .................: $_i RichtungsIndex (1 aufwärts/ -1 abwärts)
    ; Requirement(s)...: GuiListView.au3
    ; Return Value(s)..: keine
    ; Author(s)........: BugFix ( bugfix@autoit.de )
    ;===============================================================================
    Func _GUICtrlListView_MoveItem($_hWnd, $_i)
        If Not IsHWnd($_hWnd) Then $_hWnd = GuiCtrlGetHandle($_hWnd)
        Local $count = _GUICtrlListView_GetItemCount($_hWnd)
        Local $aIndex = _GUICtrlListView_GetSelectedIndices($_hWnd, True)
        If $aIndex[0] = 0 Then Return  ; nichts markiert
        _ArraySort($aIndex, 0, 1)
        Switch $_i
            Case 1
                If $aIndex[$aIndex[0]] = $count -1 Then Return  ; letzter Eintrag ist markiert, kann nicht weiter nach unten verschoben werden
                For $i = $aIndex[0] To 1 Step -1
                    __GuiCtrlListView_SubItemMove($_hWnd, $aIndex[$i], 1)
                    _GUICtrlListView_SetItemSelected($_hWnd, $aIndex[$i], False)
                    _GUICtrlListView_SetItemSelected($_hWnd, $aIndex[$i] +1, True, True)
                Next
            Case -1
                If $aIndex[1] = 0 Then Return  ; erster Eintrag ist markiert, kann nicht weiter nach oben verschoben werden
                For $i = 1 To $aIndex[0]
                    __GuiCtrlListView_SubItemMove($_hWnd, $aIndex[$i], -1)
                    _GUICtrlListView_SetItemSelected($_hWnd, $aIndex[$i], False)
                    _GUICtrlListView_SetItemSelected($_hWnd, $aIndex[$i] -1, True, True)
                Next
        EndSwitch
    EndFunc ;==>_GUICtrlListView_MoveItem
    
    
    Func __GuiCtrlListView_SubItemMove($_hWnd, $_iIndex, $_iUpDown)
        Local $aItem = _GUICtrlListView_GetItemTextArray($_hWnd, $_iIndex)
        Local $indxTmp = $_iIndex + ($_iUpDown)
        Local $aTmp = _GUICtrlListView_GetItemTextArray($_hWnd, $indxTmp)
        For $i = 1 To $aItem[0]
            _GUICtrlListView_SetItemText($_hWnd, $indxTmp, $aItem[$i], $i-1)
            _GUICtrlListView_SetItemText($_hWnd, $_iIndex, $aTmp[$i], $i-1)
        Next
    EndFunc ;==>__GuiCtrlListView_SubItemMove
    Alles anzeigen
  • Datei Time (Erstellung, Bearbeitung, letzter Zugriff) mit unterschiedlichen Ergebnissen

    • BugFix
    • 2. April 2018 um 21:27
    Zitat von Peter S. Taler

    ist es dann nicht einfacher eine Datenquelle bereitzustellen, die ein Sync der Daten überflüssig macht, da es keine "doppelte" Datenhaltung gibt?

    Nein, keine Option. Wenn ich im Firmenstammsitz arbeite (1-mal im Monat für eine Woche), habe ich meinen PC an dem ich Dateien bearbeite, die ich sonst auch auf meinem Laptop vorhalte und bearbeite. Nur eine Datenquelle (z.B. USB-Stick) wäre theoretisch denkbar, Jedoch als alleinigen Datenspeicher möchte ich den nicht haben. Jedes mal kpl. kopieren ist schwachsinnig, also bleibt nur Synchronisation.

  • _GUICtrlListView_MoveItem -- markierten Eintrag im Listview auf/ab verschieben

    • BugFix
    • 1. April 2018 um 10:46

    Machbar sicher, müsste man die Funktion umschreiben. Kann dir nicht versprechen, dass ich mich da umgehend ransetze. Merke es aber mal vor.

  • Datei Time (Erstellung, Bearbeitung, letzter Zugriff) mit unterschiedlichen Ergebnissen

    • BugFix
    • 31. März 2018 um 13:22

    Wie richtig vermutet, will ich Dateistand identisch halten auf mehreren Standorten (PC, Laptop und Sicherungsstick).

    Ich bearbeite Dateien mal am PC, mal am Laptop und möchte wechselseitig auch von dort sichern. Die Synchronisationsregeln festzulegen ist schon kompliziert genug. Somit wären die FileTime-Informationen eine wichtige Information.

    Da diese aber nicht zwingend zuverlässig sind, werde ich einen anderen Weg finden müssen.

    Als Idee:

    In jedem Ordner eine Datenbankdatei mit Auflistung aller Dateien des Ordners und dem zugehörigen Datum der letzen Änderung, welches bei jedem Speichern der Datei aktualisiert wird.

    Auf dem anderen PC /Datenträger wird analog abgelegt. Um die Notwendigkeit der Synchronisation festzustellen, vergleiche ich dann die Änderungszeiten aus den Datenbanken. Die sind in sich konsistent und unabhängig von ungewollten Änderungen der Dateiinfo.

    Ich habe schon verschiedene Sync-Tools getestet, aber noch keines gefunden, dass mich überzeugen konnte. Deshalb möchte ich mir etwas skripten, was genau das tut, was ich will. ;)

  • Datei Time (Erstellung, Bearbeitung, letzter Zugriff) mit unterschiedlichen Ergebnissen

    • BugFix
    • 31. März 2018 um 10:11
    Zitat von misterspeed

    Naja, steht ja eigentlich schon in dem verlinkten Autoit Hilfeeintrag von dir?

    Nicht wirklich. Ich habe Dateien betrachtet, auf die letztmalig vor > 1 Monat zugegriffen wurde. Das Problem der verzögerten Info besteht somit nicht.

    Zitat von autoiter

    Mir ist aufgefallen, dass du in deiner Funktion "modified" und "accessed" vertauscht hast.

    Oops. :huh:

    Unabhängig von dieser Vertauschung habe ich jetzt mal diverse Dateien betrachtet (vergleichsweise die Angaben im Explorer angesehen).

    Fazit: Die Infos zur Dateizeit sind nur dann zu irgendwas nütze, wenn die Datei auf ihrem "Entstehungsort" (Laufwerk) verbleibt. Jeder Kopiervorgang kann zu einer Änderung der Dateiinfos führen.

    Ich habe noch kein System erkannt, wann und wann nicht Änderungen stattfinden.

    Landet die Datei auf einem anderen physischen Laufwerk, wird das Erstelldatum auf den Zeitpunkt des Kopiervorgangs gesetzt. Kann man nur unterbinden, wenn man Schreibschutz setzt. Spaßigerweise werden die Daten für Änderung und Zugriff nicht angepasst und liegen jetzt vor dem Erstelldatum! -- Das ist die Ursache für die entdeckten Diskrepanzen.

    Ich bin mir aber nicht sicher, ob das wirklich immer genau so passiert.

    Meiner Meinung nach sind die Datei-Zeit-Informationen keine zuverlässigen Angaben um Datei zu vergleichen.

  • Datei Time (Erstellung, Bearbeitung, letzter Zugriff) mit unterschiedlichen Ergebnissen

    • BugFix
    • 30. März 2018 um 13:01

    Ich benötige für Synchronisationsvorgänge die Datei-Time Werte mit Milisekunden und verwende deshalb _Date_Time_GetFileTime zur Abfrage.

    Laut Funktionsbeschreibung gibt es zwar Probleme in der Verfügbarkeit der Infos abhängig vom Dateisystem. Aber grundsätzlich sollten zumindest die Dateiinformationen identisch abfragbar sein:

    [0] - $tagFILETIME structure with the date and time the file was created

    [1] - $tagFILETIME structure with the date and time the file was accessed

    [2] - $tagFILETIME structure with the date and time the file was modified

    Das stimmt, wenn ich Dateien von der Festplatte (NTFS) abfrage.

    Bei Abfrage von einem USB-Stick (NTFS) ist Last Access eindeutig das Create-Datum (am Ältesten).

    Bei einem anderen USB-Stick (NTFS, derselbe Hersteller) ist das Create-Datum OK. Aber Modified ist frischer als Last Access? Wie kann eine Datei modifiziert sein, ohne dass darauf zugegriffen wird?

    Auf einer SD-Card im NTFS stimmt die Zuordnung.

    Obwohl alle Datenträger NTFS haben, bekomme ich unterschiedliche Ergebnisse. Für mich unerklärlich.

    Vielleicht könnt ihr mal bei euch mit verschiedenen Datenträgern testen und mitteilen, was bei euch rauskommt.

    Testskript:

    C
    #include <WinAPI.au3>
    #include <Date.au3>
    
    Local $sFile = "YourFilePath"
    
    ConsoleWrite('Created:     ' & _GetFileTime($sFile, 0, 2) & @CRLF)
    ConsoleWrite('Modified:    ' & _GetFileTime($sFile, 1, 2) & @CRLF)
    ConsoleWrite('Last Access: ' & _GetFileTime($sFile, 2, 2) & @CRLF)
    
    
    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _GetFileTime
    ; Description ...: Gets the time of creation, modification or last access of an file.
    ; ...............: Compared to the FileGetTime function, the weekday and milliseconds can also be queried here.
    ; Parameters ....: $_sFile    The file path.
    ; ...............: $_iPart    What to get: 0=created, 1=modified(Default), 2=last access
    ; ...............: $_iString  The kind of return. -1=Array  [Month, Day, Year, Hour, Minutes, Seconds, Milliseconds, Day of week] (Default)
    ; ...............:                                 0=String 'mm/dd/yyyy hh:mm:ss'
    ; ...............:                                 1=String 'yyyy/mm/dd hh:mm:ss'
    ; ...............:                                 2=String 'yyyy/mm/dd hh:mm:ss.ms'
    ; ...............:                                 3=String 'day yyyy/mm/dd hh:mm:ss.ms'  (day in short form)
    ; Return values .: Array or string with data of file time.
    ; Author ........: BugFix
    ; Remarks .......: Required: #include <WinAPI.au3>, #include <Date.au3>
    ; ===============================================================================================================================
    Func _GetFileTime($_sFile, $_iPart=1, $_iString=-1)
        Local Static $iLang = StringInStr(' 0407 0807 0C07 1007 1407 ', ' ' & String(@OSLang) & ' ') <> 0 ? 1 : 0
        Local Static $aWDay[7][2] = [['Sun','So'],['Mon','Mo'],['Tue','Di'],['Wed','Mi'],['Thur','Do'],['Fri','Fr'],['Sat','Sa']]
        Local $vRet, $hFile = _WinAPI_CreateFile($_sFile, 2, 2)
        Local $a_tFILETIME = _Date_Time_GetFileTime($hFile)   ;
        _WinAPI_CloseHandle($hFile)
        If $_iString = 0 Or $_iString = 1 Then
            $vRet = _Date_Time_FileTimeToStr($a_tFILETIME[$_iPart], $_iString)
        Else
            $vRet = _Date_Time_FileTimeToArray($a_tFILETIME[$_iPart])
            If $_iString = 2 Then
                $vRet = StringFormat('%d/%02i/%02i %02i:%02i:%02i.%03i', $vRet[2], $vRet[0], $vRet[1], $vRet[3], $vRet[4], $vRet[5], $vRet[6])
            ElseIf $_iString = 3 Then
                $vRet = StringFormat('%s %d/%02i/%02i %02i:%02i:%02i.%03i', $aWDay[$vRet[7]][$iLang], $vRet[2], $vRet[0], $vRet[1], $vRet[3], $vRet[4], $vRet[5], $vRet[6])
            EndIf
        EndIf
        Return $vRet
    EndFunc  ;==>_GetFileTime
    Alles anzeigen
  • Taskleiste: Icons nach Namen sortieren

    • BugFix
    • 13. März 2018 um 11:06

    Hier findest du Infos dazu: The Taskbar (Windows)

  • Treeview Icons einzeln ändern

    • BugFix
    • 13. März 2018 um 10:57
    Zitat

    GUICtrlCreateGroup('', -99, -99, 1, 1)

    Unter bestimmten Bedingungen ist es nicht erforderlich. Aber es ist ganz sicher von Vorteil, sich anzugewöhnen Gruppen zu schliessen. Dann denkst du wenigstens daran, wenn es erforderlich ist und brauchst dich nicht mit daraus resultierenden Fehlern rumärgern. ;)

    Ist ja mit den Abbrevs auch schnell eingefügt ( gccgc ).

  • Treeview nur Root aufklappen, Bug!?

    • BugFix
    • 12. März 2018 um 15:41

    Deshalb hatte ich mal diese Funktion erstellt:

    AutoIt
    ;==================================================================================================
    ; Function Name: _GUICtrlTreeView_ExpandOneLevel
    ; Description..: Aus/Einklappen nur EINER Ebene eines Items, analog zum Mausklick auf '+/-'
    ; Parameter(s).: $_hWnd     Handle des TreeView
    ; .............: $_hParent  Handle des Item, dessen Childs aus/einzuklappen sind
    ; .............:            Standard 0 ==> Handle des ersten Item im TreeView
    ; .............: $_fExpand  Standard TRUE ==> Ausklappen, Einklappen mit FALSE
    ; Return.......: Erfolg     Handle des Item, dessen Childs aus/eingeklappt wurden
    ; .............: Fehler     @error 1  -  TreeView enthält kein Item
    ; .............:            @error 2  -  Item hat keine Child-Item
    ; Note.........: Die Funktion sollte zwischen _GUICtrlTreeView_BeginUpdate() und _GUICtrlTreeView_EndUpdate()
    ; .............: ausgeführt werden um ein Flackern zu verhindern
    ; Author(s)....: BugFix (bugfix@autoit.de)
    ;==================================================================================================
    Func _GUICtrlTreeView_ExpandOneLevel($_hWnd, $_hParent=0, $_fExpand=True)
        If Not IsHWnd($_hWnd) Then $_hWnd = GUICtrlGetHandle($_hWnd)
        If $_hParent = 0 Then $_hParent = _GUICtrlTreeView_GetFirstItem($_hWnd)
        If $_hParent = 0 Then Return SetError(1)
        Local $hChild, $countChild = _GUICtrlTreeView_GetChildCount($_hWnd, $_hParent)
        If $countChild = 0 Then Return SetError(2)
        _GUICtrlTreeView_Expand($_hWnd, $_hParent, $_fExpand)
        If Not $_fExpand Then Return $_hParent
        For $i = 1 To $countChild
            If $i = 1 Then
                $hChild = _GUICtrlTreeView_GetFirstChild($_hWnd, $_hParent)
            Else
                $hChild = _GUICtrlTreeView_GetNextSibling($_hWnd, $hChild)
            EndIf
            If _GUICtrlTreeView_GetChildren($_hWnd, $hChild) Then _GUICtrlTreeView_Expand($_hWnd, $hChild, False)
        Next
        Return $_hParent
    EndFunc  ;==>_GUICtrlTreeView_ExpandOneLevel
    Alles anzeigen
  • Brauche ein klein wenig hilfe für mein neues projekt: Mein Serienmanager

    • BugFix
    • 11. März 2018 um 17:24
    Zitat von Gehirntod

    und da die Liste meiner Lieblingsserien immer größer wird

    Zitat von Gehirntod

    einen iniwritebefehl ausführe

    Das beides paßt nicht zusammen. Die INI Größe ist limitiert.

    Was du vorhast, findest du schon fertig im Forum, ordentlich mit SQLite Datenbank. Kann sein, dass es als Bücher- oder Musik- oder Fotoverwaltung vorliegt - aber das ist letztlich gleich.

  • Fenster Größe veränderbar - Minimum nicht unterschreiten

    • BugFix
    • 11. März 2018 um 11:28

    Stimmt auch wieder. ;)

  • Fenster Größe veränderbar - Minimum nicht unterschreiten

    • BugFix
    • 11. März 2018 um 10:57
    Zitat von alpines

    Du musst WM_GETMINMAXINFO dafür verwenden, dann kannst du es auch nicht kleiner ziehen:

    Danke, das wars.

    Aber die Funktion wird ja nur aufgerufen, wenn für das registrierte Fenster die Nachricht auftritt.

    So reicht es völlig:

    Code
    Func _WM_GETMINMAXINFO($hWnd, $iMsg, $wParam, $lParam)
        $tInfo = DllStructCreate("int;int;int;int;int;int;int;int;int;int", $lParam)
        DllStructSetData($tInfo, 7, $aMinSize[0] + 2 * 8)
        DllStructSetData($tInfo, 8, $aMinSize[1] + 2 * 19)
        Return $GUI_RUNDEFMSG
    EndFunc
  • Fenster Größe veränderbar - Minimum nicht unterschreiten

    • BugFix
    • 11. März 2018 um 10:34

    Ich habe ein Formulareingabefenster, und möchte eine Größenänderung durch den User zulassen.

    Minimale Werte für die Fenstergröße sind vorgegeben.

    Die Größe des Fensters wird auch eingehalten. Wenn ich jedoch den rechten Rand/ die rechte untere Ecke zum Ziehen benutze, bleibt der Fensterrand am Minimum stehen, aber die Controls lassen sich beim weiter ziehen verkleinern, trotz Dock am rechten Fensterrand.

    Hat jemand einen Tipp, wie das unterbunden werden kann?

    AutoIt
    #include <WindowsConstants.au3>
    #include <GuiDateTimePicker.au3>
    #include <GUIConstantsEx.au3>
    
    Global $hGui, $hDate, $cbSN, $cbColleague, $inLocation, $hPurchase, $btSave
    Global Enum $iLblDate, $iLblSN, $iLblColleaugue, $iLblLocation, $iLblPurchase, $iBtnSave
    Global $aMinSize[] = [450,300]
    
    ; ==== lesen aus *.cfg ================
    ; iLang = 0-EN, 1-DE
    Global $iLang = 1
    
    Global $aText[6][2] = [ _
    ['Date','Datum'], _
    ['Serial number','Serien-Nr'], _
    ['Colleague','Kollege'], _
    ['Location','Ort'], _
    ['Date of purchase','Einkaufsdatum'], _
    ['Save','Speichern']]
    ; =====================================
    
    _Main($hGui, $hDate, $cbSN, $cbColleague, $inLocation, $hPurchase)
    
    Func _Main(ByRef $_hGui, ByRef $_hDate, ByRef $_cbSN, ByRef $_cbColleague, ByRef $_inLocation, ByRef $_hPurchase)
        $_hGui = GUICreate('Formular', $aMinSize[0], $aMinSize[1], -1,-1,BitOr($GUI_SS_DEFAULT_GUI,$WS_MAXIMIZEBOX,$WS_SIZEBOX))
        GUICtrlCreateLabel($aText[$iLblDate][$iLang], 10, 13, 120)
        GUICtrlSetResizing(-1, $GUI_DOCKALL)
        $_hDate = _GUICtrlDTP_Create($_hGui, 135, 10, 120, 21, $DTS_SHORTDATECENTURYFORMAT)
    
        GUICtrlCreateLabel($aText[$iLblSN][$iLang], 10, 48, 120)
        GUICtrlSetResizing(-1, $GUI_DOCKALL)
        $_cbSN = GUICtrlCreateCombo('', 135, 45, 300)
        GUICtrlSetResizing(-1, BitOR($GUI_DOCKLEFT,$GUI_DOCKRIGHT,$GUI_DOCKTOP,$GUI_DOCKHEIGHT))
    
        GUICtrlCreateLabel($aText[$iLblColleaugue][$iLang], 10, 83, 120)
        GUICtrlSetResizing(-1, $GUI_DOCKALL)
        $_cbColleague = GUICtrlCreateCombo('', 135, 80, 300)
        GUICtrlSetResizing(-1, BitOR($GUI_DOCKLEFT,$GUI_DOCKRIGHT,$GUI_DOCKTOP,$GUI_DOCKHEIGHT))
    
        GUICtrlCreateLabel($aText[$iLblLocation][$iLang], 10, 118, 120)
        GUICtrlSetResizing(-1, $GUI_DOCKALL)
        $_inLocation = GUICtrlCreateInput('', 135, 115, 300)
        GUICtrlSetResizing(-1, BitOR($GUI_DOCKLEFT,$GUI_DOCKRIGHT,$GUI_DOCKTOP,$GUI_DOCKHEIGHT))
    
        GUICtrlCreateLabel($aText[$iLblPurchase][$iLang], 10, 153, 120)
        GUICtrlSetResizing(-1, $GUI_DOCKALL)
        $_hPurchase = _GUICtrlDTP_Create($_hGui, 135, 150, 120, 21, $DTS_SHORTDATECENTURYFORMAT)
    
        $_btSave = GUICtrlCreateButton($aText[$iBtnSave][$iLang], 335, 150, 100, 21)
        GUICtrlSetResizing(-1, BitOR($GUI_DOCKWIDTH,$GUI_DOCKTOP,$GUI_DOCKHEIGHT,$GUI_DOCKRIGHT))
    
        GUISetState()
    
        GuiRegisterMsg($WM_SIZE, 'WM_SIZE')
    
        While 1
            Switch GUIGetMsg()
                Case -3
                    Exit
            EndSwitch
        WEnd
    EndFunc
    
    Func WM_SIZE($hWnd, $iMsg, $wParam, $lParam)
        Local $aSize = WinGetPos($hWnd)
        If $aSize[2] < $aMinSize[0] Then WinMove($hWnd, '', $aSize[0], $aSize[1], $aMinSize[0], $aSize[3])
        If $aSize[3] < $aMinSize[1]  Then WinMove($hWnd, '', $aSize[0], $aSize[1], $aSize[2], $aMinSize[1])
    EndFunc
    Alles anzeigen
  • Countdown mit Minuten:Sekunden

    • BugFix
    • 3. März 2018 um 15:03

    Das erinnert mich an eine Funktion zum formatierten Ausgeben von Sekundenwerten, die ich mal erstellt hatte:

    AutoIt
    HotKeySet('^!x', '_end') ; Strg+Alt+X
    
    AdlibRegister('_Countdown', 1000)
    Global $iSeconds = 60*60*72     ; 72 Stunden = 3 Tage
    ConsoleWrite(__FormatSeconds($iSeconds) & @CRLF)
    
    While True
        Sleep(50)
    WEnd
    
    Func _end()
        Exit
    EndFunc
    
    Func _CountDown()
        $iSeconds -= 1
        ConsoleWrite(__FormatSeconds($iSeconds) & @CRLF)
        If $iSeconds = 0 Then Exit
    EndFunc
    
    Func __FormatSeconds($_sec)
        Return ( $_sec < 60 ? StringFormat('%02u', $_sec) : _
                 $_sec < 60*60 ? StringFormat('%02u', Floor($_sec/60)) & ':' & _
                        StringFormat('%02u', Mod($_sec,60)) : _
                 $_sec < 60*60*24 ? StringFormat('%02u', Floor($_sec/3600)) & ':' & _
                        StringFormat('%02u', Floor(Mod($_sec,3600)/60)) & ':' & _
                        StringFormat('%02u', Mod(Mod($_sec,3600),60)) : _
                 ( $_sec = 86400 ? "24:00:00" : Floor($_sec/86400) & ' d / ' & _
                        StringFormat('%02u', Floor(Mod($_sec,86400)/3600)) & ':' & _
                        StringFormat('%02u', Floor(Mod(Mod($_sec,86400),3600)/60)) & ':' & _
                        StringFormat('%02u', Mod(Mod(Mod($_sec,86400),3600),60)) & ' h') )
    EndFunc  ;==>__FormatSeconds
    Alles anzeigen
  • ArrayStack - Daten Speichern/Abrufen als FiFo oder LiFo

    • BugFix
    • 3. März 2018 um 12:44
    Zitat von AspirinJunkie

    Eventuell ist für manche die Begrifflichkeit etwas missverständlich da normalerweise "Stack" = LIFO und "Queue" = FIFO verbreitetet ist.

    Vielleicht kannst du das noch irgendwie besser verdeutlichen dann finden die Leute die UDF eventuell eher.

    Danke für den Hinweis. Habe das mal im Titel und den Tags ergänzt.

  • ArrayStack - Daten Speichern/Abrufen als FiFo oder LiFo

    • BugFix
    • 3. März 2018 um 11:47

    Arrays sind super Datenspeicher und ich nutze sie häufig als Datenstapel und arbeite die Daten in der Regel nach dem FirstIn-FirstOut Prinzip ab. Dadurch, dass während des Abarbeitens aber weitere Elemente hinzukommen können, ist z.B. _ArrayPop nicht verwendbar.

    Um nicht jedes mal das Befüllen/Auslesen(Löschen) auf/vom Stapel neu zu skripten, habe ich für 1D- und 2D-Array diese UDF erstellt:

    Code: ArrayStack.au3
    _ArrayStack_Create
    Erstellt ein Stack-Array (1D/2D) mit Element Zähler an [0]/[0][0] und Typ (FIFO/LIFO) an [1]/[0][1] 
    _ArrayStack_Add
    Fügt Daten an das Ende des Stack hinzu. Für 1D-Array können 1-10 Einzelwerte oder 1 Array mit Werten geschrieben werden. Für 2D-Array können 1-10 'Spalten' oder ein Array mit allen 'Spalten' geschrieben werden.
    _ArrayStack_Get
    Gibt das erste (FIFO) oder letzte (LIFO) Element des Stapels zurück und löscht es vom Stapel. Einzelwert bei 1D-Array, 1D-Array mit Spaltenwerten bei 2D-Array.
    _ArrayStack_Type
    Der Typ des Stapels kann während der Nutzung geändert werden.
    AutoIt: ArrayStack.au3 v0.1
    ;-- TIME_STAMP   2018-03-03 11:41:54   v 0.1
    
    Global Const $STACK_FIFO = 1
    Global Const $STACK_LIFO = 2
    
    
    
    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _ArrayStack_Create
    ; Description ...: Creates an array (1D/2D) with element counter at [0]/[0][0] and type at [1]/[0][1]
    ; Syntax ........: _ArrayStack_Create([$_iDim = 1[, $_iDim2Elements = 2]])
    ; Parameters ....: $_iType              - [optional] The stack type (FIFO/LIFO). Default is $STACKFIFO
    ;                  $_iDim               - [optional] Count of dimensions. Default is 1
    ;                  $_iDim2Elements      - [optional] Count of elements in 2nd dimension (if exists). Default is 2
    ; Return values .: The created array with counter = 0 at first arrayposition
    ; Note ..........: The stack type will stored: 1D-array -> [1] / 2D-array -> [0][1]
    ; Author ........: BugFix
    ; ===============================================================================================================================
    Func _ArrayStack_Create($_iType=-1, $_iDim=1, $_iDim2Elements=2)
        $_iType = ($_iType = -1 Or $_iType = Default) ? $STACK_FIFO : $_iType
        Local $aStack[] = [0,$_iType]
        If $_iDim = 2 Then
            ReDim $aStack[1][$_iDim2Elements]
            $aStack[0][0] = 0
            $aStack[0][1] = $_iType
        EndIf
        Return $aStack
    EndFunc  ;==>_ArrayStack_Create
    
    
    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _ArrayStack_Add
    ; Description ...: Adds value(s) at the end of the stack array
    ;                  For 1D arrays you can add up to 10 values at once by single param ($_vVal0..$_vVal9) or an 1D array for $_vVal0.
    ;                  For 2D arrays you can add only one new entry. Up to 10 values for 2nd dimesion can given by single param ($_vVal0..$_vVal9) or as 1D array for $_vVal0.
    ; Syntax ........: _ArrayStack_Add(Byref $_aStack, $_vVal0[, $_vVal1 = Null[, $_vVal2 = Null[, $_vVal3 = Null[, $_vVal4 = Null[,
    ;                  $_vVal5 = Null[, $_vVal6 = Null[, $_vVal7 = Null[, $_vVal8 = Null[, $_vVal9 = Null]]]]]]]]])
    ; Parameters ....: $_aStack             - The stack array.
    ;                  $_vVal0              - The new value or array with values.
    ;                  $_vVal1 .. $_vVal9   - [optional] New values (1D) or new values for 2nd dimension (2D).
    ; Return values .: Success      1
    ;                  Failure      0 set @error = 1 given value array ($_vVal0) is not 1D
    ;                                              2 none stack array
    ; Note ..........: New values will every time added from the end, independent of the stack type.
    ; Author ........: BugFix
    ; ===============================================================================================================================
    Func _ArrayStack_Add(ByRef $_aStack, $_vVal0, $_vVal1=Null, $_vVal2=Null, $_vVal3=Null, $_vVal4=Null, $_vVal5=Null, $_vVal6=Null, $_vVal7=Null, $_vVal8=Null, $_vVal9=Null)
        Local $aParam[] = [$_vVal0, $_vVal1, $_vVal2, $_vVal3, $_vVal4, $_vVal5, $_vVal6, $_vVal7, $_vVal8, $_vVal9]
        Local $iDim
        If Not __ArrayIsStack($_aStack, $iDim) Then Return SetError(2,0,0)
        If IsArray($_vVal0) Then
            If UBound($_vVal0, 0) > 1 Then Return SetError(1,0,0)
            $aParam = $_vVal0
        Else
            Local $n = 0
            For $i = 0 To UBound($aParam) -1
                $n += 1
                If $aParam[$i] = Null Then
                    $n -= 1
                    ExitLoop
                EndIf
            Next
            ReDim $aParam[$n]
        EndIf
        Switch $iDim
            Case 1
                Local $idx = $_aStack[0] +2
                $_aStack[0] += UBound($aParam)
                ReDim $_aStack[$_aStack[0]+2]
                For $i = 0 To UBound($aParam) -1
                    $_aStack[$idx +$i] = $aParam[$i]
                Next
    
            Case 2
                Local $iUb2 = UBound($_aStack, 2)
                $_aStack[0][0] += 1
                ReDim $_aStack[$_aStack[0][0]+1][$iUb2]
                For $i = 0 To $iUb2 -1
                    $_aStack[$_aStack[0][0]][$i] = $aParam[$i]
                Next
        EndSwitch
        Return 1
    EndFunc  ;==>_ArrayStack_Add
    
    
    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _ArrayStack_Get
    ; Description ...: Get the first/last item from stack array and delete this
    ; Syntax ........: _ArrayStack_Get(Byref $_aStack)
    ; Parameters ....: $_aStack             - The stack array.
    ; Return values .: Success     1D array:  The first/last item in array
    ;                              2D array:  The first/last item in array as 1D array
    ;                : Failure                Null   set @error 2 - none stack array
    ;                              1D array:  Null   set @error 1 - stack array is empty
    ;                :             2D array:  [Null] set @error 1 - stack array is empty
    ; Author ........: BugFix
    ; ===============================================================================================================================
    Func _ArrayStack_Get(ByRef $_aStack)
        Local $iDim
        If Not __ArrayIsStack($_aStack, $iDim) Then Return SetError(2,0,Null)
        Switch $iDim
            Case 1
                Local $vRet = Null
                If $_aStack[0] = 0 Then Return SetError(1,0,$vRet)
                If $_aStack[1] = $STACK_FIFO Then
                    $vRet = $_aStack[2]
                    If $_aStack[0] > 1 Then
                        For $i = 2 To $_aStack[0]
                            $_aStack[$i] = $_aStack[$i+1]
                        Next
                    EndIf
                Else
                    $vRet = $_aStack[$_aStack[0]+1]
                EndIf
                $_aStack[0] -= 1
                ReDim $_aStack[$_aStack[0]+2]
    
            Case 2
                Local $vRet[] = [Null]
                If $_aStack[0][0] = 0 Then Return SetError(1,0,$vRet)
                Local $iUb2 = UBound($_aStack, 2)
                ReDim $vRet[$iUb2]
                If $_aStack[0][1] = $STACK_FIFO Then
                    For $i = 0 To $iUb2 -1
                        $vRet[$i] = $_aStack[1][$i]
                    Next
                    If $_aStack[0][0] > 1 Then
                        For $i = 1 To $_aStack[0][0] -1
                            For $j = 0 To $iUb2 -1
                                $_aStack[$i][$j] = $_aStack[$i+1][$j]
                            Next
                        Next
                    EndIf
                Else
                    For $i = 0 To $iUb2 -1
                        $vRet[$i] = $_aStack[$_aStack[0][0]][$i]
                    Next
                EndIf
    
                $_aStack[0][0] -= 1
                ReDim $_aStack[$_aStack[0][0]+1][$iUb2]
        EndSwitch
    
        Return $vRet
    EndFunc  ;==>_ArrayStack_Get
    
    
    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _ArrayStack_Type
    ; Description ...: Changes the stack type.
    ; Syntax ........: _ArrayStack_Type(Byref $_aStack[, $_iType = $STACK_FIFO])
    ; Parameters ....: $_aStack             - The stack array.
    ;                  $_iType              - [optional] The new type. Default is $STACK_FIFO.
    ; Return values .: Success     1
    ;                  Failure     0  set @error = 1  -> None stack array.
    ; Author ........: BugFix
    ; ===============================================================================================================================
    Func _ArrayStack_Type(ByRef $_aStack, $_iType=$STACK_FIFO)
        Local $iDim
        If Not __ArrayIsStack($_aStack, $iDim) Then Return SetError(1,0,0)
        $_iType = $_iType = $STACK_FIFO ? $STACK_FIFO : $STACK_LIFO
        Switch $iDim
            Case 1
                $_aStack[1] = $_iType
            Case 2
                $_aStack[0][1] = $_iType
        EndSwitch
        Return 1
    EndFunc  ;==>_ArrayStack_Type
    
    Func __ArrayIsStack(ByRef $_aStack, ByRef $_iDim)
        If Not IsArray($_aStack) Then Return False
        $_iDim = UBound($_aStack, 0)
        If $_iDim > 2 Then Return False
        Switch $_iDim
            Case 1
                Return ($_aStack[1] = $STACK_FIFO Or $_aStack[1] = $STACK_LIFO)
            Case 2
                Return ($_aStack[0][1] = $STACK_FIFO Or $_aStack[0][1] = $STACK_LIFO)
        EndSwitch
    EndFunc  ;==>__ArrayIsStack
    Alles anzeigen
    AutoIt: ArrayStack_Example.au3
    ;-- TIME_STAMP   2018-03-03 11:05:18
    
    #include 'ArrayStack.au3'
    
    Global $a1D = _ArrayStack_Create()                   ; default type FIFO, 1D
    Global $a2D = _ArrayStack_Create($STACK_LIFO, 2, 6)  ; type LIFO, 2D, 6 elements in 2nd dimension
    
    Global $aVal[] = [31,32,33,34,35,36]                 ; array with values to add
    
    ; add value(s) to 1D array
    _ArrayStack_Add($a1D, 3)
    _ArrayStack_Add($a1D, 4)
    _ArrayStack_Add($a1D, 5)
    _ArrayStack_Add($a1D, 6, 7, 8, 9)
    _ArrayStack_Add($a1D, $aVal)
    
    
    ; add value(s) to 2D array
    _ArrayStack_Add($a2D, 1,2,3,4,5,6)
    _ArrayStack_Add($a2D, 11,12,13,14,15,16)
    _ArrayStack_Add($a2D, 21,22,23,24,25,26)
    _ArrayStack_Add($a2D, $aVal)
    
    
    ; get value by value by used type FIFO
    ConsoleWrite('1D Array (FIFO):' & @CRLF)
    $x = 0
    While 1
        $x += 1
        If $x = 5 Then   ; change the stack type
            _ArrayStack_Type($a1D, $STACK_LIFO)
            ConsoleWrite('TYPE CHANGED TO LIFO' & @CRLF)
        EndIf
        $ret = _ArrayStack_Get($a1D)
        If @error Then ExitLoop
        ConsoleWrite($ret & @CRLF)
    WEnd
    
    ; get value by value by used type LIFO
    ConsoleWrite(@CRLF & '2D Array (LIFO):' & @CRLF)
    For $i = 1 To 4
        Local $aRet = _ArrayStack_Get($a2D)
        Local $s = ''
        For $j = 0 To UBound($aRet) -1
            $s &= $aRet[$j] & ', '
        Next
        ConsoleWrite(StringTrimRight($s, 2) & @CRLF)
    Next
    Alles anzeigen

    Dateien

    ArrayStack_Example.au3 1,27 kB – 289 Downloads ArrayStack[0.1].au3 7,59 kB – 334 Downloads
  • Portieren Scintilla DirectMessage von C/C++

    • BugFix
    • 28. Februar 2018 um 21:42
    Zitat von Bitnugger

    Schau mal hier: https://www.autoitscript.com/f…sing-scintilla-in-autoit/

    Ja, kenne ich (hat ISI auch als Basis für sein ISN-Studio verwendet).

    Hat jetzt aber keinen direkten Zusammenhang mit meiner Frage zum Portieren des C/C++ Codes.

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™