Toon posts:

[Delphi] Integer waarde opslaan in object van TStrings

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

Verwijderd

Topicstarter
Ik moet in de Items van een combobox per item 2 waarden opslaan.

1. De naam die in de lijst zichtbaar is
2. Het ID

Nu vul ik de combobox als volgt:

code:
1
        AddObject(FieldByName('EENHEIDOMSCHRIJVING').AsString, TObject(FieldByName('EENHEIDID').AsInteger));


Maar het probleem is dat ik met de functie IndexOfObject niet de goede index terug krijg:

code:
1
        cmbbx_Eenheid.ItemIndex := cmbbx_Eenheid.Items.IndexOfObject(TObject(FieldByName('ARTIKELEENHEIDID').AsInteger));


Wat doe ik verkeerd?

  • whoami
  • Registratie: December 2000
  • Laatst online: 13:00
Ik zou het niet weten.... Op 't eerste zicht ziet de code er goed uit.

gebruik je die statements in een with statement? Ben je dan wel zeker dat je de goede DataSet gebruikt?
Kan een ID meerdere keren voorkomen in die combobox?

https://fgheysels.github.io/


  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 31-08 21:58

Delphi32

Heading for the gates of Eden

Ik zie zo niets geks aan wat je doet. Zo doe ik het ook altijd.
Je zal ff moeten tracen:
-welke id's en omschrijvingen je in de combo zet,
-wat de id is waarvan je de IndexOfObject wilt hebben,
-welke ItemIndex en string dat volgens jou moeten zijn,
-en welke ItemIndex de IndexOfObject functie oplevert.

Verwijderd

Topicstarter
De combobox wordt goed gevuld. Ik vraag vervolgens de index van een object op (integer waarde 51) die aanwezig is in de combobox.

Maar ik krijg dan een List Index out of bounds.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Ziet er inderdaad goed uit...niet netjes....maar zou moeten werken zo op het eerste gezicht...

Je moet gewoon meer debuggen. Trace anders gewoon eens in de TStrings.IndexOfObject...
Of zoek eens zelf handmatig ipv IndexOfObject

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
De 2e regel veroorzaakt al een error

code:
1
2
        Test1 := FieldByName('ARTIKELEENHEIDID').AsInteger;
        Test2 := cmbbx_Eenheid.Items.IndexOfObject(TObject(Test1));


Ik snap er echt niks meer van. Ik vraag daar alleen maar een waarde op :?

(Test1 is 51 en die is aanwezig in de combobox)

  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 31-08 21:58

Delphi32

Heading for the gates of Eden

List Index out of Bounds: welk nummer geeft ie aan?

Ik heb hier deze code:
code:
1
2
3
4
5
6
7
8
9
10
procedure TForm1.Button1Click(Sender: TObject);
var
  test1, test2: integer;
begin
  test1 := 51;
  Combobox1.Items.AddObject('test51', TObject(test1));

  test2 := 51;
  ShowMessage(IntToStr(Combobox1.Items.IndexOfObject(TObject(test2))));
end;


en die doet het gewoon. Combobox1 is btw een TCombobox, standaard dus. Kan jij deze code eens proberen? Gebruik je een TCombobox of een ander?

De ListIndex error krijg je in TStringList.GetObject:
code:
1
if (Index < 0) or (Index >= FCount) then Error(@SListIndexError, Index);

en deze wordt aangeroepen door TStrings.IndexOfObject:
code:
1
2
3
  for Result := 0 to GetCount - 1 do
    if GetObject(Result) = AObject then Exit;
  Result := -1;

Het is, als je zeker weet dat de Items in de TCombobox van TStringList zijn afgeleid en niet van TStrings, onmogelijk om met IndexOfObject een Index Out of bounds te krijgen.

Verwijderd

TComboBox maakt gebruikt van TComboBoxStrings die afgeleid is van TStrings en niet van TStringList. [Delphi 6]

Je moet er geen -1 instoppen, vindt Delphi niet zo leuk.

Probeer dit maar eens:
code:
1
2
3
4
  ComboBox1.Items.AddObject('Fiets', TObject(1));
  ComboBox1.Items.AddObject('Hoi', TObject(-1));
  ComboBox1.Items.AddObject('Auto', TObject(5));
  ShowMessage(IntToStr(ComboBox1.Items.IndexOfObject(TObject(5))));

edit:

Iets preciezer

  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 31-08 21:58

Delphi32

Heading for the gates of Eden

Verwijderd schreef op 06 augustus 2002 @ 00:01:
TComboBox maakt gebruikt van TComboBoxStrings die afgeleid is van TStrings en niet van TStringList. [Delphi 6]
Ach! Helaas heb ik de source van Delphi6 hier nog niet beschikbaar.. gaat mn hele verhaal hierboven niet meer op |:(
Ik kijk morgen op mn werk even.Ik heb even op mn werk gekeken.

Delphi5 had dit in TStringList.GetObject:
code:
1
if (Index < 0) or (Index >= FCount) then Error(@SListIndexError, Index);


Delphi6 doet dit als volgt in TCustomComboboxStrings.GetObject:
code:
1
2
3
  Result := TObject(SendMessage(ComboBox.Handle, CB_GETITEMDATA, Index, 0));
  if Longint(Result) = CB_ERR then
    Error(SListIndexError, Index);


CB_ERR is, u raadt het al, een integer met de constante waarde -1. Als je dus een integer in de itemdata stopt met de waarde -1, krijgt de GetObject functie het idee dat er iets mis is gegaan :)

Dus, mijn waarde topicstarter, de hamvraag voor vegetariërs heb ik ook een kaasvraag: Is er toevallig in jouw lijstje een string waarbij de ID -1 hoort? Zo ja, dan is dat jouw probleem en mag je daar een andere oplossing voor verzinnen :)

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

code:
1
2
3
4
5
6
function TComboBoxStrings.GetObject(Index: Integer): TObject;
begin
  Result := TObject(SendMessage(ComboBox.Handle, CB_GETITEMDATA, Index, 0));
  if Longint(Result) = CB_ERR then
    Error(SListIndexError, Index);
end;

En je raad het nooit: CB_ERR = -1
Dus alle getallen werken, alleen -1 zal nooit werken in een combobox. Omdat het GetObject is dat het probleem veroorzaakt zal je nooit ook een Object kunnen opvragen uit de collectie.

Een TStringList raakt niet in de war van -1.

We adore chaos because we like to restore order - M.C. Escher


  • whoami
  • Registratie: December 2000
  • Laatst online: 13:00
LordLarry schreef op 06 augustus 2002 @ 09:25:
code:
1
2
3
4
5
6
function TComboBoxStrings.GetObject(Index: Integer): TObject;
begin
  Result := TObject(SendMessage(ComboBox.Handle, CB_GETITEMDATA, Index, 0));
  if Longint(Result) = CB_ERR then
    Error(SListIndexError, Index);
end;

En je raad het nooit: CB_ERR = -1
Dus alle getallen werken, alleen -1 zal nooit werken in een combobox. Omdat het GetObject is dat het probleem veroorzaakt zal je nooit ook een Object kunnen opvragen uit de collectie.

Een TStringList raakt niet in de war van -1.


Geldt dit dan enkel voor Delphi 6?

https://fgheysels.github.io/


  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 31-08 21:58

Delphi32

Heading for the gates of Eden

tjee ik ga nog es editen... tijdens mijn edit 3 posts |:(

Whoami: ja, alleen D6

Verwijderd

Topicstarter
Ik vul inderdaad in de comboboxen -1. Normaal gesproken staat er de naam in en het id van dat record. Nu heb ik er ook een optie in staan: Onbekend en daar had ik als ID -1 aan toegekend. Maar dat mag dus blijkbaar niet.

Ik heb er nu -2 van gemaakt

Bedankt.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Nee, niet alleen D6. Die code die ik gaf kwam uit D5. Dit geldt voor alle Delphi versies. Het is namelijk de schuld van de windows API:
http://msdn.microsoft.com...ssages/cb_getitemdata.asp

[ Voor 0% gewijzigd door LordLarry op 06-08-2002 12:05 . Reden: eigenlijk geen schuld, het is de misbruik die niet altijd werkt ]

We adore chaos because we like to restore order - M.C. Escher


  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 31-08 21:58

Delphi32

Heading for the gates of Eden

Stom van me, ben er blindelings vanuit gegaan dat de Items in TCombobox van D5 van type TStringList waren |:(
LordLarry, _/-\o_ voor je uitzoekwerk!

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

hehe, dankje :D

We adore chaos because we like to restore order - M.C. Escher

Pagina: 1