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='
MB100'
then
Result := CreateMB100
else if devicename='
MB256'
then
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.