In ListIconGadget zu einem Eintrag springen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
sen-me
Beiträge: 478
Registriert: 17.07.2005 16:02
Wohnort: Saarbrücken
Kontaktdaten:

In ListIconGadget zu einem Eintrag springen

Beitrag 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.
Bild
Benutzeravatar
jear
Beiträge: 288
Registriert: 17.10.2004 01:59
Wohnort: Ammerland

Beitrag 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 
Man ist nie zu alt zum lernen, auch wenn man dabei manchmal alt aussieht!
Benutzeravatar
sen-me
Beiträge: 478
Registriert: 17.07.2005 16:02
Wohnort: Saarbrücken
Kontaktdaten:

Beitrag 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?
Bild
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag 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
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
sen-me
Beiträge: 478
Registriert: 17.07.2005 16:02
Wohnort: Saarbrücken
Kontaktdaten:

Beitrag 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?
Bild
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag 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.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
sen-me
Beiträge: 478
Registriert: 17.07.2005 16:02
Wohnort: Saarbrücken
Kontaktdaten:

Beitrag 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?
Bild
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag 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.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
sen-me
Beiträge: 478
Registriert: 17.07.2005 16:02
Wohnort: Saarbrücken
Kontaktdaten:

Beitrag von sen-me »

Ja ich dacht ich könnt aus dem Code irgendwas zusammenbasteln, aber ich schaffs nicht xD
Bild
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag 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.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Antworten