AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Verwendung der System Komponente "Timer" ohne grafische Komponente in eigener Klasse
Thema durchsuchen
Ansicht
Themen-Optionen

Verwendung der System Komponente "Timer" ohne grafische Komponente in eigener Klasse

Ein Thema von FriendOfDelphi · begonnen am 5. Okt 2010 · letzter Beitrag vom 6. Okt 2010
Antwort Antwort
Seite 1 von 2  1 2      
FriendOfDelphi

Registriert seit: 21. Mai 2010
163 Beiträge
 
Delphi 5 Professional
 
#1

Verwendung der System Komponente "Timer" ohne grafische Komponente in eigener Klasse

  Alt 5. Okt 2010, 14:18
Delphi-Version: 5
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 Timer1:=TTimer.Create(self); .
Was mache ich falsch? Was muss ich anstatt "self" in die Klammer schreiben?
Herzlichen Gruß
FriendOfDelphi
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt 5. Okt 2010, 14:20
Wenn Du den Timer im Destruktor wieder freigibst, kannst Du auch nil übergeben.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#3

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

  Alt 5. Okt 2010, 14:25
Hallo Allerseits,

Der Compiler meldet hier den Fehler: UProgramm.pas(51): Inkompatible Typen: 'TComponent' und 'TEigeneKlasse' in der Zeile 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
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#4

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

  Alt 5. Okt 2010, 14:25
    Timer1.name:='Timer';
Unnötige Zeile. Du greift ja mit dem Variablennamen auf die Instanz zu.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.735 Beiträge
 
Delphi 2007 Professional
 
#5

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

  Alt 5. Okt 2010, 17:21
    Timer1.name:='Timer';
Unnötige Zeile. Du greift ja mit dem Variablennamen auf die Instanz zu.
Nützliche Zeile - hilft beim Debuggen.
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#6

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

  Alt 5. Okt 2010, 18:45
In wie fern?
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.735 Beiträge
 
Delphi 2007 Professional
 
#7

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

  Alt 5. Okt 2010, 19:25
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 AComponent: TComponent reinkriegt, sehe, dass AComponent mein EditKundenNummer ist, ohnen dass ich in den diversen Debug-Fenstern groß casten oder Funktionsauswertung zulassen o.ä. muss.
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

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

  Alt 6. Okt 2010, 07:49
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?
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#9

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

  Alt 6. Okt 2010, 08:15
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
  Mit Zitat antworten Zitat
Progman

Registriert seit: 31. Aug 2007
Ort: 99974 MHL
695 Beiträge
 
Delphi 10.1 Berlin Starter
 
#10

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

  Alt 6. Okt 2010, 08:51
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.
Karl-Heinz
Populanten von Domizilen mit fragiler, transparenter Aussenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
(Wer im Glashaus sitzt sollte nicht mit Steinen werfen)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:35 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