Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.23;
Скачать: CL | DM;

Вниз

Подскажите как передать Record через SendBuf   Найти похожие ветки 

 
axx ©   (2003-11-21 08:49) [0]

Сабж. или ссылочку киньте.

type
PRect=^TRect;
TRect=record
CodeID:Byte;
Value:PChar;
end;

Procedure .....
var
f:TRect;
begin
F.CodeID:=1;
F.Value:="Hi";
Socket.SendBuf(F,SizeOf(F));
end;

По этому примеру можно понять что мне требуется. Знаю что не работает так. Подскажите как надо делать .... :)))
Заранее спасибо.


 
Reindeer Moss Eater ©   (2003-11-21 08:52) [1]

Вот так и надо дклать.


 
axx ©   (2003-11-21 08:54) [2]

не передает. SizeOf(f) возвращает всегда одно и тоже значение не зависимо от заполнения рекорда. Я так понял f это указатель.


 
Reindeer Moss Eater ©   (2003-11-21 08:58) [3]

SizeOf(f) возвращает всегда одно и тоже значение не зависимо от заполнения рекорда потому что размер этого рекорда всегда постоянен.

TRect=record
CodeID:Byte;
Value:PChar;
end;

Первое поле - один байт Второе поле - 4 байта
Плюс выравнивание комплилятора.


 
axx ©   (2003-11-21 09:11) [4]

Но почему же не работает

TRect=record
CodeID:Byte;
Value:PChar;
end;

//Server
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
MyRect: TRect;
Begin
MyRect.CodName:=233;
MyRect.Value:="Hi";
Socket.SendBuf(MyRect,Sizeof(MyRect));
end;
//Client
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
MyRect: TRect;
begin
Socket.ReceiveBuf(MyRect,Socket.ReceiveLength);
ShowMessage(MyRect.Value) возвращает " "
end;


 
Digitman ©   (2003-11-21 09:18) [5]


> Но почему же не работает


почему-почему)

тебе ж сказали уже - в поле Value ты передаешь 4-байтный указатель на данные, а не сами данные

а этот указатель имеет смысл лишь в ВАП процесса-передатчика ... в ВАП же процесса приемника тот же (принятый) указатель не имеет смысла, и попытка получить данные (которых не существует, ибо никто их не передавал) по этому указателю ведет в конечном итоге в AV


 
Reindeer Moss Eater ©   (2003-11-21 09:18) [6]

procedure SendMyRec(f:TMyRect);
var p:Pointer; pB:PByte; pLen : ^Cardinal;
begin
GetMem(p,SizeOf(Byte)+SizeOf(Cardinal)+StrLen(f.Value));
pb:=p;
pb^:=f.CodeID;
Inc(pb);
pLen := Pointer(pb);
pLen^:=StrLen(f.Value);
Inc(PLen);
StrCopy(PChar(PLen),f.Value);
Socket.SendBuff(p^,SizeOf(Byte)+SizeOf(Cardinal)+StrLen(f.Value));
end;


 
Reindeer Moss Eater ©   (2003-11-21 09:22) [7]

На приемном конце:
1. Считать 1 байт (это будет f.id)
2. Считать 4 байта (это длина строки)
3. Считать количество байтов равное длине строки (это будет f.Value)


 
Е-Моё имя ©   (2003-11-21 09:22) [8]


>> GetMem(p,SizeOf(Byte)+


>> Inc(pb);

тогда уж
Inc(pb,SizeOf(Byte));
:))

---
nil


 
Reindeer Moss Eater ©   (2003-11-21 09:26) [9]

Нет.
Тогда по инерции кто-то напишет:
Inc(PLen,SizeOf(Cardinal));


 
Reindeer Moss Eater ©   (2003-11-21 09:27) [10]

Типизированный указатель и его инкремент на единицу.
Это логично и стройно.


 
Е-Моё имя ©   (2003-11-21 09:28) [11]


>> Типизированный указатель

согласен, не заметил

---
nil


 
Reindeer Moss Eater ©   (2003-11-21 09:49) [12]

Кстати, axx, а зачем такое экзотическое имя у твоего пользовательского типа?


 
axx ©   (2003-11-21 09:55) [13]

Спасибо. Разобрался. Все заработало. А насчет имени - незнаю, так получилось.



Страницы: 1 вся ветка

Текущий архив: 2004.01.23;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.016 c
6-72866
Shutov
2003-11-10 08:11
2004.01.23
Загрузка bmp-картинок с помощью IdHTTP


1-72804
frost
2004-01-12 22:16
2004.01.23
Рисование ScrollBar у TreeView


14-72920
MYSTERYO
2004-01-01 13:14
2004.01.23
Вот, как всегда! Опохмел-пати плавно перетекает в новую пьянку


14-72922
Minin
2003-12-29 23:21
2004.01.23
Как должен называться процесс


14-72894
Teren
2004-01-02 23:15
2004.01.23
Metallica. Любимая песня?