Текущий архив: 2003.07.07;
Скачать: CL | DM;
Вниз
Как присваивать PChar у нетипизированные значения? Найти похожие ветки
← →
Aleksandr (2003-06-25 12:52) [0]Мне пришлось сделать что-то вроде надстройки над TFileStream - TSectionFile. То есть файл, данные из которого извлекаются по обращению к названии секции. Структура простая - сначала в файле лежит список объектов (название секции, время последней записи в нее, офсет на данные этой секции), а затем уже непосредственно данные. А сейчас понадобилось, чтобы сами элементы списка объектов содержали в себе данные, относящиеся к текущей секции. Вроде все просто:
добавил поле Data : PChar, при загрузке файла соответственно:
FFile.Seek(FSections.Sections[i].Offset,soFromBeginning);
aSize:=FSections.Sections[i+1].Offset-FSections.Sections[i].Offset;
GetMem(FSections.Sections[i].Data,aSize);
FFile.Read(FSections.Sections[i].Data^,aSize);
Но вот мне, соответственно, надо сделать и методы, соответствующие TFileStream.Write(const buffer; Count : integer) и TFileStream.Read(var Buffer; Count : integer) (уже выглядящие как SectionRead(const Section : string; const Buffer...), SectionWrite(const Section : string; var Buffer...).
Ну вот и не знаю я, как присваивать в Data и возврашать из нее эти нетипизированные Buffer. Объясните мне, пожалуйста.
← →
Smithson (2003-06-25 12:57) [1]В процедуре параметр, объявленный как var Buffer можно использовать так:
var p: Pointer;
AA: Array[0..1000] of Integer absolute Buffer; // А здесь можно как массив.
Begin
p := @Buffer; // Имеешь адрес
AA[10] := 13;
И наконец. Процедуры чтения (и записи) данных из файла в Delphi так же часто принимают именно нетипизированный параметр. Так что ничего с ним не делай, просто передавай.
← →
Aleksandr (2003-06-25 13:13) [2]Да вот хрен-то он дает так делать...
если пытаешься сделать такое:
Buffer:=FSections.Sections[i].Data
FSections.Sections[i].Data:=Buffer, то посылают до несовместимых типов.
← →
Smithson (2003-06-25 13:59) [3]Правильно.
Data - это PChar, если я не ошибаюсь. Что такое PChar?
Я же писал:@Buffer; // Имеешь адрес
Дальше думай сам.
← →
Aleksandr (2003-06-25 15:04) [4]Все равно не понимаю... :( Ну, сделал я на запись вот так:
Index:=FSections.SectionIndex(Section);
if Index<0 then begin
S:=TRiSection.Create(Section,DataSize);
FSections.Add(S)
end
else
S:=FSections.Sections[Index];
if Assigned(S.Data) then
FreeMem(S.Data);
P:=@Buffer;
GetMem(S.Data,Count);
S.Data:=P;
А на чтение как?
Страницы: 1 вся ветка
Текущий архив: 2003.07.07;
Скачать: CL | DM;
Память: 0.45 MB
Время: 0.006 c