Delphi 7对象未定义
我有一个使用Delphi创建的web服务,我想用它连接到sql server,因此我在项目中添加了ADO连接和ADOQuery,并对它们进行了配置并准备好使用,只有一个小问题,我的项目中有两个单元,这些对象被添加到了单元1中,我正在使用ImplUnit,而ImplUnit是另一个单元,因此找不到方法在另一个单元中引用或包含一个单元 第一单元Delphi 7对象未定义,delphi,delphi-7,tadoquery,adoconnection,Delphi,Delphi 7,Tadoquery,Adoconnection,我有一个使用Delphi创建的web服务,我想用它连接到sql server,因此我在项目中添加了ADO连接和ADOQuery,并对它们进行了配置并准备好使用,只有一个小问题,我的项目中有两个单元,这些对象被添加到了单元1中,我正在使用ImplUnit,而ImplUnit是另一个单元,因此找不到方法在另一个单元中引用或包含一个单元 第一单元 { SOAP WebModule} unit Unit1; interface uses SysUtils, Classes, HTTPApp
{ SOAP WebModule}
unit Unit1;
interface
uses
SysUtils, Classes, HTTPApp, InvokeRegistry, WSDLIntf, TypInfo,
WebServExp, WSDLBind, XMLSchema, WSDLPub, SOAPPasInv, SOAPHTTPPasInv,
SOAPHTTPDisp, WebBrokerSOAP, DB, ADODB;
type
TWebModule1 = class(TWebModule)
HTTPSoapDispatcher1: THTTPSoapDispatcher;
HTTPSoapPascalInvoker1: THTTPSoapPascalInvoker;
WSDLHTMLPublish1: TWSDLHTMLPublish;
ADOConnection1: TADOConnection;
ADODataSet1: TADODataSet;
ADOQuery1: TADOQuery;
procedure WebModule1DefaultHandlerAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;
var
WebModule1: TWebModule1;
implementation
{$R *.dfm}
procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
WSDLHTMLPublish1.ServiceInfo(Sender, Request, Response, Handled);
end;
end.
我的单位
unit UTImplementacao;
interface
uses
InvokeRegistry,DB, ADODB;
type
IInterface = interface(IInvokable)
['{EFF30FFA-DA0C-433A-832A-0BA057B55103}']
function ReceiveUser(username : String; password : String) :
Boolean; stdcall;
end;
TImplementacao = class(TInvokableClass, IInterface)
public
function ReceiveUser(username : String; password : String) :
Boolean; stdcall;
end;
implementation
{ TImplementacao }
function TImplementacao.ReceiveUser(username, password: String): Boolean;
var
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
begin
try
ADOConnection1 := TADOConnection.Create(nil);
ADOConnection1.LoginPrompt := False;
ADOConnection1.ConnectionString:= 'Provider=SQLOLEDB.1;Integrated Security=SSPI;' +
'Persist Security Info=False;' +
'User ID=Diego;'+
'Catalog=OnlineShopping;' +
'Data Source=DIEGO-PC\SQLEXPRESS'+
';Use Procedure for Prepare=1;' +
'Auto Translate=True;Packet Size=4096;'+
'Workstation ID=DIEGO-PC;'+
'Use Encryption for Data=False;'+
'Tag with column collation when possible=False;';
ADOConnection1.Connected := True;
ADOQuery1.Connection := ADOConnection1;
ADOQuery1.SQL.Add('select username,upassword from Users '+
'where username = :usernamep and upassword = '+
':upasswordp');
ADOQuery1.Parameters.ParamByName('upasswordp').Value := password;
ADOQuery1.Parameters.ParamByName('usernamep').Value := username;
ADOQuery1.ExecSQL;
Result := True;
finally
ADOQuery1.Free;
if ADOConnection1.Connected then
ADOConnection1.Close;
ADOConnection1.Free;
end;
Result := False;
end;
initialization
InvRegistry.RegisterInvokableClass(TImplementacao);
InvRegistry.RegisterInterface(TypeInfo(IInterface));
end.
请忽略我添加到我的单位的ADOConnection和ADOQuery,我有点绝望地重复了代码。。。是的,我知道yachs
@银勇士
如果在UTImplementacao的使用中声明Unit1,我将有权访问以下组件:
type
ADOConnection1: TADOConnection;
ADODataSet1: TADODataSet;
ADOQuery1: TADOQuery;
或者我应该为var子句中的每个类型变量声明吗?如果您想从项目中的其他单元访问Unit1中声明的对象,则需要将Unit1添加到这些单元的interface uses部分(顶部的那个)
unit ImplUnit;
interface
uses
SysUtils, Classes, ... , Unit1;
...
这与Delphi自动添加Sysutils、类等其他单元的方式相同
此外,我强烈建议您将单元名称更改为更具意义的名称,以便在一段时间后查看代码时,您可以快速了解该单元包含的代码以及它的用途
编辑:根据您对问题的编辑,我怀疑您希望通过调用以下命令直接访问Unit1中的组件:
Unit1.AdoConnection1
那不行。为什么?因为组件是在TWebModule1
类的范围内声明的
因此,您需要像这样访问它们:
Unit1.WebModule1.AdoConnection1;
注意:如果将Unit1添加到UTImplementacao单元的“接口使用”部分,则您也可以直接调用:
WebModule1.AdoConnection1
您不必在每个命令前面加Unit1。我写这篇文章的目的是希望更容易理解你正在访问的是哪个单位。特别是对于其他可能正在阅读此线程而不知道程序结构的人。或者您没有发布您正在使用的实际代码,或者您需要更加关注您的屏幕。在这些文件中的第一个文件中,您的注释结尾错误。因此,在问题中,也在预览中,很容易看到这一点。DelphiIDE也以同样的方式使其易于查看。不管怎么说,即使除此之外,我也几乎不可能弄明白你想问什么。退后一步,看看你自己的问题,看看如果别人问了你是否能理解。如果没有,您可以修正问题,使其更易于理解。感谢您的及时回复,但为了简单起见,我想创建一个web服务,它将使用Delphi连接到sql server数据库。这不是您的真实代码,因为两个单元都命名为
unit1
,并且在同一项目中不能有两个同名单元。当您开始提供您遇到问题的实际代码,并且能够清楚地解释您遇到的问题时,请回答您的问题并这样做。在那之前,我投票将其作为离题题结束,因为您没有明确说明问题或包含相关代码。@KenWhite似乎OP犯了一个错误,在unit1中为两个单元发布了相同的代码。对不起。。。现在我已经复制了正确的代码谢谢你的回答,我这么做了,但是我仍然无法使用unit1中的对象。