Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Potenzrechnung (https://www.delphipraxis.net/98302-potenzrechnung.html)

poterp 24. Aug 2007 16:12


Potenzrechnung
 
Hallo,
ich habe da ein Problem und zwar ich versuche ein Potenzergebnis durch ein Gauge zu ermitteln
aber irgendwie klappt es nicht. So folgt sieht mein code aus:
Delphi-Quellcode:
procedure Form1.OKBtnClick(Sender: TObject);
begin
Timer1.enabled := true;
Timer1.Interval := 10;

end;

procedure Form1.Timer1Timer(Sender: TObject);
var
i, x, y, ergebnis,ergebnis2: integer;
begin
  x:=StrToInt(Edit1.Text);
  y:=StrToInt(Edit2.Text);
  Ergebnis:= x / y;
  Ergebnis2:= ergebnis*100;
  Gauge1.progress := gauge1.progress + 1;
  if gauge1.Progress = ergebnis2 then Timer1.enabled :=false;
  Label1.Caption:= inttostr(ergebnis);

end;
Ich vermute,dass irgendwas in meiner Formel stimmt nicht. kann mir jemanden helfen?
grüß
poter

3_of_8 24. Aug 2007 16:17

Re: Potenzrechnung
 
Das Ergebnis der Operation x/y ist in Delphi ein Real, kein Integer. Daher musst du ergebnis als Real (oder Single/Double/Extended) definieren. Eine weitere Möglichkeit wäre, x/y durch x div y zu ersetzen.
Übrigens brauchst du insgesamt nur eine Variable.

Delphi-Quellcode:
procedure Form1.OKBtnClick(Sender: TObject);
begin
  Timer1.enabled:=true;
  Timer1.Interval:=10;
end;

procedure Form1.Timer1Timer(Sender: TObject);
var
  percent: Integer;
begin
  percent:=StrToInt(Edit1.Text)*100 div StrToInt(Edit2.Text);
  Gauge1.progress:=gauge1.progress+1;
  if gauge1.Progress=percent then
    Timer1.enabled:=false;
  Label1.Caption:= inttostr(percent);
end;
EDIT: Schau dir mal das Grundlagentutorial auf http://dsdt.info an. Und was hat das ganze mit Potenzrechnung zu tun?

poterp 24. Aug 2007 16:47

Re: Potenzrechnung
 
Hallo,
es lauft nicht richtig.
das ergbnis von 8 von 25 bezogen auf 100 kommt richtig.
er kann nicht rechnen:
65 von 15 bezogen auf 100
800 von 72 bezogen auf 100 sollte ich circa 111,11% bekommen.
Da habe ich folgendes gemacht
Delphi-Quellcode:
Gauge1.MinValue:=0;
Gauge1.MaxValue:=100;
aber es hilft nicht
grüß
Poter

3_of_8 24. Aug 2007 16:52

Re: Potenzrechnung
 
Er rechnet definitiv richtig, er rundet wahrscheinlich nur falsch.

Du wirst definitiv keine 111.11% erhalten, weil du MaxValue=100 hast und außerdem ist 800/82 ungefähr 11,1%. Warum setzt du nicht einfach den Wert des Gauges gleich auf 11?

poterp 24. Aug 2007 17:24

Re: Potenzrechnung
 
Ja,ich hab es nochmal probiert aber ich kriege bestimmt ergbnis richtig und ander falsch zb:
25 von 50 bezogen auf 100 sollte 12,5% rauskommen aber kommt bei Gauge1.Max:= 1000; 5% bei Gauge1.Max:= 100 ; kommt 50% raus
bei
800 von 500 bezogen auf 100 sollte 160% raus. Bei Gauge1.Max:= 1000; kommt 16% raus aber der Label Zeigt es richtig. es muss die möglichkeit geben zb 160% auf den Gauge zu kriegen oder?

3_of_8 24. Aug 2007 18:15

Re: Potenzrechnung
 
Ja, gibt es. Du setzt Max auf 100. Oder du multiplizierst den Wert mit 10.

Und was meinst du mit "25 von 50 bezogen auf 100"?

Klaus01 25. Aug 2007 11:14

Re: Potenzrechnung
 
Zitat:

Zitat von poterp
25 von 50 bezogen auf 100 sollte 12,5% rauskommen ..

25 von 50 ist 0,5 -> das ganze in Prozent (bezogen auf 100) ist dann 50%

Grüße
Klaus

poterp 25. Aug 2007 11:32

Re: Potenzrechnung
 
Hallo,
es klappt nicht bei Gauge1.Max:= 100; und das Ergebnis * 10 multiplizieren.

3_of_8 25. Aug 2007 11:42

Re: Potenzrechnung
 
1. "Es klappt nicht" ist keine Fehlerbeschreibung
2. Ich habe gesagt Max auf 100 setzen _ODER_ mit 10 multiplizieren.

Klaus01 25. Aug 2007 11:55

Re: Potenzrechnung
 
Hallo Peter,

so funktioniert es bei mir.
Ich habe das mit einer Progressbar (smooth = true) gemacht.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Timer1.enabled := true;
  Timer1.Interval := 10;
  Gauge1.Position:=0;

end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  i, x, y: Integer;
  ergebnis,ergebnis2: extended;
  Faktor: Integer;
begin
  Faktor := 100;
  x:=StrToInt(Edit1.Text);
  y:=StrToInt(Edit2.Text);

  Ergebnis:= x / y;
  if ergebnis > 1 then
    gauge1.Max:=Faktor*(trunc(ergebnis)+1)
  else
     Gauge1.Max := Faktor;

  Ergebnis2:= ergebnis*Faktor;
  Gauge1.Position := gauge1.Position + 1;
  if gauge1.Position >= ergebnis2 then // >= wegen Vergleich Integer mit extended
    Timer1.enabled :=false;
  Label1.Caption:= Floattostr(ergebnis);

end;
[edit] noch eine Frage, warum willst Du das denn unbedingt mit einem Timer lösen? [/edit]

Grüße
Klaus

poterp 25. Aug 2007 12:44

Re: Potenzrechnung
 
Danke, was ich nicht verstehe, ich kriege ab und zu die antwort richtig aber alles was über 100% kommt falsch raus, zb:
800 von 72 bezogen auf 100 kommt als ergbnis raus
Gauge: 92%
Label:11,111111.
es kann sein, dass der Faktor wird irgendwo ignioriert.
mit der Taschenrechner rechne ich so.
800/72 und dann x 100
800/72= 11,1111 was der Label als ergbnis rausgibt und wenn ich mal 100 multipliziere bekomme ich 1111,11111 raus.
mache ich was falsch da?

Klaus01 25. Aug 2007 13:25

Re: Potenzrechnung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Peter,

mit diesem Code (mit TGauge):

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  i, x, y,faktor: Integer;
  ergebnis,ergebnis2: extended;
begin
  faktor:= StrToInt(Edit3.Text);
  x:=StrToInt(Edit1.Text);
  y:=StrToInt(Edit2.Text);
  Ergebnis:= x / y;
  if ergebnis > 1 then
    gauge1.Max:=faktor*(trunc(ergebnis)+1)
  else
    gauge1.Max:=faktor;
  label2.Caption:='max: '+IntToStr(Gauge1.Max);
  Ergebnis2:= ergebnis*faktor;
  Gauge1.Position := gauge1.Position + 1;
  if gauge1.Position >= ergebnis2 then
    Timer1.enabled :=false;
  Label1.Caption:= Edit1.Text +'/'+Edit2.Text+' * '+Edit3.Text+'= '+ format('%.2f',[ergebnis2]);

end;
Bekomme ich es richtig heraus, siehe Bild.
Ich weiß nicht was Du anders machst.
Arbeitet TGauge anders als TProgressbar?

Grüße
Klaus

Klaus01 25. Aug 2007 13:38

Re: Potenzrechnung
 
Liste der Anhänge anzeigen (Anzahl: 1)
So, ich nochmal.

1. Denkfehler
TGauge kann maximal 100% anzeigen.
2. Die Rechnung ist richtig wenn TGauge bei 800/72 -> 92% anzeigt und der Maximalwert bei 1200 steht.
0,92 * 1200 = 1111,111
3. Um Prozentwerte > 100% dartzstellen ist TGauge nicht die richtige Wahl.

Grüße
Klaus

poterp 25. Aug 2007 15:32

Re: Potenzrechnung
 
es gibt eine kleine unterschied zwischen Gauge und Progressbar und was du hier gemacht hast ist eine mischung aus Beiden. ist deine Test mit einem Progressbar oder Gauge gemacht worden?

es gibt keinem
Delphi-Quellcode:
Gauge1.Max //
richtig ist
Delphi-Quellcode:
Gauge1.MaxValue
aber es gibt einem
Delphi-Quellcode:
Progressbar1.Max
Ich habe deine quelle jetzt mit nem Progressbar probiert. dann bekomme ich eine Fehlermeldung:
'Edit3 is not a Valid Integer' es gilt auch für Edit 1 und 2

3_of_8 25. Aug 2007 15:44

Re: Potenzrechnung
 
Dann steht da vermutlich keine Zahl drin.

poterp 25. Aug 2007 15:52

Re: Potenzrechnung
 
schon beim start kommt die meldung, hat man keinen zeit da was anzugeben

Klaus01 25. Aug 2007 15:59

Re: Potenzrechnung
 
Hast Du beim Timer die Eigenschaft "enabled" im Object Inspector auf false gesetzt?

Grüße
Klaus

poterp 25. Aug 2007 16:05

Re: Potenzrechnung
 
Bingo, danke es lauft. Musste doch der timer auf false setzen


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf