Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.06;
Скачать: CL | DM;

Вниз

Дозапись в PByte   Найти похожие ветки 

 
Leaner ©   (2004-05-22 10:42) [0]

Здравствуйте ! Подскажите, пожалуйста.
Есть PByte1:PByte; , указывающий на размер структуры,
и PByte2, указывающий на саму структуру.
Как бы их «слить» в один PByte ?
Спасибо.


 
jack128 ©   (2004-05-22 10:46) [1]

Что означает "слить"?


 
AlexG ©   (2004-05-22 10:50) [2]

Объяви структуру, в которой есть поле РАЗМЕР. При создании экземпляра инициализируй это поле размером структуры. Иначе, работая с памятью: выдели блок, достаточный для помещения и того и того, скопируй туда данные...


 
Leaner ©   (2004-05-22 11:20) [3]

Извините, плохо обьяснил.
Я последовательно получаю св-ва объекта.
//Это моя процедура
GetObjectProp(Handle:THandle;Prop:DWord;var pData:PByte;var szData:DWord);
//Если надо сохранять в файле, то пишу:
BlockWrite(Dist,szData,SizeOf(DWord));
BlockWrite(Dist,pData^,szData);
//Если в потоке, то
MStream.Write(szData,SizeOf(DWord));
MStream.Write(pData^,szData);:
Свойств много, и все их надо так сохранить.
Дело в том, что заранее не известно где надо сохранять.
Вот я и подумал, временно, записывать все в PByte или что-нибудь подобном.
Только не знаю как.


 
AlexG ©   (2004-05-22 11:26) [4]

Еслиизвестно сколько, создай блок памяти и копируй в него просто данные. А потом делай с этим блоком что нужно.


 
Leaner ©   (2004-05-22 11:33) [5]

Нет, не известно.
Одно свойство может, например, указывать на наличие
или отсутствие других, их кол-во, и т.д. и т.п.


 
AlexG ©   (2004-05-22 11:39) [6]

Можно и при не известном размере. Например, создай дин.массив байт, или целых (какой приятнее). Меняй размер по необходимости, а мотом копируй блоки памяти. Или в ручную все делай.


 
Leaner ©   (2004-05-22 14:35) [7]

Объясните пожалуйста, как надо правильно делать.
// Так все в порядке:
var
ArrByte:array of Byte;

function ArrayWrite(pData:PByte;szData:DWord):Boolean;
var
szArr:DWord;
begin
szArr:=Length(ArrByte);
SetLength(ArrByte,szArr+SizeOf(DWord)+szData);
CopyMemory(@ArrByte[szArr],@szData,SizeOf(DWord));
CopyMemory(@ArrByte[szArr+SizeOf(DWord)],pData,szData);
end;
// А так – ругается на несовместимые типы
function ArrayWrite1(var ArrByte:array of Byte;pData:PByte;szData:DWord):Boolean;
var
szArr:DWord;
begin
szArr:=Length(ArrByte);
SetLength(ArrByte,szArr+SizeOf(DWord)+szData);<<---Incompatible types
CopyMemory(@ArrByte[szArr],@szData,SizeOf(DWord));
CopyMemory(@ArrByte[szArr+SizeOf(DWord)],pData,szData);
end;


 
Anatoly Podgoretsky ©   (2004-05-22 14:41) [8]

ArrByte:array of Byte это открытый а не динамический массив, создай тип и его используй


 
Leaner ©   (2004-05-22 14:47) [9]

Всем большое спасибо !



Страницы: 1 вся ветка

Текущий архив: 2004.06.06;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.047 c
4-1082652337
37
2004-04-22 20:45
2004.06.06
ctrl+A


4-1082705450
lock95
2004-04-23 11:30
2004.06.06
Поиск компонентов на форме


4-1083068636
Dummy
2004-04-27 16:23
2004.06.06
И снова взаимодействие двух процессов


4-1083093803
Torin
2004-04-27 23:23
2004.06.06
вызов API


3-1084735551
SnowMen
2004-05-16 23:25
2004.06.06
function YearsBetween(const ANow, AThen: TDateTime): Integer;