[ ik0 @ 12.11.2011. 18:02 ] @
offtopic (ali da ne otvaram novu temu) zasto Bilder mi nedaje da odradim ovo Code: AnsiString a, b; a=Edit1->Text; for(int i=1; a.Lenght(); i++) b[i]=a[i]; [Ovu poruku je menjao ik0 dana 12.11.2011. u 19:41 GMT+1] |
[ ik0 @ 12.11.2011. 18:02 ] @
[ X Files @ 12.11.2011. 19:08 ] @
1. Length() umesto Lenght().
2. AnsiString b nema dužinu, i pri izvršavanju će se verovatno javiti greška. [ ik0 @ 12.11.2011. 19:15 ] @
Utome je problem sto nakon izvrsenja se javlja greska zasto, kao sto me pamcenje sluzi u c++ nije bilo tako? Kako bi onda odradio ovaj deo koda
Code: AnsiString pom, pom1; pom=Edit1->Text; for(int i=1; i<pom.Length(); i++) { if(pom[i]!='/') pom1[i]=pom[i]; break; } [ X Files @ 12.11.2011. 19:21 ] @
Ako želiš da b ima dužinu kao a, onda ti treba ovo:
Code: a=Edit1->Text; b.SetLength(a.Length()); // <---ovo Eh, da... i ovo nije dobro: Umesto Citat: Code: for(int i=1; a.Length(); i++) Treba: Code: for(int i=1; i<=a.Length(); i++) Dakle, nemaš GRANICU! [ X Files @ 12.11.2011. 19:24 ] @
Obrati pažnju na ovaj deo tvog koda:
i<pom.Length() U njemu NE PRISTUPAŠ poslednjem elementu! Treba: i<=pom.Length() Obavezno pogledaj i ovu poruku: http://www.elitesecurity.org/p792275 ... tiče se INDEKSA u Borland C++ Builderu, što je delimično netipično za C++ zbog VCL biblioteke koja je ražena na Object Pascalu, koji ima neka drugačija pravila. [ ik0 @ 12.11.2011. 19:33 ] @
Mislim da tako i radim sa indeksima. Ispravio sam gresku ali mislim da se nerazumemo gde je problem.
Code: pom1[i]=pom[i]; //ovde "pukne" t.e ne da mi da uradim pom1[1]=pom[1]; [ X Files @ 12.11.2011. 19:39 ] @
Citat: Code: AnsiString pom, pom1; pom=Edit1->Text; for(int i=1; i<pom.Length(); i++) { if(pom[i]!='/') pom1[i]=pom[i]; break; } Code: AnsiString pom, pom1; pom=Edit1->Text; pom1.SetLength(pom.Length()); // <---- ONO NISI DODAO for(int i=1; i<pom.Length(); i++) // <---- ONO NISI ISPRAVIO "<=" { if(pom[i]!='/') pom1[i]=pom[i]; break; // <--- OVO NIJE DOBRO, JER IZBACUJE IZ PETLJE ODMAH U PRVOM PROLAZU } Inače, najbolje napiši šta treba uraditi. Ako želiš da neki znak u AnsiString izbaciš ili zameniš,ima gotovih funkcija. AnsiReplaceStr(), AnsiReplaceText(), ... [ ik0 @ 12.11.2011. 19:49 ] @
zelim ono sto je bilo u predhodnoj temi :). Znaci podatak koi je unesen u edit (format broj/godina) trebam odvoite broj od godinu onda neli da ih soberem (to sam smislio kako). Najednostavnii nacin (meni) je bio da ga predjem for ciklusom sve pre "/" da uzmem u jednu promenljivu sve posle "/" u drugu.
[ X Files @ 12.11.2011. 20:00 ] @
Ovako se možeš otarasiti znaka "/"
Code: #include <StrUtils.Hpp> void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString ZaZamenu; ZaZamenu = AnsiReplaceStr( Edit1->Text, "/", "" ); ShowMessage( ZaZamenu ); } Ipak, to nije dobro rešenje, jer neko može uneti brojeve ovako: 11/2011 1120/2011 1120/11 i sl. Zato je najbolje: 1. Ustanoviti poziciju znaka / 2. procitati znake levo 3. procitati znake desno 4. dodati 20 ili 2 ili nista ako se radi o godinama 5. dodati odgovarajuci broj nula ako se radi o brojevima 6. napraviti novi string sa okrenutim redosledom Postoji i C funkcija: http://www.cplusplus.com/reference/clibrary/cstring/strtok/ koja to može lako uraditi. [Ovu poruku je menjao X Files dana 12.11.2011. u 21:17 GMT+1] [ X Files @ 12.11.2011. 21:36 ] @
U principu, pokušaj neki ovakav kod (koga treba još zategnuti i testirati):
Code: AnsiString BrojFakture2Timestamp( const AnsiString BrojFakture ) { AnsiString LEVO = LeftStr( BrojFakture, AnsiPos("/", BrojFakture)-1 ); AnsiString DESNO = RightStr( BrojFakture, BrojFakture.Length()-LEVO.Length()-1 ); // Dodaje potreban broj nula AnsiString BROJ = "00000"; int PozicijaOdKojeSeUpisuje = BROJ.Length()-LEVO.Length()+1; for (int i=PozicijaOdKojeSeUpisuje; i<=BROJ.Length(); i++) BROJ[i] = LEVO[i-PozicijaOdKojeSeUpisuje+1]; // Dodaje potrebne brojeve na kraj AnsiString GODINA; if ( DESNO.Length() == 2 ) GODINA = "20" + DESNO; else // ovde možda još uslova... GODINA = DESNO; return ( GODINA + BROJ ); } void __fastcall TForm1::Button1Click(TObject *Sender) { ShowMessage( BrojFakture2Timestamp("11/2011") ); ShowMessage( BrojFakture2Timestamp("1120/2011") ); ShowMessage( BrojFakture2Timestamp("1120/11") ); } [ ik0 @ 12.11.2011. 22:48 ] @
evo ja kako sam uradio...duze je jer ima validacija dosta...
1 primer Code: AnsiString pom, pom1, pom2, pom3, pom4; int b=0, c=0; if(Edit1->Text!="") if(Edit1->Text.Length()>=4) { pom=Edit1->Text; for(int i=1; i<=pom.Length(); i++) { if(pom[i]=='/') { b=i; c++; } } if((b>1) && (b<8) && (c==1)&& (pom.Length()-b>=2) && (pom.Length()-b<=4) ) { pom1.SetLength(b-1); for(int i=1; i<b; i++) pom1[i]=pom[i]; switch(b-1) { case 1: pom3="00000"; pom3=pom3+pom1; break; case 2: pom3="0000"; pom3=pom3+pom1; break; case 3: pom3="000"; pom3=pom3+pom1; break; case 4: pom3="00"; pom3=pom3+pom1; break; case 5: pom3="0"; pom3=pom3+pom1; break; case 6: pom3=pom1; } pom2.SetLength(pom.Length()-b); for(int j=1, i=b+1; i<=pom.Length(); j++, i++) pom2[j]=pom[i]; switch((pom.Length()-b)) { case 2: pom4="20"; pom4=pom4+pom2; break; case 3: pom4="2"; pom4=pom4+pom2; break; case 4: pom4=pom2; break; } } else { ShowMessage("Greska pri vnesuvanje \nVnesi ponovo vo format (broj/godina)"); } } else Beep(); 2 primer nesta matematicki sam izvodio Code: AnsiString pom; char c; int a, d, des, h; pom=Edit1->Text; if(Edit1->Text!="") { for(int i=1; i<pom.Length(); i++) if(pom[i]=='/') pom1=i; a=atoi(pom1.c_str()); d=0; h=0; for(int i=1,j=a-2; i<a; i++,j--) { des=pow(10,j); d+=(des*(pom[i]-48)); } for(int i=a+1,j=pom.Length()-a-1; i<=pom.Length(); i++,j--) { des=pow(10,j); h+=(des*(pom[i]-48)); } } if (h/100==0) { h=2000+h; } //i tu sam stao pa poceo ono gore Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|