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 Timer in Klassen mehrmals verwenden. (https://www.delphipraxis.net/78255-timer-klassen-mehrmals-verwenden.html)

fabgo 1. Okt 2006 22:45


Timer in Klassen mehrmals verwenden.
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo ihr,

komme hier grad nicht weiter und brauch eure hilfe.

Zu meinem Programm: Ich möchte durch eingabe zweier Koordinaten eine Position für einen Strich festlegen, welcher nach Mouseklick auf "Zeichnen", dann bei Mouseklick auf "vergrößern" sich immer mehr vergrößert...
Bei Buttonklick "Zeichnen" soll jedesmal ein neuer strich mit einem neuen timer erstellt werden.


Mein Problem liegt in der verwendung von timern bei klassen.

wo kann der fehler liegen? Bitte helfen :wink:

Delphi-Quellcode:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Image1: TImage;
    btvergroessern: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

type
  TWindradTimer = class (TTimer)
  public
    constructor Create (AOwner:TComponent);override;
    procedure Bild(x1,y1:integer);
end;


var
  Form1: TForm1;
  x1,y1,x2:integer;
  Timer1:TWindradTimer;
implementation

{$R *.DFM}

constructor TWindradTimer.Create (AOwner:TComponent);
begin
  inherited Create (AOwner);
  x2:=x2+1;
end;

procedure TWindradTimer.Bild(x1,y1:integer);
begin

  with Form1.Image1.Canvas do begin
  MoveTo(x1,y1);
  LineTo(x2,y1);
  end;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Timer1:=TWindradTimer.Create(Form1);
  Timer1.Bild(StrToInt(Edit1.text),StrToInt(Edit2.text));

end;

procedure TForm1.FormActivate(Sender: TObject);
begin
 x2:=1;
end;

end.

mkinzler 1. Okt 2006 22:53

Re: Timer in Klassen mehrmals verwenden.
 
Es ist sehr gefährlich in Klassen auf gloable Variablen der Unit zuzugreifen ( x2, Form1).
Deshalb würde ich x2 dem Konstruktor übergeben und Form1 durch Parent ersetzen ( und den dann setzen).
Zu was brauchst du den Timer? Was soll er machen?

fabgo 1. Okt 2006 22:56

Re: Timer in Klassen mehrmals verwenden.
 
der timer soll den strich vergrößern...

mkinzler 1. Okt 2006 23:09

Re: Timer in Klassen mehrmals verwenden.
 
In deinem code macht er aber garnichts.

DP-Maintenance 2. Okt 2006 07:50

DP-Maintenance
 
Dieses Thema wurde von "Phoenix" von "Object-Pascal / Delphi-Language" nach "VCL / WinForms / Controls" verschoben.
Ich will ja eigentlich nicht kleinlich sein, aber der TTimer ist schon ne VCL-Komponente. ;-)

fabgo 2. Okt 2006 08:11

Re: Timer in Klassen mehrmals verwenden.
 
ja, und meine frage ist ja genau "warum nicht?" könnt ihr mir sagen, wie ich das dann machen muss?
ich komm hier nicht weiter...wär echt super...

Phoenix 2. Okt 2006 08:15

Re: Timer in Klassen mehrmals verwenden.
 
Deinem Timer wurde gar keine Funktion zugewiesen die genau dann ausgeführt werden soll wenn er tickt.

Ein Beispiel wie das geht ist grad zufällig in diesem Thread zu sehen - wenn auch mit Schreibfehler ;-)

Edit Nachtrag: Such auch mal nach Hier im Forum suchenEvent zuweisen hier in der DP bzw. nach Hier im Forum suchenTTimer. Da findest Du eigentlich genug Codebeispiele die Dir weiterhelfen dürften.

fabgo 2. Okt 2006 08:56

Re: Timer in Klassen mehrmals verwenden.
 
ok, vielen dank erstmal.

fabgo 2. Okt 2006 10:03

Re: Timer in Klassen mehrmals verwenden.
 
ja, jetzt habe ich es genau so gemacht, wie in dem genannten thread...

wenn ich aber jetzt auf meinen Button klicke, kommt ein Zugriffsfehler.


meine definierte Klasse:
Delphi-Quellcode:
type
  TWindradTimer = class (TTimer)
  public
    constructor Create (AOwner:TComponent);override;
    procedure OnTimerEvent(Sender:TObject);
end;
Delphi-Quellcode:
constructor TWindradTimer.Create (AOwner:TComponent);    // timer wird erstellt
begin
  Timer1.Enabled:=True;
  Timer1.OnTimer:=OnTimerEvent;
  inherited Create (AOwner);

end;

procedure TWindradTimer.OnTimerEvent(Sender:TObject);
begin
  x2:=x2+1;
  with Form1.Image1.Canvas do begin
    MoveTo(5,5);
    LineTo(x2,5);
  end;                                                  
end;
Delphi-Quellcode:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Timer1:=TWindradTimer.Create(Form1);
end;

mkinzler 2. Okt 2006 10:09

Re: Timer in Klassen mehrmals verwenden.
 
Delphi-Quellcode:
constructor TWindradTimer.Create (AOwner:TComponent);    // timer wird erstellt
begin
  inherited Create (AOwner);
  Enabled:=True;
  OnTimer:=OnTimerEvent;
end;
Und jetzt würde ich, wie ich oben schon mal schrieb, den Verweise auf die globalen Variablen entfernen.

fabgo 2. Okt 2006 10:17

Re: Timer in Klassen mehrmals verwenden.
 
danke, jetzt funktioniert ist.

mkinzler 2. Okt 2006 11:08

Re: Timer in Klassen mehrmals verwenden.
 
Nach Entfernung von Globalreferenzen:
Delphi-Quellcode:
type
  TWindradTimer = class (TTimer)
  private
    FCanvas: TCanvas;
  public
    constructor Create (AOwner:TComponent);override;
    constructor Create (AOwner:TComponent; Canvas: TCanvas);
    procedure OnTimerEvent(Sender:TObject);
  published
    property Canvas: TCanvas read FCanvas write FCanvas;
 end;
...
constructor TWindradTimer.Create (AOwner:TComponent; Canvas: TCanvas; ) // timer wird erstellt
begin
  inherited Create (AOwner);
  Enabled:=True;
  OnTimer:=OnTimerEvent;
  self.Canvas ;= Canvas;
end;

procedure TWindradTimer.OnTimerEvent(Sender:TObject);
begin
  x2:=x2+1;
  with self.Canvas do begin
    MoveTo(5,5);
    LineTo(x2,5);
  end;                                                  
end;

...

procedure TForm1.Button1Click(Sender: TObject);
begin
  Timer1:=TWindradTimer.Create(Form1, Self.Canvas);
end;

fabgo 2. Okt 2006 11:13

Re: Timer in Klassen mehrmals verwenden.
 
danke nochmal :hello: :hello: :hello:

fabgo 2. Okt 2006 13:44

Re: Timer in Klassen mehrmals verwenden.
 
Ziel meines Programms ist natürlich das gleichzeite laufen der striche, also die gleichzeitige verwendung der timer...

wenn ich also für meine Koordinaten jeweils die in "edit1" und "edit2" eingetippten werte verwende, sollten diese striche dann aber auch alle gleichzeitig weiterlaufen und nicht aufhören...dafür ja schließlich die verwendung von klassen.

aber wie mach ich das jetzt?

wenn ich das folgendermaßen mache, setzt der immer einen neuen startwert, läuft aber dann immer nur von den neuen koordinaten weiter. und nicht die alten und die neuen striche gemeinsam!

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Timer1:=TWindradTimer.Create(Form1, Self.Canvas);
  x1:=StrToInt(form1.edit1.text);
  y1:=StrToInt(form1.edit2.text);
  x2:=x1;
end;
gruß fabgo

mkinzler 2. Okt 2006 15:21

Re: Timer in Klassen mehrmals verwenden.
 
das hab ich vorhin übersehen, du verwendest ja in der Zeichenroutine auch noch globale Variablen.
Implementiere diese auch noch als properties und erweitere den Konstruktor dementsprechend.

mkinzler 2. Okt 2006 16:03

Re: Timer in Klassen mehrmals verwenden.
 
Delphi-Quellcode:
type
  TWindradTimer = class (TTimer)
  private
    FCanvas: TCanvas;
    Fx1: Integer;
  public
    constructor Create (AOwner:TComponent);override;
    constructor Create (AOwner:TComponent; Canvas: TCanvas; startx: Integer);
    procedure setX1( value: Integer);
    procedure OnTimerEvent(Sender:TObject);
  published
    property Canvas: TCanvas read FCanvas write FCanvas;
    property x1: Integer read Fx1 write setX1;
end;
...
constructor TWindradTimer.Create (AOwner:TComponent; Canvas: TCanvas; startx: Integer ) // timer wird erstellt
begin
  inherited Create (AOwner);
  Enabled:=True;
  OnTimer:=OnTimerEvent;
  self.Canvas := Canvas;
  self.x1 := startx;
end;

procedure TWindradTimer.OnTimerEvent(Sender:TObject);
begin
  x1:=x1+1;
  with self.Canvas do begin
    MoveTo(5,5);
    LineTo(x1,5);
  end;                                                  
end;

...

procedure TForm1.Button1Click(Sender: TObject);
begin
   x1:=StrToInt(form1.edit1.text);
   y1:=StrToInt(form1.edit2.text);
  Timer1:=TWindradTimer.Create(Form1, Self.Canvas, x1);
end;

fabgo 2. Okt 2006 16:31

Re: Timer in Klassen mehrmals verwenden.
 
wo verwendest du die procedure setX1( value: Integer); ???

und was soll sie bewirken?

mkinzler 2. Okt 2006 16:34

Re: Timer in Klassen mehrmals verwenden.
 
Diese hab ich wohl vergessen. In dieser kann man Prüfungen durchführen bevor man Werte in private Klassenmember übernimmt
Delphi-Quellcode:
procedure TWindradTimer.setX1( Value: Integer);
begin
    if value > 0 then // Hier noch mehr Überprüfungen möglich.
    Fx1 := Value;
end;


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