![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Рисунок через сокет
Romm © (2007-04-15 11:30:00)******************************************************************************** **********************************
Я как-то говорил о этой проблеме, но решил повториться, т.к. мне никто не дал вразумительного ответа.
Подскажите пожалуйста как с сервера передать клиенту снимок рабочего стола, не сохраняя его на харде?
Спасиб
Сергей М. (2007-04-17 15:49:00) [21]Если исключение не схлопотал, значит можно)
А по идее ты должен был его схлопотать)
Romm (2007-04-17 15:48:00) [22]я думаю, что можно, но не очень-то уверен :)
Сергей М. (2007-04-17 15:46:00) [23]
> так вообще делать можно?
А сам-то как думаешь ?
Romm (2007-04-17 15:43:00) [24]Тьфу, а походу перегрелся:
я прогу тестирую на 1 компе. сервер и клиент на одной машине. Ясно, что если у меня форма на весь экран - она себя и отображает... вух, буду надеяться, что работает...
Romm (2007-04-17 15:40:00) [25]
> Сергей М. © (17.04.07 15:36) [44]
да не, все ок. ошибка пошла пить чай. Только на форме графика не отображается...
VidioForm.Canvas.Assign(Bitmap);
так вообще делать можно? :) или лучше TImage на всю форму растянуть?
Сергей М. (2007-04-17 15:36:00) [26]
> как же так?
Что"как же так" ?
Что тебя смущает в этой строчке ?
Romm (2007-04-17 15:34:00) [27]
> Сергей М. © (17.04.07 15:32) [41]
> Рамиль © (17.04.07 15:32) [40]
ок, я просто не понял с лету :)
Romm (2007-04-17 15:33:00) [28]
> Stream := TMemoryStream.Create;
как же так?
Сергей М. (2007-04-17 15:32:00) [29]
> это опять на Stream поменять тип?
Причем здесь тип ?
Сейчас эта переменная у тебя локальная, время ее жизни равно времени работы метода, в котором она объявлена. А тебе надо чтобы эта переменная была жива по кр.мере все то время, пока жив объект TMemoryStream, на который ссылается значение этой переменной. Для этого как раз и подходят статические переменные, потому что время их жизни равно времени работы приложения.
Рамиль (2007-04-17 15:32:00) [30]
> Romm © (17.04.07 15:27) [39]
Это дфмки от моего рабочего примера.
А так Сергей прав, скорее всего в разрушенный/несозданный Stream пытаешься писать.
Romm (2007-04-17 15:27:00) [31]
> статической
это опять на Stream поменять тип?
> А подумать?
просто я, извени, ничего полезного от туда не узнал :) А может просто плохо прочитал :)
Сергей М. (2007-04-17 15:23:00) [32]
> Stream.Write(Buf, RecivedSize); // компилятор тут останавливается!
Компилятор никогда не останавливается - он делает свою работу до конца)
А по сабжу - сделай переменную Stream статической.
Рамиль (2007-04-17 15:23:00) [33]А подумать?
Romm (2007-04-17 15:21:00) [34]
> Рамиль © (17.04.07 15:12) [34]
а это что такое? :)
Romm (2007-04-17 15:12:00) [35]
procedure TMainForm.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
Buf: array[0..8191] of byte;
RecivedSize: integer;
Size: int64;
AllSize: int64;
Stream: TMemoryStream;
Bitmap:TBitmap;
begin
if not Reciveing then
begin
TClientSocket(Sender).Socket.ReceiveBuf(Size, SizeOf(Size));
Reciveing := true;
Stream := TMemoryStream.Create;
AllSize := 0;
end
else
begin
RecivedSize := TClientSocket(sender).Socket.ReceiveBuf(Buf, SizeOf(Buf));
Stream.Write(Buf, RecivedSize);// компилятор тут останавливается!
inc(AllSize, RecivedSize);
if AllSize = Size then
begin
Reciveing := false;
Bitmap:=TBitmap.Create;
Stream.Position := 0;
Bitmap.LoadFromStream(Stream);
Stream.Free;
VidioForm.Canvas.Assign(Bitmap);
Bitmap.Free;
end;
end;
end;
Рамиль (2007-04-17 15:12:00) [36]object Form1: TForm1
Left = 582
Top = 308
Width = 276
Height = 125
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object ServerSocket: TServerSocket
Active = True
Port = 4050
ServerType = stNonBlocking
OnClientRead = ServerSocketClientRead
Left = 16
Top = 8
end
end
object Form2: TForm2
Left = 274
Top = 204
Width = 761
Height = 601
Caption = 'Form2'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Image: TImage
Left = 8
Top = 32
Width = 713
Height = 513
Stretch = True
end
object Button3: TButton
Left = 152
Top = 0
Width = 75
Height = 25
Caption = 'Recive'
TabOrder = 0
OnClick = Button3Click
end
object Button1: TButton
Left = 56
Top = 0
Width = 75
Height = 25
Caption = 'Connect'
TabOrder = 1
OnClick = Button1Click
end
object Button2: TButton
Left = 264
Top = 0
Width = 75
Height = 25
Caption = 'Disconnect'
TabOrder = 2
OnClick = Button2Click
end
object ClientSocket: TClientSocket
Active = False
ClientType = ctNonBlocking
Host = '127.0.0.1'
Port = 4050
OnRead = ClientSocketRead
Left = 16
Top = 8
end
end
Сергей М. (2007-04-17 15:04:00) [37]
> Romm © (17.04.07 15:02) [32]
см. меню Search -> Find Error ..
Romm (2007-04-17 15:02:00) [38]О, боже! Теперь клиент не работает :(( щас с ума сойду :)
Access violation at address 004798C3 in module 'Client.exe'. Read of address 7836663
Сергей М. (2007-04-17 14:59:00) [39]
> просто я с сокетом (и вобще с сетью) не работал и не знаю
> как он функционирует
А причем здесь сокеты ?
Если некий метод некоего объекта требует в кач-ве параметра некий объект-наследник класса TStream, то можно ли подсунуть этому методу некий объект, НЕ являющийся таковым ?
Подумай)
Steep (2007-04-17 14:56:00) [40]нет я подумал что можно, просто я с сокетом (и вобще с сетью) не работал и не знаю как он функционирует :(