Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi das DELAY unterbrechen .... (https://www.delphipraxis.net/3337-das-delay-unterbrechen.html)

Rapthor 7. Mär 2003 14:11


das DELAY unterbrechen ....
 
Hallo!
Mein 12 Stunden Delay funktioniert schon! Aber sobald ich diesen in der Laufzeit aktiviert habe, lassen sich zwar andere Aktionen im Programm weiterhin ausführen, jedoch kann ich es einfach nicht schließen und muss zum Taskmanager greifen bzw. per STRG + F2 zurück ins Delphi.
Es scheint als würde ich das Programm nur regulär schließen können (mit Form1.Close), wenn es nicht gerade die Delay Prozedur ausführt.
Ich will aber eine Funktion integrieren mit der man das Delay unterbrechen kann.Wenn der Benutzer z.b. nicht unbedingt 12 Stunden warten will.
Geht das irgendwie?
Hier die DELAY Sache:
Code:
begin
                      lTick:=GetTickCount;
                      repeat
                      Application.ProcessMessages;
                      until (GetTickCount-lTick>=12*3600*1000);
end

Helld_River 7. Mär 2003 14:18

Hi !
Setze dir in das OnClose-Ereigniss eine Variable bAbbruch (auf true setzten, beim initialisieren auf false !!!) und erweitere die Schleife folgendermassen:
Delphi-Quellcode:
...
  until ((GetTickCount-lTick>=12*3600*1000) [B]or (bAbbruch)[/B]);
...
Gruß, Helld

Rapthor 7. Mär 2003 15:09

Ich hab ins Form1 ein OnClose Eregnis "bAbbruch" gesetzt .... bis hierhin alles okay. Jetzt komm ich ja direkt in den Quelltext mit der Prozedur

Code:
procedure TForm1.bAbbruch(Sender: TObject; var Action: TCloseAction);
Und was muss ich hier zwischen begin und end reinschreiben?

Meine until Zeile habe ich auch erweitert .... die sieht jetzt so aus

Code:
until (GetTickCount-lTick>=12*3600*1000) or bAbbruch;
Unter VAR hab ich bAbbruch als boolean gesetzt-
Achja und gleich am Anfang bei Form1.Create hab ich bAbbruch auf FALSE gesetzt.
Das ist alles aber es will nicht klappen.

CalganX 7. Mär 2003 16:15

bAbbruch ist eine Funktion und eine Prozedur? Zu unsicher! Nimm einen anderen Namen für die Funktion.
Dann solltest du im OnClose schreiben
Delphi-Quellcode:
  bAbbruch := true;
Chris

Jan 7. Mär 2003 16:29

Hallo,
ich glaube ihr habt da aneinander vorbeigeredet.
babbruch soll doch eine variable und keine Prozedur oder funktion sein.
Erstelle einfach eine globale variable, die du direkt als false deklarierst, also so:

Code:
var
    vabbruch : boolean = false;

und dann erweiterst du die delay schleife so, wie chris das schon geschrieben hat:

Code:
until ((GetTickCount-lTick>=12*3600*1000) or (bAbbruch));
also einfach die abbruchbedingung, die du im Moment verwendest durch diese hier ersetzen.
Jetzt musst du nurnoch einen Butto erstellen, in dem du deine variable auf true setzt. Das bewirkt, dass der delay unterbrochen wird, und du dein Programm beenden kannst.
Gruß
Jan

Rapthor 7. Mär 2003 17:32

In Ordnung ich hab jetzt folgendes eingestellt:

1. Im Deklarationsteil hab ich

Code:
var
vabbruch : boolean = false;
2. TForm1.FormCreate hat im OnClose Fenster des Objektinspektors babbruch

3. Die babbruch Prozedur dazu sieht so aus

Code:
procedure TForm1.bAbbruch(Sender: TObject; var Action: TCloseAction);
begin
    vAbbruch := true;
end;
4. Trotz der Abbruchbedingung

Code:
until (GetTickCount-lTick>=12*3600*1000) or (vAbbruch = true);
schließt sich das Delphi Programm NICHT beim klicken des kleinen schwarzen kreuzes ganz rechts oben im Fenster (biSystemMenu) .... auch ALT + F4 schließt das Programm nicht. Es scheint als liefe diese Delay Funktion dennoch weiter. :cry:

Luckie 7. Mär 2003 17:37

Schon mal mit F7 debuggt? :roll:

Helld_River 7. Mär 2003 18:26

Hey !
Also, ich habe es ausprobiert und es geht !!!
Hier der Code :

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
  vAbbruch : boolean;
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
  close;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  repeat
    beep;
    Application.ProcessMessages;
  until (1000<1) or vAbbruch;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  vAbbruch:=true;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  vAbbruch:=false;
end;

end.
GRuß, Helld

Rapthor 7. Mär 2003 19:39

Danke vielmals!!!
Es lag bei mir ... hab da an ner bestimmten Stelle totalen Müll verzapft ... sozusagen ne UNTIL Anweisung die nie durchbrochen wurde :roll:
Danke für die Hilfe ... jetzt funzt alles ....


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