Jump to content

GUIListViewEx - BugFix Version 6 Apr 24


Melba23
 Share

Recommended Posts

  • Moderators

Tankbuster,

What exactly do you want to do? Initialise an existing ListView or reload an already-intialised one dynamically with new data?

By the way, you might like to Beta test this new version for me:

<snip>

Make sure you read the attached Guide as I have changed a fair few things - intended (I hope) to simplify the UDF for the user, such as only having the one idle loop function which looks after all the UDF events rather then a whole slew of them. And yes, it does drag/drop checkboxes!

Let me know what you think,

M23

Edited by Melba23
Beta code removed

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png 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 columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Link to comment
Share on other sites

I think the answer to my question is (How to reload a already initialised LV with completly new data?)

_GUIListViewEx_Close  before the init. Just as you wrote even in the previous guide.
I run exactly in the issue you descibed in the guide. I used the DeleteAllItems and the init of the ListViewEx, but sometimes the array was just not right (and raised

And I will check the Checkboxes.

Realy thank you for beeing again patient (while I ask things that should be clear by reading the guide......).
Maybe and this is only a suggestion for people like me : Add a button to eg. example 4 to reset one of the views and reload different data.
(I'm always impatient and try to learn it from the examples :-) )

Thank you already for the new version.

 

 

Link to comment
Share on other sites

Hi, Maestro @Melba23 !  I'm about to develop an app for my own use that seems like it would not only benefit enormously from your UDF, but it would be ridiculously tricky to code if it were not centrally based on your amazing UDF.

And since you noted on Monday that you would appreciate some Beta testing of your new version (GUIListViewEx_EventMonitor.au3), I decided to help since you've done so very much for me. This might also be worthwhile to you because I always run in 64-bit mode, so I can test for that compatibility.

So I decided the place to start would be to modify the examples you posted in your original zip (on page 1) to #include your new UDF and add the bare-bones processing in the examples' code (but not yet to actually respond to the new events - I'm too much of a noob to your UDF (either one) to try that yet).

I've finished this initial step for the first two example files, and I've run into a problem: Your new version doesn't include a function named "_GUIListViewEx_EditOnClick()", probably because the new version doesn't do things that way anymore. But these first two examples (at least so far) call it, so obviously the code won't pass the syntax tests or compile.

I'm going to attach a zip file containing the modified two example files for you to examine. When you look at the code I've added in the message loop, please understand that since I'm Beta testing, I've added a crazy amount of error checking which I'd never code for a production UDF, so bear that in mind, please, rather than think me a moron...

 

ETA: The function "_GUIListViewEx_ToolTipShow()" also appears to be missing...

 

PreliminaryExamples.zip

Edited by Mbee
Added new problem
Link to comment
Share on other sites

  • Moderators

Mbee,

Did you read the Guide I posted with the Beta? It explains that you now only need the _GUIListViewEx_EventMonitor function in the idle loop rather than the whole slew of functions that were needed before for editing, showing tooltips, reporting drags and sorts, and correctly recolouring.

Here are the examples I have rewritten for the Beta: . You will need to rename the Beta GLVEx include file line to match your saved Beta filename - it is currently set to GUIListViewEx_EventMonitor.au3 which is what I used for testing.

Thanks for trying out the Beta - do let me know if you run into any problems now you have the modified examples.

M23

 

Edited by Melba23
Beta code removed

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png 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 columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Link to comment
Share on other sites

6 minutes ago, Melba23 said:

Mbee,

Did you read the Guide I posted with the Beta? It explains that you now only need the _GUIListViewEx_EventMonitor function in the idle loop rather than the whole slew of functions that were needed before for editing, showing tooltips, reporting drags and sorts, and correctly recolouring.

Here are the examples I have rewritten for the Beta: GLVEx_Beta_Examples.zip. You will need to rename the Beta GLVEx include file line to match your saved Beta filename - it is currently set to GUIListViewEx_EventMonitor.au3 which is what I used for testing.

Thanks for trying out the Beta - do let me know if you run into any problems now you have the modified examples.

M23

 

Thanks for your fast reply, Melba!  But is it possible that you forgot to post the most recent version of the Guide document? Otherwise, perhaps you were too familiar with the material, since I've read and re-read it, yet I can't find anyplace in the posted document where it explicitly states or even strongly suggests that now only the _GUIListViewEX_EventMonitor() function is needed in the message loop (other than ancillary event processing such as that required for manually specified registered messages, etc). Instead, it states:

Quote

Adding the _GUIListViewEx_EventMonitor function to the idle loop allows you to monitor 3 types of UDF event...
...
The _GUIListViewEx_EventMonitor function should also be placed in the idle loop in 2 other cases...
...
Basically - if in doubt, add this function to the idle loop!

 

All of which strongly implies that the function is useful and recommended, but generally optional (not essential in the message loop processing). The document does not appear (to my eyes) to state that the function in question totally replaces all other non-ancillary message/event processing, nor that the EditOnClick and ToolTip-related functions have been eliminated.

I apologize if I've given offense! It's just that while I may well be an AutoIt noob, I'm pretty good at reading and comprehending English, and I've long made it a habit to read documentation...

In any event, the Beta examples you've provided resolve these issues much more succinctly than the Guide alone!  If they had been posted earlier, I would not have troubled you (though I would still have volunteered for Beta testing).

Thank you again for your time and your awesome code!

 

Link to comment
Share on other sites

  • Moderators

Mbee,

No offence taken - I really should have posted the modified examples along with the Beta UDF, but I had not yet finished testing them to my satisfaction.

M23

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png 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 columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Link to comment
Share on other sites

  • Moderators

InunoTaishou,

You need to use the UDF functions to change the ListView content - that way it all happens automatically. If you could provide more details I can suggest how you might manage the data changes within the UDF.

M23

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png 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 columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Link to comment
Share on other sites

I like the monitor feature. I think this makes using the UDF more easy and flexible/controllable
Btw. Guess what on user request I needed to remove the checkboxes from the Listview......(see my question in previous post)
BUT ! I already got a new script that uses this kind of feature. So thank you again.

Will watch this until it goes out of Beta.

Awesome work.

Link to comment
Share on other sites

  • Moderators

Tankbuster,

Sorry, missed your post #129 yesterday. Glad you like the new EventMonitor version of the UDF - I will see about releasing it next week.

M23

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png 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 columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Link to comment
Share on other sites

  • 2 weeks later...

Hello Melba23,

in my first app, I included the monitor version.
It works fine. Adding, reset, ordering , just everything as expected.  But it crashes on a certain feature, but maybe I did not used it in the correct way.

Let me describe, how and why and I attached a modified version of the example 2 (of the beta) to show you what I did .

 

I got a LV. Got it initialized and also the Tooltip activated in my idle loop.
I load data to the LV. Tool tip is shown. So far so good.
Now a "reset" button resets the LV:

{snip from my code - I attached the lines to the example, so you see what I try. The rest is pretty much the same.}
(just check Line 116 in the example "Case $cDelete_Button....." and start it and press the delete on the left LV and finally click in the LV)

_GUICtrlListView_DeleteAllItems($lvMain)
_GUIListViewEx_Close($lvMain_ExInit)
ReDim $aTC[0]
$lvMain_ExInit = _GUIListViewEx_Init($lvMain, "", 0, 0, True,  64 + 128 + 256)
_GUIListViewEx_ToolTipInit($lvMain_ExInit, "*", 2000)
$aTC = _GUIListViewEx_ReturnArray($lvMain_ExInit)

It looks like
$vRet = _GUIListViewEx_EventMonitor()
does not like it in case  the _GUIListViewEx_Close($lvMain_ExInit) is called .
$sText = $aItemText[$aGLVEx_Data[0][5] + 1]
$sText = ^ ERROR

Is this a issue? Something that the UDF does not expect to happen ("close" while using monitor?)
Do I need to call the _GUIListViewEx_MsgRegister() again on the close?

GLVEx_Example_2_withCloseCrash.au3

Link to comment
Share on other sites

  • Moderators

Tankbuster,

Nothing to do with the EventMonitor function. I did not test for a valid return before trying to access the item text to create the tooltip - hence the crash when the code tries to do so.

Try this version: <snip>

M23

 

Edited by Melba23
Beta code removed

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png 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 columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Link to comment
Share on other sites

Yep, works as expected now. Crash is not seen anymore.

And a new question: In case I want no "internal" drag, I need to set the

_GUIListViewEx_MsgRegister($fMOUSEMOVE = False) 

But that would affect all initialized LVs, right?
Is it possible to remove the internal drag from a certain LV?
 

And question 2:

On the tooltip in example2, after the text it displays always a "number" , what is this?

The init says "0", so only col 0 should be displayed, right?

snip.jpg

Edited by Tankbuster
Link to comment
Share on other sites

  • Moderators

Tankbuster,

There is currently no way to remove the internal drag/drop from a single ListView - mostly because no-one has ever asked for that functionality. I will look at how it might be implemented.

As for the tooltip question: I see what you mean and I will look into why that happens.

M23

Edit: I see the tooltip problem and I am working on fixing it.

Edit 2:  I think I have both changes working. Note that if you use single cell selection you need to change the _Init $iAdded value as I have used its old value for the new functionality:

;                               + 64    - No external drag
;                               + 128   - No external drop
;                               + 256   - No delete on external drag/drop
;                               + 512   - No drag/drop                                          < new functionality
;                               + 1024  - Single cell selection (forces single selection)       < used to be 512

 

How does it work for you?

M23

Edited by Melba23
Beta code removed

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png 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 columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Link to comment
Share on other sites

Nice. I confirm, the MOD version of the last post works for both requests.

For the _Init $iAdded I only needed to add 512 in my case as I did not used 512 before.

Good job - and fast as hell again. Thx. Will wait for the final UDF but up to now for me the UDF works as expected.

 

Link to comment
Share on other sites

  • Moderators

Tankbuster,

And thank you for the testing - you never find all the bugs yourself!

M23

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png 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 columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Link to comment
Share on other sites

Dear Melba23,

First Many Thank!

Below is an example that i'm using to learn about your UDF. Basically it looks for a name in a MS Access table and display results in a listview.

I'm having to difficulties:

  • If any row of the access table has a pipe character ("|") in the first field, then seems to produce an error in the _GUIListViewEx_ReadToArray: 'Array variable has incorrect number of subscripts or subscript dimension range exceeded.: $aLVArray[$i + $iStart][$j - 1] = $aRow[$j] '

              (Examples of use of the character in a phone book could be:  Roberto | CompanyA  while other 'name' could be Roberto | DepartmentB )

  • I'm not able to edit ListView contents.

Any suggestions would be appreciated. Thanks in advance.

Edited Nov, 11 (solved)

#include <GuiConstants.au3>
#include <EditConstants.au3>
#include <GuiMenu.au3>

;GUIListViewEx from Melba23  https://www.autoitscript.com/forum/topic/182492-guilistviewex-new-version-27-may-16
#include "GUIListViewEx.au3"
Global $iEditMode = 23

;Gui adapted From Ayman Henry (aymhenry@gmail.com), Phone Book Rev 02

;Sorry but don't remember where _GUI_ToTray function was found nor the name of the author
#Include <Constants.au3>
Opt("TrayOnEventMode", 1)
Opt("TrayMenuMode", 1)
Opt("TrayAutoPause", 0)
Opt("TrayIconHide", 1)

Opt( "MustDeclareVars", 1 )

;_ErrADODB From spudw2k
;https://www.autoitscript.com/forum/topic/105875-adodb-example/
Global $errADODB = ObjEvent("AutoIt.Error","_ErrADODB")
Local Const $sTitle = "Phone Book"

Const $conOK = 1, $conEdit = 1, $conAdd = 0

Global $cmdAdd, $cmdEdit, $cmdDelete, $cmdCancel
Global $cmdNext, $cmdFirst, $cmdPrev, $cmdLast
Global $cmdSave
Global $InStr

Global $n_RecCount, $n_RecPos

; Sreen Fields
Global $txtFirstName, $txtMidName, $txtLastName
Global $txtMobile, $txtHomePhone, $txtAddress
Global $lblRecPos

Global $sAnswer, $TempAr
Global $sSQL
Global $iCursorType = 0  ;0 adOpenForwardOnly, 1 adOpenKeyset
Global $iLockType = 3 ;1 adLockReadOnly, 3 adLockOptimistic
Global $iOptions = 1 ; Options, 1 Evaluates as a textual definition of a command or stored procedure call
Global $cn = ObjCreate("ADODB.Connection") ; Create a connection object
Global $rst = ObjCreate("ADODB.Recordset") ; Create a recordset object
Global $sFilename = @ScriptDir & "\db.mdb"
Global $cString = "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & $sFilename
;Global $cString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & $sFilename & ";Jet OLEDB:Database Password=123"
;$cString = 'DRIVER={Microsoft Access Driver (*.mdb)};Dbq=' & $sFilename & ';uid=;pwd=MyPassword;'
$cn.Open($cString) ; Open the connection
Global $tblname = "Tel", $w

Global $GuiWidth = @DesktopWidth-2, $GuiHight = @DesktopHeight-77
Global Enum $idExit = 1000, $idFavorites, $idCustomFavs1, $idCustomFavs2
Global $hGui, $hMenu

Local $hFile, $hCustomFavs, $hPrograms, $hCustomProgs

;Create GUI
$hGui = GUICreate($sTitle, $GuiWidth, $GuiHight)
GUISetBkColor(0xA9A9A9)

;Register a function for WM_COMMAND messages
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

; Create File menu
$hFile = _GUICtrlMenu_CreateMenu()
_GUICtrlMenu_InsertMenuItem($hFile, 0, "Exit", $idExit)

;This is from LarsJ: ShowFavsProgsMenu. Create custom Favorites menu.
$hCustomFavs = _GUICtrlMenu_CreateMenu()
_GUICtrlMenu_InsertMenuItem($hCustomFavs, 0, "A&utoIt", $idCustomFavs1)
_GUICtrlMenu_InsertMenuItem($hCustomFavs, 1, "&Microsoft", $idCustomFavs2)

; Create Main menu
$hMenu = _GUICtrlMenu_CreateMenu()
_GUICtrlMenu_InsertMenuItem($hMenu, 0, "&File", 0, $hFile)
_GUICtrlMenu_InsertMenuItem($hMenu, 1, "Fa&vorites", $idFavorites)
_GUICtrlMenu_InsertMenuItem($hMenu, 2, "Custom Fav&orites", 0, $hCustomFavs)

;Set window menu
_GUICtrlMenu_SetMenu($hGui, $hMenu)

Local $Label1, $Label2, $Label3, $Label4, $Label5, $Label6

$Label1 = GUICtrlCreateLabel("N", 8, 45, 20, 20)
$Label2 = GUICtrlCreateLabel("T1", 8, 81, 20, 20)
$Label3 = GUICtrlCreateLabel("T2", 8, 117, 20, 20)
$Label4 = GUICtrlCreateLabel("T3", 8, 153, 20, 20)
$Label5 = GUICtrlCreateLabel("T4", 8, 189, 20, 20)
$Label6 = GUICtrlCreateLabel("A", 8, 225, 20, 20)

Global $KeyW = GUICtrlCreateInput("", 30, 2, 205, 33)
GUICtrlSetBkColor(-1, 0xD3D3D3)
GUICtrlSetFont(-1, 11)

$txtFirstName = GUICtrlCreateInput("", 30, 40, 1130, 30)
GUICtrlSetLimit(-1, 200)
GUICtrlSetFont(-1, 12)

$txtMidName = GUICtrlCreateInput("", 30, 76, 1130, 30)
GUICtrlSetLimit(-1, 100)
GUICtrlSetFont(-1, 12)

$txtLastName = GUICtrlCreateInput("", 30, 112, 1130, 30)
GUICtrlSetLimit(-1, 100)
GUICtrlSetFont(-1, 12)

$txtMobile = GUICtrlCreateInput("", 30, 148, 1130, 30)
GUICtrlSetLimit(-1, 100)
GUICtrlSetFont(-1, 12)

$txtHomePhone = GUICtrlCreateInput("", 30, 184, 1130, 30)
GUICtrlSetLimit(-1, 100)
GUICtrlSetFont(-1, 12)

$txtAddress = GUICtrlCreateInput("", 30, 220, 1130, 30)
GUICtrlSetLimit(-1, 250)
GUICtrlSetFont(-1, 9)

;This is from Melba23 GUIListViewEx
Global $cLV, $iLV, $hLV
$cLV = GUICtrlCreateListView("Name|T1|T2|T3", 2, 255, $GuiWidth-4, 530)
;$cLV = GUICtrlCreateListView("Name|T1|T2|T3", 2, 255, $GuiWidth-4, 440, BitOR($LVS_SINGLESEL, $LVS_SHOWSELALWAYS))
;_GUICtrlListView_SetExtendedListViewStyle($cLV, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES))
_GUICtrlListView_SetColumnWidth($cLV, 0, 600)
_GUICtrlListView_SetColumnWidth($cLV, 1, 250)
_GUICtrlListView_SetColumnWidth($cLV, 2, 250)
_GUICtrlListView_SetColumnWidth($cLV, 3, 250)

;Initiate GLVEx - no array passed - count parameter set - default insert mark colour (black) - drag image
$iLV = _GUIListViewEx_Init($cLV, "", 1, 0, True, 4)
;All columns editable
_GUIListViewEx_SetEditStatus($iLV, "*")
;Insert blank rows
;For $i = 0 To 9
;  _GUIListViewEx_Insert("")
;Next

$cmdFirst = GUICtrlCreateButton("|<", 250, 2, 33, 33, 0)
$cmdPrev = GUICtrlCreateButton("<", 286, 2, 33, 33, 0)
$lblRecPos = GUICtrlCreateLabel("", 318, 8, 80, 24, $ES_CENTER)
GUICtrlSetFont(-1, 11)
$cmdNext = GUICtrlCreateButton(">", 396, 2, 33, 33, 0)
$cmdLast = GUICtrlCreateButton(">|", 432, 2, 33, 33, 0)

$cmdAdd = GUICtrlCreateButton("Add", 1170, 40, 92, 31, 0)
GUICtrlSetState(-1, $GUI_DISABLE)
$cmdEdit = GUICtrlCreateButton("Edit", 1170, 76, 92, 31, 0)
GUICtrlSetState(-1, $GUI_DISABLE)
$cmdDelete = GUICtrlCreateButton("Delete", 1170, 112, 92, 31, 0)
GUICtrlSetState(-1, $GUI_DISABLE)
$cmdSave = GUICtrlCreateButton("Save", 1170, 148, 92, 31, 0)
$cmdCancel = GUICtrlCreateButton("Cancel", 1170, 184, 92, 31, 0)
GUICtrlSetState(-1, $GUI_DISABLE)

GUICtrlSetState($KeyW, $GUI_FOCUS)

GUISetState(@SW_SHOW)

#cs
;Now trying to detect the index of highlighted item in the ListView
;From 'A Beginner’s Guide To Melba23’s GUIListViewEx UDF':
The UDF registers 4 messages automatically – if you already have message handlers in your script,
do not register them again using the UDF function (set the relevant parameter of _GUIListViewEx_MsgRegister to False)
but call the relevant UDF handler function (_GUIListViewEx_WM_NOTIFY_Handler) from within your existing handler.
;Here an example from Melba23:
https://www.autoitscript.com/forum/topic/182492-guilistviewex-new-version-27-may-16/?do=findComment&comment=1325933
#ce
GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
;Register for editing & dragging
;prevent the UDF from initially registering the WM_NOTIFY
_GUIListViewEx_MsgRegister(False)

Local $nMsg
While 1
      $nMsg = GUIGetMsg()
         Switch $nMsg
      Case $GUI_EVENT_CLOSE
         Shtdown()
         GUIDelete( $hGui )
         Exit
      Case $GUI_EVENT_MINIMIZE  ;; -4
         _GUI_ToTray()
      Case $KeyW
         OnFilt()
      Case $cmdNext
         cmdNext_Click()
      Case $cmdPrev
         cmdPrev_Click()
      Case $cmdFirst
         cmdFirst_Click()
      Case $cmdLast
         cmdLast_Click()
      Case $cmdAdd
         cmdAdd_Click()
      Case $cmdEdit
         cmdEdit_CLick()
      Case $cmdDelete
         cmdDelete_Click()
      Case $cmdSave
         cmdSave_Click()
      Case $cmdCancel
         cmdCancel_Click()
   EndSwitch

   _GUIListViewEx_EditOnClick($iEditMode)
WEnd

;From Zedna, in 'Highlighted item in the ListView?'
;https://www.autoitscript.com/forum/topic/96234-highlighted-item-in-the-listview/?do=findComment&comment=691927
Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)

    ;From Melba23: pass the same parameters to the UDF handler as you received in your WM_NOTIFY handler:
    _GUIListViewEx_WM_NOTIFY_Handler($hWnd, $iMsg, $wParam, $lParam)

    Local $tNMHDR = DllStructCreate($tagNMITEMACTIVATE, $lParam)
    Local $IDFrom = DllStructGetData($tNMHDR, 'IDFrom')
    Local $Index = DllStructGetData($tNMHDR, 'Index')
    Local $Code = DllStructGetData($tNMHDR, 'Code')

    Switch $IDFrom
        Case $cLV
            Switch $Code
                Case $LVN_ITEMCHANGED
                    Local $NMLISTVIEW = DllStructCreate($tagNMLISTVIEW, $lParam)
                    ; if state has changed
                    If BitAND(DllStructGetData($NMLISTVIEW, "Changed"), $LVIF_STATE) = $LVIF_STATE And _
                            DllStructGetData($NMLISTVIEW, "NewState") <> DllStructGetData($NMLISTVIEW, "OldState") Then
                        ; take care of only newly selected items (not deselected ones)
                        If BitAND(DllStructGetData($NMLISTVIEW, "NewState"), $LVIS_SELECTED) = $LVIS_SELECTED Then
                            ;Local $Item = _GUICtrlListView_GetItem($cLV, $Index)
                            ;ConsoleWrite("Index:" & @TAB & $Index & @CRLF & "Item:" & @TAB & $Item[3] & @CR)
                            GUICtrlSetData($txtFirstName, $aLV[$Index][0])
                            GUICtrlSetData($txtMidName, $aLV[$Index][1])
                            GUICtrlSetData($txtLastName, $aLV[$Index][2])
                            GUICtrlSetData($txtMobile, $aLV[$Index][3])
                            GUICtrlSetData($txtHomePhone, $aLV[$Index][4])
                            GUICtrlSetData($txtAddress, $aLV[$Index][5])
                            GUICtrlSetData($lblRecPos, $Index + 1 & " of " & $n_RecCount)
                            $n_RecPos = $Index
                        EndIf
                    EndIf
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Func OnFilt()
   $sAnswer = GUICtrlRead($KeyW)
   GUICtrlSetData($KeyW, "")
   If $sAnswer <> "" Then
     $w = " WHERE N LIKE '%" & $sAnswer & "%'"
     $sSQL = "SELECT * FROM " & $tblname & $w
     $rst.Open($sSQL, $cn, $iCursorType, $iLockType, $iOptions) ;Issue the SQL query
     #cs
     Global $aLV[100][6]
     Local $f = 0
     If Not $rst.EOF Then
     With $rst
      While Not .EOF ; repeat until End-Of-File (EOF) is reached
           $aLV[$f][0]=.Fields(0).Value
           $aLV[$f][1]=.Fields(1).Value
           $aLV[$f][2]=.Fields(2).Value
           $aLV[$f][3]=.Fields(3).Value
           $aLV[$f][4]=.Fields(4).Value
           $aLV[$f][5]=.Fields(5).Value
           .MoveNext ; Move To the Next record
           $f = $f + 1
       WEnd
      EndWith
     EndIf
     $rst.Close
     $n_RecCount = UBound($aLV)
     ReDim $aLV[$f][6]
     #ce
      If $rst.EOF = True Then
         $rst.Close
         Return -3
      EndIf
     Global $aLV = $rst.GetRows()
     $rst.Close
     $n_RecCount = UBound($aLV)

   Else
     $n_RecCount = 0

   EndIf

   If $n_RecCount = 0 Then
        cmdAdd_Click()
   Else
      ;reload the ListView with new data, first clear the current content
      _GUICtrlListView_DeleteAllItems($cLV)
      ;close it within the UDF
      _GUIListViewEx_Close(0)
      ;reload the ListView with the new data
      _GUICtrlListView_AddArray($cLV, $aLV)
      ;Initiate LVEx - using filling array
      $iLV = _GUIListViewEx_Init($cLV, $aLV, 0, 0, True, 4)
      ;Set all columns editable
      _GUIListViewEx_SetEditStatus($iLV, "*")
      KeysSetup(0)
      cmdFirst_Click()
   EndIf

EndFunc

Func ShowData()

   If $n_RecCount = 0 Then ; Blank Table
      GUICtrlSetData($lblRecPos, "")
      GUICtrlSetData($txtFirstName, "")
      GUICtrlSetData($txtMidName, "")
      GUICtrlSetData($txtLastName, "")
      GUICtrlSetData($txtMobile, "")
      GUICtrlSetData($txtHomePhone, "")
      GUICtrlSetData($txtAddress, "")
      Return
   EndIf

   GUICtrlSetData($lblRecPos, $n_RecPos + 1 & " of " & $n_RecCount)
   GUICtrlSetData($txtFirstName, $aLV[$n_RecPos][0])
   GUICtrlSetData($txtMidName, $aLV[$n_RecPos][1])
   GUICtrlSetData($txtLastName, $aLV[$n_RecPos][2])
   GUICtrlSetData($txtMobile, $aLV[$n_RecPos][3])
   GUICtrlSetData($txtHomePhone, $aLV[$n_RecPos][4])
   GUICtrlSetData($txtAddress, $aLV[$n_RecPos][5])
EndFunc

Func cmdAdd_Click()
  $n_RecCount = 0
  ShowData()
  KeysSetup(1)
  GUICtrlSetState($txtFirstName, $GUI_FOCUS)
EndFunc

Func cmdEdit_Click()
  $InStr = GUICtrlRead($txtFirstName)
  KeysSetup(1)
EndFunc

Func cmdCancel_Click()
   If $n_RecCount = 0 Then ; Blank Table
    Return
   EndIf

   ShowData()
   KeysSetup(0)
   GUICtrlSetState($KeyW, $GUI_FOCUS)
EndFunc

Func cmdSave_Click()
  If $InStr <> "" Then
    $sSQL = "DELETE FROM Tel WHERE N = '" & $InStr & "'"
    $rst.Open($sSQL, $cn, $iCursorType, $iLockType, $iOptions)
  EndIf

  $sSQL = "INSERT INTO Tel (N, T1, T2, T3, T4, D) VALUES ('" & GUICtrlRead($txtFirstName) & "', '" & GUICtrlRead($txtMidName) & "', '" & GUICtrlRead($txtLastName) & "', '" & GUICtrlRead($txtMobile) & "', '" & GUICtrlRead($txtHomePhone) & "', '" & GUICtrlRead($txtAddress) & "')"
  $rst.Open($sSQL, $cn, $iCursorType, $iLockType)
  KeysSetup(0)
  GUICtrlSetState($KeyW, $GUI_FOCUS)
EndFunc

Func cmdDelete_Click()
 If 6 = MsgBox(32 + 4, "Delete", "Are you sure delete the current record Permanently?") Then
   $sSQL = "DELETE FROM Tel WHERE N = '" & GUICtrlRead($txtFirstName) & "'"
   $rst.Open($sSQL, $cn, $iCursorType, $iLockType)
   $n_RecCount = 0
   ShowData()
   KeysSetup(1)
  EndIf
  GUICtrlSetState($KeyW, $GUI_FOCUS)
EndFunc

Func cmdNext_Click()
  $n_RecPos = $n_RecPos + 1
  If $n_RecPos = $n_RecCount Then $n_RecPos = $n_RecCount - 1
  If $n_RecPos < 0 Then $n_RecPos = 0

  ShowData()
  GUICtrlSetState($KeyW, $GUI_FOCUS)
EndFunc

Func cmdPrev_Click()
  $n_RecPos = $n_RecPos - 1
  If $n_RecPos < 0 Then $n_RecPos = 0

  ShowData()
  GUICtrlSetState($KeyW, $GUI_FOCUS)
EndFunc

Func cmdFirst_Click()
  $n_RecPos = 0
  ShowData()
EndFunc

Func cmdLast_Click()
  $n_RecPos = $n_RecCount -1
  ShowData()
  GUICtrlSetState($KeyW, $GUI_FOCUS)
EndFunc

Func Shtdown() ; Close conexion
  $rst = 0 ; Release the recordset object
  $cn = 0 ; Release the connection object
EndFunc

Func _GUI_ToTray()
    GUISetState(@SW_HIDE, $hGui)
    TraySetOnEvent($TRAY_EVENT_PRIMARYUP, "_GUI_Restore")
    TraySetOnEvent($TRAY_EVENT_SECONDARYUP, "_Quit")
    TrayTip($sTitle, "Left click to restore" & @CRLF & "Right click to Exit", 5, 1)
    TraySetToolTip($sTitle & @CRLF & @CRLF & "Left click to restore" & @CRLF & "Right click to Exit")
    TraySetToolTip("")
    Opt("TrayIconHide", 0)
    Return $hGui
EndFunc   ;==>_GUI_ToTray

Func _GUI_Restore()
    GUISetState(@SW_SHOW, $hGui)
    WinActivate($hGui)
    TraySetState(2)
    Opt("TrayIconHide", 1)
 EndFunc   ;==>_GUI_Restore

Func _Quit()
    Shtdown()
    Exit
 EndFunc   ;==>_Quit

Func KeysSetup($lngMode)
    Local $nState1, $nState2
    Local $n_State, $n_Color, $n_Cursor

    If $lngMode = 1 Then ; Blank Table
        $nState1 = $GUI_ENABLE
        $nState2 = $GUI_DISABLE
        $n_State = Not $ES_READONLY
        $n_Color = 0x000000
        $n_Cursor = 5
    Else
        $nState1 = $GUI_DISABLE
        $nState2 = $GUI_ENABLE
        $n_State = $ES_READONLY
        $n_Color = 0x0000ff
        $n_Cursor = 2
    EndIf

    GUICtrlSetState($cmdSave, $nState1)
    GUICtrlSetState($cmdAdd, $nState2)
    GUICtrlSetState($cmdEdit, $nState2)
    GUICtrlSetState($cmdCancel, $nState1)
    GUICtrlSetState($cmdDelete, $nState2)

    GUICtrlSetState($cmdNext, $nState2)
    GUICtrlSetState($cmdPrev, $nState2)
    GUICtrlSetState($cmdFirst, $nState2)
    GUICtrlSetState($cmdLast, $nState2)

    ; Screen Fields
    GUICtrlSetStyle($txtFirstName, $n_State)
    GUICtrlSetStyle($txtMidName, $n_State)
    GUICtrlSetStyle($txtLastName, $n_State)
    GUICtrlSetStyle($txtMobile, $n_State)
    GUICtrlSetStyle($txtHomePhone, $n_State)
    GUICtrlSetStyle($txtAddress, $n_State)

    GUICtrlSetColor($txtFirstName, $n_Color)
    GUICtrlSetColor($txtMidName, $n_Color)
    GUICtrlSetColor($txtLastName, $n_Color)
    GUICtrlSetColor($txtMobile, $n_Color)
    GUICtrlSetColor($txtHomePhone, $n_Color)
    GUICtrlSetColor($txtAddress, $n_Color)

    GUICtrlSetColor($txtFirstName, $n_Color)
    GUICtrlSetColor($txtMidName, $n_Color)
    GUICtrlSetColor($txtLastName, $n_Color)
    GUICtrlSetColor($txtMobile, $n_Color)
    GUICtrlSetColor($txtHomePhone, $n_Color)
    GUICtrlSetColor($txtAddress, $n_Color)

    GUICtrlSetCursor($txtFirstName, $n_Cursor)
    GUICtrlSetCursor($txtMidName, $n_Cursor)
    GUICtrlSetCursor($txtLastName, $n_Cursor)
    GUICtrlSetCursor($txtMobile, $n_Cursor)
    GUICtrlSetCursor($txtHomePhone, $n_Cursor)
    GUICtrlSetCursor($txtAddress, $n_Cursor)

EndFunc

Func WM_COMMAND($hWnd, $msg, $wParam, $lParam)
    Local $nNotifyCode = BitShift($wParam, 16) ; high word
    Local $nID = BitAND($wParam, 0xFFFF) ; low word
    Local $hCtrl = $lParam
    Switch $nID
        Case $idExit
            Shtdown()
            Exit
        Case $idFavorites
            Msgbox(0, "", "This is only an example")
        Case $idCustomFavs1
            Msgbox(0, "", "This would be same action")
        Case $idCustomFavs2
            Msgbox(0, "", "Last example")
    EndSwitch
    Return $GUI_RUNDEFMSG
 EndFunc   ;==>WM_COMMAND

Func _ErrADODB()
   Msgbox(0,"ADODB COM Error","We intercepted a COM Error !"      & @CRLF  & @CRLF & _
       "err.description is: "    & @TAB & $errADODB.description    & @CRLF & _
       "err.windescription:"     & @TAB & $errADODB.windescription & @CRLF & _
       "err.number is: "         & @TAB & hex($errADODB.number,8)  & @CRLF & _
       "err.lastdllerror is: "   & @TAB & $errADODB.lastdllerror   & @CRLF & _
       "err.scriptline is: "     & @TAB & $errADODB.scriptline     & @CRLF & _
       "err.source is: "         & @TAB & $errADODB.source         & @CRLF & _
       "err.helpfile is: "       & @TAB & $errADODB.helpfile       & @CRLF & _
       "err.helpcontext is: "    & @TAB & $errADODB.helpcontext _
      )
   Local $err = $errADODB.number
   If $err = 0 Then $err = -1
EndFunc

This is the access database to reproduce the example:

db.mdb

Edited by robertocm
Link to comment
Share on other sites

  • Moderators

robertocm,

After a quick glance at your script I can see why you might have those 2 problems.

1. You never call the _GUIListViewEx_MsgRegister function to allow the UDF to access the user events required for most of its functions. You need to add a line calling that function just before your idle loop.

2. The default delimiter for ListView columns in AutoIt is the "|" character - so having that character within one of the elements means that the UDF believes that there are more columns than there should be and so fires an error. I suggest operating on the database return value to replace any "|" characters with another before loading the data into the ListView - then when you try to read it the UDF will not get confused. An alternative might be to use Opt("GUIDataSeparatorChar", "New_Char") to set the default delimiter to another character, but I would recommend trying to amend your own data first as it is less problematic for the rest of AutoIt.

Try those 2 fixes and see if the script works correctly. if you still have problems, please supply some sample data as passed to the UDF as I do not have Access as so cannot run the code as it stands.

M23

 

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png 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 columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Link to comment
Share on other sites

21 hours ago, Melba23 said:

Try those 2 fixes and see if the script works correctly. ...

Dear Melba23,

Many Thanks,

I have updated the code of the example, and regarding the pipe character, i'll just try to avoid using it.

There's another issue:

  • When the listview is created it can be edited with BackSpace hotkey, but reloading the data (following the steps of your Beginner's Guide) seems to cause the BackSpace stops working for editing.

Tested with this code:

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

#include "GUIListViewEx.au3"

$hGUI = GUICreate("", 500, 340)
$cReLoad = GUICtrlCreateButton("Reload ListView", 150, 300, 150, 30)
$cExit = GUICtrlCreateButton("Exit", 350, 300, 110, 30)

; Create ListView
$cLV = GUICtrlCreateListView("Zero Column|One Column|Two Column|Three Column", 10, 30, 480, 260, BitOR($LVS_SINGLESEL, $LVS_SHOWSELALWAYS))

For $i = 0 To 3
    _GUICtrlListView_SetColumnWidth($cLV, $i, 100)
Next

;Add data
For $i = 0 To 5
    GUICtrlCreateListViewItem("Item 0-" & $i & "|SubItem 1-" & $i & "|SubItem 2-" & $i & "|SubItem 3-" & $i, $cLV)
Next
;Read the current ListView content
$aLV = _GUIListViewEx_ReadToArray($cLV)
; Inititate the ListView using that content
$iLV = _GUIListViewEx_Init($cLV, $aLV)
;Set all column editable
_GUIListViewEx_SetEditStatus($iLV, "*")

;Register for editing & dragging
_GUIListViewEx_MsgRegister()

GUISetState()

While 1

    $iMsg = GUIGetMsg()
    Switch $iMsg
        Case $GUI_EVENT_CLOSE, $cExit
            Exit
        Case $cReLoad
            Reload_ListView()
    EndSwitch

    ; Allow edit on double click
    $aRet = _GUIListViewEx_EditOnClick()
 WEnd

Func Reload_ListView()
   ;first clear the current content
   _GUICtrlListView_DeleteAllItems($cLV)
   ;close it within the UDF
   _GUIListViewEx_Close(0)
   ;reload the ListView with the same data
   _GUICtrlListView_AddArray($cLV, $aLV)
   ;Initiate LVEx - using same filling array
   _GUIListViewEx_Init($cLV, $aLV)
   ;Set all columns editable
   _GUIListViewEx_SetEditStatus($iLV, "*")
EndFunc
Link to comment
Share on other sites

  • Melba23 changed the title to GUIListViewEx - BugFix Version 6 Apr 24

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
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...