![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Протокол Udp [D6, WinXP]
Keksis © (2003-04-18 15:49:00)Пытаюсь переправить по протоколу UDP при помощи компонента NMUDP1 из fastnet изображение рабочего стола сохраненного в формате TBitmap, но видно эта картинка весит больше чем размер передаваемого пакета, как мне передать её в несколько этапов, подскажите плс, если можно примерчик.
MMF (2003-04-18 16:25:00) [1]На пример, только за качество кода просьба не пинать - пишу как могу.
type TScreenFrame=Record
ID: char;
Size: Integer;
index: byte;
ScreenTime: TDateTime;
Data: array [0..PacketSize-1] of byte;
end;
//отсылка экрана
try
MyStream:=TMemoryStream.Create();
MyJpeg.SaveToStream(MyStream);
MyJpeg.Free;
MyStream.Seek(0, soFromBeginning);
FrameCnt:=0; //счетчик индекса отсылаемой части экрана
ScrFrame.ScreenTime:=ScrTime;
while MyStream.Position<(MyStream.Size-PacketSize+1) do
begin
ScrFrame.ID:="%";
ScrFrame.index:=FrameCnt;
Inc(FrameCnt);
MyStream.ReadBuffer(ScrFrame.Data, PacketSize);
ScrFrame.Size:=PacketSize;
move(ScrFrame, SendBuf, SizeOf(ScrFrame));
NMUDP1.SendBuffer(SendBuf, SizeOf(ScrFrame));
end;
//отсылаем последний кусочек
if MyStream.Position<>MyStream.Size then
begin
ScrFrame.ID:="%";
ScrFrame.index:=FrameCnt+1;
SendSize:=MyStream.Size-MyStream.Position;
MyStream.ReadBuffer(ScrFrame.Data, SendSize);
ScrFrame.Size:=SendSize;
move(ScrFrame, SendBuf, SizeOf(ScrFrame));
NMUDP1.SendBuffer(SendBuf, SizeOf(ScrFrame));
end;
finally
MyStream.Free;
end;
procedure TForm1.GetFrame(FrameSize: integer);
var Frame: TscreenFrame;
FrameBuf: array [0..(sizeOf(TScreenFrame)-1)] of char;
fView: TfView;
pMemo: Pbyte;
i: integer;
begin
NMUDP1.ReadBuffer(FrameBuf, FrameSize);
move(FrameBuf, Frame, FrameSize);
//определим, это часть старого экрана или новый
if Frame.ScreenTime<>LastScrTime then
begin
LastScrTime:=Frame.ScreenTime;
if Scr.Size<>0 then
begin
//показываем ранее принятый экран
fView:=TfView.Create(Application);
fView.ShowStream(Scr);
fView.ShowModal;
fView.free;
scr.free;
Scr:=TMemoryStream.Create();
end;
end;
if Scr.Size<(frame.index+1)*PacketSize then
Scr.SetSize((frame.index+1)*PacketSize);
pMemo:=scr.memory;
inc(pMemo, frame.index*PacketSize);
for I:=0 To (PacketSize-1) do
begin
pMemo^:=frame.Data[i];
Inc(pMemo);
end;
end;
Digitman (2003-04-18 15:55:00) [2]http://www.delphimaster.ru/cgi-bin/forum.pl?look=1&id=1050575329&n=4
Snap (2003-04-18 15:52:00) [3]Просто сначала сохранить её где нибудь (можно в памяти) (в прочем в битмапе она и так сохранена, осталось только узнать где. ScanLine попробуй), логичски разбить на куски, и передать, а потом собрать. (На компе которому посылают)