Seite 1 von 1

Suchvorschläge anzeigen a la Google

Verfasst: 26.10.2010 15:42
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

Re: Suchvorschläge anzeigen a la Google

Verfasst: 26.10.2010 16:04
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

Re: Suchvorschläge anzeigen a la Google

Verfasst: 26.10.2010 16:08
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

Re: Suchvorschläge anzeigen a la Google

Verfasst: 26.10.2010 16:12
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

Re: Suchvorschläge anzeigen a la Google

Verfasst: 26.10.2010 16:18
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..

Re: Suchvorschläge anzeigen a la Google

Verfasst: 26.10.2010 17:47
von marco2007
Freaks Code ist perfekt (nur Windows):
http://www.purebasic.fr/english/viewtop ... toComplete