Компонент по отображению графиков

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Компонент по отображению графиков

Сообщение TEvg » 15.09.2011 06:45:51

Написал компонент для отображения графиков.
Поскольку он унаследован от TImage, то сохраняет в файле формы все полагающиеся для TImage свойства, в том числе саму картинку Picture.Data. Которую сохранять вообще-то нет необходимости. Можно ли исключить сохранение в lfm/dfm каких-либо свойств?

http://tevg-2011.narod2.ru
Последний раз редактировалось TEvg 20.10.2011 12:37:25, всего редактировалось 3 раз(а).
TEvg
новенький
 
Сообщения: 15
Зарегистрирован: 14.07.2011 06:53:50

Re: Компоненты и примеры

Сообщение Ask » 15.09.2011 12:10:07

TEvg писал(а):Написал компонент для отображения графиков.

Интересно. В чём преимущства перед стандартным TChart?

TEvg писал(а):Поскольку он унаследован от TImage, то сохраняет в файле формы все полагающиеся для TImage свойства, в том числе саму картинку Picture.Data. Которую сохранять вообще-то нет необходимости. Можно ли исключить сохранение в lfm/dfm каких-либо свойств?

По идее надо наследовать от TCustomImage и не публиковать лишние свойства.
Ask
постоялец
 
Сообщения: 163
Зарегистрирован: 25.12.2008 03:51:37

Re: Компоненты и примеры

Сообщение TEvg » 16.09.2011 08:24:08

По идее надо наследовать от TCustomImage и не публиковать лишние свойства.


Гениально! Легким движением руки, брюки превращаются.. и всё работает.
Стал думать, как же я раньше не догадался. Оказывается в Дельфи нет класса TCustomImage. Там TImage порожден от TGraphicControl.
Компонент ведь первоначально писался для Дельфи, потом был переделан под Лазарус, а потом обратно для Дельфи. Теперь чтобы сделать версию для Дельфей, пришлось залезть в потроха TImage и повыдергать нужное. Так что задача решена. Выкладываю версию 1.0.4, в которой вышеупомянутые недостатки устранены, плюс исправлена пара мелких ошибок.

Я не берусь подробно сравнивать компонент с TChart.
Я стал его писать столкнувшись с ситуацией, когда с другими компонентами, включая TChart я не мог получить нужной мне картинки.
Я хотел написать компонент, который позволял отрисовывать любое нужное мне количество кривулек. И чтобы для каждой можно было индивидуально задать координатную область вывода и свою сетку со своим шагом и свои координатные оси со своими шкалами и расположить их там где мне захочется. И чтобы можно было скармливать данные разных типов - и целые и вещественные и дата-время и чтобы по одной оси можно было задать один тип, а по другой-другой.
И чтобы масштабировалось всё автоматически, простым изменением границ.
Мне также хотелось управлять по своему желанию надписями на шкалах, особенно при указании времени - когда надо показать год - показать год, когда надо миллисекунды - милисекунды.
Последний раз редактировалось TEvg 16.09.2011 17:12:04, всего редактировалось 1 раз.
TEvg
новенький
 
Сообщения: 15
Зарегистрирован: 14.07.2011 06:53:50

Re: Компоненты и примеры

Сообщение Ask » 16.09.2011 12:29:53

Может, положить в архив пакет? А то пример не собирается, приходится руками пересоздавать.

Вот то же самое на TChart.
Из недостатков -- нельзя оси расположить по центру и стрелочки что-то кривоваты при таких острых углах -- надо будет поправить.
Из преимуществ -- есть настоящие функции, работает масштабирование (рисовать прямоугольник левой кнопкой, как в Дельфи),
меньше тормозит при перерисовке.

Требует свежего Lazarus, на 0.9.30 скорее всего не заработает.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Ask
постоялец
 
Сообщения: 163
Зарегистрирован: 25.12.2008 03:51:37

Re: Компоненты и примеры

Сообщение TEvg » 16.09.2011 17:15:27

Ask писал(а):Может, положить в архив пакет? А то пример не собирается, приходится руками пересоздавать.


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

Добавлено спустя 14 минут 46 секунд:
Требует свежего Lazarus, на 0.9.30 скорее всего не заработает.


Да, на 30-й версии не заработал. А 31-я похоже требует от линукса 38-го ядра. Я когда пытался поставить, долго боролся с зависимостями пока не закопался очень глубоко. Остался на 30-й. Я и на неё перешел недавно, раньше сидел на 28-й.

Из преимуществ -- есть настоящие функции


Чуток подробнее?

работает масштабирование (рисовать прямоугольник левой кнопкой, как в Дельфи)


Это да. Я когда думал над этим делом, задумался - как удобно делать обратное масштабирование? Т.е. не увеличивать выделенную область а уменьшать её обратно. И как-то удобного для пользователя способа в голову не пришло. Поэтому пока не стал делать и прямое.
Последний раз редактировалось TEvg 22.09.2011 19:47:01, всего редактировалось 1 раз.
TEvg
новенький
 
Сообщения: 15
Зарегистрирован: 14.07.2011 06:53:50

Re: Компонент по отображению графиков

Сообщение Ask » 16.09.2011 18:49:26

TEvg писал(а): А 31-я похоже требует от линукса 38-го ядра. Я когда пытался поставить, долго боролся с зависимостями пока не закопался очень глубоко.

Ого. Очень странно, при чём тут, казалось бы, ядро? Что за дистрибутив?

TEvg писал(а):
Из преимуществ -- есть настоящие функции
Чуток подробнее?

См. pas-файл из моего примера -- пользователь указывает только событие, вычисляющее функцию,
а компонента сама её отрисовывает сообразно текущему масштабу.

TEvg писал(а): как удобно делать обратное масштабирование?

TChart поддерживает два режима -- либо как в Дельфи (то есть рисуем прямоугольник в обратном направлении),
либо просто назначаем увеличение/уменьшение на разные кнопки мыши или модификаторы, как в графических редакторах.
Ask
постоялец
 
Сообщения: 163
Зарегистрирован: 25.12.2008 03:51:37

Re: Компонент по отображению графиков

Сообщение TEvg » 22.09.2011 19:48:55

Представляю версию 1.0.5
Добавлено отображение легенды.

ЗЫ. Что за тупое ограничение на выкладывание файлов? 30 кил выложить не могу. Приходится всё время старые стирать.

Добавлено спустя 15 часов 37 минут 13 секунд:
Ого. Очень странно, при чём тут, казалось бы, ядро? Что за дистрибутив?


Дистрибутив Linux Mint 9
Ядро притом, что при попытке поставить 31-й лазарус, он возжелал библиотеку libgdk-pixbuf2.0-0 не самой последней версии.
А она захотела другие библиотеки новых версий. Так я брел по цепочке зависимостей, пока не докопался до самого нутра линукса. Тогда я понял, что эксперимент пора прекращать. Судя по версиям библиотек они относились к линуксам с ядром Natty т.е. 38 ядром. Из чего я сделал вывод, что если бы ставил лазарус-31 в системе с Natty (Убунту-11 и т.д.) то возможно он и встал бы..

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

http://narod.ru/disk/28993274001/Diagram1.0.5.zip.html
Последний раз редактировалось TEvg 20.10.2011 11:45:21, всего редактировалось 2 раз(а).
TEvg
новенький
 
Сообщения: 15
Зарегистрирован: 14.07.2011 06:53:50

Re: Компонент по отображению графиков

Сообщение Ask » 23.09.2011 14:32:53

TEvg писал(а):библиотеку libgdk-pixbuf2.0-0 не самой последней версии.

НЕ самой последней? Так может можно было оставить ту, что была?
Вообще странно -- здесь [url]wiki.lazarus.freepascal.org/GTK2_Interface[/url] написано,
что должно работать аж с Gtk 2.6

Можно ещё с исходников собрать -- [url]wiki.lazarus.freepascal.org/Getting_Lazarus[/url]
Ask
постоялец
 
Сообщения: 163
Зарегистрирован: 25.12.2008 03:51:37

Re: Компонент по отображению графиков

Сообщение TEvg » 24.09.2011 15:41:39

Выкладываю версию 1.0.6

Что нового по сравнению 1.0.5?
Увеличена скорость перерисовки в Lazarus
Легенда настраивается из инспектора объектов
Исправлена ошибка в версии для Delphi
Компонент протестирован в Lazarus и под Linux и под win32

http://narod.ru/disk/28992833001/Diagram1.0.6.zip.html
Последний раз редактировалось TEvg 20.10.2011 11:39:53, всего редактировалось 2 раз(а).
TEvg
новенький
 
Сообщения: 15
Зарегистрирован: 14.07.2011 06:53:50

Re: Компонент по отображению графиков

Сообщение alexrayne » 25.09.2011 21:01:38

Выложите нормально компоненту где нить. на соурфорже к примеру, или если пентосы невнушают доверия, FBDataSet выложен на шаманграде.
alexrayne
постоялец
 
Сообщения: 125
Зарегистрирован: 03.12.2008 16:56:26

Re: Компонент по отображению графиков

Сообщение daesher » 27.09.2011 09:24:20

Ну, если уж о графиках, то есть и мой пакет plots (http://sourceforge.net/projects/vvfstat ... ots/0.0.5/). Создавался ещё тогда, когда в Lazarus не было графиков вообще (TAChart только появлялся, был глючным, не был встроенным, не чертил графики).
Преимущества перед TChart:
1. Есть специальный компонент для построения графиков функций, где функция прописывается в теле события.
2. Имеется возможность построения трёхмерных поверхностей.
Недостатки:
1. Предназначен только для построения графиков.
2. Не очень красивое отображение, особенно подписей по осям. Возможно, тянется со времён древних версий Lazarus
daesher
постоялец
 
Сообщения: 221
Зарегистрирован: 09.03.2010 22:17:14

Re: Компонент по отображению графиков

Сообщение BugMaker » 28.09.2011 02:03:58

TEvg писал(а):Выкладываю версию 1.0.6

Много бессмысленного кода.
Код: Выделить всё
  TCurve = class(TCustomCurve) // класс, определяющий свойство кривой
  private
    { Private declarations }
    FID: string;
    function GetID: string;
    procedure SetID(Value: string);
  public
    { Public declarations }
    property ID: string read GetID write SetID; // идентификатор кривой ID
  end;

function TCurve.GetID: string;
begin
  Result := FID;
end;

procedure TCurve.SetID(Value: string);
begin
  FID := Value;
end;


Это элементарно меняется на
Код: Выделить всё
  TCurve = class(TCustomCurve) // класс, определяющий свойство кривой
  private
    { Private declarations }
    FID: string;
  public
    { Public declarations }
    property ID: string read FID write FID; // идентификатор кривой ID
  end;

Зачем писать методы, которые не работают?
BugMaker
новенький
 
Сообщения: 10
Зарегистрирован: 23.07.2011 22:26:56

Re: Компонент по отображению графиков

Сообщение Ask » 28.09.2011 06:14:23

daesher писал(а): Есть специальный компонент для построения графиков функций, где функция прописывается в теле события.

Это уже давно есть, см. посты выше

daesher писал(а): Имеется возможность построения трёхмерных поверхностей.

Этого нет до сих пор. В принципе можно сделать, но пока ни один пользователь не просил.
Ask
постоялец
 
Сообщения: 163
Зарегистрирован: 25.12.2008 03:51:37

Re: Компонент по отображению графиков

Сообщение daesher » 02.10.2011 09:13:44

Ask писал(а):Этого нет до сих пор. В принципе можно сделать, но пока ни один пользователь не просил.

Не знаю, у меня для этих целей есть отдельный компонент. Чего не хватает моим компонентам - так это "красоты отображения"
daesher
постоялец
 
Сообщения: 221
Зарегистрирован: 09.03.2010 22:17:14

Re: Компонент по отображению графиков

Сообщение TEvg » 02.10.2011 13:17:17

daesher писал(а):Ну, если уж о графиках, то есть и мой пакет plots


Примерчик бы животворящий..

Добавлено спустя 4 минуты 16 секунд:
BugMaker писал(а):Зачем писать методы, которые не работают?


Когда-то были мысли написать там кое-что.. А потом решил что это ненужно..
TEvg
новенький
 
Сообщения: 15
Зарегистрирован: 14.07.2011 06:53:50

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 21

Рейтинг@Mail.ru