[ prginfo @ 09.11.2009. 14:11 ] @
Koristim D2007 i InterBase

Na masci punim ComboBox.Items sa Query-jem i sve radi normalno.

Problem je sledeci:

ComboBox punim sa podacima iz 2 kolone iz jedne tabele.
Prvi podatak je tipa integer i on je primary (ID), dok je drugi podatak string

ComboBox se puni na sledeci nacin:

Code:

comboBOX.Items.Clear;
  query.Close;
  query.SQL.Clear;
  query.SQL.Add('select ID, NAZIV from TABELA order by NAZIV');
  query.Prepare;
  query.Open;
  query.First;
   while not query.Eof do
    begin
     comboBOX.Items.Add(query.Fields[0].AsString+'|'+query.Fields[1].AsString);
     query.Next;
    end;
  comboBOX.ItemIndex:=0;

Kakao posle selektovanja Itema iz ComboBoxa, da izdvojim podatak ID. On mi je u ComboBoxu razdvojen sa |

ID je integer i nije uvek iste duzine, tako da mi LeftStr ili ostale string funkcije ne rade dobro. Da li postoji resenje za ovakav problem?

Hvala.

[Ovu poruku je menjao savkic dana 09.11.2009. u 15:40 GMT+1]
[ savkic @ 09.11.2009. 14:47 ] @
> Kakao posle selektovanja Itema iz ComboBoxa, da izdvojim podatak ID. On mi je u ComboBoxu razdvojen sa |
> ID je integer i nije uvek iste duzine, tako da mi LeftStr ili ostale string funkcije ne rade dobro. Da li postoji resenje za ovakav problem?

Skini JCL biblioteku i iskoristi funkciju StrToken. Npr. PrviDeo := StrToken(PunString, '|');

Inače, ako nije neophodno da korisnik vidi ID u listi možeš koristiti Objects svojstvo za čuvanje, npr:

comboBOX.Items.AddObject(query.Fields[0].AsString, Pointer(query.Fields[1].AsInteger));

i kada ti je potreban:

IntegerPromenljiva := Integer(ComboBox.Items.Objects[0]);
[ priki @ 09.11.2009. 14:48 ] @
Ti itemsi su koliko znam string lista
probaj da deklarises neki record tipa

Code:

  type  
    TComboItems = record
      pId: Integer;
      pNaziv: String;
    end;
    PComboItems  = ^TComboItems 


pa da ga kasnije kreiras stavljas u tu string listu kao objekat

Code:

var
  test: PComboItems;  
begin  
  while not query.Eof do begin
    New(test);
    test^.pId := query.Fields[0].AsString;   //  bilo bi lepo kad bi koristio FieldByName umesto Fields[...]
    test^.pNaziv := query.Fields[1].AsString;
    comboBOX.Items.AddObject(query.Fields[1].AsString, TObject(test));
    query.Next;
  end;
end;


pazi kod oslobadjanje memorije, svaki pointer moras rucno osloboditi pre punjenja i na kraju

mozda ima neko i jednostavnije resenje......


[Ovu poruku je menjao priki dana 09.11.2009. u 16:00 GMT+1]
[ .:Marvin:. @ 09.11.2009. 14:50 ] @
F-jom POS nadjes poziciju znaka | u tvom stringu, a zatim pomocu Copy izdvojis sve pre tog znaka. Procitaj u helpu sta rede pos i copy pa se javi ako nije jasno.

Pozdrav
[ prginfo @ 09.11.2009. 15:07 ] @
Procitao sam za POS i COPY i mislim da ce to biti resenje.

Kada isprobam javicu da li je to OK.

Hvala.
[ prginfo @ 09.11.2009. 22:48 ] @
Sa funkcijama POS i COPY sve radi kako sam zamislio.

prvo sam ComboBox.Text prebacio u varijablu tipa String.
odredio sam poziciju znaka '|' i to dodelio varijabli tipa Integer.
na kraju sam uradio COPY

ID:=COPY(comboBox.Text,1,pozicija-1);

sve radi normalno.

Jos jednom hvala, naucio sam nesto novo, a nadam se i jos neko.
[ .:Marvin:. @ 10.11.2009. 08:22 ] @
E bas mi je drago da si se snasao. Licno mislim da je ovakav pristup najbolji, gde ti neko da 'hint' gde da gledas i sta da trazis, a ti onda malo proanaliziras helpove, mogucnosti koje ti se nude, i pritom dosta naucis. Samo napred!
[ rambo @ 10.11.2009. 21:41 ] @
Items.Objects je mnogo bolje rešenje jer za svaki Item može da se veže pointer na bilo šta što ti treba za taj item. Jednostavno castovanje radi posao za Integer, a za sve ostalo, Savkićev primer je idealno rešenje.

Druga stvar, nije dobro da u ComboBox prikazuješ ID (naročito ne ako je varijabilne dužine) ukoliko to korisniku nije bitno. Pravilo je da korisnik nikada ne treba da radi sa ID-jevima već samo sa podacima koji njemu znače. Prikaz ID-ja je opcioni i obično se vidi samo na formama koje služe za unos/izmenu/pregled kompletnih podataka. Suština korišćenja baza podataka sa aspekta običnih korisnika je da im olakša posao, a ne da ga komplikuje. ID je podatak koji je bitan za sistem a ne za korisnika. Ako je ID Integer tipa, onda ga ne treba prikazivati ili koristiti za normalan rad. Ako je String tipa, onda se obično koristi u radu i prikazuje.