Seite 1 von 3
In ListIconGadget zu einem Eintrag springen
Verfasst: 13.03.2007 10:41
von sen-me
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.
Verfasst: 13.03.2007 10:51
von jear
@sen-me
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
Verfasst: 13.03.2007 11:15
von sen-me
OMG genau da schau ich nie hin

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
Aber wieso markiert der mir den Eintrag nicht?
Verfasst: 13.03.2007 11:30
von Fluid Byte
Dieser Code kann aber nicht nach Strings suchen. Außerdem erhält das gefundene Item nicht den Fokus.
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
Verfasst: 13.03.2007 11:52
von sen-me

Top
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
GadgetID bringt dir bei Parameter nicht viel wenn du dann in der Procedure ein festes Gadget festlegst.
Außerdem was bedeutet fMode?
Verfasst: 13.03.2007 12:04
von Fluid Byte
GadgetID bringt dir bei Parameter nicht viel wenn du dann in der Procedure ein festes Gadget festlegst.
Außerdem was bedeutet fMode?
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.
Verfasst: 13.03.2007 12:11
von sen-me
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?
Verfasst: 13.03.2007 12:44
von Fluid Byte
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?
Das hättest du aber auch mal vorher sagen können!
Geduld, ich strick dir was zusammen.
Verfasst: 13.03.2007 12:47
von sen-me
Ja ich dacht ich könnt aus dem Code irgendwas zusammenbasteln, aber ich schaffs nicht xD
Verfasst: 13.03.2007 13:20
von Fluid Byte
So, das ist sicher noch ausbaufähig aber funktioniert soweit ganz gut:
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
Und wenn du weitersuchen willst verwende einfach den Rückgabewert der Funktion um an dieser Stelle weiterzusuchen.