AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Indy und Wiedervervendung von procedure
Thema durchsuchen
Ansicht
Themen-Optionen

Indy und Wiedervervendung von procedure

Ein Thema von hesch21 · begonnen am 28. Feb 2013 · letzter Beitrag vom 4. Mär 2013
Antwort Antwort
hesch21

Registriert seit: 31. Aug 2004
Ort: Basel
114 Beiträge
 
Delphi XE2 Enterprise
 
#1

Indy und Wiedervervendung von procedure

  Alt 28. Feb 2013, 16:05
Vermutlich bin ich wieder mal mit Blindheit beschlagen! Ich habe eine applikation sowohl als Desktop-Anwendung und als Service. Und das ganze ist zur Hauptsache ein recht komplexer TCP/IP-Server, mit den Indy-Komponenten gebaut. Und logischerweise sind in den beiden Applikationen eine Vielzahl der Funktionen genau gleich. Das ist alles bei 'normalen' procedures oder functions kein Problem. Die habe ich einfach in eine separate Unit ausgelagert. Aber wie mache ich das mit den ellenlangen IdTCPServerExecute procedures? Die sind (fast) baugleich in beiden Applikationen (die Unterschiede habe ich bereits mit einer Compiler-Bedingung abgefangen), aber die Procedure, welche ja gleichzeitig ein Thread ist, ist ja mit der Komponente der Form verknüpft (ja ich weiss, der Service hat nicht wirklich eine Form sondern nur eine Art Komponenten-Container).
Da es mir nun bereits mehrmals passiert ist, dass ich bei einer Änderung vergessen habe, diese in beiden Applikationen vorzunehmen, suche ich dringend nach einer Lösung, bei der ich den Code nur noch an einer Stelle habe.
Aber wie gesagt, ich komme nicht auf die Lösung. Für einen erleuchtenden Hinweis wäre ich dankbar.
Heinz Schneider
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

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

AW: Indy und Wiedervervendung von procedure

  Alt 28. Feb 2013, 16:26
Ich würde den gemeinsamen Code in eine (oder mehrere) Klasse(n) auslagern.
Diese Klasse(n) befindet sich wiederum in einer Unit, die von App und Service benützt wird.
Delphi-Quellcode:
TServerAblauf = class(TObject)
protected
  FServer : TIdTcpServer;
public
  constructor Create(server : TIdTcpServer);
  procedure Execute;
end;

constructor TServerAblauf.Create(server : TIdTcpServer);
begin
  inherited Create;
  FServer := server;
  // hier evtl. noch Events auf eigene Methoden richten
  FServer.OnDisconnect := self.DisconnectHandler;
end;

procedure TServerAblauf.Execute;
begin
  // dein Code
end;
  Mit Zitat antworten Zitat
hesch21

Registriert seit: 31. Aug 2004
Ort: Basel
114 Beiträge
 
Delphi XE2 Enterprise
 
#3

AW: Indy und Wiedervervendung von procedure

  Alt 1. Mär 2013, 09:43
Danke sx2008 für Deinen Tipp. Der Ansatz ist gut, nur...
Das OnExecute-Event vom Indy-TCPServer sieht wie folgt aus:
procedure IdTCPServerExecute(AContext: TIdContext); Wie komme ich jetzt nach Deiner Methode an den AContext?
Ich müsste doch irgendwie die procedure gar nicht bei der Klasse definieren sondern im Constructor das OnExecute-Event definieren, aber das schaffe ich wieder nicht.
Heinz Schneider
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#4

AW: Indy und Wiedervervendung von procedure

  Alt 1. Mär 2013, 11:24
Es ist vieleicht wichtig welche Indy-Version überhaupt verwendet wird.

Bei Indy-9 ist das Event so deklariert:
Delphi-Quellcode:
  TIdServerThreadEvent = procedure(AThread: TIdPeerThread) of object;
{...}
    property OnExecute: TIdServerThreadEvent read FOnExecute write FOnExecute;
Auf jeden Fall sind alle Events als "of object" vereinbart und erwarten damit die Methode einer Klasse. Also implementiere in deiner Klasse einfach die entsprechende Ereignismethode, so wie das Ereignis in deiner Version der Komponente definiert ist:
Delphi-Quellcode:
TServerAblauf = class(TObject)
protected
  FServer : TIdTcpServer;
  procedure DoExecute(AThread: TIdPeerThread);
public
  constructor Create(server : TIdTcpServer);
end;

constructor TServerAblauf.Create(server : TIdTcpServer);
begin
  inherited Create;
  FServer := server;
  // hier evtl. noch Events auf eigene Methoden richten
  FServer.OnExecute := DoExecute;
end;

procedure TServerAblauf.DoExecute(AThread: TIdPeerThread);
begin
  // Hier tun, was zu tun ist.

end;
  Mit Zitat antworten Zitat
hesch21

Registriert seit: 31. Aug 2004
Ort: Basel
114 Beiträge
 
Delphi XE2 Enterprise
 
#5

AW: Indy und Wiedervervendung von procedure

  Alt 1. Mär 2013, 12:55
Hallo Blup

ich benutze Indy-10. da ist die Definition
Code:
TIdServerThreadEvent = procedure(AContext: TIdContext) of object;

  TIdServerContext = class(TIdContext)
  protected
    FServer: TIdCustomTCPServer;
  public
    property Server: TIdCustomTCPServer read FServer;
  end;

  TIdServerContextClass = class of TIdServerContext;


    // Occurs in the context of the peer thread
    property OnExecute: TIdServerThreadEvent read FOnExecute write FOnExecute;
Also muss ich doch nur folgendes anpassen:
Code:
TServerAblauf = class(TObject)
protected
  FServer : TIdTcpServer;
  procedure DoExecute(AThread: TIdContext);
public
  constructor Create(server : TIdTcpServer);
end;

constructor TServerAblauf.Create(server : TIdTcpServer);
begin
  inherited Create;
  FServer := server;
  // hier evtl. noch Events auf eigene Methoden richten
  FServer.OnExecute := DoExecute;
end;

procedure TServerAblauf.DoExecute(AThread: TIdContext);
begin
  // Hier tun, was zu tun ist.

end;
Ich hoffe, ich sehe das richtig. Werde das am Wochenende austesten. Leider komme ich heute nicht mehr dazu.
Heinz Schneider
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.136 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Indy und Wiedervervendung von procedure

  Alt 1. Mär 2013, 19:15
unter http://sourceforge.net/projects/indy10clieservr/ findest Du eine Shared Unit mit allen Funktionen zum Übertragen von Daten mit INDY , natürlich wegen reuse ausgelagert und geshared



( http://indy10clieservr.svn.sourcefor...04&view=markup )

Geändert von bernhard_LA ( 1. Mär 2013 um 19:22 Uhr)
  Mit Zitat antworten Zitat
hesch21

Registriert seit: 31. Aug 2004
Ort: Basel
114 Beiträge
 
Delphi XE2 Enterprise
 
#7

AW: Indy und Wiedervervendung von procedure

  Alt 4. Mär 2013, 13:41
Also, ich hab's getestet und es funktioniert tatsächlich. Hab sogar raus gefunden, dass der Aufruf aus der Main-Unit einfach in der dortigen OnExecute-Procedure der Server-Komponente mittels Aufruf von ServerAblauf.Create unter Angabe des Namen der Server-Komponente auf der Main-Unit erfolgt. Aber irgendwie bin ich mir nicht sicher, ob diese ausgelagerten Prozeduren 'selbstzerstörend' sind. Ich kreiere diese ja nun bei jedem OnExecute-Event, aber gebe diese nirgends explizit frei. Hab's mal probehalber mit einem Free als letzte Zeile der DoExecute-Procedure versucht, aber da bekomme danach Fehlermeldungen in IdThread.
Heinz Schneider
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:22 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