Ghost_Archer Posted October 19, 2020 Share Posted October 19, 2020 (edited) Just some thinking to make the _debugArrayDisplay neater, and _ArrayDispaly more flexible. _debugArrayDisplay's buttons that looks weird, moreover, only one button can be user defined. _ArrayDisplay does not allow to hook up with something else, unless create a customized ArrayDisplayInternal. Is it possible to extend the usage for _ArrayDisplay by separate two functions before and after GUISetState(@SW_SHOW) -- _ArrayDisplayInit to return an array of handles of components, _ArrayDisplayRunn($aArrayOfHandleCallbackFlags), user can change property of the handles (like set background color), add contextmenu, etc as the preconfiguration stage between the two. For _debugArrayDisplay, it would be much neater if buttons is moved into a contextmenu; and it is possibly more extensible if it accept an array of new menu item and callbacks. The callback can still have two arguments (array and index), or additional handle/handles. Edited October 19, 2020 by Ghost_Archer Link to comment Share on other sites More sharing options...
Moderators Melba23 Posted October 20, 2020 Moderators Share Posted October 20, 2020 Ghost_Archer, _ArrayDisplay is designed for a "quick look" at an array content - _DebugArrayDisplay for a more detailed examination of the content during script development. Think of them as the array equivalent of ConsoleWrite. And just like that function, neither are intended for interaction with an operational script - if you want that sort of functionality then you will need to write your own version. M23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area Link to comment Share on other sites More sharing options...
pixelsearch Posted October 20, 2020 Share Posted October 20, 2020 20 hours ago, Ghost_Archer said: _ArrayDisplay does not allow to hook up with something else, unless create a customized ArrayDisplayInternal. 4 hours ago, Melba23 said: if you want that sort of functionality then you will need to write your own version. Hi, I did this a year ago, tweaking ArrayDisplayInternals.au3 five times for personal use. It required first to study __ArrayDisplay_Share(), gladly the function has great comments in it. Here is the summary of the tweaks (first two are cosmetic), maybe it will give you some ideas in case you wanna tweak your own version. 1) Allow ArrayDisplay initial width to be larger than 210 (default) : cosmetic. Useful if you got plenty of ArrayDisplay important titles in a script and they are cropped, then better start with an original width > 210, or you'll have to resize constantly each ArrayDisplay : ; In calling script _ArrayDisplay($aArray, "Important title not cropped" & "<<<width>>>" & "300", ...) ; in __ArrayDisplay_Share() ; ==== pixelsearch insert 1a ==== Local $iPosChevrons = StringInStr($sTitle, "<<<width>>>") ; 0 when not found If $iPosChevrons <> 0 Then Local $iForcedWidth = Number(StringMid($sTitle, $iPosChevrons + 11)) ; ex. $sTitle = "ArrayDisplay title<<<width>>>300" => 300 $sTitle = StringLeft($sTitle, $iPosChevrons - 1) ; ex. $sTitle = "ArrayDisplay title<<<width>>>300" => "ArrayDisplay title" EndIf ; =============================== ... ; ==== pixelsearch change 1b ==== ; Create GUI ; Local $iOrgWidth = 210, $iHeight = 200, $iMinSize = 250 Local $iOrgWidth = (($iPosChevrons = 0) ? (210) : ($iForcedWidth)), $iHeight = 200, $iMinSize = 250 ; =============================== 2) ArrayDisplay GUI always on top : cosmetic (tired of the "seek & hide" game with ArrayDisplay GUI) ; ==== pixelsearch change 2 ==== ; Local $hGUI = GUICreate($sTitle, $iOrgWidth, $iHeight, Default, Default, _ ; BitOR($_ARRAYCONSTANT_WS_SIZEBOX, $_ARRAYCONSTANT_WS_MINIMIZEBOX, $_ARRAYCONSTANT_WS_MAXIMIZEBOX)) Local $hGUI = GUICreate($sTitle, $iOrgWidth, $iHeight, Default, Default, _ BitOR($_ARRAYCONSTANT_WS_SIZEBOX, $_ARRAYCONSTANT_WS_MINIMIZEBOX, $_ARRAYCONSTANT_WS_MAXIMIZEBOX), 0x00000008) ; $WS_EX_TOPMOST = 0x00000008 ; =============================== 3) Allow a non-contiguous rows set to be displayed, for example rows 0, 2 and 9 ; ==== pixelsearch insert 3a ==== Local $bFilter = False If StringRight($sArrayRange, 1) = "," Then ; ex. "0,2,9," will filter on rows 0 & 2 & 9 : important "," at the end (+++) Local $aFilter = StringSplit(StringTrimRight($sArrayRange, 1), ",") ; remove last "," then Split on "," Local $bFilter = True, $iFilterInc = 0 $sArrayRange = "" ; keep compatibility with original function code EndIf ; =============================== As there are several parts of __ArrayDisplay_Share() involved in this, I only indicated the 1st part of the tweak, all following parts of the tweak are based on the test : If $bFilter Then... 4) Right-click on a row calls an external function named "_ArrayDisplay_Is_Calling", with 2 parameters being the row content and the array title. If the external function doesn't exist in the calling script, then right-click does nothing (as is in the original __ArrayDisplay_Share function) so the tweak(s) are compatible with any script using _ArrayDisplay expandcollapse popup; ==== pixelsearch insert 4a ==== Case - 9 ; $GUI_EVENT_SECONDARYDOWN = - 9 (right click) Local $sTextRightClick = __ArrayDisplay_GetItemTextString2($idListView) ; no 2nd parameter => check if ANY row is selected If $sTextRightClick <> "" Then If $iCoordMode <> 1 Then Opt("GUICoordMode", $iCoordMode) ; reset user's Coord mode (before Call) If $iOnEventMode <> 0 Then Opt("GUIOnEventMode", $iOnEventMode) ; reset user's GUI mode (before Call) #ignorefunc _ArrayDisplay_Is_Calling ; Call() is great to call a function that may not exist without script fatal error (see help file) Call("_ArrayDisplay_Is_Calling", $sTitle, $sTextRightClick) ; @error = 0xDEAD and @extended = 0xBEEF if function does not exist or invalid number of parameters. ; don't test 0xDEAD and 0xBEEF to stay compatible with all scripts. If $iCoordMode <> 1 Then Opt("GUICoordMode", 1) ; Melba23's Coord mode (as defined much higher before While 1 loop) If $iOnEventMode <> 0 Then Opt("GUIOnEventMode", 0) ; Melba23's GetMessage mode (as defined just before While 1 loop) EndIf ; =============================== ... ; ==== pixelsearch insert 4b ==== Func __ArrayDisplay_GetItemTextString2($hWnd, $iItem = -1) ; based on _GUICtrlListView_GetItemTextString() in GuiListView.au3 ; and on _GUICtrlListView_GetNextItem() also in GuiListView.au3 Local $sRow = "", $sSeparatorChar = Opt('GUIDataSeparatorChar'), $iSelected If $iItem = -1 Then $iSelected = GUICtrlSendMsg($hWnd, 0x1000 + 12, -1, 0x0002) ; get current row selected If $iSelected = - 1 Then Return "" ; -1 if no row selected, i.e right click (in list view) in empty place or buttons or headers Else $iSelected = $iItem ; get row EndIf For $x = 0 To __ArrayDisplay_GetColumnCount($hWnd) - 1 $sRow &= __ArrayDisplay_GetItemText($hWnd, $iSelected, $x) & $sSeparatorChar Next Return StringTrimRight($sRow, 1) EndFunc ;==>__ArrayDisplay_GetItemTextString2 ; =============================== In calling script : ; ==================================================== Func _ArrayDisplay_Is_Calling(Const $sTitle, $sTextRightClick) ; display image in GUI window (function usable for other purpose) ... EndFunc ; _ArrayDisplay_Is_Calling() 5) DebugArrayDisplay : Exit button changed to Cancel Button (setting @extended to 101) and it will return to the script, so it gives more flexibility to the script, instead of a brutal exit. Also, the label control indicating the number of rows is now clickable, showing also "Ok" in its caption. "Ok / Cancel", we know where to click expandcollapse popup; ==== pixelsearch change 5a ==== ; $idExit_Script = GUICtrlCreateButton("Exit Script", $iOffset, $aiGUISize[1] - 20, $iButtonWidth_Var, 20) ; $idData_Label = GUICtrlCreateLabel($sDisplayData, 0, $aiGUISize[1] - 20, $iButtonWidth_Var, 18, BitOR($_ARRAYCONSTANT_SS_CENTER, $_ARRAYCONSTANT_SS_CENTERIMAGE)) $idExit_Script = GUICtrlCreateButton("Cancel", $iOffset, $aiGUISize[1] - 20, $iButtonWidth_Var, 20) $idData_Label = GUICtrlCreateLabel("OK " & $sDisplayData, 0, $aiGUISize[1] - 20, $iButtonWidth_Var, 18, BitOR($_ARRAYCONSTANT_SS_CENTER, $_ARRAYCONSTANT_SS_CENTERIMAGE)) ; =============================== ... ; ==== pixelsearch change 5b ==== ; Case $_ARRAYCONSTANT_GUI_EVENT_CLOSE Case $_ARRAYCONSTANT_GUI_EVENT_CLOSE, $idData_Label ; Exitloop if Red X, Esc (if not deactivated), or left click $idData_Label ; =============================== ... Case $idExit_Script ; Clear up GUIDelete($hGUI) ; ==== pixelsearch change 5c ==== ; Exit Opt("GUICoordMode", $iCoordMode) ; Reset original Coord mode Opt("GUIOnEventMode", $iOnEventMode) ; Reset original GUI mode Return SetExtended(101, 1) ; @extended = 101 and Return 1 (my way to know in calling script what to do if @extended = 101) ; =============================== In calling script, for example : _DebugArrayDisplay($aListe_img, _ $aListe_img[0] & " image" & (($aListe_img[0] = 1) ? ("") : ("s")) & " to resize", _ "1:", 0, Default, "Image name", 940) ; _DebugArrayDisplay() HAD an 'Exit Script' button (tweaked it to a 'Cancel' button to return here with @extended = 101) ; note "1:" for fun => skip row 0 (contains number of images in Array) If @extended = 101 Then Return - 1 ; requires my 5th tweak in __ArrayDisplay_Share() : user clicked on Cancel button in __ArrayDisplay_Share() Now you may ask : what are you going to do when a new AutoIt release will appear ? Well I guess I'll use (again) a utility named Beyond Compare to track the differences between the 2 original versions of __ArrayDisplay_Share(), then reinject the tweaks into the new __ArrayDisplay_Share() It shouldn't be too difficult as all 5 tweaks got "delimiters" like ; ==== pixelsearch insert 4a ==== etc... AutoIt is fun Skysnake 1 Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now