Перейти к содержанию
Fire Monkey от А до Я
  • 0

Процедурный тип. Не могу присовить значение.


Aptem

Вопрос

Коллеги,

 

не могу справиться вот с такой задачей.

 

Есть модуль Search.pas. В нем объявлен процедурный тип:

type
      TSearchFunction = function ( criteria : Integer ) : IDictionary<String, Integer> of object;

Далее в этом же модуле есть класс формы и в нем есть переменная процедурного типа:

type
      TfmSearch = class(TForm)

            lbCriteria: TLabel;
            btOk: TButton;
..

      public
            LeftFunction : TSearchFunction;

В модуле SearchVSPHelper.pas есть класс и в нем функция:

function TSearchVSPHelper.GetItems ( criteria : Integer ) : IDictionary<String, Integer>;

      var
            items : IDictionary<String, Integer>;

begin

      items := TCollections.CreateDictionary<String, Integer>;

      Result := items;

end;

Есть третий модуль VSPList.pas. В нем при создании формы типа TfmSearch я пытаюсь присвоить ее переменной LeftFunction метод класса TSearchVSPHelper.GetItems:

..

 fmSearch.LeftFunction := searchHelper.GetItems;

..

Однако при попытке компиляции получаю ошибку на этой строке:

[dcc32 Error] VSPList.pas(261): E2035 Not enough actual parameters

Если функцию GetItems перенести в класс формы, то все компилируется.

 

В чем может быть проблема? Чего я не вижу?

 

Спасибо.

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
  • Администраторы

Добрый день,

 

Нужен полный код описания хелпер класса TSearchVSPHelper. Можно только декларацию класса и метода GetItems

Ссылка на комментарий
  • 0

Здравствуйте, Ярослав.

 

Проблему временно решил с помощью ссылок на функцию. То есть вместо процедурного типа использовал ссылку:

type
      TSearchFunction = reference to function ( criteria : Integer ) : IDictionary<String, Integer>;

...

LeftFunction : TSearchFunction;

А при вызове использовал анонимную функцию-обертку:

            fmSearch.LeftFunction := function ( criteria : Integer ) : IDictionary<String, Integer>
            begin
                  Result := searchHelper.GetItems ( criteria );
            end;

Решение конечно так себе, но работать позволяет.

 

 

Однако, все таки привожу код, о котором вы спрашивали.

 

 

Интерфейс класса TSearchVSPHelper:

/// <summary>
///   Helper for VSP-binded well search
/// </summary>
type
      TSearchVSPHelper = Class ( TInterfacedObject, ISearchHelper )

      private

            {$REGION 'Private fields'}

            /// <summary>
            ///   Data provider instance
            /// </summary>
            _provider : IDatabaseProvider;

            /// <summary>
            ///   Criteria list
            /// </summary>
            _criteriaList : IDictionary<String, Integer>;

            {$ENDREGION}

            {$REGION 'Methods'}

            /// <summary>
            ///   Gets expeditions list (by subject identifiers list)
            /// </summary>
            /// <param name="idList">Subject identifier list</param>
            /// <returns>Items</returns>
            function GetExpeditionList ( idList : IList<Integer> = nil ) : IDictionary<String, Integer>;

            /// <summary>
            ///   Gets subject list (by expedition identifiers list)
            /// </summary>
            /// <param name="idList">Expedition identifiers list</param>
            /// <returns>Items</returns>
            function GetSubjectList ( idList : IList<Integer> = nil ) : IDictionary<String, Integer>;

            /// <summary>
            ///   Gets wellbore list (by expedition and subject identifiers lists)
            /// </summary>
            /// <param name="expeditionIdList">Expedition identifiers list</param>
            /// <param name="subjectIdList">Subject identifiers list</param>
            /// <returns>Items</returns>
            function GetWellboreList ( expeditionIdList : IList<Integer> = nil; subjectIdList : IList<Integer> = nil ) : IDictionary<String, Integer>;

            {$ENDREGION}

      public

            {$REGION 'Methods'}

            /// <summary>
            ///   Gets criteria list
            /// </summary>
            /// <returns>Criteria list</returns>
            function GetCriteriaList () : IDictionary<String, Integer>;

            /// <summary>
            ///   Gets direction based on criteria
            /// </summary>
            /// <param name="criteria">Criteria</param>
            /// <returns>Direction</returns>
            function GetDirection ( criteria : Integer ) : Integer;

            /// <summary>
            ///   Gets items for particular search criteria
            /// </summary>
            /// <param name="criteria">Criteria</param>
            /// <returns>Items</returns>
            function GetItems ( criteria : Integer ) : IDictionary<String, Integer>; overload;

            /// <summary>
            ///   Gets items for particular search criteria and identifiers list
            /// </summary>
            /// <param name="criteria">Criteria</param>
            /// <param name="idList1">First identifiers list</param>
            /// <param name="idList2">Second identifiers list</param>
            /// <returns>Items</returns>
            function GetItems ( criteria : Integer; idList1 : IList<Integer>; idList2 : IList<Integer> ) : IDictionary<String, Integer>; overload;

            {$ENDREGION}

            {$REGION 'Constructors'}

            /// <summary>
            ///   Creates instance with particular session
            /// </summary>
            /// <param name="session">Connection session</param>
            constructor Create ( session : TOraSession );

            {$ENDREGION}

            {$REGION 'Properties'}

            /// <summary>
            ///   Gets wells list
            /// </summary>
            property CriteriaList : IDictionary<String, Integer> read GetCriteriaList;

            {$ENDREGION}

end;

Метод GetItems:

/// <summary>
///   Gets items for particular search criteria
/// </summary>
/// <param name="criteria">Criteria</param>
/// <returns>Items</returns>
function TSearchVSPHelper.GetItems ( criteria : Integer ) : IDictionary<String, Integer>;

      var
            items : IDictionary<String, Integer>;

begin

      items := TCollections.CreateDictionary<String, Integer>;

      case criteria of
            1 :
                  begin
                        items := GetExpeditionList ();
                  end;

            2 :
                  begin
                        items := GetSubjectList ();
                  end;

            3 :
                  begin
                        items := GetWellboreList ();
                  end;
      end;

      Result := items;

end;
Ссылка на комментарий
  • 0
  • Администраторы

В качестве догадки. Мне кажется, что компилятор не может решить, какую функцию вы присваиваете. У вас метод GetList перегружен. Попробуйте для проверки, переименовать один из методов в другое, чтобы не было перегрузки.

Ссылка на комментарий
  • 0

В качестве догадки. Мне кажется, что компилятор не может решить, какую функцию вы присваиваете. У вас метод GetList перегружен. Попробуйте для проверки, переименовать один из методов в другое, чтобы не было перегрузки.

 

Попробовал. Тоже самое.

Ссылка на комментарий
  • 0
  • Администраторы

Сдается мне, что у вас конфликт типов. И где-то вместо ожидаемого подставляется такой же тип из другого места. Проверил локально ваш пример. Оставил только одни заглушки. Код собрался на ура. Так что для полноты картины, нужен проект с минимумом кода, на котором это воспроизводится.

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...