Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.10.2010, 21:25   #1
RoadTrain
Пользователь
 
Аватар для RoadTrain
 
Регистрация: 07.05.2007
Сообщений: 32
По умолчанию Access violation в TFileStream

Привет всем. Прошу помощи с кодом. Изначально с TFIleStream проблем не было, но когда решил весь код собрать в класс, а файловый поток сделать переменной класса.
Но, видно, я чего-то не понимаю и есть какие-то ньюансы.
Вот код:
Код:
  TWDB = class(TObject)
    inStream: TFileStream;
    inputFn: string;
    outputFn:string;
    WDBHeader: TWDBHeader;
    Header: THeader;

    vertexBuf: array of TVertex;
    facesBuf: array of TFace;
    numVerts, numFaces: DWORD;

    procedure Init();
    procedure ReadHeader(start:integer; bytesToRead:integer);
    procedure ReadFiles(start:integer; bytesToRead:integer);

    private

  end;

{...}
var
  Form1: TForm1;
  WDB: TWDB;
{...}

procedure TWDB.Init();
var
  BlockHeader: TBlockHeader;
  FileData: TFileData;
  numFiles, BlockEnd, numIndices: integer;
  I,j: Integer;
  lineadd:string;
  facesBufRaw: array of word;
  faceIndex:word;
begin
  inStream := TFileStream.Create(inputFn, fmOpenRead);
  inStream.Seek(0, soFromBeginning);
  inStream.ReadBuffer(WDBHeader, sizeof(WDBHeader));

  //Reading blocks
  while inStream.Position < WDBHeader.wdbSize do begin
    // filling these records with zeros to aviod getting wrong data
    FillChar(BlockHeader,SizeOf(BlockHeader),$00);
    inStream.ReadBuffer(BlockHeader, sizeof(BlockHeader));
    case BlockHeader.bFlag of
      BFLAG_HEADER: //96 01 00 00
        ReadHeader(inStream.Position, BlockHeader.bSize-8);
      BFLAG_FILELST: //97 01 00 00 ;
        ReadFiles(inStream.Position, BlockHeader.bSize-8);
    end;
  end;

  inStream.Free;
end;

procedure TWDB.ReadHeader(start:integer; bytesToRead:integer);
begin
   inStream.ReadBuffer(Header, sizeof(Header));
   Form1.ListBox1.AddItem(inttostr(Header.NumRootBlocks), Form1);
end;

procedure TWDB.ReadFiles(start:integer; bytesToRead:integer);
begin

end;
В итоге на
Код:
inStream := TFileStream.Create(inputFn, fmOpenRead);
я получаю Access violation. Укажите на ошибку, пожалуйста.
RoadTrain вне форума Ответить с цитированием
Старый 12.10.2010, 22:23   #2
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Проэкспериментировал с классом так:
Код:
procedure TForm1.FormCreate(Sender: TObject);
var WDB: TWDB;
begin
  WDB := TWDB.Create;
  WDB.inputFn := 'Reserv.ini'; 
  WDB.Init;
end;
Ошибки не было.

А почему бы не сделать нормально. Т.е. перекрыть конструктор класса, где можно было бы указывать имя файла.
А то задавать имя файла как-то через заднее крыльцо получается.
Прик вне форума Ответить с цитированием
Старый 12.10.2010, 22:30   #3
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

А вы объект-то вообще создаёте?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 12.10.2010, 22:40   #4
RoadTrain
Пользователь
 
Аватар для RoadTrain
 
Регистрация: 07.05.2007
Сообщений: 32
По умолчанию

Цитата:
Сообщение от Прик Посмотреть сообщение
Проэкспериментировал с классом так:
Код:
procedure TForm1.FormCreate(Sender: TObject);
var WDB: TWDB;
begin
  WDB := TWDB.Create;
  WDB.inputFn := 'Reserv.ini'; 
  WDB.Init;
end;
Ошибки не было.

А почему бы не сделать нормально. Т.е. перекрыть конструктор класса, где можно было бы указывать имя файла.
А то задавать имя файла как-то через заднее крыльцо получается.
Я понял, что не делал этого:
Код:
  WDB := TWDB.Create;


спасибо, заработало.
Насчёт такой реализации - это первое, что я придумал. Отдельно inputFn нужно будет для ф-ции Backup, которая будет делать бекапы простым копированием. В процессе я ещё буду многое переделывать, я так чувствую.

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
А вы объект-то вообще создаёте?
я уже ответил, что в этом и была проблема мой фэйл

Последний раз редактировалось RoadTrain; 13.10.2010 в 00:19.
RoadTrain вне форума Ответить с цитированием
Старый 17.10.2010, 04:39   #5
RoadTrain
Пользователь
 
Аватар для RoadTrain
 
Регистрация: 07.05.2007
Сообщений: 32
По умолчанию

ещё вопрос есть.
Как читать строки из бинарного файла?
String понятно не подходит (хотя наверно как-то с указателем можно, но я не знаю).
если читать как динамический (длины строк то разные всегад) array of ansichar ( в rad studio xe char занимает 2 байта - юникод), то программа просто закрывается.

ммм...
можно так, насколько я понял.
Код:
Setlength(Filename, length);
inStream.Read(filename[1], length);

Последний раз редактировалось RoadTrain; 17.10.2010 в 05:08.
RoadTrain вне форума Ответить с цитированием
Старый 17.10.2010, 10:51   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
ansichar ( в rad studio xe char занимает 2 байта - юникод)
ансичар в любой ред 1 байт, а вот чар...
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка Access Violation AHTuKiLLeR Общие вопросы Delphi 8 02.06.2009 10:48
Access Violation SunKnight Общие вопросы Delphi 2 05.06.2008 16:46
Access violation at address.. RegentM Общие вопросы Delphi 4 01.11.2007 03:46
Access Violation Carbon Общие вопросы Delphi 12 18.09.2007 19:55