Здравствуйте.
Необходимо, чтобы программа делала следующее (последовательно):
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.