[ MACTEPx @ 15.10.2006. 11:28 ] @
prilikom sabiranja(oduzimanja, mnozenja...) integer brojeva sve radi normalo u delphi 7 ali kada unesem neki decimalan broj (real) program se srusi. ovo se ne desava u delphi 3 sa istim kodom!!! gde je greska? |
[ MACTEPx @ 15.10.2006. 11:28 ] @
[ Miloš Baić @ 15.10.2006. 12:14 ] @
Pozdrav,
malo si informacija dao o problemu, ali ovako odokativno, ako koristiš TEdit komponentu, da li si probao sa funkcijom StrToFloat!?! BTW, za matematičke probleme možeš koristiti i Math unit.... [ MACTEPx @ 15.10.2006. 17:38 ] @
Code: procedure TForm1.Button1Click(Sender: TObject); var l1,l2:real; begin if ((edit1.Text<>'') and (edit2.Text<>'')) then begin l1:=ln(strtofloat(edit1.Text)); l2:=ln(strtofloat(edit2.Text)); label2.Caption:=floattostr(l1/l2); end else showmessage('Unesi podatke!'); end; evo jednog primera koji ne radi [ Bojan Kopanja @ 15.10.2006. 18:11 ] @
Evo ovo radi
![]() Code: procedure TForm1.Button1Click(Sender: TObject); var l1,l2:real; begin if ((edit1.Text<>'') and (edit2.Text<>'')) then begin l1:=strtofloat(edit1.Text); l2:=strtofloat(edit2.Text); label2.Caption:=floattostr(l1/l2); end else showmessage('Unesi podatke!'); end; [ Srki_82 @ 15.10.2006. 19:12 ] @
Bilo bi lepo i kad bi rekao koju gresku ti izbacuje?
Ako ti izbaci gresku zbog delenja s nulom, to onda nije greska do Delphia... jednostavno ne moze da se deli s nulom. Citat: Matematika je jasna! Dvaput nista je nista, crva nije ni bilo! [ _deran_ @ 15.10.2006. 22:51 ] @
Probaj tacku umesto zareza (ili obrnuto)...
[ MACTEPx @ 16.10.2006. 14:12 ] @
Citat: Probaj tacku umesto zareza (ili obrnuto)... delphi obrnuto. malo je glupo da svaki put kucam zarez kad mi je brze da u numerickom delu tastature otkucam tacku - moze li to nekako da se ispravi? [ Srdjan_exe @ 16.10.2006. 20:40 ] @
mozes da taj edit unos odredis kao tip-string, a onda u kodu pomocu nekoliko string funkcija (imas u helpu sve) proveris da li je tacka bilo gde u unetom stringu ili zarez, ako je tacka onda samo zamesnis taj karakter sa zarezom i dalje tako dobijeni string prosledjujes u recimo StrToFloat funkciju.
(iskreno i mene je taj zarez iznervirao odmah cim sam uzeo delfi da ucim)... Ovo je verovatno brute-force resenje, garant ima jednostavnijih :) Pozdrav! [ Srdjan_exe @ 16.10.2006. 21:00 ] @
...naravno i deljenje sa nulom je uvek problem jer se greska uocava tek da se ta operacija pokusa izvesti
a ne pri kompajliranju programa. To resis iz koda, recimo: If edit2.text='0' then begin edit2.text:='Vrednost ovog polja ne sme biti NULA!' Exit else delilac_OK:= True; ..... .... (recimo, tako nekako) A ono sa seckanjem stringa: 1. Iseces string pre karaktera tacka ili zarez i dodelis to nekom novom stringu (str_prvi_deo_broja) 2. Iseces string posle karaktera tacka ili zarez i dodelis to opet nekom novom stringu (str_drugii_deo_broja) 3 Novi_string:= str_prvi_deo_broja + ',' + str_drugi_deo_broja 4 Neka_Promenljiva:= FloatToStr(Novi_string) Samo vidi te funkcije za operacije sa stringovima, mislim nazive i sintaksu. [ _deran_ @ 16.10.2006. 22:20 ] @
ili:
Code: uses ..., strutils, ... edit1.Text:=ansireplacestr(edit1.Text,',',decimalseparator); // jedno od ova dva je nepotrebno ali ne zna se koji pa ubaci oba edit1.Text:=ansireplacestr(edit1.Text,'.',decimalseparator); [ savkic @ 17.10.2006. 00:06 ] @
> edit1.Text:=ansireplacestr(edit1.Text,',',decimalseparator); // jedno od ova dva je nepotrebno ali ne zna se koji pa ubaci oba
> edit1.Text:=ansireplacestr(edit1.Text,'.',decimalseparator); Code: function StringToExtended(AValue: string; var Success: Boolean): Extended; var i: Integer; WrongDecimalSeperator: Char; begin // U slucaju da u stringu pored decimal postoje i thousand separatori onda ih prvo uklanjamo if StrCharsCount(AValue, [ThousandSeparator, DecimalSeparator]) > 1 then AValue := StrRemoveChars(AValue, [ThousandSeparator]); // U regional podesavanjima ControlPanela kao dacimalni znak moze biti navedeno npr. // ',' a korisnik moze uneti decimalni broj sa '.' // Ovde se prvo, ako treba, menja decimalni znak a potom se string pretvara u float // broj i ako dodje do greske to se i prijavi if DecimalSeparator = ',' then WrongDecimalSeperator := '.' else WrongDecimalSeperator := ','; for i := 1 to Length(AValue) do begin if AValue[i] = WrongDecimalSeperator then begin AValue[i] := DecimalSeparator; Break; end; end; Result := 0.0; Success := TextToFloat(PChar(AValue), Result, fvExtended); end; Funkcija se može dalje proširiti tako da obuhvati i proizvoljne kombinacije separatora hiljada i decimala. Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|