Autor Téma: Combobox.items.objects  (Přečteno 527 krát)

Offline Sat1

  • Nováček
  • *
  • Příspěvků: 19
  • Karma: 0
Combobox.items.objects
« kdy: 15-04-2017, 15:06:04 »
Dobry den,
presel jsem na lazarus z delphi a jsem trosku nestastny.
Z delphi jsem byl zvykly do comboboxu nacist polozky z db a jako object si pridat jejich ID.
Kód: [Vybrat]
     while not IBQuery1.EOF do begin
     combobox1.Items.AddObject(IBQuery1.fieldbyname('NAZEV').AsString,TObject(IBQuery1.fieldbyname('ID').AsInteger));
     IBQuery1.Next;
     end;
Zde tedy rozdil prvni: add_zaznam.pas(67,78) Error: Illegal type conversion: "LongInt" to "TObject"
ale OK, misto .AsInteger pouziju .AsString a nacte se to.
Ted ale problem c. 2 a s tim se tu peru uz ctyri hodiny.
Vycteni ID, tedy hodnoty TObject z tohoto comboboxu:
Kód: [Vybrat]
ShowMessage(String(ComboBox1.Items.Objects[ComboBox1.ItemIndex]));Vzdy se zobrazi hodnota 52, co je posledni ID v databazi. Stejnou hodnotu dostanu ikdyz zadam itemindex rucne treba 1.
Stejneho vysledku dosahnu ikdyz si nandam data do CB rucne, vzdy to ukaze posledni hodnotu.
Zacinam z toho byt sileny, prosim o pomoc.

Offline vandrovnik

  • Hrdina
  • ****
  • Příspěvků: 289
  • Karma: 17
    • Verze Delphi: 10.2
Re:Combobox.items.objects
« Odpověď #1 kdy: 15-04-2017, 16:07:31 »
Nešlo by použít pointer místo tObject?

Offline Sat1

  • Nováček
  • *
  • Příspěvků: 19
  • Karma: 0
Re:Combobox.items.objects
« Odpověď #2 kdy: 15-04-2017, 16:09:27 »
To nevim, protoze naprosto netusim o co jde. Potrebuji kdyz vyberu polozku z comboboxu zjistit jeji ID. Na itemindex se spolehat nechci, precijen muze nastat situace, ze rada nebude souvisla.

Offline vandrovnik

  • Hrdina
  • ****
  • Příspěvků: 289
  • Karma: 17
    • Verze Delphi: 10.2
Re:Combobox.items.objects
« Odpověď #3 kdy: 15-04-2017, 16:12:38 »
Když už jsem (v Delphi) něco takového dělal, používal jsem AddObject(Nazev, pointer(Id)), přičemž Id bylo integer. Je to hádám jedna z věcí, které se nebudou mít rády s překladem do 64 bitů.

Pro čtení by pak mělo jít podobně integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex]) a ošetřit si samozřejmě situaci, kdy ItemIdex<0.

Offline Sat1

  • Nováček
  • *
  • Příspěvků: 19
  • Karma: 0
Re:Combobox.items.objects
« Odpověď #4 kdy: 15-04-2017, 16:39:53 »
Tak tady bohuzel koncim jeste driv nez to nactu do CB
Kód: [Vybrat]
CheckListBox1.Items.AddObject(Form1.SQLQuery1.fieldbyname('NAZEV').AsString,Pointer(Form1.SQLQuery1.fieldbyname('ID')));konci chybou: add_zaznam.pas(118,135) Error: Incompatible type for arg no. 2: Got "Pointer", expected "TObject"
Kdyz to dam
Kód: [Vybrat]
CheckListBox1.Items.AddObject(Form1.SQLQuery1.fieldbyname('NAZEV').AsString,Pointer(Form1.SQLQuery1.fieldbyname('ID').AsInteger));dostanu chybu:
add_zaznam.pas(118,93) Warning: Conversion between ordinals and pointers is not portable.
add_zaznam.pas(118,145) Error: Incompatible type for arg no. 2: Got "Pointer", expected "TObject"

Jeste takova otazka mimo - co je to largeinteger? Long chapu, ale large nejak ne a nic jsem nenasel.

Offline vandrovnik

  • Hrdina
  • ****
  • Příspěvků: 289
  • Karma: 17
    • Verze Delphi: 10.2
Re:Combobox.items.objects
« Odpověď #5 kdy: 15-04-2017, 17:25:42 »
Tak to přetypování v Lazarusu bohužel nepomohu...

LargeInt bude nejspíš int64, tj. 8 bajtů v paměti, alespoň teda v Delphi.

Offline Sat1

  • Nováček
  • *
  • Příspěvků: 19
  • Karma: 0
Re:Combobox.items.objects
« Odpověď #6 kdy: 15-04-2017, 18:09:53 »
Tak hlavni kamen urazu je patrne v 64-bitove verzy. Nainstaloval jsem si klasickou 32-bit verzi lazarusu, pretipoval na .asinteger a uz to jede.... pul dne v pr...... kvuli takove kravine.

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 710
  • Karma: 43
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:Combobox.items.objects
« Odpověď #7 kdy: 15-04-2017, 18:20:51 »
Excellent
Rated 1 time
Toto je správně i pro 64bit ;):

Kód: [Vybrat]
CheckListBox1.Items.AddObject(Form1.SQLQuery1.fieldbyname('NAZEV').AsString,TObject(NativeInt(Form1.SQLQuery1.fieldbyname('ID').AsInteger)));
Embarcadero Technology Partner, juj. Člen Lazarus týmu, oj.

Offline Sat1

  • Nováček
  • *
  • Příspěvků: 19
  • Karma: 0
Re:Combobox.items.objects
« Odpověď #8 kdy: 15-04-2017, 18:25:36 »
Potvrzuji, toto opravdu funguje i pod 64bit verzi. Diky

Offline raul

  • Plnoletý
  • ***
  • Příspěvků: 175
  • Karma: 10
    • Verze Delphi: FPC :D
Re:Combobox.items.objects
« Odpověď #9 kdy: 16-04-2017, 01:59:37 »
Proc 52 ? Safra, tesne vedle, melo to byt 42..

Proc tedy 52 ? Vcelku logicky, ukladas si totiz pointer na vystupni hodnotu toho AsInteger a ta vcelku logicky se iteraci meni a zustane tam posledni.
Prevedeni na NativeInt jako udelal oxo zmeni pointer mezi kazdym volanim (neni to property).

Otazka na zaver - rikam zde pravdu, nebo matu nepritele ?
Lazarus 1.6.3:), FPC, Intel/Arm, Windows/Linux

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Křestní jméno zpěváka Gotta: