Численные значения по осям привязаны строго к графику, который этот компонент отображает. Размерность чисел по осям не соответсвует реальным параметрам. То есть, отображается в 1 компоненте TChart 8 графиков, после построения все они находятся в определенных переделах по значениям, в одной системе координат. Но каждый из графиков несет свою информацию, причем 1 график это, например, Вольты, второй - милиАмперы, возможно ли поменять шкалу по оси ординат в компоненте TChart, не меняя при этом изображение графиков? То есть поменять абстрактыне числа после построения на реальные вольты или амперы и т.д.
ИМХО не стоит в одной системе координат размесщать среднемесячную температуру северных райнов Иднии и среднюю посещаемость форума "Все о Паскале"
Зачем смешивать красное и мокрое ? Может стоит разные графики (для которых требуются разные размерности по осям) рисовать на разных ТЧартах ? Или в разное время ? По моему это более чем логично. Ну или я чего-то не понял.
хорошо, а можно ли вообще менять размерность по осям? например, если у меня 100 значений какого-то параметра, при выведении на TСhart по оси Х будут цифры от 0 до 100, а в реальности каждое значение это
0.1 сек (выборка), то есть мне нужно чтобы шкала выглядела так от 0 до 10 сек, причем графическая информация не должна меняться.
AlexSCH, в дистрибутиве Дельфи (в 6-ой версии, по крайней мере) есть пример использования TeeChart. Так вот в том примере по-моему Features -> Custom Axis Labeling как раз показывает, как менять надписи на осях. Сам график при этом не меняется...
Chart1.BottomAxis.Minimum := 0;
Chart1.BottomAxis.Maximum := 1;
Chart1.BottomAxis.Increment := 0.1;
Ну, например, вот так:
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.
2Volvo
Попробовал твой вариант, не заработало, сколько я ни пытался отследить пошагово, но ниразу указатель не попадал в процедуру TForm1.Chart1GetAxisLabel, то есть не происходило выполнение процедуры, на кнопку жмешь, меняется состояние DefaultLabels и все, или я уже совсем запутался, просвети пожалуйста?
Мне просто интересно, как запустить вот эту процедуру, где меняются значения по осям?
Присоединяю полностью проект (жми на кнопку и смотри на левую ось):
Если надо - говори, присоединю и EXE-шник...
Брекпойнт поставь внутрь процедуры Chart1GetAxisLabel, туда где он стоит у меня. И запусти через F9 ...
Прикрепленные файлы
project.rar ( 2.91 килобайт )
Кол-во скачиваний: 508
Получается что эта процедура выполняется постоянно?
Вообще чудеса.......
В своем проекту не получается.
К твоему проекту добавил еще один TChart, прописал все то же самое для него, в результате созданный тобой работает, а на моем ось не меняется, в чем загвоздка?
Архив проекта я прикрепил.
Прикрепленные файлы
project.rar ( 7.2 килобайт )
Кол-во скачиваний: 468
Нет... Так не пойдет... OnGetAxisLabel - событие, а не простая процедура... Поэтому если ты внутри метода Chart1GetAxisLabel пишешь вот это условие:
if sender = chart2.LeftAxis then begin, то эта попытка изначально обречена на провал. Нужно обрабатывать событие OnGetAxisLabel для второго чарта...
labeltext := floattostr(strtofloat(LabelText) / 1000);
end;
вроде для второго чарта написал отдельную обработку события, но все равно не работает.......((((
Прикрепленные файлы
project1.rar ( 7.27 килобайт )
Кол-во скачиваний: 471
Угу... Написать-то ты написал, только вероятно ВРУЧНУЮ... А вот Дельфи страшно не любит, когда программист лезет в определение класса ДО public и private... Это - территория Дельфи... Так что удаляй то, что добавил сам, в Object Inspector-е для второго чарта выбирай нужное событие и потом его корректируй, и только тогда о нем будет известно программе...
Или просто (ничего не удаляя) зайди в Object Inspector и для второго чарта выбери процедуру обработки события из списка...
Сейчас программа ничего не знает о том, что ты обработку этого события добавил...
Огромное тебе спасибо Volvo, заработало так как надо.
кстати как быть с BottomAxis, если значение больше 999, у меня например график по оси х заканчивается цифрами 2146, по нажатию на кнопку выскакивает 2 146 is not a valid floating point...., я так понял, что значение возвращается с пробелом между 2 и 146, поэтому она (программа) не понимает этого значения ???
Удалить разделитель тысяч, и потом работать со строкой:
вместо
labeltext := floattostr(strtofloat(LabelText) / 1000);
labeltext := floattostr(strtofloat(
{ Это как раз уберет из оригинального LabelText разделитель тысяч }
stringreplace(LabelText, ThousandSeparator, '', [rfreplaceall])
) / 1000);
Еще раз спасибо огромное за помощь.
Еще вопрос, как присвоить содержимое переменной типа String названию оси.
Я делал так:
Chart1.BottomAxis.Title.Caption := gerc;
В ходе выполнения программы я даю названия осям, при повторной загрузке файла с графической информацией, при отображении на его осях появляются новые названия, а также остаются старые(от прошлой графической информации), как от этого избавится? может быть 2 раза перестраивать график, 1 раз без названий (загнать в область названий пустоту), 2 раз уже с новыми названиями. Я делал так, но ничего не получилось, все равно остаются старые названия:
Ну, это смотря как ты "повторно загружаешь файл с графической информацией". Код, при котором не происходит корректного изменения Axis.Title.Caption - в студию...
Думал, думал как же это корректно выложить...... пришел к выводу что приклепу весь свой проект, в архиве с проектом есть файл '10', при запуске проги его и нужно открывать. Попробуй 2 раза его открыть, сразу добавляется название в ось Y (появляется лишняя буква В), а ось Х почему-то увеличивается в 2 раза..........
p.s. Файл PRB.EXE также нужен для корректной работы (в смысле не спеши его стирать ).
2Volvo извините за бардак в проекте..............
Прикрепленные файлы
_____.rar ( 40.93 килобайт )
Кол-во скачиваний: 410
По поводу
Chart1.Series[0].AddXY(t, strtoint('$'+Mat[j]));, а кто при входе в процедуру
procedure TForm1.N4Click(Sender: TObject);будет T сбрасывать? Оно же накапливается, и при третьей загрузке длина оси X утроится по сравнению с первой, если T не обнулить
begin
If OpenDialog1.Execute
then begin
t := 0; { <-- Здесь !!! }
...
Chart1.LeftAxis.Title.Caption:='';
Chart1.Repaint;
Chart1.LeftAxis.Title.Caption:=Ch1; { <-- !!! }
Спасибо, разобрался, заработало
У меня еще вопрос.
Как можно поменять масштаб дополнительной оси.
Дополнительную ось я создавал так
AlexSCH, во-первых, картинку присоедини сюда (ее невозможно посмотреть, сервер не отвечает), а во-вторых, если даешь код, так давай так, чтобы было понятно, что чему равняется...
YPercent это что такое и чему равно, например?
Вот архив, с программой.
YPercent это из демо TeeChart к делфе, где оси кординат могут перемещатся, с помошью таймера, я таймер отключил, просто переменная осталась.
Прикрепленные файлы
5.rar ( 22.65 килобайт )
Кол-во скачиваний: 399
AlexSCH, а где Unit2 ?
кмх ... Попробуй использовать циклы в программе
j:=1;
Chart1.Series[0].AddXY(t, strtoint('$'+Mat[j]));
t:=t+1;
j:=2;
Chart1.Series[0].AddXY(t, strtoint('$'+Mat[j]));
t:=t+1;
j:=3;
Chart1.Series[0].AddXY(t, strtoint('$'+Mat[j]));
t:=t+1;
j:=4;
Chart1.Series[0].AddXY(t, strtoint('$'+Mat[j]));
t:=t+1;
j:=5;
Chart1.Series[0].AddXY(t, strtoint('$'+Mat[j]));
t:=t+1;
j:=6;
Chart1.Series[0].AddXY(t, strtoint('$'+Mat[j]));
t:=t+1;
j:=7;
Chart1.Series[0].AddXY(t, strtoint('$'+Mat[j]));
t:=t+1;
j:=8;
Chart1.Series[0].AddXY(t, strtoint('$'+Mat[j]));
t:=t+1;
t,tt,ttt,tttt,ttttt:integer;
r,zz,zs,zss,zx,uu,uu2,ww,zz1,zx1,zs1,zss1,zz2,xx,xx2,yy,yy2,yy1,
yy12,yyy,yyy2,www,www2,laxis,baxis,qaz,gerc44:real;
Unit 2 добавил.
Файл с информацией в архиве под именем "10"
Согласен, код корявый. Добавление дополнительной оси происходит в самом конце кода вот этой процедурой procedure TForm1.Series1AfterDrawValues(Sender: TObject);
Действительно никто не знает как поменять масштаб на второй оси??? или это действительно нереально??
Да ты покажи, НА ЧТО ты хочешь поменять? Как это выглядеть должно??? Телепаты кончились.
И программу подправь, а то она у тебя через раз дает ошибку обращения к TXT файлу, сколько можно ее перезапускать?
Я переделал вид программного окна в графическом редакторе, должно выглядеть вот так как на приклепленном изображении, то есть вторая ось Y представлена в другом масштабе. Как добавленную ось Y перевести в другой масштаб? (код на дополнительную ось Y представлен в пердыдущих постах, проблема в том, что дополнительная ось Y по масштабу полностью соответствует начальной оси Y, а нужно чтобы их масштабы отличались)
Эскизы прикрепленных изображений
Помогите пожалуйста с моей проблемой...
кусок кода:
....
var
cicli:integer;
a,b:double;
Matrix6, Matrix1: array of integer;
begin
setlength(Matrix6, 6);
setlength(Matrix1, 6);
Matrix6[1]:=2; Matrix6[2]:=51; Matrix6[3]:=53; Matrix6[4]:=23; Matrix6[5]:=1;
Matrix1[1]:=14; Matrix1[2]:=52; Matrix1[3]:=13; Matrix1[4]:=5; Matrix1[5]:=23;
for cicli:=1 to 5 do
begin
a:=Matrix6[cicli];
b:=Matrix1[cicli];
unit4.Form4.Chart1.SeriesList[0].AddXY(a,b,'',clRed);
end;
unit4.Form4.Chart1.LeftAxis.TitLE.Caption:='KTG';
unit4.Form4.Chart1.BottomAxis.Title.Caption:='MR';
unit4.Form4.ShowModal;
...
В общем, проблема в том, что график строится не в том порядке, в каком я ему добавляю точки, а по возрастанию оси Х...т.е. 1,2,23,51,53... а не 2,51,53,23,1. Как разрешить проблему?
Why not settling on games that is fun and at the same time your earning. Well it'll make suspense because the game is well but dude just try it and it gave me hope while pandemic is real rn. https://wazmagazine.com/casino-jobs-and-their-roles/
А мне вот не очень нравится работать программистом из-за того, что там много не заработаешь. Я предпочитаю зарабатывать деньги играя в онлайн https://almazcasino.live/ .Онлайн-казино Almaz — это инновационная платформа, использующая технологию искусственного интеллекта (ИИ), чтобы предложить игрокам больше возможностей для выигрыша, а также предоставить им безопасный и приятный опыт.
Круто. В интернете сейчас можно найти полезные возможности. Я вот пробовал сыграть в https://nadengikazino.com/ перейдя по этой ссылке, после чего вы сможете найти хорошие возможности прямо сейчас. Заработай сейчас большое количество денег прямо сейчас, а игровые автоматы на деньги прямо сейчас могут дать крутые бонусы.
Я зарабатываю деньги на том, что играю в казино на рублях: https://mtstv.info/bet.php . Лучшие онлайн-казино на рубли — это те, которые предлагают щедрый бонус и имеют хорошую службу поддержки. Играть в таких казино можно с минимальными вложениями!