Jump to content

Recommended Posts

Hi everybody,

i have a question related to strings items in an Array and sorting. Maybe someone can advice me how to solve the issue.

I have an Array of strings, every item of the Array is as following:

  • INFO [13.06.2017 11:48:01] [Thread-13] [ConGenImpUsb -> waitForConnection] 
  • INFO [07.06.2017 08:55:44] [main] MDU5 - Ver 5.1x

I want to sort the item in the array by date and time, is there any function which allows me to sort by date/time?

Thanks in advance

Share this post


Link to post
Share on other sites

Basic example, although someone that is good with RegEx could write something better.

#include <Array.au3>
Local $aInfo[2] = ['INFO [07.06.2017 11:48:01] [Thread-13] [ConGenImpUsb -> waitForConnection]', 'INFO [07.06.2017 08:55:44] [main] MDU5 - Ver 5.1x']
Local $aModified[UBound($aInfo)][2], $sDate
For $i = 0 To UBound($aInfo) - 1
    $sDate = StringMid($aInfo[$i], StringInStr($aInfo[$i], "INFO [") + StringLen("INFO ["), 19)
    $aModified[$i][0] = StringFormat("%04i/%02i/%02i", StringMid($sDate, 7, 4), StringMid($sDate, 4, 2), StringLeft($sDate, 2)) & StringRight($sDate, 9)
    $aModified[$i][1] = $aInfo[$i]
Next
_ArraySort($aModified, 0, 0, 0, 0)
_ArrayDisplay($aModified)

 

Share this post


Link to post
Share on other sites

another way.

 

#include <Array.au3>
Local $aArray = ["INFO [13.06.2017 11:48:01] [Thread-13] [ConGenImpUsb -> waitForConnection]", _
        "INFO [07.06.2017 08:55:44] [main] MDU5 - Ver 5.1x", _
        "INFO [07.06.2017 12:55:11] [main] Dummy String1", _
        "INFO [07.06.2016 09:55:11] [main] Dummy String2", _
        "INFO [07.06.2017 09:55:12] [main] Dummy String3", _
        "INFO [07.06.2017 09:55:11] [main] Dummy String4"]


_ArrayDisplay($aArray, "No sorted")
_Sort($aArray)
_ArrayDisplay($aArray, "Sorted")

Func _Sort(ByRef $aArray)
    For $i = UBound($aArray) - 1 To 1 Step -1
        For $j = 1 To $i
            If _GetNumber($aArray[$j - 1]) > _GetNumber($aArray[$j]) Then
                $temp = $aArray[$j - 1]
                $aArray[$j - 1] = $aArray[$j]
                $aArray[$j] = $temp
            EndIf
        Next
    Next
    Return $aArray
EndFunc   ;==>_Sort


Func _GetNumber($String)
    Return Number(StringRegExpReplace(StringMid($String, 7, 19), '(\d{2})\.(\d{2})\.(\d{4})', "$3$2$1")) ;mikell's regexp
EndFunc   ;==>_GetNumber

Saludos

Edited by Danyfirex

Share this post


Link to post
Share on other sites

So assuming you have that portion of the string, since that's been done twice now,  here is a way with datediff

#include <Date.au3>
#include<array.au3>

local $Arr[5]
$Arr[0] = "13.06.2017 11:48:01"
$Arr[1] = "07.06.2017 08:55:44"
$Arr[2] = "05.06.2017 08:55:40"
$Arr[3] = "12.06.2017 08:55:43"
$Arr[4] = "07.06.2017 08:55:42"

For $i = 0 to ubound($Arr) - 2

    If stringleft( _DateDiff("s" , stringmid($Arr[$i] , 7 , 4) & "/" & stringmid($Arr[$i] , 4 , 2) & "/" &  stringmid($Arr[$i] , 1 , 2) & " " & stringright($Arr[$i] , 8) , stringmid($Arr[$i + 1] , 7 , 4) & "/" & stringmid($Arr[$i + 1] , 4 , 2) & "/" &  stringmid($Arr[$i + 1] , 1 , 2) & " " & stringright($Arr[$i + 1] , 8)) , 1) = "-" Then
        _ArraySwap($Arr , $i , $i + 1)
        $i = -1
    EndIf

Next

_ArrayDisplay($Arr)

 


,-. .--. ________ .-. .-. ,---. ,-. .-. .-. .-.
|(| / /\ \ |\ /| |__ __||| | | || .-' | |/ / \ \_/ )/
(_) / /__\ \ |(\ / | )| | | `-' | | `-. | | / __ \ (_)
| | | __ | (_)\/ | (_) | | .-. | | .-' | | \ |__| ) (
| | | | |)| | \ / | | | | | |)| | `--. | |) \ | |
`-' |_| (_) | |\/| | `-' /( (_)/( __.' |((_)-' /(_|
'-' '-' (__) (__) (_) (__)

Share this post


Link to post
Share on other sites

And another way ... sooo classic   :)

#include <Array.au3>

Local $aArray[6] = ["INFO [13.06.2017 11:48:01] [Thread-13] [ConGenImpUsb -> waitForConnection]", _
        "INFO [07.06.2018 08:55:44] [main] MDU5 - Ver 5.1x", _
        "INFO [07.06.2017 12:55:11] [main] Dummy String1", _
        "INFO [07.06.2016 09:55:11] [main] Dummy String2", _
        "INFO [07.06.2017 09:55:12] [main] Dummy String3", _
        "INFO [07.06.2017 09:55:11] [main] Dummy String4"]

_ArrayDisplay($aArray, "No sorted")
_Sort($aArray)
_ArrayDisplay($aArray, "Sorted")


Func _Sort(ByRef $aArray)
     _ArrayColInsert($aArray, 1)
    For $i = 0 To UBound($aArray) - 1
       $aArray[$i][1] = StringRegExpReplace($aArray[$i][0], '(\d{2})\.(\d{2})\.(\d{4})', "$3$2$1")
    Next
    _ArraySort($aArray, 0, 0, 0, 1)
    _ArrayColDelete($aArray, 1)
EndFunc   ;==>_Sort

 

Share this post


Link to post
Share on other sites

This solution worked greatly. Many thanks.

 

I didn't try yet the other solutions

 

 

On ‎23‎.‎06‎.‎2017 at 6:39 PM, Danyfirex said:

another way.

 

#include <Array.au3>
Local $aArray = ["INFO [13.06.2017 11:48:01] [Thread-13] [ConGenImpUsb -> waitForConnection]", _
        "INFO [07.06.2017 08:55:44] [main] MDU5 - Ver 5.1x", _
        "INFO [07.06.2017 12:55:11] [main] Dummy String1", _
        "INFO [07.06.2016 09:55:11] [main] Dummy String2", _
        "INFO [07.06.2017 09:55:12] [main] Dummy String3", _
        "INFO [07.06.2017 09:55:11] [main] Dummy String4"]


_ArrayDisplay($aArray, "No sorted")
_Sort($aArray)
_ArrayDisplay($aArray, "Sorted")

Func _Sort(ByRef $aArray)
    For $i = UBound($aArray) - 1 To 1 Step -1
        For $j = 1 To $i
            If _GetNumber($aArray[$j - 1]) > _GetNumber($aArray[$j]) Then
                $temp = $aArray[$j - 1]
                $aArray[$j - 1] = $aArray[$j]
                $aArray[$j] = $temp
            EndIf
        Next
    Next
    Return $aArray
EndFunc   ;==>_Sort


Func _GetNumber($String)
    Return Number(StringRegExpReplace(StringMid($String, 7, 19), "\D", ""))
EndFunc   ;==>_GetNumber

Saludos

 

Share this post


Link to post
Share on other sites

Share this post


Link to post
Share on other sites
1 hour ago, Subz said:

Can you post the more complex file?

 

Unfortunately i cannot post my original file, because it contains many entries with sensitive data. Anyway there are several entries like the one i posted before. The log content is just bigger.

 

As for now i am using this solution and i will test it for a while:

 

On ‎23‎.‎06‎.‎2017 at 9:49 PM, mikell said:

And another way ... sooo classic   :)

#include <Array.au3>

Local $aArray[6] = ["INFO [13.06.2017 11:48:01] [Thread-13] [ConGenImpUsb -> waitForConnection]", _
        "INFO [07.06.2018 08:55:44] [main] MDU5 - Ver 5.1x", _
        "INFO [07.06.2017 12:55:11] [main] Dummy String1", _
        "INFO [07.06.2016 09:55:11] [main] Dummy String2", _
        "INFO [07.06.2017 09:55:12] [main] Dummy String3", _
        "INFO [07.06.2017 09:55:11] [main] Dummy String4"]

_ArrayDisplay($aArray, "No sorted")
_Sort($aArray)
_ArrayDisplay($aArray, "Sorted")


Func _Sort(ByRef $aArray)
     _ArrayColInsert($aArray, 1)
    For $i = 0 To UBound($aArray) - 1
       $aArray[$i][1] = StringRegExpReplace($aArray[$i][0], '(\d{2})\.(\d{2})\.(\d{4})', "$3$2$1")
    Next
    _ArraySort($aArray, 0, 0, 0, 1)
    _ArrayColDelete($aArray, 1)
EndFunc   ;==>_Sort

 

 

I have just a problem, i have a monodimensional Array in Input and it is basically "converted" to bidimensional. How can i use the array? I mean, how can i access the array items?

 

Share this post


Link to post
Share on other sites

Basic example:

#include <Array.au3>

Global $aOneDimension[3] = [2, "Row1", "Row2"]
_ArrayDisplay($aOneDimension)
For $i = 1 To $aOneDimension[0]
    MsgBox(4096, "One Dimension Array", $aOneDimension[$i])
Next

Global $aTwoDimension[3][3] = [["Row0 Col0", "Row0 Col1", "Row0 Col2"],["Row1 Col0", "Row1 Col1", "Row1 Col2"], ["Row2 Col0", "Row2 Col1", "Row2 Col2"]]
_ArrayDisplay($aTwoDimension)
For $i = 0 To UBound($aTwoDimension) - 1
    MsgBox(4096, "Two Dimension Array", "Row" & $i & @CRLF & $aTwoDimension[$i][0] & @TAB & $aTwoDimension[$i][1] & @TAB & $aTwoDimension[$i][2])
Next

 

Share this post


Link to post
Share on other sites

Hello. Here is my script fixed.

 

#include <Array.au3>

Local $aArray[6] = ["INFO [13.06.2017 11:48:01] [Thread-13] [ConGenImpUsb -> waitForConnection]", _
        "INFO [07.06.2018 08:55:44] [main] MDU5 - Ver 5.1x", _
        "INFO [07.06.2017 12:55:11] [main] Dummy String1", _
        "INFO [07.06.2016 09:55:11] [main] Dummy String2", _
        "INFO [07.06.2017 09:55:12] [main] Dummy String3", _
        "INFO [07.06.2017 09:55:11] [main] Dummy String4"]


_ArrayDisplay($aArray, "No sorted")
_Sort($aArray)
_ArrayDisplay($aArray, "Sorted")



Func _Sort(ByRef $aArray)
    For $i = UBound($aArray) - 1 To 1 Step -1
        For $j = 1 To $i
            If _GetNumber($aArray[$j - 1]) > _GetNumber($aArray[$j]) Then
                $temp = $aArray[$j - 1]
                $aArray[$j - 1] = $aArray[$j]
                $aArray[$j] = $temp
            EndIf
        Next
    Next
    Return $aArray
EndFunc   ;==>_Sort


Func _GetNumber($String)
    Local $iNumber=Number(StringRegExpReplace(StringRegExpReplace(StringMid($String, 7, 19), '(\d{2})\.(\d{2})\.(\d{4})', "$3$2$1"),"\D","")) ;mikell's regexp plus something
    Return $iNumber
EndFunc   ;==>_GetNumber

 

Saludos

Share this post


Link to post
Share on other sites
#include <Array.au3>
#include <Date.au3>

Local $aArray[6] = ["INFO [13.06.2017 11:48:01] [Thread-13] [ConGenImpUsb -> waitForConnection]", _
"INFO [07.06.2018 08:55:44] [main] MDU5 - Ver 5.1x", _
"INFO [07.06.2017 12:55:11] [main] Dummy String1", _
"INFO [07.06.2016 09:55:11] [main] Dummy String2", _
"INFO [07.06.2017 09:55:12] [main] Dummy String3", _
"INFO [07.06.2017 09:55:11] [main] Dummy String4"]


For $i = 0 to ubound($aArray) - 2

    If stringleft( _DateDiff("s" , stringmid(StringRegExp($aArray[$i] , '(\d{2}\.\d{2}\.\d{4}.\d{2}:\d{2}:\d{2})' , 3)[0] , 7 , 4) & _
        "/" & stringmid(StringRegExp($aArray[$i] , '(\d{2}\.\d{2}\.\d{4}.\d{2}:\d{2}:\d{2})' , 3)[0] , 4 , 2) & _
        "/" & stringmid(StringRegExp($aArray[$i] , '(\d{2}\.\d{2}\.\d{4}.\d{2}:\d{2}:\d{2})' , 3)[0] , 1 , 2) & _
        " " & stringright(StringRegExp($aArray[$i] , '(\d{2}\.\d{2}\.\d{4}.\d{2}:\d{2}:\d{2})' , 3)[0] , 8) , stringmid(StringRegExp($aArray[$i + 1] , '(\d{2}\.\d{2}\.\d{4}.\d{2}:\d{2}:\d{2})' , 3)[0] , 7 , 4) & _
        "/" & stringmid(StringRegExp($aArray[$i + 1] , '(\d{2}\.\d{2}\.\d{4}.\d{2}:\d{2}:\d{2})' , 3)[0] , 4 , 2) & _
        "/" & stringmid(StringRegExp($aArray[$i + 1] , '(\d{2}\.\d{2}\.\d{4}.\d{2}:\d{2}:\d{2})' , 3)[0] , 1 , 2) & " " & stringright(StringRegExp($aArray[$i+1] , '(\d{2}\.\d{2}\.\d{4}.\d{2}:\d{2}:\d{2})' , 3)[0] , 8)) , 1) = "-" Then

            _ArraySwap($aArray , $i , $i + 1)
            $i = -1
    EndIf

Next

_ArrayDisplay($aArray)

 


,-. .--. ________ .-. .-. ,---. ,-. .-. .-. .-.
|(| / /\ \ |\ /| |__ __||| | | || .-' | |/ / \ \_/ )/
(_) / /__\ \ |(\ / | )| | | `-' | | `-. | | / __ \ (_)
| | | __ | (_)\/ | (_) | | .-. | | .-' | | \ |__| ) (
| | | | |)| | \ / | | | | | |)| | `--. | |) \ | |
`-' |_| (_) | |\/| | `-' /( (_)/( __.' |((_)-' /(_|
'-' '-' (__) (__) (_) (__)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Skysnake
      Hi
      I am trying to set Accelerator keys from an array.
      I select the KEY and CONTROL from a SQLite table, the Array looks like that generated for the Helpfile, but I can't get the CONTROLS to resolve...
      I though about Assign & Eval, but not sure if that's a step in the right direction. IsDeclared shows that the $var exists in Local Scope -1.  
       
      Local $Main = GUICreate("Custom MsgBox", 225, 80) GUICtrlCreateLabel("Please select a button.", 10, 10) Local $idButton_Yes = GUICtrlCreateButton("Yes", 10, 50, 65, 25) Local $idButton_No = GUICtrlCreateButton("No", 80, 50, 65, 25) Local $idButton_Exit = GUICtrlCreateButton("Exit", 150, 50, 65, 25) Local $query, $aResult, $iRows, $iColumns $query = "" ;reset $query = "Select hotkey_key, hotkey_ctrl from mytable where mykeys = 'hotkey' ; " ; ; Query $iRval = _SQLite_GetTable2d($sqliteDb, $query, $aResult, $iRows, $iColumns) If $iRval = $SQLITE_OK Then Local $sizeofHotkeys = UBound($aResult) - 1 ConsoleWrite("$sizeofHotkeys " & $sizeofHotkeys & @CRLF) If $sizeofHotkeys > 0 Then Local $main__aAccelKeys[$sizeofHotkeys][2] For $i = 0 To $sizeofHotkeys - 1 $j = $i + 1 ; replace friendly text with code -- ! alt + Shift ^ Ctrl # Windows $aResult[$j][0] = StringReplace($aResult[$j][0], "Alt", "!") $aResult[$j][0] = StringReplace($aResult[$j][0], "Shift", "+") $aResult[$j][0] = StringReplace($aResult[$j][0], "Ctrl", "^") $main__aAccelKeys[$i][0] = $aResult[$j][0] ;--- $main__aAccelKeys[$i][1] = $aResult[$j][1] ;--- Next ;~ Row|Col 0|Col 1 ;~ Row 0|F2|$idButton_Yes ;~ Row 1|F3|$idButton_No _DebugArrayDisplay($main__aAccelKeys) Local $rv = GUISetAccelerators($main__aAccelKeys, $Main) GUISetState(@SW_SHOW) ; Display the GUI.  
      Please note that this is a modified Helpfile example.
      The Helpfile specifies (a) WinHandle and (b) last Gui created.
      --> the example uses a control not a WinHandle and (b) what happens with ChildGuis? Also, the HelpFile specifies lower case, yet the examples show "{F1}" upper case?
      Also, is there a way to check the result of the GuiSetAccelerator function? 
      Note, if I add these to lines after the FOR loop, then the F1 works, and the DebugArrayDisplays shows control 4... not it's name... So I am in the right place, but my $vars names do not convert to their control numbers in the GUI
      Next $main__aAccelKeys[$sizeofHotkeys - 1][0] = "{F1}" ; -- -- use the extra row for the F1 $main__aAccelKeys[$sizeofHotkeys - 1][1] = $ChmHLP ;--- Skysnake
    • By wolflake
      I've used PowerPro for years and it had a feature that let you turn an array into a menu.  It also let you know if it got a right click. I liked the right click feature because it doubled the menu item usage ie left/right on the same menu item.  I tried recreate that usage with a context menu.   With _ArrayToMenu you can pass menu items for 1 and 2 dimensional arrays. Note you can indicate sub-menu but using a -> at the end of the item.  Use a - to make a separater. Optionally you can pass Tooltips by passing a second array. This array must have the same dimensions as the items array even if not all the elements contain tips. The UDF returns an array with this index of row (and if submenus column), the third element is 1 if right clicked otherwise 0 and the fourth element of the array is the label of the menu item. If the user escapes without choosing an item the the first element returns a -1.  Same thing if the user clicks on another window.   @error returns 1 if there was no array passed, 2 if the second array has different dimensions than the first.   If you use the same label in two parts of your menu you will have to distinguish them.  You can do that by additionally making sure that the selection matches the index number(s).  Note that you'll have to match the index number plus label before you match just the label because Switch will use the first match it can find.  In the example below I am using a check on which column the data is in.  If it's not in the first column then it must be the other "Beef".   Beef
      Fruit
      Col2 > Beef
                  Bread   $aR = _ArrayToMenu($aM) Switch $aR[3]
      Case "Beef" and $aR[2] = 0
             Beef1()
       Case "Beef"
             Beef2()
      EndSwitch   On a technical note I attached the context menu to the window itself not a dummy control and I didn't use _GUICtrlMenu_TrackPopupMenu.  Instead I launched the context menu with "send shift-F10" and waited for GuiGetMsg() to give me the selection. Right click is picked up by GUIRegisterMsg WM_RBUTTONUP and Tooltips are done with GUIRegisterMsg WM_MENUSELECT. The whole thing is done with 3 functions. 
      I won't tell you how long it took me to figure this out but I'll say that on one of my early attempts it had two windows running at once and one was just to recieve the right click an tell the other it got it.  Suffice it to say I'm no wiz at Autoit but I really appreciate the support the community offers and I hope someone finds this useful. BTW I wrote a script to produce 1d and 2d auotit array code from excel in case you want to model your menu in excel. Here is the link.
      https://www.autoitscript.com/forum/topic/139260-autoit-snippets/?do=findComment&comment=1412314
      _ArrayToMenu() UDF
      ;ArrayToMenu with submenus, tooltips, rightclick and esc to close. ; #INDEX# ======================================================================================================================= ; Title .........: _ArrayToMenu ; AutoIt Version : 3.3.14.2 ; Description ...: Show an array as a popup menu optionally with tooltips and right click. ; Author(s) .....: Rick Sharp ; =============================================================================================================================== ; #FUNCTION# ==================================================================================================================== ; Name..........: _ArrayToMenu($aArray_menu[,$aArray_tooltips]) ; Description...: Display an array as a menu and return the users choice, display tooltips(optional), return right click. ; Syntax........: _ArrayToMenu($aArray_menu[,$aArray_tooltips]) ; ; Parameters....: ; Required......: A 1d or 2d array of menu items ; Use a minus sign in the item to indicate a menu separator. ; Use -> at the end of an item to indicate a sub-menu. ; Optional......: A 1d or 2d array of tooltips. The array must use the same dimensions as the menu items array. ; ; Return values.: An Array ; $aArray[0] is index of the row (-1 if exited with no choice) ; $aArray[1] is index of the column ; $aArray[2] is 1 if right clicked ; $aArray[3] is the selected item (if any) ; Notes.........: If the user clicks on another window the ArrayToMenu returns as if esc were pressed. ; Sub-Menus are limited to 10 levels if you need more change $ahM[10] ; =============================================================================================================================== ; #VARIABLES# =================================================================================================================== ; Global $__g_iRT = 0, $__g_aTT1, $__g_ahi ; "$__g_iRT" for right click flag, "$__g_aTT1" for tips, "$__g_ahi" for index of id's in menu and tips ; =============================================================================================================================== ; #@error# ====================================================================================================================== ; 1 - First parameter is Not an array ; 2 - The Menu/Items array and the Tips array are not the same number of dimensions ; =============================================================================================================================== #include-once #include <WindowsConstants.au3> #include <GuiMenu.au3> #include <array.au3> #include <misc.au3> Func _ArrayToMenu($aMenu, $att = "") If Not IsArray($aMenu) Then Return SetError(1, 0, -1) Global $__g_iRT = 0 Local $ahM[10], $iCcnt = UBound($aMenu, 2), $iRcnt = UBound($aMenu), $iRow, $iCol, $b_Esc If UBound($aMenu, 2) = 0 Then _ArrayColInsert($aMenu, 1) ;if 1d array make it 2d EndIf ;Prep Loop to make Menus and Sub-Menus $iRcnt = UBound($aMenu) ;Count of Rows/Items $iCcnt = UBound($aMenu, 2) ;Count of Cols/Menus GUIRegisterMsg($WM_RBUTTONUP, "WM_RBUTTONUP") ;handles Right Click If IsArray($att) Then If UBound($att, 2) = 0 Then _ArrayColInsert($att, 1) If UBound($att, 2) <> $iCcnt Or UBound($att) <> $iRcnt Then Return SetError(2, 0, -1) ;$amenu and $att not same dimensions Global $__g_aTT1 = $att ;added $__g_aTT1 because $att was not seen by WM_MenuSelect for tooltips GUIRegisterMsg($WM_MENUSELECT, "WM_MENUSELECT") ;handles tooltips EndIf Local $mPos = MouseGetPos() #Region ### START Koda GUI section ### Form= $hMenu = GUICreate("C_menu", 10, 10, $mPos[0], $mPos[1], $WS_POPUP, $WS_EX_TOPMOST) GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### ;Build Menus Global $__g_ahi[$iRcnt + 1][$iCcnt + 1] ;array to hold Menu Item id's $iMcnt = 0 ;Menu count $ahM[$iMcnt] = GUICtrlCreateContextMenu() ;if the array element is null then it falls through and nothing happens For $j = 0 To $iCcnt - 1 ;for each Column/Menu For $i = 0 To $iRcnt - 1 ;for each Row/Item If StringRight($aMenu[$i][$j], 2) = "->" Then ;Sub-Menu $aMenu[$i][$j] = StringTrimRight($aMenu[$i][$j], 2) ;remove -> $iMcnt += 1 $ahM[$iMcnt] = GUICtrlCreateMenu($aMenu[$i][$j], $ahM[$j]) ; $__g_ahi[$i][$j] = $ahM[$iMcnt] ElseIf $aMenu[$i][$j] > "" Then ;Normal item If StringLeft($aMenu[$i][$j], 1) = "-" Then $aMenu[$i][$j] = "" $__g_ahi[$i][$j] = GUICtrlCreateMenuItem($aMenu[$i][$j], $ahM[$j]) EndIf Next Next Send("+{F10}") ;sends right click to open context menu While 1 $nMsg = GUIGetMsg() If $nMsg > 0 Then ;ConsoleWrite("nMsg= " & $nMsg & @CRLF) $iRow = _ArraySearch($__g_ahi, $nMsg) $iCol = _ArraySearch($__g_ahi, $nMsg, 0, 0, 0, 0, 0, $iRow, True) ExitLoop EndIf If _IsPressed("1B") = 1 Or WinActive("C_menu") = 0 Then $b_Esc = -1 ExitLoop EndIf WEnd ;*** Done *** GUIDelete($hMenu) Local $aAr1[4] $aAr1[0] = $iRow $aAr1[1] = $iCol $aAr1[2] = $__g_iRT If Not $b_Esc = -1 Then $aAr1[3] = $aMenu[$aAr1[0]][$aAr1[1]] Else $aAr1[0] = -1 EndIf Return $aAr1 EndFunc ;==>_ArrayToMenu ;Check for Right Click Func WM_RBUTTONUP($hMenu, $iMsg, $iwParam, $ilParam) $__g_iRT = 1 ;Mark as rclicked Send("{Enter}") ;choose the item EndFunc ;==>WM_RBUTTONUP ;Tooltips Func WM_MENUSELECT($hMenu, $iMsg, $iwParam, $ilParam) Local $idMenu = BitAND($iwParam, 0xFFFF) Local $iRow, $iCol If $idMenu > 0 Then $iRow = _ArraySearch($__g_ahi, $idMenu) If $iRow > -1 Then $iCol = _ArraySearch($__g_ahi, $idMenu, 0, 0, 0, 0, 0, $iRow, True) EndIf If $iCol > -1 And $iRow > -1 And $__g_aTT1[$iRow][$iCol] > " " Then ToolTip($__g_aTT1[$iRow][$iCol]) Else ToolTip("") EndIf EndIf EndFunc ;==>WM_MENUSELECT Example 1 Simple 1d array with tooltips, item separator and right click.
      #include "ArrayToMenu.au3" ;Simple 1d array with tooltips item separator and right click. $aM = StringSplit("Zero,One,-,Two/Two_R", ",", 3) ;make an array for the menu items $aT = StringSplit("Zero,One,-,", ",", 3) ;make an array for the menu Tooltips $aR = _ArrayToMenu($aM,$aT) if @error then ConsoleWrite(@error & @CRLF) EndIf ConsoleWrite("R: " & $aR[0] & " " & "C: " & $aR[1] & " " & "Rclick: " & $aR[2] & " " & "Item: " & $aR[3] & @CRLF) If $aR[0] = -1 Then ;either hit escape or clicked on another window ConsoleWrite("Esc" & @CRLF) Exit EndIf ;_ArrayDisplay($aR) Switch $aR[3] Case "Zero" Zero() Case "One" One() Case "Two/Two_R" And $aR[2] = 0 ;No Rclick Two() Case "Two/Two_R" And $aR[2] = 1 ;Rclick Two_R() EndSwitch Func Zero() ConsoleWrite("You chose: Zero" & @CRLF) EndFunc ;==>Zero Func One() ConsoleWrite("You chose: One" & @CRLF) EndFunc ;==>One Func Two() ConsoleWrite("You chose: Two" & @CRLF) EndFunc ;==>Two Func Two_R() ConsoleWrite("You chose: Two_R" & @CRLF) EndFunc ;==>Two_R Example 2 2d array with sub-menu
      #include "ArrayToMenu.au3" ;2d array with a sub-menu dim $aM[4][2] = [["Beef", "Orange"], ["Pork", "Apple"], ["Chicken", "Grape"], ["Fruit->", ""]] ;Note you don't need a tooltip for every item but you at least need a place holder in the array dim $aT[4][2] = [["Red Meat", "Fruit"], ["Other white meat", "Fruit"], ["White meat", "Fruit"], ["", ""]] $aR = _ArrayToMenu($aM,$aT) if @error Then ConsoleWrite(@error & @CRLF) Exit EndIf If $aR[0] = -1 Then ConsoleWrite("Esc" & @CRLF) Exit EndIf ConsoleWrite("R: " & $aR[0] & " " & "C: " & $aR[1] & " " & "Rclick: " & $aR[2] & " " & "Item: " & $aR[3] & @CRLF) Switch $aR[3] Case "Beef" Beef() Case "Pork" Pork() Case "Chicken" Chicken() Case "Orange" ConsoleWrite("Oranges are good for you!" & @CRLF) ConsoleWrite("Oranges" & " $aR[0] = " & $aR[0] & " $aR[1] = " & $aR[1] & @CRLF) Case "Apple" ConsoleWrite("Apples are good for you!" & @CRLF) Case "Grape" ConsoleWrite("Grapes are good for you!" & @CRLF) EndSwitch Func Beef() ConsoleWrite("Beef" & " $aR[0] = " & $aR[0] & " $aR[1] = " & $aR[1] & @CRLF) EndFunc ;==>Beef Func Pork() ConsoleWrite("Pork" & " $aR[0] = " & $aR[0] & " $aR[1] = " & $aR[1] & @CRLF) EndFunc ;==>Pork Func Chicken() ConsoleWrite("Chicken" & @CRLF) EndFunc ;==>Chicken  
    • By careca
      This is another take on string triggers, triggers on specific strings.
      Able to simple text pasting,
      opening links (as long as there's a www. http:\\ or https:\\ at the beggining)
      and is able to open applications, if there is a parameter in the parameter field, it uses it.
      The user selects the modifier key, and then uses a combination of that key with a couple others to perform tasks like
      screenshot the active window, (modkey + prtscr), turn off the screen (modkey + pause / break),
      open clipboard string in registry (modkey + R), change system volume (modkey + arrouw up/dn).
      The following keys pressed at the same time prompt for shutdown: S+D+T
      The following keys pressed at the same time prompt for restart: S+R+T
      Middle mouse button click on titlebar minimizes to tray, or a left mouse button click in the icon in the tray also minimizes.
      Trigger is set off by space or enter, and timeouts after 3 seconds.
      Shows your external, lan, and gateway ip's, can refresh with right mouse click, and opens the default browser if the correspondent button is pressed.
      Able to change system volume by a set percentage, reading from the inputbox the number the user sets, if 0 or empty uses system default.
      I made this because the existing string trigger applications didn't do it for me for a number of reasons.
      I did this for me, but if someone finds it useful all the better.
    • By Jeep
      Here is an other UDF for string handling :
      Date handling
      _StringDateConvert:  convert a date from one format ("YMD", "MDY" or "DMY") to another.
      _StringIsDate:  checks if a date with a given format is valid
      String management
      _StringCount: count of occurrences that appear in a string
      _StringFormatBytesSize: formatting a dimension expressed in bytes (bytes) in MB, TB, ...)
      _StringIsEndingWith: check if a string end with some characters
      _StringIsStartingWith: check if a string start with some characters
      _StringJoinArray:  concatenate elements of an array to rebuild a string
      _StringPadLeft: filling a string with characters on the left
      _StringPadRight: fill a string with characters on the right
      _StringRemoveFrenchAccent: remove french accent
      _StringRemoveChars: deleting characters from a string
      _StringStrip: eliminate characters at the begin and/or at the  end of a string
      _StringTitleCaseFrench: capitalize the first letter of each word with elimination of french accents
      _StringWSClean: simple replacement of "White Spaces",  remove beginning and trailing spaces and multiple spaces removal
      Any comments, suggestions for improvement or constructive criticism are welcome.
      Below you will find the UDF and a demo program. 
       
       
      JPD_String.zip
    • By Ibet
      Hey all, 
      Ending day 2 of learning AutoIt, and I'm stumped. I wrote an extremely rudimentary script simulating keystrokes for reading/copying values from one excel spreadsheet and pasting them into another spreadsheet, line by line. It works, but it doesn't use any of the Excel UDFs and was just sloppy. So, I'm trying to re-write it using some Excel UDFs to not only optimize the script, but to also learn how to use the Excel UDFs. If the answer is in a help file, please explain as I'm sometimes having problems understanding the examples in the help files.
      I'm getting the error: 
      "C:\Users\johndoe\Desktop\AutoIt Test\AutoIt_Read spreadsheet 1 - write spreadsheet 2-version2.au3" (25) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.: MsgBox(0,"Test","Test",$SourceEntry[1]) MsgBox(0,"Test","Test",^ ERROR >Exit code: 1 Time: 1.804 Here is the code:
      #include<Array.au3> #include<Excel.au3> ;-------------------Read from Source--------------------------- Local $oExcel_Source = _Excel_Open() Local $sWorkbook = "C:\Users\johndoe\Desktop\AutoIt Test\AutoIt_Testing_SOURCE.xlsx" Local $oWorkbook = _Excel_BookOpen($oExcel_Source,$sWorkbook) Local $SourceRow = 3 ;--eventually will be used to iterate through the rows, one at a time Local $SourceEntry[5] = _Excel_RangeRead($oWorkbook,Default,"A"&$SourceRow&":E"&$SourceRow) _ArrayDisplay($SourceEntry, "1D Display") ;--Displays array values correctly MsgBox(0,"Test","Test",$SourceEntry[1]) ;--Gives error, for any index in the array I want to make sure I can read the values of the array individually, before I try putting them into another document. This is because I've got to add some checks against the values already existing in the destination spreadsheet before any manipulation. I've spent the last hour or more googling that error and reading multiple posts where that error is meaning many different things, so unsure EXACTLY what the problem is. Would greatly appreciate a fix and/or explanation as well as patience with my noob-ness.
      Thanks in advance
×
×
  • Create New...