![]() |
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. |
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? |
Re: Timer in Klassen mehrmals verwenden.
der timer soll den strich vergrößern...
|
Re: Timer in Klassen mehrmals verwenden.
In deinem code macht er aber garnichts.
|
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. ;-) |
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... |
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 ![]() Edit Nachtrag: Such auch mal nach ![]() ![]() |
Re: Timer in Klassen mehrmals verwenden.
ok, vielen dank erstmal.
|
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; |
Re: Timer in Klassen mehrmals verwenden.
Delphi-Quellcode:
Und jetzt würde ich, wie ich oben schon mal schrieb, den Verweise auf die globalen Variablen entfernen.
constructor TWindradTimer.Create (AOwner:TComponent); // timer wird erstellt
begin inherited Create (AOwner); Enabled:=True; OnTimer:=OnTimerEvent; end; |
Re: Timer in Klassen mehrmals verwenden.
danke, jetzt funktioniert ist.
|
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; |
Re: Timer in Klassen mehrmals verwenden.
danke nochmal :hello: :hello: :hello:
|
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:
gruß fabgo
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; |
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. |
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; |
Re: Timer in Klassen mehrmals verwenden.
wo verwendest du die procedure setX1( value: Integer); ???
und was soll sie bewirken? |
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 05:24 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