powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Наследование TGanttSeries
10 сообщений из 10, страница 1 из 1
Наследование TGanttSeries
    #39576244
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача: к каждой гантели у TGanttSeries добавить некий внутренний объект, с которым будет взаимодействовать пользователь.

Посмотрел исходники и увидел, что самый правильный путь - добавить в Series.ValuesList свой TChartValueList, в котором и хранить свои объекты.

Проблема в том, что TChartValueList не очень приспособлен к наследованию половина нужных методов объявлена невиртуальными,
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
    Function AddChartValue:Integer; overload;
    Function AddChartValue(Const AValue:TChartValue):Integer; overload; virtual;

Function TChartValueList.AddChartValue(Const AValue:TChartValue):Integer;
begin
  TempValue:=AValue;
  // из виртуального метода идет вызов основного невиртуального
  result:=AddChartValue;
end;

или вообще вот так (все лишние IFDEF убраны)
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
    Procedure Delete(ValueIndex:Integer); overload; virtual;
    Procedure Delete(Start,Quantity:Integer); overload;

Procedure TChartValueList.Delete(ValueIndex:Integer);
begin
  Count:=Count-1;
  if ValueIndex<Count then  // 7.01
  begin
    System.Move(Value[ValueIndex+1],Value[ValueIndex],
                SizeOf(TChartValue)*(Count-ValueIndex)); { 5.03 }
  end;
  Modified:=True;
end;

Procedure TChartValueList.Delete(Start,Quantity:Integer);
begin
  if Quantity>(Count-Start) then
     Quantity:=Count-Start;

  Count:=Count-Quantity;

  if Start<Count then  // 7.01
     System.Move(Value[Start+Quantity],Value[Start],
                 SizeOf(TChartValue)*(Count-Start));
  Modified:=True;
end;


а сам он заточен на хранение исключительно Double.

Я вижу два варианта

1) Завести в самой серии некий TDictionary<Double, MyObject>, хранить все объекты там, а TChartValueList использовать для хранения ключей этих объектов. Этот способ попахивает проктологией и непонятно что делать с невиртуальными методами?

2) Пойти путем джедая и перекрыть все Add/Insert/Delete/Exchange... у самой серии. Будет много кода, но, по идее, путь правильный

Может еще, что-то есть?

С уважением, Vasilisk
...
Рейтинг: 0 / 0
Наследование TGanttSeries
    #39576465
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В итоге перекрыл десяток методов у серии. Получилось жутковато и с одной багофичей. Не получилось у меня сделать модификацию этого внутреннего списка перед отрисовкой. Вначале отрисовка потом добавление/удаление объектов
...
Рейтинг: 0 / 0
Наследование TGanttSeries
    #39576719
Олег Третьяков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОФФ: Я когда сплайны делал, тоже перелопачивал, чтобы две серии в одну запихать)
_Vasilisk_Не получилось у меня сделать модификацию этого внутреннего списка перед отрисовкой
Там же, если мне не изменяет память, в CustomSeries есть Begin/EndUpdate
...
Рейтинг: 0 / 0
Наследование TGanttSeries
    #39576893
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Олег ТретьяковТам же, если мне не изменяет память, в CustomSeries есть Begin/EndUpdateЕсть. Вопрос не в том. Вопрос в том, что если эти объекты должны использоваться для отрисовки, то любая модификация серии должна будет оборачиваться в Begin/EndUpdate
...
Рейтинг: 0 / 0
Наследование TGanttSeries
    #39576929
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,
В классе TChartValueList есть поле IData : TObject; Для чего оно нужно хз. Можно использовать для решения твоей задачи.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
TChartValueList=class(TPersistent)
  private
    ...
  protected
    FModified : Boolean;
    IData     : TObject;    
    Internal  : Boolean; // When True, do not show at TChartGrid
    ...
  public
    ...
  published
    ...
  end;


...
Рейтинг: 0 / 0
Наследование TGanttSeries
    #39576943
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014; Для чего оно нужно хзДля хранения ссылки на TFIeld у DBChart
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
Procedure TCustomDBChart.RefreshDataSet(ADataSet:TDataSet; ASeries:TChartSeries);
...........
            With TValueListAccess(ValueList[t]) do
            if Assigned(IData) then TempValue:=TField(IData).AsFloat
                               else TempValue:=0;
...........
             tmpV:=TValueListAccess(ValuesList[t]);
             if tmpV<>MandaList then tmpV.IData:=GetAField(tmpV.ValueSource);
............


ziv-2014Можно использовать для решения твоей задачи.Наплодить полей не проблема. Проблема синхронизировать эти поля со вставкой/удалением
...
Рейтинг: 0 / 0
Наследование TGanttSeries
    #39576954
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[/src]
Наплодить полей не проблема. Проблема синхронизировать эти поля со вставкой/удалением[/quot]
Тогда перепиши TChartValueList с заменой в TeEngine под свою задачу.
...
Рейтинг: 0 / 0
Наследование TGanttSeries
    #39576961
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014Тогда перепиши TChartValueList с заменой в TeEngineПереписывать чужие исходники самое правильное дело
...
Рейтинг: 0 / 0
Наследование TGanttSeries
    #39577070
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_ziv-2014Тогда перепиши TChartValueList с заменой в TeEngineПереписывать чужие исходники самое правильное дело
В teechart можно TChartValueList переписать. Этот класс сделан немного коряво. Но переписать его довольно легко.
У tms chart переписать будет на много сложнее.
...
Рейтинг: 0 / 0
Наследование TGanttSeries
    #39577074
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

увы, но еще не было ни одной компоненты, которую не пришлось бы хотя бы минимально править. поэтому - да. стучишь в саппорт, отвечают: ваш частный случай делать не будем. Что тут поделать? Хорошо, если саппорт вообще хотя бы есть :)
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Наследование TGanttSeries
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]