Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Delphi: Разработка компонентов > Компонент для построения линейных графиков


Автор: sansans 23.09.09, 08:46
Конечно, в Delphi есть достаточно мощный компонент TChart для построения любых графиков.
Но бывает необходимо что-то более простое без претензий и особых наворотов.

Предлагается вашему вниманию компонент для Delphi, который рисует линейные графики.

Возможности.

- Кривых на графике может быть более одной (кривые выводятся только в run-time заполнением массивов значений точек).
- Автомасштабирование.
При добавлении точек в кривую и выходе их значений за установленные максимум или минимум по обеим осям происходит пересчет максимальных и/или минимальных значений.
- Ручное масштабирование графика мышкой или с клавиатуры (после формирования всех кривых).
- Панорамирование графика при масштабе > 100% - сдвиг по всем четырем направлениям также мышкой или с клавиатуры.
- "Датализация" - два режима отображения кривых.
- Отображение значений точек в виде хинта при нахождении курсора мыши около точки.
- Наличие "навигатора" - отдельное полупрозрачное окнце, отображающее весь график и которое можно таскать мышкой по экрану. Есть возможность показывать или скрывать это окно.
- Могут изменяться: толщина кривых, цвет компонента, цвет кривых, цвет осей, цвет и видимость сетки графика.

При перерисовке (а это может происходить очень часто, например, при панорамировании, добавлении точек) график не дергается.

Исходные тексты и пример использования компонента прилагается.

Автор: arj99 23.09.09, 09:04
Цитата sansans @
Предлагается вашему вниманию компонент для Delphi

Читая такое в первую очередь хочется увидеть что это такое, а потом уже если понравится как-то с этим связываться.
Ты бы скриншоты приложил...

Автор: sansans 23.09.09, 09:57
Не понял как на этом форуме прикреплять более одного файла, поэтому только один скришот даю.
А еще снимки можно посмотреть здесь: http://san-46.narod.ru/GraphLinear.htm

Автор: DimaBr 23.09.09, 11:33
>[Error] Unit1.pas(39): Undeclared identifier: 'TFormatSettings'

Автор: sansans 23.09.09, 11:52
Какая версия Delphi? Пример и компонент компилировался в D7. Там все в порядке. TFormatSettings объявлен в SysUtils.

Автор: DimaBr 23.09.09, 11:55
Delphi 6

Добавлено
Единственное место где нашёл версию Delphi - это на главной странице сайта внизу

Автор: sansans 23.09.09, 12:03
Ну, чем я помогу? Насколько помню в D6 тоже есть TFormatSettings. Можно и выбросить из Unit1 эту структуру. Тогда придется менять функцию StrToFloatDef (тоже реализована в SysUtils), с помощью которой происходит преобразование чисел, читаемых из текстового файла.
Или не применять тот текстовый файл (ht_02.htl). Он всего лишь для примера большого количества точек графика.

"Единственное место где нашёл версию Delphi - это на главной странице сайта внизу". Так все же есть? :)

Пример есть пример. Можно сделать свой проект и разместить на его форме компонент. Он же не сложный в использовании.

Автор: DimaBr 23.09.09, 12:09
Не корекнтное отобажение первого графика в начале, где маленькие значения.
Маштаб не соответствует отображаемым данным

Автор: sansans 23.09.09, 12:11
А конкретно, в чем не корректность?
И, опять же, как определено, что "масштаб не соответствует..."?
А то хотелось бы исправить, только непонятно что.

Автор: DimaBr 23.09.09, 12:17
Не удаётся посмотреть на начальные значения, поскольку иасштаб очень большой а значения очень маленькие. Приходится многократно увеличивать изображение, при этом оно увеличивается и по вертикили и по горизонтали и в итоге, когда всё же изображение достигло более-менее читабельного размера (M=9000) ширина при этом огромная.

Автор: sansans 23.09.09, 12:25
Особенность данных, которые отображаются на графике.
Для таких случаях, видимо, надо иметь возможность изменять масштаб отдельно по горизонтальной и вертикальной осям.
Но это уже в другой жизни. Для моих приложений компонент и с его теперешними возможностями достаточен.

Автор: DimaBr 23.09.09, 12:42
Форма с вашим компонентом - 422 кб
Форма с TChart - 600 кб

Лично я выбираю TChart, поскольку возможности просто огромные, а размер не на много больше. Думаю что изобретение велосипеда никому не нужно.

Автор: sansans 23.09.09, 12:51
Каждый имеет право на собственное мнение. Спасибо за конструктивную критику.
Но, ИМХО, не в размере дело, а в простоте. Кому то может и пригодится именно в таком воплощении.
Как было отмечено, для моих проектов компонент был нужен именно в этой реализации.

Автор: ttiger 26.09.09, 10:40
Цитата sansans @

- Кривых на графике может быть более одной (кривые выводятся только в run-time заполнением массивов значений точек).
- Автомасштабирование.

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

Автор: sansans 27.09.09, 04:22
В текстовом файле примера, из которого извлекаются точки, этих точек 1433.
Увеличил я их количество в четыре раза, получилось более 5700 точек.
И что в первом, что во втором, никакой разницы в скорости вывода не заметил.
Наверное, скорость еще от железа зависит.
Алгоритм выборки точек в конкретных задачах тоже ведь может быть медленным, он и будет узким местом при отображении кривых во время выполнения. А сам компонент выводит точки максимально быстро.

Автор: DimaBr 28.09.09, 04:55
> TChart тормозит жутко
Для такого количества следует использовать BeginUpdate/EndUpdate

Простой тест
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    var a,b,i: cardinal;
    const n = 100000;
    begin
      a := Gettickcount;
      Series1.BeginUpdate;
      for i := 0 to N do
        Series1.AddXY(i,sin(i/n*2*pi));
      Series1.EndUpdate;
      b := Gettickcount;
      caption := format('%d',[b-a]);
    end;

Если заремить BeginUpdate/EndUpdate результат 187 милисекунд, иначе 32 милисекунды. Мне кажется вполне прилично для 100000 точек

Автор: sansans 19.02.13, 04:01
Слегка модифицированный компонент для построения линейных графиков.
Из состава убран модуль для отображения навигационного окошка (форма навигации
реализована внутри основного модуля).
Возможность вставлять легенду (текст) по левому обрезу прямоугольника компонента (для оси Y).
Шрифт, при этом поворачивается на 90 градусов.

Взять можно здесь.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)