Delphi 7 объект undefinedat

У меня есть веб-сервис, который я создал с помощью Delphi, и я хочу подключиться к нему на сервере sql, поэтому я добавил в проект соединение ADO, и ADOQuery настроил и готов к использованию, возникла лишь небольшая проблема, В моем проекте есть два модуля, и эти объекты были добавлены в Модуль 1, и я работаю с моим ImplUnit, который является другим модулем, и не может найти способ ссылки или включения одного модуля в другой модуль.

раздел 1

  { 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.

пожалуйста, не обращайте внимания на ADO Connection и ADOQuery, которые я добавил к своему устройству. Я получил немного отчаянного объявления, дублирующего код... Да, я знаю yachs!!!!

@SilverWarrior

Если я укажу Unit1 внутри использования UTImplementacao, я получу доступ к следующим компонентам:

type
    ADOConnection1: TADOConnection;
        ADODataSet1: TADODataSet;
        ADOQuery1: TADOQuery;

или я должен объявить для каждой переменной типов внутри предложения var?

1 ответ

Если вы хотите получить доступ к объектам, объявленным в Unit1, из других модулей в вашем проекте, вам нужно добавить Unit1 в раздел использования интерфейса (тот, что вверху) этих модулей.

unit ImplUnit;

interface

uses
  SysUtils, Classes, ... , Unit1;

...

Это так же, как Delphi автоматически добавляет другие модули, такие как Sysutils, Classes и т. Д.

Кроме того, я настоятельно рекомендую вам изменить название вашего модуля на более понятное, чтобы через некоторое время вы посмотрели на свой код и быстро узнали, какой код содержит этот блок и для чего он используется.

РЕДАКТИРОВАТЬ: На основании вашего редактирования вопроса, я подозреваю, что вы хотите получить доступ к компонентам из вашего Unit1 напрямую, позвонив:

Unit1.AdoConnection1

Это не сработает. Зачем? Поскольку компоненты объявлены в рамках TWebModule1 учебный класс.

Поэтому вам нужно получить к ним доступ следующим образом:

Unit1.WebModule1.AdoConnection1;

ПРИМЕЧАНИЕ: Если Unit1 добавлен в раздел использования интерфейса вашего UTImplementacao, вы также можете напрямую позвонить:

WebModule1.AdoConnection1

Вам не нужно ставить перед каждой командой префикс Unit1. Я написал это таким образом, чтобы, надеюсь, было более понятно, к каким подразделениям вы обращаетесь. Особенно для других людей, которые могут читать эту ветку и не знать структуру вашей программы.

Другие вопросы по тегам