Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 21.10.2013, 03:27
NKVD NKVD вне форума
Прохожий
 
Регистрация: 06.01.2011
Сообщения: 25
Репутация: 10
По умолчанию TFileStream запись в конец файла

Доброго времени суток, эксперты!Возникла совершенно дурацкая проблема, на первый взгляд.Сериализую объекты в файл.Делается это в разные промежутки времени.И вместо того, чтобы каждый раз писать в конец файла, не удаляя содержимое, программа пишет поверх содержимого.Никак не могу понять, в чем ошибка.Заранее спасибо за помощь.

Код:
type
  TObraz = class
    X: array [1..49] of Integer; //вектор входного образа  еще надо добавить сюда вектор "желаемый выход"
    T: array [1..4] of Integer; //Желаемый выход
    sq:string; //////////////////////////////////////////////////////////////
    constructor Create(STrGrd: TStringGrid; Col, Row, I, II, III, IIII: Integer; st:string);       //тут будет сериализация\десериализация и побитный парсинг Грида.
    procedure WriteToFile();
  //также можно добавить строковое поле "имя образа"
  end;

implementation

{ TObraz }

//I, II, III, IIII - желаемые выходы, передаваемые с формы
constructor TObraz.Create(STrGrd: TStringGrid; Col, Row, I, II, III, IIII: Integer; st:string);
var u,j,k,flag:Integer;
begin
k:=1;
for u := 0 to Row-1 do
begin
  for j := 0 to Col-1 do
  begin
  //Читаем значение флага, которое записано под видом указателя на объект.
  Flag := Integer(STrGrd.Rows[u].Objects[j]);
  if Flag = 0 then X[k]:=0
  else
  if flag=1 then  X[k]:=1;
  Inc(k);
  end;
end;
//заполняем массив желаемых выходов для данного образа
T[1]:=I;
T[2]:=II;
T[3]:=III;
T[4]:=IIII;
sq:=st;//////////////////////////////////////////////////
end;

procedure TObraz.WriteToFile;
var
  F: TFileStream;
  i:Integer;
begin
F:=TFileStream.Create('Obr.txt', fmCreate or fmOpenReadWrite);
F.Seek(0, soFromEnd);
for i := 1 to High(X) do
  F.WriteBuffer(X[i], SizeOf(X[i]));
for i := 1 to High(T) do
  F.WriteBuffer(T[i], SizeOf(T[i]));
F.WriteBuffer(Pointer(sq)^, Length(sq)); /////////////////////////////////////////
FreeAndNil(F);
end;
Ответить с цитированием
  #2  
Старый 21.10.2013, 05:52
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

На первый взгляд, да и на второй тоже - флаг при создании файлового потока подсовывается не тот (в смысле лишь fmCreate), получается что он всё время пересоздаётся, точно не знаю как подсовывать два флажка вместе, не копался, но если делать вот так
Код:
...
if FileExists('Obr.txt') then F:=TFileStream.Create('Obr.txt', fmOpenReadWrite)
   else F:=TFileStream.Create('Obr.txt', fmCreate);
...
оно должно работать
Ответить с цитированием
  #3  
Старый 21.10.2013, 07:49
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Сделай так:
Код:
procedure TObraz.WriteToFile(const AFileStream: TStream);
И стрим подавай извне, проблем таких не будет больше.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #4  
Старый 21.10.2013, 11:45
NKVD NKVD вне форума
Прохожий
 
Регистрация: 06.01.2011
Сообщения: 25
Репутация: 10
По умолчанию

Сделал так.
Код:
procedure TObraz.WriteToFile(const AFileStream: TStream);
var
  //F: TFileStream;
  i:Integer;
begin
AFileStream.Seek(0, soFromEnd);
for i := 1 to High(X) do
  AFileStream.WriteBuffer(X[i], SizeOf(X[i]));
for i := 1 to High(T) do
  AFileStream.WriteBuffer(T[i], SizeOf(T[i]));
AFileStream.WriteBuffer(Pointer(sq)^, Length(sq)); /////////////////////////////////////////
end;

procedure TForm4.Button1Click(Sender: TObject);
var
  Obr:TObraz;
  F: TFileStream;
begin
F:=TFileStream.Create('Obr.txt', fmCreate or fmOpenReadWrite);
//F.Seek(0, soFromEnd);
Obr:=TObraz.Create(StringGrid1,StringGrid1.ColCount,StringGrid1.RowCount,StrToInt(Edit1.Text),StrToInt(Edit2.Text),StrToInt(Edit3.Text),StrToInt(Edit4.Text),Edit5.Text);
Obr.WriteToFile(F);
Obr.Free;
Obr:=nil;
FreeAndNil(F);
end;


Все равно никакого эффекта(
Ответить с цитированием
  #5  
Старый 21.10.2013, 12:31
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Стрим должен быть ЕДИНЫМ для ВСЕХ объектов, пишущих себя в стрим.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #6  
Старый 21.10.2013, 17:45
NKVD NKVD вне форума
Прохожий
 
Регистрация: 06.01.2011
Сообщения: 25
Репутация: 10
По умолчанию

То есть хотите сказать, что надо создание потока вынести вообще куда-нибудь в глобальное событие, например в обработчик создания формы? И уже потом его подсовывать ко всем созданным объектам?
Ответить с цитированием
  #7  
Старый 21.10.2013, 17:58
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Так точно!
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #8  
Старый 21.10.2013, 21:15
NKVD NKVD вне форума
Прохожий
 
Регистрация: 06.01.2011
Сообщения: 25
Репутация: 10
По умолчанию

Все работает. Спасибо за подсказку. Спасибо всем, кто откликнулся.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:44.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter