![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сохранение 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]критерий оптимальности какой?