我需要绘制由两个子部分组成的甘特图 - 一个涂有刷子的自定义位图,另一个用一些指定的颜色着色。这些小节具有可变长度,这使得无法为绘画设置预设位图。
我正在使用的当前解决方案是有两个TGanttSeries实例,其中第一个用于显示第一种子部分,第二个 - 另一种子部分。这是一种非常麻烦的方法,它提供了额外的挑战,其中某些操作需要在视觉上看起来是单个实体的甘特图上执行,但实际上由来自两个不同TGanttSeries实例的两个不同的甘特图组成。
是否有可能在TGanttSeries中提供甘特图的自定义绘画,其中单个甘特图表示为矩形可能有多个不同的子部分?
答案 0 :(得分:0)
您可以尝试使用OnGetPointerStyle事件,因为Yeray建议here。
这是链接中的示例:
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;
答案 1 :(得分:0)
看来,从TGanttSeries继承的重写方法DrawValue提供了最灵活的方法来控制直接在ParentChart.Canvas对象上绘制各个点(gantts)的绘制。
然而,根据我的经验,如果需要对单个甘特图由几个应该对鼠标事件作出反应的部分进行建模的情况进行建模,那么可能有一个更好的方法就是提供一个聚合单独的TGanttSeries实例的TGanttSeries后代。对于每个这样的部分。然后将这样的TGanttSeries后代添加到TChart的实例中,以控制所有聚合系列组件的行为。
以下是使用此方法的一个示例 - 相邻的甘特图像一个单一的方式,同时提供了一种简单的方法来区分程序化的两个部分(例如,用于事件处理):