Avatar billede koden12 Nybegynder
10. februar 2004 - 20:52 Der 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

ComboBox1.Items.Add(ADOQuery1.FieldByName('telefon').AsString);

ADOQuery1.Next;
end;
end;

VH
koden12
Avatar billede ibhe Novice
10. februar 2004 - 21:46 #1
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;

mvh ib
Avatar billede koden12 Nybegynder
11. februar 2004 - 11:10 #2
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 ?

VH
koden12
Avatar billede ibhe Novice
11. februar 2004 - 15:06 #3
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
Avatar billede koden12 Nybegynder
11. februar 2004 - 23:39 #4
Ibhe

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.

VH
koden12
Avatar billede ibhe Novice
12. februar 2004 - 07:39 #5
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;
 
  edit1.text := adoquery1.fieldbyname('Efternavn').asstring;
  o.s.v.
  adoquery1.active := false;
end;

Ovenstående virker hvis tabellerne er i samme database, hvis de er i hver sin database, skal du indsætte connectstring i proceduren, ala:

procedure TForm1.ComboBox1Click(Sender: TObject);
begin
  if adoquery1.active then
    adoquery1.active := false;
 
  adoquery1.connectstring := 'bla. bla. bla. ';

  adoquery1.sql.clear;
  adoquery1.sql.add('select * from anden_tabel where telefon="'+combobox1.text+'"');
  adoquery1.active := true;
 
  edit1.text := adoquery1.fieldbyname('Efternavn').asstring;
  o.s.v.
  adoquery1.active := false;
end;

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;

mvh Ib
Avatar billede koden12 Nybegynder
12. februar 2004 - 11:33 #6
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..

VH
koden12
Avatar billede ibhe Novice
12. februar 2004 - 12:52 #7
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.

mvh ib
Avatar billede koden12 Nybegynder
12. februar 2004 - 13:15 #8
Yderst intressant... virkeligt !
Tak

Koden12
Avatar billede koden12 Nybegynder
12. februar 2004 - 16:15 #9
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 ?

Koden :

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, StdCtrls, Mask, DBCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    ADOConnection1: TADOConnection;
    ADOTable1: TADOTable;
    ADOTable2: TADOTable;
    DataSource1: TDataSource;
    DataSource2: TDataSource;
    DBNavigator1: TDBNavigator;
    DBEdit1: TDBEdit;
    ADOQuery1: TADOQuery;
    ComboBox1: TComboBox;
    ADOCommand1: TADOCommand;
    DBComboBox1: TDBComboBox;
    DBMemo1: TDBMemo;
    DBEdit2: TDBEdit;
    Button1: TButton;
    procedure FormActivate(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

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
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