Avatar billede aagaard93 Novice
08. september 2008 - 16:54 Der er 11 kommentarer og
1 løsning

Beregner: Fejl

Jeg er ved at lave et lille program der sal bruges til at beregne hvad de forskellige ting koster.

her er en lille kode:
________________
procedure TForm1.Edit1Change(Sender: TObject);
begin
label2.caption := inttostr(strtoint(edit1.text) * (2000));
label8.caption := inttostr(strtoint(edit1.text) * (2000));
label9.caption := inttostr(strtoint(edit1.text) * (0));
label10.caption := inttostr(strtoint(edit1.text) * (4000) div (100) * (30));
end;
________________
når jeg åbner programmet og skriver noget i den første edit "edit1.text" køre det hele som det skal, og den regner ud som den skal.
men så når jeg sletter det tal jeg har skrevet i den textboxen kommer den med en fejl:
'' is not a valid integer value

er der en der kan hjælpe mig med dette lille problem?
Avatar billede dkn Nybegynder
08. september 2008 - 17:03 #1
det er selvfølgelig fordi editen ikke indeholder noget, og "ingenting" kan du ikke konventere til et tal.

Du bør nok tjekke om edit1 indeholder et gyldigt tal uanset hvad, fx. med denne funktion:

function IsInteger(S: String): Boolean;
var
  I, Code: Integer;
begin
  Val(S, I, Code);
  Result := Code = 0;
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
if not IsInteger(edit1.text) then
begin
  showmessage('kun tal!');
end else
begin
label2.caption := inttostr(strtoint(edit1.text) * (2000));
label8.caption := inttostr(strtoint(edit1.text) * (2000));
label9.caption := inttostr(strtoint(edit1.text) * (0));
label10.caption := inttostr(strtoint(edit1.text) * (4000) div (100) * (30));
end;
end;
Avatar billede kroning Nybegynder
08. september 2008 - 17:04 #2
Brug inttostrDef i stedet:

eks.
label2.caption := inttostr(strtointdef(edit1.text,0) * (2000));
Avatar billede aagaard93 Novice
08. september 2008 - 17:28 #3
kan man ikke lave denne i "strtointdef":

label2.caption := inttostr(strtointdef(edit1.text,0) * (2000),ffnumber,10,0);

og kan man ikke lave så den er en label hvor det hele bliver lagt sammen til sidst?
fx:
label77.caption := inttostr(strtointdef(label2.Caption) + strtointdef(label3.Caption),ffnumber,10,0);

altså hvor label2 fx bliver til 2.000, og label3 bliver til 3.000. kan man ikke så lægge det sammen så den skriver 5.000? med punktum (.) hver tredje tal???
Avatar billede mbsnet Nybegynder
08. september 2008 - 18:11 #4
Man kan evt også lave en safe konverter

function asIntSafe(const i:integer;const aDefault:integer=0);
begin
if isInteger(i) then result:=intToStr(i) else result:=aDefault
end;

//mbs
Avatar billede mbsnet Nybegynder
08. september 2008 - 18:14 #5
//skal jo se sådan ud:

function asIntSafe(const s:string;const aDefault:integer=0):string;
begin if isInteger(i) then result:=intToStr(i) else result:=aDefault end;
Avatar billede mbsnet Nybegynder
08. september 2008 - 18:18 #6
//Okay heller ikke... prøver lige igen!

function isNumeric(const s:str):boolean;
var p:pChar;ln:longInt;
begin ln:=length(s);result:=false;if ln=0 then exit;p:=pointer(s);
while p^>#0 do begin if (p^<'0') or (p^>'9') then exit;inc(p) end;result:=true
end;

function asIntSafe(const s:str;const aDefaultValue:longInt=0):int64;
begin if isNumeric(s) then result:=strToInt(s) else result:=aDefaultValue end;
Avatar billede clscableguy Praktikant
08. september 2008 - 21:06 #7
function IsNumeric( Value: string ): boolean;
var
  Number: Extended;
  Error: Integer;
begin
  Val(Value, Number, Error);
  result := (Error = 0);
end;

procedure TForm1.Edit1Change(Sender: TObject);
var
  tal : integer;
begin
  if IsNumeric(edit1.text) then
    tal := strtoint(edit1.text)
  else
    tal := 0;

  label2.caption := inttostr(tal * 2000);
  label8.caption := inttostr(tal * 2000);
  label9.caption := inttostr(tal * 0);
  label10.caption := inttostr(tal * (4000) div (100) * (30));
end;
Avatar billede hrc Mester
08. september 2008 - 22:34 #8
mbsnet: AsIntSafe findes i kraft at StrToIntDef.

IsNumeric er OK, men jeg kom til at tænke på IsNan (Is Not A Number). Den beskrives her: http://www.delphibasics.co.uk/RTL.asp?Name=IsNaN.

Endelig kan cidoz spærre for andre tegn end tal:

I OnKeyPressed:

  if Key > #32 then
    if not (Key in ['0'..'9']) then
      Key := #0;

Så kan man ikke taste andet en tegn i feltet. Tilsvarende effekt kan fås med en TMaskEdit.
Avatar billede mbsnet Nybegynder
08. september 2008 - 23:31 #9
hrc> ok, point taken. Var ellers lige så stolt over at have bygget pointer ind i den :-)
Avatar billede borrisholt Novice
09. september 2008 - 12:27 #10
En lille krølle på historien, og en oplysning om andre rare Delphi funktioner ...

På linje mend StrToXXXDef findes der også en TryStrToXXX i det her tilfælde vil det være naturligt at bruge den således :

procedure TForm1.Edit1Change(Sender: TObject);
var
  Tal : integer;
  Numeric : Boolean;
begin
  if not TryStrToInt(Edit1.text, Tal) then
    Tal := 0;

  label2.caption := inttostr(tal * 2000);
  label8.caption := inttostr(tal * 2000);
  label9.caption := inttostr(tal * 0);
  label10.caption := inttostr(tal * (4000) div (100) * (30));
end;


Det er rigtigt den nøjagtig samme løsning får du ved at skrive StrToIntDef(Edit1.Text, 0)

Mit lille indlæg var ikke for at komme med en anden løsning blot for at oplyse om TryStrToXXX ... Man har jo før hørt om Delphi programmører der ikke kendte StrToXXX .. Vi nævner ikke navne ....

Jens Borrisholt
Avatar billede borrisholt Novice
09. september 2008 - 12:28 #11
StrToXXX skulle naturligvis være StrToXXXDef :D
Avatar billede mbsnet Nybegynder
09. september 2008 - 16:43 #12
Ja jeg har prøvet flere gange at have "opfundet noget" og så flere år efter finder man ud af at det er opfundet i forvejen *lol*
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester