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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.08.2014, 17:40   #1
Loligan
Пользователь
 
Аватар для Loligan
 
Регистрация: 30.01.2012
Сообщений: 12
Восклицание

вот собственно сам код

Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdUDPServer, IdBaseComponent,
  IdComponent, IdUDPBase, IdUDPClient, Vcl.StdCtrls, IdGlobal, IdSocketHandle;

type
  TForm1 = class(TForm)
    IdUDPClient1: TIdUDPClient;
    IdUDPServer1: TIdUDPServer;
    Memo1: TMemo;
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
      const AData: TIdBytes; ABinding: TIdSocketHandle);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
IdUDPClient1.Send(Edit1.Text);
end;

procedure TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
  const AData: TIdBytes; ABinding: TIdSocketHandle);
var
StringFormatedStream: TStringStream;
s: String;
begin
//Инициализация
StringFormatedStream:= TStringStream.Create('');
//Копирование из простого потока в строковый
StringFormatedStream.CopyFrom(AData, AData.size);
//Вывод полученного сообщения
Memo1.Lines.Add(ABinding.PeerIP+' '+StringFormatedStream.DataString);
//Перенаправление сообщения дальше
ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, s [1] , Length(s));
//Освобождение строкового потока
StringFormatedStream.Free;
end;

end.
Ругается на эту строчку а именно на AData.size
Цитата:
[dcc32 Error] Unit1.pas(47): E2003 Undeclared identifier: 'StringFomatedStream'
Цитата:
StringFormatedStream.CopyFrom(AData , AData.size);

Последний раз редактировалось Stilet; 01.08.2014 в 18:39.
Loligan вне форума Ответить с цитированием
Старый 01.08.2014, 18:04   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

в коде одно название, а в вашей ошибке у переменной не хватает буквы.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 01.08.2014, 18:07   #3
Loligan
Пользователь
 
Аватар для Loligan
 
Регистрация: 30.01.2012
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
в коде одно название, а в вашей ошибке у переменной не хватает буквы.
в смысле? не понял

Вот все ошибки

Цитата:
[dcc32 Error] Unit1.pas(47): E2010 Incompatible types: 'TStream' and 'TIdBytes'
[dcc32 Error] Unit1.pas(47): E2029 '(' expected but ')' found
[dcc32 Error] Unit1.pas(49): E2066 Missing operator or semicolon
[dcc32 Error] Unit1.pas(51): E2250 There is no overloaded version of 'SendTo' that can be called with these arguments
[dcc32 Fatal Error] Project1.dpr(5): F2063 Could not compile used unit 'Unit1.pas'

Последний раз редактировалось Stilet; 01.08.2014 в 18:39.
Loligan вне форума Ответить с цитированием
Старый 01.08.2014, 18:42   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Incompatible types: 'TStream' and 'TIdBytes'
Код:
StringFormatedStream.WriteBuffer(AData[0],Length(AData));
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.08.2014, 18:47   #5
Loligan
Пользователь
 
Аватар для Loligan
 
Регистрация: 30.01.2012
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Код:
StringFormatedStream.WriteBuffer(AData[0],Length(AData));
Спасибо) Сработало. А почему так? ну что бы знать на будущее


И ещё. Дальше появилась ошибка в строке

Цитата:
ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, s [1] , Length(s));
[dcc32 Error] Unit1.pas(51): E2250 There is no overloaded version of 'SendTo' that can be called with these arguments
Loligan вне форума Ответить с цитированием
Старый 02.08.2014, 01:40   #6
kta87
Форумчанин
 
Аватар для kta87
 
Регистрация: 22.02.2010
Сообщений: 912
По умолчанию

Цитата:
Сообщение от Loligan Посмотреть сообщение
Спасибо) Сработало. А почему так? ну что бы знать на будущее
Что бы проще понималось: типы потоки, буферы у них есть параметр - размер (Size) Как бы аналог этого для массивов - длинна (Length)

Цитата:
Сообщение от Loligan Посмотреть сообщение
ошибка в строке
[dcc32 Error] Unit1.pas(51): E2250 There is no overloaded version of 'SendTo' that can be called with these arguments
Вы посмотрите на параметры, их типы и количество функции "SendTo":

function SendTo(s: TSocket; var Buf; len, flags: Integer; var addrto: TSockAddr; tolen: Integer): Integer; stdcall;
kta87 вне форума Ответить с цитированием
Старый 02.08.2014, 09:00   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
А почему так?
Ну так потому что AData этосамый найобычнейший массив байт, а не класс. В Хелпе Инди это написано.
Цитата:
kta87
А это не та функа
Автору другая нужна.
Цитата:
procedure SendTo(
const AIP: string;
const APort: Integer;
const ABuffer: TIdBytes;
const AIPVersion: TIdIPVersion = ID_DEFAULT_IP_VERSION
);
Скорее всего нужно это:
http://docwiki.embarcadero.com/CodeE...f_%28Delphi%29

Соответственно как-то так:
Код:
ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, BytesOf(s) , Length(s));
Или я вот так мучу:
Код:
var ...
   m:TMemoryStream; a:TIdBytes; cli:TIdUDPClient;  sz:Cardinal;
begin
 m:=TMemoryStream.Create;
 cli:=TIdUDPClient.Create;
...
  m.Position:=0;
  if length(a)<>m.Size then  SetLength(a,m.Size);  sz:=m.Size;
  m.ReadBuffer(a[0],m.Size);
  cli.SendBuffer(host,ClientPort,a);except end;
  m.Clear;
 cli.Free;
end;
Т.е. через стрим и SetLength() наполняю массив.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
deque::size() возвращает 0, при наличии содержимого Antej Общие вопросы C/C++ 6 30.09.2013 16:10
Проблема при копировании листов Shada Microsoft Office Excel 5 04.11.2012 15:24
Ошибка: String[1]: the Size property has an invalid size of 0. mrChester Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 1 18.01.2012 20:06
[SIZE="4"]Найти максимальное число y Delphi[/SIZE] Артем1904 Помощь студентам 5 16.12.2011 10:22
Резиновый font-size, Как сделать резионвый font-size в блоке? AlienNation HTML и CSS 0 26.09.2011 09:14