Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 578

/ вопрос открыт /

Приветствую, уважаемые эксперты!
Как передать строки по сети? Пробую так, поле edit3 остается пустым (.

Приложение:
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3. MyStream: TMemoryStream;
  4. s: String[2];
  5. begin
  6. edit1.Text:=IDIPWatch1.LocalIP; // ëîêàëüíûé IP àäðåññ
  7. MyStream := TMemoryStream.Create; // Ñîçäàíèå êëàññà
  8. NMStrm1.Port := 6711; // Çíà÷åíèå ïîðòà ïîëó÷àòåëÿ
  9. NMStrm1.TimeOut := 3000; // Çàäåðæêà ïðè ïîäêëþ÷åíèè (TimeOut)
  10. NMStrm1.Host := edit1.Text; // IP-Àäðåññ ïîëó÷àòåëÿ
  11. NMStrm1.FromName := 'Êëèåíò';
  12. s:=edit2.text;
  13. MyStream.Write(s,3); // Èìÿ îòïðàâèòåëÿ
  14. NMStrm1.PostIt(MyStream); // Îòïðàâêà äàííûõ
  15. MyStream.Free; // Îñâîáîæäåíèå ïàìÿòè
  16. end;
  17.  
  18.  
  19. procedure TForm1.NMStrmServ1MSG(Sender: TComponent; const sFrom: String;
  20. strm: TStream);
  21. var
  22. MyStream: TMemoryStream;
  23. s: String[2];
  24. begin
  25. MyStream := TMemoryStream.Create;
  26. MyStream.Position:=0;
  27. MyStream.Read(s,3);
  28. edit3.Text:=s;
  29. end;


Казаков Николай Константинович Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Казаков Николай Константинович (статус: 1-ый класс)
Вопрос отправлен: 14 сентября 2010, 14:54
Состояние вопроса: открыт, ответов: 1.

Ответ #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

DNK (статус: Студент), 14 сентября 2010, 20:31 [#2]:

Цитата (Казаков Николай Константинович):

а записывать строку в поток нужно через WriteString? Что то не получается так
И я кажется догадываюсь почему... Только подтвердите мою догадку.
"Digital Networked Knight"

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:45
Выполнено за 0.02 сек.