Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TTimer zur Laufzeit erstellen/entfernen (https://www.delphipraxis.net/40771-ttimer-zur-laufzeit-erstellen-entfernen.html)

Rastaman 20. Feb 2005 19:02


TTimer zur Laufzeit erstellen/entfernen
 
Hallo allerseits :hi:
Also Folgendes.
Ich habe ein Programm welches mit einer ziemlich langen for Schleife arbeitet.
Das dumme ist natürlich jetzt, dass man die Form in der Zeit nicht kontrollieren kann bzw. überhaupt nichts machen kann.
Also hab ich mir gedacht nehm ich 100 Timer.
Folgender Code :
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    TimerArray: Array of TTimer;
    procedure Count(Sender: TObject);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Timer: TTimer;

implementation

{$R *.dfm}

procedure TForm1.Count(Sender: TObject);
begin
  Label1.Caption := IntToStr(StrToInt(Label1.Caption) + 1)
end;
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  SetLength(TimerArray,100);
  For i := 1 to 100 do begin
    TimerArray[i] := TTimer.Create(self);
    With TimerArray[i] do begin
      Enabled := True;
      Interval := 1;
      OnTimer := Count;
    end;
  end;
  Button1.Enabled := False;
  Button2.Enabled := True;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  i: Integer;
begin
  SetLength(TimerArray,100);
  For i := 1 to 100 do
    TimerArray[i].Enabled := False;
  For i := 1 to 100 do
    TimerArray[i].Free;
  Button1.Enabled := True;
  Button2.Enabled := False;
end;
Natürlich ist der Sinn nicht die Zahl im Label zu erhöhen. Die eigentlich Funktion kommt da später erst :zwinker:
Das Starten der Timer funktioniert wunderbar, aber wenn ich auf Stop(Button2) klicke kommt folgender Fehler:

Code:
Access Violation at Adress 00401C52 in Module 'Project2.exe'. Write of adress 004276A4
Was mach ich da falsch?

alcaeus 20. Feb 2005 19:04

Re: TTimer zur Laufzeit erstellen/entfernen
 
Und zum wasweissichwievielten mal(:zwinker:): Dynamische Arrays beginnen bei 0 und gehn bis Laenge-1, also in deinem Fall von 0..99

Greetz
alcaeus

Rastaman 20. Feb 2005 19:06

Re: TTimer zur Laufzeit erstellen/entfernen
 
Dabei hab ich mir das heut Mittag nochmal angeschaut :oops:
Klappt! Danke :thumb:

sECuRE 20. Feb 2005 19:50

Re: TTimer zur Laufzeit erstellen/entfernen
 
Hi,

wenn ein Prog während einer Schleife nicht reagiert sollte man lieber Application.ProcessMessages; benutzen...

cu, sECuRE

alcaeus 20. Feb 2005 19:51

Re: TTimer zur Laufzeit erstellen/entfernen
 
Zitat:

Zitat von sECuRE
wenn ein Prog während einer Schleife nicht reagiert sollte man lieber Application.ProcessMessages; benutzen...

:gruebel: Das war doch ueberhaupt nicht das Problem...

Greetz
alcaeus

phXql 20. Feb 2005 21:34

Re: TTimer zur Laufzeit erstellen/entfernen
 
Zitat:

Zitat von alcaeus
Zitat:

Zitat von sECuRE
wenn ein Prog während einer Schleife nicht reagiert sollte man lieber Application.ProcessMessages; benutzen...

:gruebel: Das war doch ueberhaupt nicht das Problem...

Greetz
alcaeus

Zitat:

Zitat von Gerrit89
Das dumme ist natürlich jetzt, dass man die Form in der Zeit nicht kontrollieren kann bzw. überhaupt nichts machen kann.

Wenn die Form in einer schleife nich mehr reagiert, dann stimme ich sECuRE zu, sollte man doch besser application.processMessages verwenden...

scp 20. Feb 2005 21:42

Re: TTimer zur Laufzeit erstellen/entfernen
 
Vor allem wenn es darum geht, nur den Status zu aktualisieren reicht das völlig aus.
Ganz davon zu schweigen davon, das 100 Timer mit einem Interval von 1 ein ganz schönes Chaos anrichten können.
Delphi-Quellcode:
for i := 1 to 12345 do
begin
  // ...
  Label1.Caption := IntToStr(StrToInt(Label1.Caption) + 1)
  Application.ProcessMessages;
end;
PS: Wenn die Schleife sehr schnell durchläuft, sollte man eventuell den Aufruf der beiden Zeilen einsschränken, z.B. etwa so:
Delphi-Quellcode:
If (i mod 10) = 0 then

alcaeus 21. Feb 2005 06:42

Re: TTimer zur Laufzeit erstellen/entfernen
 
Zitat:

Zitat von Gerrit89
Das dumme ist natürlich jetzt, dass man die Form in der Zeit nicht kontrollieren kann bzw. überhaupt nichts machen kann.

:oops: Wer lesen kann ist klar im Vorteil :duck:
Als Alternative zu Application.ProcessMessages sollte man evtl. noch einen Thread erwähnen...

Greetz
alcaeus


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