|
| Flere beregningsvanskeligheder Fra : Skindbeni |
Dato : 02-06-05 14:57 |
|
Hej.
Håber, at i "kan lide" at løse problemer, idet jeg er stødt på yderligere
vanskeligheder indenfor tal og beregninger, som virker til at være (noget
af) det sværreste i Delphi - og beregninger er (desværre) hjørnestenene i
det, som jeg forsøger at lave.
Det første problem (eller "opgave", vil jeg hellere kalde det, da det lyder
bedre end "problem"), som jeg er stødt på, er blanding mellem decimaltal og
heltal.
Generelt ønsker jeg kun at der skal indtastes og ses heltal, men enkelte
steder er der decimaltal i mine formler. Resultatet heraf bliver oftest også
til et decimaltal, men jeg ønsker kun at se et heltal.
Hvordan kan det gøres ud fra følgende eksempel (som giver et decimaltal, men
skal vises som heltal)
edtResultat.Text := FloatToStr(
(StrToFloatDef(edtTal1.Text,0) + StrToFloatDef(edtTal2.Text,0)) * 0.28);
Jeg har også fået et andet, men meget væsentligt problem. Det går i kage for
mig, når jeg blander if-then med mine beregninger. Her følger et eksempel
på, hvad jeg gerne vil:
edtResultat.Text:=IntToStr(
StrToIntDef(edtTal1.Text,0) + If StrToInt(edtTal2.Text) > 0 then
StrToInt(edtTal2.Text));
Altså ønsker jeg kun at lægge edtTal2 til, hvis det her er tørre end nul.
| |
Michael Haase (02-06-2005)
| Kommentar Fra : Michael Haase |
Dato : 02-06-05 15:11 |
|
Skindbeni skrev:
>
> Generelt ønsker jeg kun at der skal indtastes og ses heltal, men enkelte
> steder er der decimaltal i mine formler. Resultatet heraf bliver oftest også
> til et decimaltal, men jeg ønsker kun at se et heltal.
>
> Hvordan kan det gøres ud fra følgende eksempel (som giver et decimaltal, men
> skal vises som heltal)
>
> edtResultat.Text := FloatToStr(
> (StrToFloatDef(edtTal1.Text,0) + StrToFloatDef(edtTal2.Text,0)) * 0.28);
Hvis du bare skal bruge heltalsdelen uden afrunding, kan du benytte en
af funktionerne trunc eller int. Hvis der skal rundes op/ned kan du
bruge round.
>
> Jeg har også fået et andet, men meget væsentligt problem. Det går i kage for
> mig, når jeg blander if-then med mine beregninger. Her følger et eksempel
> på, hvad jeg gerne vil:
>
> edtResultat.Text:=IntToStr(
> StrToIntDef(edtTal1.Text,0) + If StrToInt(edtTal2.Text) > 0 then
> StrToInt(edtTal2.Text));
>
> Altså ønsker jeg kun at lægge edtTal2 til, hvis det her er tørre end nul.
>
Du skal bare lægge if-sætningen før beregningen, altså:
if strtoint(edtTal2.text)>0 then
edtResultat.Text:=IntToStr(StrToIntDef(edtTal1.Text,0)+StrToInt(edtTal2.Text));
HÅber det løser problemerne.
--
Michael
| |
Skindbeni (02-06-2005)
| Kommentar Fra : Skindbeni |
Dato : 02-06-05 15:23 |
|
"Michael Haase" <micvans@netscape.invalid> skrev i en meddelelse
news:d5945$429f1371$3e3d8433$12604@news.arrownet.dk...
>> Jeg har også fået et andet, men meget væsentligt problem. Det går i kage
>> for mig, når jeg blander if-then med mine beregninger. Her følger et
>> eksempel på, hvad jeg gerne vil:
>>
>> edtResultat.Text:=IntToStr(
>> StrToIntDef(edtTal1.Text,0) + If StrToInt(edtTal2.Text) > 0 then
>> StrToInt(edtTal2.Text));
>>
>> Altså ønsker jeg kun at lægge edtTal2 til, hvis det her er tørre end nul.
>
> Du skal bare lægge if-sætningen før beregningen, altså:
>
> if strtoint(edtTal2.text)>0 then
>
> edtResultat.Text:=IntToStr(StrToIntDef(edtTal1.Text,0)+StrToInt(edtTal2.Text));
>
> HÅber det løser problemerne.
Jo tak. Det gjorde det delvist. Men jeg havde gjort eksemplet simpelt. I
virkeligheden er der flere if'er
Eksempel:
edtResultat.Text:=IntToStr(
If rbtest.checked = true then
StrToIntDef(edtTal1.Text,0) + If StrToInt(edtTal2.Text) > 0 then
StrToInt(edtTal2.Text));
| |
Michael Haase (02-06-2005)
| Kommentar Fra : Michael Haase |
Dato : 02-06-05 15:31 |
|
Skindbeni skrev:
> Jo tak. Det gjorde det delvist. Men jeg havde gjort eksemplet simpelt. I
> virkeligheden er der flere if'er
>
> Eksempel:
>
> edtResultat.Text:=IntToStr(
> If rbtest.checked = true then
> StrToIntDef(edtTal1.Text,0) + If StrToInt(edtTal2.Text) > 0 then
> StrToInt(edtTal2.Text));
>
Så lægger du bare if-sætningerne ind efter hinanden og slutter med
beregningen, som f.eks:
if (rbtest.checked = true) then
if (StrToInt(edtTal2.Text) > 0) then
if ....... then
edtResultat.Text:=IntToStr(trToIntDef(edtTal1.Text,0) +
StrToInt(edtTal2.Text));
dette kan også skrive som:
If (rbtest.checked = true) and (StrToInt(edtTal2.Text) > 0) then
edtResultat.Text:=IntToStr(trToIntDef(edtTal1.Text,0) +
StrToInt(edtTal2.Text));
--
Michael
| |
Nico de Jong (02-06-2005)
| Kommentar Fra : Nico de Jong |
Dato : 02-06-05 18:12 |
|
"Michael Haase" <micvans@netscape.invalid> skrev i en meddelelse
news:9459e$429f181e$3e3d8433$13987@news.arrownet.dk...
> Skindbeni skrev:
>
>
> > Jo tak. Det gjorde det delvist. Men jeg havde gjort eksemplet simpelt.
I
> > virkeligheden er der flere if'er
> >
> > Eksempel:
> >
> > edtResultat.Text:=IntToStr(
> > If rbtest.checked = true then
> > StrToIntDef(edtTal1.Text,0) + If StrToInt(edtTal2.Text) > 0 then
> > StrToInt(edtTal2.Text));
> >
> Så lægger du bare if-sætningerne ind efter hinanden og slutter med
> beregningen, som f.eks:
>
> if (rbtest.checked = true) then
> if (StrToInt(edtTal2.Text) > 0) then
> if ....... then
> edtResultat.Text:=IntToStr(trToIntDef(edtTal1.Text,0) +
> StrToInt(edtTal2.Text));
>
> dette kan også skrive som:
>
>
> If (rbtest.checked = true) and (StrToInt(edtTal2.Text) > 0) then
> edtResultat.Text:=IntToStr(trToIntDef(edtTal1.Text,0) +
> StrToInt(edtTal2.Text));
>
Efter min ringe mening bør man undgå indviklede sætninger, da man
lynhurtigt
mister overblikket. Det er også _meget_ nemmere at Debugge.
Det har også den fordel, at man kan genbruge mellemresultaterne.
Den første del af IF'en er en vederstyggelighed. Propertien CHECKED er
allerede Boolsk, og så er det overflødigt at teste for true eller false.
Hvis man vil teste for false, skriver man blot (i dette tilfælde) IF NOT
RBTEST.CHECKED AND .....
Nico
| |
Nicolai Hansen (16-06-2005)
| Kommentar Fra : Nicolai Hansen |
Dato : 16-06-05 08:44 |
|
> > If (rbtest.checked = true) and (StrToInt(edtTal2.Text) > 0) then
> > edtResultat.Text:=IntToStr(trToIntDef(edtTal1.Text,0) +
> > StrToInt(edtTal2.Text));
> >
> Efter min ringe mening bør man undgå indviklede sætninger, da man
> lynhurtigt
> mister overblikket. Det er også _meget_ nemmere at Debugge.
> Det har også den fordel, at man kan genbruge mellemresultaterne.
>
> Den første del af IF'en er en vederstyggelighed. Propertien CHECKED er
> allerede Boolsk, og så er det overflødigt at teste for true eller false.
Ikke nødvændigvis. Så længe det drejer sig om VCL komponenter har du
ret, men hvis du er ude i ejne boolske variable, eller (især)
tredjeparts komponenter, er xxx.checked=true et meget fornuftigt tjek
at gøre. Det har noget at gøre med definitionerne af "true" og "false"
i Delphi.
Derudover kan man IKKE skrive if-sætninger ind midt i andre kommandoer
i Delphi (modsat til i C).
a:=2+(if b>0 then b else 0); er IKKE gyldigt i Delphi, i modsætning
til a=2+(b>0?b:0); i C.
Du er defor nødt til at skrive flere if sætninger, som
if xxx.checked then //(eller: if xxx.checked=true men det har ingen
betydning med mindre du typecaster ned i xxx.checked)
begin
if b>0 then
a:=2+b
else
a:=2;
end;
| |
Christian Iversen (16-06-2005)
| Kommentar Fra : Christian Iversen |
Dato : 16-06-05 15:34 |
|
Nicolai Hansen wrote:
>> > If (rbtest.checked = true) and (StrToInt(edtTal2.Text) > 0) then
>> > edtResultat.Text:=IntToStr(trToIntDef(edtTal1.Text,0) +
>> > StrToInt(edtTal2.Text));
>> >
>> Efter min ringe mening bør man undgå indviklede sætninger, da man
>> lynhurtigt
>> mister overblikket. Det er også _meget_ nemmere at Debugge.
>> Det har også den fordel, at man kan genbruge mellemresultaterne.
>>
>> Den første del af IF'en er en vederstyggelighed. Propertien CHECKED er
>> allerede Boolsk, og så er det overflødigt at teste for true eller false.
>
> Ikke nødvændigvis. Så længe det drejer sig om VCL komponenter har du
> ret, men hvis du er ude i ejne boolske variable, eller (især)
> tredjeparts komponenter, er xxx.checked=true et meget fornuftigt tjek
> at gøre. Det har noget at gøre med definitionerne af "true" og "false"
> i Delphi.
>
> Derudover kan man IKKE skrive if-sætninger ind midt i andre kommandoer
> i Delphi (modsat til i C).
>
> a:=2+(if b>0 then b else 0); er IKKE gyldigt i Delphi, i modsætning
> til a=2+(b>0?b:0); i C.
>
> Du er defor nødt til at skrive flere if sætninger, som
>
> if xxx.checked then //(eller: if xxx.checked=true men det har ingen
> betydning med mindre du typecaster ned i xxx.checked)
> begin
> if b>0 then
> a:=2+b
> else
> a:=2;
> end;
Ellers kunne man bare bruge IfThen-funktionen.
a := IfThen(b>0, b+2, 2);
Alternativt kunne man nøjes med
a := 2;
if b > 0 then
inc(a, 2);
--
M.V.H
Christian Iversen
| |
Finn Bindeballe (02-06-2005)
| Kommentar Fra : Finn Bindeballe |
Dato : 02-06-05 16:17 |
|
hej
1: brug dog format...... det er det den er til.
2: find ud af om tallet er negativt INDEN du beginder at regne.....
/F
| |
|
|