[Delphi] Database + combobox

Pagina: 1
Acties:
  • 109 views sinds 30-01-2008
  • Reageer

  • maikel
  • Registratie: Januari 2001
  • Laatst online: 04-09 16:24
Ik moet in een programma een lijst van produkten weergeven na een selectie van een merk.
Nu kan ik wel heel simpel een Combobox vullen met allen merken, maar als ik dan een lijst wil opvragen van alle produkten van dat merk, heb ik wel het ID nodig.
En dat ID staat weer niet in die Combobox.

Hoe kan ik dit nou het handigst oplossen ?

Ik heb ook al even zitten klooien met zo'n DBCombobox, maar die laat maar 1 record zien. Dan moet ik dmv een extra button of zo naar het volgende record. Maar waarom heb ik dan nog zo'n Combobox ?? :?

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:11
Hmm, een TDBComboBox die maar 1 record laat zien? Zeeeeer vreemd.

Je kan, als je het bij een gewone TListBox wilt houden gebruik maken van de functie AddObject ipv de Add functie.

dus bv:
code:
1
2
3
4
5
while not qryTest.Eof do begin
  ComboBox1.Items.AddObject( qryTest.FieldByName('naam').AsString,
                     TObject(qryTest.FieldByName('ID').AsInteger));
   qryTest.Next();
end;

Dan heb je per Item het ID in de Object property zitten.

https://fgheysels.github.io/


  • maikel
  • Registratie: Januari 2001
  • Laatst online: 04-09 16:24
Thnx.

Maar hoe vraag ik 'm dan weer op ?
Ik heb al geprobeerd met:
List.Items.AddObject(Query.Fields.FieldByName('Name').AsString, TObject(Query.Fields.FieldByName('ID')));

en dan daarna:
strID := TField(List.Items.Objects[i]).AsString;

Maar dan is strID bij elke waarde van 'i' altijd '3' (het ID van het laatste record).

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:11
code:
1
i := Integer(ComboBox.Objects[i]);

of iets dergelijks.

Vreemd, heb het al veel toegepast en werkte altijd.

https://fgheysels.github.io/


  • maikel
  • Registratie: Januari 2001
  • Laatst online: 04-09 16:24
Op woensdag 05 juni 2002 22:26 schreef whoami het volgende:
code:
1
i := Integer(ComboBox.Objects[i]);

of iets dergelijks.

Vreemd, heb het al veel toegepast en werkte altijd.
Dan geeft ie bij mij 'Undeclared identifier: 'Objects''.

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:11
Tja, ik tik het hier zomaar uit m'n blote hoofd natuurlijk.

Dan is het misschien iets als
code:
1
combobox.items.objects

ofzo.

https://fgheysels.github.io/


  • maikel
  • Registratie: Januari 2001
  • Laatst online: 04-09 16:24
Op woensdag 05 juni 2002 22:29 schreef whoami het volgende:
Tja, ik tik het hier zomaar uit m'n blote hoofd natuurlijk.

Dan is het misschien iets als
code:
1
combobox.items.objects

ofzo.
Ja, maar dan krijg ik dus weer die waarden die niet kloppen.

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:11
Ben je wel zeker dat je de goede waarden er iedere keer instopt?
Ben je ook zeker dat jouw query de goede waarden oplevert?

https://fgheysels.github.io/


  • maikel
  • Registratie: Januari 2001
  • Laatst online: 04-09 16:24
Het vullen doe ik door:
code:
1
2
3
4
5
6
while not Query.Eof do
begin
    ID := String(Query.Fields.FieldByName('ID').AsString);
    List.Items.AddObject(Query.Fields.FieldByName('Name').AsString, TObject(ID));
    Query.Next;
end;

Als ik daar in de debugger doorheen loop, zie ik dat ID steeds de juiste waarde krijgt.
Maar bij het uitlezen met
code:
1
2
3
4
for i:=0 to BrandsList.Items.Count-1 do
begin
    str := String(BrandsList.Items.Objects[i]);
end;

zie ik al dat hij _hele_ vage waarden krijgt zoals:
'Merk 2'#0#0#$10'-Í'#0#$1C#0#0#0#$1B#0#0#0#0'yÍ'#0#8'=Í'#0
vervolgens:
'Merk 3'
en tot slot:
'3'.

Verwijderd

Voeg AsInteger toe:
code:
1
2
3
  List.Items.AddObject(
    Query.Fields.FieldByName('Name').AsString, 
    TObject(Query.Fields.FieldByName('ID').AsInteger));

Opvragen:
code:
1
2
3
4
5
var
  Waarde: Integer;
begin
  Waarde := Integer(List.Items.Objects[i]);
end;

  • maikel
  • Registratie: Januari 2001
  • Laatst online: 04-09 16:24
Hmmm, nu werkt het wel.
Alleen geeft ie bij het 'inspecten' een vage melding waardoor ie ze niet kan laten zien.

Delphi was altijd m'n favoriete programmeertaal, maar sinds ik C# ken begint dat toch te veranderen. :)

Kan dit trouwens ook met andere objecten zoals bijv. Query.Fields ?
Want wat verder in m'n programma heb ik meer gegevens nodig dan alleen het ID.
Of moet ik dan gewoon opnieuw zo'n query runnen ??

Verwijderd

Een TObject is een pointer, dit is een getal van 4 bytes die een bepaalde geheugenlocatie aanduidt.

Je kunt er natuurlijk ook elke willekeurige waarde van 4 bytes erin zetten;

De volgende typen zijn 4 bytes groot: Cardinal, Integer, Pointer, array[0..3] of Char, pointer naar instance van een class etc.

Je zou er ook een string in kunnen zetten, dwz een PChar, dus een pointer naar een geheugenlocatie waar dan een string staat.
Je moet dan wel geheugenbeheer doen, zodat de string niet weggegooid wordt.

Vb:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var
  MyObject: TObject;
  i: Integer;
  List: TList;
begin
  { Stop de integer 1 (=4 bytes) in MyObject }
  MyObject := TObject(1);

  { Typecast naar integer }
  i := Integer(MyObject);

  { Stop een instance van TList in MyObject }
  MyObject := TObject(TList.Create);

  { Typecast naar TList }
  List := TList(MyObject);
  List.Free;
end;

Je kunt natuurlijk ook Query.Fields in List.Items.Objects[i] zetten; Om er gebruik van te maken moet je dan wel de Query openen, maar dat bedoel je geloof ik niet :)

[edit]
Voorbeeld toegevoegd

  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 21:10

Delphi32

Heading for the gates of Eden

In veel gevallen is de oplossing met een normale TCombobox waarin je de tekst + ID van het weer te geven object zet een zeer valide oplossing. Dit vereist echter wat meer werk, maar daar staat flexibiliteit tegenover.
De simpelste oplossing is het gebruik van de TDBLookupCombobox. Deze stelt je in staat om een veld in je dataset te editen door gebruik te maken van een tweede dataset (de LookupSource). Je maakt dan een TQuery die ID en naam van de op te zoeken items levert en hangt die aan de TDBLookupCombobox. Zorg dat je query open is als je je record wilt bewerken en hop, klaar.

Zit een klein onhandigheidje aan maar ontdek dat zelf maar... meestal is er wel mee te leven :)

  • maikel
  • Registratie: Januari 2001
  • Laatst online: 04-09 16:24
Op donderdag 06 juni 2002 00:37 schreef Delphi32 het volgende:
In veel gevallen is de oplossing met een normale TCombobox waarin je de tekst + ID van het weer te geven object zet een zeer valide oplossing. Dit vereist echter wat meer werk, maar daar staat flexibiliteit tegenover.
De simpelste oplossing is het gebruik van de TDBLookupCombobox. Deze stelt je in staat om een veld in je dataset te editen door gebruik te maken van een tweede dataset (de LookupSource). Je maakt dan een TQuery die ID en naam van de op te zoeken items levert en hangt die aan de TDBLookupCombobox. Zorg dat je query open is als je je record wilt bewerken en hop, klaar.

Zit een klein onhandigheidje aan maar ontdek dat zelf maar... meestal is er wel mee te leven :)
Daar had ik dus ook al naar gekeken, maar ik kreeg in m'n DBComboBox slechts 1 record te zien.
Pas als ik dmv een extra button een record verder ging, veranderde de DBComboBox naar het volgende record. Maar ik had daar dus geen volledige lijst in zitten. :?

  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 21:10

Delphi32

Heading for the gates of Eden

Op donderdag 06 juni 2002 09:43 schreef maikel het volgende:

[..]

Daar had ik dus ook al naar gekeken, maar ik kreeg in m'n DBComboBox slechts 1 record te zien.
Pas als ik dmv een extra button een record verder ging, veranderde de DBComboBox naar het volgende record. Maar ik had daar dus geen volledige lijst in zitten. :?
Kijk nogmaals naar het type combo dat je hebt gebruikt, er zit een fundamenteel verschil tussen TDBLookupCombobox en TDBCombobox... wat jij beschrijft is TDBCombobox gedrag.

  • maikel
  • Registratie: Januari 2001
  • Laatst online: 04-09 16:24
Op donderdag 06 juni 2002 12:26 schreef Delphi32 het volgende:

[..]

Kijk nogmaals naar het type combo dat je hebt gebruikt, er zit een fundamenteel verschil tussen TDBLookupCombobox en TDBCombobox... wat jij beschrijft is TDBCombobox gedrag.
Hmmmm, daar lag het dus inderdaad aan ja. |:(
Maar hoe gebruik ik die dingen nu verder ?
Hoe zorg ik dat een tweede Combobox gevuld wordt met gegevens die bij het geselecteerde horen ?
In de demo's die bij Delphi zitten kon ik niks vinden.

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 22:44

Tomatoman

Fulltime prutser

Ga in Delphi naar het help-onderwerp 'TDBLookupComboBox' en klik daar op 'Using TDBLookupComboBox'. Daar staat precies uitgelegd wat je zoekt.

Een goede grap mag vrienden kosten.


  • maikel
  • Registratie: Januari 2001
  • Laatst online: 04-09 16:24
Op donderdag 06 juni 2002 23:32 schreef tomatoman het volgende:
Ga in Delphi naar het help-onderwerp 'TDBLookupComboBox' en klik daar op 'Using TDBLookupComboBox'. Daar staat precies uitgelegd wat je zoekt.
Ah, nu lukt het me wel.
Ik zat een beetje verkeerd te denken met die DataSource en ListSource en zo.
Maar is het ook mogelijk de tweede ComboBox te filteren ?
Nu worden alleen de van toepassing zijnde gegevens geselecteerd, maar ik wil dus dat de rest niet eens zichtbaar is.
Pagina: 1