Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Problem bei Ableitung von TIdTCPClient (Override von Create) (https://www.delphipraxis.net/125621-problem-bei-ableitung-von-tidtcpclient-override-von-create.html)

christian.noeding 9. Dez 2008 08:39


Problem bei Ableitung von TIdTCPClient (Override von Create)
 
Guten Morgen,


im Internet habe ich einen Komponentensatz für die digitale Märklin-Eisenbahnsteuerung gefunden, den ich gerne in meinem Lichtprogramm nutzen möchte, um entsprechend die Eisenbahn anzusteuern. Die Komponente stellt normalerweise eine TCP-Verbindung mit einem Server her, der die Hardwareausgabe regelt.
Die Komponente leitet dafür Funktionen vom IdTCPClient der Indys ab und überschreibt einige Grundfunktionen. Leider meckert mein Delphi7 beim Kompilieren: "Eine statische Methode kann nicht überschrieben werden". Dies tritt beim Versuch auf, "Create", "Disconnect" und "Connect" zu überschreiben.

Ich nutze Delphi7 und die Indys in der Version 10.

Wonach muss ich suchen, um den Fehler zu finden? Ich habe in den Sources der Indys mal geschaut, aber dort sind die Funktion ganz normal deklariert (jedenfalls für meine Augen)?


Hier ein Teil des Codes der Komponente:
Delphi-Quellcode:
  TSRCPBaseClient = class(TIdTCPClient)
  private
    FLogEnabled: Boolean;
    FSessionID: Integer;
    FOnLog: TLogEvent;
    FOnError: TNotifyEvent;
    FClientMode: TSRCPClientMode;
    FServerVersions: Set of TSRCPCommandVersion;
    FVersion: TSRCPCommandVersion;
    FResponse: String;
    FOnDisconnected: TNotifyEvent;
    procedure ReceiveWelcome;
    procedure SetUsedVersion;
    procedure SetConnectionMode;
    procedure StartClient;
    procedure SetClientMode(const Value: TSRCPClientMode);
    procedure DoLog(const S: String);
    procedure DoError;
    procedure HandleOnDisconnect(Sender: TObject);
    function DoReceiveAnswer(Cmd: TSRCPCmd; S: String): Boolean;
  protected
    procedure SetVersion(const Value: TSRCPCommandVersion);virtual;
    procedure DoDisconnect;virtual;
  public
    constructor Create(AOwner: TComponent); override;  // <-- HIER MECKERTS (STATISCHE METHODE KANN NICHT ÜBERSCHRIEBEN WERDEN)
    destructor Destroy; override;
    procedure SendCommand(Cmd: TSRCPCmd);
    function ReceiveAnswer(Cmd: TSRCPCmd): Boolean;
    procedure Connect(const ATimeout: Integer = IdTimeoutDefault); override;  // <-- HIER MECKERTS (CONNECT NICHT GEFUNDEN)
    procedure Disconnect; override;  // <-- HIER MECKERTS (STATISCHE METHODE KANN NICHT ÜBERSCHRIEBEN WERDEN)
    property ClientMode: TSRCPClientMode read FClientMode write SetClientMode;
    property SessionID: Integer read FSessionID;
    property Response: String read FResponse;
  published
    property LogEnabled: Boolean read FLogEnabled write FLogEnabled default False;
    property Version: TSRCPCommandVersion read FVersion write SetVersion default cv082;
    property OnError: TNotifyEvent read FOnError write FOnError;
    property OnLog: TLogEvent read FOnLog write FOnLog;
    property OnDisconnected: TNotifyEvent read FOnDisconnected write FOnDisconnected;
  end;


Vielen Dank für ein paar Tipps :)
Christian

mjustin 9. Dez 2008 09:09

Re: Problem bei Ableitung von TIdTCPClient (Override von Cre
 
Zitat:

Zitat von christian.noeding
Ich nutze Delphi7 und die Indys in der Version 10.

Möglicherweise benötigst Du eine neuere Version der Indy 10 Library. Einige "breaking changes" in Indy 10 machen das Kompilieren zu einer Art Lotterie :)

Eine aktuelle Version kann man z.B. hier finden:

http://indy.fulgan.com/ZIP

Tip: zum Testen Indy nicht unbedingt als Package in Delphi installieren, sondern einfach nur im Projekt den Suchpfad einrichten ...

christian.noeding 9. Dez 2008 09:17

Re: Problem bei Ableitung von TIdTCPClient (Override von Cre
 
Hi,

danke für die Antwort, aber die Indys in Version 10 sind doch die aktuellsten, oder?



Die Indys laufen ja auch ohne Probleme. Die Klassenableitung durch die gepostete Komponente ist doch wahrscheinlich das Problem. Ich habe nochmal nachgeschaut, die Indys überladen die Connect-Funktion. Womöglich gibts hier ein Problem eine Überladene Funktion zu Überschreiben... ich kenne mich mit den Klassenfunktionen nicht sonderlich gut aus.


In deinem Link gibts eine ältere Version des IdTCPBaseClienten. Eventuell kann ich die parallel zur Indy 10 Installation für das Kompilieren dieses einen Projektes nutzen... mal sehen.


bis dann,
Christian

mjustin 9. Dez 2008 09:29

Re: Problem bei Ableitung von TIdTCPClient (Override von Cre
 
Zitat:

Zitat von christian.noeding
danke für die Antwort, aber die Indys in Version 10 sind doch die aktuellsten, oder?

Ja und nein. Es gibt viele verschiedene Versionen 10 der Indys. Indy 10.2.3 ist die aktuelle Versionsnummer, doch seit August 2007 wurde diese Versionsnummer auch nicht mehr geändert, obwohl es seitdem "breaking changes" im Kern gab.

DataCool 9. Dez 2008 12:09

Re: Problem bei Ableitung von TIdTCPClient (Override von Cre
 
Hi,

versuch doch mal Deine Klasse von "TIdTCPClientCustom" abzuleiten.

Greetz Data

christian.noeding 9. Dez 2008 12:30

Re: Problem bei Ableitung von TIdTCPClient (Override von Cre
 
Danke für den Tipp, aber es kommt der gleiche Fehler "Statische Methode kann nicht überschrieben werden".

Kann es daran liegen, dass IdTCPClientCustom die Funktionen z.T. überlädt? Zudem werden die Funktionen "Create" und "Disconnect" offensichtlich durch TIdTCPConnection geerbt. Somit müsste ich ja grundlegende Funktionen der Indys anpassen... Siehe hier:

Delphi-Quellcode:
  TIdTCPClientCustom = class(TIdTCPConnection)
  protected
    FBoundIP: String;
    FBoundPort: Integer;
    FBoundPortMax: Integer;
    FBoundPortMin: Integer;
    FConnectTimeout: Integer;
    FDestination: string;
    FHost: string;
    FIPVersion: TIdIPVersion;
    FOnConnected: TIdNotifyEvent;
    FPassword: string;
    FPort: TIdPort;
    FReadTimeout: Integer;
    FUsername: string;
    //
    FOnBeforeBind: TIdNotifyEvent;
    FOnAfterBind: TIdNotifyEvent;
    //
    procedure DoOnConnected; virtual;
    function MakeImplicitClientHandler: TIdIOHandler; virtual;
    //
    procedure SetConnectTimeout(const AValue: Integer);
    procedure SetReadTimeout(const AValue: Integer);
    procedure SetBoundIP(const AValue: String);
    procedure SetBoundPort(const AValue: Integer);
    procedure SetBoundPortMax(const AValue: Integer);
    procedure SetBoundPortMin(const AValue: Integer);
    procedure SetHost(const AValue: string); virtual;
    procedure SetPort(const AValue: TIdPort); virtual;
    procedure SetIPVersion(const AValue: TIdIPVersion); virtual;
    //
    procedure SetOnBeforeBind(const AValue: TIdNotifyEvent);
    procedure SetOnAfterBind(const AValue: TIdNotifyEvent);
    //
    procedure SetIOHandler(AValue: TIdIOHandler); override;
    procedure InitComponent; override;
    //
    function GetReadTimeout: Integer;
    //
    property Host: string read FHost write SetHost;
    property IPVersion: TIdIPVersion read FIPVersion write SetIPVersion;
    property Password: string read FPassword write FPassword;
    property Port: TIdPort read FPort write SetPort;
    property Username: string read FUsername write FUsername;
    //
    property OnConnected: TIdNotifyEvent read FOnConnected write FOnConnected;
  public
    procedure Connect; overload; virtual;
    // This is overridden and not as default params so that descendants
    // do not have to worry about the arguments.
    // Also has been split further to allow usage from C# as it does not have optional
    // params
    procedure Connect(const AHost: string); overload;
    procedure Connect(const AHost: string; const APort: Integer); overload;
    function ConnectAndGetAll: string; virtual;

    property BoundIP: string read FBoundIP write SetBoundIP;
    property BoundPort: Integer read FBoundPort write SetBoundPort default 0;
    property BoundPortMax: Integer read FBoundPortMax write SetBoundPortMax;
    property BoundPortMin: Integer read FBoundPortMin write SetBoundPortMin;

    property ConnectTimeout: Integer read FConnectTimeout write SetConnectTimeout;
    property ReadTimeout: Integer read GetReadTimeout write SetReadTimeout;
    property OnBeforeBind:TIdNotifyEvent read FOnBeforeBind write SetOnBeforeBind;
    property OnAfterBind:TIdNotifyEvent read FOnAfterBind write SetOnAfterBind;

  published
  end;


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