调用其他窗体函数问题

loveness 2010-05-20 10:26:53
现在有一个被调用 MDaemonAPI_Impl.pas 文件,
主窗体fServerForm,
我想在主窗体fServerForm调用MDaemonAPI_Impl的函数,
已经做了以下两点
1: 在主窗体已经引用被调用文件
2: 被调用的文件的函数已经设置成publi 或者 published都不行
现在可以访问被调文件的部分内容(比如 MDaemonAPI_Impl.TMDaemonAPI.create()),想调函数AddUser()却不行

见主窗体的/*调试行*/ 行代码,那里的adduser怎么也出不来,
何故?

源文件如下
被调用文件
unit MDaemonAPI_Impl;

{$I RemObjects.inc}

interface

uses
{$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;

interface

uses
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;

implementation

uses 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, samland.gx@gmail.com', mtInformation, [mbOK], 0);
end;

procedure TServerForm.Button1Click(Sender: TObject);
var
r: Integer;
begin

end;

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);
begin

end;

procedure TServerForm.TrayIcon1DblClick(Sender: TObject);
begin
Show;
end;

end.
...全文
189 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
yyfhz 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 loveness 的回复:]
...
[DCC Error] MDaemonAPI_Impl.pas(32): E2211 Declaration of 'AddUser' differs from declaration in interface 'IMDaemonAPI'
[/Quote]
这个错误看起来是你的class和对应的interface中的方法定义不一致所导致的.我猜你的MDaemonAPI_Impl实现的借口中应该包含IMDaemonAPI吧?
wliaoc 2010-05-27
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 casinosun 的回复:]
要声明个变量,然后创建个实例,在调用adduser函数
[/Quote]

搞定
hunter103 2010-05-24
  • 打赏
  • 举报
回复

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;

interface

uses
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;



这样只能感知器不提示,但是能编译,能正常运行。。可以得到结果
casinosun 2010-05-24
  • 打赏
  • 举报
回复
要声明个变量,然后创建个实例,在调用adduser函数
dinoalex 2010-05-21
  • 打赏
  • 举报
回复
试试类方法
loveness 2010-05-21
  • 打赏
  • 举报
回复
多谢楼上兄弟,我上面下面就是都加了呀
按照楼上兄弟的说法
在被调文件中的函数加了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'
火龙岛主 2010-05-21
  • 打赏
  • 举报
回复
下面也要加啊!
如下:
class function TMDaemonAPI.AddUser(const FullName: AnsiString; const UserName: AnsiString; const Password: AnsiString; const Domain: AnsiString): Integer;
begin
{内容略}
end;
loveness 2010-05-21
  • 打赏
  • 举报
回复
按照楼上兄弟的说法
在被调文件中的函数加了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'

火龙岛主 2010-05-21
  • 打赏
  • 举报
回复
类方法:
class function AddUser(const FullName: AnsiString; const UserName: AnsiString; const Password: AnsiString; const Domain: AnsiString): Integer;

在实现的部分也需要添加!
只有类方法可以直接调用,如你的代码:
/*调试行*/ if (MDaemonAPI_Impl.TMDaemonAPI.AddUser...)
否则,你需要创建实例才可以。类方法中不能包含类成员变量
loveness 2010-05-21
  • 打赏
  • 举报
回复
在什么地方加呀?
bdmh 2010-05-21
  • 打赏
  • 举报
回复
类方法就是 前面加上 class修饰
loveness 2010-05-21
  • 打赏
  • 举报
回复
兄弟回答的好简练哟,能不能细说一下,给点代码

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧