Jump to content
Sign in to follow this  
ZwinnyRolnik

Why it's not working?

Recommended Posts

I have script for searching items in listview but if item or subitem = 0 then script does not work. Anyone know why and can help me? Just test, click search next, next next (w8 for subitem or item = 0) and then click x times back... Pls help.

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>

#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("", 625, 445, 99, 144)
$ListView = GUICtrlCreateListView("", 0, 0, 624, 409)
$szukana = GUICtrlCreateInput("15", 10, 415, 55, 21)
$Search2 = GUICtrlCreateButton("Search(click first)", 504, 415, 120, 25, 0)
$Search3 = GUICtrlCreateButton("next", 150, 415, 75, 25, 0)
$cofnij = GUICtrlCreateButton("back", 250, 415, 75, 25, 0)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###




For $i = 0 To 31
    
    _GUICtrlListView_AddColumn($ListView, "teksty"&$i, "",2)
    _GUICtrlListView_SetColumnWidth($ListView, $i, 150)
Next

For $i = 1 To 70
    
     _GUICtrlListView_AddItem($ListView, random(1,150,1))
Next

For $i = 1 To 70
    
    For $j = 1 To 80
        
    _GUICtrlListView_AddSubItem($ListView, $i - 1, random(1,150,1), $j)

    Next    
Next    


While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit

        Case $Search2
            
Global  $zapamietaji[_GUICtrlListView_GetItemCount($ListView)]
Global  $zapamietajj[_GUICtrlListView_GetColumnCount($ListView)]
Global  $pamiec[1001]
            searchWindows()
        Case $search3
            searchWindows()
        Case $cofnij
            Global $gogo = True
            cofnij()
            searchWindows()
    EndSwitch
WEnd


Func searchWindows()
 For $I = 0 To _GUICtrlListView_GetItemCount($ListView) - 1
    for $j = 0 to _GUICtrlListView_GetColumnCount($ListView) - 1
        
        if $zapamietaji[$i] = $i And $zapamietajj[$j] = $j then ContinueLoop
    
    $Search = _GUICtrlListView_GetItemText($ListView, $I, $j)

   If $Search = guictrlread($szukana) Then
      
      
        _GUICtrlListView_EnsureVisibleEx($ListView, $i, $j)
        _GUICtrlListView_SetItemSelected($ListView, $i)
        _GUICtrlListView_SetSelectedColumn($ListView, $j)
        
        $zapamietaji[$i] = $i
        $zapamietajj[$j] = $j
        For $z = 0 to 1000
            if $pamiec[$z] = "" Then
                $pamiec[$z] = $zapamietaji[$i]&","&$zapamietajj[$j]
            
                ExitLoop
            Else
            EndIf
        Next
        $tyt = WinGetTitle($form1)
        
        if StringLen($tyt) > 65 then WinSetTitle($form1,"","")
            $tyt = WinGetTitle($form1)
        WinSetTitle($Form1,"",$tyt&" | "&$pamiec[$z])
        return
    EndIf
Next
Next

MsgBox(0,"Program","Brak wyników")
EndFunc  ;==>searchWindows

func cofnij()
For $I = _GUICtrlListView_GetItemCount($ListView) - 1 To 0 step -1
    for $j = _GUICtrlListView_GetColumnCount($ListView) - 1 to 0 step -1
        if $zapamietaji[$i] <> "" And $zapamietajj[$j] <> "" then
        
            for $z = 0 to 1000 
            if $pamiec[$z] = $zapamietaji[$i]&","&$zapamietajj[$j] Then
                
                $zapamietaji[$i] = ""
                $zapamietajj[$j] = ""
                $pamiec[$z]= ""
                if $gogo = True Then
                    $gogo = False
                    cofnij()
                endIf
                Return
            Else
            EndIf
            
            Next
        Else
            
        EndIf
    Next
Next

EndFunc
        


Func _GUICtrlListView_EnsureVisibleEx($hwnd, $iIndex, $iSubItem = 0, $fPartialOK = False)
;funkey April 15, 2010
If Not IsHWnd($hWnd) Then $hWnd = GUICtrlGetHandle($hWnd)
_SendMessage($hWnd, $LVM_ENSUREVISIBLE, $iIndex, $fPartialOK)
Local $aRect = _GUICtrlListView_GetItemRect($hWnd, $iSubItem)
Local $iPixel
For $i = 0 To $iSubItem-1 ; 2 means: show at second visible column
  $iPixel += _GUICtrlListView_GetColumnWidth($hWnd, $i)
Next
_GUICtrlListView_Scroll($hWnd, $iPixel + $aRect[0], 0)
EndFunc

sorry for chaos

Share this post


Link to post
Share on other sites

ZwinnyRolnik,

Why it's not working?

Because of the the "chaos"! :

I have rewritten the whole thing and I think it works as you want now. You could still improve it a great deal if you wanted to make some major changes - a 2D array would remove the need for the StringSplit/Number lines, for example. :blink:

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>

#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("", 625, 445, 99, 144)
$ListView = GUICtrlCreateListView("", 0, 0, 624, 409)
GUICtrlSetBkColor(-1, 0xCCCCCC)
$Input = GUICtrlCreateInput("15", 10, 415, 55, 21)
$Search = GUICtrlCreateButton("Search(click first)", 150, 415, 120, 25)
$Next = GUICtrlCreateButton("next", 300, 415, 75, 25)
GUICtrlSetState(-1, $GUI_DISABLE)
$Back = GUICtrlCreateButton("back", 400, 415, 75, 25)
GUICtrlSetState(-1, $GUI_DISABLE)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

For $i = 0 To 3
    _GUICtrlListView_AddColumn($ListView, "teksty" & $i, "", 2)
    _GUICtrlListView_SetColumnWidth($ListView, $i, 150)
Next

For $i = 1 To 10
    _GUICtrlListView_AddItem($ListView, Random(1, 30, 1))
Next

For $i = 1 To 10
    For $j = 1 To 4
        _GUICtrlListView_AddSubItem($ListView, $i - 1, Random(1, 30, 1), $j)
    Next
Next

GUICtrlSetState($Input, $GUI_FOCUS)

Global $Remember_i[_GUICtrlListView_GetItemCount($ListView)]
Global $Remember_j[_GUICtrlListView_GetColumnCount($ListView)]

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Search
            ; Clear title and memory array
            WinSetTitle($Form1, "", "")
            Global $memory[1001] = [0]
            ; Search from start of LV
            searchWindows(0, 0)
        Case $Next
            ; Where was the last find?  We need to increase the column count
            $Split = StringSplit($memory[$memory[0]], ",")
            $iStart_i = Number($Split[1])
            $iStart_j = Number($Split[2]) + 1
            ; But check if we need to move to a new line
            If $iStart_j = _GUICtrlListView_GetColumnCount($ListView) - 1 Then
                $iStart_j = 0
                $iStart_i += 1
            EndIf
            ; Check if we were at the final item last time - if not start searching from from the next position along
            If $iStart_i < _GUICtrlListView_GetItemCount($ListView) Then
                ConsoleWrite("Next " & $iStart_i & " - " & $iStart_j & @CRLF)
                searchWindows($iStart_i, $iStart_j)
            EndIf
        Case $Back
            ; Move back through the memory array
            Back()
    EndSwitch
WEnd

Func searchWindows($Start_i, $Start_j)

    ; We are starting a new search
    $fStart = True

    For $i = 0 To _GUICtrlListView_GetItemCount($ListView) - 1
        For $j = 0 To _GUICtrlListView_GetColumnCount($ListView) - 1

            ; So set the values we want to start at
            If $fStart Then
                $i = $Start_i
                $j = $Start_j
                $fStart = False
            EndIf

            ; You use $Search here, thus overwriting the ControlID of the Search button <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
            $Text = _GUICtrlListView_GetItemText($ListView, $i, $j)

            ; Do we have a match?
            If $Text = GUICtrlRead($Input) Then
                ; Highlight element
                _GUICtrlListView_EnsureVisibleEx($ListView, $i, $j)
                _GUICtrlListView_SetItemSelected($ListView, $i)
                _GUICtrlListView_SetSelectedColumn($ListView, $j)
                ; Increase count of finds
                $memory[0] += 1
                ; Save the coordinates
                $memory[$memory[0]] = $i & "," & $j
                ; Alter the window title
                Window_Title()
                ;
                ; Enable Next button
                GUICtrlSetState($Next, $GUI_ENABLE)
                Return
            EndIf
        Next
    Next
    ; We got to then end of the LV
    If $memory[0] = 0 Then
        MsgBox(0, "Program", "Nothing Found")
    Else
        MsgBox(0, "Program", "Nothing More Found")
    EndIf

    ; Disable the next button - there are no more to find!
    GUICtrlSetState($Next, $GUI_DISABLE)
    ; If there are zero or 1 element found, there is no need for a Next button either!
    If $memory[0] < 2 Then
        GUICtrlSetState($Back, $GUI_DISABLE)
    Else
        GUICtrlSetState($Back, $GUI_ENABLE)
    EndIf

EndFunc   ;==>searchWindows

Func Back()

    ; Get the coordinates of the current selection
    $Split = StringSplit($memory[$memory[0]], ",")
    ; Empty the current memory element
    $memory[$memory[0]] = ""
    ; Reduce the memory count
    $memory[0] -= 1
    ; If the memory array is now empty
    If $memory[0] = 0 Then
        ; Clear the title
        WinSetTitle($Form1, "", "")
        ; Reset teh buttons
        GUICtrlSetState($Search, $GUI_ENABLE)
        GUICtrlSetState($Next, $GUI_DISABLE)
        GUICtrlSetState($Back, $GUI_DISABLE)
        ; Clear the selection - this is why we need to get the coordinates of the current selection in the first line
        _GUICtrlListView_SetItemSelected($ListView, Number($Split[1]), False)
        _GUICtrlListView_SetSelectedColumn($ListView, -1)
        Return
    EndIf
    ; Get the coordinates of the previous (now current) selection
    $Split = StringSplit($memory[$memory[0]], ",")
    $i = Number($Split[1])
    $j = Number($Split[2])
    ; Show selection
    _GUICtrlListView_EnsureVisibleEx($ListView, $i, $j)
    _GUICtrlListView_SetItemSelected($ListView, $i)
    _GUICtrlListView_SetSelectedColumn($ListView, $j)
    ; We can now go forward again - so enable the button
    GUICtrlSetState($Next, $GUI_ENABLE)
    ; Alter the window Title
    Window_Title()

EndFunc

Func Window_Title()

    $tyt = ""
    ; Add matches from the last
    For $i = $memory[0] To 1 Step -1
        $tyt = "|" & $memory[$i] & $tyt
        ; Stop if the total is too long
        If StringLen($tyt) > 65 Then ExitLoop
    Next
    ; Set the title
    WinSetTitle($Form1, "", $tyt)

EndFunc

Func _GUICtrlListView_EnsureVisibleEx($hwnd, $iIndex, $iSubItem = 0, $fPartialOK = False)
    ;funkey April 15, 2010
    If Not IsHWnd($hwnd) Then $hwnd = GUICtrlGetHandle($hwnd)
    _SendMessage($hwnd, $LVM_ENSUREVISIBLE, $iIndex, $fPartialOK)
    Local $aRect = _GUICtrlListView_GetItemRect($hwnd, $iSubItem)
    Local $iPixel
    For $i = 0 To $iSubItem - 1 ; 2 means: show at second visible column
        $iPixel += _GUICtrlListView_GetColumnWidth($hwnd, $i)
    Next
    _GUICtrlListView_Scroll($hwnd, $iPixel + $aRect[0], 0)
EndFunc   ;==>_GUICtrlListView_EnsureVisibleEx

By the way, please learn how to use Tidy (<Tools> menu or Ctrl-T)! ;)

M23

Edit: I forgot to mention that you used $Search as both the ControlId of the Search button AND the text from the element (look for the <<<<<<<<<<<<<<< line). Doing this overwrote the ControlId and rendered the button unuseable from that point on. Try to use unique variable names - it helps in the long run! :P

Edited by Melba23

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

 

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
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...