Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.10.2009, 18:03   #1
AndreyCo
 
Регистрация: 27.10.2009
Сообщений: 5
Печаль Приведение процедурных типов в перегруженных методах

Если кто-то сталкивался с подобной проблемой - подскажите пожалуйста.

Есть процедурный тип:
Код:
public TermConnStateEventHandler = procedure Invoke(e: TermConnStateEventArgs);
Есть объект с перегруженными методами:
Код:
public Toolkit = class
    // Methods
...
    public function CreateGUIEventHandler(clientEventHandler: TermConnStateEventHandler; guiForm: Form): TermConnStateEventHandler; 
    public function CreateGUIEventHandler(clientEventHandler: TerminalPropertyEventHandler; guiForm: Form): TerminalPropertyEventHandler; 
    public function CreateGUIEventHandler(clientEventHandler: TerminalStateEventHandler; guiForm: Form): TerminalStateEventHandler; 
    public function CreateGUIEventHandler(clientEventHandler: UserPropertyEventHandler; guiForm: Form): UserPropertyEventHandler; 
    public function CreateGUIEventHandler(clientEventHandler: UserStateEventHandler; guiForm: Form): UserStateEventHandler;
(На синтаксис не обращайте внимание - вырезал из Reflrctor-а)

Так вот, когда я создаю переменную OnChangeStateTerminal типа TermConnStateEventHandler, создаю экземпляр объекта Toolkit и пытаюсь вызвать метод CreateGUIEventHandler чтобы подключить свой обработчик события,:

Код:
MyEvent:=MyToolkit.CreateGUIEventHandler(TermConnStateEventHandler(OnChangeStateTerminal),self);
то компилятор выдает ошибку Invalid Typecast.
Подскажите в чем здесь может быть дело? Ведь по идее вызлв делаю правильно.

Последний раз редактировалось AndreyCo; 28.10.2009 в 09:42.
AndreyCo вне форума Ответить с цитированием
Старый 27.10.2009, 19:07   #2
r9m
₪₪₪₪₪₪₪₪
Форумчанин
 
Аватар для r9m
 
Регистрация: 16.04.2007
Сообщений: 471
По умолчанию

Если я правильно понял, то бегин:
событие не может быть методом класса. Следовательно, вот так:

MyEvent:=CreateGUIEventHandler(Term ConnStateEventHandler(OnC hangeStateTerminal),self);

без параметров. И вроде б, эвенты - это процедуры а не функции...
r9m вне форума Ответить с цитированием
Старый 28.10.2009, 09:25   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
TermConnStateEventHandler(OnChangeS tateTerminal)
Зачем тип то приводить?
Зачем вообще нужна эта перегруженная функция? это обработчик?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.10.2009, 09:32   #4
AndreyCo
 
Регистрация: 27.10.2009
Сообщений: 5
По умолчанию

"Если я правильно понял, то бегин:
событие не может быть методом класса. Следовательно, вот так:"

Событие методом класса быть не может, но подключать метод в качестве обработчика события очень даже возможно. Что в данном примере и делается. Я создаю свой обработчик события и подключаю его с помощью специальных методов объекта. А поскольку я вызываю именно метод объекта, то вызов
Код:
MyEvent:=CreateGUIEventHandler(TermConnStateEventHandler(OnChangeStateTerminal),self)
вообще бессмысленый.

"без параметров. "
А я разве где-то параметры указал?

"И вроде б, эвенты - это процедуры а не функции..."
OnChangeStateTerminal - это процедура чисьлй воды процедура. А CreateGUIEventHandler должно подключать мою процедуру обработки события к конкретному событию.

На будущее:
Вообще вопрос был о приведении процедурных типов в перегруженных методах. Попрошу анализ приведенного мною кода на корректность не делать - все приведенные примеры вырезаны из Reflrctor-а и взяты из уже работающего приложения. Там все правильно. Но вот как реализовать все это в исходном коде, я не знаю...

Цитата:
Сообщение от Stilet Посмотреть сообщение
Зачем тип то приводить?
Зачем вообще нужна эта перегруженная функция? это обработчик?
Без приведения типа компилятор выдает сообщение об ошибке, что данный перегруженый метод не может быть вызван с таким аргументом. Ну не нравится ему мой обработчик. Хотя он объявлен правильно - количество и и тип аргументов совпадает с тем, что необходимо этому методу.
Ну по поводу того, зачем нужна перегруженнная функция, это вопросы не ко мне, а к разработчикам той сборки, которую я вынужден использовать. Наверное потому, что событий объект может генерировать много и разных и они хотели, чтобы я мог их обработать? Может так...

Да, это обработчик. (См. выше)

Последний раз редактировалось Stilet; 28.10.2009 в 10:37.
AndreyCo вне форума Ответить с цитированием
Старый 28.10.2009, 10:48   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Значит скажу так:
1. Я не понял на каком языке, посему пишу на делфи пример
2. Ты если это делфи совершенно неверно перегрузил функции
Вот посмотри:
Код:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;
type
 TermConnStateEventHandler = procedure (e:integer);
 TermConnStateEventHandler2 = procedure (s:string;k:byte);

Toolkit = class
  public
    function CreateGUIEventHandler(clientEventHandler: TermConnStateEventHandler): TermConnStateEventHandler; overload;
    function CreateGUIEventHandler(clientEventHandler: TermConnStateEventHandler2): TermConnStateEventHandler2;overload;
end;

{ Toolkit }

function Toolkit.CreateGUIEventHandler(
  clientEventHandler: TermConnStateEventHandler): TermConnStateEventHandler;
begin
  clientEventHandler(56);
end;

function Toolkit.CreateGUIEventHandler(
  clientEventHandler: TermConnStateEventHandler2): TermConnStateEventHandler2;
begin
   clientEventHandler('ww',5);
end;

var a:Toolkit; aga:TermConnStateEventHandler; ugu:TermConnStateEventHandler2;

procedure q(e:integer); begin writeln(e);end;
procedure w(s:string;k:byte);begin writeln(s,' ',k); end;

begin
 aga:=q;ugu:=w;
 a:=Toolkit.Create;
  aga:=a.CreateGUIEventHandler(aga);
  ugu:=a.CreateGUIEventHandler(ugu);
 a.Free;
 readln;
  { TODO -oUser -cConsole Main : Insert code here }
end.
Смысл понял?

И не нужно тут никаких приведений типов.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.10.2009, 17:57   #6
AndreyCo
 
Регистрация: 27.10.2009
Сообщений: 5
По умолчанию

Это Делфи, только 2006.
Класс Toolkit - это не мой класс. Точнее, не я его описываю. Я беру его описание из сторонней библиотеки. Потому твой пример немного не подходит.
Есть готовое описание класса Toolkit со всеми этими перегруженными методами. И там же есть описание TermConnStateEventHandler.
А вот использовать этот класс, создавать экземпляр этого класса и подключать к событию этого класса свой обработчик мне надо уже в моем приложении.

Может из-за того, что я пытаюсь все это сделать в 2006-ом и результаты разные? То, что работает у тебя, у меня отказывается напрочь. Вот такой подход как у тебя - без никаких приведений типов приводит вообще к убойной ошибке - Сборка [имя приложения.exe] не найдена. Я в ауте!

Может из-за того, что я пытаюсь все это сделать в 2006-ом и результаты разные? То, что работает у тебя, у меня отказывается напрочь. Вот такой подход как у тебя - без никаких приведений типов приводит вообще к убойной оштбке - Сборка [имя приложения.exe] не найдена. Я в ауте!

Последний раз редактировалось Stilet; 03.11.2009 в 11:47.
AndreyCo вне форума Ответить с цитированием
Старый 02.11.2009, 14:15   #7
AndreyCo
 
Регистрация: 27.10.2009
Сообщений: 5
По умолчанию

Решение проблемы найдено, тему можно закрыть. Спасибо всем, кто откликнулся.
AndreyCo вне форума Ответить с цитированием
Старый 03.11.2009, 11:48   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Решение проблемы найдено
Ну так а в чем затык то был?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.11.2009, 19:20   #9
AndreyCo
 
Регистрация: 27.10.2009
Сообщений: 5
По умолчанию

Затык был в собственной невнимательности. Проблема была с типом не первого, а второго параметра. Form и TForm разные типы. Но пока досмотрел - нервов себе попортил....
AndreyCo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Приведение к типу __Demon__ Общие вопросы C/C++ 1 27.09.2009 17:40
работа с классами, но трабл в функциях-методах aka_faith Общие вопросы C/C++ 9 14.06.2009 22:26
Си. Преобразование типов pif Помощь студентам 3 20.04.2009 13:54
Приведение задачи к каноническому виду feniks65 Паскаль, Turbo Pascal, PascalABC.NET 2 26.12.2008 22:53
не соответствие типов amandra SQL, базы данных 6 30.06.2008 18:04