Компонент по отображению графиков
Модератор: Модераторы
Компонент по отображению графиков
Написал компонент для отображения графиков.
Поскольку он унаследован от TImage, то сохраняет в файле формы все полагающиеся для TImage свойства, в том числе саму картинку Picture.Data. Которую сохранять вообще-то нет необходимости. Можно ли исключить сохранение в lfm/dfm каких-либо свойств?
http://tevg-2011.narod2.ru
Поскольку он унаследован от TImage, то сохраняет в файле формы все полагающиеся для TImage свойства, в том числе саму картинку Picture.Data. Которую сохранять вообще-то нет необходимости. Можно ли исключить сохранение в lfm/dfm каких-либо свойств?
http://tevg-2011.narod2.ru
Последний раз редактировалось TEvg 20.10.2011 12:37:25, всего редактировалось 3 раза.
TEvg писал(а):Написал компонент для отображения графиков.
Интересно. В чём преимущства перед стандартным TChart?
TEvg писал(а):Поскольку он унаследован от TImage, то сохраняет в файле формы все полагающиеся для TImage свойства, в том числе саму картинку Picture.Data. Которую сохранять вообще-то нет необходимости. Можно ли исключить сохранение в lfm/dfm каких-либо свойств?
По идее надо наследовать от TCustomImage и не публиковать лишние свойства.
По идее надо наследовать от TCustomImage и не публиковать лишние свойства.
Гениально! Легким движением руки, брюки превращаются.. и всё работает.
Стал думать, как же я раньше не догадался. Оказывается в Дельфи нет класса TCustomImage. Там TImage порожден от TGraphicControl.
Компонент ведь первоначально писался для Дельфи, потом был переделан под Лазарус, а потом обратно для Дельфи. Теперь чтобы сделать версию для Дельфей, пришлось залезть в потроха TImage и повыдергать нужное. Так что задача решена. Выкладываю версию 1.0.4, в которой вышеупомянутые недостатки устранены, плюс исправлена пара мелких ошибок.
Я не берусь подробно сравнивать компонент с TChart.
Я стал его писать столкнувшись с ситуацией, когда с другими компонентами, включая TChart я не мог получить нужной мне картинки.
Я хотел написать компонент, который позволял отрисовывать любое нужное мне количество кривулек. И чтобы для каждой можно было индивидуально задать координатную область вывода и свою сетку со своим шагом и свои координатные оси со своими шкалами и расположить их там где мне захочется. И чтобы можно было скармливать данные разных типов - и целые и вещественные и дата-время и чтобы по одной оси можно было задать один тип, а по другой-другой.
И чтобы масштабировалось всё автоматически, простым изменением границ.
Мне также хотелось управлять по своему желанию надписями на шкалах, особенно при указании времени - когда надо показать год - показать год, когда надо миллисекунды - милисекунды.
Последний раз редактировалось TEvg 16.09.2011 17:12:04, всего редактировалось 1 раз.
Может, положить в архив пакет? А то пример не собирается, приходится руками пересоздавать.
Вот то же самое на TChart.
Из недостатков -- нельзя оси расположить по центру и стрелочки что-то кривоваты при таких острых углах -- надо будет поправить.
Из преимуществ -- есть настоящие функции, работает масштабирование (рисовать прямоугольник левой кнопкой, как в Дельфи),
меньше тормозит при перерисовке.
Требует свежего Lazarus, на 0.9.30 скорее всего не заработает.
Вот то же самое на TChart.
Из недостатков -- нельзя оси расположить по центру и стрелочки что-то кривоваты при таких острых углах -- надо будет поправить.
Из преимуществ -- есть настоящие функции, работает масштабирование (рисовать прямоугольник левой кнопкой, как в Дельфи),
меньше тормозит при перерисовке.
Требует свежего Lazarus, на 0.9.30 скорее всего не заработает.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Ask писал(а):Может, положить в архив пакет? А то пример не собирается, приходится руками пересоздавать.
Согласен. Пакет нужен, хотя бы потому, что пример всегда имеет привязку к пакету и без него собираться не будет, надо править ручками.
Добавил пакет. Перезалил.
Добавлено спустя 14 минут 46 секунд:
Требует свежего Lazarus, на 0.9.30 скорее всего не заработает.
Да, на 30-й версии не заработал. А 31-я похоже требует от линукса 38-го ядра. Я когда пытался поставить, долго боролся с зависимостями пока не закопался очень глубоко. Остался на 30-й. Я и на неё перешел недавно, раньше сидел на 28-й.
Из преимуществ -- есть настоящие функции
Чуток подробнее?
работает масштабирование (рисовать прямоугольник левой кнопкой, как в Дельфи)
Это да. Я когда думал над этим делом, задумался - как удобно делать обратное масштабирование? Т.е. не увеличивать выделенную область а уменьшать её обратно. И как-то удобного для пользователя способа в голову не пришло. Поэтому пока не стал делать и прямое.
Последний раз редактировалось TEvg 22.09.2011 19:47:01, всего редактировалось 1 раз.
TEvg писал(а): А 31-я похоже требует от линукса 38-го ядра. Я когда пытался поставить, долго боролся с зависимостями пока не закопался очень глубоко.
Ого. Очень странно, при чём тут, казалось бы, ядро? Что за дистрибутив?
TEvg писал(а):Чуток подробнее?Из преимуществ -- есть настоящие функции
См. pas-файл из моего примера -- пользователь указывает только событие, вычисляющее функцию,
а компонента сама её отрисовывает сообразно текущему масштабу.
TEvg писал(а): как удобно делать обратное масштабирование?
TChart поддерживает два режима -- либо как в Дельфи (то есть рисуем прямоугольник в обратном направлении),
либо просто назначаем увеличение/уменьшение на разные кнопки мыши или модификаторы, как в графических редакторах.
Представляю версию 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
Добавлено отображение легенды.
ЗЫ. Что за тупое ограничение на выкладывание файлов? 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 писал(а):библиотеку libgdk-pixbuf2.0-0 не самой последней версии.
НЕ самой последней? Так может можно было оставить ту, что была?
Вообще странно -- здесь [url]wiki.lazarus.freepascal.org/GTK2_Interface[/url] написано,
что должно работать аж с Gtk 2.6
Можно ещё с исходников собрать -- [url]wiki.lazarus.freepascal.org/Getting_Lazarus[/url]
Выкладываю версию 1.0.6
Что нового по сравнению 1.0.5?
Увеличена скорость перерисовки в Lazarus
Легенда настраивается из инспектора объектов
Исправлена ошибка в версии для Delphi
Компонент протестирован в Lazarus и под Linux и под win32
http://narod.ru/disk/28992833001/Diagram1.0.6.zip.html
Что нового по сравнению 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 раза.
Выложите нормально компоненту где нить. на соурфорже к примеру, или если пентосы невнушают доверия, FBDataSet выложен на шаманграде.
Ну, если уж о графиках, то есть и мой пакет plots (http://sourceforge.net/projects/vvfstat ... ots/0.0.5/). Создавался ещё тогда, когда в Lazarus не было графиков вообще (TAChart только появлялся, был глючным, не был встроенным, не чертил графики).
Преимущества перед TChart:
1. Есть специальный компонент для построения графиков функций, где функция прописывается в теле события.
2. Имеется возможность построения трёхмерных поверхностей.
Недостатки:
1. Предназначен только для построения графиков.
2. Не очень красивое отображение, особенно подписей по осям. Возможно, тянется со времён древних версий Lazarus
Преимущества перед TChart:
1. Есть специальный компонент для построения графиков функций, где функция прописывается в теле события.
2. Имеется возможность построения трёхмерных поверхностей.
Недостатки:
1. Предназначен только для построения графиков.
2. Не очень красивое отображение, особенно подписей по осям. Возможно, тянется со времён древних версий Lazarus
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;
Зачем писать методы, которые не работают?
daesher писал(а): Есть специальный компонент для построения графиков функций, где функция прописывается в теле события.
Это уже давно есть, см. посты выше
daesher писал(а): Имеется возможность построения трёхмерных поверхностей.
Этого нет до сих пор. В принципе можно сделать, но пока ни один пользователь не просил.
Ask писал(а):Этого нет до сих пор. В принципе можно сделать, но пока ни один пользователь не просил.
Не знаю, у меня для этих целей есть отдельный компонент. Чего не хватает моим компонентам - так это "красоты отображения"
daesher писал(а):Ну, если уж о графиках, то есть и мой пакет plots
Примерчик бы животворящий..
Добавлено спустя 4 минуты 16 секунд:
BugMaker писал(а):Зачем писать методы, которые не работают?
Когда-то были мысли написать там кое-что.. А потом решил что это ненужно..
