0

我需要绘制由两个子部分组成的甘特图——一个用具有自定义位图的画笔绘制,另一个简单地以某种指定的颜色着色。这些小节具有可变长度,这使得不可能有用于绘画的预设位图。

我正在使用的当前解决方案是拥有两个 TGanttSeries 实例,其中第一个用于显示第一种小节,第二个用于显示另一种小节。这是一种相当繁琐的方法,它提供了额外的挑战,其中需要在一个甘特图上执行一些操作,该甘特图在视觉上看起来是一个实体,但实际上由来自两个不同 TGanttSeries 实例的两个不同甘特图组成。

是否可以在 TGanttSeries 中提供自定义的甘特图绘制,其中以矩形表示的单个甘特图可以有多个不同的子部分绘制?

4

2 回答 2

0

看来,从 TGanttSeries 继承的覆盖方法 DrawValue 提供了最灵活的方法来通过直接在 ParentChart.Canvas 对象上绘制来控制单个点(甘特图)的绘制。

但是,根据我的经验,如果需要对单个甘特图由应该对鼠标事件做出反应的几个部分组成的情况进行建模,具有单独的标记,那么可能更好的方法是提供一个 TGanttSeries 后代,该后代为每个此类聚合单独的 TGanttSeries 实例部分。然后将这样的 TGanttSeries 后代添加到 TChart 的实例中,以控制所有聚合系列组件的行为。

这是使用这种方法的一个示例——相邻的甘特图表现得像一个单独的甘特图,同时提供了一种以编程方式区分这两个部分的简单方法(例如,用于事件处理):

在此处输入图像描述

于 2013-05-29T07:56:33.070 回答
0

您可以尝试使用 Yeray在此处建议的 OnGetPointerStyle 事件。

这是链接中的示例:

  private
    { Private declarations }
    Function SeriesGetPointerStyle(Sender:TChartSeries; ValueIndex:Integer):TSeriesPointerStyle;
//...
procedure TForm1.FormCreate(Sender: TObject);
begin
  with Chart1.AddSeries(TGanttSeries) as TGanttSeries do
  begin
    Pointer.VertSize:=10;
    FillSampleValues(10);
    OnGetPointerStyle:=SeriesGetPointerStyle;
  end;
end;

Function TForm1.SeriesGetPointerStyle(Sender:TChartSeries; ValueIndex:Integer):TSeriesPointerStyle;
begin
  Chart1.Canvas.Brush.Style:=TBrushStyle(2+(ValueIndex mod 6));
  result:=psRectangle;
end;
于 2013-05-22T13:01:20.557 回答