您的位置:程序门 -> delphi -> windows sdk/api



组件的事件问题


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


组件的事件问题[已结贴,结贴人:yao518]
发表于:2007-04-19 13:11:51 楼主
unit   unit1;

interface

uses
    windows,   messages,   sysutils,   variants,   classes,   graphics,   controls,   forms,
    dialogs,   stdctrls,   scktcomp;

type
    tform1   =   class(tform)
        button1:   tbutton;
        procedure   button1click(sender:   tobject);
    private
        procedure   clientread   (sender:   tobject;   socket:   tcustomwinsocket);
    public
        {   public   declarations   }
    end;

var
    form1:   tform1;

implementation

{$r   *.dfm}

var
    serversocket1:   tserversocket;

procedure   tform1.button1click(sender:   tobject);
begin
    serversocket1.onclientread   :=   clientread;
end;

procedure   tform1.clientread(sender:   tobject;   socket:   tcustomwinsocket);
begin

end;

end.
上面的代码是可行的,而且没有错误的
\\-------------------------------------------------------------------------
下面的代码是不可行的,而且有错误,但我不清楚为什么会出错

library   clientdll;

uses
    sysutils,
    classes,
    scktcomp,
    command   in   'command.pas ';

{$r   *.res}

var
    serversocket1:   tserversocket;

procedure   clientread   (sender:   tobject;   socket:   tcustomwinsocket);
var
    s:   string;
begin
    s   :=   socket.receivetext;
end;

procedure   starttcpserver;
begin
    serversocket1   :=   tserversocket.create(nil);
    with   serversocket1   do
    begin
        port   :=   503;
        servertype   :=   stthreadblocking;
        onclientread   :=   clientread;
        active   :=   true;
    end;
end;

procedure   closetcpserver;
begin
    with   serversocket1   do
    begin
        active   :=   false;
        free;
    end;
end;

begin

end.
\\--------------------------------------------------------------

上面的二段代码同样是onclientread   :=   clientread;但下面的一个就有问题,是错误的。我不知道是那里出了问题,是不是dll里面不能这样写。
发表于:2007-04-19 13:16:051楼 得分:0
可能不是成员函数!
发表于:2007-04-19 13:42:572楼 得分:20
非成员函数也用过,这样转一下吧,新建一个unit

unit   unit1;

interface

uses
      scktcomp;

type
  tprocess=class
  public
      class   procedure   clientread   (sender:   tobject;   socket:   tcustomwinsocket);
  end;

implementation

{   tprocess   }

class   procedure   tprocess.clientread(sender:   tobject;
    socket:   tcustomwinsocket);
var
    s:   string;
begin
    s   :=   socket.receivetext;
end;

end.

然后到dll   library中改

onclientread   :=   tprocess.clientread;     //tprocess不用创建,clientread只是一个类方法
发表于:2007-04-19 13:48:133楼 得分:0
强!
发表于:2007-04-19 14:40:374楼 得分:0
这样也行。。你确定。。也太强了吧。
发表于:2007-04-19 15:03:515楼 得分:0
你的代码我试了一下ok...完全没有问题。

  能告诉我为什么要这样写吗,还有第一行的意思和功能,他这样写的格式有什么好处和与别的格式的区别在那里。
发表于:2007-04-19 15:15:046楼 得分:0
好像函数必需为类里的成员。这只是折衷的办法
发表于:2007-05-14 11:12:307楼 得分:0
唉..都难我不小心,编译是没有问题.

    但都收不到数据...

server----------------------------------------------------------------------------------

program   server;

{$apptype   console}

uses
    sysutils,   scktcomp;

type
    tprocess   =   class
        class   procedure   clientread(sender:   tobject;   socket:   tcustomwinsocket);
    end;

var
    serversocket1:   tserversocket;

{   tprocess   }

class   procedure   tprocess.clientread(sender:   tobject;   socket:   tcustomwinsocket);
var
    s:   string;
begin
    s   :=   socket.receivetext;
    writeln(s);
end;

begin
    serversocket1   :=   tserversocket.create(nil);
    with   serversocket1   do
    begin
        port   :=   11111;
        active   :=   true;
        onclientread   :=   tprocess.clientread;
    end;
    writeln( 'serversocket...open   ok ');
    readln;
end.

client----------------------------------------------------------------------------

unit   unit1;

interface

uses
    windows,   messages,   sysutils,   variants,   classes,   graphics,   controls,   forms,
    dialogs,   stdctrls,   scktcomp;

type
    tform1   =   class(tform)
        clientsocket1:   tclientsocket;
        button1:   tbutton;
        procedure   button1click(sender:   tobject);
    private
        {   private   declarations   }
    public
        {   public   declarations   }
    end;

var
    form1:   tform1;

implementation

{$r   *.dfm}

procedure   tform1.button1click(sender:   tobject);
begin
    with   clientsocket1   do
    begin
        address   :=   '127.0.0.1 ';
        port   :=   11111;
        active   :=   true;
        socket.sendtext( 'hello,world ');
    end;
end;

end.
发表于:2007-05-14 11:13:308楼 得分:0
你在看看上面的代码,都可以编译.而且是没有出错.但是收不到数据.唉..都是我当时没有试一下.只知道编译没有出错.


快速检索

最新资讯
热门点击