Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > TidTCPClient не передает данные класса


Автор: Teran 6.12.2006, 23:44
есть классы
Код

type CMD_=class (TObject)
     public
       DATA_IN:String[30]; 
       DATA_OUT:String[30];
     private
     end;

     IP_=class (TObject)
     public
        IP_ADDRESS:string[20];
        Port:string[20];
        CMD_Array:Array[1..255] of ^CMD_;

        constructor Create;
        destructor Destroy; override;
     private
     end;
var MASS:array[1..255] of ^IP_;

заполняю данными
Код

var
  IP_1:IP_;
  CMD_1:CMD_;
begin
  IP_1:=IP_.Create;
  IP_1.IP_ADDRESS:='10.0.0.2';
  IP_1.Port:='47110';

  CMD_1:=CMD_REC.Create;
  CMD_1.DATA_IN:='Text1_IN';
  CMD_1.DATA_OUT:='Text1_OUT';
  
  new(IP_1.CMD_Array[1]);
  IP_1.CMD_Array[1]^ := CMD_1;

 new(MASS[1]);
 MASS[1]^:=IP_1;

пока все нормально, но когда начинаю отсылать то приходит пустой класс
Код

  IdTCPClient.Host:=IP_(MASS[1]^).IP_ADDRESS;
  IdTCPClient.Port:=StrToInt(IP_(MASS[1]^).port);
  IdTCPClient.Connect(2000);
  IdTCPClient.WriteBuffer(IP_(MASS[1]^), SizeOf (IP_(MASS[1]^)), true);

приемник:
Код

procedure TForm1.IdTCPServerExecute(AThread: TIdPeerThread);
var
  IP_1_Recv:IP_;
begin
 AThread.Connection.ReadBuffer (IP_1_Recv, SizeOf (IP_1_Recv));

когда просматриваю везде пусто
по чему не передается весь класс вместе со вложенным?
мне нужно именно классы а не просто record передавать

Автор: Snowy 7.12.2006, 00:00
1. Не понятно, зачем у тебя строки фиксированного размера? У тебя же класс, а не рекорд. Нафига?!
2. Зачем так намудрил с указателями? Это очень чревато ошибками. сам по себе идентификатор объекта - уже указатель. его размер - 4 байта, пока не вызовешь конструктор.
3. В твоём примере ты передаёшь объект? Гм. Ты передаёшь тот самый указатель в 4 байта smile И его же успешно принимаешь. А данные никуда и не посылаются.
4. Объект вообще нельзя передать, как блок данных, без его сериализации или передачи отдельных параметров.

Добавлено @ 00:06 
Вот http://snowy.delphist.com/materials.php?show=tpersistent
Почитай статью по сериализации.
WriteObj - сохранить объект в стрим. Потом этот стрим передаёшь на ту сторону.
Там этот стрим принимаешь, и десериализуешь через ReadObj.
В качестве стрима лучше использовать TMemoryStream.
Как передавать его - вопрос второй.
Смысл в том, что просто так объект в буфер не закинешь - нужно сериализовать и передавать сериализованные данные.

Автор: Teran 7.12.2006, 00:06
при передаче вот это SizeOf (IP_(MASS[1]^))  = 4
также и при приеме но результата никакого
может можно засунуть както это все в MemoryStream?

Автор: drkot 8.12.2006, 10:55
Цитата(Teran @  7.12.2006,  00:06 Найти цитируемый пост)
может можно засунуть както это все в MemoryStream?

writecomponent

Автор: Matematik 8.12.2006, 11:09
Цитата(drkot @  8.12.2006,  10:55 Найти цитируемый пост)
Цитата(Teran @  7.12.2006,  00:06 Найти цитируемый пост)
может можно засунуть както это все в MemoryStream?

writecomponent 


это и есть

Цитата(Snowy @  7.12.2006,  00:00 Найти цитируемый пост)
4. Объект вообще нельзя передать, как блок данных, без его сериализации или передачи отдельных параметров.


http://forum.vingrad.ru/topic-94245/view/all/index.html

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)