Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Pause wie beim Sleep-Befehl (https://www.delphipraxis.net/139467-pause-wie-beim-sleep-befehl.html)

Delphi-Narr 29. Aug 2009 13:03


Pause wie beim Sleep-Befehl
 
Hi, ich hab jetzt in der Schule Delphi und bin eigentlich recht zufrieden mit meinem Programm. Mein Problem:

Ich habe eine Art Spiel programmiert und es werden erst ein paar Variablen zufällig gesetzt und dann sollen je nach Wert bestimmte Texte und Bilder erscheinen - Klappt auch prima.

Jetzt hab ich da ein Wort stehen, dahinter eine Variable auf einem Label und in der Mitte ein Bild, das sich verändert hat (Altes wurde versteckt, neues an gleicher Position gezeigt).

Danach verschwindet das neue Bild und das alte kommt zurück - soll auch so sein. Aber da ich ja eine gewisse Zeit brauche, um das Bild zu sehen und den Text zu lesen möchte ich ZWISCHEN Erscheinen und Verschwinden eine Pause von 5 Sekunden einfügen.

Habe mir gedacht, da reicht ja der Sleep(5000) Befehl.
Es dauert auch 5 Sekunden, dann wird das alte Bild wieder angezeigt, doch alle Label, die verändert wurden, und das neue Bild sind nicht da. Da wo sie sein sollten ist nur der Hintergrund. Nach 5 Sekunden kommen dann die Werte wieder, die schon 5 Sekunden vorher hätten angezeigt werden sollen und das alte Bild kehrt an seinen Platz zurück.

Was kann ich tun?!? :?:

LG

BUG 29. Aug 2009 13:07

Re: Pause wie beim Sleep-Befehl
 
Klingt so als könnte delaydelay (statt sleep) dir helfen.

MfG,
Bug

Delphi-Narr 29. Aug 2009 13:24

Re: Pause wie beim Sleep-Befehl
 
Danke schonmal.
Ich bekomme jedoch die Meldung bei

delay(5000) | Ist das so richtig?!? Ich hab mir mein Wissen hauptsächlich durch INet angereichert...


[Fehler] Unit4.pas(89): Undefinierter Bezeichner: 'delay'

Scheint wohl nicht so ganz zu stimmen...

LG

Helmi 29. Aug 2009 13:30

Re: Pause wie beim Sleep-Befehl
 
Hallo,

du brauchst natürlich auch noch den Code für Delay.
Delay ist keine Delphi-Board-eigene Funktion.

Hier mal der Link zu der Delay-Procedure link

Wolfgang Mix 29. Aug 2009 13:36

Re: Pause wie beim Sleep-Befehl
 
Hast du die procedure in dein Programm übernommen?

Delphi-Quellcode:
implementation

{$R *.dfm}
procedure delay(msec:longint);
var
  start,stop:longint;
begin
...

Gruß

Wolfgang

Delphi-Narr 29. Aug 2009 13:45

Re: Pause wie beim Sleep-Befehl
 
Hm, das versteh ich erlich gesagt nicht so ganz...
Warum klappt das mit dem Sleep denn nicht?
Die darf ja ruhig einfrieren, es soll ja 5 Sekunden lang nichts passieren, man soll nichts klicken können, einfach eine Art Standbild.

jfheins 29. Aug 2009 13:47

Re: Pause wie beim Sleep-Befehl
 
dann mach einmal vorher und einmal nachher ein application.processmessages() ;)

Der.Kaktus 29. Aug 2009 13:54

Re: Pause wie beim Sleep-Befehl
 
heute meinen netten tag habe *gg*

Delphi-Quellcode:
procedure Delay(msec: integer);
var start, stop: LongInt;
begin
  start := GetTickCount;
  repeat
    stop := GetTickCount;
    Application.ProcessMessages;
  until (stop-start)>=msec;
end;
;-)

Wolfgang Mix 29. Aug 2009 14:00

Re: Pause wie beim Sleep-Befehl
 
Bei mir funktioniert das so:


Delphi-Quellcode:
var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure Delay(Milliseconds: Integer);
var
  Tick: DWord;
  Event: THandle;
begin
  Event := CreateEvent(nil, False, False, nil);
  try
    Tick := GetTickCount + DWord(Milliseconds);
    while (Milliseconds > 0) and
          (MsgWaitForMultipleObjects(1, Event, False, Milliseconds, QS_ALLINPUT) <> WAIT_TIMEOUT) do
    begin
      Application.ProcessMessages;
      if Application.Terminated then Exit;
      Milliseconds := Tick - GetTickcount;
    end;
  finally
    CloseHandle(Event);
  end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  showmessage('Bitte warten ...');
  delay(5000);
  showmessage('Das Waren ca. 5 secs');
end;

end.

Der.Kaktus 29. Aug 2009 14:08

Re: Pause wie beim Sleep-Befehl
 
Wolfgang? meins iss kuerzer :-D :cheers:

Delphi-Narr 29. Aug 2009 14:11

Re: Pause wie beim Sleep-Befehl
 
Ah, danke. Ich hab das jetzt kopiert und es klappt auch (Also mit meinen Befehlen in der anderen Prozedur).
Ich versteh zwar nicht genau wie, aber das werd ich schon noch lernen^^
Danke!

Wolfgang Mix 29. Aug 2009 15:15

Re: Pause wie beim Sleep-Befehl
 
@Delphi-Narr:
Gerne wieder :-)

@Der.Kaktus:
Zeig 'mal

Gruß

Wolfgang Mix

Wolfgang Mix 29. Aug 2009 15:37

Re: Pause wie beim Sleep-Befehl
 
@Kaki

Zitat:

Wolfgang? meins iss kuerzer
Das sieht eher nach Lucky-Code aus ;-)

Gruß

Wolfgang

Matze 29. Aug 2009 15:44

Re: Pause wie beim Sleep-Befehl
 
Zitat:

Zitat von Wolfgang Mix
Zitat:

Wolfgang? meins iss kuerzer
Das sieht eher nach Lucky-Code aus ;-)

Gruß

Wolfgang

Falls du den von Luckie aus der CL meinst ja. Da hat Der.Kaktus ihn wohl her. Deiner stammt von negaH und ist resourcenschonender laut seinem Eintrag in der CL. Somit ist die kürzere Variante nicht immer besser. ;)
Das nur als Ergänzung.

Wolfgang Mix 29. Aug 2009 16:07

Re: Pause wie beim Sleep-Befehl
 
Zitat:

Deiner stammt von negaH
Ich habe nie behauptet, daß das mein Code ist, den habe ich natürlich von nehaH übernommen, weil vorher auf diesen Link hingewiesen wurde.

Sorry, daß ich Luckie falsch geschrieben hatte. Soll nicht wieder vorkommen ;-)

Gruß

Wolfgang

Apollonius 29. Aug 2009 16:19

Re: Pause wie beim Sleep-Befehl
 
Warum wird in dem Code aus der CL überhaupt ein Event erzeugt? Man könnte MsgWaitForMultipleObjects auch mit 0 als erstem Parameter aufrufen.

sx2008 29. Aug 2009 17:17

Re: Pause wie beim Sleep-Befehl
 
Liste der Anhänge anzeigen (Anzahl: 1)
Eigentlich ist die Lösung mit Delay() nicht besonders sauber. :?
Was passiert z.B. wenn während Delay()noch läuft das Formular geschlossen wird und sich dieses selbst freigibt?
=> Crash
Oder was passiert, wenn man während Delay() läuft einen Button klickt, der wiederum eine Methode aufruft,
die ebenfalls Delay() aufruft?
Es können sehr üble Dinge passieren, wenn man Application.ProccessMessages zu oft oder unkontrolliert aufruft. :warn:

Mit einem Timer kann man einen eventbasierten Ablauf ausführen.
Dazu ruft man eine Methode auf und übergibt die Verzögerungszeit und die Methode, die aufgerufen werden soll.
Delphi-Quellcode:
procedure CallDelayedMethod(delay:cardinal; method:TThreadMethod);
Der Timer wird gestartet und die übergebene Methode nach Ablauf der Zeit aufgerufen.

Im Anhang gibt es dazu ein Demo das die Fensterfarbe angelehnt an eine Ampel verändert.


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