19.08.2017, 00:58 [+3 UTC]
в нашей команде: 2 093 чел. | участники онлайн: 1 (рекорд: 21)

:: РЕГИСТРАЦИЯ

:: консультации

:: задать вопрос

:: все разделы

:: правила

:: новости

:: участники

:: доска почёта

:: форум

:: блоги

:: поиск

:: статистика

:: наш журнал

:: наши встречи

:: наша галерея

:: отзывы о нас

:: поддержка

:: руководство

Версия системы:
7.41 (25.02.2017)

Общие новости:
23.02.2017, 09:51

Форум:
18.08.2017, 23:20

Последний вопрос:
18.08.2017, 23:30

Последний ответ:
17.08.2017, 18:54

Последняя рассылка:
18.08.2017, 01:45

Писем в очереди:
0

Мы в соцсетях:

Наша кнопка:

RFpro.ru - здесь вам помогут!

Отзывы о нас:
21.04.2010, 07:11 »
Селеверстов Антон Юрьевич
Большое спасибо за программу и подробные комментарии. [вопрос № 177924, ответ № 260937]

РАЗДЕЛ • Pascal / Delphi / Lazarus

Создание программ на языках Pascal, Delphi и Lazarus.

[администратор рассылки: Зенченко Константин Николаевич (Модератор)]

Лучшие эксперты в этом разделе

Зенченко Константин Николаевич
Статус: Модератор
Рейтинг: 313
mklokov
Статус: 6-й класс
Рейтинг: 106
Вадим Исаев ака sir Henry
Статус: Старший модератор
Рейтинг: 44

Перейти к консультации №:
 

Консультация онлайн # 190573
Раздел: • Pascal / Delphi / Lazarus
Автор вопроса: 08101967 (Посетитель)
Отправлена: 19.02.2017, 20:08
Поступило ответов: 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 для возможности выбора.

Состояние: Консультация закрыта

Здравствуйте, 08101967!

Смотрите приложение:

Код (Pascal) :: выделить код
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.

Удачи!


Консультировал: Зенченко Константин Николаевич (Модератор)
Дата отправки: 28.02.2017, 12:20

Рейтинг ответа:

0

[подробно]

Сообщение
модераторам

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

Мини-форум консультации № 190573

Зенченко Константин Николаевич
Модератор

ID: 31795

# 1

= общий = | 22.02.2017, 10:29 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
08101967:

Что именно у Вас не получается?

08101967
Посетитель

ID: 400264

# 2

= общий = | 22.02.2017, 11:35 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

Как в один TStringList циклом по chart.SeriesCount (серий может быть несколько) заносить данные столбцами (притом, что бы данные с оси X были бы первым столбцом и использовались один раз, они для всех серий одинаковы).

Зенченко Константин Николаевич
Модератор

ID: 31795

# 3

= общий = | 22.02.2017, 18:42 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
08101967:

Можно так:

Код (Pascal) :: выделить код
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.


Delphi 6

• Отредактировал: Зенченко Константин Николаевич (Модератор)
• Дата редактирования: 22.02.2017, 18:43

08101967
Посетитель

ID: 400264

# 4

= общий = | 22.02.2017, 19:21 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

Что то не работает

-----
 Прикрепленный файл:  скачать (RAR) » [229.3 кб]

Зенченко Константин Николаевич
Модератор

ID: 31795

# 5

= общий = | 22.02.2017, 19:49 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
08101967:

Это после нескольких save | load

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

Зенченко Константин Николаевич
Модератор

ID: 31795

# 6

 +1 
 
= общий = | 22.02.2017, 19:54 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
08101967:

Вот тут мой проэкт

-----
 Прикрепленный файл:  скачать (ZIP) » [3.4 кб]

08101967
Посетитель

ID: 400264

# 7

= общий = | 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;

08101967
Посетитель

ID: 400264

# 8

= общий = | 22.02.2017, 20:47 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

Константин, а Вам не кажется, что графики несколько разнятся, из за чего это может быть

-----
 Прикрепленный файл (кликните по картинке для увеличения):

08101967
Посетитель

ID: 400264

# 9

= общий = | 23.02.2017, 06:50 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

Константин, попробовал добавить в Ваш код одну серию от себя, посмотрите что получается.

-----
 Прикрепленный файл:  скачать (RAR) » [225.6 кб]

Зенченко Константин Николаевич
Модератор

ID: 31795

# 10

= общий = | 23.02.2017, 10:17 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
08101967:

© Цитата:
Константин, а Вам не кажется, что графики несколько разнятся, из за чего это может быть

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


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

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



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

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

• Отредактировал: Зенченко Константин Николаевич (Модератор)
• Дата редактирования: 23.02.2017, 10:17

08101967
Посетитель

ID: 400264

# 11

= общий = | 23.02.2017, 10:43 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

Понял, j убрал. А Вы мой файл прикреплённый смотрели. Как бы поправить код?

Зенченко Константин Николаевич
Модератор

ID: 31795

# 12

= общий = | 23.02.2017, 12:37 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
08101967:

© Цитата:
//тут всё зло

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

А в коде:
Код (Pascal) :: выделить код
 for i := -10 to 10 do
. . . 
  for i := 0 to 300 do

а запись ведется по первой серии Form1.Chart1.Series[0].count - 1
Можно по сериям найти максимальный счетчик и при записи в файл, если серия меньше максимума, то писать какой нибудь знак типа "#", а при загрузке когда он встретится на месте серии, её игнорировать.

Зенченко Константин Николаевич
Модератор

ID: 31795

# 13

= общий = | 23.02.2017, 13:10 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

Вот перекромсал:

Код (Pascal) :: выделить код
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.

• Отредактировал: Зенченко Константин Николаевич (Модератор)
• Дата редактирования: 23.02.2017, 13:19

08101967
Посетитель

ID: 400264

# 14

= общий = | 24.02.2017, 15:03 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

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

-----
 Прикрепленный файл:  скачать (RAR) » [226.5 кб]

Зенченко Константин Николаевич
Модератор

ID: 31795

# 15

= общий = | 24.02.2017, 17:29 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
08101967:

© Цитата:
тогда я не понимаю почему так графики разняться, я опять данные немного поменял см. файл

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

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

08101967
Посетитель

ID: 400264

# 16

= общий = | 24.02.2017, 17:44 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

Если Вы про то что один график скажем так начинается от -20, а другой от 0 то я не об этом. Посмотрите в моём примере например на зелёную серию, в исходном примере примерно координате по оси X=50 соответствует координата Y=500, а на сохранённом Y=180.

Зенченко Константин Николаевич
Модератор

ID: 31795

# 17

= общий = | 24.02.2017, 18:18 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
08101967:

Вы посмотрите, где начинаютсяграфики в исходном графике и в результате

08101967
Посетитель

ID: 400264

# 18

= общий = | 24.02.2017, 18:27 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

Ну так я про это и говорю, у Вас ещё до занесения в график, в файл координаты уже начинают неправильно вноситься.

Зенченко Константин Николаевич
Модератор

ID: 31795

# 19

= общий = | 24.02.2017, 20:31 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
08101967:

Вот переделал:

Код (Pascal) :: выделить код
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.


Сразу говорю, это частный случай для целых значений Х.

08101967
Посетитель

ID: 400264

# 20

= общий = | 24.02.2017, 22:03 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

© Цитата:
Сразу говорю, это частный случай для целых значений Х


Это плохо. Константин последняя просьба. Сохрани пожалуйста по серийно, в разные файла (имя файла - имя серии, два столбца - X,Y), а при загрузке добавь компонент TOpenDialog для возможности выбора серии.

Зенченко Константин Николаевич
Модератор

ID: 31795

# 21

= общий = | 27.02.2017, 09:44 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
08101967:

Определитесь с заданием.
Покажите свои наработки.
Все, что нужно, для ответа уже есть в мини-форуме.

 

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Яндекс Rambler's Top100

главная страница | поддержка | задать вопрос

Время генерирования страницы: 0.18688 сек.

© 2001-2017, Портал RFPRO.RU, Россия
Авторское право: ООО "Мастер-Эксперт Про"
Калашников О.А.  |  Гладенюк А.Г.
Версия системы: 7.41 от 25.02.2017
Бесплатные консультации онлайн