Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Sekunden an einen Timer übergeben (https://www.delphipraxis.net/28755-sekunden-einen-timer-uebergeben.html)

Tavik 29. Aug 2004 19:02


Sekunden an einen Timer übergeben
 
ich habe eine integer-variable "sekunde" und möchte diese an einen Timer im Format dd:hh:mm:ss
übergeben! leider komme ich mit der timerroutine überhaupt nicht klar und auch das übersetzen ins richtige Format bereitet mir Probleme!

Danke im voraus

Sascha :coder2:

p.s.: wie kann ich das Fenster der Dateneingabe schließen und gleichzeit ein neues Fenster für den Timer aufpoppen lassen?

Sanchez 29. Aug 2004 19:18

Re: Sekunden an einen Timer übergeben
 
Hallo und willkommen in der DP (ich wollte das immer schon mal schreiben :mrgreen:)

Leider verstehe ich deine Frage nicht.
Willst du den Intervall eines Timer setzen? Wenn ja, dann verstehe ich nicht, was du mit dem Format meinst.
Das Datumsformat ist doch nur interessant, wenn du den Wert in einen String umwandelst (oder umgekehrt).

grüße, daniel

alcaeus 29. Aug 2004 19:33

Re: Sekunden an einen Timer übergeben
 
Hi Tavik!

Zitat:

Zitat von Tavik
ich habe eine integer-variable "sekunde" und möchte diese an einen Timer im Format dd:hh:mm:ss übergeben! leider komme ich mit der timerroutine überhaupt nicht klar und auch das übersetzen ins richtige Format bereitet mir Probleme!

Die Interval-Eigenschaft des Timers verlangt eine Zeitangabe in Millisekunden. Ist die Enabled-Eigenschaft des Timers auf True, so wird nach dieser Zeitspanne das OnTimer-Ereignis ausgelöst.


Zitat:

Zitat von Tavik
p.s.: wie kann ich das Fenster der Dateneingabe schließen und gleichzeit ein neues Fenster für den Timer aufpoppen lassen?

:arrow: Neue Frage, neuer Thread :dp:
Und außerdem verstehe ich diese Frage nicht :wiejetzt:

Greetz
alcaeus

glkgereon 29. Aug 2004 19:37

Re: Sekunden an einen Timer übergeben
 
ich glaube folgendes:
du meinst du hast eine art edit oder so wo du die zeit drin anzeigen willst....

an dieses editfeld (den "timer") willst du eine integer-uhrzeit (Tdatetime?) übergeben und anzeige lassen...

so, wenn das soweit richtig war machst du dies:

Delphi-Quellcode:
var
zeit:TDateTime;
begin
zeit:=now;
Edit1.Text:=DateTimetostr(zeit);//der Timer
so, dann die zweite frage: da wo du close; sagst sagst du direkt danach Form_Timer.Show/Showmodal...

so, EDIT:

deine variable hat die sekunden drin, daher:
Delphi-Quellcode:
var
sekunden, minuten, stunden, tage:integer;
begin
minuten:=sekunden div 60;
sekunden:=sekunden mod 60;
stunden:=minuten div 60;
minuten:=minuten mod 60;
tage:=stunden div 24;
stunden:=stunden mod 24;
Edit1.Text:=inttostr(tage)+':'+inttostr(stunden)+':'+inttostr(minuten)+':'+inttostr(sekunden);//der Timer
das mit 01 beim ersten tag und so weiss ich so spontan auch nicht

Tavik 29. Aug 2004 19:51

Re: Sekunden an einen Timer übergeben
 
hallo! ersteinmal danke für die schnellen hilfeversuche...ich werd mal etwas weiter ausholen!

ich habe auf der integervariable sekunde den Wert (s:= 268457) (nur so als beispiel!)

jetzt möchte ich mehrere Schritte abarbeiten (vielleicht gibts aber auch einen Befehl der das alles auf einmal erledigt!)


1. umrechnung in das Format 3Tage, 2Stunden, 34 Minuten, 17 Sekunden
2. übergabe dieses Ausgangswertes an einen Timer
3. Timer starten
4. wie der Timer angezeigt wird (Editbox oder Label) ist egal!



danke für die hilfe
Tavik

p.s.: bin für jede idiotensichere beschreibung/quelltext dankbar*g*

Tavik 29. Aug 2004 19:55

Re: Sekunden an einen Timer übergeben
 
@glkbkk


dein vorschlag hilt mir schon sehr weiter...jetzt soll dieses Edit feld nur noch jede Sekunde runtergezählt werden!

daran scheitert es!

gruss
Tavik

glkgereon 29. Aug 2004 19:59

Re: Sekunden an einen Timer übergeben
 
dazu nimmst du jetzt den richtigen timer...

in der leiste system ist eine kompo timer...
intervall auf 1000 (=1 sek)
die variable sekunde bei jedem timer-ereignis 1 runter und meine procedure wieder machen...

achso, am anfang timer disablen und dann wenn er initialisiert wird enablen

hoffe du kommst damit zurecht

Nikolas 29. Aug 2004 20:00

Re: Sekunden an einen Timer übergeben
 
nimm einen (anderen) Timer, setze das Intervall auf 1000 (ms). Dann schreib in die onTimer-Procedure
Delphi-Quellcode:
dec(sekunden);
// und die ganzen Befehle von glkbkk

Tavik 29. Aug 2004 20:08

Re: Sekunden an einen Timer übergeben
 
ahhhhh!

jungs jungs! ich bin blutiger anfänger!
enablen vor und nachher? nich so fix! ich bin ja willig aber ....

kann jemand die 5 minuten für eine ausführliche erklärung erübrigen?


ich bin euch schon jetzt sehr sehr dankbar....


gute nacht
sasch

Nikolas 29. Aug 2004 20:13

Re: Sekunden an einen Timer übergeben
 
Mit dem Enablen startest du einfach den Timer. Deswegen würde ich vorschlagen, ihn zur Entwicklungszeit auf disabled zu stellen und ihn dann zu starten, sobald was angezeigt werden soll. Das Intervall kannst du auch schon vorher auf 1000 stellen.
So sollte es gehen.

glkgereon 29. Aug 2004 20:15

Re: Sekunden an einen Timer übergeben
 
also

du gehst bei den komponenten in die kategorie system...
da is ne uhr, der TTimer
den klotzt du auf deine form (den sieht man nachher eh nicht)
du stellst bei dem das intervall auf 1000 (ms=1 sekunde)
du stellst enabled auf false (dies bewirkt das er nicht sofort losläuft...)
nun machst du einen doppelklick drauf, du landest im quelltext, in einer procedure namens Timer1onTimer (oder so ähnlich)
da tust du rein: dec(sekunde)

Delphi-Quellcode:
dec(sekunde);//oder sekunde:=sekunde-1;
dann den code von mir, vom post davor...

nun sagst du, nachdem du die variable sekunden eingelesen hast einfach Timer1.Enabled:=true;

und das wärs

EDIT mist, zu langsam, aber ich war genauer :mrgreen:

Tavik 30. Aug 2004 15:50

Re: Sekunden an einen Timer übergeben
 
hallo! problem noch nicht gelöst!


ich bin jetzt soweit, dass sowohl stunde (h), minute (m) als auch sekunde(s)
mit integerwerten belegt sind. dank der bisherigen hilfe kann ich jetzt das ganze auch als vernünftige zeitangabe wiedergeben


Edit4.Text:= inttostr(h)+':'+inttostr(m)+':'+inttostr(s);

jetzt möchte ich aber, dass diese Zeitangabe auch timermäßig läuft!

also nicht nur die sekunden abgezählt werden, sondern alle stellen entsprechend einem echten Timer runterlaufen!


danke im voraus für eure hilfe
sascha

Sharky 30. Aug 2004 15:55

Re: Sekunden an einen Timer übergeben
 
Hai Tavik,

mir ist noch immer nicht ganz klar was Du machen möchtest :oops:
Möchtest Du einen Countdown der von einer von Dir festgelegten Zeit auf 0 zählt und dieses anzeigen?

Nikolas 30. Aug 2004 16:43

Re: Sekunden an einen Timer übergeben
 
Das hat doch glkbkk sehr schön erklärt.
Erst sorst du mit dec(Sekunde) dafür, dass die Sekunden um 1 erniedrigt werden, dann lässt du den geposteten wieder ausführen und gibt's alles wieder aus.

Kontrollier vielleicht noch, ob die ausgegebenen Werte 2-stellig sind und bau vielleicht noch eine führende Null ein.

Tavik 30. Aug 2004 19:06

Re: Sekunden an einen Timer übergeben
 
ah! jetzt verstehe ich! ihr ändert die werte schon so weit oben im quelltext! alles klar!

was ich jetzt nicht verstehe, ich habe jetzt 2 Prozeduren:
eine OnChange, die abläuft wenn alle Eingaben aus Drei Edits getätigt wurden und ich habe einen Disableden Timer!

wie bringe ich jetzt beide zusammen...hier mal mein kompletter quelltext

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    Edit1: TEdit;
    GroupBox3: TGroupBox;
    Edit2: TEdit;
    GroupBox4: TGroupBox;
    Edit3: TEdit;
    GroupBox5: TGroupBox;
    GroupBox6: TGroupBox;
    Edit4: TEdit;
    Button1: TButton;
    Timer1: TTimer;
    procedure Edit3Change(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);


 
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  vorhanden, prostunde, benoetigt, fehlend:real;
  zeitstunden :real;
  zeitsekunden:integer;
  h,m,s:integer;
implementation

{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject);
begin
dec(zeitsekunden);
end;

procedure TForm1.Edit3Change(Sender: TObject);
begin
Timer1.Enabled:=true;
vorhanden:=    strtofloat(Edit1.Text);
prostunde:=    strtofloat(Edit2.Text);
benoetigt:=    strtofloat(Edit3.Text);

fehlend:=      benoetigt - vorhanden;
zeitstunden:=  fehlend / prostunde;
zeitsekunden:= round(zeitstunden * 3600);



h:=            zeitsekunden div (60 * 60);
zeitsekunden:= zeitsekunden - h*60*60;
m:=            zeitsekunden div 60;
zeitsekunden:= zeitsekunden - m*60;
s:=            zeitsekunden;

Edit4.Text:= 'h: '+inttostr(h)+' min: '+inttostr(m)+' sec: '+inttostr(s);

end;
end.
--> eingegeben werden: vorhandene Rohstoffe, Benötigte Rohstoffe und die anzahl der Erzeugten rohstoffe pro stunde! alles wird auf sekunden runtergerechnet,
dann wir eine Umrechnung in Stunden, Minuten und Sekunden abgegeben!

nun will ich die dec(zeitsekunden) so einflechten, dass auch tatsächlich runtergezählt wird! aber wie verbinde ich diese beiden Prozeduren?


danke für eure geduld mit mir!

sascha

Nikolas 30. Aug 2004 19:34

Re: Sekunden an einen Timer übergeben
 
Im Timer wird bisher nur Sekunden dekrementiert und nischt weiter. Du müsstest das ganze Zeug aus dem Onchange (ausser Timer1.enabled) in den Timer schreiben. Am Besten schreibst du dir eine Funktion, der du die ganzen Variablen übergibst und die dir dann den Zeit-String [12:22:05] zurückgibt. Die kannst du dann auch in den OnChanges und im TImer aufrufen.

{Überprüfst du auch, ob man in den Edits keinen Müll wie Buchstaben eingeben kann? Sonst gibt's unschöne Fehlermeldungen}

glkgereon 30. Aug 2004 19:42

Re: Sekunden an einen Timer übergeben
 
so:

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
dec(zeitsekunden);
vorhanden:=    strtofloat(Edit1.Text);
prostunde:=    strtofloat(Edit2.Text);
benoetigt:=    strtofloat(Edit3.Text);

fehlend:=      benoetigt - vorhanden;
zeitstunden:=  fehlend / prostunde;
zeitsekunden:= round(zeitstunden * 3600);

h:=            zeitsekunden div (60 * 60);
zeitsekunden:= zeitsekunden - h*60*60;
m:=            zeitsekunden div 60;
zeitsekunden:= zeitsekunden - m*60;
s:=            zeitsekunden;

Edit4.Text:= 'h: '+inttostr(h)+' min: '+inttostr(m)+' sec: '+inttostr(s);
end;

procedure TForm1.Edit3Change(Sender: TObject);
begin
Timer1.Enabled:=true;
end;
also den berechnungs/ausgabecode einfach nur umkopieren!!!
jetzt isses zwar so, das die anzeige erst 1 sek nach buttonclick geupdated wird, aber das machste jetzt selber!!!

Tavik 30. Aug 2004 20:28

Re: Sekunden an einen Timer übergeben
 
Liste der Anhänge anzeigen (Anzahl: 1)
ich bin am verzweifeln!

jetzt habt ihr mir schon den source gegeben und das prog will einfach nicht laufen.

der timer läuft einfach nicht an!

kommt es zur überschneidung von dec(zeitsekunde) und der definition durch zeitstunde welches wiederum durch feste werte gegeben ist?

ich hab das projekt jetzt beigefügt...
vielleicht hat ja nochmal glkbkk die musse!


vielen dank
sascha

glkgereon 30. Aug 2004 21:24

Re: Sekunden an einen Timer übergeben
 
bei mir funzt es...

AABBEERR

MACH DA EINEN BUTTON REIN
WELCHER ARME USER SOLL DEN AHNEN DAS ES 1 SEKUNDE NACH ÄNDERUNGEN IN EDIT§ ZU EINER FEHLERMELDUNG KOMMT WEIL ER NICHT SCHNELL GENUG GETIPPT HAT
*schüttel armen tavik bis er button hinmacht und brüll in dabei an*

(sorry fürs anbrüllen)

Tavik 30. Aug 2004 21:39

Re: Sekunden an einen Timer übergeben
 
ja aber wohin? dat läuft immernoch nicht! selbst wenn ich jetzt den Timer mit Button1 starte
kommen mit meinen eingabeweten 0,3600,3600 zwar die ein stunde, aber die fängt nicht an zu laufen!

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    Edit1: TEdit;
    GroupBox3: TGroupBox;
    Edit2: TEdit;
    GroupBox4: TGroupBox;
    Edit3: TEdit;
    GroupBox5: TGroupBox;
    GroupBox6: TGroupBox;
    Edit4: TEdit;
    Timer1: TTimer;
    Button1: TButton;
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);



  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  vorhanden, prostunde, benoetigt, fehlend:real;
  zeitstunden :real;
  zeitsekunden:integer;
  h,m,s:integer;
implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
dec(zeitsekunden);
vorhanden:=    strtofloat(Edit1.Text);
prostunde:=    strtofloat(Edit2.Text);
benoetigt:=    strtofloat(Edit3.Text);

fehlend:=      benoetigt - vorhanden;
zeitstunden:=  fehlend / prostunde;
zeitsekunden:= round(zeitstunden * 3600);

h:=            zeitsekunden div (60 * 60);
zeitsekunden:= zeitsekunden - h*60*60;
m:=            zeitsekunden div 60;
zeitsekunden:= zeitsekunden - m*60;
s:=            zeitsekunden;

Edit4.Text:= 'h: '+inttostr(h)+' min: '+inttostr(m)+' sec: '+inttostr(s);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Timer1.Enabled:=true;
end;

end.
ich verzweifele, und du auch!
mach dem bitte ein Ende und erklär es einem NOOOOOOOOB wie mir ausführlich! wohin mit dem Button?
gruss
sascha


erklär mir doch der einfachkeit halber mal das prinzip der prozeduren und wie sie sich gegenseitig beeinflussen können!

glkgereon 30. Aug 2004 22:09

Re: Sekunden an einen Timer übergeben
 
hmm, bei den eingabewerten hab ich auch einen fehler...moment

nein, ich will einfach das der timer nicht OnEdit3Change aktiviert wird sondern wenn der user aufn button klickt...

ahh, hier:
Delphi-Quellcode:
vorhanden:=    strtofloat(Edit1.Text);
prostunde:=    strtofloat(Edit2.Text);
benoetigt:=    strtofloat(Edit3.Text);

dec(zeitsekunden);//runterzählen

fehlend:=      benoetigt - vorhanden;
zeitstunden:=  fehlend / prostunde;
zeitsekunden:= round(zeitstunden * 3600);//und dann wieder auf festen wert setzen
du musst das noch reintuen:

Delphi-Quellcode:
vorhanden:=vorhanden+round((zeitsekundenold-zeitsekunden)*prostunde/3600);
nee, klappt auch nicht...

argghhh!!!

erst decrementierst du die zeitsekunden und dann sagst du
Delphi-Quellcode:
h:=            zeitsekunden div (60 * 60);
zeitsekunden:= zeitsekunden - h*60*60;
m:=            zeitsekunden div 60;
zeitsekunden:= zeitsekunden - m*60;
s:=            zeitsekunden;
ich mach das mal neu...

glkgereon 30. Aug 2004 22:23

Re: Sekunden an einen Timer übergeben
 
also, ich hab das mal etwas anders gelöst, nebenbei noch ne fehler-abfrage gemacht, es sollte jetzt klappen:

Delphi-Quellcode:
var
  Form1: TForm1;//erst mal hab ich deine globalen variablen gelichtet
  vorhanden, prostunde, benoetigt:double;
  laufzeit:integer;
implementation

{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject);
var
  h, m, s, sekunden:integer;
  fehlend:double;                       //dafür lokale...
begin
inc(laufzeit);                           //wie lange läuft es schon?
vorhanden:=laufzeit*prostunde/3600;      //wieviel is nach der zeit da
fehlend:=benoetigt-vorhanden;            //wieviel fehlt dann noch
sekunden:=round((fehlend)/prostunde*3600);//soviel zeit fehlt noch

h:=        sekunden div (60 * 60);      //deine berechnung
sekunden:= sekunden - h*60*60;
m:=        sekunden div 60;
sekunden:= sekunden - m*60;
s:=        sekunden;

Edit4.Text:= 'h: '+inttostr(h)+' min: '+inttostr(m)+' sec: '+inttostr(s);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin                                     //auf buttonklick
try
  vorhanden:=    strtofloat(Edit1.Text); //einlesen
  prostunde:=    strtofloat(Edit2.Text);
  benoetigt:=    strtofloat(Edit3.Text);
  Timer1.Enabled:=true;                   //timer enablen
except                                    //wenns fehler gibt (zahl flsch drin oder so)
  Application.MessageBox('Da Stimmt aber eine Zahl nicht...','Oops...');
end;
end;
und ich versteh immer noch nicht was das prog macht... :(

Tavik 31. Aug 2004 04:59

Re: Sekunden an einen Timer übergeben
 
folge diesem Link und melde dich an, dann verstehst du was los ist!


http://ds80-237-205-38.dedicated.hos....php?ref=cMzrb



wenn dir das Spiel spaß macht komm zur BUC! wir sind zwar klein, aber wir spielen nur aus Spaß an der Freunde.
Das Programm erleichtert dort die Planung der Baueinsätze!

schwer zu erklären....probier es einfach aus!


vielen vielen Dank nochmal!
tavik

Sharky 31. Aug 2004 06:34

Re: Sekunden an einen Timer übergeben
 
Hai Tavik,

auch wenn es mir nicht gesagt wird sehe ich das so das Du einen Countdown anzeigen möchtest?
Warum dafür nicht mit der Systemzeit arbeiten?
Hier mal mein Ansatz. Er benötigt:
1 x Timer
1 x Button
3 x Edit
2 x Label
Delphi-Quellcode:
var
  stunden : Integer;
  minuten : Integer;
  sekunden : Integer;
  startzeit : TTime;
  countdown   : TTime;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Timer1.Enabled := False;
  Timer1.Interval := 25;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  stunden := StrToInt (Edit1.Text);
  minuten := StrToInt (Edit2.Text);
  sekunden := StrToInt (Edit3.Text);
  countdown := EncodeTime (stunden,minuten,sekunden,0);
  startzeit := Now;
  Timer1.Enabled := True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Label1.Caption := TimeToStr (now); // Echzeit
  Label2.Caption := TimeToStr (countdown - (now-startzeit)); // Mein Countdown
end;

Tavik 31. Aug 2004 13:40

Re: Sekunden an einen Timer übergeben
 
Liste der Anhänge anzeigen (Anzahl: 1)
hi glkbkk


leider haben deine veränderungen auch einen nachteil!
die variable benötigt hat keinen einfluss mehr auf den timer!
er zählt nur runter wie lange gebraucht wird um die rohstoffe zusammenzusparen wenn nix da ist!

gib mal ein:

vorhanden: 30
pro stunde: 60
benoetigt: 30

der timer sollte jetzt null anzeigen! da ich genügend rohstoffe zusammenhab, aber leider fängt er bei einer halben stunde an!

hast du vielleicht die rettende idee?


gruss
sascha


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:33 Uhr.

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