Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Integer und Extented


DaVinciFF7 - Do 29.01.09 19:48
Titel: Integer und Extented
Moin und so.
Ich bin momentan am Programmieren eines Programmes, mit dem man schauen kann, wieviele Anschläge man pro Minute auf der Tastatur schafft. Dafür muss ich ja irgendwie die Zeit durch die Anschläge teilen und ausgeben, doch er will irgendwie nicht und gibt mir nur die Fehlermeldung "Incompatible Types "Integer" and "Extented".
Hier auch mal der Quelltext:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Eingabe: TMemo;
    Vorgabe: TMemo;
    Start: TButton;
    Timer1: TTimer;
    Testlaenge: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Ergebnis: TLabel;
    procedure Timer1Timer(Sender: TObject);
    procedure StartClick(Sender: TObject);
    procedure Keypress(Sender: TObject; var Key: Char);
    procedure Change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Laenge: integer;
  Anschlaege: integer;
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
var i: integer;
begin
Eingabe.Enabled:=false;
i:=(laenge/60)/anschlaege;
Ergebnis.Caption:='Anschläge pro Minute:'+inttostr(i);

end;

procedure TForm1.StartClick(Sender: TObject);
begin
Eingabe.Enabled:=true;
timer1.Interval:=strtoint(testlaenge.text)*1000;
timer1.Enabled:=true;
end;

procedure TForm1.Keypress(Sender: TObject; var Key: Char);
begin
inc(anschlaege);
end;

procedure TForm1.Change(Sender: TObject);
begin
Laenge:=Strtoint(Testlaenge.Text);
end;

end.


MSCH - Do 29.01.09 19:50

i:=(laenge/60)/anschlaege;

imho ist I=integer aber "/" liefert immer float. Verwende dann "div" oder setze I auf "Double".
Dann sollte es funktionieren.
:-)msch


DaVinciFF7 - Do 29.01.09 19:59

Funktioniert jetz zumindest annähernd ^^ Er gibt immer aus, dass ich 0 Anschläge schaffe, aber das krieg ich schon gelöst :)
Dankeschön


Webo - Do 29.01.09 21:55

Wenn du div verwendest, dann bedenke dass :
div ist eine ganzzahlige Divison. Das heißt, dass 1 div 5 = 0 ist, da es normal 0,2 währen, er aber nur die 0 zurück gibt.
Das führt oft zu Fehlern.


jaenicke - Do 29.01.09 22:07

Ich verstehe die Logik hinter der Berechnung auch nicht wirklich. Was hat das Intervall des Timers damit zu tun? Dieses sollte doch fest sein, warum soll z.B. der Abstand zwischen der Anzeigeaktualisierung von der Länge des Textes abhängen? :shock:


BenBE - Do 29.01.09 22:09

Bei Divisionen gilt immer: Multiplikationen VOR Divisionen ausführen, da du sonst Genauigkeit verlierst.


Delphi-Quelltext
1:
I := (Anschläge * 60div Zeit;                    


Wobei die Zeit in Sekunden anzugeben wäre. Wenn Du mit Gleitkommazahlen rbeitest, könnten für Dich auch die Funktionen Floor, Ceil, Trunc und Round interessant sein. Mehr dazu verrät die Hilfe.