Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Pausenfunktion (https://www.delphipraxis.net/183453-pausenfunktion.html)

OrakelvonDelphi 10. Jan 2015 14:33

Pausenfunktion
 
Ich habe folgendes Problem: Ich möchte innerhalb eines Programmes einen "Pause-Button" einfügen. Dazu gibt es ein kleines Bild, welches angeklickt werden kann. Wenn man dieses anklickt, so soll das Programm pausieren, das heißt, die Timer nicht weiterlaufen, etc... Klick man nun wiederholt darauf, soll alles normal weitergehen.
Ich habe mich zu möglichkeiten wie delay usw. belesen aber ich erreiche nicht den gewünshten Effekt.

Vielen Dank für alle Ideen oder Ansätze im Voraus!

Dalai 10. Jan 2015 14:43

AW: Pausenfunktion
 
Ich glaube, die wichtigste Frage ist, was da pausiert werden soll, denn davon hängt das Konzept ab, das dann in Code abgebildet wird. Timer umzuschalten (zu togglen), ist ja kein Problem:
Delphi-Quellcode:
Timer.Enabled:= NOT Timer.Enabled;


MfG Dalai

Valle 10. Jan 2015 14:44

AW: Pausenfunktion
 
Dann musst du den Timer beim Klick halt ausschalten? :zwinker:

Sir Rufo 10. Jan 2015 14:46

AW: Pausenfunktion
 
Du hat ja schon eine bestimmte Vorstellung, was dieses "Pause" für dich bedeutet. Jetzt teil diese Vorstellung deiner Anwendung mit, damit dieser Wunsch auch entsprechend interpretiert werden kann.

Das ist auf jeden Fall nicht mit einem Befehl getan, denn solche Zauberbefehle gibt es nicht.

OrakelvonDelphi 10. Jan 2015 14:47

AW: Pausenfunktion
 
Danke für die schnelle Antwort! Daran habe ich auch schon gedacht aber dies müsste dann ja für alle Timer aufgelistet werden und einzeln geschrieben, Musikeinspielungen müssten gestoppt werden, etc...

Ich dachte mir, vielleicht kennt jemand eine Lösung, die einfach "alles" kurz anhält.
Sollte das natürlich nicht möglich sein, nutze ich dann die Methode, so wie ihr es geschrieben habt.

OrakelvonDelphi 10. Jan 2015 14:49

AW: Pausenfunktion
 
Ah, ok Sir Rufo, das ist gut zu wissen. Nach solch einem "Zauberbefehl" hatte ich gesucht. Dann weiß ich jetzt, dass ich diese Suche beenden kann und lieber das ganze manuell versuche. Danke.

Sir Rufo 10. Jan 2015 14:49

AW: Pausenfunktion
 
Zitat:

Zitat von OrakelvonDelphi (Beitrag 1286144)
Danke für die schnelle Antwort! Daran habe ich auch schon gedacht aber dies müsste dann ja für alle Timer aufgelistet werden und einzeln geschrieben, Musikeinspielungen müssten gestoppt werden, etc...

Ich dachte mir, vielleicht kennt jemand eine Lösung, die einfach "alles" kurz anhält.
Sollte das natürlich nicht möglich sein, nutze ich dann die Methode, so wie ihr es geschrieben habt.

Diese Zauberbefehle muss man sich selber schreiben und das kann zusammenfassend als "Programmieren" beschrieben werden ;)

OrakelvonDelphi 10. Jan 2015 15:10

AW: Pausenfunktion
 
Gut, danke. War wohl naiv, an solch einen "Zauberbefehl" zu denken... :)
Werde das jetzt selbst programmieren :thumb:

Der schöne Günther 10. Jan 2015 15:57

AW: Pausenfunktion
 
Die Timer hängen doch alle an einem Formular. Und alle Formulare hängen an
Delphi-Quellcode:
Application
. Du könntest doch einfach in einem Einzeiler sagen Für jedes Formular in der Anwendung: Für jeden Timer auf dem Formular: Timer.Enabled := not PauseIstAn;

Sir Rufo 10. Jan 2015 16:02

AW: Pausenfunktion
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1286171)
Die Timer hängen doch alle an einem Formular. Und alle Formulare hängen an
Delphi-Quellcode:
Application
. Du könntest doch einfach in einem Einzeiler sagen Für jedes Formular in der Anwendung: Für jeden Timer auf dem Formular: Timer.Enabled := not PauseIstAn;

Ja, und dann gibt es Timer, die doch noch laufen, oder eben erst dann laufen sollen. Und wenn, dann hat man etwas für die Timer aber immer noch nichts für das etc..

So macht man das eben nicht, mit der groben Kelle, sondern man definiert sich, was Pause bedeutet und reagiert in der Anwendung darauf.

Uwe Raabe 10. Jan 2015 23:39

AW: Pausenfunktion
 
Zitat:

Zitat von OrakelvonDelphi (Beitrag 1286144)
Ich dachte mir, vielleicht kennt jemand eine Lösung, die einfach "alles" kurz anhält.

Definiere "alles". Wirklich alles bedeutet z.B. auch die Reaktion auf Klicks, auch wenn du dich dafür nur auf dein eigenes Programm beziehst. Ein solcher "Zauberbefehl" wäre z.B.
Delphi-Quellcode:
Sleep(MaxInt);
oder
Delphi-Quellcode:
while true do;
oder auch
Delphi-Quellcode:
repeat until false;
. Damit hängst du nämlich dein Programm für eine recht lange Zeitspanne auf.

Du willst aber wohl nicht alles anhalten, sondern nur etwas bestimmtes. Was das genau ist, weißt aber nur du. Also musst du es auch selbst programmieren.

Perlsau 11. Jan 2015 04:45

AW: Pausenfunktion
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1286184)
Du willst aber wohl nicht alles anhalten, sondern nur etwas bestimmtes. Was das genau ist, weißt aber nur du. Also musst du es auch selbst programmieren.

Genau :thumb:

@OrakelvonDelphi:
Nehmen wir mal an, du hast eine lange dauernde Methode, sagen wir mal für das Einlesen einer großen Liste von Dateien in irgendwelche Records oder Datenbank-Tabellen. Diese Liste klapperst du normalerweise mit einer For-To-Schleife ab:

Delphi-Quellcode:
for i := 0 to z-1 do LeseDatei(Liste[i]);
(LeseDatei ist deine Methode, um die Datei im übergebenen String einzulesen.)

Nun möchtest du, weil du nebenher was anderes am selben PC machen willst, eine Pausenfunktion für diese Einlese-Methode einrichten. Du setzt einen Button aufs Formular, den du z.B. Btn_PauseWeiter nennst. Nun genügen die Möglichkeiten der For-To-Schleife nicht mehr, du benötigst eine While-Schleife:
Delphi-Quellcode:
...
private
  Var
    Pause : Boolean;
    LeseId : Integer;
 
  procedure Einlesen(const Liste : TStrings);

implementation

procedure TForm1.Einlesen(const Liste : TStrings);
var
  i,z : Integer;
begin
  if not Assigned(Liste) then exit;
  z := Liste.Count;
  if z = 0 then exit;

  i := LeseId;
  LeseId := 1;
  Pause := false;
  Btn_PauseWeiter.Caption := 'Pause';

  while (i < z) and not Pause do
  begin
    LeseDatei(Liste[i]);
    inc(i);
    Application.ProcessMessages;
  end;

  // wenn durch Pause abgebrochen, dann aktuelle Position der Liste merken
  if Pause then LeseId := i else
  // sonst alles wieder zurücksetzen
  begin
    Btn_PauseWeiter.Caption := 'Einlesen';
    LeseId := 0;
  end;
end;

procedure TForm1.Btn_PauseWeiterClick(Sender: TObject);
begin
  If LeseId = 0 then Einlesen else
  begin
    if Pause then
    begin
      Btn_PauseWeiter.Caption := 'Pause';
      Pause := false;
    end else
    begin
      Btn_PauseWeiter.Caption := 'Weiter';
      Pause := true;
    end;
  end;
end;
Klickst du nun auf den Button "Pause", schaut dessen Klick-Methode nach, wie die Variable Pause gerade steht und reagiert entsprechend. Deine Einlese-Schleife fragt ebenfalls die Pause-Variable ab und reagiet entsprechend.

Mavarik 11. Jan 2015 11:42

AW: Pausenfunktion
 
Zitat:

Zitat von OrakelvonDelphi (Beitrag 1286144)
aber dies müsste dann ja für alle Timer aufgelistet werden und einzeln geschrieben, Musikeinspielungen müssten gestoppt werden, etc...

Wie viele Timer hast Du den?

hathor 11. Jan 2015 12:03

AW: Pausenfunktion
 
Was bisher geschrieben wurde....
Naja!

Sir Rufo 11. Jan 2015 12:50

AW: Pausenfunktion
 
@hathor

Und das nimmt der TE jetzt einfach und kann damit das in seiner Anwendung pausieren, was er pausieren möchte?

Der TE will ein Spiel programmieren. Dort wird während des Spiels Musik abgespielt, evtl. Zeiten gemessen (nach wieviel Sekunden wurde Button x gedrückt), etc. etc. ...

Die "Pause" bezieht sich hier auf einen bestimmten Kontext und dieser Kontext soll pausieren. Somit ist jeder generelle Ansatz komplett falsch, weil der Kontext gar nicht berücksichtigt werden kann.

Mavarik 11. Jan 2015 18:14

AW: Pausenfunktion
 
Zitat:

Zitat von hathor (Beitrag 1286204)
Was bisher geschrieben wurde....
Naja!

Hmm... Genau!

Ein aus der Luft gegriffenes Beispiel mit Thread trifft es viel besser...

himitsu 11. Jan 2015 19:15

AW: Pausenfunktion
 
Es gibt ja einen "Zauberbefehl", mit dem man alles in der VCL anhalten kann .... aber dann steht alles, wirklich alles, und man kann mit dem Programm nix mehr anfangen.

Sherlock 12. Jan 2015 10:39

AW: Pausenfunktion
 
OT: In XE9 kommt Delphi-Referenz durchsuchenDoWhatIMean

Sherlock

p80286 12. Jan 2015 11:11

AW: Pausenfunktion
 
Zitat:

Zitat von Sherlock (Beitrag 1286295)
OT: In XE9 kommt Delphi-Referenz durchsuchenDoWhatIMean

Sherlock

Wann kann ich das vorbestellen?
Das revolutioniert unsere Arbeit grundlegend, endlich keine unnötigen Gedanken mehr über das was erreicht werden soll, und mögliche Seiteneffekte, einfach "mach ma!".

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:58 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 by Thomas Breitkreuz