[delphi 6] events afvangen in een component

Pagina: 1
Acties:

  • THIJZEL
  • Registratie: Januari 2001
  • Niet online
hey,

Ik ben een eigen component aan het schrijven gebaseerd op tclientsocket, Nu wil ik de onread procedure afvangen om de component te laten reageren op bepaalde strings die hij received.

dus als bv
code:
1
if socket.receivetext = 'next' then dosomething;


ik heb uit de help inmiddels ong begrepen dat ik de onread property moet overriden, maar dit wil me niet echt lukken..

ik heb nu


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  protected
    procedure onRead; override;
    { Protected declarations }

..

procedure Ttransferclient.onread;
begin
        inherited onread;
        if socket.receivetext = 'next' then
        begin
                sendnext;
        end;
end;

alleen hij kent onread niet zegt hij,


volgens de help heeft tclientsocket wel een onread event..

[ Voor 38% gewijzigd door THIJZEL op 22-04-2003 15:28 ]


  • Kool
  • Registratie: September 1999
  • Niet online
De OnRead moet wel exact dezelfde definitie hebben. En even uit m'n hoofd is deze dat niet. Je mist de parameters volgens mij.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

OnRead is een event property, niet een methode die je kan overriden. Meestal is er bij elke OnXxxx event ook een DoXxxx virtuele methode die je kan overriden. Deze zoek je. Je event blijft dan nogsteeds beschikbaar voor de buitenwereld en toch kan de afgeleide reageren op het event.

Als je veel veranderingen wilt aanbrengen in je eigen afgeleide is het ook niet een gek idee om dan geen afgeleide te maken, maar een nieuwe wrapper om het component heen.

We adore chaos because we like to restore order - M.C. Escher


  • THIJZEL
  • Registratie: Januari 2001
  • Niet online
hmz, doread bestaat ook niet,

hoe kan ik er achter komen hoe deze dan heet?

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 16:57

Creepy

Tactical Espionage Splatterer

THIJZEL schreef op 22 April 2003 @ 21:47:
hmz, doread bestaat ook niet,

hoe kan ik er achter komen hoe deze dan heet?
In de source kijken van het object ;)
Wat mij meestal opvalt is dat bij de standaard objecten die bij Delphi worden meegeleverd er bij een onXXX er een method genaamd XXX is (dus zonder de do).

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • THIJZEL
  • Registratie: Januari 2001
  • Niet online
da's ook vaag, in de source ( ..\dephi6\source\internet\sockets.pas) staat nergens een onread ( text search niet te vinden..) terwijl als ik in mijn app kijk bij de property's van mijn component dan zie ik wel onread enz staan

dit zie ik wel in die source:

code:
1
2
3
4
5
6
7
    property SockType: TSocketType read FSockType write SetSockType default stStream;
    property OnCreateHandle: TSocketNotifyEvent read FOnCreateHandle write FOnCreateHandle;
    property OnDestroyHandle: TSocketNotifyEvent read FOnDestroyHandle write FOnDestroyHandle;
    property OnError: TSocketErrorEvent read FOnError write FOnError;
    [b]property OnReceive: TSocketDataEvent read FOnReceive write FOnReceive;[/b]
    property OnSend: TSocketDataEvent read FOnSend write FOnSend;
  end;


maar op onreceive of fonreceive reageerd hij ook niet.....

[ Voor 7% gewijzigd door THIJZEL op 22-04-2003 22:35 ]


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 01:25

Tomatoman

Fulltime prutser

Als je OnRead in Delphi Help had ingetypt, had je in een seconde geweten dat het een event is van TCustomSocket en gedefinieerd is als
Delphi:
1
2
3
4
5
property OnRead: TSocketNotifyEvent;

type
  TSocketNotifyEvent = procedure(Sender: TObject;
    Socket: TCustomWinSocket) of object;

Een goede grap mag vrienden kosten.


  • THIJZEL
  • Registratie: Januari 2001
  • Niet online
maar nu snap ik nog niet hoe ik nou de onread event van die tcustomwinsocket kan afvangen, deze is toch de basis van de tclientsocket?

[ Voor 4% gewijzigd door THIJZEL op 22-04-2003 23:34 ]


  • CyeZ
  • Registratie: September 2001
  • Laatst online: 05:41

CyeZ

Vroem vroem!!!

Als je die OnRead wilt overriden in een afgeleide component moet je even kijken naar de Event procedure in TCustomSocket. Hierin worden alles events van het TCustomSocket event in 1 functie afgevangen.

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
procedure TCustomSocket.Event(Socket: TCustomWinSocket; SocketEvent: TSocketEvent);
begin
  case SocketEvent of
    seLookup: if Assigned(FOnLookup) then FOnLookup(Self, Socket);
    seConnecting: if Assigned(FOnConnecting) then FOnConnecting(Self, Socket);
    seConnect:
      begin
        FActive := True;
        if Assigned(FOnConnect) then FOnConnect(Self, Socket);
      end;
    seListen:
      begin
        FActive := True;
        if Assigned(FOnListen) then FOnListen(Self, Socket);
      end;
    seDisconnect:
      begin
        FActive := False;
        if Assigned(FOnDisconnect) then FOnDisconnect(Self, Socket);
      end;
    seAccept: if Assigned(FOnAccept) then FOnAccept(Self, Socket);
    seRead: if Assigned(FOnRead) then FOnRead(Self, Socket);
    seWrite: if Assigned(FOnWrite) then FOnWrite(Self, Socket);
  end;
end;

Je zou dus in je child functie zoiets kunnen maken:

Delphi:
1
2
3
4
5
6
7
8
9
procedure TThijzelSocket.Event(Socket: TCustomWinSocket; SocketEvent: TSocketEvent);
begin
  case SocketEvent of
    seRead: <doe maar wat geks>
    else begin 
      inherited Event(Socket,SocketEvent);
    end;
  end;
end;

[18:54] <Prammenhanger> |HunterPro|eet
[18:55] <Prammenhanger> lijkt best op
[18:55] <Prammenhanger> |HunterProFeet


  • THIJZEL
  • Registratie: Januari 2001
  • Niet online
_/-\o_ _/-\o_ _/-\o_

het werkt,


ik snap het nog niet helemaal, maar het werkt dus ik vind het nu wel uit..


iig iedereen bedankt!

  • THIJZEL
  • Registratie: Januari 2001
  • Niet online
waar kan ik precies de sources vinden van die tcustom socket en de tcustom serversocket?

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Je kan toch zien in de help of in je eigen unit welke unit de code staat?

We adore chaos because we like to restore order - M.C. Escher


  • THIJZEL
  • Registratie: Januari 2001
  • Niet online
Nu heb ik een volgend probleem:

Ik heb een andere component gebaseerd op tserversocket, welke ook afstamt van tcustomwinsocket ..

Deze gebruikt ook de procedure event, en als ik connect dan word deze procedure ook gestart. SocketEvent heeft dan ook bv de waarde selookup.

alleen als ik van een andere socket naar deze serversocket schrijf dan word de procedure event niet gestart, terwijl die gestart zou moeten worden en dan socketevent de waarde SEread zou moeten meegeven...

Weet iemand hoe dat kan, bij de clientsocket werkt dit namelijk wel.

[ Voor 20% gewijzigd door THIJZEL op 23-04-2003 13:27 ]


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Weet je wat polymorphisme is? Ik denk namelijk dat je de functie niet geoverride hebt, maar gewoon overschreven.

We adore chaos because we like to restore order - M.C. Escher


  • THIJZEL
  • Registratie: Januari 2001
  • Niet online
de volgende code heb ik:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 protected
    //procedure doclientread; override;
    procedure read(Socket: TCustomWinSocket; SocketEvent: TSocketEvent); override;
    { Protected declarations }

..

procedure Ttransferserver.event(Socket: TCustomWinSocket; SocketEvent: TSocketEvent);
begin
  case SocketEvent of
    seRead: readdata(socket);
     else begin
      inherited Event(Socket,SocketEvent);
    end;
  end;
end;


ik weet alleen niet om eerlijk te zeggen waar voor die inherited dient als socketevent geen SEread is..

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Das bestwel essentieel en misschien moet je maar eens een boek lezen of klassen en polymorphisme. :) Ik zou persoonlijk wel altijd de inhertied in dit geval aanroepen, maar het is niet de oorzaal van dit probleem wat je hebt.

Het kan zijn dat iemand een nieuwe server socket creeerd en daarbij niet jouw afgeleide gebruikt.

We adore chaos because we like to restore order - M.C. Escher


  • THIJZEL
  • Registratie: Januari 2001
  • Niet online
ik zit te bladeren in de source van die customwinsocket en die customwinserversocket maar ik snap het niet helemaal,

wat doet hij hier nou??
code:
1
2
3
4
procedure TServerClientThread.DoRead;
begin
  ClientSocket.ServerWinSocket.Event(ClientSocket, seRead);
end;

  • THIJZEL
  • Registratie: Januari 2001
  • Niet online
CyeZ schreef op 22 april 2003 @ 23:33:
Als je die OnRead wilt overriden in een afgeleide component moet je even kijken naar de Event procedure in TCustomSocket. Hierin worden alles events van het TCustomSocket event in 1 functie afgevangen.

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
procedure TCustomSocket.Event(Socket: TCustomWinSocket; SocketEvent: TSocketEvent);
begin
  case SocketEvent of
    seLookup: if Assigned(FOnLookup) then FOnLookup(Self, Socket);
    seConnecting: if Assigned(FOnConnecting) then FOnConnecting(Self, Socket);
    seConnect:
      begin
        FActive := True;
        if Assigned(FOnConnect) then FOnConnect(Self, Socket);
      end;
    seListen:
      begin
        FActive := True;
        if Assigned(FOnListen) then FOnListen(Self, Socket);
      end;
    seDisconnect:
      begin
        FActive := False;
        if Assigned(FOnDisconnect) then FOnDisconnect(Self, Socket);
      end;
    seAccept: if Assigned(FOnAccept) then FOnAccept(Self, Socket);
    seRead: if Assigned(FOnRead) then FOnRead(Self, Socket);
    seWrite: if Assigned(FOnWrite) then FOnWrite(Self, Socket);
  end;
end;
maar waarom zou Event niet angeroepen worden wanneer een Tserversocket data ontvangt? deze is toch ook gebaseerd op tcustomwinsocket..
Pagina: 1