Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Verwendung der System Komponente "Timer" ohne grafische Komponente in eigener Klasse (https://www.delphipraxis.net/155024-verwendung-der-system-komponente-timer-ohne-grafische-komponente-eigener-klasse.html)

FriendOfDelphi 5. Okt 2010 14:18

Delphi-Version: 5

Verwendung der System Komponente "Timer" ohne grafische Komponente in eigener Klasse
 
Hallo Allerseits,

ich habe eine Frage zu der Timer-Komponente.

Mein Ziel ist es ohne grafische Programmierung, einen Timer vom Typ TTimer in einer eigenen Klasse zu verwenden.
Grundsätzlich geschafft habe ich dies schon in einem "normalen" Programm (siehe Beispielquellcode):
Delphi-Quellcode:
unit Timer_ohne_Grafik;

interface

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

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure Abgelaufen(Sender: TObject);
    procedure FormCreate(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Abgelaufen(Sender: TObject);
begin
  ShowMessage('Test');
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
    Timer1:=TTimer.Create(self);
    Timer1.Enabled:=true;
    Timer1.name:='Timer';
    Timer1.Interval:=5000;
    Timer1.OnTimer:=Abgelaufen;
end;

end.
Ich möchte den Timer aber in einer eignen Klasse verwenden.
Wenn also eine Instanz der eigenen Klasse erzeugt wird, soll automatisch ein Timer mit erzeugt werden, der dann in dieser Instanz läuft.

Quelltext des Konstruktors:
Delphi-Quellcode:
constructor TEigeneKlasse.Create(iModus: integer);
var
  i, j: integer;
begin
  inherited Create; //hierdurch wird der ursprüngliche Konstruktor aufgerufen
    FiModus := iModus;
  Timer1:=TTimer.Create(self);
  Timer1.Enabled:=true;
  Timer1.name:='Timer';
  Timer1.Interval:=5000;
  Timer1.OnTimer:=Abgelaufen;
end;
Der Compiler meldet hier den Fehler: UProgramm.pas(51): Inkompatible Typen: 'TComponent' und 'TEigeneKlasse' in der Zeile
Delphi-Quellcode:
Timer1:=TTimer.Create(self);
.
Was mache ich falsch? Was muss ich anstatt "self" in die Klammer schreiben?

DeddyH 5. Okt 2010 14:20

AW: Verwendung der System Komponente "Timer" ohne grafische Komponente in eigener Kla
 
Wenn Du den Timer im Destruktor wieder freigibst, kannst Du auch nil übergeben.

messie 5. Okt 2010 14:25

AW: Verwendung der System Komponente "Timer" ohne grafische Komponente in eigener Kla
 
Zitat:

Zitat von FriendOfDelphi (Beitrag 1053926)
Hallo Allerseits,

Der Compiler meldet hier den Fehler: UProgramm.pas(51): Inkompatible Typen: 'TComponent' und 'TEigeneKlasse' in der Zeile
Delphi-Quellcode:
Timer1:=TTimer.Create(self);
.
Was mache ich falsch? Was muss ich anstatt "self" in die Klammer schreiben?

Beim Create wird immer der owner übergeben. Damit wird der Speicher des Timers freigegeben, wenn das destroy des owners stattfindet. Das ist bei Verwendung der visuellen Komponente das Form. Sinnvoll wäre es also, das Hauptformular anzugeben.

Wenn Du ganz unabhängig von den visuellen Komponenten sein willst, wäre der Multimediatimer eine Alternative.

Grüße, Messie

Bernhard Geyer 5. Okt 2010 14:25

AW: Verwendung der System Komponente "Timer" ohne grafische Komponente in eigener Kla
 
Zitat:

Zitat von FriendOfDelphi (Beitrag 1053926)
Delphi-Quellcode:
    Timer1.name:='Timer';

Unnötige Zeile. Du greift ja mit dem Variablennamen auf die Instanz zu.

uligerhardt 5. Okt 2010 17:21

AW: Verwendung der System Komponente "Timer" ohne grafische Komponente in eigener Kla
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1053930)
Zitat:

Zitat von FriendOfDelphi (Beitrag 1053926)
Delphi-Quellcode:
    Timer1.name:='Timer';

Unnötige Zeile. Du greift ja mit dem Variablennamen auf die Instanz zu.

Nützliche Zeile - hilft beim Debuggen. :lol:

Die Muhkuh 5. Okt 2010 18:45

AW: Verwendung der System Komponente "Timer" ohne grafische Komponente in eigener Kla
 
In wie fern?

uligerhardt 5. Okt 2010 19:25

AW: Verwendung der System Komponente "Timer" ohne grafische Komponente in eigener Kla
 
Zitat:

Zitat von Die Muhkuh (Beitrag 1053972)
In wie fern?

Meinst du mich? Ich setze bei (fast) jeder instantiierten Komponente den Namen, weil ich dann beim Debuggen, z.B. tief in den VCL-Eingeweiden in einer Routine, die ein
Delphi-Quellcode:
AComponent: TComponent
reinkriegt, sehe, dass AComponent mein EditKundenNummer ist, ohnen dass ich in den diversen Debug-Fenstern groß casten oder Funktionsauswertung zulassen o.ä. muss.

Sir Rufo 6. Okt 2010 07:49

AW: Verwendung der System Komponente "Timer" ohne grafische Komponente in eigener Kla
 
Zitat:

Zitat von messie (Beitrag 1053929)
Beim Create wird immer der owner übergeben. Damit wird der Speicher des Timers freigegeben, wenn das destroy des owners stattfindet. Das ist bei Verwendung der visuellen Komponente das Form. Sinnvoll wäre es also, das Hauptformular anzugeben.

Wenn die Komponente in einer eigenen Klasse instanziert wird, dann ist das aber grober Unfug, denn dann sollte diese Klasse auch für das freigeben verantwortlich sein.
Und was macht man wenn man diese Klasse in einer fensterlosen App nutzen möchte?

messie 6. Okt 2010 08:15

AW: Verwendung der System Komponente "Timer" ohne grafische Komponente in eigener Kla
 
Zitat:

Zitat von Sir Rufo (Beitrag 1054024)
Zitat:

Zitat von messie (Beitrag 1053929)
Beim Create wird immer der owner übergeben. Damit wird der Speicher des Timers freigegeben, wenn das destroy des owners stattfindet. Das ist bei Verwendung der visuellen Komponente das Form. Sinnvoll wäre es also, das Hauptformular anzugeben.

Wenn die Komponente in einer eigenen Klasse instanziert wird, dann ist das aber grober Unfug, denn dann sollte diese Klasse auch für das freigeben verantwortlich sein.
Und was macht man wenn man diese Klasse in einer fensterlosen App nutzen möchte?

Die Kompo TTimer verlangt im create als owner eine TComponent. Und die muss man eben übergeben, da trat der Fehler auf. Das andere sollte gar nicht auf die eigene Klasse eingehen, sondern nur als Minimalbeispiel für die Verwendung des Owners sein.

Grüße, Messie

Progman 6. Okt 2010 08:51

AW: Verwendung der System Komponente "Timer" ohne grafische Komponente in eigener Kla
 
Warum nicht einfach:
Delphi-Quellcode:
constructor TEigeneKlasse.Create(iModus: integer);
var
  i, j: integer;
begin
  inherited Create; //hierdurch wird der ursprüngliche Konstruktor aufgerufen
    FiModus := iModus;
  Timer1:=TTimer.Create(nil);
  Timer1.Enabled:=true;
  Timer1.Interval:=5000;
  Timer1.OnTimer:=Abgelaufen;
end;

destructor TEigeneKlasse.destroy; //evtl. override;
begin
  Timer1.Free;
  inherited;
end:
So mach ich das immer und das klappt in jeder eigenen Klasse, besonders in nicht visuellen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:45 Uhr.
Seite 1 von 2  1 2      

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