Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Eigenschaften eines Objektes für ein paar Sekunden zuweisen (https://www.delphipraxis.net/113656-eigenschaften-eines-objektes-fuer-ein-paar-sekunden-zuweisen.html)

Delphiturbo 12. Mai 2008 15:13


Eigenschaften eines Objektes für ein paar Sekunden zuweisen
 
Hallo

ich möchte die farbe von dem Button für nur eine Sekunde (Rot)
und dann wieder die Originale Farbe zuweisen

Delphi-Quellcode:
Button1.Color:=clRed;
//sleep(2000); // schlecht wie Delay() auch !
Pausen(1000); // das ist eine Funktion wie Sleep
Button1.Color:=clWhite;
Es funktioniert aber !!!
während dieser 2 Sekunden wird alles gefroren
das heißt mein Programm ist damit für 2 Sekunden lang tot :mrgreen:

Wie kann ich die Farbe für 2 Sekunden ändern ohne das Programm zu stören?
Oder muss ich unbedingt einen Timer verwenden ?

mkinzler 12. Mai 2008 15:16

Re: Eigenschaften eines Objektes für ein paar Sekunden zuwei
 
Wie sieht Pause() aus?

dominikkv 12. Mai 2008 15:16

Re: Eigenschaften eines Objektes für ein paar Sekunden zuwei
 
versuchs mal mit DelayDelay aus der CodeLib

Die Muhkuh 12. Mai 2008 15:16

Re: Eigenschaften eines Objektes für ein paar Sekunden zuwei
 
Timer oder Delay.

Für was soll das gut sein? ;)

Der_Unwissende 12. Mai 2008 15:23

Re: Eigenschaften eines Objektes für ein paar Sekunden zuwei
 
Hi,

was schon in der Frage von mkinzler steckt (und wahrscheinlich Dein Problem ist), Warten kann die weitere Abarbeitung blockieren. Typische Beispiele währen eben sleep (da der aufrufende Thread schlafen gelegt wird, ganz ungünstig im Main - Thread) bzw. auch das Warten in einer While-Schleife (die z.B. per GetTickCount eine bestimmte Zeit abwartet).

Es gibt dazu gleich verschiedene Lösungsansätze. Etwas unschön (aber funktionsfähig) ist die Verwendung einer Schleife, in der Du ständig Application.ProcessMessages aufrufst, also z.B.

Delphi-Quellcode:
procedure wait(const delay: Cardinal);
var time: DWORD;
begin
  time := GetTickCount;
  while (GetTickCount - time) < delay do
    Application.ProcessMessages;
end;
Alternativ dazu kannst Du natürlich das Warten (bzw. auch das komplette Färben) in einen anderen Thread auslagern (achtung, der muss beim Zugriff auf den Button mit dem VCL - Mainthread synchronisiert werden). Legst Du den mittels sleep schlafen hat das keinen Effekt auf das restiliche Programm.

Eine weitere Möglichkeit (vielleicht die einfachste und schönste) ist es Delay zuverwenden (einfach mal in der Dp suchen). Da hat mal jmd. eine Funktion gepostet, die auf MsgWaitForMultipleObjects wartet, aber durch alle Ereignisse "aufgeweckt" wird, die Ereignisse abarbeitet und das Warten fortsetzt.

Gruß,
Der Unwissende

Delphiturbo 12. Mai 2008 15:32

Re: Eigenschaften eines Objektes für ein paar Sekunden zuwei
 
Ich habe Deine Funktion wait und auch Delay verwendet
Alle blockieren das Programm
Das Button ruft einen Link
ich gebe das Button mit Delay oder mit einer Funktion die Farbe rot
solange das Button rot ist, ist das Button immer tot und ruft keinen Link auf !
ist die Farbe weg, dann funktioniert das Button wieder !!!

Ich würde vielleicht einen Timer als letzte Lösung nehmen :cry:

mkinzler 12. Mai 2008 15:33

Re: Eigenschaften eines Objektes für ein paar Sekunden zuwei
 
Dann Poste doch mal den Code deiner Funktion

Delphiturbo 12. Mai 2008 15:44

Re: Eigenschaften eines Objektes für ein paar Sekunden zuwei
 
Zitat:

Zitat von mkinzler
Dann Poste doch mal den Code deiner Funktion

Delphi-Quellcode:
procedure Pausen(Laps : Cardinal);
var
Debe,fine : Cardinal;
begin
Debe := gettickcount;
  Fine := debe + Laps;
  while Fine>Debe do
begin
    Debe := gettickcount;
    Application.ProcessMessages
  end;
end;

mkinzler 12. Mai 2008 15:49

Re: Eigenschaften eines Objektes für ein paar Sekunden zuwei
 
Es sollte eigentlich so funktionieren, obwohl in deinem Code Application.ProccessMessages etwas (zu) oft aufgerufen wird.
Man sollte lieber passiv warten:
http://www.delphipraxis.net/internal...ect.php?t=7355

Delphiturbo 12. Mai 2008 16:07

Re: Eigenschaften eines Objektes für ein paar Sekunden zuwei
 
Vielen Dank mkinzler
Obwohl ich mein Problem mit einem Timer gelöst habe, habe ich
wieder den Timer weg geschmissen.
Ich habe den Delay (Passiv) getestet. Es funktioniert wunderbar und blockiert das Programm überhaupt nicht :thumb:

gruß


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