ошибка присваивания событий

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

ошибка присваивания событий

Сообщение Andrew » 15.01.2008 23:50:19

Здравствуйте!
Может кто поможет проблеме.
При попытке скомпилировать програму на FPC2.2 возникла ошибка
Wrong number of parameters specified for call to "OnServerExecute"


Использована библиотека indy9

Код: Выделить всё
type TServer=class
  private
  { Private declarations }
    idserver:TIdTCPServer;
    procedure ServerExecute(AThread:TIdPeerThread);
   
  public
    constructor Create; reintroduce;
    destructor Destroy; override;
  end;

constructor TServer.Create;
begin
idserver:=TIdTCPServer.create(nil);
idserver.OnExecute:=ServerExecute;
end;

прим:
раньше работал в delphi
Andrew
новенький
 
Сообщения: 14
Зарегистрирован: 15.01.2008 23:21:26

Сообщение Sergei I. Gorelkin » 16.01.2008 00:11:47

нужно добавить {$mode delphi}{$h+} в начале юнита или -Sdh в командной строке компилятора.
А вообще это уже давно должно быть в FAQe...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Andrew » 16.01.2008 06:09:46

Пробовал
выдаёт ошибку
Error: Incompatible types: got "OnServerExecute(TIdPeerThread)" expected "<procedure variable type of procedure(TIdPeerThread) of object;Register>"
Andrew
новенький
 
Сообщения: 14
Зарегистрирован: 15.01.2008 23:21:26

Сообщение Sergei I. Gorelkin » 16.01.2008 17:55:43

Такая ошибка характерна для режима {$mode objfpc}. В нем нужно перед идентификатором метода добавлять '@':
Код: Выделить всё
idserver.OnExecute := @ServerExecute;

что несовместимо с дельфевым кодом. Поэтому, чтобы обойтись без исправлений работающих исходников, проще всего включить режим {$mode delphi}.

Но еще надо смотреть, что там в indy понаписано. Потому что если OnExecute - не "просто событие", а что-то посложнее, может действительно начаться пляска с бубном. Наличие в сообщении об ошибке идентификатора "OnServerExecute" (которого нет в программе, если она приведена без искажений), косвенно об этом свидетельствует.
Под "просто событие" я понимаю такое:
Код: Выделить всё
type TSomeEvent = procedure(AThread: TIdPeerThread) of object;
...
TIdTCPServer = class(...)
  property OnExecute: TSomeEvent read FSomeEvent write FSomeEvent;
...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Andrew » 16.01.2008 23:40:19

Спасибо всё работает
Andrew
новенький
 
Сообщения: 14
Зарегистрирован: 15.01.2008 23:21:26


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 3

Рейтинг@Mail.ru