首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在TGanttSeries中自定义绘制甘特图

在TGanttSeries中自定义绘制甘特图
EN

Stack Overflow用户
提问于 2013-05-21 18:06:43
回答 2查看 940关注 0票数 0

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

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

有没有可能在TGanttSeries中提供甘特图的自定义绘制,其中单个表示为矩形的甘特图可以有几个不同绘制的子节?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-29 15:56:33

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

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

下面是使用这种方法的一个示例--相邻的甘特图就像一个单独的甘特图,同时提供了一种简单的方法来在编程上区分两个部分(例如,用于事件处理):

票数 0
EN

Stack Overflow用户

发布于 2013-05-22 21:01:21

您可以尝试按照Yeray建议的here使用OnGetPointerStyle事件。

以下是链接中的示例:

代码语言:javascript
运行
复制
  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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16667359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档