IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Работа с осями в Tchart
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 36
Пол: Мужской

Репутация: -  0  +


Численные значения по осям привязаны строго к графику, который этот компонент отображает. Размерность чисел по осям не соответсвует реальным параметрам. То есть, отображается в 1 компоненте TChart 8 графиков, после построения все они находятся в определенных переделах по значениям, в одной системе координат. Но каждый из графиков несет свою информацию, причем 1 график это, например, Вольты, второй - милиАмперы, возможно ли поменять шкалу по оси ординат в компоненте TChart, не меняя при этом изображение графиков? То есть поменять абстрактыне числа после построения на реальные вольты или амперы и т.д.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


ИМХО не стоит в одной системе координат размесщать среднемесячную температуру северных райнов Иднии и среднюю посещаемость форума "Все о Паскале" smile.gif

Зачем смешивать красное и мокрое ? Может стоит разные графики (для которых требуются разные размерности по осям) рисовать на разных ТЧартах ? Или в разное время ? По моему это более чем логично. Ну или я чего-то не понял.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 36
Пол: Мужской

Репутация: -  0  +


хорошо, а можно ли вообще менять размерность по осям? например, если у меня 100 значений какого-то параметра, при выведении на TСhart по оси Х будут цифры от 0 до 100, а в реальности каждое значение это
0.1 сек (выборка), то есть мне нужно чтобы шкала выглядела так от 0 до 10 сек, причем графическая информация не должна меняться.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






AlexSCH, в дистрибутиве Дельфи (в 6-ой версии, по крайней мере) есть пример использования TeeChart. Так вот в том примере по-моему Features -> Custom Axis Labeling как раз показывает, как менять надписи на осях. Сам график при этом не меняется...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Chart1.BottomAxis.Minimum := 0;
Chart1.BottomAxis.Maximum := 1;
Chart1.BottomAxis.Increment := 0.1;


Длч нижней оси :

- максимальное значение = 1
- минимальное значение = 0
- шаг = 0.1

Навеняка все это можно менять и с помощью вкладки Scales.

Все это мне стало ясно, когда я побывал тут.

Зайди посмотри, там есть таблица свойств космонента TChart, и картинки есть :D


Эскизы прикрепленных изображений
Прикрепленное изображение

--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 36
Пол: Мужской

Репутация: -  0  +


Цитата
Код
Chart1.BottomAxis.Minimum := 0;

  Chart1.BottomAxis.Maximum := 1;

  Chart1.BottomAxis.Increment := 0.1;


эти команды просто меняют масштаб и шаг, и все (то есть график меняется). А мне нужно заменить цифры абстрактные (например 0....100) на реальные (коэффициенты пересчета есть) чтобы шкала оси выглядела не 0...100, а, например, 0...10, и график не должен меняться.

2Volvo пытался разобратся с компонентом AxiLabel что в демонстрациях, так и не понял как можно заменить, например цифру 100 на 0.1 и чтобы график не менялся. Привожу текст этого компонента, может кто-то из вас разберется.....
Код

{******************************************}
{    TeeChart. TChart Component            }
{ Copyright (c) 1995-2001 by David Berneda }
{    All Rights Reserved                   }
{******************************************}
unit uaxislab;

interface

{ This Sample Project shows how to set the Axis Labels at specific Axis
  positions.
  The key is the Chart.OnGetNextAxisLabel event.
  This event is called continuosly for each Axis Label until user decides
  to stop.
  At each call, you can specify the exact Axis value where a Label must be
  drawn.

  In this example, this event is used to set the BottomAxis labels to the
  first (1) day in month:   1/1/96,  2/1/96, 3/1/96..... 12/1/96

  This don't needs necessarily to be datetime values.
  You can also set the Axis Labels in non-datetime axis.

  WARNING:
    Remember to set the Stop boolean variable to TRUE when no more labels are
    needed.
    Remember also that using this event will NOT calculate Label used space or
    any Font size adjustment.
    TeeChart Axis will draw all labels you specify.
}
uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, Chart, Series, ExtCtrls, StdCtrls, Teengine, Buttons,
  TeeProcs;

type
  TAxisLabelsForm = class(TForm)
    Chart1: TChart;
    LineSeries1: TLineSeries;
    Panel1: TPanel;
    RadioGroup1: TRadioGroup;
    PointSeries1: TPointSeries;
    BitBtn3: TBitBtn;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure RadioGroup1Click(Sender: TObject);
    procedure Chart1GetNextAxisLabel(Sender: TChartAxis;
      LabelIndex: Longint; var LabelValue: Double; var Stop: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
    DefaultLabels:Boolean;
  end;

implementation

{$R *.dfm}

procedure TAxisLabelsForm.FormCreate(Sender: TObject);
var t:Longint;
begin
  DefaultLabels:=False;  { <-- boolean variable to show or not the demo }

  LineSeries1.Clear;
  PointSeries1.Clear;
  for t:=1 to 100 do
  Begin
    LineSeries1.AddXY( Date+t, 200+Random(700),'',clTeeColor);  { <-- some random points }
    PointSeries1.AddXY( Date+t, 200+Random(700),'',clTeeColor);
  end;
end;

procedure TAxisLabelsForm.RadioGroup1Click(Sender: TObject);
begin
{ Choose between default and custom labeling. }
  DefaultLabels:=RadioGroup1.ItemIndex=0;
  Chart1.Repaint;  { <-- repaint chart to see changes }
end;

procedure TAxisLabelsForm.Chart1GetNextAxisLabel(Sender: TChartAxis;
  LabelIndex: Longint; var LabelValue: Double; var Stop: Boolean);

var year,month,day:Word;
begin
  if not DefaultLabels then
  Begin
    if Sender=Chart1.BottomAxis then
    Begin
      { ***************************** }
      { WARNING:

          Setting this axis increment:

          Chart1.BottomAxis.Increment := DateTimeStep[ dtOneMonth ];

          and...

          Chart1.BottomAxis.ExactDateTime := True;

          Eliminates the need for the following code.
      }
      { ***************************** }

     { LabelValue has the "candidate" value where the Axis label will be painted. }
      DecodeDate(LabelValue,year,month,day);
      { we force that value to be the first day in month }
      Day:=1;
      Month:=Month+1;
      if Month>12 then
      Begin
        Month:=1;
        Year:=Year+1;
      end;
      { Then we set the preferred Label value }
      LabelValue:=EncodeDate(year,month,day);

    end
    else
    if Sender=Chart1.LeftAxis then
    Begin
      { In this example, we want the Vertical Left Axis to show
        labels only for positive values, starting at zero and
        with 250 label increment.
      }
      if LabelValue>=250 then LabelValue:=LabelValue+250
                         else LabelValue:=250;
    End;
    { we want more labels !! }
    Stop:=False;
  end;
end;


end.


Зарнее спасибо.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Ну, например, вот так:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Spin, OleCtnrs, TeEngine, Series, ExtCtrls, TeeProcs,
Chart;

type
TForm1 = class(TForm)
Chart1: TChart;

Button1: TButton;
LineSeries1: TLineSeries;
PointSeries1: TPointSeries;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Chart1GetAxisLabel(Sender: TChartAxis; Series: TChartSeries;
ValueIndex: Integer; var LabelText: String);
private
{ Private declarations }
public
{ Public declarations }
DefaultLabels: Boolean;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
begin
defaultLabels := not DefaultLabels;
Chart1.Repaint;
end;

procedure TForm1.FormCreate(Sender: TObject);
var t: LongInt;
begin
DefaultLabels:=True;

LineSeries1.Clear;
PointSeries1.Clear;
for t:=1 to 20 do
Begin
LineSeries1.AddXY( Date+t, 200+Random(700),'',clTeeColor); { <-- some random points }
PointSeries1.AddXY( Date+t, 200+Random(700),'',clTeeColor);
end;
end;

procedure TForm1.Chart1GetAxisLabel(Sender: TChartAxis;
Series: TChartSeries; ValueIndex: Integer; var LabelText: String);
begin
if not defaultlabels then

{ А вот из-за чего, собственно, это и делалось: }
if sender = chart1.LeftAxis then begin
labeltext := floattostr(strtofloat(LabelText) / 1000);
end;
end;

end.


Обрати внимание, я не использовал OnGetNextAxisLabel, а использовал OnGetAxisLabel... wink.gif

В списке Uses могут быть лишние модули, не пугайся, я просто добавлял этот код в другой проект...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Новичок
*

Группа: Пользователи
Сообщений: 36
Пол: Мужской

Репутация: -  0  +


2Volvo
Попробовал твой вариант, не заработало, сколько я ни пытался отследить пошагово, но ниразу указатель не попадал в процедуру TForm1.Chart1GetAxisLabel, то есть не происходило выполнение процедуры, на кнопку жмешь, меняется состояние DefaultLabels и все, или я уже совсем запутался, просвети пожалуйста?
Мне просто интересно, как запустить вот эту процедуру, где меняются значения по осям?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Присоединяю полностью проект (жми на кнопку и смотри на левую ось):

Если надо - говори, присоединю и EXE-шник...

Прикрепленное изображение

Брекпойнт поставь внутрь процедуры Chart1GetAxisLabel, туда где он стоит у меня. И запусти через F9 ...


Прикрепленные файлы
Прикрепленный файл  project.rar ( 2.91 килобайт ) Кол-во скачиваний: 508
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Новичок
*

Группа: Пользователи
Сообщений: 36
Пол: Мужской

Репутация: -  0  +


Получается что эта процедура выполняется постоянно?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Цитата(Delphi Help)
OnGetAxisLabel Event

Declaration
property OnGetAxisLabel : TAxisOnGetLabel
Description
An Event is triggered for each Axis Label painted. There are two different uses for OnGetAxisLabel:
<...>

Таким образом ответ на твой вопрос - "нет", потому, что эта процедура выполняется перед каждой отрисовкой метки оси (кстати, как раз удобно для случая, если тебе понадобится подменить эту метку), но не постоянно. Попробуй убрать Chart1.Repaint из обработки нажатия на кнопку, и ты в этом убедишься.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Новичок
*

Группа: Пользователи
Сообщений: 36
Пол: Мужской

Репутация: -  0  +


Вообще чудеса....... blink.gif
В своем проекту не получается.
К твоему проекту добавил еще один TChart, прописал все то же самое для него, в результате созданный тобой работает, а на моем ось не меняется, в чем загвоздка?

Архив проекта я прикрепил.


Прикрепленные файлы
Прикрепленный файл  project.rar ( 7.2 килобайт ) Кол-во скачиваний: 468
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






Нет... smile.gif Так не пойдет... OnGetAxisLabel - событие, а не простая процедура... Поэтому если ты внутри метода Chart1GetAxisLabel пишешь вот это условие:

    if sender = chart2.LeftAxis then begin
labeltext := floattostr(strtofloat(LabelText) / 1000);
end;
, то эта попытка изначально обречена на провал. Нужно обрабатывать событие OnGetAxisLabel для второго чарта...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Новичок
*

Группа: Пользователи
Сообщений: 36
Пол: Мужской

Репутация: -  0  +


вроде для второго чарта написал отдельную обработку события, но все равно не работает.......((((


Прикрепленные файлы
Прикрепленный файл  project1.rar ( 7.27 килобайт ) Кол-во скачиваний: 470
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Гость






Угу... Написать-то ты написал, только вероятно ВРУЧНУЮ... А вот Дельфи страшно не любит, когда программист лезет в определение класса ДО public и private... Это - территория Дельфи... Так что удаляй то, что добавил сам, в Object Inspector-е для второго чарта выбирай нужное событие и потом его корректируй, и только тогда о нем будет известно программе...

Или просто (ничего не удаляя) зайди в Object Inspector и для второго чарта выбери процедуру обработки события из списка...

Сейчас программа ничего не знает о том, что ты обработку этого события добавил...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Новичок
*

Группа: Пользователи
Сообщений: 36
Пол: Мужской

Репутация: -  0  +


Огромное тебе спасибо Volvo, заработало так как надо. good.gif


кстати как быть с BottomAxis, если значение больше 999, у меня например график по оси х заканчивается цифрами 2146, по нажатию на кнопку выскакивает 2 146 is not a valid floating point...., я так понял, что значение возвращается с пробелом между 2 и 146, поэтому она (программа) не понимает этого значения ???
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Гость






Удалить разделитель тысяч, и потом работать со строкой:

вместо
      labeltext := floattostr(strtofloat(LabelText) / 1000);


делай что-то вроде:
      labeltext := floattostr(strtofloat(

{ Это как раз уберет из оригинального LabelText разделитель тысяч }
stringreplace(LabelText, ThousandSeparator, '', [rfreplaceall])

) / 1000);
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Новичок
*

Группа: Пользователи
Сообщений: 36
Пол: Мужской

Репутация: -  0  +


Еще раз спасибо огромное за помощь.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Новичок
*

Группа: Пользователи
Сообщений: 36
Пол: Мужской

Репутация: -  0  +


Еще вопрос, как присвоить содержимое переменной типа String названию оси.
Я делал так:
Код
gerc:=gerc+(help[i]);
i:=i+1;
Chart1.BottomAxis.Title:=gerc;

Но выдает ошибку про несовместимость форматов TCharAxisTitile и String, какой космандой можно перевести string в этот TCharAxisTitile ?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Гость






Chart1.BottomAxis.Title.Caption := gerc;
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 20.04.2024 2:40
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name