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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.07.2010, 19:45   #1
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию Проблема с порчей данных через BlockWrite

Для работы со своим типом графических файлов. До некоторого момента все шло прекрасно и работало. Но работало по такому принципу:

1) OnFormCreate:
Код:
AssignFile(F, 'Temp.ftf');
Rewrite(F, 1);
2) OnWork:
Код:
BlockWrite(F, ... , ...);
3) OnClose:
Код:
CloseFile(F);
Открытие аналогично.

Не оптимально и глупо.

Начал переделывать так:
Код:
AssignFile(F, CurDir + 'Temp.ftf');
Reset(F, 1);
Seek(F, FileSize(CurDir + 'Temp.ftf'));
BlockWrite(F, ActiveTool, 1);
BlockWrite(F, V, SizeOf(Integer));
CloseFile(F);
Т.е. Дозапись действий в конец файла.

Дело в том, что такой подход стал "ломать" файлы.

1) Файл открывается:
Код:
AssignFile(F, FileName);
  Reset(F, 1);
  BlockRead(F, FTFA, SizeOf(Integer));
  BlockRead(F, X1, SizeOf(Integer));
  BlockRead(F, Y1, SizeOf(Integer));
  FRMMain.IMGMain.Width := X1;
  FRMMain.IMGMain.Height := Y1;
  While Not(Eof(F)) Do
   Begin
    BlockRead(F, Num, 1);
    Case Num Of
     1 : Begin
         BlockRead(F, V, SizeOf(Integer));
         UNTEffects.FVFL_AddBlue(FRMMain.IMGMain.Picture.Bitmap.Handle, V);
        End;
     ...
    End;
   End;
  CloseFile(F);
Открылся, нарисовался. Но если я сейчас попытаюсь дописать в конец команду, то файл ломается ПОЧТИ ПОЛНОСТЬЮ.
Например:
До:
Код:
46 54 46 41 08 00 00 00 08 00 00 00 0b ff 00 ff
00 0e 00 00 00 00 02 00 00
После:
Код:
46 54 46 41 20 03 00 00 58 02 00 00 07 00 00 00
00 00 00 00 00 07 00 00 00 07 00 00 00 00 ff ff

Что не так?

P.S. Не обращаем внимание на конструкцию FileSize(CurDir + 'Temp.ftf'). В лазарусе нужно давать путь к файлу, а не F.

Деталь:

Запись команды потерла все предыдущие, установило неправильно байты размера и ПРАВИЛЬНО записало байты последней команды.

Красный - байты сигнатуры файла.
Зеленый - Размеры изображения
Розовый - Номер команды
Черный - команда.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ

Последний раз редактировалось Alex Cones; 21.07.2010 в 20:17.
Alex Cones вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ввод данных через форму hamlook Microsoft Office Excel 9 24.03.2013 17:11
замена данных через макрос ALEKS2008 Microsoft Office Excel 2 17.06.2010 18:07
BlockWrite Проверьте правильность, пожалуйста. Alex Cones Общие вопросы Delphi 3 18.11.2009 21:23
Проблема с Blockwrite inndim Общие вопросы Delphi 7 13.03.2009 08:38
передача данных через idtcpclient BioS Работа с сетью в Delphi 0 20.02.2007 11:04