Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Ableitungsproblem (Welcher Vorfahr?) für neue Klasse (https://www.delphipraxis.net/97294-ableitungsproblem-welcher-vorfahr-fuer-neue-klasse.html)

guidok 8. Aug 2007 07:25


Ableitungsproblem (Welcher Vorfahr?) für neue Klasse
 
Hallo,

ich bin gerade dabei eine Schnittstellenklasse für die Kommunikation mit einer Siemens Steuerung (S7) zu erstellen. Dazu gibt es eine Fremdhersteller-DLL, die die notwendigen Funktionalitäten bereits zur Verfügung stellt und die ich etwas komfortabler in eine Klasse kapseln möchte.

Ich brauche jetzt einen kleinen Denkanstoß, ob und von welchem Vorfahren ich meine Klasse ableiten soll.

Das wäre z.B. denkbar (ist noch nicht komplett):
Delphi-Quellcode:
  TComDrvS7 = class
  private
    FHandle: Integer;
    FIPAdresseStr: array [0..255] of char;
    FCPUSlotNr: Integer;
    FConnected: Boolean;
    FErrorCode: Word;
    function GetDLLErrorString(Error: Word):String;
    function GetErrorString:String;
  protected
    //
  public
    constructor Create;
    destructor Destroy;
    function Connect: Boolean;
    procedure Disconnect;
    property ErrorString: String read GetErrorString;
  end;
oder

Delphi-Quellcode:
  TComDrvS7 = class(TObject)
  private
    FHandle: Integer;
    FIPAdresseStr: array [0..255] of char;
    FCPUSlotNr: Integer;
    FConnected: Boolean;
    FErrorCode: Word;
    function GetDLLErrorString(Error: Word):String;
    function GetErrorString:String;
  protected
    //
  public
    constructor Create;
    destructor Destroy;
    function Connect: Boolean;
    procedure Disconnect;
    property ErrorString: String read GetErrorString;
  end;
Mir ist schon klar, dass ich im Üblichen einen Vorfahren aussuche, der von mir benötigte Funktionalitäten bereitsstellt und die ich nur noch ergänzen muss, aber bei den etwas grundlegenderen Klassen habe ich nicht mehr so viel Ahnung, welche Funktionalitäten überhaupt notwendig sind (wegen Speicherverwaltung oder so).

Grundsätzlich wird es so sein, dass in der Software, die meine Klasse verwenden soll, mehrere Instanzen von TComDrvS7 erstellt werden (für jede Steuerung eine).

Naja, ich hoffe ihr versteht was ich meine.

sirius 8. Aug 2007 07:34

Re: Ableitungsproblem (Welcher Vorfahr?) für neue Klasse
 
Der einzige Unterschied zwischen Variante a) und b) ist doch die Zeile "TComDrvS7 = class" bzw. "TComDrvS7 = class(TObject)"
Und das ist für den Compiler exakt dasselbe :zwinker:

Jede Klasse hat als Vorfahr mindestens TObject. Du könntest natürlich noch überlegen, ob du aus der VCL, der JVCL oder den Indys, etc noch etwas brauchst, was allerdings nicht so aussieht.


Edit: Du könntest noch überlegen, ob du noch einen Schritt zurückgehst und ohne TObject auskommen willst.
Delphi-Quellcode:
type TComDrvS7 = object
//...
end;
Aber ich wüsste dafür derzeit keinen Grund.

Robert Marquardt 8. Aug 2007 07:35

Re: Ableitungsproblem (Welcher Vorfahr?) für neue Klasse
 
class und class(TObject) sind ein und das selbe.
Die spannendste Frage ist ob man automatisch erkennen kann wie viele S7 angeschlossen sind und ob Hotplugging moeglich ist, sprich ob man erkennen kann wenn eine S7 an- bzw. abgesteckt wird.
Es bietet sich an eine Komponente zur Verwaltung der S7-Geraete zu erstellen. Diese handhabt dann das Erkennen der einzelnen Geraete und bietet eine Array-Property fuer die Liste der Geraete. Dieses waeren dann die angedachten TComDrvS7-Objekte.

Phoenix 8. Aug 2007 07:37

Re: Ableitungsproblem (Welcher Vorfahr?) für neue Klasse
 
Kauf Dir lieber eine Komponente, die schon die komplette S7 Ansteuerung kapselt.
Es ist billiger, als selber Wochenweise Zeit da rein zu investieren, und man kann sich ganz auf Logik der Ansteuerung konzentrieren, als sich mit Netzwerkpaketen auseinanderzusetzen. Ich spreche da aus Erfahrung :)

Im Übrigen sind Deine beiden Codestücke Identisch: Alles was nicht explizit von einer anderen Klasse abgeleitet ist, ist automatisch von TObject abgeleitet.

Ansonsten wäre wohl TPersistent eine gute Alternative, weil Du dann Einstellungen (z.B. CPU / RACK / SLOT) direkt abspeichern kannst.

guidok 8. Aug 2007 07:59

Re: Ableitungsproblem (Welcher Vorfahr?) für neue Klasse
 
Die Ansteuerung der S7 steckt bereits in einer DLL, ich muss mich also nicht mit Protokollen herumschlagen. Ich möchte nur die Funktionsaufrufe etwas komfortabler gestalten und konkreter auf mein Problem anpassen, darum diese Klasse.

Zitat:

class und class(TObject) sind ein und das selbe
Jetzt, wo ich das lese, glaube ich, dass ich das auch schon mal irgendwo gelesen hatte :roll:



Damit stellt sich mir die Frage, brauche ich, was mir TObject bereitsstellt überhaupt? Letztendlich möchte ich ja nur ein Object haben, das mir für den Aufbau und Betrieb einer Datenkommunikation notwendigen Eigenschaften und Methoden bereitstellt.


Danke soweit!

Phoenix 8. Aug 2007 08:03

Re: Ableitungsproblem (Welcher Vorfahr?) für neue Klasse
 
Zitat:

Zitat von guidok
Damit stellt sich mir die Frage, brauche ich, was mir TObject bereitsstellt überhaupt? Letztendlich möchte ich ja nur ein Object haben, das mir für den Aufbau und Betrieb einer Datenkommunikation notwendigen Eigenschaften und Methoden bereitstellt.

Ja, brauchst Du. Du willst schliesslich mindestens einen Constructor und wahrscheinlich auch einen Destruktor haben.
Ausserdem ist TObject die allerunterste hierarchie. Tiefer geht nicht, ausser Du nimmst einen Record.

divBy0 8. Aug 2007 08:04

Re: Ableitungsproblem (Welcher Vorfahr?) für neue Klasse
 
Welche DLL benutzt du denn? Prodave, Accon??

Kennst du das freie LibNoDave? Dazu existiert eine gute Delphikomponente. Kommunikation geht damit über Ethernet, MPI, usw...

guidok 8. Aug 2007 08:17

Re: Ableitungsproblem (Welcher Vorfahr?) für neue Klasse
 
Ich wollte die DLL von MHJ verwenden, aber da ich bisher nur die Demoversion habe schaue ich mir auch mal LibNoDave an. Danke für die Info!

divBy0 8. Aug 2007 08:20

Re: Ableitungsproblem (Welcher Vorfahr?) für neue Klasse
 
Ich hab selbst erst ein Projekt mit LibNoDave erledigt, ging echt einfach.

Kannst alles auslesen und schreiben, DB's, E/A's, M's, Systemdaten... als INT, BYTE, WORD, DWORD, BIT, usw.

Bei Fragen kann ich dir gerne etwas weiterhelfen. :thumb:


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