10. februar 2004 - 20:52Der er
8 kommentarer og 1 løsning
Combobox og Query
Jeg har sat en combobox (almindelig) på en form (der er 2 tabeller) og vil gerne have vist telefon i comboboks tekst feltet. Til det bruger jeg en ADOQuery (har jeg læst er godt : ) jeg ved ikke hvad der skal stå i Query SQL teksten ? men det virker ikke Den stopper Her : "ComboBox1.Text:=ADOQuery1.FieldByName('telefon').AsString;" Rejser noget mod ADOtabellen eller sådan noget skriver den ? Har nogle prøvet det ? Har nogle en ide om hvorfor ?
procedure TForm1.FormActivate(Sender: TObject); begin ADOTable1.Active:= True; ADOTable2.Active:= True;
ADOQuery1.First;
ComboBox1.Text:=ADOQuery1.FieldByName('telefon').AsString; while not (ADOQuery1.EOF) do begin
Hej, Jeg er ikke helt siker på dit spørgsmål, men hvis du forsøger at læse alle telefonnummerne ind i comboboxen, kan du prøve det som jeg gør:
// put connectstring eller connection ind i adoquery1
if adoquery1.active then adoquery1.active := false; adoquery1.sql.clear; adoquery1.sql.add('select telefon from tabelnavnet'); adoquery1.active := true; while not adoquery1.eof do begin combobox1.items.add(adoquery1.fieldbyname('telefon').asstring); adoquery1.next; end;
Hej Den ser go ud, den vil jeg lige teste.. Du har gættet (beklager det er svært at forklare) hvad jeg ville. Jeg har ikke fået noget mails om svar derfor denne tid.. Et af de store problemer ved combobox er at den overskriver ved klik på en af dem i faldned lemmen. Skal denne kode stå i form1. activate ?
Hej Koden12, Jeg ville putte koden ind i form1.show, den kaldes umiddelbart før vinduet vises på skærmen, så her er du sikker på at alle de synlige objekter er "created". Du kan prøve at putte den ind i form1.create, men jeg er ikke sikker på om det går (hvis det ikke går, får du en adresserings/memprotect fejl.
En combobox gør nøjagtigt som du beskriver - altså når man klikker een gang på et element i listen, så vælger den det element. Hvis du vil ændre den opførsel, skal du til at hekse lidt med comboboxens events, alternativt sætte en editbox og en listbox sammen. Hvordan skal brugeren vælge et element fra listen ? Skal han klikke og derefter trykke enter eller noget ala det ?? mvh /ib
WAW, det virker ! Mange tak !!! Også dine gode råd om det andet vil jeg forsøge mig med... En drøm ? er at den svinger med en anden database og dens ID nummer, men så hedder det nok DBComboboks men din ide, har givet mig andre metoder..også... rart..
Jeg aksepterer gerne dine point, det var nok mere værd.
Hej Koden, Point modtaget med kyshånd, Det er kun min tredie dag på eksperten, så det luner jo lidt at kunne bidrage med noget der kan bruges. Omkring din drøm: Det behøver ikke at være så indviklet. Du skal bare putte opslaget i den anden database ind i comboboxens Onclick event, that's it, f.eks:
procedure TForm1.ComboBox1Click(Sender: TObject); begin if adoquery1.active then adoquery1.active := false;
adoquery1.sql.clear; adoquery1.sql.add('select * from anden_tabel where telefon="'+combobox1.text+'"'); adoquery1.active := true;
Forresten, i den første kodestump jeg sendte dig, skal du huske at slette indholdet af comboboxen inden du læser data ind, ellers vil du få gentaget telefonnummerne hver gang du lukker og åbner vinduet, så koden burde have været:
if adoquery1.active then adoquery1.active := false;
adoquery1.sql.clear; combobox1.items.clear;
adoquery1.sql.add('select telefon from tabelnavnet'); adoquery1.active := true; while not adoquery1.eof do begin combobox1.items.add(adoquery1.fieldbyname('telefon').asstring); adoquery1.next; end;
Det er da "helt vild go kode".." Nye koste fejler bedst : ) Det sammen må kunne laves med en DBCombobox så den gemmer en evt ny eller som du skriver en fin ide at lave en "snyde combobox"... en ting der under mig Her : ******** if adoquery1.active then adoquery1.active := false; ******* Det læser jeg som Hvis den er aktiv, så skal den være FALSE eller ikke aktiv, så hvorfor skal den være ikke aktiv når den skal bruges ??? Det fatter jeg ikke..
Hej Koden12, for at udføre det sql-statement der står i adoquery1.sql, skal man "open" den (se execsql i delhi hjælp)- hvilket selvfølgelig kun kan lade sig gøre hvis active=false. I starten virkede det også lidt underligt på mig, det ville jo have været fikst med et adoquery1.execute i stedet for, men sådan er det altså ikke.
den jeg bruger i starten:
if adoquery1.active then adoquery1.active := false;
sikrer den efterfølgende kode mod ting der er gået galt andre steder i programmet. Hvis man f.eks. forsøger at udføre et sql med fejl i, så lukker delphi ikke automatisk databasen, men hopper bare ud af proceduren midt i det hele (hvis man er så doven at man ikke benytter try..except..end). Ved at starte som jeg gør, sikrer man sig altså mod fejl "begået" andre steder i programmet.
Ja nu er jeg så ude i det store misbrug. Du må sige fra, hvis det er... Jeg har kopieret hele koden ind i denne boks og det er en test ? som skal lære mig det til det rigtige program. Den indeholder 2 tabelle men jeg bruger kun den ene.. måske skal den anden ikke bruges. Der er en database. Tabellen navnTB indeholder id(autonummer), navn(tekst) adresse(notat), telefon (tekst) Det er den jeg bruger.. Det var så meningen at hver gang jeg i din fine Combobox klikkede på et af telefonnummerne som kommer ned i faldnedlemmen, så skulle hele databasen vise den som jeg klikkede på med musen i faldnedlemmen. Den retter sig nok efter id nummeret som jo er autonummer og primary key... Og det er jo ikke den(id) men telefon som bliver klikket på i DBcombox`snes faldnedlem. Men der sker ikke noget, faktisk overskriver den nogle gange ? (mærkeligt nok ikke hver gang ) det nummer som står der i forvejen.
Det virker lidt mærkeligt på mig ... Hvad er det jeg overser ?
procedure TForm1.FormActivate(Sender: TObject); begin ADOTable1.Active:= True; ADOTable2.Active:= True;
if adoquery1.active then adoquery1.active := false; adoquery1.sql.clear; DBCombobox1.Items.Clear; adoquery1.sql.add('select telefon from navnTB'); adoquery1.active := true; while not adoquery1.eof do begin DBcombobox1.items.add(adoquery1.fieldbyname('telefon').asstring); adoquery1.next;
end;
end;
procedure TForm1.FormCreate(Sender: TObject); begin
end;
end.
VH koden12
Synes godt om
Ny brugerNybegynder
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.