In ListIconGadget zu einem Eintrag springen
In ListIconGadget zu einem Eintrag springen
Ich hab mal im hier gesucht aber nichts gefunden (vllt. benutz ich die falschen Suchbegriffe -.- ).
Also ich habe ein ListIconGadget mit z.B. 100 Einträgen, jetzt will ich nach einem Eintrag suchen und der Treffer soll am oberen Rand angezeigt werden (also runter scrollen bis der Treffer als oberstes Item angezeigt wird).
Hab versucht mit SetGadgetState aber da makiert er ihn nur und springt nicht auf ihn.
Also ich habe ein ListIconGadget mit z.B. 100 Einträgen, jetzt will ich nach einem Eintrag suchen und der Treffer soll am oberen Rand angezeigt werden (also runter scrollen bis der Treffer als oberstes Item angezeigt wird).
Hab versucht mit SetGadgetState aber da makiert er ihn nur und springt nicht auf ihn.

@sen-me
Aus dem CodeArchiv:
Aus dem CodeArchiv:
Code: Alles auswählen
; German Forum:
; Author: Andreas
; Date: 13. October 2002
Global hwnd.l,Listbox.l,TopIndex.l
hwnd = OpenWindow(0,0,0,640,480, "Testfenster", #PB_Window_SizeGadget|#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
If hwnd
If CreateGadgetList(hwnd)
Listbox = ListIconGadget(0,10,10, 300, 300, "Test" ,280,0)
For I = 1 To 1000
AddGadgetItem(0,-1,"")
SetGadgetItemText(0, I-1, "Test"+Str(I), 0)
Next I
TopIndex = 750 ; dies Item soll oben als erste Zeile gezeigt werden
SendMessage_(Listbox,#LVM_GETITEMRECT,0,r.RECT)
SendMessage_(Listbox,#LVM_SCROLL,0,((r\bottom - r\top)*(TopIndex-1)))
EndIf
Repeat
EventID.l = WaitWindowEvent()
If EventID = #PB_Event_CloseWindow
Quit = 1
EndIf
Until Quit =1
EndIf
End
Man ist nie zu alt zum lernen, auch wenn man dabei manchmal alt aussieht!
OMG genau da schau ich nie hin 
Naja thx
Edit:
Aber wieso markiert der mir den Eintrag nicht?

Naja thx

Edit:
Code: Alles auswählen
; German Forum:
; Author: Andreas
; Date: 13. October 2002
Global hwnd.l,Listbox.l,TopIndex.l
hwnd = OpenWindow(0,0,0,640,480, "Testfenster", #PB_Window_SizeGadget|#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
If hwnd
If CreateGadgetList(hwnd)
Listbox = ListIconGadget(0,10,10, 300, 300, "Test" ,280,0)
For I = 1 To 1000
AddGadgetItem(0,-1,"")
SetGadgetItemText(0, I-1, "Test"+Str(I), 0)
Next I
TopIndex = 750 ; dies Item soll oben als erste Zeile gezeigt werden
SetGadgetState(0, TopIndex-1)
SendMessage_(Listbox,#LVM_GETITEMRECT,0,r.RECT)
SendMessage_(Listbox,#LVM_SCROLL,0,((r\bottom - r\top)*(TopIndex-1)))
EndIf
Repeat
EventID.l = WaitWindowEvent()
If EventID = #PB_Event_CloseWindow
Quit = 1
EndIf
Until Quit =1
EndIf
End

- Fluid Byte
- Beiträge: 3110
- Registriert: 27.09.2006 22:06
- Wohnort: Berlin, Mitte
Dieser Code kann aber nicht nach Strings suchen. Außerdem erhält das gefundene Item nicht den Fokus.
Diese Version kann beides:
Diese Version kann beides:
Code: Alles auswählen
OpenWindow(0,0,0,400,300,"untitled",#WS_OVERLAPPEDWINDOW | 1)
CreateGadgetList(WindowID(0))
ListIconGadget(0,5,5,390,290,"Name",350)
For i=1 To 100
AddGadgetItem(0,-1,"List-View Control Item #" + Str(i))
Next
Procedure FindListItem(GadgetID.w,Expression.l,fMode.b=0)
Protected lvf.LV_FINDINFO, Position.l
If fMode
Position = Expression
Else
lvf\flags = #LVFI_STRING
lvf\psz = Expression
Position = SendMessage_(GadgetID(0),#LVM_FINDITEM,-1,lvf)
EndIf
SendMessage_(GadgetID(0),#LVM_ENSUREVISIBLE,Position,1)
If Position > SendMessage_(GadgetID(0),#LVM_GETCOUNTPERPAGE,0,0)-1
SendMessage_(GadgetID(0),#WM_VSCROLL,#SB_PAGEDOWN,0)
SendMessage_(GadgetID(0),#WM_VSCROLL,#SB_LINEUP,0)
EndIf
SetGadgetItemState(0,Position,#PB_ListIcon_Selected)
SetActiveGadget(0)
EndProcedure
FindListItem(0,@"List-View Control Item #73")
While WaitWindowEvent() ! 16 : Wend
Windows 10 Pro, 64-Bit / Outtakes | Derek

Allerdings hast was vergessen ^^
Code: Alles auswählen
Procedure FindListItem(GadgetID.w,Expression.l,fMode.b=0)
Protected lvf.LV_FINDINFO, Position.l
If fMode
Position = Expression
Else
lvf\flags = #LVFI_STRING
lvf\psz = Expression
Position = SendMessage_(GadgetID(GadgetID),#LVM_FINDITEM,-1,lvf)
EndIf
SendMessage_(GadgetID(GadgetID),#LVM_ENSUREVISIBLE,Position,1)
If Position > SendMessage_(GadgetID(GadgetID),#LVM_GETCOUNTPERPAGE,0,0)-1
SendMessage_(GadgetID(GadgetID),#WM_VSCROLL,#SB_PAGEDOWN,0)
SendMessage_(GadgetID(GadgetID),#WM_VSCROLL,#SB_LINEUP,0)
EndIf
SetGadgetItemState(GadgetID,Position,#PB_ListIcon_Selected)
SetActiveGadget(GadgetID)
EndProcedure
Außerdem was bedeutet fMode?

- Fluid Byte
- Beiträge: 3110
- Registriert: 27.09.2006 22:06
- Wohnort: Berlin, Mitte
GadgetID bringt dir bei Parameter nicht viel wenn du dann in der Procedure ein festes Gadget festlegst.

Das legt fest wie der Expression Parameter interpretiert wird. Nämlich entweder die Addresse eine Strings, oder, wenn auf #True gesetzt, der Index eines List-View Items.Außerdem was bedeutet fMode?
Windows 10 Pro, 64-Bit / Outtakes | Derek
- Fluid Byte
- Beiträge: 3110
- Registriert: 27.09.2006 22:06
- Wohnort: Berlin, Mitte
Das hättest du aber auch mal vorher sagen können!sen-me hat geschrieben:Und was ist wenn ich z.B. jetzt 3 Spalten habe?
Indexnummer;Name;Sonstiges
Wie geb ich jetzt an in welcher Spalte er es suchen soll?
Und wenn ich weiter suchen will (Falls mehrere Treffer gibt) wie geht das?

Geduld, ich strick dir was zusammen.
Windows 10 Pro, 64-Bit / Outtakes | Derek
- Fluid Byte
- Beiträge: 3110
- Registriert: 27.09.2006 22:06
- Wohnort: Berlin, Mitte
So, das ist sicher noch ausbaufähig aber funktioniert soweit ganz gut:
Und wenn du weitersuchen willst verwende einfach den Rückgabewert der Funktion um an dieser Stelle weiterzusuchen.
Code: Alles auswählen
OpenWindow(0,0,0,400,300,"untitled",#WS_OVERLAPPEDWINDOW | 1)
CreateGadgetList(WindowID(0))
ListIconGadget(0,5,5,390,290,"Index",50,#PB_ListIcon_FullRowSelect)
AddGadgetColumn(0,1,"Name",200)
AddGadgetColumn(0,2,"CRC32",100)
For i=1 To 100
Label$ = "List-View Control Item #" + Str(i)
AddGadgetItem(0,-1,Str(i) + Chr(10) + Label$ + Chr(10) + "$" + Hex(CRC32Fingerprint(@Label$,Len(Label$))))
Next
Procedure FindListItem(GadgetID.w,Expression.l,fMode.b=0,Column.b=0,iStart.l=0)
Protected hwndListbox.l, Position.l, ItemCount.l, Length.l, i.l
hwndListbox = GadgetID(GadgetID) : Position = -1
If fMode
Position = Expression
Else
ItemCount = CountGadgetItems(GadgetID) - 1
Length = lstrlen_(Expression)
For i=iStart To ItemCount
Label$ = GetGadgetItemText(0,i,Column)
If CompareMemoryString(Expression,@Label$,0,Length) = 0
Position = i : Break
EndIf
Next
EndIf
SendMessage_(hwndListbox,#LVM_ENSUREVISIBLE,Position,1)
If Position > SendMessage_(hwndListbox,#LVM_GETCOUNTPERPAGE,0,0)-1
SendMessage_(hwndListbox,#WM_VSCROLL,#SB_PAGEDOWN,0)
SendMessage_(hwndListbox,#WM_VSCROLL,#SB_LINEUP,0)
EndIf
SetGadgetItemState(GadgetID,Position,#PB_ListIcon_Selected)
SetActiveGadget(GadgetID)
ProcedureReturn Position
EndProcedure
Debug FindListItem(0,@"List-View Control Item #73",0,1)
While WaitWindowEvent() ! 16 : Wend
Windows 10 Pro, 64-Bit / Outtakes | Derek