Консультация № 190573
19.02.2017, 20:08
0.00 руб.
0 22 1
Здравствуйте! У меня возникли сложности с таким вопросом:
В программе на форме лежит компонент TChart, на котором в процессе работы программы строится график (Series), по окончании данные графика загружаются в текстовые файлы, что бы иметь возможность в дальнейшем по данным из файлов воспроизвести график.

Код:
//сохраняем данные графика в текстовые файлы

procedure TForm1.SaveToTxtFile1Click(Sender: TObject);
var
sx, sy: TStringList;
i: integer;
begin
sx := TStringList.Create;
sy := TStringList.Create;
for i := 0 to chart.Series[0].XValues.Count - 1 do
sx.Add(FloatToStr(chart.Series[0].XValues.Value[i]));
for i := 0 to chart.Series[0].YValues.Count - 1 do
sy.Add(FloatToStr(chart.Series[0].YValues.Value[i]));
sx.SaveToFile('x.txt');
sy.SaveToFile('y.txt');
sx.Free;
sy.Free;
end;

//читаем данные из текстовых файлов и создаём на их основе новый график

procedure TForm1.LoadFromTxtFile1Click(Sender: TObject);
var
sx, sy: TStringList;
i: integer;
begin
sx := TStringList.Create;
sy := TStringList.Create;
sx.LoadFromFile('x.txt');
sy.LoadFromFile('y.txt');
for i := 0 to sx.Count - 1 do
chart.Series[0].AddXY(StrToFloat(sx[i]), StrToFloat(sy[i]));
sx.Free;
sy.Free;
end;


Помогите мне модернизировать этот код так, что бы файл был один и в него можно было бы записать данные нескольких графиков с возможностью их воспроизведения. Данные по оси X должны идти первой колонкой. Файл обозвать (FormatDateTime('dd.mm.yyyy_hh.mm', now) + '.txt') и добавить компонент TOpenDialog для возможности выбора.

Обсуждение

давно
Старший Модератор
31795
6196
22.02.2017, 10:29
общий
Адресаты:
Что именно у Вас не получается?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
400264
21
22.02.2017, 11:35
общий
Как в один TStringList циклом по chart.SeriesCount (серий может быть несколько) заносить данные столбцами (притом, что бы данные с оси X были бы первым столбцом и использовались один раз, они для всех серий одинаковы).
давно
Старший Модератор
31795
6196
22.02.2017, 18:42
общий
22.02.2017, 18:43
Адресаты:
Можно так:
[code lang=pascal h=200]unit q170221;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, TeEngine, Series, ExtCtrls, TeeProcs, Chart, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Chart1: TChart;
Series1: TLineSeries;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const
FileName:string='z.txt';
var
Form1: TForm1;
implementation
{$R *.dfm}
//create
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
{если есть серии, удаляем}
while Form1.Chart1.SeriesCount>0 do
Form1.Chart1.Series[0].Free;
{добавляем и заполняем первую серию}
Form1.Chart1.AddSeries(TLineSeries.Create(self));
Form1.Chart1.Series[0].Clear;
for i:=-10 to 10 do
Form1.Chart1.Series[0].AddXY(i,i*i/3,'',clGreen);
{добавляем и заполняем вторую серию}
Form1.Chart1.AddSeries(TLineSeries.Create(self));
Form1.Chart1.Series[1].Clear;
for i:=-10 to 10 do
Form1.Chart1.Series[1].AddXY(i,i*i/5,'',clRed);
end;
//save
procedure TForm1.Button2Click(Sender: TObject);
var
a:string;
z:TStringList;
i,j:integer;
begin
z:=TStringList.Create;
{цикл по серии}
for i:=0 to Form1.Chart1.Series[0].count-1 do
begin
{получаем х}
a:=FloatToStr(Form1.Chart1.Series[0].XValue[i])+' ';
{цикл по сериям}
for j:=0 to Form1.Chart1.SeriesCount-1 do
a:= a+ FloatToStr(Form1.Chart1.Series[j].YValue[i])+' ';
z.Add(a);
end;
z.SaveToFile(FileName);
z.Free;
end;
//load
procedure TForm1.Button3Click(Sender: TObject);
var
w:string;
x,y:real;
z:TStringList;
i,j:integer;
begin
{если есть серии, удаляем}
while Form1.Chart1.SeriesCount>0 do
Form1.Chart1.Series[0].Free;
z:=TStringList.Create;
z.LoadFromFile(FileName);
w:=z[0];
{удаляем х}
delete(w,1,pos(' ',w));
j:=0;
{создаем нужное количество серий}
while pos(' ',w)>0 do
begin
{удаляем очередной у}
delete(w,1,pos(' ',w));
Form1.Chart1.AddSeries(TLineSeries.Create(self));
Form1.Chart1.Series[j].Clear;
inc(j);
end;
for i:=0 to z.Count-1 do
begin
w:=z[i];
{получаем х}
x:=StrToFloat(copy(w,1,pos(' ',w)-1));
delete(w,1,pos(' ',w));
for j:=0 to Form1.Chart1.SeriesCount-1 do
begin{получаем у в серии}
y:=StrToFloat(copy(w,1,pos(' ',w)-1));
delete(w,1,pos(' ',w));
Form1.Chart1.Series[j].AddXY(x,y+j,'',clRed+j);
end;
end;
z.Free;
end;
end.[/code]

Delphi 6
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
400264
21
22.02.2017, 19:21
общий
Что то не работает
Прикрепленные файлы:
46a1bde3a5e654c402699dae35cfa144.rar
давно
Старший Модератор
31795
6196
22.02.2017, 19:49
общий
Адресаты:
Это после нескольких save | load

из-за строчки Form1.Chart1.Series[ j ].AddXY(x,y+j,'',clRed+j);, где переменная J изменяет координату Y, она была введена намеренно, чтобы видеть разницу, между какбы одинаковыми графиками.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
22.02.2017, 19:54
общий
Адресаты:
Вот тут мой проэкт
Прикрепленные файлы:
a8016aac12d8ded9c91431aa18898d01.zip
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
400264
21
22.02.2017, 20:31
общий
Вроде разобрался. Остались мелкие вопросы по Вашему коду.

{если есть серии, удаляем}
while Form1.Chart1.SeriesCount>0 do
Form1.Chart1.Series[0].Free;

а разве серии не так удаляются

while Form1.Chart1.SeriesCount>0 do
Form1.Chart1.FreeAllSeries;

и ещё если код пишется на Form1, зачем тогда каждый раз писать Form1, например Form1.Chart1.Series[0].Free;
давно
Посетитель
400264
21
22.02.2017, 20:47
общий
Константин, а Вам не кажется, что графики несколько разнятся, из за чего это может быть
Прикрепленные файлы:
1c5e5ce2f38394f65072379d763b839f.png
давно
Посетитель
400264
21
23.02.2017, 06:50
общий
Константин, попробовал добавить в Ваш код одну серию от себя, посмотрите что получается.
Прикрепленные файлы:
bfd07ed7217e4fe7111c8a1bb10681da.rar
давно
Старший Модератор
31795
6196
23.02.2017, 10:17
общий
23.02.2017, 10:17
Адресаты:
Цитата: 08101967
Константин, а Вам не кажется, что графики несколько разнятся, из за чего это может быть

Я Вам писал выше:
Цитата: Зенченко Константин Николаевич
из-за строчки Form1.Chart1.Series[ j ].AddXY(x,y+j,'',clRed+j);, где переменная J изменяет координату Y, она была введена намеренно, чтобы видеть разницу, между какбы одинаковыми графиками.


Цитата: 08101967
Form1.Chart1.FreeAllSerie

И об этом я писал раньше.
Цитата: Зенченко Константин Николаевич
Delphi 6



Цитата: 08101967
зачем тогда каждый раз писать Form1

Старый "условный рефлекс" - прописывать все самостоятельно, не давая компилятору думать за себя, досталась от ассемблера.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
400264
21
23.02.2017, 10:43
общий
Понял, j убрал. А Вы мой файл прикреплённый смотрели. Как бы поправить код?
давно
Старший Модератор
31795
6196
23.02.2017, 12:37
общий
Адресаты:
Цитата: 08101967
//тут всё зло


Нет там никакого зла.
т.к.
Цитата: 08101967
(притом, что бы данные с оси X были бы первым столбцом и использовались один раз, они для всех серий одинаковы)

А в коде:
[code lang=pascal h=50] for i := -10 to 10 do
. . .
for i := 0 to 300 do[/code]
а запись ведется по первой серии Form1.Chart1.Series[0].count - 1
Можно по сериям найти максимальный счетчик и при записи в файл, если серия меньше максимума, то писать какой нибудь знак типа "#", а при загрузке когда он встретится на месте серии, её игнорировать.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
23.02.2017, 13:10
общий
23.02.2017, 13:19
Вот перекромсал:
[code lang=pascal h=200]unit q170221;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, TeEngine, Series, ExtCtrls, TeeProcs, Chart, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Chart1: TChart;
Series1: TLineSeries;
Chart2: TChart;
LineSeries1: TLineSeries;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const
FileName: string = 'z.txt';
var
Form1: TForm1;
implementation
{$R *.dfm}
//create

procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
{ }
while Form1.Chart1.SeriesCount > 0 do
Form1.Chart1.Series[0].Free; //??? FreeAllSeries;
{ }
Form1.Chart1.AddSeries(TLineSeries.Create(self));
Form1.Chart1.Series[0].Clear;
for i := -10 to 10 do
Form1.Chart1.Series[0].AddXY(i, i * i / 3, '', clGreen);
{ }
Form1.Chart1.AddSeries(TLineSeries.Create(self));
Form1.Chart1.Series[1].Clear;
for i := -10 to 10 do
Form1.Chart1.Series[1].AddXY(i, i * i / 5, '', clRed);

//добавил ещё один график от себя
Form1.Chart1.AddSeries(TLineSeries.Create(self));
Form1.Chart1.Series[2].Clear;
for i := 0 to 300 do
begin
Form1.Chart1.Series[2].AddXY(i, 4 * sin(i * pi / 180), '', clBlue);
end;

end;

//save

procedure TForm1.Button2Click(Sender: TObject);
var
a: string;
z: TStringList;
i, j,m: integer;
begin
z := TStringList.Create;
{ }
m:=0;
for i:=0 to Form1.Chart1.SeriesCount-1 do
if m<Form1.Chart1.Series[i].Count then m:=i;
{ }
for i := 0 to Form1.Chart1.Series[m].Count - 1 do
begin
{ }//тут всё зло
a := FloatToStr(Form1.Chart1.Series[m].XValue[i]) + ' ';
{ }
for j := 0 to Form1.Chart1.SeriesCount - 1 do
if i<Form1.Chart1.Series[j].Count
then a := a + FloatToStr(Form1.Chart1.Series[j].YValue[i]) + ' '
else a:=a+'# ';
z.Add(a);
end;
z.SaveToFile(FileName);
z.Free;
end;

//load

procedure TForm1.Button3Click(Sender: TObject);
var
w: string;
x, y: real;
z: TStringList;
i, j: integer;
begin
{ }
while Form1.Chart2.SeriesCount > 0 do
Form1.Chart2.Series[0].Free; //??? FreeAllSeries;
z := TStringList.Create;
z.LoadFromFile(FileName);
w := z[0];
{ }
delete(w, 1, pos(' ', w));
j := 0;
{ }
while pos(' ', w) > 0 do
begin
{ }
delete(w, 1, pos(' ', w));
Form1.Chart2.AddSeries(TLineSeries.Create(self));
Form1.Chart2.Series[j].Clear;
inc(j);
end;
for i := 0 to z.Count - 1 do
begin
w := z[i];
{ }
x := StrToFloat(copy(w, 1, pos(' ', w) - 1));
delete(w, 1, pos(' ', w));
for j := 0 to Form1.Chart2.SeriesCount - 1 do
begin { }
if w[1]<>'#' then
begin
y := StrToFloat(copy(w, 1, pos(' ', w) - 1));
Form1.Chart2.Series[j].AddXY(x, y, '', clRed);
end;
delete(w, 1, pos(' ', w));
end;
end;
z.Free;
end;
end.[/code]
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
400264
21
24.02.2017, 15:03
общий
Константин большое спасибо что Вы столько времени мне удили ли и я наверное уже Вам надоел, но у меня опять проблемка. Я так понимаю, что строчки "... Form1.Chart1.Series[ j ].AddXY(x,y+j,'',clRed+j);, где переменная J изменяет координату Y, она была введена намеренно, чтобы видеть разницу, между как бы одинаковыми графиками..." теперь нет, тогда я не понимаю почему так графики разняться, я опять данные немного поменял см. файл
Прикрепленные файлы:
9445d72a0ccd211f5c90a3aa0c49074f.rar
давно
Старший Модератор
31795
6196
24.02.2017, 17:29
общий
Адресаты:
Цитата: 08101967
тогда я не понимаю почему так графики разняться, я опять данные немного поменял см. файл

Проблема в том, что CHART рисуя графики в разных сериях автоматически выравнивает их оси по Х, когда все это загоняется в файл:
Цитата: 08101967
они для всех серий одинаковы

А сохраняя в файл мы их не выравниваем по оси Х(как это мы уже делали с хвостом серий). Т.е. получается нужно искать минимальный Х в сериях и потом его сохраняя, игнорировать те серии, которые не попадают в интервал.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
400264
21
24.02.2017, 17:44
общий
Если Вы про то что один график скажем так начинается от -20, а другой от 0 то я не об этом. Посмотрите в моём примере например на зелёную серию, в исходном примере примерно координате по оси X=50 соответствует координата Y=500, а на сохранённом Y=180.
давно
Старший Модератор
31795
6196
24.02.2017, 18:18
общий
Адресаты:
Вы посмотрите, где начинаютсяграфики в исходном графике и в результате
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
400264
21
24.02.2017, 18:27
общий
Ну так я про это и говорю, у Вас ещё до занесения в график, в файл координаты уже начинают неправильно вноситься.
давно
Старший Модератор
31795
6196
24.02.2017, 20:31
общий
Адресаты:
Вот переделал:
[code lang=pascal h=200]unit q170221;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, TeEngine, Series, ExtCtrls, TeeProcs, Chart, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Chart1: TChart;
Series1: TLineSeries;
Chart2: TChart;
LineSeries1: TLineSeries;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const
FileName: string = 'z.txt';
var
Form1: TForm1;
implementation
{$R *.dfm}
//create

procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
{ }
while Form1.Chart1.SeriesCount > 0 do
Form1.Chart1.Series[0].Free; //??? FreeAllSeries;
{ }
Form1.Chart1.AddSeries(TLineSeries.Create(self));
Form1.Chart1.Series[0].Clear;
for i := -10 to 25 do
Form1.Chart1.Series[0].AddXY(i, i * i / 3, '');
{ }
Form1.Chart1.AddSeries(TLineSeries.Create(self));
Form1.Chart1.Series[1].Clear;
for i := -20 to 50 do
Form1.Chart1.Series[1].AddXY(i, i * i / 5, '');

//äîáàâèë åù¸ îäèí ãðàôèê îò ñåáÿ
Form1.Chart1.AddSeries(TLineSeries.Create(self));
Form1.Chart1.Series[2].Clear;
for i := 0 to 100 do
begin
Form1.Chart1.Series[2].AddXY(i, 4 * sin(i * pi / 180), '');
end;

end;
//save

procedure TForm1.Button2Click(Sender: TObject);
var
a: string;
b:array of integer;
z: TStringList;
i, j, xMin, xMax: integer;
begin
z := TStringList.Create;
{ }
xMax:=round(Form1.Chart1.Series[0].XValue[0]);
xMin:=round(Form1.Chart1.Series[0].XValue[0]);
for j := 0 to Form1.Chart1.SeriesCount - 1 do
for i:= 0 to Form1.Chart1.Series[j].Count - 1 do
begin
if xMax < Form1.Chart1.Series[j].xValue[i] then
xMax:=round(Form1.Chart1.Series[j].xValue[i]);
if xMin > Form1.Chart1.Series[j].xValue[i] then
xMin:=round(Form1.Chart1.Series[j].xValue[i]);
end;
{ }
SetLength(b,Form1.Chart1.SeriesCount);
for i:=0 to Form1.Chart1.SeriesCount - 1 do b[i]:=-1;
{ }
for i := xMin to xMax do
begin
{ }
a := FloatToStr(i) + ' ';
{ }
for j:=0 to Form1.Chart1.SeriesCount-1 do
if b[j]=-1 then
if i=round(Form1.Chart1.Series[j].XValue[0]) then b[j]:=0;
{ }
for j:=0 to Form1.Chart1.SeriesCount-1 do
if(b[j]<>-1)and(b[j]<Form1.Chart1.Series[j].Count)
then a := a + FloatToStr(Form1.Chart1.Series[j].YValue[b[j]]) + ' '
else a := a + '# ';
{ }
for j:=0 to Form1.Chart1.SeriesCount-1 do
if b[j]<>-1 then inc(b[j]);
{ }
z.Add(a);
end;
z.SaveToFile(FileName);
z.Free;
end;
//load

procedure TForm1.Button3Click(Sender: TObject);
var
w: string;
x, y: real;
z: TStringList;
i, j: integer;
begin
{ }
while Form1.Chart2.SeriesCount > 0 do
Form1.Chart2.Series[0].Free; //??? FreeAllSeries;
z := TStringList.Create;
z.LoadFromFile(FileName);
w := z[0];
{ }
delete(w, 1, pos(' ', w));
j := 0;
{ }
while pos(' ', w) > 0 do
begin
{ }
delete(w, 1, pos(' ', w));
Form1.Chart2.AddSeries(TLineSeries.Create(self));
Form1.Chart2.Series[j].Clear;
inc(j);
end;
for i := 0 to z.Count - 1 do
begin
w := z[i];
{ }
x := StrToFloat(copy(w, 1, pos(' ', w) - 1));
delete(w, 1, pos(' ', w));
for j := 0 to Form1.Chart2.SeriesCount - 1 do
begin { }
if w[1] <> '#' then
begin
y := StrToFloat(copy(w, 1, pos(' ', w) - 1));
Form1.Chart2.Series[j].AddXY(x, y, '');
end;
delete(w, 1, pos(' ', w));
end;
end;
z.Free;
end;
end.[/code]

Сразу говорю, это частный случай для целых значений Х.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
400264
21
24.02.2017, 22:03
общий
Сразу говорю, это частный случай для целых значений Х


Это плохо. Константин последняя просьба. Сохрани пожалуйста по серийно, в разные файла (имя файла - имя серии, два столбца - X,Y), а при загрузке добавь компонент TOpenDialog для возможности выбора серии.
давно
Старший Модератор
31795
6196
27.02.2017, 09:44
общий
Адресаты:
Определитесь с заданием.
Покажите свои наработки.
Все, что нужно, для ответа уже есть в мини-форуме.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
28.02.2017, 12:20
общий
это ответ
Здравствуйте, 08101967!

Смотрите приложение:
[code lang=pascal h=200]unit q170221;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, TeEngine, Series, ExtCtrls, TeeProcs, Chart, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Chart1: TChart;
Series1: TLineSeries;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private{ Private declarations }
public{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//create
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
Form1.Chart1.FreeAllSeries;
Form1.Chart1.AddSeries(TLineSeries.Create(self));
Form1.Chart1.Series[0].Clear;
for i := -10 to 25 do
Form1.Chart1.Series[0].AddXY(i, i * i / 3, '');
Form1.Chart1.AddSeries(TLineSeries.Create(self));
Form1.Chart1.Series[1].Clear;
for i := -20 to 50 do
Form1.Chart1.Series[1].AddXY(i, i * i / 5, '');
Form1.Chart1.AddSeries(TLineSeries.Create(self));
Form1.Chart1.Series[2].Clear;
for i := 0 to 300 do
begin
Form1.Chart1.Series[2].AddXY(i, 4 * sin(i * pi / 180), '');
end;
end;
//save
procedure TForm1.Button2Click(Sender: TObject);
var
a: string;
d: TDateTime;
z: TStringList;
i, j: integer;
function ReverseDateFormat(a:string):string;
begin
if pos('.',a)>0 then a:=ReverseDateFormat(copy(a,pos('.',a)+1,length(a)))+'.'+copy(a,1,pos('.',a)-1);
ReverseDateFormat:=a;
end;
begin
for j:=0 to Form1.Chart1.SeriesCount-1 do
begin
z := TStringList.Create;
for i:=0 to Form1.Chart1.Series[j].Count-1 do
z.Add(FloatToStr(Form1.Chart1.Series[j].XValue[i])+' '+
FloatToStr(Form1.Chart1.Series[j].YValue[i]));
d:=now;
a:=DateToStr(d);
while pos('/',a)>0 do a[pos('/',a)]:='.';
a:=reverseDateFormat(a);
a:=a+'.s'+chr(ord('0')+(j div 10))+chr(ord('0')+(j mod 10))+'.txt';
z.SaveToFile(a);
z.Free;
end;
end;
//load
procedure TForm1.Button3Click(Sender: TObject);
var
openDialog:TOpenDialog;
w: string;
x, y: real;
z: TStringList;
i: integer;
begin
Form1.Chart1.FreeAllSeries;
openDialog := TOpenDialog.Create(self);
openDialog.InitialDir := GetCurrentDir;
openDialog.Options := [ofFileMustExist];
openDialog.Filter :='*.txt';
Form1.Chart1.AddSeries(TLineSeries.Create(self));
Form1.Chart1.Series[0].Clear;
if openDialog.Execute
then
begin
w:=openDialog.FileName;
while pos('\',w)>0 do delete(w,1,pos('\',w));
z:=TStringList.Create;
z.LoadFromFile(w);
for i:=0 to z.Count-1 do
begin
w:=z[i];
x:=StrToFloat(copy(w,1,pos(' ',w)-1));
delete(w,1,pos(' ',w));
y:=StrToFloat(w);
Form1.Chart1.Series[0].AddXY(x,y);
end;
z.Free;
end
else ShowMessage('немогу открыть файл');
openDialog.Free;
end;
end.[/code]
Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа