Einzelnen Beitrag anzeigen

Benutzerbild von mika
mika

Registriert seit: 25. Okt 2002
176 Beiträge
 
Delphi 6 Professional
 
#4

AW: Klasse von TTHread ableiten und Interface implementieren, Objekt erstellen

  Alt 12. Sep 2011, 17:14
Hei,

danke erstmal für die Antworten. Die Methoden des Interfaces habe ich eingebunden Hier mal zur besseren Verständnis richtiger Code:

Das Problem ist das gleiche, nur das man das AUgenmerk auf TDeviceController legt.

Interfaces
Code:
type
  { Forwardeklarationen }
  IDeviceController = interface;
  IDeviceEntity = interface;

  { Interface unserer obersten Controllerklasse }
  ILineController = interface(IInterface)['{4096970D-4269-4626-B710-AF753D80D0BF}']
    { Initialisiert den Controller mit den gegebenen Daten }
    function Initialize(db: TAdsConnection; id: Integer): Boolean;
    { Finalisiert den Controller, entfernt alle Daten }
    function Finalize: Boolean;

    { Setzt die Genauigkeit der Protokollierung }
    function SetLoglevel(ll: Integer): Boolean;

    { Gibt die Datenbankverbindung zurueck die angegeben wurde }
    function GetDatabaseConnection: TAdsConnection;
    function GetDatabaseConfigurationKey: Integer;

    { Setzt die Callbackmethode die der Controller aufrufen soll }
    function SetCallbackMethod(cm: TCallbackMethod): Boolean;

    { Verarbeitet einen DeviceStatus und reicht ihn an den Callback weiter }
    function ProcessDeviceStatus(ds: TDeviceStatus): Boolean;

    { Gibt die Anzahl der DeviceController zurück }
    function GetDeviceControllerCount: Integer;
    { Gibt den Index des übergebenen DeviceControllers wieder }
    function GetDeviceControllerIndex(dc: IDeviceController): Integer;
    { Gibt den DeviceController des übergebenen Index wieder }
    function GetDeviceControllerByIndex(index: Integer): IDeviceController;

    { Fügt einen neuen DeviceController hinzu }
    function AddDeviceController(dc: IDeviceController): Boolean;
    { Entfernt den übergebenen DeviceController }
    function RemoveAllDeviceController: Boolean;
    function RemoveDeviceController(index: Integer): Boolean; overload;
    function RemoveDeviceController(dc: IDeviceController): Boolean; overload;

    { Startet den übergebenen DeviceController }
    function StartAllDeviceController: Boolean;
    function StartDeviceController(index: Integer): Boolean; overload;
    function StartDeviceController(dc: IDeviceController): Boolean; overload;
    { Stoppt den übergebenen DeviceController }
    function StopAllDeviceController: Boolean;
    function StopDeviceController(index: Integer): Boolean; overload;
    function StopDeviceController(dc: IDeviceController): Boolean; overload;
    { Aktiviert den übergebenen DeviceController, somit wird er bei der
      Abfrage der DeviceController mit einbezogen }
    function ActivateAllDeviceController: Boolean;
    function ActivateDeviceController(index: Integer): Boolean; overload;
    function ActivateDeviceController(dc: IDeviceController): Boolean; overload;
    { Deaktiviert den übergebenen DeviceController, somit wird er bei der
      Abfrage der DeviceController übersprungen }
    function DeactivateAllDeviceController: Boolean;
    function DeactivateDeviceController(index: Integer): Boolean; overload;
    function DeactivateDeviceController(dc: IDeviceController): Boolean; overload;
  end;

  { Interface unserer Controllerklasse für die einzelnen Verbindungen/Module }
  IDeviceController = interface(IInterface)['{0217D970-51CC-49AD-944E-E9B0B86C6C14}']
    { Initialisiert den Controller mit den gegebenen Daten }
    function Initialize(lc: ILineController; id: Integer): Boolean;
    { Finalisiert den Controller, entfernt alle Daten }
    function Finalize: Boolean;
   
    { Setzt die Genauigkeit der Protokollierung }
    function SetLoglevel(ll: Integer): Boolean;

    { Setzt den LineController dieses Objekts, wichtig um Daten weiterzugeben }
    function SetLineController(lc: ILineController): Boolean;
    { Gibt den LineController dieses Objektszurück }
    function GetLineController: ILineController;

    { Setzt die Verbindung dieses Controllers, also Comport oder TCP/IP }
    function SetConnection(cnnct: IPort): Boolean;
    { Ermittelt die Verbindung dieses Controllers }
    function GetConnection: IPort;
    { Oeffnet die Verbindung }
    function OpenConnection(ps: TPortSettings): Boolean;
    { Schliesst die Verbindung }
    function CloseConnection: Boolean;
    { Liest von der Verbindung }
    function ReadConnection: String; overload;
    function ReadConnection(ByteCount: Integer): String; overload;
    { Schreibt auf die Verbindung }
    function WriteConnection(Text: String): Boolean;

    { Aktiviert den Controller, heisst er soll arbeiten falls gefragt }
    function Activate: Boolean;
    { Deaktiviert den Controller, Controller arbeitet nicht }
    function Deactivate: Boolean;

    { Startet die Abfrage der einzelnen Module die angeschlossen sind }
    function Start: Boolean;
    { Beendet die Abfrage der einzelnen Module die angeschlossen sind }
    function Stop: Boolean;

    { Gibt die Anzahl der angeschlossenen DeviceEntities zurück }
    function GetDeviceEntityCount: Integer;
    { Gibt den Index des übergebenen DeviceEntity wieder }
    function GetDeviceEntityIndex(de: IDeviceEntity): Integer;
    { Gibt das DeviceEntity des übergebenen Index wieder }
    function GetDeviceEntityByIndex(index: Integer): IDeviceEntity;

    { Fügt ein neues DeviceEntity hinzu }
    function AddDeviceEntity(de: IDeviceEntity): Boolean;
    { Entfernt das übergebene DeviceEntity }
    function RemoveAllDeviceEntitites: Boolean;
    function RemoveDeviceEntity(index: Integer): Boolean; overload;
    function RemoveDeviceEntity(de: IDeviceEntity): Boolean; overload;

    { Aktiviert das übergebenen DeviceEntity, somit wird es bei der
      Abfrage der DeviceEntities mit einbezogen }
    function ActivateAllDeviceEntities: Boolean;
    function ActivateDeviceEntity(index: Integer): Boolean; overload;
    function ActivateDeviceEntity(de: IDeviceEntity): Boolean; overload;
    { Dektiviert das übergebenen DeviceEntity, somit wird es bei der
      Abfrage der DeviceEntities ausgelassen }
    function DeactivateAllDeviceEntities: Boolean;
    function DeactivateDeviceEntity(index: Integer): Boolean; overload;
    function DeactivateDeviceEntity(de: IDeviceEntity): Boolean; overload;
  end;

  IDeviceEntity = interface(IInterface)['{E7803FED-19E9-462C-9289-2165E0464F53}']
    { Initialisiert den Controller mit den gegebenen Daten }
    function Initialize(lc: ILineController; dc: IDeviceController; id: Integer): Boolean;
    { Finalisiert den Controller, entfernt alle Daten }
    function Finalize: Boolean;

    { Setzt die Genauigkeit der Protokollierung }
    function SetLoglevel(ll: Integer): Boolean;

    { Setzt den LineController dieses Objekts, wichtig um Daten weiterzugeben }
    function SetLineController(lc: ILineController): Boolean;
    { Setzt den DeviceController dieses Objekts, wichtig um Daten weiterzugeben }
    function SetDeviceController(dc: IDeviceController): Boolean;
    { Gibt den LineController dieses Objekts wieder }
    function GetLineController: ILineController;
    { Gibt den DeviceController dieses Objekts wieder }
    function GetDeviceController: IDeviceController;

    { Aktiviert das modul, heisst er soll arbeiten falls gefragt }
    function Activate: Boolean;
    { Deaktiviert das Modul, Modul arbeitet nicht }
    function Deactivate: Boolean;

    { Liest den aktuellen Gerätestatus aus }
    function GetDeviceStatus: TDeviceStatus;
    { Setzt den aktuellen Gerätestatus. }
    function SetDeviceStatus(ds: TDeviceStatus): Boolean;

    { Setzt das Relais auf den angegebenen Status, falls vorhanden }
    function SetRelaisState(ns: Boolean): Boolean;

    { Schreibt den gegebenen Text auf das Display, falls vorhanden }
    function SetDisplayText(nt: String): Boolean;

    { Hat das Geraet die angegebene Eigenschaft? }
    function IsRfidModule: Boolean;
    function IsDisplayModule: Boolean;
    function IsRelaisModule: Boolean;
    function IsScannerModule: Boolean;
    function IsNumpadModule: Boolean;
  end;
TLineController
Code:
  TLineController = class (TInterfacedObject, ILineController)
  private
    // Logger dieser Klasse
    Logfile: TFCSLogging;
    // Die Verbindung zu unserer Datenbank
    DBConnection: TAdsConnection;
    // Die CallbackMethode die vom Aufrufer gesetzt werden kann
    CallbackMethod: TCallbackMethod;
    // Konfigurationsschluessel in der Datenbank
    ConfigurationKey: Integer;
    // Die Liste mit unseren DeviceControllern
    DeviceControllers: TInterfaceList;

    // Der Titel dieses LineControllers
    Titel: String;

    // Legt die zu dieser Konfiguration gehörenden Unterobjekte an
    function InitializeComponents: Boolean;
    // Erstellt einen Thread der die CallbackMethode ausfuehrt falls angegeben
    function ExecuteCallback(ds: TDeviceStatus): Boolean;
    // Speichert einen Gerätestatus in der Datenbank
    function PushDeviceStatusToDatabase(ds: TDeviceStatus): Boolean;

  public
    // Standardkonstruktor dieser Klasse
    constructor Create;
    // Standarddestruktor dieser Klasse
    destructor Destroy; reintroduce;

    // Aus dem Interface geerbte Methoden
    function Initialize(db: TAdsConnection; id: Integer): Boolean;
    function Finalize: Boolean;

    function SetLoglevel(ll: Integer): Boolean;

    function GetDatabaseConnection: TAdsConnection;
    function GetDatabaseConfigurationKey: Integer;

    function SetCallbackMethod(cm: TCallbackMethod): Boolean;

    function ProcessDeviceStatus(ds: TDeviceStatus): Boolean;

    function GetDeviceControllerCount: Integer;
    function GetDeviceControllerIndex(dc: IDeviceController): Integer;
    function GetDeviceControllerByIndex(index: Integer): IDeviceController;

    function AddDeviceController(dc: IDeviceController): Boolean;

    function RemoveAllDeviceController: Boolean;
    function RemoveDeviceController(index: Integer): Boolean; overload;
    function RemoveDeviceController(dc: IDeviceController): Boolean; overload;

    function StartAllDeviceController: Boolean;
    function StartDeviceController(index: Integer): Boolean; overload;
    function StartDeviceController(dc: IDeviceController): Boolean; overload;
   
    function StopAllDeviceController: Boolean;
    function StopDeviceController(index: Integer): Boolean; overload;
    function StopDeviceController(dc: IDeviceController): Boolean; overload;

    function ActivateAllDeviceController: Boolean;
    function ActivateDeviceController(index: Integer): Boolean; overload;
    function ActivateDeviceController(dc: IDeviceController): Boolean; overload;

    function DeactivateAllDeviceController: Boolean;
    function DeactivateDeviceController(index: Integer): Boolean; overload;
    function DeactivateDeviceController(dc: IDeviceController): Boolean; overload;
  end;
TDeviceController
Code:
type
  TDeviceController = class (TThread, IDeviceController)
  private
    // Referenzzaehler dieses InterfacedObjekts
    FRefCount: Integer;
    // Logger dieser Klasse
    Logfile: TFCSLogging;
    // Konfigurationsschluessel in der Datenbank
    ConfigurationKey: Integer;
    // LineController dem dieser DeviceController untergeordnet ist
    LineController: ILineController;
    // Verbindung die dieser DeviceController bereitstellt
    Port: IPort;
    // Die Liste mit unseren DeviceEntities
    DeviceEntities: TInterfaceList;

    // Der Titel dieses LineControllers
    Titel: String;
    // Ist der Controller aktiv? Sollen Geräte abgefragt werden?
    Aktiv: Boolean;
    // Zeit in Millisekunden zwischen zwei Abfragen
    DelayMSecs: Integer;

    // Methoden die Klassen benoetigen die ein Interface implementieren
    function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
    function _AddRef: Integer; stdcall;
    function _Release: Integer; stdcall;

    // Legt die zu dieser Konfiguration gehörenden Unterobjekte an
    function InitializeComponents: Boolean;

  protected
    procedure Execute; override;

  public
    property RefCount: Integer read FRefCount;
    // Standardkonstruktor dieser Klasse
    constructor Create; reintroduce;
    // Standarddestruktor dieser Klasse
    destructor Destroy; reintroduce;

    // Aus dem Interface geerbte Methoden
    function Initialize(lc: ILineController; id: Integer): Boolean;
    function Finalize: Boolean;

    function SetLoglevel(ll: Integer): Boolean;

    function SetLineController(lc: ILineController): Boolean;
    function GetLineController: ILineController;

    function SetConnection(cnnct: IPort): Boolean;
    function GetConnection: IPort;

    function OpenConnection(ps: TPortSettings): Boolean;
    function CloseConnection: Boolean;
    function ReadConnection: String; overload;
    function ReadConnection(ByteCount: Integer): String; overload;
    function WriteConnection(Text: String): Boolean;

    function Activate: Boolean;
    function Deactivate: Boolean;

    function Start: Boolean;
    function Stop: Boolean;

    function GetDeviceEntityCount: Integer;
    function GetDeviceEntityIndex(de: IDeviceEntity): Integer;
    function GetDeviceEntityByIndex(index: Integer): IDeviceEntity;

    function AddDeviceEntity(de: IDeviceEntity): Boolean;

    function RemoveAllDeviceEntitites: Boolean;
    function RemoveDeviceEntity(index: Integer): Boolean; overload;
    function RemoveDeviceEntity(de: IDeviceEntity): Boolean; overload;

    function ActivateAllDeviceEntities: Boolean;
    function ActivateDeviceEntity(index: Integer): Boolean; overload;
    function ActivateDeviceEntity(de: IDeviceEntity): Boolean; overload;

    function DeactivateAllDeviceEntities: Boolean;
    function DeactivateDeviceEntity(index: Integer): Boolean; overload;
    function DeactivateDeviceEntity(de: IDeviceEntity): Boolean; overload;
  end;
TDeviceEntity, IPort und so weiter sollten in dem Kontext keine Rolle spielen denk ich mal...
JKetzt möchte ich halt in einer Methode von TLineController folgendes machen können:

Code:
var
  meinDevice: IDeviceController;
begin
  meinDevice := TDeviceController.Create AS IDeviceController;
end;
aber das geht wie gesagt nicht und ich könnte mir das nur erklären weil DeviceController halt von TThread abgeleitet ist.
:: don't Panic ::

Geändert von mika (12. Sep 2011 um 17:16 Uhr)
  Mit Zitat antworten Zitat