Einfach mal das Neuzeichnen initiieren ( _WinAPI_RedrawWindow( Handle_Listview ) ).
Beiträge von BugFix
-
-
-
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.

-
Habe die Funktion jetzt umgeschrieben. Nun ist auch ein Verschieben bei Mehrfachauswahl möglich. Die markierten Zeilen müssen nicht zusammenhängend sein.
C
Alles anzeigen#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 -
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.
-
-
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.

-
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.
Mir ist aufgefallen, dass du in deiner Funktion "modified" und "accessed" vertauscht hast.
Oops.

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.
-
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
Alles anzeigen#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 -
Hier findest du Infos dazu: The Taskbar (Windows)
-
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 ).
-
Deshalb hatte ich mal diese Funktion erstellt:
AutoIt
Alles anzeigen;================================================================================================== ; 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 -
und da die Liste meiner Lieblingsserien immer größer wird
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.
-
Stimmt auch wieder.

-
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:
-
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
Alles anzeigen#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 -
Das erinnert mich an eine Funktion zum formatierten Ausgeben von Sekundenwerten, die ich mal erstellt hatte:
AutoIt
Alles anzeigenHotKeySet('^!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 -
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.
-
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
Alles anzeigen;-- 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 ;==>__ArrayIsStackAutoIt: ArrayStack_Example.au3
Alles anzeigen;-- 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 -
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.