AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Wecker - ELEGANTE Lösung mit Abbruch via Button gesucht
Thema durchsuchen
Ansicht
Themen-Optionen

Wecker - ELEGANTE Lösung mit Abbruch via Button gesucht

Ein Thema von NicoleWagner · begonnen am 24. Mai 2022 · letzter Beitrag vom 26. Mai 2022
Antwort Antwort
NicoleWagner

Registriert seit: 6. Jul 2010
167 Beiträge
 
Delphi XE3 Professional
 
#1

Wecker - ELEGANTE Lösung mit Abbruch via Button gesucht

  Alt 24. Mai 2022, 14:59
Hallo Leute,

mein Problem ist zweifellos schon zig-fach gelöst. Doch wo genau?
Ich brauche nichts als einen Wecker für 10 Minuten.

1) Es gibt einen "Startknopf", um den Countdown zu beginnen, dessen Methode hier drunter steht.
2) Und es gibt einen "Abbruch-Button", zu dem es noch gar keine Methode gibt.


Delphi-Quellcode:
// Ausführungsprogramm des Countdowns
procedure TForm_KalenderMain.Panel_CountdownClick(Sender: TObject);
Var Startzeit: TTime;
begin
  Startzeit:=DateTimePicker_Alarm;
.... * hier soll irgendwie abgefragt werden, ob seit der Startzeit bereits 10 Minuten vergangen sind. *
  Panel_Alarm.Color:=clGreen;
end;
Meine erste Frage ist die Funttion des Countdowns:
Wie löse ich den Countdown am Elegantesten?
Mit Sleep?
Oder indem ich jede Sekunde die Zeit neu abfrage?
Oder indem ich ....?

Das kann wohl jeder lösen. Irgendwie.
Der Profi hingegen weiß, wie es zu lösen geht, ohne sinnlos Ressourcen zu blockieren, indem ich ständig die Zeit prüfe.
Wofür ich hier danke.

Dann wird es trickreicher:
Es soll noch eine Button geben, der erlaubt, den Alarm abzubrechen.
Dieser Button wird in ein Click-Event führen.
Doch - was dann?
Ich könnte natürlich die Starzeit als globale Variable führen und sie einfach hochsetzen. Das sieht aber richtig hässlich aus vom Stil her.
Ich könnte eine globale Boolean Variable einführen, die den Alarm hält oder nicht. Allerdings müsste ich die neben der Zeit ständig abfrgen und das nur alle 1 Sekunden. Was eine hässliche Verzögerung darstellt.
Ich könnte ein Handle schreiben und gleich ins System greifen. Das sieht mir aber noch hässlicher aus.

Hat hier jemand 2 ELEGANTE Lösungen?
Mit bestem Dank im Voraus.

Nicole
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.765 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Wecker - ELEGANTE Lösung mit Abbruch via Button gesucht

  Alt 24. Mai 2022, 15:01
Nimm einen TTimer, setze die Zeit wie Du sie möchtest, dann reagiere auf OnTimer. Ausserdem kannst Du TTimer auch aktivieren und Deaktivieren. Der Rest ist trivial.
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
NicoleWagner

Registriert seit: 6. Jul 2010
167 Beiträge
 
Delphi XE3 Professional
 
#3

AW: Wecker - ELEGANTE Lösung mit Abbruch via Button gesucht

  Alt 24. Mai 2022, 17:23
Danke für den Tipp!
Der Timer ist jetzt Teil meines Projekts und startet jetzt.
mit
Timer1.Intervall:=...;
Timer1.Enabeled:=true;

So weit so fein.
Wie bringe ich ihn dazu, am Ende einen Sound abzuspielen (bzw. piep piep zu machen) und das Panel rot zu färben?

Mit anderen Worten:
Ich bräuchte ein OnEndTimer-Event.
Das dürfte es auch geben, doch eine Vorlage zu haben, wie ich es schreibe, wäre toll.
Die Schnipsel auf Stackoverflow usw. sind mir nicht so leicht verständlich bzw. recht unübersichtlich.
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
677 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Wecker - ELEGANTE Lösung mit Abbruch via Button gesucht

  Alt 24. Mai 2022, 17:54
Danke für den Tipp!
Der Timer ist jetzt Teil meines Projekts und startet jetzt.
mit
Timer1.Intervall:=...;
Timer1.Enabeled:=true;

So weit so fein.
Wie bringe ich ihn dazu, am Ende einen Sound abzuspielen (bzw. piep piep zu machen) und das Panel rot zu färben?

Mit anderen Worten:
Ich bräuchte ein OnEndTimer-Event.
Den gibt's doch, wie Sherlock in seiner Antwort angab: OnTimer.
Peter Below
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#5

AW: Wecker - ELEGANTE Lösung mit Abbruch via Button gesucht

  Alt 24. Mai 2022, 18:02
Zitat:
Den gibt's doch, wie Sherlock in seiner Antwort angab: OnTimer.
Genau!
Example

Zitat:
Wie bringe ich ihn dazu, am Ende einen Sound abzuspielen.
Addiere eine Wave-Datei zur Ressource.
Addiere MMSystem zu den Uses..

Führe diese Funktion aus.
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  timer1.Enabled := false;
  PlaySound('SOUND1', hInstance, SND_RESOURCE or SND_ASYNC);
  Panel1.Color := clRed;
end;

Davon ab würde ich gar keinen Timer nehmen sondern einen Thread dafür verwenden.
Delphi-Quellcode:
var
  EndAlarm : BOOL;
Delphi-Quellcode:
procedure Alarm(Delay: Integer); stdcall;
var
  //...
begin
  //...

  Repeat
    //... Was auch immer du für die Zeit Berechnung benötigst.
    // Wenn Bedingung erfüllt.
    if (bla = bla) then
    begin
      EndAlarm := True;
      PlaySound('SOUND1', hInstance, SND_RESOURCE or SND_ASYNC);
      Panel1.Color := clRed;
    end;
    Sleep(Delay);
  Until (EndAlarm = True); // globale variable EndAlarm Definieren und über Button auf True setzen. Oder darauf warten bis Bedingung erfüllt
end;
Delphi-Quellcode:
function StartAlarm(Delay: Integer): Integer;
var
  Return: Integer;
  hThread, dwThreadId: DWORD;
begin
  Return := LB_ERR;
  hThread := CreateThread(nil, 0, @Alarm, Pointer(Delay), 0, dwThreadId);

  if (hThread <> 0) then
  begin
    Return := LB_OKAY;
    Sleep(100);
  end;

  CloseHandle(hThread);
  Result := Return;
end;
Aufruf!

Delphi-Quellcode:
if (StartAlarm(60) = LB_OKAY) then
          // bla, bla

Geändert von venice2 (25. Mai 2022 um 10:11 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.211 Beiträge
 
Delphi 12 Athens
 
#6

AW: Wecker - ELEGANTE Lösung mit Abbruch via Button gesucht

  Alt 24. Mai 2022, 18:50
Den Sound kann man Async abspielen, somit hat der Hauptthread garnichts zu tun und ein Thread ist garnicht nötig.

Fazit: Die eleganzeste Lösung ist ein Timer.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.434 Beiträge
 
Delphi 7 Professional
 
#7

AW: Wecker - ELEGANTE Lösung mit Abbruch via Button gesucht

  Alt 24. Mai 2022, 18:00
Der Timer hat ein OnTimer-Event.

Dort schaltest Du als erstes den Timer aus: Timer1.Enabled := false; und dann machst Du in dem Ereignis, was immer Du willst.
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  timer1.Enabled := false;
  Panel1.Color := clRed;
  // ... weiter, wie in jedem beliebigen andern OnClick- oder On...-Ereignis auch.
end;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:56 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