[ popmilan76 @ 30.07.2017. 21:03 ] @
Sta predstavlja ova greska

"EStringListError
: list index out of bounds (-1)
[ savkic @ 30.07.2017. 21:23 ] @
> Sta predstavlja ova greska
> "EStringListError
> : list index out of bounds (-1)

Ne znam u kojoj ti se to klasi desava, pravilo za sve list index out of bonds greske je da pristupas indexu elementa koji ne postoji.

Npr.

Code:

var
  s: TStrings;
begin
  s := TStringList.Create;
  s.Add('Pera');
  s.Add('Mika');
  s.Add('Laza');

  ShowMessage(s[2]); // OK
  ShowMessage(s[5]); // Greska, lista sadrzi 3 elementa stoga je najvisi indeks 2
  ShowMessage([s[-1]); // Greska, pocetni indeks svih listi je 0.

  s.Free;
end;
[ popmilan76 @ 30.07.2017. 21:32 ] @
Meni se recimo desava ovde...i sto je zanimljivo ne pojavljuje se kada kliknem misem,vec samo kada koristim tastaturu,konkretno enter za odabir i prelaz u drugo polje....

procedure TFrmStanje.ComboBox4DropDown(Sender: TObject);
begin
with ADOQuery5 do
begin


combobox4.Clear;
Close;
SQL.Clear;
SQL.Add('select distinct karoserija,tblkaroserijaid from Tblkaroserija');

Open;

while (not Eof) do
begin
comboBOX4.Items.AddObject(FieldByName('karoserija').AsString,
TObject(FieldByName('tblkaroserijaid').AsInteger));
Next;
end;

end;

end;
[ savkic @ 30.07.2017. 21:54 ] @
U DropDown eventu ComboBoxa mu brises i punis sadrzaj? Vrlo moguce da to ne moze tako, probaj da to radis ranije (tipa on Enter) ili pokusaj da ubacis BeginUpdate/EndUpdate pozive pre brisanja i nakon punjenja.
[ popmilan76 @ 30.07.2017. 22:20 ] @
Probao sam vec sa begin/end update i to ne sljaka,ali ako pokusam da brisem na eventu on enter,tu se desava sledece da kada pokusam da filtriram combobox,sa recimo kar,ono izadje selektovano karavan,jedino to sto je selektovano pokazuje gresku sa indeksima,ako izaberem nesto drugo,prikaze mi sta treba....
[ popmilan76 @ 30.07.2017. 22:36 ] @
Mislim da nije problem brisanje,nego ovaj dropdown,sto sam postavio na true,jer iako izbacim skroz taj clear,opet je isto.....mada se tada u combobox uvecava za jos toliko,tj duplira sve rekorde
[ popmilan76 @ 30.07.2017. 22:53 ] @
Uspeo sam,ili bar za sada,nece jedino taj sto sam selektovao,stavio sam u kodu posle punjenja...

combobox4.ItemIndex := 0;

i onda hoce...
[ popmilan76 @ 30.07.2017. 23:10 ] @
U stvari,ne prijavljuje gresku sada,ali daje pogresne podatke....
[ Rapaic Rajko @ 31.07.2017. 08:56 ] @
Pokusaj ovo: posle svake operacije sa combobox-om (Clear, AddObject) ubaci liniju

Code:
  Application.ProcessMessages;


Mada se to NE radi u DropDown event-u, vec u nekom key eventu (vezano za unos); ili ako ima neki textchange event (to ce biti jos najbolje).

Pozz

[ popmilan76 @ 31.07.2017. 10:35 ] @
Nece ni tada isto mi je,ako dodam u event combobox on change,tu izbacuje gluposti...Meni treba da u tom combobox prikaze karavan,limuzina itd,a da mi zapamti ovaj tobject,odnosno njegov id,znaci brojeve 1,2,3
[ popmilan76 @ 31.07.2017. 10:37 ] @
Mada mi je zanimljivo da nece samo taj koji je prvi obelezen kao rezultat filtracije,ako idem strelicama po podacima i vratim se na taj ,tada hoce,kao i svaki drugi....

I jos nesto,posto mi trebaju iz comboboxa ovi id-ovi,sakriveno polje,stavio sam u combobox eventu on exit,ovaj podatak i posle njega message da vidim da li mi izlazi pravi broj id....i tu mi prijavljuje gresku na tom kodu...
,
sifrakaroserije:= INTEGER(TObject(ComboBox4.Items.Objects[ComboBox4.ItemIndex]));
showmessage....sifrakaroserije



[Ovu poruku je menjao popmilan76 dana 31.07.2017. u 12:05 GMT+1]
[ popmilan76 @ 31.07.2017. 19:36 ] @
Ima li nekog helpa u vezi ovoga?Inace,ako postoji neki drugi nacin,da prikaze jedno polje,a da pamti drugo?
[ savkic @ 31.07.2017. 19:59 ] @
Negde gresis, sad je to tesko reci bez konkretnog koda, ovako radimo napamet. Ako mozes posalji kratak primer koji ne radi pa ce neko vec pogledati.
Alternativno resenje moze biti da ostavis dataset otvoren i da iz njega kasnije citas zeljeni ID.
[ popmilan76 @ 31.07.2017. 20:21 ] @
Dakle,imam kod u combobox eventu dropdown,koji izgleda ovako...

procedure TFrmStanje.ComboBox4DropDown(Sender: TObject);
begin
with ADOQuery5 do
begin

combobox4.Clear;

Close;
SQL.Clear;
SQL.Add('select distinct karoserija,tblkaroserijaid from Tblkaroserija');

Open;
first;
while (not Eof) do
begin
comboBOX4.Items.AddObject(FieldByName('karoserija').AsString,
TObject(FieldByName('tblkaroserijaid').AsInteger));



Next;

end;

end;

end;

end.


I na istom comboboxu,u eventu on exit,postavio sam ovaj kod da vidim kupi li tobject kada izadje iz tog polja...

sifrakaroserije:= INTEGER(TObject(ComboBox4.Items.Objects[ComboBox4.ItemIndex]));
showmessage(inttostr(sifrakaroserije));

I to sve radi sa misem kada sve radim,a tastaturom nece,i to nece samo onaj koji je prvi selektovan...
[ savkic @ 31.07.2017. 21:55 ] @
> I to sve radi sa misem kada sve radim,a tastaturom nece,i to nece samo onaj koji je prvi selektovan...

Ukljuci use debug dcu, uradi rebuild, postavi breakpoint na tu liniju pa polako idi kroz Delphi klase dok ne vidis gde tacno (i zasto) puca.
[ popmilan76 @ 31.07.2017. 22:08 ] @
Googlao sam i googlao i na mnostvo mesta sam nasao da je rec o bagu kada je rec combobox,da je lose dizajnirano i da se moze resiti samo u kodu....a gresku mi pojavljuje ovde....

sifrakaroserije:= INTEGER(TObject(ComboBox4.Items.Objects[ComboBox4.ItemIndex]));


Inace ovakav kod sam koristio i u prethodnim projektima,ali sam birao podatke preko edita i otvarao dbgrid iz druge forme,pa ih vracao nazad,i to je radilo,ali mi je sada ovde lakse...ovako,da ne otvaram suvisno nove forme...
[ savkic @ 31.07.2017. 22:16 ] @
> Googlao sam i googlao i na mnostvo mesta sam nasao da je rec o bagu kada je rec combobox,da je lose dizajnirano i
> da se moze resiti samo u kodu....a gresku mi pojavljuje ovde....

> sifrakaroserije:= INTEGER(TObject(ComboBox4.Items.Objects[ComboBox4.ItemIndex]));

Cudno mi je da radi sa misem a ne preko tastature. Mislio sam da nadjes gresku u Delphi kodu (kodu kontrole), ovo je linija iz tvog koda, ako ukljucis debug dcus, mozes sa F7 da zaronis u VCL kod i vidis sta se na licu mesta desava, to je jedino relevantno, ovako samo mozemo nagajdjati.
[ popmilan76 @ 01.08.2017. 13:27 ] @
Ne znam ja to uraditi...pokusao sam i nesto ne ide...cekirao sam debug dcu i f7 i nista...
Da li je ovo jedini nacin,da uradim ovako nesto ili moze nestoi drugo...
[ tkaranovic @ 01.08.2017. 19:49 ] @
Kad zavrsis sa punjenjem:

comboBOX4.Items.AddObject(FieldByName('karoserija').AsString,
TObject(FieldByName('tblkaroserijaid').AsInteger));

...

stavi:

comboBOX4.ItemIndex := 0;
[ popmilan76 @ 01.08.2017. 19:57 ] @
Probao i ne izlazi mi greska,ali mi izlazi pogresan podatak,treba da bude pod karavan broj 3,a izlazi mi 2....
[ popmilan76 @ 01.08.2017. 20:18 ] @
I kada stavim 0 posle punjenja,posto imam tri comboboxa,svaki sledeci comboboxov indeks se smanjuje za 1,ako je prvi 2,sledeci je 1,pa 0
[ popmilan76 @ 02.08.2017. 08:19 ] @
Da li ovo mogu resiti na neki drugi nacina,a potrebno mi je da koristim tastaturu,ne samo sa misem...
[ popmilan76 @ 02.08.2017. 11:13 ] @
Nervira me to sto kada biram misem radi,a nece sa enter,mada sam u programu napravio da mi enter bude kao tab i misleci da to mozda ima veze sa ovim problemom,uklonio sam to i opet je isto.....misem hoce,enterom nece....i to samo kod prvog koji se selektuje,kada odem strelicom do nekog drugo itema onda radi....
[ popmilan76 @ 02.08.2017. 11:27 ] @
Da,i jos nesto,kada odaberem sa alt + down i posle enter,prikazuje dobro...
[ tkaranovic @ 02.08.2017. 11:59 ] @

Ako stavis novi combobox:

procedure TForm1.ComboBox1DropDown(Sender: TObject);
begin
ComboBox1.Clear;
ComboBox1.Items.AddObject('1', TObject(1));
ComboBox1.Items.AddObject('2', TObject(2));
ComboBox1.ItemIndex := 0;
end;


ima li razlike?
[ popmilan76 @ 02.08.2017. 13:24 ] @
Veceras probam,pa javljam...
[ Predrag Supurovic @ 02.08.2017. 15:16 ] @
Citat:
popmilan76:
Nervira me to sto kada biram misem radi,a nece sa enter,mada sam u programu napravio da mi enter bude kao tab i misleci da to mozda ima veze sa ovim problemom,uklonio sam to i opet je isto.....misem hoce,enterom nece....i to samo kod prvog koji se selektuje,kada odem strelicom do nekog drugo itema onda radi....


Gledam ja ove tvoje komentare i sve mi se čini da ima nešto mnogo pogrešno u tvom pristupu programiranju.

Po svemu sudeći ta lista ti se puni na neki event koji se okida kada negde klikneš mišem a kada radiš sa tastaturom ne okine se. Meni to liči da si punjenje liste stavio na pogrešno mesto, a to ćeš naći analizom koda i REAL TIME DEBUG-ingom, a ne nagađanjem i postavljanjem da ti enter radi ako tab.
[ popmilan76 @ 02.08.2017. 19:09 ] @
Jedini nacin za punjenje liste , a da sam ga koristio jeste dropdown event,a za pomenutu analizu preko debugera sam vec rekao da ne znam,pa moram ovako,...a za enter like tab,ne utice na moj problem...mene zanima na koji nacin neki programer puni cb...
[ savkic @ 02.08.2017. 19:48 ] @
ComboBox se ne puni ni u jednom od njegovih eventa vec u OnCreate eventu formi ili OnShow formi ili jos bolje nakon OnShow eventa.
Upotreba debuggera je vestina koja ce ti samo olaksati rad i posao i zato odvoj nekoliko dana i nauci da koristis taj alat. Osim toga neki drugi dodatni savet je da napravis demo prg koji prikazuje gresku koju imas i da ovde posaljes tako da neko moze pogledati gde gresis.
[ popmilan76 @ 02.08.2017. 21:31 ] @
Probao sam predlog tkaranovica,i dodao kod

ComboBox4.ItemIndex := 0;

i sta god izabrao prikazuje broj 2....
[ Predrag Supurovic @ 03.08.2017. 00:49 ] @
Pa ne može to tako nešto čukneš pa šta ispadne :)

Moraš da razumeš šta kod radi i da na osnovu toga logički zaključuješ gde je greška.

Najverovatni je kasno da listu puniš na OnDropdown event. Bolje je da je puniš ranije, recimo kao štop je Igor rekao u onCreate forme ili ako je baš bitno da se ažurira lista u momentu kada se pristupa ComboBox-u, onda recimo na onEnter Combobox-a.
[ popmilan76 @ 03.08.2017. 08:26 ] @
Nema koji event nisam probao,ali mi nije jasno zasto hoce sa misem,a nece sa enter...
[ tkaranovic @ 03.08.2017. 09:24 ] @
Probaj da stavis na novu formu i novi projekat combobox i onaj gore kod koji sam stavio.
Da barem utvrdis da li uopste mozes da dobijes 1.
[ salvaric @ 03.08.2017. 10:40 ] @
Isključi AutoDropDown, postavi punjenje combo-a u OnEnter event,
Code:
if ComboBox1.ItemIndex <> -1 then
sifrakaroserije:=INTEGER(TObject(ComboBox1.Items.Objects[ComboBox1.ItemIndex]))
postavi na OnExit event, i trebalo bi da radi kako treba.

Problem ti se, najverovatnije, pojavio zbog "AutoDropDown=true", on je na svaki enter iznova punio combo i vraćao ga na početak reda, tj. "ComboBox1.ItemIndex := 0;"
[ popmilan76 @ 03.08.2017. 11:09 ] @
Da ,ovako radi,samo sto mi ne izbacuje dropdown,ali to je manje bitnije,ako moze moze,ako ne,ok je i ovako....

Zaboravih reci,hvala svima...
[ salvaric @ 03.08.2017. 11:42 ] @
Dodaš na kraju punjenja combo-a u OnEnter event:
Code:
ComboBox1.DroppedDown := true;
i to bi trebalo da bude to što tražiš.
[ tkaranovic @ 03.08.2017. 16:32 ] @

Onda je na mom primeru sta god da izabere dobijao je 1 a napisao je da dobija uvek 2.
[ popmilan76 @ 03.08.2017. 19:01 ] @
Probacu veceras,hvala jos jednom...
[ popmilan76 @ 03.08.2017. 20:24 ] @
Salvaricu,ovo nece,kada izadje dropdown,izadje samo taj,nije isto kao autodropdown,i nece da radi enter,ne mogu ga selektovati...
[ captPicard @ 05.08.2017. 19:06 ] @
Javi mi TW/AnyDesk na PM pa ti pokušam pomoći.