Page 1 of 2 1 2 LastLast
Results 1 to 15 of 16

Thread: Combobox met een verborgen veld

  1. #1

    Combobox met een verborgen veld

    Ik heb geen idee of dit mogelijk is, maar ik heb een lijst met bv. dit van 2 tables. en die heb ik gecombineerd met een UNION query.

    Naam ID
    Jan 1
    Piet 0
    Tom 0
    Henk 1

    Nu wil ik de namen gewoon laten zien in de combox, wat dus geen probleem is.
    Maar ik wil op de 1 of andere manier de ID eraan hangen, zodat ik dat nummer kan gebruiken voor andere dingen.
    Maar het moet dus niet zichtbaar zijn.

    Heb van alles geprobeerd me een Combobox maar geen resultaat.
    Enig idee hoe ik dat kan oplossen?

    Dank u

  2. #2
    Je kunt met addItem ook een object meegeven, dit object kun je gebruiken voor alle overige info die je wilt koppelen.

  3. #3
    Dank u.

    Heb dit in elkaar gezet, en werkt prima.
    Nu alleen nog uitzoeken, hoe ik een geselekteerde optie, de waarde van ID weer kan teruglezen.


    Code:
    procedure TForm2.selectscriptEnter(Sender: TObject);
    var
    listing : TNames;
    begin
    selectscript.Clear;
    query.SQL.Text := 'select appname,purchased from purchased UNION ALL select appname,purchased from downloaded order by appname';
    query.Open;
    query.first;
    while not query.eof do
      begin
    
      listing:=tnames.Create();
      listing.Name:=query.FieldByName('appname').Asstring;
      listing.ID:=query.FieldByName('purchased').Asstring;
      selectscript.Items.AddObject(listing.Name,listing);
      query.next;
      end;
    query.Close;
    end;

  4. #4
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    Je hoeft daar niet perse een object in te stoppen als je de waarde kunt typecasten van en naar een TObject. Je hebt het over een ID, dat is waarschijnlijk een getal. Dan kun je e.e.a. vereenvoudigen met:

    Delphi Code:
    1. procedure TForm1.FormCreate(Sender: TObject);
    2. var
    3.   S: String;
    4.   Id: Integer;
    5. begin
    6.   S := 'Test';
    7.   Id := 1234;
    8.   ComboBox1.Items.AddObject(S, TObject(Id));
    9.   Id := ComboBox1.Items.IndexOf(S);
    10.   Id := Integer(ComboBox1.Items.Objects[Id]);
    11.   Caption := IntToStr(Id);
    12. end;
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  5. #5
    Dank je,

    Zit dan nog wel met het probleem dat als sommige namen hetzelfde zijn, want dan pakt die niet de correcte index.
    Of heb ik het nou mis?

    bv.

    Jan 100
    Klaas 101
    Jan 102
    Jan 103

  6. #6
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Nee, want elke item heeft zijn eigen object dat de id vertegenwoordigt. Klink maar eens op een item en lees deze uit.
    Delphi is great. Lazarus is more powerfull

  7. #7
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    Mijn code was slechts om aan te tonen dat je prima een integer in de Object property van een TStrings kunt stoppen. Zoals jkuiper aangeeft is er behalve de combinatie van Naam en Id ook nog de index van het item ter identificatie van die combinatie:
    Delphi Code:
    1. procedure TForm1.ComboBox1Select(Sender: TObject);
    2. begin
    3.   if ComboBox1.ItemIndex >= 0 then
    4.     Caption := IntToStr(Integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex]));
    5. end;
    6.  
    7. procedure TForm1.FormCreate(Sender: TObject);
    8. begin
    9.   ComboBox1.Items.AddObject('AAA', TObject(100));
    10.   ComboBox1.Items.AddObject('BBB', TObject(101));
    11.   ComboBox1.Items.AddObject('AAA', TObject(102));
    12.   ComboBox1.Items.AddObject('BBB', TObject(103));
    13. end;

    Mocht je overigens wél met objecten willen werken, heb dan in de gaten dat de combobox geen eigendom van die objecten neemt. Oftewel je moet dan handmatig zorg dragen voor het tijdelijk vrijgeven van die objecten.
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  8. #8
    Hmm. Gek, heb gedaan wat je schreef, maar het ID blijft altijd 0 onder de combobox change
    Heb het veranderd naar Titel, want dan zou ik gewoon de string moeten zien.


    Code:
    procedure TForm2.comboboxEnter(Sender: TObject);
    var
      S: String;
      Id: string; 
    
    begin
    combobox.Clear;
    query.SQL.Text := 'select appname,purchased from purchased UNION ALL select appname,purchased from downloaded order by appname';
    query.Open;
    query.first;
    while not query.eof do
      begin
        S  := query.FieldByName('appname').Asstring;
        Id := query.FieldByName('titel'').Asstring;
        combobox.Items.AddObject(S, TObject(Id);
       query.next;
      end;
    query.Close;
    end;
    
    
    procedure TForm2.comboboxChange(Sender: TObject);
    var
    Id : integer;
    begin
    
    Id := combobox.Items.IndexOf(selectscript.Text);    // Denk dat het hier fout gaat, omdat die de naam als 0 ziet, als ik de 2e selecteer..   maar kan het mis hebben?
    //  Id := Integer(combobox.Items.Objects[Id]);
    showmessage(combobox.Items.Objects[Id]);
    end;

    in de combobox heb ik momenteel

    Jan Klaasen (zou ID 0 moeten zijn?)
    Jan Klaasen (zou ID 1 moeten zijn?)

  9. #9
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    Oké, even een paar stapjes terug.

    Allereerst, de Id waarmee je de ComboBox vult heb je gedeclareerd als String. Een string is níet compatible met een TObject en je kunt hem daar dan ook niet naar typecasten. (Een discussie over dat dit vaak wel lukt valt even buiten dit topic).

    Oftewel, er vanuit gaande dat Query.FieldByName('titel').AsString resulteert in een getal, dan zou jouw ComboBoxEnter routine er als volgt uit moeten zien:

    Delphi Code:
    1. procedure TForm2.ComboBoxEnter(Sender: TObject);
    2. var
    3.   S: String;
    4.   Id: Integer;
    5. begin
    6.   ComboBox.Clear;
    7.   Query.SQL.Text := 'select appname, purchased from purchased UNION ALL select appname, purchased from downloaded order by appname';
    8.   Query.Open;
    9.   Query.First;
    10.   while not Query.Eof do
    11.   begin
    12.     S := Query.FieldByName('appname').AsString;
    13.     Id := Query.FieldByName('purchased').AsInteger;
    14.     ComboBox.Items.AddObject(S, TObject(Id));
    15.     Query.Next;
    16.   end;
    17.   Query.Close;
    18. end;

    Vervolgens, betreffende het vaststellen van welke Id je nu hebt gekozen in de ComboBox: merk op dat de code in post #7 gebruik maakt van:
    - het OnSelect event om te reageren op een gemaakt keuze in de ListBox. In tegenstelling tot het OnChange event dat alleen optreedt bij wijzigingen in de EditBox.
    - de ItemIndex die die Index van het gekozen item van de ListBox weergeeft. Die is dus altijd uniek, in tegenstelling tot de verkregen waarde met IndexOf(), want als er dezelfde teksten zijn, dan wordt altijd alleen de eerste gevonden.

    Dus jouw code zou er als volgt uit kunnen zien:
    Delphi Code:
    1. procedure TForm2.ComboBoxSelect(Sender: TObject);
    2. var
    3.   Index: Integer;
    4.   Id: Integer;
    5. begin
    6.   Index := ComboBox.ItemIndex;
    7.   if Index >= 0 then
    8.   begin
    9.     Id := Integer(ComboBox.Items.Objects[Index]);
    10.     Caption := IntToStr(Id);
    11.   end;
    12. end;
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  10. #10
    Senior Member Wok's Avatar
    Join Date
    Dec 2002
    Location
    Alkmaar
    Posts
    2,085
    Met een DBlookupcombobox heb je toch alles wat je nodig heb, het display field kan een ander veld, en het id veld gebruiken als key veld.
    10.4.2, Delphi2010, of Lazarus 2.2.0

  11. #11
    Hartelijk dank. Het werkt nu.
    Geen idee wat ik fout deed ervoor.
    Nu nog uitzoeken waarom my int 1 veranderd in 76429824
    Maar denk dat ik weet waarom, omdat het een Boolean was. Moet ik nog even aanpassen.

  12. #12
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Quote Originally Posted by Wok View Post
    Met een DBlookupcombobox heb je toch alles wat je nodig heb, het display field kan een ander veld, en het id veld gebruiken als key veld.
    Een DBLookupcomobox is een combinatie van twee tabellen waar een key een waarde vertegenwoordigd waarvan de string wordt getoond. In zijn voorbeeld is er maar 1 tabel.
    Delphi is great. Lazarus is more powerfull

  13. #13
    Quote Originally Posted by jkuiper View Post
    Een DBLookupcomobox is een combinatie van twee tabellen waar een key een waarde vertegenwoordigd waarvan de string wordt getoond. In zijn voorbeeld is er maar 1 tabel.
    Nee hoor. TDBLookupcomobox kan ook prima in unbound versie gebruikt worden (waar maar 1 tabel voor nodig is. In ieder geval in Lazarus maar ik neem ook aan in Delphi)

    Dan heb je in ieder geval geen gedoe met die casting van object.

  14. #14
    Senior Member Wok's Avatar
    Join Date
    Dec 2002
    Location
    Alkmaar
    Posts
    2,085
    John : in zijn eerste post de bovenste regel staat: ik heb een lijst met bv. dit van 2 tables. en die heb ik gecombineerd met een UNION query.

    maar ook met 1 tabel zou het kunnen, lees ik net :-)
    10.4.2, Delphi2010, of Lazarus 2.2.0

  15. #15
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    Kanttekening: Union <> Foreign key. (Een union koppelt tabellen niet, maar telt ze bij elkaar op).
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

Page 1 of 2 1 2 LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •