String into Stream

Fir$t
Дата: 10.12.2007 09:47:09
Здравствуйте
Такой вопрос:
Есть стринговая строка Data
надо передать его другой процедуре в виде TStream
делаю

procedure TForm1.UDataReceived(Sender: TComponent; const Data: String;
  FromIP: String; Port: Integer);
var 
      st : TStream;
begin
st :=  TMemoryStream.Create;
// ??? Возми эту самую Data
st.Seek(0,soFromBeginning);

rp := TRequestPacket.Create('127.0.0.1', 1812, st);
end;

Помогите пожалуйста, как же мне забить строку в стрим?
Заранее спосибо всем откликнувшимся
Best Regards
Fir$t
Tosh
Дата: 10.12.2007 09:49:32
Ну видать в канаде нынче со спецами совсем плохо
почитай справочку про TStringStream
Fir$t
Дата: 10.12.2007 09:57:36
RE: Ну видать в канаде нынче со спецами совсем плохо
Ну не виноват я в том, что клиент хочет радиус сервер именно на делфи, a не на .NET


st := TStringStream.Create(Data);
делал я уже так
только смутило то , что в Watch показывает, что st пустой
по вашему это нормально?
Best Regards
Fir$t
Tosh
Дата: 10.12.2007 09:58:39
Он показывает не "пусто", а показывает, что это класс и методы надо разворачивать ...
Johnmen
Дата: 10.12.2007 10:14:59
Читать справку по методам стрима Read/Write.
nerv
Дата: 18.02.2013 13:02:55
Та же проблема.

Надо String сжать (zlib) в тот же String ну и разжать сжатый String в первоначальный String.
Взял готовые процедурки сжатия / расжатия:
procedure ComressStream( aSource, aTarget : TStream; compressionRate : TCompressionLevel );
 var comprStream : TCompressionStream;
begin
  // compression level : (clNone, clFastest, clDefault, clMax)
 comprStream := TCompressionStream.Create(compressionRate, aTarget);
 try
  comprStream.CopyFrom( aSource, aSource.Size );
  comprStream.CompressionRate;
 finally
  comprStream.Free;
 End;
End;


procedure DecompressStream(aSource, aTarget: TStream);
 var decompStream : TDecompressionStream;
  nRead : Integer;
  buffer : array[0..1023] of Char;
begin
  decompStream := TDecompressionStream.Create( aSource );
 try
  repeat
   nRead:=decompStream.Read( buffer, 1024 );
   aTarget.Write( buffer, nRead );
  Until nRead = 0;
 finally
  decompStream.Free;
 End;
End;


А вот мои безуспешные потуги. Выложил на форму Edit1, button1, label1,label2.
По нажатию на кнопку сжать строку текста из Edit1 в сжатую строку и отобразить в label1, а потом эту сжатую строку расжать и отобразить в label2. Пробовал по разному - заккоментарил, но так и не нашел где грабли:
procedure TMainForm.Button1Click(Sender: TObject);
var
 s1, s2, s3 : String;
 st1, st2, st3 : TStringStream;
 l, l2:integer;

begin

  s1 := Edit1.Text;
 st1 := TStringStream.Create(s1);
// l:=Length(s1);
// st1.Write(l,Sizeof(l));
// if l>0 then st1.WriteBuffer(s1[1],l);

 //  st1.WriteString(s1);
   st2 :=  TStringStream.Create(s2);
  ComressStream(st1, st2, clMax	);

//     st2.Read(l2,Sizeof(l2));
//   if l2>0 then
//   begin
//      SetLength(s2,L2);
//     st2.ReadBuffer(s2[1],L2);
//   end;

  Label1.Caption := st2.DataString;
  //st2.DataString;
     st3 :=  TStringStream.Create(s3);
  DecompressStream( st3, st2);
  Label2.Caption :=  st3.DataString;
end;

Просьба подсказать, как исправить код.
Arioch
Дата: 18.02.2013 14:48:54
nerv,

а кто тебе сказал, что бинарные данные вообще можно засовывать в GUI ?
и что после этого они не изменятся ?

начнём с того, что они с большой вероятностью обрежутся по первому попавшемуся нулю.

далее и в SBCS и тем более в юникоде есть несколько вариантов пробела.
Запишешь ты один пробел, а прочитать вполне можешь уже другой.

Использовтаь строки для хранения данных было рискованно езе в старых дельфи, а начиная с 2009 это просто безумие
nerv
Дата: 18.02.2013 14:50:07
я на Delphi 7 делаю
nerv
Дата: 18.02.2013 14:52:13
пробелов в строке не будет, юникода то же, используются буквы латинского алфавита и цифры от 0 до 9
Arioch
Дата: 18.02.2013 14:53:41
не важно. Хранить бинарные данные в строках - рискованно. А в GUI-шных компонентах - просто глупо.

Вместо метки храни их вы TMEmoryStream, TByteDynArray и других типах для хранения сырого буффера даных.