![]() |
delphi ist einfach zu schnell und überspringt teilweise code
Hio,
vielleicht kennt ihr das Problem. Delphi scheint bei manchen prozeduren einfach nicht zu warten bis diese fertig ausgeführt worden sind, sondern geht einfach weiter im code. Ein Beispiel ist zum beispiel diese zeile:
Delphi-Quellcode:
Hier würde, wenn die message erscheint noch kein bild geladen sein.
begin
image1.picture.loadfromfile('1.bmp'); showmessage('Bild noch nicht sichtbar!'); end; Jedanfalls hängen damit viele probleme in meinem Programm zusammen. je langsamer der PC, desto öfter treten fehlermeldungen auf. Ich kanns nur schlecht beschreiben, weil ich es selber nicht richtig verstehe. Gibt es eine möglichkeit, timer zu verwenden um das programm nur kurz anzuhalten? Vielleicht in der art: timer1.enabled; if timer1.notify then mache weiter... Der delay-befehl der hier im forum zu finden ist nützt mir ja nicht viel, da er ja alles komplett anhält. Nebenbei scheint er auch nicht zu funktionieren. (delphi meckert das longint irgendwie nicht kompatibel ist...). Ausserdem würde delay mein programm bestimmt noch instabiler machen... (?). Wenn jemand ne idee hat wie man das mit nem timer (oder was anderem) machen könnte wär ich sehr dankbar. mfg Helmut[/code] |
Moin Helmut,
also nachvollziehen kann ich Dein Problem leider nicht, allerdings sollte der Delay aus der Library einwandfrei funktionieren ohne das Programm anzuhalten. Angehalten würde es nur, wenn Du Sleep verwendest. |
Re: delphi ist einfach zu schnell und überspringt teilweise
Die rote Zeile sollte Dein Problem lösen. Das Bild ist zwar schon geladen, jedoch wurde die Nachricht dass Bild darzustellen noch nicht verarbeitet. Ein Aufruf von Application.ProcessMessages; arbeitet die Nachrichtenschleife ab.
Code:
...:cat:...
begin
image1.picture.loadfromfile('1.bmp'); [color=#ff0019]Application.ProcessMessages;[/color] showmessage('Bild noch nicht sichtbar!'); end; |
Hallo Helmut,
vielleicht bringt Dich Application. ProcessMessages weiter. Ansonsten kannst Du anstatt mit Delay oder Sleep, mit GetTickCount arbeiten. Wobei ich Dein Problem nicht so richtig verstehe. Denn die Zeile werden eigentlich schon der reihe nach abgearbeitet. Grüsse, Daniel :hi: |
Hi,
ob ihrs glaubt oder nicht, application.ProcessMessages hilft! Mein programm stürtzt nichtmehr ab. Allerdings muss ich dazu sagen das es ohne das etwa alle 50 mal abstürtzte(bzw. einen fehler machte). Ich hab jetzt ca. 80 mal probiert und der fehler kam noch nicht (der fehler bringt das programm nicht zum abstürtzen, aber es macht etwas was es nicht soll...). Der einzige nachteil bei dem befehl application.ProcessMessages scheint bei mir darin zu liegen, das wenn ich nach dem testen des spiels (compilieren) in delphi zurückkehre sind meine ganzen Forms mit weissen streifen überzogen. Der befehl wird im programm ca. 20 mal in einer sekunde aufgerufen (nur eine sekunde lang :) ). Vielleicht ist das etwas zuviel für windows... Um nochmal auf den befhel delay zurückzukommen: Ich erhalte ziemlich viel fehler beim kompilieren. ich hab schon verschiedene delay-varianten ausprobiert. bei dme delay aus dem forum hier
Delphi-Quellcode:
erhalte ich diese meldung:
procedure delay(msec:longint);
var start,stop:longint; begin start := gettickcount; repeat stop := gettickcount; application.processmessages; until (stop - start ) ›= msec; end; Ungültiges Zeichen in Eingabedatei: '&' ($26) an der stelle: until (stop - start ) ›= msec; :( |
Hallo Helmut,
Zitat:
Sollte > heissen. Also grösser! bzw. "until (stop - start) >= msec;" Grüsse, Daniel :hi: |
ahh, super, und delay ist ja ein richtig schöner befehl :) (ich vermisse die alten pascal-zeiten :mrgreen: )
danke :) |
Hallo Helmut,
Zitat:
In Delphi gibt es Sleep(Zeit);. Das Problem bei dem ist, das alle Threads des Programmes einfrieren und somit das ganze Programm im Prinzip steht. Bei der Delay-Prozedur, läuft aber alles schön weiter wie es sich gehört. Grüsse, Daniel :hi: |
Hi,
Zitat:
Gruß Hansa |
Moin Daniel,
noch ein klein Wenig zu Sleep: Sleep ist eine Funktion der Windows API aus der KERNEL32.DLL, ausserdem werden damit nicht alle Threads eines Prozesses angehalten, sondern nur der in dem die Funktion aufgerufen wird. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:07 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