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 :allright:

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
:allright: 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.
Bild
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.