Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Пересылка записи(тип record) через Сокет. [D6, WinXP]


alexd1 ©   (2003-06-04 20:48:00) 

Вот вобщем то и вопрос. Как это организовать и по красивее...?


alexdbases   (2003-06-05 10:42:00) [1]

>Digitman спаисбо оргомное =)


alexdbases   (2003-06-05 10:40:00) [2]

Все спасибо разоврался......все нормально.....
Я имена смешал......
вместо Buffer или какого нить другого имени выбрал Buf.....
Оказалось это уже зарезервированное имя....


Digitman   (2003-06-05 10:39:00) [3]

1. TUserInfo = packedrecord !!!!

2.

type

TMyForm = class(TForm)
...
ClientSocket1: TClientSocket;
...
private
ms: TMyMemoryStream;
procedure DoOnStreamDestroyed(Sender: TObject);
...
end;

TMyMemoryStream = class(TMemoryStream)
private
FOnDestroy: TNotifyEvent;
public
constructor Create(OnDestroy: TNotifyEvent);
destructor Destroy; override;
end;

...

implementation

var
UserInfo : TUserInfo;
...

{ TMyForm }

procedure TMyForm.DoOnStreamDestroyed(Sender: TObject);
begin
ms := nil;
end;

...

constructor TMyMemoryStream.Create(OnDestroy: TNotifyEvent);
begin
inherited;
FOnDestroy := OnDestroy;
end;

destructor TMyMemoryStream.Destroy;
begin
if Assigned(FOnDestroy) then
FOnDestroy(Self);
inherited;
end;

...

{ TMyForm }

procedure TMyForm.ClientSocket1Write(Sender: TObject; Socket: TCustomWinSocket);
begin
Socket.SendStream(ms);
end;

procedure TMyForm.Button1Click(Sender: TObject);
var
CurPos: Integer;
begin
if not Assigned(ms) then
ms := TMyMemoryStream.Create(DoOnStreamDestroyed);
try
with ms do
begin
CurPos := Position;
Position := Size;
Write(UserInfo, SizeOf(UserInfo));
Position := CurPos;
end;
ClientSocket1.Socket.SendStream(ms);
except
FreeAndNil(ms);
raise;
end;
end;


alexdbases   (2003-06-05 10:23:00) [4]

to Polevi Попробовал твою пересылку......вырубило и сервер и клиента ....не выводя ни каких ошибок.....просто слетели и всё =)


alexdbases   (2003-06-05 10:14:00) [5]

а нельза на прямую
type
PUserInfo=^TUserInfo

var
///buffer:Pointer;
ui:PUserInfo;
begin
GetMem(Buffer,sizeof(TUserInfo));
Socket.ReceiveBuf(ui^,sizeof(TUserInfo));
// ui:=PUserInfo(buffer);

нет я понимаю....пробовал уже .....нельзя ....вот причина не ясна...четко....


Polevi   (2003-06-05 10:06:00) [6]

type
PUserInfo=^TUserInfo

var
buffer:Pointer;
ui:PUserInfo;
begin
GetMem(Buffer,sizeof(TUserInfo));
Socket.ReceiveBuf(Buffer^,sizeof(TUserInfo));
ui:=PUserInfo(buffer);

отправка аналогично


alexdbases   (2003-06-05 09:54:00) [7]

я конечно понимаю что можно зарядит все это в буфер а на клиенте принять ......но как это по красивее.....=)..


AlexDBases   (2003-06-05 09:44:00) [8]

type
UserInfo = record
ID: integer;
UserName: string[20];
FN: string[40];
LN: string[40];
MN: string[40];
Email: string[20];
Prof: string[20];
end;


Digitman   (2003-06-05 09:35:00) [9]


> AlexDBases


приведи точную декларацию структуры


AlexDBases   (2003-06-05 09:31:00) [10]

2digitman режим не блок.......запись занимает 240 байт.....есть интежер остальные стринг фиус длинны ...


Digitman   (2003-06-05 08:26:00) [11]

зависит от типа полей записи и от режима работы гнезда (блок., неблок.)


Наверх

Титульная страница Поиск, карта сайта Написать письмо