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/)
-   -   TTimer in einer freien Klasse (https://www.delphipraxis.net/129462-ttimer-einer-freien-klasse.html)

BAMatze 19. Feb 2009 15:25


TTimer in einer freien Klasse
 
Hallo,

kann ich einen TTimer in einer von mir freigestalteten Klasse integrieren? Ich denke eigentlich, dass dies möglich sein sollte, was mir eigentlich Probleme bereitet ist die Initialisierung des Timers. Hier mal mein bisheriger Versuch:

Delphi-Quellcode:
unit VT_Funktionen;

interface

uses
  Windows, SysUtils, Hilfsfunktionen, ExtCtrls;

const constMillimeter = 6400;

type TV_Tische = class
  private
    Tischbmp: TBitmap;
    TischDLL: TDLL_Datei;
    DLL_Handle: THandle;
    bBewegung, bkalibriert,bAngeschlossen: boolean;
    iaktuelleTischposition, iZielTischposition, iComport, iFehlercode: integer;
    Bewegungsueberwachung: TTimer;
    function Bewegtsich(const Kanal: integer): boolean;
    function Bremsen: boolean;
    function Geschwindigkeit_festlegen(const iGeschwindigkeit: integer): boolean;
    function Beschleunigung_festlegen(const iBeschleunigung: integer): boolean;
    function VTische_verbinden(Comport: integer): boolean;
    function Kalibrierung(const Kanal: integer): boolean;
    function Verfuegbarkeit: boolean;

    // Diese Funktioen müssen überprüft werden, ob sie wirklich private sein sollen
    function BewegenABS(dneuPos: double): boolean; overload;
    function BewegenABS(const KaliPos: string): boolean; overload;
    function BewegenABS(dneuPos: double; iGeschwindigkeit: integer): boolean; overload;
    function BewegenABS(dneuPos: double; iGeschwindigkeit, iBeschleunigung: integer):boolean; overload;

  public
    constructor create; reintroduce;
    destructor Destroy; override;
    property Handle: THandle read DLL_Handle;
    property Verfuebar: boolean read Verfuegbarkeit;

end;

...

constructor TV_Tische.create;
begin
  inherited create;
  bBewegung := false;
  bkalibriert := false;
  bAngeschlossen := false;
  TischDLL := TDLL_Datei.create('MMC.DLL');
  if TischDLL.Vorhanden then
    begin
      DLL_Handle := TischDLL.Handle;
    end
  else DLL_Handle := 0;
  Bewegungsueberwachung := TTimer.Create(Self);
end;

...
Mein Problem ist jetzt die fehlende TComponente, auf die der Timer initialisiert werden müsste. Hat jemand eine Lösung für mich, wie ich das machen könnte?

Vielen Dank
BAMatze

DeddyH 19. Feb 2009 15:27

Re: TTimer in einer freien Klasse
 
Übergib doch einfach nil.

himitsu 19. Feb 2009 15:29

Re: TTimer in einer freien Klasse
 
oder
Delphi-Quellcode:
type TV_Tische = class(TComponent)

BAMatze 19. Feb 2009 15:32

Re: TTimer in einer freien Klasse
 
Nochmal danke an dich DeddyH, das war die Lösung.

mjustin 19. Feb 2009 15:50

Re: TTimer in einer freien Klasse
 
Zitat:

Zitat von BAMatze
Delphi-Quellcode:
type TV_Tische = class
    ...
    constructor create; reintroduce;
    ...


Das reintroduce ist nicht erforderlich. Normalerweise braucht man es nur, um eine Compilerwarnung zu unterdrücken (wenn man sich sicher ist, dass man eine Methode überschreiben will). Aber diese Warnung würde hier vom Compiler ohne das reintroduce nicht erscheinen.

Cheers!

Rudirabbit 11. Apr 2009 08:06

Re: TTimer in einer freien Klasse
 
Hallo

Ich hänge mein Problem mal hier dran.

Ich habe eine Klasse erstellt in der unter anderem ein Timer dynamisch erzeugt wird.
Funktioniert auch wie gewünscht, aber nur wenn ich diese Klasse direkt erzeuge.

Wenn ich eine (Verwaltungs)Klasse erstelle, in der wiederum eine Anzahl von obiger Klasse instanziert werden, wird in den Timerklassen die Timerproc nicht ausgeführt.

Es kommt keine Fehlermeldung, die Objekte werden auch erzeugt, ich kann in der Verwaltungs Klasse darauf zugreifen, kein Problem.
Nur die Timer scheinen nicht zu laufen :gruebel:

Dort wird nur eine Variable decrementiert.
Die Verwaltungs Klasse fragt diese ab, wenn diese 0 ist wird die Klasse zerstört.

mfg.

mkinzler 11. Apr 2009 09:35

Re: TTimer in einer freien Klasse
 
Besteht da ein Unterschied bei der Instantiierung?

Rudirabbit 11. Apr 2009 14:36

Re: TTimer in einer freien Klasse
 
Zitat:

Besteht da ein Unterschied bei der Instantiierung?
Nein - im Prinzip nicht, ich habe es inzwischen anders gelöst:

In der Verwaltungsklasse läuft ein Timer (das funktioniert ja) in dieser timerprocedure werden die Clientklassen durchlaufen, und ein Counter in der Clientklasse decrementiert, ist dieser 0 wird diese Clientklasse destroyed.
Dieser Counter wird beim Erzeugen der Clientklasse auf 10 gesetzt, der timerintervall ist eine Sekunde.
Ziel soll sein, dass eine Clientklasse eine Lebensdauer von 10 Sekunden hat. Das Funktioniert jetzt auch so.

Meine vorherige Umsetzung des Problems, in jede Clientklasse einen Timer einzubauen,wäre auch ressourcenverschwendung gewesen.

Nur so aus Prinzip:
Aber warum das nicht ging verstehe ich nicht.

mfg.

DP-Maintenance 11. Apr 2009 18:22

DP-Maintenance
 
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "VCL / WinForms / Controls" verschoben.
TTimer -> VCL


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