Einzelnen Beitrag anzeigen

Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#12

AW: Aufbau eigene Klasse mit Property und TStrings

  Alt 31. Dez 2010, 01:12
Die Frage ist doch: WER erzeugt die Objekte für die seriellen Schnittstellen?
Nach deinem Konzept nach hältst du 4 ComPort-Objekte auf dem Datenmodul bereit.
Ich würde diese ComPort-Objekte aber dynamisch nach Bedarf über eine Factory-Klasse erzeugen.
Diese Factory-Klasse benötigt für ihre Arbeit den Dateinamen einer Ini-Datei.
Die Ini-Datei sieht z.B. so aus:
Code:
[Config]
DeviceCount=2
[Device1]
Device=MB100
Port=COM1
Baudrate=9600
Parity=N
[Device2]
Device=MB256
Port=COM3
Baudrate=19200
Parity=N
Hier der Grobentwurf der Factory-Klasse:
Delphi-Quellcode:
TDeviceFactory=class

public
  class function CreateMB100:TAlarmAnlage;
  class function CreateMB256:TAlarmAnlage;
  ...
  
  function GetDeviceCount:integer; // Anzahl der Geräte in der Ini-Datei

  function CreateDevice(deviceNr:integer):TAlarmAnlage;
  property IniFilename:string;
end;

function TDeviceFactory.CreateDevice(deviceNr:integer):TAlarmAnlage;
var
  devicename : string;
  inifile : TIniFile;
  section : string;
  comport : TComPort;
begin
  section := Format('Device%d', [devicenr]);
  inifile := TIniFile.Create(IniFilename);
  devicename := inifile.ReadString(section, 'Device');

  // hier ggf. prüfen, ob es die Section überhaupt gibt
  
  // Hardwarekomponente erzeugen
  if devicename='MB100then
    Result := CreateMB100
  else if devicename='MB256then
   Result := CreateMB256
  else if ...
  else
    raise Exception.CreateFmt('unbekanntes Device <%s>', [devicename]);
  
  // jetzt wird noch das Kommunikations-Objekt benötigt
  comport := TComPort.Create(Application {siehe Text unten});
  comport.Port := inifile.ReadString(section, 'Port');
  comport.BaudRate := inifile.ReadInteger(section, 'Baudrate');
  comport.Parity := inifile.ReadString(section, 'Parity');
  // hier ggf. weitere Properties (Handshake, Datenbits) berücksichtigen
  
  // Geräte-Objekt und Kommunikations-Objekt verheiraten
  Result.Comport := comport;
  comport.OnReceive := Result.ReceiveHandler; // Eventhandler zuweisen
  
  // serielle Schnittstelle öffnen
  comport.Connected := True;
  inifile.Free;
end;
In der obigen Funktion fehlen noch einige Feinheiten sowie eine wasserdichte Fehlerbehandlung.
Aber das Prinzip sollte klar sein.
Die Hardwarekomponente (bzw. Geräteklasse) kümmert sich nicht um Baudrate usw.
Die Factory erzeugt anhand den Informationen in der Ini-Datei die Hardwarekomponente sowie die Komponente für die serielle Schnittstelle und baut diese zu einem funktionierenden Verbund zusammen.

Es bleibt noch die Frage offen: WER ist der Owner der ComPort-Komponente?
Im Code oben habe ich Application angegeben; das ist noch etwas unschön.
Falls die Hardwarekomponente tatsächlich eine echte Komponente ist, würde man schreiben:
Delphi-Quellcode:
// jetzt wird noch das Kommunikations-Objekt benötigt
comport := TComPort.Create(Result {=die neu erzeugte Hardwarekomponente});
comport.Port := inifile.ReadString(section, 'Port');
Lass das mal etwas absacken; das Konzept der Factory-Klasse mag zunächst etwas fremd aussehen, hat aber entscheidende Vorteile.
  Mit Zitat antworten Zitat