在一个Unit里创建了一个ClientSocket控件(只有.pas文件没有dfm), 声明了一个过程 procedure ClientSocketRead(Sender: TObject;Socket: TCustomWinSocket);在给那个动态创建了的ClientSocket控件的OnRead 赋值的时候报错:"method pointer and regular procedure"这样的错误(gSocket.OnRead:=ClientSocketRead)。
请问怎样解决?
请问怎样解决?
解决方案 »
- A程序即将用DELPHI写,B是用VC写的,在A里用SHELLEXCUTE调用B,并模拟键盘填充B的输入框,该如何是好?
- 年终放分
- 有人听说过友劲吗
- 高分相送!用Timer事件接受串口数据 后退出系统弹出错误!
- FastReport或ReportMachine 如何实现即打即停功能,请给出源码。感激!
- 求《Delphi X Developer's Guide》电子,100分
- 一个简单的通讯问题
- TADOConnection高难度问题
- 提问:能不能把一个word窗口插入到delphi的窗口中去
- 哪里有免费的建模工具下载?
- 请问各位,一个问题,清楚与不不清楚的人士都来看一下吧.大家互相学习.
- 计算机中了几个奇怪的病毒大家帮帮我
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp,IniFiles;var
gSocket:TClientSocket;
function CreateSocket:Boolean;
function SendCommand:Boolean;
function GetParth:string;
procedure ClientSocketRead(Sender: TObject;Socket: TCustomWinSocket);implementationfunction CreateSocket:Boolean;
var
IsCreate:Boolean;
begin
IsCreate:=true;
try
gSocket:= TClientSocket.Create(nil);
gSocket.Host:='140.200.0.11';
gSocket.Port:=10899;
gSocket.OnRead:=ClientSocketRead;
// gSocket.Open;
except
//
gSocket.Free;
IsCreate:=false;
end;
If IsCreate then
Result:=true
else
Result:=false;
end;function SendCommand:Boolean;
begin
If gSocket<>nil then
begin
If not gSocket.Active then
gSocket.Open;
gSocket.Socket.SendText('PleaseSendVersionInfo&'+GetParth);
end;
end;function GetParth:string;
var
IniFile:TIniFile;
strSour:string;
begin
strSour:='';
IniFile := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'Init.ini');
try
strSour := IniFile.ReadString('ServerPath', 'Path', 'c:\Project1.exe');
finally
IniFile.Free;
end;
Result:=strSour;
end;procedure ClientSocketRead(Sender: TObject;Socket: TCustomWinSocket);
var
str:string;
begin
str:=Socket.ReceiveText;
end;
end.
type TSocketNotifyEvent = procedure (Sender: TObject; Socket: TCustomWinSocket) of object;
后面有of object,这就说明和longhuazhen所说的一样,
ClientSocketRead过程一定要隶属于一个对象,才满足OnRead事件原型的定义。
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp,IniFiles;type
Txxx=class(TObject)
private
gSocket:TClientSocket;
public
function CreateSocket:Boolean;
function SendCommand:Boolean;
function GetParth:string;
procedure ClientSocketRead(Sender: TObject;Socket: TCustomWinSocket);
end;implementationfunction Txxx.CreateSocket:Boolean;
var
IsCreate:Boolean;
begin
IsCreate:=true;
try
gSocket:= TClientSocket.Create(nil);
gSocket.Host:='140.200.0.11';
gSocket.Port:=10899;
gSocket.OnRead:=ClientSocketRead;
// gSocket.Open;
except
//
gSocket.Free;
IsCreate:=false;
end;
If IsCreate then
Result:=true
else
Result:=false;
end;function Txxx.SendCommand:Boolean;
begin
If gSocket<>nil then
begin
If not gSocket.Active then
gSocket.Open;
gSocket.Socket.SendText('PleaseSendVersionInfo&'+GetParth);
end;
end;function Txxx.GetParth:string;
var
IniFile:TIniFile;
strSour:string;
begin
strSour:='';
IniFile := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'Init.ini');
try
strSour := IniFile.ReadString('ServerPath', 'Path', 'c:\Project1.exe');
finally
IniFile.Free;
end;
Result:=strSour;
end;procedure Txxx.ClientSocketRead(Sender: TObject;Socket: TCustomWinSocket);
var
str:string;
begin
str:=Socket.ReceiveText;
end;
end.
------------------------------
窗体=类?你是这么理解的?这么说吧,你这种程序出现了全局函数本身就是非常糟糕的设计。而且类方法本身就是一种数据类型,就算要这里要用全局函数也需要自己填充一个TMethod。