现在有一个被调用 MDaemonAPI_Impl.pas 文件,
主窗体fServerForm,
我想在主窗体fServerForm调用MDaemonAPI_Impl的函数,
已经做了以下两点
1: 在主窗体已经引用被调用文件
2: 被调用的文件的函数已经设置成publi 或者 published都不行
现在可以访问被调文件的部分内容(比如 MDaemonAPI_Impl.TMDaemonAPI.create()),想调函数AddUser()却不行见主窗体的/*调试行*/ 行代码,那里的adduser怎么也出不来,
何故?源文件如下
被调用文件
unit MDaemonAPI_Impl;{$I RemObjects.inc}interfaceuses
{$IFDEF FPC}LResources,{$ENDIF}
{vcl:} Classes, SysUtils,
{RemObjects:} uROXMLIntf, uROClientIntf, uROTypes, uROServer, uROServerIntf, uROSessions,
{Required:} uRORemoteDataModule,
{Generated:} MDaemonAPILibrary_Intf;type
{ TMDaemonAPI }
TMDaemonAPI = class(TRORemoteDataModule, IMDaemonAPI)
private
sMessage: AnsiString;
public
{ IMDaemonAPI methods }
function AddUser(const FullName: AnsiString; const UserName: AnsiString; const Password: AnsiString; const Domain: AnsiString): Integer;
function ChangePassword(const Email: AnsiString; const NewPassword: AnsiString): Boolean;
function DeleteUser(const Email: AnsiString): Boolean;
function GetMessage: AnsiString;
end;implementation{$IFNDEF FPC}
{$R *.dfm}
{$ENDIF}
uses
{Generated:} MDaemonAPILibrary_Invk, MDUSERCOMLib_TLB;procedure Create_MDaemonAPI(out anInstance : IUnknown);
begin
anInstance := TMDaemonAPI.Create(nil);
end;{ MDaemonAPI }
function TMDaemonAPI.AddUser(const FullName: AnsiString; const UserName: AnsiString; const Password: AnsiString; const Domain: AnsiString): Integer;
begin
{内容略}
end;function TMDaemonAPI.ChangePassword(const Email: AnsiString; const NewPassword: AnsiString): Boolean;
begin
{内容略}
end;function TMDaemonAPI.DeleteUser(const Email: AnsiString): Boolean;
begin
{内容略}
end;function TMDaemonAPI.GetMessage: AnsiString;
begin
result:= sMessage;
if AddUser('a','bb','c','d')>0 then
begin end;
end;var
fClassFactory: IROClassFactory;
initialization
{$IFDEF FPC}
{$I MDaemonAPI_Impl.lrs}
{$ENDIF}
fClassFactory := TROClassFactory.Create('MDaemonAPI', Create_MDaemonAPI, TMDaemonAPI_Invoker);
// RegisterForZeroConf(fClassFactory,'_MDaemonAPI_rosdk._tcp.');finalization
UnRegisterClassFactory(fClassFactory);
fClassFactory := nil;end.主窗体代码如下
unit fServerForm;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,
uROClient, uROPoweredByRemObjectsButton, uROClientIntf, uROServer,
uROSOAPMessage, uROIndyHTTPServer, ExtCtrls, Menus, ImgList, uROIndyTCPServer;type
TServerForm = class(TForm)
ROMessage: TROSOAPMessage;
ROServer: TROIndyHTTPServer;
TrayIcon1: TTrayIcon;
ImageList1: TImageList;
PopupMenu1: TPopupMenu;
Exit1: TMenuItem;
Button1: TButton;
Timer1: TTimer;
Label1: TLabel;
Button2: TButton;
N1: TMenuItem;
About1: TMenuItem;
PopupMenu2: TPopupMenu;
inputaccount1: TMenuItem;
addacount1: TMenuItem;
OpenDialog1: TOpenDialog;
procedure Timer1Timer(Sender: TObject);
procedure Exit1Click(Sender: TObject);
procedure TrayIcon1DblClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure About1Click(Sender: TObject);
procedure inputaccount1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
ServerForm: TServerForm;implementationuses MDaemonAPI_Impl;
{$R *.dfm}procedure TServerForm.About1Click(Sender: TObject);
begin
MessageDlg('MDaemon API Server v1.0'#13#10'Service to mail user management for OA.'#13#10'(c)Copyright 2010, [email protected]', mtInformation, [mbOK], 0);
end;procedure TServerForm.Button1Click(Sender: TObject);
var
r: Integer;
beginend;procedure TServerForm.Button2Click(Sender: TObject);
begin
end;procedure TServerForm.Exit1Click(Sender: TObject);begin
end;procedure TServerForm.FormCreate(Sender: TObject);
begin
end;procedure TServerForm.inputaccount1Click(Sender: TObject);
var
CsvLines, CommaStr: TStringList;
i,j:integer;
begin
if OpenDialog1.Execute then
begin
CsvLines := TStringList.Create;
CommaStr := TStringList.Create;
CsvLines.LoadFromFile(OpenDialog1.FileName); //读取
for i := 0 to CsvLines.Count - 1 do
begin
CommaStr.CommaText := CsvLines[i];
for j := 0 to CommaStr.Count - 1 do
begin
showmessage(CommaStr[j]);
/*调试行*/ if (MDaemonAPI_Impl.TMDaemonAPI.AddUser...) then
begin end; end;
end;
CsvLines.Free;
CommaStr.Free; end;
end;procedure TServerForm.Timer1Timer(Sender: TObject);
beginend;procedure TServerForm.TrayIcon1DblClick(Sender: TObject);
begin
Show;
end;end.
主窗体fServerForm,
我想在主窗体fServerForm调用MDaemonAPI_Impl的函数,
已经做了以下两点
1: 在主窗体已经引用被调用文件
2: 被调用的文件的函数已经设置成publi 或者 published都不行
现在可以访问被调文件的部分内容(比如 MDaemonAPI_Impl.TMDaemonAPI.create()),想调函数AddUser()却不行见主窗体的/*调试行*/ 行代码,那里的adduser怎么也出不来,
何故?源文件如下
被调用文件
unit MDaemonAPI_Impl;{$I RemObjects.inc}interfaceuses
{$IFDEF FPC}LResources,{$ENDIF}
{vcl:} Classes, SysUtils,
{RemObjects:} uROXMLIntf, uROClientIntf, uROTypes, uROServer, uROServerIntf, uROSessions,
{Required:} uRORemoteDataModule,
{Generated:} MDaemonAPILibrary_Intf;type
{ TMDaemonAPI }
TMDaemonAPI = class(TRORemoteDataModule, IMDaemonAPI)
private
sMessage: AnsiString;
public
{ IMDaemonAPI methods }
function AddUser(const FullName: AnsiString; const UserName: AnsiString; const Password: AnsiString; const Domain: AnsiString): Integer;
function ChangePassword(const Email: AnsiString; const NewPassword: AnsiString): Boolean;
function DeleteUser(const Email: AnsiString): Boolean;
function GetMessage: AnsiString;
end;implementation{$IFNDEF FPC}
{$R *.dfm}
{$ENDIF}
uses
{Generated:} MDaemonAPILibrary_Invk, MDUSERCOMLib_TLB;procedure Create_MDaemonAPI(out anInstance : IUnknown);
begin
anInstance := TMDaemonAPI.Create(nil);
end;{ MDaemonAPI }
function TMDaemonAPI.AddUser(const FullName: AnsiString; const UserName: AnsiString; const Password: AnsiString; const Domain: AnsiString): Integer;
begin
{内容略}
end;function TMDaemonAPI.ChangePassword(const Email: AnsiString; const NewPassword: AnsiString): Boolean;
begin
{内容略}
end;function TMDaemonAPI.DeleteUser(const Email: AnsiString): Boolean;
begin
{内容略}
end;function TMDaemonAPI.GetMessage: AnsiString;
begin
result:= sMessage;
if AddUser('a','bb','c','d')>0 then
begin end;
end;var
fClassFactory: IROClassFactory;
initialization
{$IFDEF FPC}
{$I MDaemonAPI_Impl.lrs}
{$ENDIF}
fClassFactory := TROClassFactory.Create('MDaemonAPI', Create_MDaemonAPI, TMDaemonAPI_Invoker);
// RegisterForZeroConf(fClassFactory,'_MDaemonAPI_rosdk._tcp.');finalization
UnRegisterClassFactory(fClassFactory);
fClassFactory := nil;end.主窗体代码如下
unit fServerForm;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,
uROClient, uROPoweredByRemObjectsButton, uROClientIntf, uROServer,
uROSOAPMessage, uROIndyHTTPServer, ExtCtrls, Menus, ImgList, uROIndyTCPServer;type
TServerForm = class(TForm)
ROMessage: TROSOAPMessage;
ROServer: TROIndyHTTPServer;
TrayIcon1: TTrayIcon;
ImageList1: TImageList;
PopupMenu1: TPopupMenu;
Exit1: TMenuItem;
Button1: TButton;
Timer1: TTimer;
Label1: TLabel;
Button2: TButton;
N1: TMenuItem;
About1: TMenuItem;
PopupMenu2: TPopupMenu;
inputaccount1: TMenuItem;
addacount1: TMenuItem;
OpenDialog1: TOpenDialog;
procedure Timer1Timer(Sender: TObject);
procedure Exit1Click(Sender: TObject);
procedure TrayIcon1DblClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure About1Click(Sender: TObject);
procedure inputaccount1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
ServerForm: TServerForm;implementationuses MDaemonAPI_Impl;
{$R *.dfm}procedure TServerForm.About1Click(Sender: TObject);
begin
MessageDlg('MDaemon API Server v1.0'#13#10'Service to mail user management for OA.'#13#10'(c)Copyright 2010, [email protected]', mtInformation, [mbOK], 0);
end;procedure TServerForm.Button1Click(Sender: TObject);
var
r: Integer;
beginend;procedure TServerForm.Button2Click(Sender: TObject);
begin
end;procedure TServerForm.Exit1Click(Sender: TObject);begin
end;procedure TServerForm.FormCreate(Sender: TObject);
begin
end;procedure TServerForm.inputaccount1Click(Sender: TObject);
var
CsvLines, CommaStr: TStringList;
i,j:integer;
begin
if OpenDialog1.Execute then
begin
CsvLines := TStringList.Create;
CommaStr := TStringList.Create;
CsvLines.LoadFromFile(OpenDialog1.FileName); //读取
for i := 0 to CsvLines.Count - 1 do
begin
CommaStr.CommaText := CsvLines[i];
for j := 0 to CommaStr.Count - 1 do
begin
showmessage(CommaStr[j]);
/*调试行*/ if (MDaemonAPI_Impl.TMDaemonAPI.AddUser...) then
begin end; end;
end;
CsvLines.Free;
CommaStr.Free; end;
end;procedure TServerForm.Timer1Timer(Sender: TObject);
beginend;procedure TServerForm.TrayIcon1DblClick(Sender: TObject);
begin
Show;
end;end.
解决方案 »
- datetime写库的问题
- DELPHI+SQLSERVER2000如何处理大量的数据?
- 窗体句柄
- 我对Delphi里面的TChart控件不熟悉,请问怎么控制 TChartSeries呀,比如怎么控制颜色,曲线表的高度等,谢谢,拜托(还可以在加分)
- 关于DBGridEH动态添加标题的问题
- 如何获得一个excel文件的几个sheet名称,赋给combobox?
- 菜鸟问题哦~~~嘻~
- B/S结构数据库.........请进>>>>>
- DELPHI中的视图怎么这样呀?
- 将Webbrowser中显示的页面中的选定的文字等内容复制或全选如何实现?
- 文件如何写入war包指定路径中
- 怎么用代码让sql数据库服务器启动?
class function AddUser(const FullName: AnsiString; const UserName: AnsiString; const Password: AnsiString; const Domain: AnsiString): Integer;在实现的部分也需要添加!
只有类方法可以直接调用,如你的代码:
/*调试行*/ if (MDaemonAPI_Impl.TMDaemonAPI.AddUser...)
否则,你需要创建实例才可以。类方法中不能包含类成员变量
在被调文件中的函数加了class
//定义
public
{ IMDaemonAPI methods }
class function AddUser(const FullName: AnsiString; const UserName: AnsiString; const Password: AnsiString; const Domain: AnsiString): Integer;//函数体
{ MDaemonAPI }
class function TMDaemonAPI.AddUser(const FullName: AnsiString; const UserName: AnsiString; const Password: AnsiString; const Domain: AnsiString): Integer;
begin
end;编译报错
[DCC Error] MDaemonAPI_Impl.pas(32): E2211 Declaration of 'AddUser' differs from declaration in interface 'IMDaemonAPI'
如下:
class function TMDaemonAPI.AddUser(const FullName: AnsiString; const UserName: AnsiString; const Password: AnsiString; const Domain: AnsiString): Integer;
begin
{内容略}
end;
按照楼上兄弟的说法
在被调文件中的函数加了class
//定义
public
{ IMDaemonAPI methods }
class function AddUser(const FullName: AnsiString; const UserName: AnsiString; const Password: AnsiString; const Domain: AnsiString): Integer;//函数体
{ MDaemonAPI }
class function TMDaemonAPI.AddUser(const FullName: AnsiString; const UserName: AnsiString; const Password: AnsiString; const Domain: AnsiString): Integer;
begin
end;编译报错
[DCC Error] MDaemonAPI_Impl.pas(32): E2211 Declaration of 'AddUser' differs from declaration in interface 'IMDaemonAPI'
unit Unit2;interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, OleCtrls, SHDocVw;
type
TTestClass=class
public
class function AddUser(): Integer;
end;
implementation
class function TTestClass.AddUser(): Integer;
begin
Result:=1;
end;
end.unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, OleCtrls, SHDocVw;type
TForm1 = class(TForm)
WebBrowser1: TWebBrowser;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation
uses
Unit2;
{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(IntToStr(TTestClass.adduser));
end;这样只能感知器不提示,但是能编译,能正常运行。。可以得到结果