lnet - In einer eigenen Komponente nutzen (non-visual)

Alle Fragen zur Netzwerkkommunikation
Antworten
_X_
Beiträge: 250
Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit

lnet - In einer eigenen Komponente nutzen (non-visual)

Beitrag von _X_ »

Wie kann ich lnet in Komponenten nutzen?
Da muss ich ja wohl die nicht-visuellen verwenden.

Bei den NICHT-visuellen lnet-Kompos sprechen die Events nur an wenn man in einer Schleife TLConnection.CallAction aufruft.
Wie soll ich das in einer Nicht-visuellen Komponente machen?
Möglichst nicht blockierend. Ich möchte keinen Timer verwenden. Das muss doch auch irgendwie eleganter gehen.

Danke schon Mal.

mfg _X_

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: lnet - In einer eigenen Komponente nutzen (non-visual)

Beitrag von Hitman »

Mir fallen da drei Möglichkeiten ein:
  1. Leite deine Komponente von den LCL LNET Komponenten ab (die übrigens bereits nicht-visuell sind ...)
  2. Verwende die LCL LNET Komponenten als Child deiner eigenen (also mit deiner Komponente als Owner)
  3. Implementier - genau wie es die LCL LNET Komponenten tun - den beiliegenden LCLEventer

Ich würde zu Variante 2 oder ggf. 1 tendieren.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: lnet - In einer eigenen Komponente nutzen (non-visual)

Beitrag von mschnell »

Was hat das Aufrufen eines Events denn mit "visuell" zu tun ?

Du machst einfach

var xy: Txy;

...

xy1 := Txy.create(self);
xy1.OnEvent := MyEventHandler;
xy1.Poperty1 := Value1;
...

-Michael

_X_
Beiträge: 250
Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit

Re: lnet - In einer eigenen Komponente nutzen (non-visual)

Beitrag von _X_ »

Code: Alles auswählen

unit pdServer;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, ExtCtrls, lnet, lnetComponents, pdtypes, pdScreen, Forms;
 
type
  TPDServer = class(TComponent)
  private
    procedure FCRecv(aSocket: TLSocket);
    procedure FCErr(const msg: string; aSocket: TLSocket);
    procedure FCDCon(aSocket: TLSocket);
    procedure FCCon(aSocket: TLSocket);
  private
    //FImg:       TImage;
    FCon:       TLTCP;
    AStreamPic: string;
  public
    constructor Create(AOwner: TComponent);
    destructor  Destroy();
    procedure   Listen(port: word);
  public
  end;
 
implementation
 
constructor TPDServer.Create(AOwner: TComponent);
begin
  //FImg.Create(AOwner);
 
  FCon := TLTCP.Create(AOwner);
  FCon.OnConnect    := @FCCon;
  FCon.OnReceive    := @FCRecv;
  FCon.OnError      := @FCErr;
  FCon.OnDisconnect := @FCDCon;
 
  inherited Create(AOwner);
end;
 
destructor TPDServer.Destroy;
begin
  //FImg.Destroy;
  FCon.Destroy;
 
  inherited Destroy();
end;
 
procedure TPDServer.Listen(port: word);
begin
  if FCon.Listen(port) = false then begin
    raise EPDServerConnectError.Create('Listen Error: Could not start server at localost:' + inttostr(port));
  end
  else begin
    while Application.Active do begin Application.ProcessMessages;  FCon.CallAction; end; //stimmt das so?
  end;
end;
 
procedure TPDServer.FCRecv(aSocket: TLSocket);
begin
end;
 
procedure TPDServer.FCErr(const msg: string; aSocket: TLSocket);
begin
  raise EPDServerError.Create('Socket Error at ' + inttostr(aSocket.Handle) + #10#13 + 'Error Msg:' + #10#13 + msg);
end;
 
procedure TPDServer.FCDCon(aSocket: TLSocket);
begin
end;
 
procedure TPDServer.FCCon(aSocket: TLSocket);
var hScreen: TScreenres;
begin
  writeln(FCon.Count-1); // das hier wird nie gemacht, dh. der Event wird nie ausgelöst
  if FCon.Count-1 > 1 then begin
    aSocket.SendMessage('error: 1, "to many Connections";;');
    aSocket.Disconnect;
  end
  else begin
    hScreen := getScreenResolution();
    aSocket.SendMessage('TScreen: x=' + inttostr(hScreen.x) + ';y=' + inttostr(hScreen.y) + ';;');
  end;
end;
 
end.
Das habe ich gemeint.
Stimmt das so?

mfg _X_

_X_
Beiträge: 250
Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit

Re: lnet - In einer eigenen Komponente nutzen (non-visual)

Beitrag von _X_ »

OK, der Titel stimmt nicht ganz.
Kann mir trotzdem jemand helfen, oder wisst ihr auch nicht wie es geht?

mfg _X_

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: lnet - In einer eigenen Komponente nutzen (non-visual)

Beitrag von monta »

Titel kannst du ja bearbeiten ;)

Ansonsten weiß es wohl keiner besser.
Johannes

_X_
Beiträge: 250
Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit

Re: lnet - In einer eigenen Komponente nutzen (non-visual)

Beitrag von _X_ »

Ich habe es gelöst, auch wenns lange gedauert hat.

Statt TLTCP TLTCPComponent und statt OnConnect OnAccess.

mfg _X_

Antworten