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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 20.09.2010, 14:14
khrenkov khrenkov вне форума
Прохожий
 
Регистрация: 20.09.2010
Сообщения: 2
Репутация: 10
Вопрос Не могу записать или прочитать типизированный файл

Здравствуйте.

Необходимо, чтобы программа делала следующее (последовательно):
1. при нажатии кнопки ConversBtn обрабатывается выбранный файл *.CSV и его содержимое заносится в массив структур.
2. при нажатии кнопки SaveBtn файл, заполненный массивом структур записывается в файл *.SCDA.
3. при нажатии кнопки OpenBtn должен загружаться выбранный файл *.SCDA и в соответствии с его содержимым должны строиться графики.
Так же необходимо, чтобы п.3 выполнялся "самостоятельно", т.е. чтобы была возможность открыть сохраненный ранее файл *.SCDA.
Проблема:
При запуске приложения и выполнении п. 3 без п.1,2, т.е. при открытии ранее сохраненного файла *.SCDA загружается файл, значения полей структур в котором заполнены "плохими" значениями: нулями, очень маленькими значениями или Nan.
Примечание:
Если запустить приложение и выполнить п.1 и п.2, а в п.3 выбрать тот же файл, что был сохранен в п.2(предположим xxx.SCDA), то все строится и все функционирует.
Если же перезапустить приложение и выполняя п.3 выбрать файл xxx.SCDA, то загружаются некорректные данные.
Предположения:
Либо не правильно пишу в файл
Либо не правильно читаю файл

Кто чем может помочь?

Код:
  TDataRecord = class(TObject)
  private
    FChan1: Single;
    FChan2: Single;
    FChan3: Single;
    FChan4: Single;
    FChan5: Single;
    FChan6: Single;
    FChan7: Single;
    FDate: Double;
    FDateTime: Double;
    FTime: Double;
  public
    property Chan1: Single read FChan1 write FChan1;
    .........
    property Chan7: Single read FChan7 write FChan7;
    property Date: Double read FDate write FDate;
    property DateTime: Double read FDateTime write FDateTime;
    property Time: Double read FTime write FTime;
    { Public declarations }
  end;

  TDataField = array of TDataRecord;

var
  MainForm: TMainForm;
  DataField1: TDataField;
  Data: TDataField;

implementation

{$R *.dfm}

function TMainForm.ChangeSeparator(var StrTemp: string): string;
begin
  StrTemp := StringReplace(StrTemp, ',', Decimalseparator,[rfReplaceAll]);
  StrTemp := StringReplace(StrTemp, '.', Decimalseparator,[rfReplaceAll]);
end;

function TMainForm.BRKCheck(var StrTemp: string): string;
begin
  if StrTemp = 'BRK' then
    StrTemp := '0';
end;

procedure TMainForm.ChanSwitcherClick(Sender: TObject);
var
  I: Longint;
begin
  Series1.Clear;
  Series2.Clear;
  Series3.Clear;
  Series4.Clear;
  Series5.Clear;
  Series6.Clear;
  Series7.Clear;
  case ChanSwitcher.ItemIndex of
    0:
      for I := 0 to Length(Data) - 1 do
        Series1.AddXY(Data[i].DateTime,Data[i].Chan1,
          DateTimeToStr(Data[i].DateTime));
    1:
      for I := 0 to Length(Data) - 1 do
        Series2.AddXY(Data[i].DateTime,Data[i].Chan2,
          DateTimeToStr(Data[i].DateTime));
    2:
      for I := 0 to Length(Data) - 1 do
        Series3.AddXY(Data[i].DateTime,Data[i].Chan3,
          DateTimeToStr(Data[i].DateTime));
    3:
      for I := 0 to Length(Data) - 1 do
        Series4.AddXY(Data[i].DateTime,Data[i].Chan4,
          DateTimeToStr(Data[i].DateTime));
    4:
      for I := 0 to Length(Data) - 1 do
        Series5.AddXY(Data[i].DateTime,Data[i].Chan5,
          DateTimeToStr(Data[i].DateTime));
    5:
      for I := 0 to Length(Data) - 1 do
        Series6.AddXY(Data[i].DateTime,Data[i].Chan6,
          DateTimeToStr(Data[i].DateTime));
    6:
      for I := 0 to Length(Data) - 1 do
        Series7.AddXY(Data[i].DateTime,Data[i].Chan7,
          DateTimeToStr(Data[i].DateTime));
    7:
      for I := 0 to Length(Data) - 1 do
      begin
        Series1.AddXY(Data[i].DateTime,Data[i].Chan1,
          DateTimeToStr(Data[i].DateTime));
        Series2.AddXY(Data[i].DateTime,Data[i].Chan2,
          DateTimeToStr(Data[i].DateTime));
        Series3.AddXY(Data[i].DateTime,Data[i].Chan3,
          DateTimeToStr(Data[i].DateTime));
        Series4.AddXY(Data[i].DateTime,Data[i].Chan4,
          DateTimeToStr(Data[i].DateTime));
        Series5.AddXY(Data[i].DateTime,Data[i].Chan5,
          DateTimeToStr(Data[i].DateTime));
        Series6.AddXY(Data[i].DateTime,Data[i].Chan6,
          DateTimeToStr(Data[i].DateTime));
        Series7.AddXY(Data[i].DateTime,Data[i].Chan7,
          DateTimeToStr(Data[i].DateTime));
      end;
  end;   
end;

procedure TMainForm.ConversBtnClick(Sender: TObject);
var
  OD: TOpenDialog;
  Excel: Variant;
  I, J, DocSize: Longint;
  TempStr: string;
  StopFlag: Boolean;
const
  STRNUMBER: Longint = 20;
  ROWNUMBER: Longint = 9;
begin
  OD := TOpenDialog.Create(nil);
  try
    OD.Filter := 'Файлы CSV|*.CSV';
    OD.InitialDir := 'C:\Program Files\Borland\Delphi7\Projects\Stove';
    if OD.Execute then
    begin
      DataField1 := nil;
      DocSize := 1;
      StopFlag := true;
      Excel := CreateOleObject('Excel.Application');
      Excel.Workbooks.Open[OD.FileName];
      while StopFlag do
      begin
        TempStr := Excel.Range['A' + IntToStr(DocSize)];
        if TempStr = '' then
        begin
          StopFlag := false;
          DocSize := DocSize - 1;
          Break;
        end;
      Inc(DocSize);
      end;
      SetLength(DataField1,(DocSize div 10));
      try
        for I := 1 to (DocSize div 10) do
        begin
          DataField1[I-1] := TDataRecord.Create;
          for J := 1 to ROWNUMBER do
          begin
            case J of
              1:
                begin
                  TempStr := Excel.Range['A' + IntToStr(I * 10)];
                  ChangeSeparator(TempStr);
                  DataField1[I-1].Date := StrToDate(TempStr);
                end;
              2:
                begin
                  TempStr := Excel.Range['B' + IntToStr(I * 10)];
                  ChangeSeparator(TempStr);
                  DataField1[I-1].Time := StrToFloat(TempStr);
                  DataField1[I-1].DateTime := DataField1[I-1].Date +
                    DataField1[I-1].Time;
                end;
              3:
                begin
                  TempStr := Excel.Range['C' + IntToStr(I * 10)];
                  BRKCheck(TempStr);
                  ChangeSeparator(TempStr);
                  DataField1[I-1].FChan1 := RoundTo(StrToFloat(TempStr),-2);
                end;
              4:
                begin
                  TempStr := Excel.Range['D' + IntToStr(I * 10)];
                  BRKCheck(TempStr);
                  ChangeSeparator(TempStr);
                  DataField1[I-1].FChan2 := RoundTo(StrToFloat(TempStr),-2);
                end;
              5:
                begin
                  TempStr := Excel.Range['E' + IntToStr(I * 10)];
                  BRKCheck(TempStr);
                  ChangeSeparator(TempStr);
                  DataField1[I-1].FChan3 := RoundTo(StrToFloat(TempStr),-2);
                end;
              6:
                begin
                  TempStr := Excel.Range['F' + IntToStr(I * 10)];
                  BRKCheck(TempStr);
                  ChangeSeparator(TempStr);
                  DataField1[I-1].FChan4 := RoundTo(StrToFloat(TempStr),-2);
                end;
              7:
                begin
                  TempStr := Excel.Range['G' + IntToStr(I * 10)];
                  BRKCheck(TempStr);
                  ChangeSeparator(TempStr);
                  DataField1[I-1].FChan5 := RoundTo(StrToFloat(TempStr),-2);
                end;
              8:
                begin
                  TempStr := Excel.Range['H' + IntToStr(I * 10)];
                  BRKCheck(TempStr);
                  ChangeSeparator(TempStr);
                  DataField1[I-1].FChan6 := RoundTo(StrToFloat(TempStr),-2);
                end;
              9:
                begin
                  TempStr := Excel.Range['I' + IntToStr(I * 10)];
                  BRKCheck(TempStr);
                  ChangeSeparator(TempStr);
                  DataField1[I-1].FChan7 := RoundTo(StrToFloat(TempStr),-2);
                end;
            end;
          end;
        end;
      finally
        Excel.ActiveWorkbook.Close;
        Excel.Application.Quit;
        Excel := Unassigned;
      end;
    end;
  finally
    OD.Free;
  end;
end;

procedure TMainForm.SaveBtnClick(Sender: TObject);
var
  SD: TSaveDialog;
  FileName: string;
  FileForWrite: File of TDataRecord;
  I: Longint;
begin
  SD := TSaveDialog.Create(nil);
  try
    SD.Filter := 'Файлы SCDA|*.SCDA';
    SD.InitialDir := 'C:\Program Files\Borland\Delphi7\Projects\Stove';
    if SD.Execute then
    begin
      FileName := Concat(SD.FileName,'.SCDA'); 
      AssignFile(FileForWrite,FileName);
      Rewrite(FileForWrite);
      for I := 0 to Length(DataField1) - 1 do
        Write(FileForWrite,DataField1[i]);
      CloseFile(FileForWrite);
    end
  finally
    SD.Free;
  end;
end;

procedure TMainForm.OpenBtnClick(Sender: TObject);
var
  DataFile: TDataRecord;
  OD: TOpenDialog;
  FileName: string;
  FileForRead: File of TDataRecord;
  I: Longint;
  Size: Integer;
begin
  Data := nil;
  OD := TOpenDialog.Create(nil);
  try
    OD.Filter := 'Файлы SCDA|*.SCDA';
    OD.InitialDir := 'C:\Program Files\Borland\Delphi7\Projects\Stove';
    if OD.Execute then
    begin
      FileName := OD.FileName;
      AssignFile(FileForRead,FileName);
      Reset(FileForRead);
      Size := FileSize(FileForRead);
      SetLength(Data,Size);
      for I := 0 to Size - 1 do
      begin
        Data[i] := TDataRecord.Create;
        Read(FileForRead,Data[i]);
      end;
      CloseFile(FileForRead);
     // Edit1.Text := FileName;
    end
  finally
    OD.Free;
  end;
end;
end.
Ответить с цитированием
  #2  
Старый 20.09.2010, 15:09
khrenkov khrenkov вне форума
Прохожий
 
Регистрация: 20.09.2010
Сообщения: 2
Репутация: 10
По умолчанию

Уже помогли разобраться.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter