Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ADOStoredProc в функции, при реализации в виде функции не работае 
:(
    Опции темы
budg
  Дата 4.5.2006, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 21.12.2005

Репутация: нет
Всего: нет



Есть следующий код:

Код

...
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) - все работает нормально.
Возникает немой вопрос - разве компонента в функции не работает? Или ей нужно специфическое описание?

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

 
PM MAIL   Вверх
Vit
Дата 4.5.2006, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 14
Всего: 207



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

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

Код

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;




   


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
budg
Дата 5.5.2006, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 21.12.2005

Репутация: нет
Всего: нет



Спасибо огромное! smile
Буду разбираться.  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0628 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.