Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TDateTime/String frage beim zugriff (https://www.delphipraxis.net/4293-tdatetime-string-frage-beim-zugriff.html)

Haegar 23. Apr 2003 10:38


TDateTime/String frage beim zugriff
 
so, da isser wieder...hier erstmal der code (der eigentlich interessante):
Delphi-Quellcode:
function TForm1.MyHoursBetween(ANow, AThen, ABefore: TDateTime): INT64;
begin
  Result := Trunc(24*Abs(AThen-ANow+ABefore));
end;

procedure TForm1.lbbtn_stoppClick(Sender: TObject);
begin
 timer.Enabled:=false;
 bisher:=dauer;
end;

procedure TForm1.timerTimer(Sender: TObject);
begin
 dauer := IntToStr(MyHoursBetween(Now,start,StrToTime(bisher)))
          +FormatDateTime('h "h" nn "min" ss "s"', Abs(start-Now));
 lbl_zeit.Caption:=dauer;
end;
so, das sollte der wichtige teil sein, das problem liegt in der varibalen bisher. wie ihr seht, muss ich ja auch den wert berücksichtigen den ich lade (bisher) den hab ich nu versucht einfach in die MyHoursBetween-Funktion einzubauen, naja gedacht getan...neues problem. wenn ich bisher als string behandle dann kommt im timer nach dem laden die fehlermeldung (z.B.) 46h 45min 12s is not a valid time...die kommt dann sekündlich (timer läuft weiter).
wenn ich nun bisher als TDateTime behandle, dann kommt (der code wurde natürlich verändert -> bisher:=StrToTime(dauer))
in diesem teil bei drücken auf stopp-button ne fehlermeldung die besagt, das der wert von dauer keine valid time ist, und dem zu folge net zugewiesen werden kann! :nerd:

was nun?
gruss haegar

oki 23. Apr 2003 11:55

Hi,

ganz einfach, du must deine Zeitangabe aus bisher in ein gültiges TDateTime-Format wandeln.

Aus 40h 30min 10sec wird 1Tag 16Stunden 30Minuten 10Sekunden.

Das wars schon.

Gruß oki

Haegar 23. Apr 2003 12:10

aha hab ich mir ja auch schon gedacht, nur wie mache ich das :wink:
scheint ja nicht so einfach mit StrTotime zu gehen!

gruss haegar

oki 23. Apr 2003 13:33

Hi,

sag mal wie du deinen Wert "bisher" bildest bevor du ihn ablegst um ihn dann wieder wie beschrieben einzulesen.

Du hast zwei Varianten.

1. Du legst den Wert schon im korrekten Format yy.mm.dd hh:mm:ss ab,

oder

2. Du merechnest vor der Verwendung "maluell" aus den angegebenen Stunden den komplementären Wert für yy.mm.dd. (also 24 Stunden = 1 Tag etc. etc.)

Gruß oki

Haegar 23. Apr 2003 13:47

Zitat:

Zitat von oki
sag mal wie du deinen Wert "bisher" bildest bevor du ihn ablegst um ihn dann wieder wie beschrieben einzulesen.

meinste das speichern??
Delphi-Quellcode:
procedure TForm1.LbSpeedButton2Click(Sender: TObject);
var datei:TextFile;
begin
 assignfile(datei,'info.txt');
 rewrite(datei);
 writeln(datei,dauer);
 closefile(datei);
end;
das mach ich ja so das laden is auch net anders, lese einfach den string aus der datei.....vorrausgesetzt ich behandle bisher als string, wie ich es nun mache.

gruss haegar

oki 23. Apr 2003 14:00

Ja klar,

wie du das in die Datei bekommst meinte ich nicht. Wie bildest du den wert besher und wandelst ihn in einen String zum schreiben in die datei?.

Gruß oki

Haegar 23. Apr 2003 14:04

tja also im formcreate wird er erstmal auf null gesetzt (bisher:='0') und wenn ich dann auf start drücke hat er auch nix dagegen, alles läuft wunderbar.
beim speichern (siehe oben) benutze ich ja bisher nicht, dazu nehm ich en wert von dauer!
bisher wird lediglich beim laden, stoppen beeinflusst! und beim laden is momentan eben das problem, das der string aus der datei nicht einfach mit StrToTime umzuwandeln is, damit es geht! weisste wie?

gruss haegar

oki 23. Apr 2003 14:16

Neeee!

setz doch einfach mal die Programmzeilen in den Thread wie du "bisher" in einen String wandelst.

Gruß oki

Haegar 23. Apr 2003 18:27

ganz einfach
Delphi-Quellcode:
var bisher:string;
:firejump:
ich behandel es zur zeit als string! nix umwandeln :chat:
konnt doch net wissen das du sowas einfaches meinst

gruss haegar

oki 24. Apr 2003 08:01

Alles klar,

und wie bildest Du den Wert für besher?

Gruß oki

Haegar 24. Apr 2003 09:27

da der ergibt sich aus der tollen berechnung von dauer! (siehe oben....MyHoursBetween in timer-proz.) und da beides strings sind übergeb ich die einfach so. bisher:=dauer;
oder hab ich schon wieder was falsch vertanden?? :nerd:

gruss haegar

oki 24. Apr 2003 10:42

Hi,

also, fangen wir einfach mal von vorne an.

Du benötigst einen Wert Dauer den du zwischenspeicherst.

Natürlich kannst du dort mit Now arbeiten. Die Methode GetTickCount ist hier asber auch eine Möglichkeit und für Dich vielleicht besser.

Um einen Zeitabschnitt zu ermitteln verwende ich diese Methode wie folgt:

Delphi-Quellcode:
// globale Variable (u.U. auch als Objektvariable FLaufzeit)
var Laufzeit : DWord;

// im Programm für Start
Laufzeit := GetTickCount;

// im Programm bei Zeit abgelaufen
Laufzeit := GetTickTime - Laufzeit;
// Speichern als DWord oder wandeln in String
Jetzt hast du die Möglichkeit Laufzeit als millisekunden zu deinen Werten hinzuzuadieren.

Wenn Du dir den Typ TDateTime anschaust, dann stellst du fest, dass er als Double definiert ist, wobei der ganzzahlige Anteil die Tageswerte darstellt.

Durch einfache Berechnung kannst du nun aus Laufzeit einen TDateTime equivalenten Doublewert bilden, den du dann zu einem TDateTime wert hinzuadierst.

Oder du bleibst gleich außerhalb von TDateTime und gibst die werte in hh:mm:ss über eine eigene Berechnung an. Hierzu würde ich mir eine kleine Hilfsfunktion schreiben.

Delphi-Quellcode:
Function GetSZeit(Value : DWord) : String;
var Ts, hs, ss : String;
    Rest, Td, hd, sd : Dword;
begin
  Result := '00:00:00';
  If Value = 0 then Exit;
  // Stunden (entspricht 3600000 ms)
  Rest := Value / 3600000;
  Td := Trunc(Rest);
  Value := Value - Trunc(Rest);
  // Minuten (entspricht 60000 ms)
  Rest := Value / 60000;
  hd := Trunc(Rest);
  Value := Value - Trunc(Rest);
  // Sekunden (entspricht 1000 ms)
  Rest := Value / 1000;
  sd := Trunc(Rest);

  // String bilden
  Result := InttoStr(Td) + ':' + InttoStr(hd) + ':' + InttoStr(sd);
end;
So, das müßte es gewesen sein. Wie du in dieser Funktion den String formatierst bleibt natürluch dir überlassen.

Gruß oki

Haegar 24. Apr 2003 10:54

danke erstmal, werds mir bei gelegenheit anschauen.

gruss haegar


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:35 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