Avatar billede anold Nybegynder
16. februar 2001 - 07:31 Der er 7 kommentarer og
2 løsninger

\"HjælpeBox til DBComboBox\"

Jeg har en database med en masse navne i.
Jeg kan så vælge et navn Via en DBComboBox
Men jen vil gerne have det til at være sådan at, når jeg selv taster noget i DBComboBox\'ens tekstfelt, så kommer der en lille \"HjælpeBox\" frem med de navne der er = > det jeg har tastet ind.
når jeg så klikker på et navn i \"HjælpeBox\'en\" så skal det sættes ind i DbComboBox\'en (DbComboBox.Text eller hvad det nu må hedde!!)
Min Database Hedder Klub Og  mit DataField hedder Klubnavn

Hvordan gør jeg lige det
Avatar billede sjensen Nybegynder
16. februar 2001 - 09:40 #1
Brug et dbedit felt istedet for en DbCombobox. Sæt samtidig en listbox lige under editfeltet og sæt dens visible property til false så man ikke kan se den.

I dbedit feltets OnChange event starter dun med listbox1.clear og derefter kalder du din database med \"select klubnavn from klub where klubnavn LIKE dbedit1.text+\"%\".
og derefter
if query1.recordcount > 0 then
begin
  query1.first;
  while not query1.eof do
  begin
    listbox1.items.add(query1.fields[0].value);
    query1.next;
  end;
  listbox1.visible := true;
end;

og i listboksens OnClick event skriver du

table1.klubnavn := listbox1.items[listbox1.itemindex];
listbox1.visible := false;
dbedit1.setfocus;

NB! linien table1.klubnavn := listbox1... forudsætter at feltet bag din dbedit1 er table1.klubnavn. Det er ikke nok at sætte dbedit1.text = listbox1...
Avatar billede hatecaps Nybegynder
16. februar 2001 - 09:45 #2
du kan bruge 2 listboxe, listbox1 indeholder alle mulige navne og er usynlig, listbox2 placeres lige nedenunder din dbcombobox, med samme bredde, med alle mulige navne i til at begynde med, og usynlig.

procedure TForm1.ComboBox1Change(Sender: TObject);
var i : integer;
begin
  if combobox1.text <> \'\' then
  begin
    for i := listbox2.items.count - 1 downto 0 do
    begin
      if listbox2.items[i] < combobox1.text then
      begin
        listbox2.items.delete(i);
      end;
    end;
    listbox2.visible := true;
  end else
  begin
    listbox2.visible := false;
    listbox2.items.text := combobox1.items.text;
  end;
end;

procedure TForm1.ListBox2Click(Sender: TObject);
begin
  if listbox2.itemindex > -1 then
  begin
    combobox1.text := listbox2.items[listbox2.itemindex];
    listbox2.visible := false;
    listbox2.items.text := combobox1.items.text;
  end;
end;

procedure TForm1.ListBox2KeyPress(Sender: TObject; var Key: Char);
begin
  if (key = #13) and (listbox2.itemindex > -1) then
  begin
    combobox1.text := listbox2.items[listbox2.itemindex];
    listbox2.visible := false;
    listbox2.items.text := combobox1.items.text;
  end;
end;

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
  if (key = #27) then
  begin
    listbox2.visible := false;
    listbox2.items.text := combobox1.items.text;
  end;
end;

procedure TForm1.ComboBox1Exit(Sender: TObject);
begin
  if activecontrol <> listbox2 then
  begin
    listbox2.visible := false;
    listbox2.items.text := combobox1.items.text;
  end;
end;

så kan du sætte formens keypreview til True og bruge

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
  if (key = #27) then
  begin
    listbox2.visible := false;
    listbox2.items.text := combobox1.items.text;
  end;
end;

til også at nulstille hjælpboxen når der trykkes escape

ha\' det godt
hatecaps :-)
Avatar billede martinlind Nybegynder
16. februar 2001 - 10:07 #3
Eller også skal du selecte alle navne også bruge filter propery\'en den er hurtigere, også skal du ikke vente på dit select.
Avatar billede anold Nybegynder
16. februar 2001 - 10:50 #4
Hej Hatecaps

nu har jeg prøvet din kode og det ser ud til at Være  lige det jeg gerne vil have
MEN!!!!

Når min listbox2 bliver synlig er den TOM !!
Jeg har prøvet at lave min listbox visible og så er alle mine navne der !!
Avatar billede sjensen Nybegynder
16. februar 2001 - 11:14 #5
anold, det er fordi hatecaps laver en fejl. Alle de steder i eksemplet han har skrevet:

listbox2.items.text := combobox1.items.text;

skulle han istedet have skrevet

listbox2.items.text := listbox1.items.text;

således at han overfører alle navnene fra listbox1 til listbox2 efter at du har valgt et navn. I eksemplet sletter han alle de navne fra listbox2 der ikke passer med det du indtaster, men glemmer efterfølgende at sætte dem tilbage igen. Det skulle han gøre med den linie jeg har skrevet.

I øvrigt blander han det lidt mellem dbcombobox og alm. combobox, men i eksemplet er der ikke brug for en combobox. Han bruger alligevel ikke comboboksens faciliteter. Du kan derfor ligeså godt bruge et dbedit felt sådan som jeg skrev.

Avatar billede anold Nybegynder
16. februar 2001 - 11:28 #6
Hej sjensen

Ja du har ret i at hatecape blander det lidt mellem dbcombobox og alm. combobox men det \"problem\" har jeg løst.
Nu har jeg byttet linjerne ud med dine men det ændre ikke noget ,min listbox2 er stadig tom når den bliver visible .
jeg har lige prøvet at lade den være visible når jeg starter programmet og så er alle data der når jeg så trykker på min DBcomboBox forsvinder listbox\'en som den skal  Men næste gang jeg skriver noget i DBComboBox\'en text felt så kommer listboxen frem igen men denne gang er den tom
om jeg fatte hvad der sker !!!!

Sjensen
jeg vil gerne holde fast i min DBcomboBox for at give brugeren mulighed for at vælge et navn direkte fra DBcomboBox\'en
Avatar billede anold Nybegynder
16. februar 2001 - 11:44 #7
STOP STOP !!!!!!!

Jeg har funde fejlen #:0)

Det var mig der ikke tastet navnet rigtigt ind (UPS)
Fejlen var at det første bukstav var med stort (T) men jeg skrev med lille (t) så nu virker det

Jeg vil vælge at dele point mellem Sjensen og hatecaps i forhold 20/40. tak for hjælpen.
Avatar billede anold Nybegynder
16. februar 2001 - 13:59 #8
Hallo igen.
det ser ud til at jeg var for hurtig til at acceptere svarene.
jeg har lige et lille problem med listbox2
når man F.eks taster S (Skanderborg) ind i DBcombobox\'en så finder Listbox2 alle de der starter med \"S\" men når man så taster der næste bogstav ind \"k\" ja så finder listbox2 alle dem der starter med T
hvad skal vi gøre ved det ??
Avatar billede hatecaps Nybegynder
16. februar 2001 - 21:24 #9
hmm, det lyder som om at skanderborg står med store bogstaver i listen. Da k er større end K kan den ikke vise SKANDERBORG hvis du taster Sk.
Du kan lave
if listbox2.items[i] < combobox1.text then
om til
if uppercase(listbox2.items[i]) < unppercase(combobox1.text) then
så der ikke tages hensyn  til store/små bogstaver

i øvrigt tak for hjælpen til sjensen, der kan man se hvad der sker når man skriver noget så tidligt på dagen :-)

Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester