Jump to content
satanico64

Problem with _arraytranspose

Recommended Posts

hi guys ! nice to see you again !

i've just spend hours on the forum, until it went down... : \

so forum is back and me too, and here's the problem

Problem with array :
i've a 2d array, from which i want to extract 1 row with all it's value , to get a 1d array.

Method:

1 i search my value => got $index in array
2 i _arrayextract 1 row > But it still make a 2d array (1 value by column)
3 i arraytranspose => And it should make 1 d array

but not.... let's have a look with simplified code

Thanks to explain where i am wrong ?

ps: I've just updated latest stable version of autoit because i had bug with extract column zero . it's ok now but my transpose does'nt seems to work anymore...

thanks

nicolas.
Simple code:

#include <Array.au3>

Local $aArray[4][4]
For $i = 0 To 3
    For $j = 0 To 3
        $aArray[$i][$j] = $i & $j
    Next
Next
_ArrayDisplay($aArray, "Original")   ; >Display a 2d array

Local $aExtract = _ArrayExtract($aArray, 0, 0)   ; for me it extract 1 row but still 2d array
_ArrayDisplay($aExtract, "Row 0-0")
ConsoleWrite('dimension:' & UBound($aExtract, $UBOUND_DIMENSIONS ) & @CRLF )  ; It's a 2d array
_ArrayTranspose($aExtract)   ; I thought i should obtain a 1d array with that
_ArrayDisplay($aExtract, "Row 0-0")
ConsoleWrite('dimension:' & UBound($aExtract, $UBOUND_DIMENSIONS ) & @CRLF )  ; It's a 2d array

 

Share this post


Link to post
Share on other sites

_ArrayTranspose only swaps rows and columns but it doesn't change the number of dimensions. Seems you have to code it yourself.
But this is no brain surgery.


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (2018-12-03 - Version 1.4.11.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2019-03-02 - Version 1.3.5.0) - Download - General Help & Support - Example Scripts - Wiki
Outlook Tools (2019-01-22 - Version 0.1.0.0) - Download - General Help & Support
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
PowerPoint (2017-06-06 - Version 0.0.5.0) - Download - General Help & Support
Excel - Example Scripts - Wiki
Word - Wiki
 
Tutorials:

ADO - Wiki

 

Share this post


Link to post
Share on other sites

Example:

#include <Array.au3>
Global $aArray2D[3][3] = [[11, 12, 13], [21, 22, 23], [31, 32, 33]]
_ArrayDisplay($aArray2D)
Global $aArray1D[1]
Global $iIndex2D = 1
ReDim $aArray1D[UBound($aArray2D, 2)]
For $i = 0 to UBound($aArray2D, 2) - 1
    $aArray1D[$i] = $aArray2D[$iIndex2D][$i]
Next
_ArrayDisplay($aArray1D)

 


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (2018-12-03 - Version 1.4.11.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2019-03-02 - Version 1.3.5.0) - Download - General Help & Support - Example Scripts - Wiki
Outlook Tools (2019-01-22 - Version 0.1.0.0) - Download - General Help & Support
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
PowerPoint (2017-06-06 - Version 0.0.5.0) - Download - General Help & Support
Excel - Example Scripts - Wiki
Word - Wiki
 
Tutorials:

ADO - Wiki

 

Share this post


Link to post
Share on other sites

hmm i humbly disagree (or i simply don't understand), If you take a 1D array with more than 1 record, and you swap it make a 2d array.

If you swap again it should make a 1D array. (in our case where it has only one row)

 

i take the help file from _ArrayTranspose, it indicate that it transpose array from 1d to 2d, and 2d to 1d

the example provided, i just add consolewrite dimensions and remove first example:

 

#include <Array.au3>

Local $aArray[5] = [1, 2, 3, 4, 5]
ConsoleWrite('Initial 1D dimension :' & UBound($aArray, $UBOUND_DIMENSIONS ) & @CRLF )
_ArrayDisplay($aArray, "Original 1D")
_ArrayTranspose($aArray)
ConsoleWrite('dimension after transpose of 1D array :' & UBound($aArray, $UBOUND_DIMENSIONS ) & @CRLF )
_ArrayDisplay($aArray, "Transposed to 2D")
_ArrayTranspose($aArray)
ConsoleWrite('dimension after transpose of 2D array :' & UBound($aArray, $UBOUND_DIMENSIONS ) & @CRLF )
_ArrayDisplay($aArray, "Re-transposed to 1D")   ;>>>> BUT IT FAILED HERE, still 2D

 

where am i wrong ?

ps: Thanks Water for taking a look, i'm honored, your work helped me a lot, many times.

Share this post


Link to post
Share on other sites

As I see it the example is misleading/wrong. The UDF is not able to tell if a 2D array with only a single line should be a 1D array or a 2D array with only one column after transposing.
Will discuss this with the Devs.


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (2018-12-03 - Version 1.4.11.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2019-03-02 - Version 1.3.5.0) - Download - General Help & Support - Example Scripts - Wiki
Outlook Tools (2019-01-22 - Version 0.1.0.0) - Download - General Help & Support
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
PowerPoint (2017-06-06 - Version 0.0.5.0) - Download - General Help & Support
Excel - Example Scripts - Wiki
Word - Wiki
 
Tutorials:

ADO - Wiki

 

Share this post


Link to post
Share on other sites

by the way, for my original problem another solution is:

1 find index

2 transpose => still 2D but i 'll extract 1 column and not a row

3 extract one column => 1d array.

 

Edited by satanico64
missed one character

Share this post


Link to post
Share on other sites

i've just install old autoit version (3.3.12.0) on other computer, and the same last script transpose from 2d to 1d

Thanks for that info.
Already passed to the Devs.


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (2018-12-03 - Version 1.4.11.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2019-03-02 - Version 1.3.5.0) - Download - General Help & Support - Example Scripts - Wiki
Outlook Tools (2019-01-22 - Version 0.1.0.0) - Download - General Help & Support
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
PowerPoint (2017-06-06 - Version 0.0.5.0) - Download - General Help & Support
Excel - Example Scripts - Wiki
Word - Wiki
 
Tutorials:

ADO - Wiki

 

Share this post


Link to post
Share on other sites

Melba23 has already created this modification. There is a new parameter to specify if you want to get a 1D or 2D array in this special case.
Could you please check and post your findings?

#include <Array.au3>

Local $aArray[5] = [1, 2, 3, 4, 5]
_ArrayDisplay($aArray, "Original 1D")
_ArrayTranspose_Mod($aArray)
_ArrayDisplay($aArray, "Transposed to 2D")
_ArrayTranspose_Mod($aArray)
_ArrayDisplay($aArray, "Re-transposed as 2D")
_ArrayTranspose_Mod($aArray)
_ArrayDisplay($aArray, "Still 2D")
_ArrayTranspose_Mod($aArray, True) ; Force 1D return
_ArrayDisplay($aArray, "Re-transposed to 1D")

Func _ArrayTranspose_Mod(ByRef $aArray, $bForce1D = False)
    Switch UBound($aArray, 0)
        Case 0
            Return SetError(2, 0, 0)
        Case 1
            Local $aTemp[1][UBound($aArray)]
            For $i = 0 To UBound($aArray) - 1
                $aTemp[0][$i] = $aArray[$i]
            Next
            $aArray = $aTemp
        Case 2
            Local $iDim_1 = UBound($aArray, 1), $iDim_2 = UBound($aArray, 2)
            If $iDim_1 <> $iDim_2 Then
                If $iDim_1 = 1 And $bForce1D Then ; If only 1 row and 1D return forced
                    Local $aTemp[$iDim_2]
                    For $i = 0 To $iDim_2 - 1
                        $aTemp[$i] = $aArray[0][$i]
                    Next
                Else ; Stay as 2D
                    Local $aTemp[$iDim_2][$iDim_1]
                    For $i = 0 To $iDim_1 - 1
                        For $j = 0 To $iDim_2 - 1
                            $aTemp[$j][$i] = $aArray[$i][$j]
                        Next
                    Next
                EndIf
                $aArray = $aTemp
            Else ; optimimal method for a square grid
                Local $vElement
                For $i = 0 To $iDim_1 - 1
                    For $j = $i + 1 To $iDim_2 - 1
                        $vElement = $aArray[$i][$j]
                        $aArray[$i][$j] = $aArray[$j][$i]
                        $aArray[$j][$i] = $vElement
                    Next
                Next
            EndIf
        Case Else
            Return SetError(1, 0, 0)
    EndSwitch
    Return 1
EndFunc   ;==>_ArrayTranspose

 


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (2018-12-03 - Version 1.4.11.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2019-03-02 - Version 1.3.5.0) - Download - General Help & Support - Example Scripts - Wiki
Outlook Tools (2019-01-22 - Version 0.1.0.0) - Download - General Help & Support
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
PowerPoint (2017-06-06 - Version 0.0.5.0) - Download - General Help & Support
Excel - Example Scripts - Wiki
Word - Wiki
 
Tutorials:

ADO - Wiki

 

Share this post


Link to post
Share on other sites

It works like a charm.

Thanks all of you.

And I wish you a happy new year from Bordeaux, France.

Nicolas.

my test code:

#include <Array.au3>

Local $aArray[5] = [1, 2, 3, 4, 5]
_ArrayDisplay($aArray, "Original 1D")
ConsoleWrite('Initial 1D dimension :' & UBound($aArray, $UBOUND_DIMENSIONS ) & @CRLF )

_ArrayTranspose_Mod($aArray)
ConsoleWrite('Dimension Transposed to 2D :' & UBound($aArray, $UBOUND_DIMENSIONS ) & @CRLF )
_ArrayDisplay($aArray, "Transposed to 2D")

_ArrayTranspose_Mod($aArray)   ; still 2D, but expected.
ConsoleWrite('re transpose to initial without force, dimension :' & UBound($aArray, $UBOUND_DIMENSIONS ) & @CRLF )
_ArrayDisplay($aArray, "Re-transposed as initial without force ")

_ArrayTranspose_Mod($aArray)
ConsoleWrite('re Transposed to 2D :' & UBound($aArray, $UBOUND_DIMENSIONS ) & @CRLF ) ;obvsiouly 2D
_ArrayDisplay($aArray, "Transposed to 2D again")

_ArrayTranspose_Mod($aArray, True) ; Force 1D return  => Now 1D. Hoped. Obtained. Impressed.
ConsoleWrite('Transposed to 1d with force :' & UBound($aArray, $UBOUND_DIMENSIONS ) & @CRLF )
_ArrayDisplay($aArray, "Transposed to initial")


Func _ArrayTranspose_Mod(ByRef $aArray, $bForce1D = False)
    Switch UBound($aArray, 0)
        Case 0
            Return SetError(2, 0, 0)
        Case 1
            Local $aTemp[1][UBound($aArray)]
            For $i = 0 To UBound($aArray) - 1
                $aTemp[0][$i] = $aArray[$i]
            Next
            $aArray = $aTemp
        Case 2
            Local $iDim_1 = UBound($aArray, 1), $iDim_2 = UBound($aArray, 2)
            If $iDim_1 <> $iDim_2 Then
                If $iDim_1 = 1 And $bForce1D Then ; If only 1 row and 1D return forced
                    Local $aTemp[$iDim_2]
                    For $i = 0 To $iDim_2 - 1
                        $aTemp[$i] = $aArray[0][$i]
                    Next
                Else ; Stay as 2D
                    Local $aTemp[$iDim_2][$iDim_1]
                    For $i = 0 To $iDim_1 - 1
                        For $j = 0 To $iDim_2 - 1
                            $aTemp[$j][$i] = $aArray[$i][$j]
                        Next
                    Next
                EndIf
                $aArray = $aTemp
            Else ; optimimal method for a square grid
                Local $vElement
                For $i = 0 To $iDim_1 - 1
                    For $j = $i + 1 To $iDim_2 - 1
                        $vElement = $aArray[$i][$j]
                        $aArray[$i][$j] = $aArray[$j][$i]
                        $aArray[$j][$i] = $vElement
                    Next
                Next
            EndIf
        Case Else
            Return SetError(1, 0, 0)
    EndSwitch
    Return 1
EndFunc   ;==>_ArrayTranspose

 

Share this post


Link to post
Share on other sites

Thanks for testing.
I'm glad this little modification solved your problem.
Will tell Melba about the result so he might include it in the Array UDF.

Happy new year from Lake Constance!
 


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (2018-12-03 - Version 1.4.11.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2019-03-02 - Version 1.3.5.0) - Download - General Help & Support - Example Scripts - Wiki
Outlook Tools (2019-01-22 - Version 0.1.0.0) - Download - General Help & Support
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
PowerPoint (2017-06-06 - Version 0.0.5.0) - Download - General Help & Support
Excel - Example Scripts - Wiki
Word - Wiki
 
Tutorials:

ADO - Wiki

 

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 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
    • By SlackerAl
      I appreciate this seems like a trivial question, but my searching has failed....
      I was using a 1D array as follows:
      Local $DataName[3] = [2, $sBaseFileName, $sUpdatedFileName] And all was OK. I then wanted to separate the declaration from the assignment and assumed I could do something like:
      Local $DataName[3] $DataName = [2, $sBaseFileName, $sUpdatedFileName] ;or $DataName[] = [2, $sBaseFileName, $sUpdatedFileName] But I see I cannot. I am aware that I can add the 3 elements 1 at a time with _ArrayAdd, but is there a simple inline method like I was trying for?
    • By Lynn Shaw
      Anyone know why _ArraySearch is not finding an entry with a single quote in it?  
      Here is an example:
      #include <array.au3>
      Dim $array[3][2]
      $array[0][0] = "Testing is****fun"
      $array[1][0] = "Don't mess with me kid"
      $array[2][0] = "blah'blah"
      _ArrayDisplay($array)
      $index = _ArraySearch($array, "blah'blah", 0, 0, 0, 0, 1, 1)
      MsgBox(262144, 'Debug line ~' & @ScriptLineNumber, 'Selection:' & @CRLF & '$index' & @CRLF & @CRLF & 'Return:' & @CRLF & $index) ;### Debug MSGBOX
×
×
  • Create New...