|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Не могу записать или прочитать типизированный файл
Здравствуйте.
Необходимо, чтобы программа делала следующее (последовательно): 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
|
|||
|
|||
Уже помогли разобраться.
|