Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Передача TListItems через SendBuf()


Автор: TP@MB@Y 8.7.2005, 01:18
На сервере находится ListView. Мне надо послать все его итемы клиенту. Можно конечно же это сделать через строки, но наверника можно легче. Вот что я делаю:

Код

type  event = record
           ...
           list:TListItems;
         end;


Сервер посылает клиентам:
Код

var send:event
 ...
  send.list.Clear;
 for i:=0 to ListView.Items.Count-1 do
  begin
   aItem:=send.list.Add;                                            //aItem:TListItem
   aItem.Assign(ListView.Items.Item[i]);
  end;
 for i:=0 to ssServer.Socket.ActiveConnections - 1 do
  ssServer.Socket.Connections[i].SendBuf(send,sizeof(send));


Клиент получает:
Код

socket.ReceiveBuf(ev,socket.ReceiveLength);  //ev:event
...
ListView.Clear;
 for i:=0 to ev.list.Count-1 do
  begin
    aItem:=ListView.Items.Add;           //aItem:TListItem
    aItem.Assign(ev.list.Item[i]);
  end;


ВЫдается ошибка (при получении) access violation

Автор: p0s0l 8.7.2005, 19:03
Ты засовываешь в список указатели на итемы (но не сами данные итемов), и потом пытаешься передать не сам список, а лишь указатель на список...
Нужно вручную сохранять и восстанавливать свойства TListItem'ов и их передавать...


Автор: TP@MB@Y 8.7.2005, 19:23
p0s0l
Всмысле вручную? Например, сделать n-мерный массив строк, заполнить его и отправить?

Автор: _hunter 8.7.2005, 19:31
да. прчем массив не стрингов, а массив массивов символов

Автор: TP@MB@Y 8.7.2005, 19:41
_hunter
Зачем массив массивов? Я думаю делать двумерный массив стрингов.

Автор: _hunter 8.7.2005, 19:57
для экономии smile
если одна строка -- 10 символов, а другая -- 100 в первом случае потратиш 110 байт, во втором 200.
но если памяти не жалко ( а ее щас почти никому не жалко ) можно и простой прямоугольник юзать

Автор: TP@MB@Y 8.7.2005, 20:10
_hunter
Теперь понял smile
Ну памяти то не жалко это соамо сабой smile Но вот это же по сети будет прогоняться, так что замечание существенное. Ну ввиду специфики использования такой структуры в моей проге, можно все стринги сократить символов до 15, так что думаю оставить масив строк.

PS Сделал через двумерный массив строк. Все работает smile

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