Z MeZe
Full Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору DUMAND Цитата: Как ни странно, в Инете я не нашел (а я искал) такого простого и изящного решения. | Ну, если быть честным, это не самое (даже, наверное, далеко не самое) изящное решение. К примеру: если дата задана в формате ДД.ММ.ГГ, или время только ЧЧ:ММ, то вся "конструкция" рушится. Этот вариант корректен, если известен ЧЕТКИЙ формат, к примеру, даты в файле. Просто корректировал тот код, который был, чтобы было понятнее. Цитата: Два вопроса: 1. Можно ли в процессе чтения вместо отсутствующих данных поставить нули. График получается "корявый", но все же программа работает. 2. Может быть возможно, чтобы пропуск в данных сохранить и на графике отразить отсутствием точки и соединением линией графика имеющихся соседних точек. Насколько я понял, это не получится (нет возможностей TChart) | Вот, если правильно понял вопросы, решение оных двух: Цитата: unit Unit_222; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls, TeeProcs, TeEngine, Chart, Series; type TForm1 = class(TForm) Chart1: TChart; BitBtn1: TBitBtn; Series1: TLineSeries; Series2: TLineSeries; Series3: TLineSeries; procedure BitBtn1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; n,lbt,ldt,lbtd,ldtd,laoa,rbt,rdt,rbtd,rdtd,raoa,bbt,bdt,bbtd,bdtd,baoa:double; lostr,lred,lgreen,ldis,rostr,rred,rgreen,rdis,bostr,bred,bgreen,bdis:double; implementation {$R *.dfm} procedure TForm1.BitBtn1Click(Sender: TObject); var F: TextFile; BufStr: String; BufStrList: TStringList; begin DecimalSeparator := '.'; AssignFile(f,'users/Eyes.txt'); Reset(f); n:= 0; while not EOF(f) do begin n:= n + 1; ReadLn(F, BufStr); BufStrList:=TStringList.Create; BufStrList.Text:=StringReplace(BufStr,#9,#13#10,[rfReplaceAll]); if BufStrList.Count >1 then begin if BufStrList.Strings[2] <> '' then lostr:= StrToFloat(BufStrList.Strings[2]) else lostr:= 0; if BufStrList.Strings[3] <> '' then lred:= StrToFloat(BufStrList.Strings[3]) else lred:= 0; if BufStrList.Strings[4] <> '' then lgreen:= StrToFloat(BufStrList.Strings[4]) else lgreen:= 0; if BufStrList.Strings[5] <> '' then ldis:= StrToFloat(BufStrList.Strings[5]) else ldis:= 0; if BufStrList.Strings[6] <> '' then rostr:= StrToFloat(BufStrList.Strings[6]) else rostr:= 0; if BufStrList.Strings[7] <> '' then rred:= StrToFloat(BufStrList.Strings[7]) else rred:= 0; if BufStrList.Strings[8] <> '' then rgreen:= StrToFloat(BufStrList.Strings[8]) else rgreen:= 0; if BufStrList.Strings[9] <> '' then rdis:= StrToFloat(BufStrList.Strings[9]) else rdis:= 0; if BufStrList.Strings[10] <> '' then bostr:= StrToFloat(BufStrList.Strings[10]) else bostr:= 0; if BufStrList.Strings[11] <> '' then bred:= StrToFloat(BufStrList.Strings[11]) else bred:= 0; if BufStrList.Strings[12] <> '' then bgreen:= StrToFloat(BufStrList.Strings[12]) else bgreen:= 0; if BufStrList.Strings[13] <> '' then bdis:= StrToFloat(BufStrList.Strings[13]) else bdis:= 0; if rostr <> 0 then series1.AddXY(n, rostr,'',clblue); if lostr <> 0 then series2.AddXY(n, lostr,'',clgreen); if bostr <> 0 then series3.AddXY(n, bostr,'',clred); end; BufStrList.Free; end; CloseFile(f); end; end. | Пример при учете, что если нет какого-то значения в файле, то должен быть ТАВ, т.е: 23.03.2005[ТАВ]18:56:34[ТАВ]3.56[ТАВ][ТАВ]34[ТАВ]45[ТАВ]56[ТАВ][ТАВ][ТАВ] 23.03.2005[ТАВ]19:56:34[ТАВ]3.56[ТАВ][ТАВ][ТАВ][ТАВ][ТАВ][ТАВ][ТАВ] Если разделитель не [ТАВ], то в строке BufStrList.Text:=StringReplace(BufStr,#9,#13#10,[rfReplaceAll]); заменить #9 на символ (если пробел, то #9 заменить на ' '). Цитата: А я уже наблюдал , но не пробовал... Вещь интересная |