Results 1 to 15 of 15

Thread: dbcombo

  1. #1
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382

    dbcombo

    Wat is eigenlijk de makkelijkste manier om een DBCombo waardes te laten weergeven voor een database integer veld?
    BIjvoorbeeld: maandnummer -> maandnamen.
    Deze waarden komen niet uit een lookupdataset. Hoe terug te vertalen vanaf de combo.

    Groet!

  2. #2
    Wat bedoel je? Wil je een combo waar je als value een integer geeft, welke als tekst de maand naam weergeeft? Dan zou je zoiets zelf toch kunnen maken, denk niet dat dit zo moeilijk is

  3. #3
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    Mijn dataset bevat een int waarde van 1..12.
    Ik zou niet weten hoe ik een (normale) DBCombo zou moeten maken die de maandnamen laat zien en het int veld ook kan bewerken.

  4. #4
    Een eigen componenten schrijven op basis van dbcombo? Tis dat ik weinig tijd heb ander maakte ik er een voor je. Of op basis van gewone combo, en itemindex als waarde updaten

  5. #5
    Ik maak dan gebruik van een TDBLookupComboBox in combinatie met een TClientDataset (memory dataset) die ik daarvoor in een aparte routine vul met de gewenste gegevens.

    Ik zal hieronder even een kort stukje uit mijn programmatuur geven. Dan hoef je zelf niet te knutselen.

    Gerbuik is met dit:
    Delphi Code:
    1. var
    2.   JvRegels: TClientDataset;
    3.   srRegels: tDataSource;
    4.   Edit2: TDBLookupComboBox;
    5. // ...
    6.  
    7. CreateSysTabel(Self, srRegels, JvRegels);
    8. if (uppercase(Field) = 'MAAND') then LoadSysTabel('Maanden', JvRegels);
    9.  
    10. Edit2 := TDBLookupComboBox.Create(Box1);
    11. Edit2.Parent := Box1;
    12. Edit2.DataSource := pgs;
    13. Edit2.DataField := Field;
    14. Edit2.Name := 'e_' + Field;
    15. Edit2.ListSource := srRegels;
    16. Edit2.DropDownRows := 40;
    17. Edit2.KeyField := 'ID';
    18. Edit2.ListField := 'Naam';

    Unit die ik dan gebruik:
    Delphi Code:
    1. unit systab;
    2.  
    3. interface
    4.  
    5. uses Classes, DB, DBClient;
    6.  
    7. procedure CreateSysTabel(AOwner: TComponent; var srRegels: TDataSource; var JvRegels: TClientDataset);
    8. procedure LoadSysTabel(Soort: string; JvRegels: TClientDataset);
    9.  
    10. implementation
    11.  
    12. uses
    13.   SysUtils;
    14.  
    15. procedure CreateSysTabel(AOwner: TComponent; var srRegels: TDataSource; var JvRegels: TClientDataset);
    16. begin
    17.   JvRegels := TClientDataset.Create(AOwner);
    18.   srRegels := TDataSource.Create(AOwner);
    19.   srRegels.DataSet := JvRegels;
    20.   JvRegels.FieldDefs.Add('ID', ftInteger);
    21.   JvRegels.FieldDefs.Add('Naam', ftString, 50);
    22.   JvRegels.CreateDataSet;
    23.   JvRegels.Open;
    24. end;
    25.  
    26. procedure LoadSysTabel(Soort: string; JvRegels: TClientDataset);
    27. var
    28.   wd: Integer;
    29.  
    30.   procedure VulPickTitle(Value: string);
    31.   begin
    32.   end;
    33.  
    34.   procedure VulPickItem(I: Integer; S: string; E: String = '');
    35.   begin
    36.     S := Trim(S);
    37.     JvRegels.Append;
    38.     JvRegels.Fieldbyname('ID').AsInteger := I;
    39.     JvRegels.Fieldbyname('Naam').AsString := S;
    40.     if Length(S) > wd then wd := Length(S);
    41.     JvRegels.Fieldbyname('Naam').DisplayWidth := wd;
    42.     JvRegels.Post;
    43.   end;
    44.  
    45. begin
    46.   wd := 10;
    47.   Soort := uppercase(Soort);
    48.   if Soort = 'MAANDEN' then
    49.   begin
    50.     VulPickTitle('Maanden');
    51.     VulPickItem(1, 'Januari');
    52.     VulPickItem(2, 'Februari');
    53.     VulPickItem(3, 'Maart');
    54.     VulPickItem(4, 'April');
    55.     VulPickItem(5, 'Mei');
    56.     VulPickItem(6, 'Juni');
    57.     VulPickItem(7, 'Juli');
    58.     VulPickItem(8, 'Augustus');
    59.     VulPickItem(9, 'September');
    60.     VulPickItem(10, 'Oktober');
    61.     VulPickItem(11, 'November');
    62.     VulPickItem(12, 'December');
    63.   end;
    64. end;
    65.  
    66. end.

    Verstandig is om in je programma.dpr dan ook dit op te nemen zodat de dll automatisch geïntegreerd wordt in je programma.
    Delphi Code:
    1. uses
    2.   MidasLib, // etc ...

  6. #6
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    FireDAC hier, maar op hetzelfde idee gekomen :-)
    Memory lookup dataset. Thanks

  7. #7
    PS. Dit zou ook nog een optie kunnen zijn
    https://stackoverflow.com/a/3969560/1037511

    met een TDictionary<string, Int64> in plaats van een TDictionary<string, Char>.
    Maar dat is dan een TComboBox en geen TDBComboBox.

  8. #8
    Netjes man..

  9. #9
    Senior Member Wok's Avatar
    Join Date
    Dec 2002
    Location
    Alkmaar
    Posts
    2,085
    @Eric is dit wat je zoekt ?
    @Rik is dat niet heel veel code ?

    Sysutils.LongMonthNames[1..12] geeft gewoon de maand (januari.. december)

    en voor de liefhebber bestaat er ook en korte versie

    Sysutils.ShortMonthNames[1..12] geeft gewoon de maand (jan..dec)

    Doe er je voordeel mee
    Peter
    10.4.2, Delphi2010, of Lazarus 2.2.0

  10. #10
    Quote Originally Posted by Wok View Post
    Sysutils.LongMonthNames[1..12] geeft gewoon de maand (januari.. december)
    De bedoeling is dat de gebruiker een pull-down edit heeft met deze maanden en dat dan het maand nummer in een veld in de database komt. Dan heb je alleen aan LongMonthNames niet zo veel. Je kunt die natuurlijk wel gebruiken i.c.m. met mijn code in de vulpickitem ().

  11. #11
    Senior Member Wok's Avatar
    Join Date
    Dec 2002
    Location
    Alkmaar
    Posts
    2,085
    Een combobox (of lookup) vullen met deze waarden en je itemindex (of je key) geeft het maandnummer

    Delphi Code:
    1. var
    2.   I: Integer;
    3. begin
    4.     for I := 1 to 12 do
    5.       ComboBox1.Items.Add(longMonthnames[i]);
    6. end;
    Last edited by Wok; 17-Nov-17 at 01:13.
    10.4.2, Delphi2010, of Lazarus 2.2.0

  12. #12
    Dat dacht ik zelf ook inderdaad ..

  13. #13
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    @Reidinga: ik heb het (nu even) opgelost met een memtable

  14. #14
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    @WOK / @Reidinga,

    De integerwaarde moet ook weer terugkomen in de database.
    Ik gebruik ongeveer de zelfde manier als Rik. Ik heb 1 tabel met defaultwaarden en sleutels. Vandaar uit vul ik een memtable en koppel deze aan een DBLookupcombobox.
    Delphi is great. Lazarus is more powerfull

  15. #15
    Tevens hoeven met een memtable de waardes niet opvolgend te zijn. Je hebt ook veel betere controle over de volgorde. Je kunt wel weer met een array van records werken waar de nummers in staan en die bij OnChange uitlezen maar TDBLookupCombobox heeft eigenlijk ook meer voordelen boven een simpele TCombobox (zoals direct connected te zijn met de dataset en zo ook goed te reageren op Edit/Read only e.d.).

    Zeker als je er een klein framework van gemaakt hebt is het veel makkelijker te gebruiken. Als het om één TCombobox gaat dan kun je de simpele methode wel gebruiken maar die werkt dus niet helemaal hetzelfde met de interactie met de dataset.

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
  •