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

> ВНИМАНИЕ!

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

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

 
 Ответить  Открыть новую тему 
> TChart, LeftAxis, метки по оси У для нескольких, динамически создающихся, серий
сообщение
Сообщение #1


Новичок
*

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

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


Проблема в следующем: есть TChart и несколько серий, количество которых заранее неизвестно, поэтому серии создаются динамически по необходимости. Каждая серия - это графическое представление сигнала. Каждый сигнал имеет собственное имя. Имена содержатся в массиве, например: Name_of_signals: array [1..N] of string. Нужно, чтобы по оси У (LeftAxis) напротив каждого сигнала стояло его имя (как на рис.2). Используя событие OnGetAxisLabel ,

procedure TForm1.Chart1GetAxisLabel(Sender: TChartAxis;
Series: TChartSeries; ValueIndex: Integer; var LabelText: String);
var i:integer;
begin
if (Sender=Chart1.LeftAxis)and(ValueIndex>-1)
then LabelText:=Name_of_signals[i]; //i здесь по идее номер серии (сигнала)
end;


метка появляется только напротив первого сигнала, т.е только для первой серии (рис.1).
Как сделать, чтобы напротив каждой серии стояло нужное имя? Что-то никак не получается...
На рисунках ниже показано как примерно это должно выглядеть.

Прикрепленное изображениеПрикрепленное изображение
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Показывай, как создаются серии динамически (в частности - каким образом получается расположение серий "одна под другой"). К тому же в приведенном фрагменте кода i - локальная переменная, которой нигде не присваивается никакое значение, там мусор, а не номер серии.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

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

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


Цитата(volvo @ 24.07.2009 2:00) *

К тому же в приведенном фрагменте кода i - локальная переменная, которой нигде не присваивается никакое значение, там мусор, а не номер серии.


Да это понятно, я просто хотела на простом примере разобраться, написала так просто для вида smile.gif
Реальная же программа гораздо объёмнее, все данные считываются с текстового файла, определённого вида. Наверное, в ней будет сложно разобраться, но если это так принципиально, то, конечно, выложу.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Новичок
*

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

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


Выкладываю образец файла и программу.
Файл текстовый, каждому столбцу соответствует один сигнал, каждой строке - состояние сигналов на определённый момент времени, имена сигналов в начале файла в комментариях (/*.....*/), т.е имя первого сигнала Р3.7, второго Р3.6, третьего Р3.5, ... , последнего RST; всего 38 столбцов - 38 сигналов.
Программа осуществляет графическое представление этих сигналов по определённым правилам в зависимости от символов, которыми представлен сигнал. По оси Х моменты времени, а вот по У должно быть соответствующее имя для каждого сигнала. Это пока и не получается осуществить. Сейчас в программе просто нумерация сигналов по оси У, а внизу легенда, где прописаны имена...
Для просмотра файла лучше всего использовать WordPad или открывать через FAR.


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


Гость






Как-то вот так:
1) добавляешь
procedure TForm1.FormCreate(Sender: TObject);
begin
Fname:='';
SpinEdit1.MinValue:=2;
SpinEdit1.MaxValue:=50000;
Chart1.LeftAxis.LabelsAlternate := True; // <--- Вот эту строку
end;
, чтобы включить альтернативное отображение меток (они будут отображаться в 2 столбца, если не хватает места отобразить ВСЕ в одном столбце. Попробуй, увидишь...)
2) и в OnGetAxisLabel - вот такая "уличная магия":
procedure TForm1.Chart1GetAxisLabel(Sender: TChartAxis; Series: TChartSeries;
ValueIndex: Integer; var LabelText: string);
var value: double;
begin
if sender = chart1.LeftAxis then begin
value := StrToFloat(LabelText);
if (Frac(value) < 0.25) and (value > 0.5) then begin
labeltext := Name_of_signals[Trunc(value)];
end;
end;
end;
Естественно, что Name_of_signals должна быть описана глобально, а не локально в TForm1.Button1Click. Просто перенеси определения мессива на несколько строк выше. Да, и отключи Легенду, она только место занимает. Теперь она тебе не нужна. Так же, как и заполнение Chart1.Series[j-1].Title

Вот так это выглядит:
Прикрепленное изображение
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Новичок
*

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

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


Chart1.LeftAxis.LabelsAlternate := True;
Не было у меня для LeftAxis свойства LabelsAlternate, пришлось просто уменьшить шрифт, чтобы всё уместилось.
Сути это не изменило, всё получилось smile.gif

volvo, огромное Вам спасибо give_rose.gif

Сообщение отредактировано: *kitty* -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





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