Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > ADOStoredProc в функции


Автор: budg 4.5.2006, 17:06
Есть следующий код:

Код

...
implementation
 function GetPrjTrue(NOffID: String):String;

{$R *.dfm}


 function GetPrjTrue(NOffID: String):String;
 begin
 With ADOStoredProc1 do
    begin
    Parameters.ParamByName('@ID').Value:=StrToInt(NOffID);
    Parameters.ParamByName('@NumPrj').Value:= Null;
    Prepared;
    ExecProc;
    If Parameters.ParamByName('@NumPrj').Value= Null
    then
      Result:='Null'
    else
      Result:=IntToStr(Parameters.ParamByName('@NumPrj').Value);

    end;
 end;

  procedure TForm1.Button1Click(Sender: TObject);
    var
        found: string;

        begin
     found:=GetPrjTrue(Edit1.Text);
     if found = 'Null'
        then
        MessageDlg('В базе записи нет', mtError, [mbCancel], 0)
     else
     LZap.Caption:=found;
        end;


end.



Так вот, при запуске получаю сообщение об ошибке:

[Error] diff.pas(55): Undeclared identifier: 'ADOStoredProc1'

Ругается на ADOStoredProc1... smile

Если тот же вызов делать не в функции, а в процедуре (TForm1.Button1Click) - все работает нормально.
Возникает немой вопрос - разве компонента в функции не работает? Или ей нужно специфическое описание?

Хелп плиииз..

 

Автор: Vit 4.5.2006, 17:28
Конечно нет, компоНента - это же поле класса формы, откуда о нём знает функция? В классе формы (не переменной а типе формы!) описан компонент, а для функции это просто описание типа, а не переменной. Чтобы обратится к компоеннту из-вне надо указать переменную - экземпляр формы, а потом компонент.

Надо примерно так:

Код

function GetPrjTrue(NOffID: String):String;
 begin
 With Form1.ADOStoredProc1 do
    begin
    Parameters.ParamByName('@ID').Value:=StrToInt(NOffID);
    Parameters.ParamByName('@NumPrj').Value:= Null;
    Prepared;
 


Поясню подробнее. Ты описал форму:

Type TForm1 = class(Tform)
...

Ты описал её поля, методы  и т.п.:

Код

Type TForm1 = class(Tform)
  ADOCommand1:TADOCommand;
...


Теперь когда ты пишешь метод формы, типа такого:

Код

Procedure TForm1.MyProc;
begin
  ADOCommand1:=...


то это описание метода класса! а не экземпляра класса. Фокус в том что я могу класс TForm1 создать несколько раз, например сделать 10 одинаковых форм. Реально у тебя при этом будет 10 объектов ADOCommand1, которые будут относится к разным экземплярам форм. Метод TForm1.MyProc будет относится именно к тому экземпляру с которым ты его вызываешь, а вот для функции вовсе не очевидно с каким экземпляром компонента работать...  

PS. Вообще-то использование такой функции как ты привёл является дурным тоном, оно чревато многочисленными проблемами... Лучше эту функцию переделать в метод класса:


Код


Type TForm1= class(TForm)
...
Public
  function GetPrjTrue(NOffID: String):String;
...
End

function TForm1.GetPrjTrue(NOffID: String):String;
 begin
 With ADOStoredProc1 do
    begin
    Parameters.ParamByName('@ID').Value:=StrToInt(NOffID);
    Parameters.ParamByName('@NumPrj').Value:= Null;
    Prepared;




   

Автор: budg 5.5.2006, 08:55
Спасибо огромное! smile
Буду разбираться.  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)