Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сохранение TStrings в PByte


Alex_Korn ©   (2006-02-05 18:16:00) 

Подскажите, пожалуйста, как оптимальнее сохранить TStrings в PByte вместе с Objects ?


pargo   (2006-02-06 16:19:00) [1]

Спасибо


ZeroDivide   (2006-02-06 14:30:00) [2]

Даже проще My := PByte(MyStrings.Text);


ZeroDivide   (2006-02-06 14:27:00) [3]

Ну тогда...

var
My: PByte;
begin
...........
My := PByte(PAnsiChar(MyStrings.Text));


pargo   (2006-02-06 13:57:00) [4]

Меня попросили в экспортируемых из DLL функциях использовать PByte...


ZeroDivide   (2006-02-06 12:58:00) [5]

... точнее, PAnsiChar???

var
 My: PAnsiChar;
begin
 My := PAnsiChar(MyStrings.Text);

?????????


ZeroDivide   (2006-02-06 12:53:00) [6]

А почему PByte, а не PChar ?


Alex_Korn   (2006-02-06 12:26:00) [7]

Desdechado ©   (06.02.06 10:57) [7]
Просто хотелось "покрасивие".


Desdechado   (2006-02-06 10:57:00) [8]

и в чем здесь неоптимальность?

PS я бы перекрыл метод SaveToStream у TStringList, аналогично LoadFromStream


Alex_Korn   (2006-02-05 20:11:00) [9]

Извините ! Не ту процедуру скопировал.
procedure StringListToPByte(List:TStringList; var pData:PByte; var cbData:DWord);
var
i:integer;
cbBuf:DWord;
Strm:TMemoryStream;
begin
Strm:=TMemoryStream.Create;
try
 List.SaveToStream(Strm);
 Strm.Position:=Strm.Size;
 for i:=0 to List.Count-1 do
  begin
   cbBuf:=DWord(List.Objects[i]);
   Strm.Write(cbBuf,SizeOf(DWord));
  end;
 cbData:=Strm.Size;
 ReallocMem(pData,cbData);
 CopyMemory(pData,Strm.Memory,cbData);
finally
 Strm.Free;
end;
end;


Alex_Korn   (2006-02-05 20:09:00) [10]

procedure PByteToStringList(pData:PByte; cbData:DWord; var List:TStringList);
var
i:integer;
cbBuf:DWord;
Strm:TMemoryStream;
begin
Strm:=TMemoryStream.Create;
try
 Strm.Size:=cbData;
 CopyMemory(Strm.Memory,pData,cbData);
 List.Clear;
 List.LoadFromStream(Strm);
 Strm.Position:=Strm.Size-List.Count*SizeOf(DWord);
 for i:=0 to List.Count-1 do
  begin
   Strm.Read(cbBuf,SizeOf(DWord));
   List.Objects[i]:=Pointer(cbBuf);
  end;
finally
 Strm.Free;
end;
end;


Alex_Korn   (2006-02-05 20:07:00) [11]

Я делаю так:
procedure PByteToStringList(pData:PByte; cbData:DWord; var List:TStringList);
var
i:integer;
cbBuf:DWord;
Strm:TMemoryStream;
begin
Strm:=TMemoryStream.Create;
try
 Strm.Size:=cbData;
 CopyMemory(Strm.Memory,pData,cbData);
 List.Clear;
 List.LoadFromStream(Strm);
 Strm.Position:=Strm.Size-List.Count*SizeOf(DWord);
 for i:=0 to List.Count-1 do
  begin
   Strm.Read(cbBuf,SizeOf(DWord));
   List.Objects[i]:=Pointer(cbBuf);
  end;
finally
 Strm.Free;
end;
end;


Desdechado   (2006-02-05 19:11:00) [12]

PByte = ^Byte;

и как ты в указатель на байт хочешь сохранить все это?


Alex_Korn   (2006-02-05 18:52:00) [13]

Наиболее просто, а не перебирать построчно и записывать.


Desdechado   (2006-02-05 18:37:00) [14]

критерий оптимальности какой?


Наверх

Титульная страница Поиск, карта сайта Написать письмо