![]() |
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 |
Re: Pause wie beim Sleep-Befehl
|
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 |
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 ![]() |
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 |
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. |
Re: Pause wie beim Sleep-Befehl
dann mach einmal vorher und einmal nachher ein application.processmessages() ;)
|
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; |
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. |
Re: Pause wie beim Sleep-Befehl
Wolfgang? meins iss kuerzer :-D :cheers:
|
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! |
Re: Pause wie beim Sleep-Befehl
@Delphi-Narr:
Gerne wieder :-) @Der.Kaktus: Zeig 'mal Gruß Wolfgang Mix |
Re: Pause wie beim Sleep-Befehl
@Kaki
Zitat:
Gruß Wolfgang |
Re: Pause wie beim Sleep-Befehl
Zitat:
![]() Das nur als Ergänzung. |
Re: Pause wie beim Sleep-Befehl
Zitat:
Sorry, daß ich Luckie falsch geschrieben hatte. Soll nicht wieder vorkommen ;-) Gruß Wolfgang |
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.
|
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:
Der Timer wird gestartet und die übergebene Methode nach Ablauf der Zeit aufgerufen.
procedure CallDelayedMethod(delay:cardinal; method:TThreadMethod);
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