Ошибки при работе с Indy 10.0.52
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.82] |
|
|
ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Ошибки при работе с Indy 10.0.52
|
Сообщ.
#1
,
|
|
|
|
Использую Delphi 6.0 EE и Indy 10.0.52.
При создании обработчика OnUDPRead получаю ошибки, раньше такого небыло. procedure IdUDPServer1UDPRead(Sender: TObject; AData: TBytes; ABinding: TIdSocketHandle); ![]() ![]() [Error] Unit1.pas(25): Undeclared identifier: 'TBytes' [Error] Unit1.pas(26): Undeclared identifier: 'TIdSocketHandle' [Error] Unit1.pas(76): ')' expected but identifier 'Size' found [Error] Unit1.pas(77): Missing operator or semicolon [Error] Unit1.pas(77): ')' expected but identifier 'PeerIP' found [Error] Unit1.pas(77): 'END' expected but ')' found [Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas' Эти типы данных существуют, но непонятно почему Delphi их не принимает. У когонибуть было такое? и как лечить. Переустановку не предлагать - уже делал не помогло. |
|
Сообщ.
#2
,
|
|
|
|
Цитата [Error] Unit1.pas(25): Undeclared identifier: 'TBytes' [Error] Unit1.pas(26): Undeclared identifier: 'TIdSocketHandle' Видимо нужно в uses подключить модули SysUtils и IdSocketHandle. Остальные ошибки - чисто синтаксические. |
|
Сообщ.
#3
,
|
|
|
|
Цитата spleenJack @ Цитата [Error] Unit1.pas(25): Undeclared identifier: 'TBytes' [Error] Unit1.pas(26): Undeclared identifier: 'TIdSocketHandle' Видимо нужно в uses подключить модули SysUtils и IdSocketHandle. Остальные ошибки - чисто синтаксические. Уже пробовал, не помогает Добавлено Решил проблему так: В начале лечил явно прописав ![]() ![]() type TBytes = array[0..MaxSize] of Byte; Но это несовсем красиво и поэтому я просто добавил в uses ![]() ![]() uses IdGlobal, IdSocketHandle; и всё заработало вроде бы... |
|
Сообщ.
#4
,
|
|
|
|
Теперь ещё лучше, пишу:
![]() ![]() procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TBytes; ABinding: TIdSocketHandle); var StringFormatedStream: TStringStream; begin StringFormatedStream := TStringStream.Create(''); StringFormatedStream.CopyFrom(AData, AData.Size); Memo1.Lines.Add(ABinding.PeerIP+' '+StringFormatedStream.DataString); StringFormatedStream.Free; end; и получаю: ![]() ![]() [Error] Unit1.pas(78): Incompatible types: 'TStream' and 'TBytes' [Error] Unit1.pas(78): '(' expected but ')' found [Error] Unit1.pas(79): Missing operator or semicolon [Fatal Error] Server.dpr(5): Could not compile used unit 'Unit1.pas' А если так: ![]() ![]() procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TBytes; ABinding: TIdSocketHandle); var i: integer; Reply: string; begin // if OnAndOff = False then Exit else Reply := ''; for i:=0 to 512 do begin if AData[i] = 0 then break; Reply := Reply + char(AData[i]); end; Memo1.Lines.Add(Reply); end; то всё впорядке. |
|
Сообщ.
#5
,
|
|
|
|
User32 add to uses IdGlobal, IdSocketHandle
|
|
Сообщ.
#6
,
|
|
|
|
Ну да, так и должно быть... CopeFrom берет данные из TStream, не из TBytes.
|
|
Сообщ.
#7
,
|
|
|
|
Цитата P.O.D @ User32 add to uses IdGlobal, IdSocketHandle Уже давно добавил, но бестолку. -Added Цитата WildBear @ Ну да, так и должно быть... CopeFrom берет данные из TStream, не из TBytes. Да, вот только почемуто не работает ![]() P.S. может попробовать с указателями поизвращаться, хотя AData ничего не даст... |
|
Сообщ.
#8
,
|
|
|
|
я канешно извеняюсь что в мешиваюсь в вашу беседу, но мне показалось странным что это никто не заметил.
Цитата User32 @ StringFormatedStream.CopyFrom(AData, AData.Size); но функции CopyFrom нужен поток а AData тут масив байт тут лудше использовать Read(..) |