Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Timer enablen (https://www.delphipraxis.net/143079-timer-enablen.html)

Reap3r 9. Nov 2009 14:35


Timer enablen
 
Hi Leute!

Ich habe ein genz einfaches Problem.

Undzwar habe ich in einem Programm mehrere Timer.
Diese habe ich im Objektinspektor auf nicht enabled gestellt.
Wenn ich nun einen Button drücke sollen sie enabled werden!
Ich dachte immer, das ginge, doch es funktioniert nich!

Also im Button steht dann:

Delphi-Quellcode:
Form3.timer1.enabled:= true;
Was mache ich falsch?

turboPASCAL 9. Nov 2009 14:37

Re: Timer enablen
 
Ja, muss aber was anderes sein.

Klaus01 9. Nov 2009 14:39

Re: Timer enablen
 
Hi,

was funktioniert denn nicht?
Läuft Dein Timer nicht los?
Gibt der Compiler eine Fehlermeldung aus?

Grüße
Klaus

Reap3r 9. Nov 2009 14:41

Re: Timer enablen
 
Achso ja sry hab ich vergessen^^

Der Timer wird garnicht erst aktiviert!

Klaus01 9. Nov 2009 14:44

Re: Timer enablen
 
Zitat:

Zitat von Reap3r
Achso ja sry hab ich vergessen^^

Der Timer wird garnicht erst aktiviert!

Woran merkst Du das?

Zeige doch mal den Code der ausgeführt werden soll
wenn der Timer aktiviert ist.
Wie groß ist das Intervall?

Grüße
Klaus

Luckie 9. Nov 2009 14:46

Re: Timer enablen
 
Wenn der Code in einer Methode des selben Formulares steht, lass mal den Formularbezeicher weg.

Reap3r 9. Nov 2009 14:49

Re: Timer enablen
 
Der code sieht so aus:

Delphi-Quellcode:
procedure TForm3.Timer1Timer(Sender: TObject);
begin
  if form3.L1.Visible = true
  then begin form3.L1.visible := false;
  form3.Image1.Visible:= false;
  form3.Image2.Visible:= true;
  form3.L2.Visible:= true;
  end;
end;
auf form3 ist ein Image und ein Label zu sehen!(Image1/L1)
Diese sind auf visible:= true eingestellt.
Der Timer soll diese nun wenn zu sehen visible:= false schalten
und ein anderes Image und ein anderes Label visible:= true schalten.(Image2/L2).

Das intervall des Timers ist auf 9 sekunden festgelegt, damit das erste Image bzw. Label 9 Sekunden zu sehen ist,
und dann umgeschaltet wird.

Klaus01 9. Nov 2009 15:13

Re: Timer enablen
 
.. ändert sich etwas wenn Du es so umschreibst?

Delphi-Quellcode:
procedure TForm3.Timer1Timer(Sender: TObject);
begin
  if L1.Visible then
    begin
      L1.visible := false;
      Image1.Visible:= false;
      Image2.Visible:= true;
      L2.Visible:= true;
  end;
end;
Ansonsten stellen mal Deine Button.click Methode
hier ein.

Grüße
Klaus

p80286 9. Nov 2009 15:18

Re: Timer enablen
 
Delphi-Quellcode:
procedure TForm3.Timer1Timer(Sender: TObject);
begin
  if L1.Visible then
    begin
      L1.visible := false;
      Image1.Visible:= false;
      Image2.Visible:= true;
      L2.Visible:= true;
   
  end;
  application.processmessages; // <<<<<<<< Erweitern!! 
end;
man muß dem Programm auch die Chance geben Änderungen anzuzeigen.

Und mit F4 (Debugger)in die Timer-Methode gehen ob sie überhaupt aufgerufen wird.

Gruß
K-H

Reap3r 9. Nov 2009 15:24

Re: Timer enablen
 
Was Bringt mir application.processmessages;?
bzw. wie benutze ich es?

Und Klaus01 das verändert leider nichts!

DeddyH 9. Nov 2009 15:24

Re: Timer enablen
 
Ich glaube nicht, dass Application.ProcessMessages die Lösung ist, es handelt sich ja nicht um eine langlaufende Schleife, die den Rest des Programms blockiert.

blauweiss 9. Nov 2009 16:05

Re: Timer enablen
 
Zitat:

Zitat von DeddyH
Ich glaube nicht, dass Application.ProcessMessages die Lösung ist, es handelt sich ja nicht um eine langlaufende Schleife, die den Rest des Programms blockiert.

Im Gegenteil, Application.ProcessMessages ist so ziemlich das Gefährlichste, wenn es unbedarft "einfach mal so" eingesetzt wird.
Es ist mir ein Rätsel, warum diese "Lösung" für reine Anzeigeaktualisierungsprobleme hier im Forum so gerne vorgeschlagen wird.

blauweiss

p80286 9. Nov 2009 16:21

Re: Timer enablen
 
Wenn man an der anzeige "herum fummelt" dan müssen diese änderungen ja auch irgendwie zur Anzeige kommen.
Warum sollte diese Anzeigeänderung dann damit nicht durchgeführt werden?


Zitat:

Zitat von DeddyH
Ich glaube nicht, dass Application.ProcessMessages die Lösung ist, es handelt sich ja nicht um eine langlaufende Schleife, die den Rest des Programms blockiert.

OK daran hatte ich nicht gedacht!

[quote="blauweiss"]
Zitat:

Zitat von DeddyH
Im Gegenteil, Application.ProcessMessages ist so ziemlich das Gefährlichste, wenn es unbedarft "einfach mal so" eingesetzt wird.
Es ist mir ein Rätsel, warum diese "Lösung" für reine Anzeigeaktualisierungsprobleme hier im Forum so gerne vorgeschlagen wird.

blauweiss

Was, bitte, ist daran gefährlich? Überflüssig, ja, gefährlich???

Bitte, ich bin für jede Belehrung dankbar.

Gruß
K-H

blauweiss 9. Nov 2009 16:40

Re: Timer enablen
 
[quote="p80286"]Wenn man an der anzeige "herum fummelt" dan müssen diese änderungen ja auch irgendwie zur Anzeige kommen.
Warum sollte diese Anzeigeänderung dann damit nicht durchgeführt werden?

dafür bietet sich z.B. aControl.Paint oder aControl.Refresh an.

Zitat:

Zitat von blauweiss
Zitat:

Zitat von DeddyH
Im Gegenteil, Application.ProcessMessages ist so ziemlich das Gefährlichste, wenn es unbedarft "einfach mal so" eingesetzt wird.
Es ist mir ein Rätsel, warum diese "Lösung" für reine Anzeigeaktualisierungsprobleme hier im Forum so gerne vorgeschlagen wird.

blauweiss

Was, bitte, ist daran gefährlich? Überflüssig, ja, gefährlich???

Bitte, ich bin für jede Belehrung dankbar.

Gruß
K-H


Gefährlich: Mit Application.ProcessMessages wird quasi Parallelität ermöglicht.
Folgendes Beispiel:
In einem ButtonClick wird eine komplexe Berechnung auf dem "aktuellen Datensatz" durchgeführt. Weil während der Berechnung die Anwendung scheinbar eingefroren ist, wird jetzt z.B. in einer Schleife Application.ProcessMessages aufgerufen. Damit wird aber die Windows-Nachrichtenschleife abgearbeitet ! Der Anwender kann den Button ein weiteres Mal klicken -> die gleiche Berechnung startet ein weiteres Mal, während noch die vorherige läuft. Oder der Anwender ruft den Menuepunkt "Datei entfernen" auf -> der Datensatz wird entfernt, auf dem "gleichzeitig" die Berechnung läuft.
Application.ProcessMessages kann sehr nützlich sein, aber man muß sich bewußt sein, daß bestimmte Benutzeraktionen dann ausgeschlossen werden müssen.

Grüße,
blauweiss

simmi 9. Nov 2009 16:46

Re: Timer enablen
 
Hallo,

also ich habe einfach einmal Deinen Quelltext genommen und ausprobiert. Bei mir funktioniert es ohne jedes Problem. Hast Du einmal geprüft, ob Dein Problem eine andere Ursache haben könnte?

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
timer1.Enabled:=true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if label1.Visible = true
  then
    begin
    label1.visible := false;
    Image1.Visible:= false;
    Image2.Visible:= true;
    label2.Visible:= true;
    end;
end;

DeddyH 9. Nov 2009 16:52

Re: Timer enablen
 
Ich könnte mir vorstellen, dass dem Timer-Ereignis keine Methode zugewiesen ist.

p80286 9. Nov 2009 17:01

Re: Timer enablen
 
Zitat:

Zitat von blauweiss

dafür bietet sich z.B. aControl.Paint oder aControl.Refresh an.

Da ich damit (in Schleifen, langen Verarbeitungsabfolgen) bisher keinen Erfolg hatte....

Zitat:

Zitat von blauweiss

Gefährlich: Mit Application.ProcessMessages wird quasi Parallelität ermöglicht.
Folgendes Beispiel:
In einem ButtonClick wird eine komplexe Berechnung auf dem "aktuellen Datensatz" durchgeführt. Weil während der Berechnung die Anwendung scheinbar eingefroren ist, wird jetzt z.B. in einer Schleife Application.ProcessMessages aufgerufen. Damit wird aber die Windows-Nachrichtenschleife abgearbeitet ! Der Anwender kann den Button ein weiteres Mal klicken -> die gleiche Berechnung startet ein weiteres Mal, während noch die vorherige läuft. Oder der Anwender ruft den Menuepunkt "Datei entfernen" auf -&gt; der Datensatz wird entfernt, auf dem "gleichzeitig" die Berechnung läuft.

Application.ProcessMessages kann sehr nützlich sein, aber man muß sich bewußt sein, daß bestimmte Benutzeraktionen dann ausgeschlossen werden müssen.

Dem wäre dann nichts mehr hinzuzufügen?!
Gruß
K-H

Reap3r 10. Nov 2009 20:47

Re: Timer enablen
 
hmmm...mann mann mann

ich bekomms net raus!
sitze schon soo lange daran, finde aber keinen Fehler!

Bitte helft mir.

Sir Rufo 10. Nov 2009 21:40

Re: Timer enablen
 
Setz doch mal ein ShowMessage rein, dann siehst du ob der Timer losläuft oder nicht!

(auf die Frage mit dem Debugger hast du ja schließlich nicht geantwortet)

Delphi-Quellcode:
procedure TForm3.Timer1Timer(Sender: TObject);
begin
  ShowMessage( 'Ich bin Timer1, ich laufe jetzt los :-)' );
  if L1.Visible then // <--- Hier mal alternativ zum ShowMessage einen Breakpoint setzen
    begin
      L1.visible := false;
      Image1.Visible:= false;
      Image2.Visible:= true;
      L2.Visible:= true;
  end;
end;
BreakPoint -> Haltepunkt -> Wird das Programm in der Delphi-IDE mit F9 gestartet, dann hält es genau an dieser Stelle an

Zitat:

Zitat von DeddyH
Ich könnte mir vorstellen, dass dem Timer-Ereignis keine Methode zugewiesen ist.

Tja, aber dazu äussert er sich ja nicht ... da können wir wohl auch nicht helfen.

Reap3r 11. Nov 2009 13:09

Re: Timer enablen
 
Also...
nach einigem Probieren hab ich herausgefunden, dass der timer erst anspringt, wenn mann ihn zum 2. mal über den Button aktiviert.
Ich frag mich nur, warum er es beim ersten mal nicht tut...

turboPASCAL 11. Nov 2009 13:18

Re: Timer enablen
 
Weil du irgend wo in deinem Quelltext einen Fehler hast.
Da wir nicht wissen was in deinem Programmcode vor sich geht, polieren wir fleissig die Gaskugel. ;)


:glaskugel:

Reap3r 12. Nov 2009 07:11

Re: Timer enablen
 
Ahh, habs raus!

Das Problem lag daran, dass die Labels und images auf einer anderen Form waren, ide ich durch button click
mit showmodal aufrufe. Allerdings stand das showmodal vor dem aktivieren des Timers!
Habe einfach die Reihenfolge verändert, jetzt gehts.

Micha88 12. Nov 2009 09:13

Re: Timer enablen
 
Niemals auf true oder false prüfen!

besser so:

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
 if Label1.Visible {= True} then // { } => Kommentar, wird also vom Compiler ignoriert
  begin
   Label1.visible := False;
   Image1.Visible:= False;
   Image2.Visible:= True;
   Label2.Visible:= True;
  end;
end;


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