Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Класс TFileStream, разъясните что к чему? 
:(
    Опции темы
Cashey
  Дата 11.10.2006, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: 2
Всего: 60



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


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
Snowy
Дата 11.10.2006, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



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

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

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

Добавлено @ 09:07 
Попробуй поиск по TFileStream - примеров работы мноооого.
PM MAIL   Вверх
Cashey
Дата 11.10.2006, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: 2
Всего: 60



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 с таким типом не работает, то мне нужно получить считанные из файла данные во что-то более универсальное. Но вот как это сделать?

Это сообщение отредактировал(а) Cashey - 11.10.2006, 09:41


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
Alexeis
Дата 11.10.2006, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(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));

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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Snowy
Дата 11.10.2006, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



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

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;

PM MAIL   Вверх
Cashey
Дата 11.10.2006, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: 2
Всего: 60



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

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

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


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
Romikgy
Дата 11.10.2006, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



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

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

не Variant?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Cashey
Дата 11.10.2006, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: 2
Всего: 60



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

Incompatible types: 'OleVariant' and 'Pointer'


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
Romikgy
Дата 11.10.2006, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



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

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

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

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


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Snowy
Дата 11.10.2006, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



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

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0947 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.