| 
| 
 | Вопрос # 4 578/ вопрос открыт / | 
 |  Приветствую, уважаемые эксперты!Как передать строки по сети? Пробую так, поле edit3 остается пустым (.
 Приложение:Переключить в обычный режим procedure TForm1.Button1Click(Sender: TObject);var  MyStream: TMemoryStream;  s: String[2];begin  edit1.Text:=IDIPWatch1.LocalIP;    //
ëîêàëüíûé IP
àäðåññ  MyStream := TMemoryStream.Create; //
Ñîçäàíèå
êëàññà  NMStrm1.Port := 6711; //
Çíà÷åíèå
ïîðòà
ïîëó÷àòåëÿ  NMStrm1.TimeOut := 3000;  //
Çàäåðæêà
ïðè
ïîäêëþ÷åíèè
(TimeOut)  NMStrm1.Host := edit1.Text; // IP-Àäðåññ
ïîëó÷àòåëÿ  NMStrm1.FromName := 'Êëèåíò';  s:=edit2.text;  MyStream.Write(s,3); // Èìÿ
îòïðàâèòåëÿ  NMStrm1.PostIt(MyStream);                          //
Îòïðàâêà
äàííûõ  MyStream.Free;                                            //
Îñâîáîæäåíèå
ïàìÿòèend;  procedure TForm1.NMStrmServ1MSG(Sender: TComponent; const sFrom: String;  strm: TStream);var  MyStream: TMemoryStream;  s: String[2];begin  MyStream := TMemoryStream.Create;  MyStream.Position:=0;  MyStream.Read(s,3);  edit3.Text:=s; end;
Ответ #1. Отвечает эксперт: DNK Здравствуйте, Казаков Николай Константинович!Во-первых: Вы создали пустой поток памяти и пытаетесь из него что-то прочитать.
 Отсюда второй момент: Если бы вы проверили, что вернула функция Read, то там наверняка было бы 0.
 В третьих: плохой тон работать методами Read и Write со строками. Для этого в качестве буфера чтения записи лучше использовать TStringStream.
 
 
 buf := TStringStream.Create('');
try
  MyStream.Position := 0;
  if buf.CopyFrom(MyStream, 3) = 3 then  // Проверяем всё ли прочиталось
    edit3.Text:=buf.DataString
  else
    MessageDlg('Ошибка чтения', mtError, [mbOk], 0);
finally
  buf.Free;
end;
|  | Ответ отправил: DNK (статус: Студент)Время отправки: 14 сентября 2010, 15:20
 
 |  
 Мини-форум вопросаВсего сообщений: 2; последнее сообщение — 14 сентября 2010, 20:31; участников в обсуждении: 2. 
|   | Казаков Николай Константинович (статус: 1-ый класс), 14 сентября 2010, 16:02 [#1]:а записывать строку в поток нужно через WriteString? Что то не получается так, когда записываю строку с использованием MyStream.Write(s,3); вроде получается. Но тогда не логично как-то записваем TMemoryStream, а считываем TStringStream почему?
 |  14 сентября 2010, 17:37: Вопрос перемещён из тематического раздела Delphi » Алгоритмы, преобразования в раздел Delphi » Работа с сетями и протоколами модератором Ерёмин А.А. 
|   | DNK (статус: Студент), 14 сентября 2010, 20:31 [#2]: Цитата (Казаков Николай Константинович): а записывать строку в поток нужно через WriteString? Что то не получается такИ я кажется догадываюсь почему... Только подтвердите мою догадку. "Digital Networked Knight" |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |