Suchvorschläge anzeigen a la Google

Anfängerfragen zum Programmieren mit PureBasic.
x3n
Beiträge: 7
Registriert: 30.09.2009 16:38

Suchvorschläge anzeigen a la Google

Beitrag von x3n »

Hallo,
ich möchte über ein String Gadget oder ein editierbares ComboBox Gadget die Eingabe des Benutzers zum Suchen in einer Datenbank nutzen. Alle Suchvorschläge möchte ich wie bei Google anzeigen lassen, sprich die Vorschläge unter dem Gadget anzeigen, wo der Bediener sie dann auswählen kann. Ich habe hier im Forum schon die Autocomplete Funktion für eine ComboBox gefunden, jedoch war es nicht ganz das, was ich suche.

Gruß x3n
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Suchvorschläge anzeigen a la Google

Beitrag von Kiffi »

mh, das was Du beschreibst, nennt sich eigentlich Autocomplete. Beschreib
mal kurz, was der Code macht, den Du gefunden hast und was er nach Deinen
Vorstellungen machen sollte.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Suchvorschläge anzeigen a la Google

Beitrag von RSBasic »

Meinst du sowas?

Code: Alles auswählen

;Autor: mesozorn

EnableExplicit
 
Structure comboboxinfo 
  cbSize.l
  rcItem.RECT
  rcButton.RECT
  stateButton.l
  hwndCombo.l
  hwndEdit.l
  hwndList.l
EndStructure

Global cbinfo.comboboxinfo
Global oldcomboProc
Define tb

Procedure.i ComboAutoComplete(hWnd, uMsg, wParam, lParam)
  Protected result
  Protected acg
  Protected spos.l
  Protected epos.l
  Protected matchesfound
  Protected x
  Protected match
  Protected ks
  Protected addchar$
  
  Select uMsg
    Case #WM_CHAR
    acg=GetActiveGadget()
    SendMessage_(hwnd, #EM_GETSEL, @spos.l, @epos.l)
    
    matchesfound=0
    For x=0 To CountGadgetItems(acg)-1
      If LCase(Left(GetGadgetText(acg),spos)+LCase(Chr(wParam)))=LCase(Left(GetGadgetItemText(acg,x),spos+1)) And epos=Len(GetGadgetText(acg))
        matchesfound+1:match=x
        If matchesfound>1
          Break
        EndIf
      EndIf
    Next x
    
    If matchesfound=1
      ks=GetKeyState_(#VK_SHIFT)
      If ks<2:addchar$=LCase(Chr(wparam))
      Else
        addchar$=UCase(Chr(wparam))
      EndIf
        SetGadgetText(acg,Left(GetGadgetText(acg),spos)+addchar$+Mid(GetGadgetItemText(acg,match),spos+2))
        SendMessage_(hwnd, #EM_SETSEL, spos+1, epos+999)
        result=0
      Else
        result = CallWindowProc_(oldcomboproc, hWnd, uMsg, wParam, lParam)
      EndIf
    Default
      result = CallWindowProc_(oldcomboproc, hWnd, uMsg, wParam, lParam)
  EndSelect
  ProcedureReturn result
EndProcedure

If OpenWindow(0,0,0,500,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  ComboBoxGadget(1,10,10,200,20,#PB_ComboBox_Editable)
  
  cbinfo\cbsize=SizeOf(comboboxinfo)
  GetComboBoxInfo_(GadgetID(1),@cbinfo)
  tb=cbinfo.comboboxinfo\hwndedit
  oldcomboproc = SetWindowLongPtr_(tb, #GWL_WNDPROC, @ComboAutoComplete())
  AddGadgetItem(1, -1, "12345")
  AddGadgetItem(1, -1, "23/468")
  AddGadgetItem(1, -1, "483~47")
  AddGadgetItem(1, -1, "58237")
  AddGadgetItem(1, -1, "58.772")
  
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Re: Suchvorschläge anzeigen a la Google

Beitrag von TomS »

Ist nicht perfekt und nicht vollständig (halt grade aus den Fingern gesaugt).
Sollte deinem Wunsch aber näher kommen, als die AutoComplete-Codes.

Code: Alles auswählen

EnableExplicit

Global NewList Daten.s()

AddElement(Daten()):Daten() = "PureBasic ist super"
AddElement(Daten()):Daten() = "Google Such Gadget"
AddElement(Daten()):Daten() = "Das Gadget ist auch super"
AddElement(Daten()):Daten() = "Der faule braune Hund usw..."

Procedure getsearchresults(gadget.i, string.s)
	Protected found.i
	ClearGadgetItems(gadget) 
	ResetList(Daten())
	While NextElement(Daten())
		If FindString(LCase(Daten()),LCase(string),0)
			AddGadgetItem(gadget,0,Daten())
			found + 1
		EndIf 
	Wend 
	If found>0
		HideGadget(gadget,0)
	EndIf  
EndProcedure 



Enumeration
	#Window
EndEnumeration

Enumeration
	#StringGadget
	#ListViewGadget
EndEnumeration

Define event

OpenWindow(#Window,0,0,400,300,"",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
StringGadget(#StringGadget,5,5,300,20,"")
ListViewGadget(#ListViewGadget,5,25,300,200)
HideGadget(#ListViewGadget,1)


Repeat
	event = WaitWindowEvent(20)
	Select event
		Case #PB_Event_Gadget
			Select EventGadget()
				Case #StringGadget
					Select EventType()
						Case #PB_EventType_Change
							If GetGadgetText(#StringGadget)=""
								HideGadget(#ListViewGadget,1)
							Else
								getsearchresults(#ListViewGadget,GetGadgetText(#StringGadget))
							EndIf 
					EndSelect 
			EndSelect 
	EndSelect 
	
Until event = #PB_Event_CloseWindow
x3n
Beiträge: 7
Registriert: 30.09.2009 16:38

Re: Suchvorschläge anzeigen a la Google

Beitrag von x3n »

Danke TomS!!
Das ist genau das, was ich gesucht habe. Vielen Dank nochmals für diese super schnelle Lösung!

P.S.: und dann soll nochmal jemand sagen, dass deutsche Forum sei keine Hilfe mehr..
marco2007
Beiträge: 906
Registriert: 26.10.2006 13:19
Kontaktdaten:

Re: Suchvorschläge anzeigen a la Google

Beitrag von marco2007 »

Freaks Code ist perfekt (nur Windows):
http://www.purebasic.fr/english/viewtop ... toComplete
Windows 11 - PB 6.03 x64
_________________________________
Antworten