Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi FomatDateTime für gesamtes Programm? (https://www.delphipraxis.net/206325-fomatdatetime-fuer-gesamtes-programm.html)

F1nal 9. Dez 2020 17:50

Delphi-Version: 10.3 Rio

FomatDateTime für gesamtes Programm?
 
Hallo, wir haben im Unterricht ein kleines Programm geschrieben womit man die Reaktionszeit testen kann. Dafür haben wir die Anfangs und Endzeit genommen und dann den Durchscnitt berechnet. Da für mich aber nur Sekunden und Millisekunden interressant sind würde ich gerne einstellen dass auch nur Millisekunden und Sekunden genutz werden. Wenn ich mich richtig erinnere haben wir dass mit
Delphi-Quellcode:
FormatDateTime := 'ss,zzz'
. Ich hab das Programm mittlwerweile zuhause nachgebaut da ich noch paar sachen verfeinern wollte (dafür gibts oft eine gute Note oder vorzüge in Mitarbeit) allerding kommt bei mir ein Fehler bei FormatDateTime Hier der Code es geht um Zeile 65 in FormCreate (Ebenfalls ist mir auch aufgefallen dass manchmal der Buchstabe nur angezeigt wird wenn man dass Fenster auf Vollbild macht, obwohl ich extra mit Width und Height arbeite dass das nicht Passiert):
Delphi-Quellcode:
unit mReaktionszeit;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;

type
  TStimulus = record
    x, y : integer;
    Zeichen : char; end;
  Tfm_Reaktionstest = class(TForm)
    p_Control: TPanel;
    lb_Versuche: TLabel;
    ed_Versuche: TEdit;
    lb_Zeit: TLabel;
    bt_Start: TButton;
    lb_Buchstabe: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure bt_StartClick(Sender: TObject);
    procedure bt_StartKeyPress(Sender: TObject; var Key: Char);
  private
    var Anfang, Ende, H : TDateTime;
    var Anzahl, Erfolg : integer;
    var Buchstabe : TStimulus;
    var Gesamt : string;
    procedure SetzenAuswerten;
    procedure Zufall;
  public
    { Public-Deklarationen }
  end;

var
  fm_Reaktionstest: Tfm_Reaktionstest;

implementation

{$R *.dfm}

procedure Tfm_Reaktionstest.bt_StartClick(Sender: TObject);
begin
Anzahl := StrToInt(ed_Versuche.text);
Erfolg := 0;
Anfang := Time;
lb_Zeit.Visible := false;
lb_Buchstabe.Visible := true;

SetzenAuswerten
end;

procedure Tfm_Reaktionstest.bt_StartKeyPress(Sender: TObject; var Key: Char);
begin
if uppercase(Key) = lb_Buchstabe.caption then
  begin
    Zufall;
    Erfolg := Erfolg + 1;
    SetzenAuswerten;
  end;
end;

procedure Tfm_Reaktionstest.FormCreate(Sender: TObject);
begin
randomize;
formatdatetime := 'ss,zzz';
Zufall;
end;

procedure Tfm_Reaktionstest.SetzenAuswerten;
begin
  if Anzahl <> Erfolg then
    begin
      lb_Buchstabe.caption := Buchstabe.Zeichen;
      lb_Buchstabe.Top := Buchstabe.y;
      lb_Buchstabe.Left := Buchstabe.x;
    end
  else
    begin
      Ende := Time;
      H := (Ende - Anfang) / Anzahl;
      Gesamt := timetostr(H);
      lb_Zeit.Caption := 'Durchschnittszeit pro Buchstabe: ' + Gesamt;
      lb_Zeit.Visible := true;
      lb_Buchstabe.Visible := false;
    end;
end;

procedure Tfm_Reaktionstest.Zufall;
begin
  Buchstabe.Zeichen := chr(random(26)+65);
  Buchstabe.y := random(fm_Reaktionstest.Height - 70) + 70;
  Buchstabe.x := random(fm_Reaktionstest.Width);
end;

end.

runningsoft 9. Dez 2020 18:16

AW: FomatDateTime für gesamtes Programm?
 
Hier bringst Du was durcheinander.

FormatDatetime ist eine Funktion, die Dir einen Wert vom Typ TDateTime oder auch nur TTime formatiert als String zurück gibt.

Prinzipiell müsste die Funktion für Dein Beispiel in der Prozedur Setzenauswerten etwa so angewendet werden:

Delphi-Quellcode:
Gesamt := FormatDateTime('ss,zzz', H)

Wenn Du in Deinem Programm die Formatierung an mehreren Stellen vornehmen musst, könntest Du auch eine Konstante deklarieren, die du dann in Deine jeweilige formatierte Ausgabe der Zeit einbaust:

Delphi-Quellcode:
const SFormat = 'ss,zzz';

Gesamt := FormatDateTime(SFormat, H)
Die Definition "FormatDateTime" im FormCreate muss raus. So wie es dort steht, sieht es wie eine Variablendeklaration aus, aber es gibt nirgendwo eine Variable FormatDatetime (wäre auch kein guter Name für eine solche).

F1nal 9. Dez 2020 18:27

AW: FomatDateTime für gesamtes Programm?
 
Zitat:

Zitat von runningsoft (Beitrag 1478828)
Hier bringst Du was durcheinander.

FormatDatetime ist eine Funktion, die Dir einen Wert vom Typ TDateTime oder auch nur TTime formatiert als String zurück gibt.

Prinzipiell müsste die Funktion für Dein Beispiel in der Prozedur Setzenauswerten etwa so angewendet werden:

Delphi-Quellcode:
Gesamt := FormatDateTime('ss,zzz', H)


Die Definition "FormatDateTime" im FormCreate muss raus. So wie es dort steht, sieht es wie eine Variablendeklaration aus, aber es gibt nirgendwo eine Variable FormatDatetime (wäre auch kein guter Name für eine solche).

Ok aber wir hatten definitiv was im FormCreate was dann fürs gesamte Programm galt. Dann hab ich nur den Namen halt falsch in erinnerung. Irgendeine Idee was dass sein könnte?

runningsoft 9. Dez 2020 18:36

AW: FomatDateTime für gesamtes Programm?
 
Vielleicht habt Ihr auch irgendwo eine globale Variable definiert, die Ihr dann im FormCreate initialisiert habt:
Delphi-Quellcode:
private
    { Private-Deklarationen }
    var SFormat: string;

//im FormCreate
SFormat := 'ss,zzz';

//und in Deiner Ausgabeprozedur:
Gesamt := FormatDateTime(SFormat, H)

DieDolly 9. Dez 2020 18:39

AW: FomatDateTime für gesamtes Programm?
 
Meinst du FormatSettings ?

F1nal 9. Dez 2020 18:46

AW: FomatDateTime für gesamtes Programm?
 
Zitat:

Zitat von DieDolly (Beitrag 1478832)
Meinst du FormatSettings ?

Ja korrekt hab mir das mal angeguckt es müsste FormatSetting.LongDateFormat oder LongTimeFormat gewesen sein.
Vielen Dank an alle


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:51 Uhr.

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