TeeChart в Lazarus

Вопросы использования сторонних (не входящих в состав FPC и Lazarus) утилит и библиотек.

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

TeeChart в Lazarus

Сообщение VAshot » 07.11.2008 15:41:37

На форму TeeChart пишут, что мол раньше работал компонент, а сейчас нет, и правда нет :(.
http://www.teechart.net/support/viewtopic.php?t=6124&postdays=0&postorder=asc&start=0
http://www.teechart.net/support/viewtopic.php?p=35066&sid=53162bb496717f62cf87fd0780d0a500

Максимум, чего получилось добиться - это отображение Chart на форме, но с сериями всё сложней ....

Вопрос раз: у кого-нить она работает на новых версиях? (0.9.25 и новее)
Вопрос два (более объемист): очень нужны приличного вида (2D) графики, процентов 80-90 от TeeChart мне не нужно, но требуется разборчивое отображение множества пересекающихся LineSeries и (самое главное) печать с масштабированием.
Есть ли на форуме люди готовые адаптировать TeeChart или переписать TAChart (на данном этапе интересует возможность и цена вопроса)?
Аватара пользователя
VAshot
постоялец
 
Сообщения: 128
Зарегистрирован: 01.11.2007 12:31:21
Откуда: Пермь

Re: TeeChart в Lazarus

Сообщение Сергей Смирнов » 07.11.2008 16:18:52

TeeChart и раньше работал довольно коряво, так что особо рассчитывать не него я бы не стал. Кроме того, он в исходниках стоит некоторых денег (немаленьких). А что не так с TAChart и TChart? LineSeries вроде там есть, есть также метод PaintOnCanvas -- подсовываешь ему канву принтера и вперёд. Нет?
Аватара пользователя
Сергей Смирнов
энтузиаст
 
Сообщения: 598
Зарегистрирован: 28.04.2005 13:23:25
Откуда: Москва

Re: TeeChart в Lazarus

Сообщение VAshot » 07.11.2008 16:41:20

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

TAChart в принципе (!) устраивает, доработал чтоб две оси по Y были разные и пр. (а вот с третьей и четвертой осью опять же много сложней, а в TeeChart оно есть) Но т.к. я не прикладник, мне будет сложновато реализовать полупрозрачность серий (важно, но не приоритет), PaintOnCanvas - оно конечно есть, но выводит-то он в пикселях... у монитора их всего 72, надо переписать всю отрисовку с умножением на коэффициенты (не сложно, но долго), иначе весьма коряво выходт.

TeeChart конечно стоит, и если удастся приручить выбью на него денег (около 500$, если с исходниками), не Ansys всё же :), а пока я нарушитель закона...
Аватара пользователя
VAshot
постоялец
 
Сообщения: 128
Зарегистрирован: 01.11.2007 12:31:21
Откуда: Пермь

Re: TeeChart в Lazarus

Сообщение Сергей Смирнов » 07.11.2008 16:58:19

VAshot писал(а):...PaintOnCanvas - оно конечно есть, но выводит-то он в пикселях... у монитора их всего 72...
Ээээ... дык оно вторым параметром принимает TRect, в котором рисовать. Для принтера там будет просто больше пикселей раз в 10. По-идее, должен масштабировать. Не масштабирует?
Аватара пользователя
Сергей Смирнов
энтузиаст
 
Сообщения: 598
Зарегистрирован: 28.04.2005 13:23:25
Откуда: Москва

Re: TeeChart в Lazarus

Сообщение VAshot » 07.11.2008 17:18:13

Размер будет как TRect, а вот толщина линий, несечки, кружки/квадратики и прочее рисуется в пикселах.
Аватара пользователя
VAshot
постоялец
 
Сообщения: 128
Зарегистрирован: 01.11.2007 12:31:21
Откуда: Пермь

Re: TeeChart в Lazarus

Сообщение Сергей Смирнов » 10.11.2008 17:21:27

VAshot писал(а):Размер будет как TRect, а вот толщина линий, несечки, кружки/квадратики и прочее рисуется в пикселах.
Понятно. Можно считать, что масштабирования нету. Сейчас глянул немного потщательнее на этот TAChart. Мда, его ещё долго до ума доводить. :(
Аватара пользователя
Сергей Смирнов
энтузиаст
 
Сообщения: 598
Зарегистрирован: 28.04.2005 13:23:25
Откуда: Москва

Re: TeeChart в Lazarus

Сообщение VAshot » 17.11.2008 15:59:11

Неужели никто не строит боле-менее сложные графики?
И нет желания ковырнуть TeeChart? (возможны условия:) )
Аватара пользователя
VAshot
постоялец
 
Сообщения: 128
Зарегистрирован: 01.11.2007 12:31:21
Откуда: Пермь

Re: TeeChart в Lazarus

Сообщение Сергей Смирнов » 17.11.2008 18:51:30

VAshot писал(а):Неужели никто не строит боле-менее сложные графики?
И нет желания ковырнуть TeeChart? (возможны условия:) )
TeeChart пусть ковыряет его автор, потому как

1 - компоненты очень сложные, исходники огромны, изобилуют ifdef-ами да и просто довольно фигово читаются, т.е. разобраться там за разумное время нереально;
2 - оно стоит денег и добавляет лишнюю лицензионную зависимость, поэтому, несмотря на некоторую потребность, мы их использовать скорее всего не будем, а будем ковырять TAChart;
3 - вот прямо сейчас вообще не до того, но, очень вероятно, что скоро потребность в графиках (правда, довольно простых, но TAChart и этого не умеет) наступит, вот тогда, может быть, сделаю "до кучи" и то, что Вам нужно, хотя бы в некоторой части.
Аватара пользователя
Сергей Смирнов
энтузиаст
 
Сообщения: 598
Зарегистрирован: 28.04.2005 13:23:25
Откуда: Москва

Re: TeeChart в Lazarus

Сообщение VAshot » 19.11.2008 15:41:17

Жаль... хотя многое из необходимого (типа даты на оси и пр.) сделал. код добровольно не выкладываю, профи засмеют :), но если надо кому.

Код: Выделить всё
function TChartSeries.AddXY(X, Y: Double; XLabel: String; Color: TColor) : Longint;
var
   coordn: PChartCoord;
   i: integer;
begin
   //save the coord and color
   New(Coordn);
   Coordn^.x := X;
   Coordn^.y := Y;
   Coordn^.Color := Color;
   Coordn^.Text := XLabel;
{
   //add in order or at end
   i := 0;
   while (i < FCoordList.Count) and (PChartCoord(FCoordList.Items[i])^.x <= X) do inc(i);
   if i = FCoordList.Count then FCoordList.Add(Coordn)
   else  FCoordList.Insert(i, Coordn);
}
   [b]FCoordList.Insert(FCoordList.Count, Coordn);[/b]

   result := FCoordList.IndexOf( Coordn );
end;


При замене (фигурные скобки) кода с сортировкой на простое добавление, скорость вырастает более чем в два раза (для очень большого объема - вырастает в разы) (что логично исходя из кода).

Недостаток: надо вручную сортировать при необходимости.


далее есть работа с List.
Код: Выделить всё
procedure TFPList.Insert(Index: Integer; Item: Pointer);
begin
  if (Index < 0) or (Index > FCount )then
    Error(SlistIndexError, Index);
  iF FCount = FCapacity then Self.Expand;
  if Index<FCount then
    System.Move(Flist^[Index], Flist^[Index+1], (FCount - Index) * SizeOf(Pointer));
  FList^[Index] := Item;
  FCount := FCount + 1;
end;


Можно получить комментарий, на сколько эффективна последняя функция? или она, как "системная", "максимально оптимальна"?



При большом объеме данных, как понимаю, еще сильно подтормаживает
Код: Выделить всё
System.Move(Flist^[Index], Flist^[Index+1], (FCount - Index) * SizeOf(Pointer));
?
Аватара пользователя
VAshot
постоялец
 
Сообщения: 128
Зарегистрирован: 01.11.2007 12:31:21
Откуда: Пермь


Вернуться в Сторонние средства

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

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

Рейтинг@Mail.ru