Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Класс TFileStream


Автор: Cashey 11.10.2006, 08:55
не могу понять работу методов этого класса. Read и Seek. Что им надо в параметрах передовать? Что они возвращают? В Хелпе ничего понять не могу. Причем тут класс THandleStream?

Автор: Snowy 11.10.2006, 09:06
В Read нужно передавать заранее выделенный блок памяти и количество байт, которые в него нужно прочитать.
Возвращает - сколько было реально прочитано (на случай, если файл кончился раньше).

Seek - первый параметр - на сколько байт передвигаться по файлу (может быть отрицательным числом). Второй - откуда двигаться - с начала файла, с конца, с текущей позиции.

THandleStream - класс, от которого унаследован TFileStream. Соответсвенно данные методы появились в нём, а файлстримом унаследованы.

Добавлено @ 09:07 
Попробуй поиск по TFileStream - примеров работы мноооого.

Автор: Cashey 11.10.2006, 09:31
Snowy, пример у меня перед глазами с ним и надо разобратся. У меня есть код и задача его переложить на ФоксПро или сделать из него COM объект и все равно использовать в Фоксе. И я вот никак не могу понять как оно работает и как это переложить:
Код

type
  TNVHeader = record 
    NodesNum : word;  
    StructOfs,  
    DescrOfs, 
    ShortDOfs, 
    UnitsOfs : longint  
  end;
////////////////////////////////////////////
  TNVFile = class(TObject)
    Name     : String[80];
    Fstrm     : TFileStream;
    Status   : byte;
    Header   : TNVHeader;
    Level    : byte;                    
 { и там еще набор свойств}
////////////////////////////////////////////
  TNVNode = record
    Level    : byte;
    Id       : byte; 
    Next     : word; 
    Sub      : word;
{ и там еще набор свойств}
////////////////////////////////////////////
var
  Node: TNVNode;
////////////////////////////////////////////

{Далее}

function TNVFile.ReadNode(Num: longint; var Node: TNVNode): boolean;
begin
  try
  FStrm.Seek(Header.StructOfs+Num*SizeOf(Node),0);
  FStrm.Read(Node,SizeOf(Node));
  Result:=True;
  Except Result:=False; end;
end;

... и дальше запись Node вставляется в ListBox. Так как тип record через COM вроде не передается, да и FoxPro с таким типом не работает, то мне нужно получить считанные из файла данные во что-то более универсальное. Но вот как это сделать?

Автор: Alexeis 11.10.2006, 09:47
Цитата(Cashey @  11.10.2006,  09:31 Найти цитируемый пост)
Так как тип record через COM вроде не передается, да и FoxPro с таким типом не работает

record - это аналог структуры в С++. А проще говоря его можно представить обычным буфером в памяти того-же размера.
можно "FStrm.Read(Node,SizeOf(Node));"
заменить на 
Код

var
  buf : Pointer;
begin
  getmem(buf, SizeOf(Node));
  FStrm.Read(buf^, SizeOf(Node));

т.е. читать запись просто в буфер памяти, а его уже передавать куда угодно. 

Автор: Snowy 11.10.2006, 09:51
Фокса я не знаю. Точнее прочитать более-менее могу, но написать нет.
Поэтому могу только прокомментировать код
Код

function TNVFile.ReadNode(Num: longint; var Node: TNVNode): boolean;
begin
  try
    FStrm.Seek(Header.StructOfs+Num*SizeOf(Node),0); // перемещаемся от начала файла в точку
    // StructOfs - смещение , плюс кол-во записей умноженное на размер записи.
    // То есть просто переносим указатель внутри файла на нужную нам запись
    FStrm.Read(Node,SizeOf(Node)); // читаем структуру Node. 
    // Node - куда читать, SizeOf(None) - её размер в байтах
    Result:=True; // если ошибок нет, то результат функции всё нормально
  Except Result:=False; end; // если была ошибка, то результат отрицательный
end;

Автор: Cashey 11.10.2006, 10:10
Цитата(alexeis1 @  11.10.2006,  10:47 Найти цитируемый пост)
var
  buf : Pointer;

ну и какой тип в COM объекте будет соответсвовать типу Pointer? если этот код запихнуть в DLL и уже в другом приложении работать только с результатом считывания из файла?
или второй вариант, записать содержимое этой переменной buf в текстовый файл?

Snowy, спасибо, я примерно так и предпологал, сейчас проблема состоит в том, чем можно заменить этот Node в качестве принимающего значения из FStrm.Read

Автор: Romikgy 11.10.2006, 10:15
Цитата(Cashey @  11.10.2006,  09:10 Найти цитируемый пост)

ну и какой тип в COM объекте будет соответсвовать типу Pointer?

не Variant?

Автор: Cashey 11.10.2006, 10:19
Цитата(Romikgy @  11.10.2006,  11:15 Найти цитируемый пост)
не Variant? 

Incompatible types: 'OleVariant' and 'Pointer'

Автор: Romikgy 11.10.2006, 10:29
Я вообще то имел ввиду не 
Цитата(Cashey @  11.10.2006,  09:19 Найти цитируемый пост)
OleVariant

а имено 
Цитата(Cashey @  11.10.2006,  09:19 Найти цитируемый пост)
Variant

ну могу и ошибатся

Добавлено @ 10:33 
ДРКБ есть ?
Midas и COM. Советы и Приемы 
там есть пример юзания TFilesteam в COM 

Автор: Snowy 11.10.2006, 10:33
Цитата(Cashey @  11.10.2006,  10:10 Найти цитируемый пост)
чем можно заменить этот Node в качестве принимающего значения из FStrm.Read
Равным по размеру блоком памяти.
Это всего лишь байты.
Можешь даже не целиком его читать, а поотдельности.
Прочитать из файла байт, потом ещё один, потом 2 байта, потом ещё 2 байта - получишь 4 соответствующих переменных.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)