/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
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

Søg
Reklame
Statistik
Spørgsmål : 177579
Tips : 31968
Nyheder : 719565
Indlæg : 6409074
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste