Jump to content

Incremental search in owner and custom drawn ListViews


LarsJ
 Share

Recommended Posts

Awesome.

Can you also make example how to automatically Hide/Show ListView Items with relation to this search string ?

EDIT:
oops i see

 2) Show matching rows only.au3

+5

:)

 

Edited by mLipok

Signature beginning:
* Please remember: "AutoIt"..... *  Wondering who uses AutoIt and what it can be used for ? * Forum Rules *
* ADO.au3 UDF * POP3.au3 UDF * XML.au3 UDF * IE on Windows 11 * How to ask ChatGPT for AutoIt Code * for other useful stuff click the following button:

Spoiler

Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind. 

My contribution (my own projects): * Debenu Quick PDF Library - UDF * Debenu PDF Viewer SDK - UDF * Acrobat Reader - ActiveX Viewer * UDF for PDFCreator v1.x.x * XZip - UDF * AppCompatFlags UDF * CrowdinAPI UDF * _WinMergeCompare2Files() * _JavaExceptionAdd() * _IsBeta() * Writing DPI Awareness App - workaround * _AutoIt_RequiredVersion() * Chilkatsoft.au3 UDF * TeamViewer.au3 UDF * JavaManagement UDF * VIES over SOAP * WinSCP UDF * GHAPI UDF - modest begining - comunication with GitHub REST API * ErrorLog.au3 UDF - A logging Library * Include Dependency Tree (Tool for analyzing script relations) * Show_Macro_Values.au3 *

 

My contribution to others projects or UDF based on  others projects: * _sql.au3 UDF  * POP3.au3 UDF *  RTF Printer - UDF * XML.au3 UDF * ADO.au3 UDF * SMTP Mailer UDF * Dual Monitor resolution detection * * 2GUI on Dual Monitor System * _SciLexer.au3 UDF * SciTE - Lexer for console pane * 

Useful links: * Forum Rules * Forum etiquette *  Forum Information and FAQs * How to post code on the forum * AutoIt Online Documentation * AutoIt Online Beta Documentation * SciTE4AutoIt3 getting started * Convert text blocks to AutoIt code * Games made in Autoit * Programming related sites * Polish AutoIt Tutorial * DllCall Code Generator * 

Wiki: * Expand your knowledge - AutoIt Wiki * Collection of User Defined Functions * How to use HelpFile * Good coding practices in AutoIt * 

OpenOffice/LibreOffice/XLS Related: WriterDemo.au3 * XLS/MDB from scratch with ADOX

IE Related:  * How to use IE.au3  UDF with  AutoIt v3.3.14.x * Why isn't Autoit able to click a Javascript Dialog? * Clicking javascript button with no ID * IE document >> save as MHT file * IETab Switcher (by LarsJ ) * HTML Entities * _IEquerySelectorAll() (by uncommon) * IE in TaskScheduler * IE Embedded Control Versioning (use IE9+ and HTML5 in a GUI) * PDF Related: * How to get reference to PDF object embeded in IE * IE on Windows 11 * 

I encourage you to read: * Global Vars * Best Coding Practices * Please explain code used in Help file for several File functions * OOP-like approach in AutoIt * UDF-Spec Questions *  EXAMPLE: How To Catch ConsoleWrite() output to a file or to CMD *

I also encourage you to check awesome @trancexx code:  * Create COM objects from modules without any demand on user to register anything. * Another COM object registering stuff * OnHungApp handler * Avoid "AutoIt Error" message box in unknown errors  * HTML editor * 

winhttp.au3 related : * https://www.autoitscript.com/forum/topic/206771-winhttpau3-download-problem-youre-speaking-plain-http-to-an-ssl-enabled-server-port/

"Homo sum; humani nil a me alienum puto" - Publius Terentius Afer
"Program are meant to be read by humans and only incidentally for computers and execute" - Donald Knuth, "The Art of Computer Programming"
:naughty:  :ranting:, be  :) and       \\//_.

Anticipating Errors :  "Any program that accepts data from a user must include code to validate that data before sending it to the data store. You cannot rely on the data store, ...., or even your programming language to notify you of problems. You must check every byte entered by your users, making sure that data is the correct type for its field and that required fields are not empty."

Signature last update: 2023-04-24

Link to comment
Share on other sites

Third example 3) Standard Find text dialog.au3  showing errors:

>Running AU3Check (3.3.14.2)  from:C:\Program Files (x86)\AutoIt3  input:C:\Users\user\Downloads\ListviewIncrSearch\3) Standard Find text dialog.au3
"C:\Users\user\Downloads\ListviewIncrSearch\WinAPIDlgEx.au3"(10,43) : warning: $__pFRBuffer: possibly used before declaration.
    $__pFRBuffer = __HeapReAlloc($__pFRBuffer,
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
"C:\Users\user\Downloads\ListviewIncrSearch\WinAPIDlgEx.au3"(10,65) : warning: $__iFRBufferSize: possibly used before declaration.
    $__pFRBuffer = __HeapReAlloc($__pFRBuffer, 2 * $__iFRBufferSize)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
"C:\Users\user\Downloads\ListviewIncrSearch\WinAPIDlgEx.au3"(10,65) : error: $__iFRBufferSize: undeclared global variable.
    $__pFRBuffer = __HeapReAlloc($__pFRBuffer, 2 * $__iFRBufferSize)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
C:\Users\user\Downloads\ListviewIncrSearch\3) Standard Find text dialog.au3 - 1 error(s), 2 warning(s)

 

Signature beginning:
* Please remember: "AutoIt"..... *  Wondering who uses AutoIt and what it can be used for ? * Forum Rules *
* ADO.au3 UDF * POP3.au3 UDF * XML.au3 UDF * IE on Windows 11 * How to ask ChatGPT for AutoIt Code * for other useful stuff click the following button:

Spoiler

Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind. 

My contribution (my own projects): * Debenu Quick PDF Library - UDF * Debenu PDF Viewer SDK - UDF * Acrobat Reader - ActiveX Viewer * UDF for PDFCreator v1.x.x * XZip - UDF * AppCompatFlags UDF * CrowdinAPI UDF * _WinMergeCompare2Files() * _JavaExceptionAdd() * _IsBeta() * Writing DPI Awareness App - workaround * _AutoIt_RequiredVersion() * Chilkatsoft.au3 UDF * TeamViewer.au3 UDF * JavaManagement UDF * VIES over SOAP * WinSCP UDF * GHAPI UDF - modest begining - comunication with GitHub REST API * ErrorLog.au3 UDF - A logging Library * Include Dependency Tree (Tool for analyzing script relations) * Show_Macro_Values.au3 *

 

My contribution to others projects or UDF based on  others projects: * _sql.au3 UDF  * POP3.au3 UDF *  RTF Printer - UDF * XML.au3 UDF * ADO.au3 UDF * SMTP Mailer UDF * Dual Monitor resolution detection * * 2GUI on Dual Monitor System * _SciLexer.au3 UDF * SciTE - Lexer for console pane * 

Useful links: * Forum Rules * Forum etiquette *  Forum Information and FAQs * How to post code on the forum * AutoIt Online Documentation * AutoIt Online Beta Documentation * SciTE4AutoIt3 getting started * Convert text blocks to AutoIt code * Games made in Autoit * Programming related sites * Polish AutoIt Tutorial * DllCall Code Generator * 

Wiki: * Expand your knowledge - AutoIt Wiki * Collection of User Defined Functions * How to use HelpFile * Good coding practices in AutoIt * 

OpenOffice/LibreOffice/XLS Related: WriterDemo.au3 * XLS/MDB from scratch with ADOX

IE Related:  * How to use IE.au3  UDF with  AutoIt v3.3.14.x * Why isn't Autoit able to click a Javascript Dialog? * Clicking javascript button with no ID * IE document >> save as MHT file * IETab Switcher (by LarsJ ) * HTML Entities * _IEquerySelectorAll() (by uncommon) * IE in TaskScheduler * IE Embedded Control Versioning (use IE9+ and HTML5 in a GUI) * PDF Related: * How to get reference to PDF object embeded in IE * IE on Windows 11 * 

I encourage you to read: * Global Vars * Best Coding Practices * Please explain code used in Help file for several File functions * OOP-like approach in AutoIt * UDF-Spec Questions *  EXAMPLE: How To Catch ConsoleWrite() output to a file or to CMD *

I also encourage you to check awesome @trancexx code:  * Create COM objects from modules without any demand on user to register anything. * Another COM object registering stuff * OnHungApp handler * Avoid "AutoIt Error" message box in unknown errors  * HTML editor * 

winhttp.au3 related : * https://www.autoitscript.com/forum/topic/206771-winhttpau3-download-problem-youre-speaking-plain-http-to-an-ssl-enabled-server-port/

"Homo sum; humani nil a me alienum puto" - Publius Terentius Afer
"Program are meant to be read by humans and only incidentally for computers and execute" - Donald Knuth, "The Art of Computer Programming"
:naughty:  :ranting:, be  :) and       \\//_.

Anticipating Errors :  "Any program that accepts data from a user must include code to validate that data before sending it to the data store. You cannot rely on the data store, ...., or even your programming language to notify you of problems. You must check every byte entered by your users, making sure that data is the correct type for its field and that required fields are not empty."

Signature last update: 2023-04-24

Link to comment
Share on other sites

Oops, sorry, I'm still on 3.3.10. It must be the cause of the errors. I will take the opportunity to upgrade. And fix the errors. But I do not have time until tomorrow.

Link to comment
Share on other sites

No hurry up.
Thanks for the effort.

mLipok

Signature beginning:
* Please remember: "AutoIt"..... *  Wondering who uses AutoIt and what it can be used for ? * Forum Rules *
* ADO.au3 UDF * POP3.au3 UDF * XML.au3 UDF * IE on Windows 11 * How to ask ChatGPT for AutoIt Code * for other useful stuff click the following button:

Spoiler

Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind. 

My contribution (my own projects): * Debenu Quick PDF Library - UDF * Debenu PDF Viewer SDK - UDF * Acrobat Reader - ActiveX Viewer * UDF for PDFCreator v1.x.x * XZip - UDF * AppCompatFlags UDF * CrowdinAPI UDF * _WinMergeCompare2Files() * _JavaExceptionAdd() * _IsBeta() * Writing DPI Awareness App - workaround * _AutoIt_RequiredVersion() * Chilkatsoft.au3 UDF * TeamViewer.au3 UDF * JavaManagement UDF * VIES over SOAP * WinSCP UDF * GHAPI UDF - modest begining - comunication with GitHub REST API * ErrorLog.au3 UDF - A logging Library * Include Dependency Tree (Tool for analyzing script relations) * Show_Macro_Values.au3 *

 

My contribution to others projects or UDF based on  others projects: * _sql.au3 UDF  * POP3.au3 UDF *  RTF Printer - UDF * XML.au3 UDF * ADO.au3 UDF * SMTP Mailer UDF * Dual Monitor resolution detection * * 2GUI on Dual Monitor System * _SciLexer.au3 UDF * SciTE - Lexer for console pane * 

Useful links: * Forum Rules * Forum etiquette *  Forum Information and FAQs * How to post code on the forum * AutoIt Online Documentation * AutoIt Online Beta Documentation * SciTE4AutoIt3 getting started * Convert text blocks to AutoIt code * Games made in Autoit * Programming related sites * Polish AutoIt Tutorial * DllCall Code Generator * 

Wiki: * Expand your knowledge - AutoIt Wiki * Collection of User Defined Functions * How to use HelpFile * Good coding practices in AutoIt * 

OpenOffice/LibreOffice/XLS Related: WriterDemo.au3 * XLS/MDB from scratch with ADOX

IE Related:  * How to use IE.au3  UDF with  AutoIt v3.3.14.x * Why isn't Autoit able to click a Javascript Dialog? * Clicking javascript button with no ID * IE document >> save as MHT file * IETab Switcher (by LarsJ ) * HTML Entities * _IEquerySelectorAll() (by uncommon) * IE in TaskScheduler * IE Embedded Control Versioning (use IE9+ and HTML5 in a GUI) * PDF Related: * How to get reference to PDF object embeded in IE * IE on Windows 11 * 

I encourage you to read: * Global Vars * Best Coding Practices * Please explain code used in Help file for several File functions * OOP-like approach in AutoIt * UDF-Spec Questions *  EXAMPLE: How To Catch ConsoleWrite() output to a file or to CMD *

I also encourage you to check awesome @trancexx code:  * Create COM objects from modules without any demand on user to register anything. * Another COM object registering stuff * OnHungApp handler * Avoid "AutoIt Error" message box in unknown errors  * HTML editor * 

winhttp.au3 related : * https://www.autoitscript.com/forum/topic/206771-winhttpau3-download-problem-youre-speaking-plain-http-to-an-ssl-enabled-server-port/

"Homo sum; humani nil a me alienum puto" - Publius Terentius Afer
"Program are meant to be read by humans and only incidentally for computers and execute" - Donald Knuth, "The Art of Computer Programming"
:naughty:  :ranting:, be  :) and       \\//_.

Anticipating Errors :  "Any program that accepts data from a user must include code to validate that data before sending it to the data store. You cannot rely on the data store, ...., or even your programming language to notify you of problems. You must check every byte entered by your users, making sure that data is the correct type for its field and that required fields are not empty."

Signature last update: 2023-04-24

Link to comment
Share on other sites

Error in example 3 is addressed. New zip in the first post.

Link to comment
Share on other sites

Well written code :)

Signature beginning:
* Please remember: "AutoIt"..... *  Wondering who uses AutoIt and what it can be used for ? * Forum Rules *
* ADO.au3 UDF * POP3.au3 UDF * XML.au3 UDF * IE on Windows 11 * How to ask ChatGPT for AutoIt Code * for other useful stuff click the following button:

Spoiler

Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind. 

My contribution (my own projects): * Debenu Quick PDF Library - UDF * Debenu PDF Viewer SDK - UDF * Acrobat Reader - ActiveX Viewer * UDF for PDFCreator v1.x.x * XZip - UDF * AppCompatFlags UDF * CrowdinAPI UDF * _WinMergeCompare2Files() * _JavaExceptionAdd() * _IsBeta() * Writing DPI Awareness App - workaround * _AutoIt_RequiredVersion() * Chilkatsoft.au3 UDF * TeamViewer.au3 UDF * JavaManagement UDF * VIES over SOAP * WinSCP UDF * GHAPI UDF - modest begining - comunication with GitHub REST API * ErrorLog.au3 UDF - A logging Library * Include Dependency Tree (Tool for analyzing script relations) * Show_Macro_Values.au3 *

 

My contribution to others projects or UDF based on  others projects: * _sql.au3 UDF  * POP3.au3 UDF *  RTF Printer - UDF * XML.au3 UDF * ADO.au3 UDF * SMTP Mailer UDF * Dual Monitor resolution detection * * 2GUI on Dual Monitor System * _SciLexer.au3 UDF * SciTE - Lexer for console pane * 

Useful links: * Forum Rules * Forum etiquette *  Forum Information and FAQs * How to post code on the forum * AutoIt Online Documentation * AutoIt Online Beta Documentation * SciTE4AutoIt3 getting started * Convert text blocks to AutoIt code * Games made in Autoit * Programming related sites * Polish AutoIt Tutorial * DllCall Code Generator * 

Wiki: * Expand your knowledge - AutoIt Wiki * Collection of User Defined Functions * How to use HelpFile * Good coding practices in AutoIt * 

OpenOffice/LibreOffice/XLS Related: WriterDemo.au3 * XLS/MDB from scratch with ADOX

IE Related:  * How to use IE.au3  UDF with  AutoIt v3.3.14.x * Why isn't Autoit able to click a Javascript Dialog? * Clicking javascript button with no ID * IE document >> save as MHT file * IETab Switcher (by LarsJ ) * HTML Entities * _IEquerySelectorAll() (by uncommon) * IE in TaskScheduler * IE Embedded Control Versioning (use IE9+ and HTML5 in a GUI) * PDF Related: * How to get reference to PDF object embeded in IE * IE on Windows 11 * 

I encourage you to read: * Global Vars * Best Coding Practices * Please explain code used in Help file for several File functions * OOP-like approach in AutoIt * UDF-Spec Questions *  EXAMPLE: How To Catch ConsoleWrite() output to a file or to CMD *

I also encourage you to check awesome @trancexx code:  * Create COM objects from modules without any demand on user to register anything. * Another COM object registering stuff * OnHungApp handler * Avoid "AutoIt Error" message box in unknown errors  * HTML editor * 

winhttp.au3 related : * https://www.autoitscript.com/forum/topic/206771-winhttpau3-download-problem-youre-speaking-plain-http-to-an-ssl-enabled-server-port/

"Homo sum; humani nil a me alienum puto" - Publius Terentius Afer
"Program are meant to be read by humans and only incidentally for computers and execute" - Donald Knuth, "The Art of Computer Programming"
:naughty:  :ranting:, be  :) and       \\//_.

Anticipating Errors :  "Any program that accepts data from a user must include code to validate that data before sending it to the data store. You cannot rely on the data store, ...., or even your programming language to notify you of problems. You must check every byte entered by your users, making sure that data is the correct type for its field and that required fields are not empty."

Signature last update: 2023-04-24

Link to comment
Share on other sites

  • 3 weeks later...
  • 1 month later...

You are welcome.

Thank you for feedback. Always nice.

I would have preferred to implement it in a custom drawn listview. But there was a lot of flicker. I've made a note about that. I'll look into it. And it would have been easier with some kind of UDF. I'm working on that.

Link to comment
Share on other sites

  • 3 years later...

Hello.
Sorry to bring up the old topic.
I liked the example "
2) Show matching rows only.au3 ".
Added in "#include <WinAPI.au3>" for function "_WinAPI_SetWindowsHookEx".
Everything seemed to work, but when I try to write in a search with
something in big letters (where caps look is on ) with unchecked "Use regular expression..." ,

the program crashes with an error.
Can somebody help me?
Thank.

Link to comment
Share on other sites

Replace

If StringInStr( $aItems[$i], $sSearch ) Then ; Normal search

with

If StringInStr( $aItems[$i], $sSearch, $STR_CASESENSE ) Then ; Normal search

It should be done in all three examples.

 

The Hook functions were moved to WinAPISys.au3 last year.

Link to comment
Share on other sites

Thanks for the answer.
I need to use non-sensitive mode. I added

$STR_NOCASESENSEBASIC


Also I change some array fill letters to upper case.

The script crashes when I type the missing small letter. 😦

Edited by Lion66
edit
Link to comment
Share on other sites

  • 2 months later...

Hello all!

First of all thanks LarsJ for awesome examples! It's really cool!

On the russian forum, I found a slightly modified (by Lion66) one of your examples. But, unfortunately, it seems it's a dead topic.
In the modified code several columns were added, but the search still on the first '0' column.
I tried to do a more advanced search with column select to search. In attached zip file you can find the code with and without marking!

Only without marking works 😜

And now my problem:
I tried to do the same with search and marking example code and it does't work. Crashes with an error and I have no idea how to fix it.

Anybody can help me with this? 😕

ListView Incremental Search Modified .zip

Edited by RAMzor
Link to comment
Share on other sites

Under what circumstances does the code fail? Windows version, 32/64 bit code, etc. What is the error when the code crashes?

I briefly tested "Search Example 2 - With Column Select And Marking.au3" under Windows 7 both 32 and 64 bit. It works fine with yellow background marking of the search text and without crashing.

Link to comment
Share on other sites

Here is an example of search in several columns:

#AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7

#AutoIt3Wrapper_UseX64=y

Opt( "MustDeclareVars", 1 )

#include <WindowsConstants.au3>
#include <GUIConstants.au3>
#include <Array.au3>
#include "DrawItem.au3"
#include "GuiListViewEx.au3"

Global Const $tagMSG = "hwnd hwnd;uint message;wparam wParam;lparam lParam;dword time;int X;int Y"

Global $hGui, $idListView, $hListView, $fListViewHasFocus = 0, $iItems = 1000, $iCols = 4, $iCol = 0, $aItems[$iItems][$iCols]
Global $idSearch, $hSearch, $idSearchAction, $aSearch[$iItems], $iSearch = 0, $sSearch = ""

Example()


Func Example()
  ; Create GUI
  $hGui = GUICreate( "Show matching rows only - multiple columns", 1060, 330 )

  ; Create search group
  GUICtrlCreateGroup( "Search", 10, 5, 1060-20, 120 )

  ; Create Checkbox
  Local $idRegExp = GUICtrlCreateCheckbox( "Use regular expression as search string", 20, 25, 260, 20 )
  GUICtrlSetState( $idRegExp, $GUI_CHECKED )

  ; Create Edit control
  $idSearch = GUICtrlCreateEdit( "", 20, 55, 200, 20, $GUI_SS_DEFAULT_EDIT-$ES_AUTOVSCROLL-$WS_HSCROLL-$WS_VSCROLL )
  GUICtrlSetData( $idSearch, "Enter search string - possibly as reg. exp." )
  $hSearch = GUICtrlGetHandle( $idSearch )
  $idSearchAction = GUICtrlCreateDummy()

  ; Create read only Edit control for number of matches
  Local $idCount = GUICtrlCreateEdit( "0", 230, 55, 50, 20, $GUI_SS_DEFAULT_EDIT+$ES_READONLY+$ES_RIGHT-$WS_HSCROLL-$WS_VSCROLL )
  GUICtrlSetBkColor( $idCount, 0xFFFFFF )

  ; Create Buttons
  Local $idNext = GUICtrlCreateButton( "Next match",  20, 85, 125, 25 )
  Local $idPrev = GUICtrlCreateButton( "Prev match", 155, 85, 125, 25 )
  GUICtrlSetState( $idNext, $GUI_DISABLE )
  GUICtrlSetState( $idPrev, $GUI_DISABLE )

  ; Search column
  Local $idComboBox = GUICtrlCreateCombo( "Search column 0", 350, 25, 200, 20 )
  GUICtrlSetData( $idComboBox, "Search column 1|Search column 2|Search column 3" )

  ; Close group
  GUICtrlCreateGroup( "", -99, -99, 1, 1 )

  ; Create ListView
  $idListView = GUICtrlCreateListView( "", 10, 140, 1060-20, 180, $GUI_SS_DEFAULT_LISTVIEW+$LVS_OWNERDATA+$LVS_OWNERDRAWFIXED, $WS_EX_CLIENTEDGE+$LVS_EX_DOUBLEBUFFER )
  $hListView = GUICtrlGetHandle( $idListView )                                          ; Virtual        Owner drawn                            Reduces flicker
  _GUICtrlListView_AddColumn( $hListView, "Column 0",  250 )
  _GUICtrlListView_AddColumn( $hListView, "Column 1",  250 )
  _GUICtrlListView_AddColumn( $hListView, "Column 2",  250 )
  _GUICtrlListView_AddColumn( $hListView, "Column 3",  250 )

  ; Fill array
  FillArray( $aItems )
  _ArraySort( $aItems, 0, 0, 0, $iCol ) ; $iCol is the search column

  ; Set search array to display all items
  For $i = 0 To $iItems - 1
    $aSearch[$i] = $i
  Next
  $iSearch = $iItems

  ; Initialize ListView
  GUICtrlSendMsg( $idListView, $LVM_SETITEMCOUNT, $iSearch, 0 )

  ; Adjust height of GUI and ListView to fit 15 rows
  Local $iLvHeight = _GUICtrlListView_GetHeightToFitRows( $hListView, 15 )
  WinMove( $hGui, "", Default, Default, Default, WinGetPos( $hGui )[3] - WinGetClientSize( $hGui )[1] + $iLvHeight + 150 )
  WinMove( $hListView, "", Default, Default, Default, $iLvHeight )

  ; Register WM_ACTIVATE message handler
  ; To check when GUI receives/loses focus
  GUIRegisterMsg( $WM_ACTIVATE, "WM_ACTIVATE" )

  ; Register WM_COMMAND message handler
  ; To read search string from Edit control while it's typed in
  GUIRegisterMsg( $WM_COMMAND, "WM_COMMAND" )

  ; Register WM_DRAWITEM message handler
  ; To display items in an owner drawn ListView
  GUIRegisterMsg( $WM_DRAWITEM, "WM_DRAWITEM" )

  ; Register message handler to test ListView focus
  Local $hMessageHandler = DllCallbackRegister( "MessageHandler", "long", "int;wparam;lparam" )
  Local $hMessageHook = _WinAPI_SetWindowsHookEx( $WH_MSGFILTER, DllCallbackGetPtr( $hMessageHandler ), 0, _WinAPI_GetCurrentThreadId() )

  ; Show GUI
  GUISetState( @SW_SHOW )

  ; Message loop
  While 1
    Switch GUIGetMsg()
      Case $idSearchAction, $idRegExp
        $sSearch = GUICtrlRead( $idSearch )
        If $sSearch = "" Then
          ; Empty search string, display all items
          For $i = 0 To $iItems - 1
            $aSearch[$i] = $i
          Next
          $iSearch = $iItems
          GUICtrlSetData( $idCount, 0 )
        Else
          ; Find rows matching search string
          $iSearch = 0
          If GUICtrlRead( $idRegExp ) = $GUI_CHECKED Then
            For $i = 0 To $iItems - 1
              If StringRegExp( $aItems[$i][$iCol], $sSearch ) Then ; Reg. exp. search
                $aSearch[$iSearch] = $i
                $iSearch += 1
              EndIf
            Next
          Else
            For $i = 0 To $iItems - 1
              If StringInStr( $aItems[$i][$iCol], $sSearch ) Then ; Normal search
                $aSearch[$iSearch] = $i
                $iSearch += 1
              EndIf
            Next
          EndIf
          GUICtrlSetData( $idCount, $iSearch )
        EndIf
        GUICtrlSendMsg( $idListView, $LVM_SETITEMCOUNT, $iSearch, 0 )

      Case $idComboBox
        ; New search column
        $iCol = Int( StringRight( GUICtrlRead( $idComboBox ), 1 ) )
        _ArraySort( $aItems, 0, 0, 0, $iCol )
        GUICtrlSetData( $idSearch, "" )
        GUICtrlSendToDummy( $idSearchAction )

      Case $GUI_EVENT_CLOSE
        ExitLoop
    EndSwitch
  WEnd

  ; Cleanup
  _WinAPI_UnhookWindowsHookEx( $hMessageHook )
  GUIDelete()
EndFunc

; Check when GUI receives/loses focus
Func WM_ACTIVATE( $hWnd, $iMsg, $wParam, $lParam )
  #forceref $iMsg, $lParam
  If $hWnd = $hGui Then _
    $fListViewHasFocus += BitAND( $wParam, 0xFFFF ) ? 1 : -1
  Return $GUI_RUNDEFMSG
EndFunc

; Read search string from Edit control while it's typed in
Func WM_COMMAND( $hWnd, $iMsg, $wParam, $lParam )
  #forceref $hWnd, $iMsg
  Local Static $bEditClear = True
  Local $hWndFrom = $lParam
  Local $iCode = BitShift( $wParam, 16 ) ; High word
  Switch $hWndFrom
    Case $hSearch
      Switch $iCode
        Case $EN_CHANGE
          GUICtrlSendToDummy( $idSearchAction )
        Case $EN_SETFOCUS
          If $bEditClear Then
            GUICtrlSetData( $idSearch, "" )
            $bEditClear = False
          EndIf
      EndSwitch
  EndSwitch
  Return $GUI_RUNDEFMSG
EndFunc

; Display items in an owner drawn ListView
Func WM_DRAWITEM( $hWnd, $iMsg, $wParam, $lParam )
  Local Static $tRect = DllStructCreate( $tagRECT ), $pRect = DllStructGetPtr( $tRect ), $tSize = DllStructCreate( $tagSIZE )
  Local Static $hBrushYellow = _WinAPI_CreateSolidBrush( 0x00FFFF ), $hBrushCyan = _WinAPI_CreateSolidBrush( 0xFFFF00 ) ; Yellow and cyan, BGR
  Local Static $hBrushHighLight = _WinAPI_GetSysColorBrush( $COLOR_HIGHLIGHT ), $hBrushButtonFace = _WinAPI_GetSysColorBrush( $COLOR_BTNFACE )

  ; We can optimize code by removing Switch statements because the ListView is the only ownerdrawn control and only $ODA_DRAWENTIRE actions are present

  Local $tDrawItem = DllStructCreate( $tagDRAWITEM, $lParam ), $itemID = DllStructGetData( $tDrawItem, "itemID" ), $iState = DllStructGetData( $tDrawItem, "itemState" ), $hDC = DllStructGetData( $tDrawItem, "hDC" ), $sItemText

  ; Loop through columns
  ; $i is the column index
  For $i = 0 To $iCols - 1
    ; Subitem rectangle
    DllStructSetData( $tRect, 2, $i ) ; Top
    DllStructSetData( $tRect, 1, $LVIR_BOUNDS ) ; Left
    GUICtrlSendMsg( $idListView, $LVM_GETSUBITEMRECT, $itemID, $pRect )
    DllStructSetData( $tRect, 1, DllStructGetData( $tRect, 1 ) + 6 ) ; Left margin
    DllStructSetData( $tRect, 2, DllStructGetData( $tRect, 2 ) + 2 ) ; Top  margin

    ; Subitem background and text color
    If BitAND( $iState, $ODS_SELECTED ) Then _
      DllCall( "user32.dll", "int", "FillRect", "handle", $hDC, "struct*", $tRect, "handle", $fListViewHasFocus = 1 ? $hBrushHighLight : $hBrushButtonFace ) ; _WinAPI_FillRect
    DllCall( "gdi32.dll", "int", "SetTextColor", "handle", $hDC, "int", BitAND( $iState, $ODS_SELECTED ) ? $fListViewHasFocus = 1 ? 0xFFFFFF : 0x000000 : 0x000000 ) ; _WinAPI_SetTextColor

    ; Draw subitem text
    $sItemText = $aItems[$aSearch[$itemID]][$i]
    DllCall( "user32.dll", "int", "DrawTextW", "handle", $hDC, "wstr", $sItemText, "int", StringLen( $sItemText ), "struct*", $tRect, "uint", 0 ) ; _WinAPI_DrawText

    ; $i is column index
    ; $iCol is the search column
    ; Mark matching substring only if column index = search column
    If $i <> $iCol Then ContinueLoop

    ; Matching substring?
    If $sSearch Then
      Local $sMatch = StringRegExp( $sItemText, $sSearch, 1 ), $extended = @extended, $iLen = StringLen( $sMatch[0] )

      ; Rectangle for matching substring
      DllCall( "gdi32.dll", "bool", "GetTextExtentPoint32W", "handle", $hDC, "wstr", $sItemText, "int", $extended - $iLen - 1, "struct*", $tSize ) ; _WinAPI_GetTextExtentPoint32
      DllStructSetData( $tRect, "Left", DllStructGetData( $tRect, "Left" ) + DllStructGetData( $tSize, "X" ) )
      DllCall( "gdi32.dll", "bool", "GetTextExtentPoint32W", "handle", $hDC, "wstr", $sMatch[0], "int", $iLen, "struct*", $tSize ) ; _WinAPI_GetTextExtentPoint32
      DllStructSetData( $tRect, "Right", DllStructGetData( $tRect, "Left" ) + DllStructGetData( $tSize, "X" ) )

      ; Fill rectangle with yellow or cyan (selected) background color
      DllCall( "user32.dll", "int", "FillRect", "handle", $hDC, "struct*", $tRect, "handle", BitAND( $iState, $ODS_SELECTED ) ? $hBrushCyan : $hBrushYellow ) ; _WinAPI_FillRect

      ; Draw matching substring in rectangle
      DllCall( "gdi32.dll", "int", "SetTextColor", "handle", $hDC, "int", 0x000000 ) ; _WinAPI_SetTextColor
      DllCall( "user32.dll", "int", "DrawTextW", "handle", $hDC, "wstr", $sMatch[0], "int", $iLen, "struct*", $tRect, "uint", 0 ) ; _WinAPI_DrawText
    EndIf
  Next

  Return $GUI_RUNDEFMSG
  #forceref $hWnd, $iMsg, $wParam
EndFunc

; Message handler to test ListView focus
Func MessageHandler( $nCode, $wParam, $lParam )
  #forceref $nCode, $wParam
  Local $tMsg = DllStructCreate( $tagMSG, $lParam ), $iMsg = DllStructGetData( $tMsg, "message" )
  If $iMsg = $WM_LBUTTONDOWN Or $iMsg = $WM_RBUTTONDOWN Then $fListViewHasFocus = DllStructGetData( $tMsg, "hwnd" ) = $hListView ? 1 : 0
EndFunc

; Fill array with random strings
Func FillArray( ByRef $aItems )
  Local $aLetters[26] = [ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', _
                          'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' ], $s
  For $i = 0 To $iCols - 1
    For $j = 0 To $iItems - 1
      $s = $aLetters[Random(0,25,1)]
      For $k = 1 To Random(10,30,1)
        $s &= $aLetters[Random(0,25,1)]
      Next
      $aItems[$j][$i] = $s
    Next
  Next
EndFunc

OhNwOh0.png

2.2) Show matching rows only - multiple columns.au3

The include files in the zip in first post are needed.

Edited by LarsJ
Include files
Link to comment
Share on other sites

Wow! 🤪

Thanks a lot! It was very helpful!

I make it case-insensitive by adding "(?i)". I'm not sure  if it best solution but it works

StringRegExp( $aItems[$i][$iCol], "(?i)" & $sSearch )

 

I'm confused and can't understand how to update the ListView after manipulation on data in array $aItems?

For example after add, delete or sorting rows. Only GUICtrlSendToDummy( $idSearchAction ) not make a sense

 

Link to comment
Share on other sites

If you add or delete rows in the array, you must inform the listview of the new number of rows: GUICtrlSendMsg( $idListView, $LVM_SETITEMCOUNT, $iRows, 0 ). This command also redraws all visible listview items.

To redraw all visible listview items: GUICtrlSendMsg( $idListView, $LVM_REDRAWITEMS, 0, $iRows - 1 )

To redraw a single listview item: GUICtrlSendMsg( $idListView, $LVM_REDRAWITEMS, $iRow, $iRow )

Link to comment
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
 Share

  • Recently Browsing   0 members

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