Delphi 有没有可能';夹子';停机坪的下部?

Delphi 有没有可能';夹子';停机坪的下部?,delphi,delphi-7,vcl,teechart,Delphi,Delphi 7,Vcl,Teechart,我想得到一些关于使用TeeChart TAreaSeries的提示,特别是关于创建不重叠系列的提示 当我在同一个绘图上创建两个面积系列时,与相同的BottomAxis和LeftAxis相关,我得到如下结果: 如果我垂直滚动绘图,我会看到这两个系列不断向下扩展到负无穷大(Y坐标) 但我想知道是否有可能在某个Y点“削减”系列的下半部分? 这样我就可以找回这样的东西: (请原谅使用链接而不是图片,由于声誉限制,我没有发布它们的权限)是的,您可以在“所有功能\欢迎”中执行操作\轴\不透明区域示例,可

我想得到一些关于使用TeeChart TAreaSeries的提示,特别是关于创建不重叠系列的提示

当我在同一个绘图上创建两个面积系列时,与相同的BottomAxis和LeftAxis相关,我得到如下结果:

如果我垂直滚动绘图,我会看到这两个系列不断向下扩展到负无穷大(Y坐标)

但我想知道是否有可能在某个Y点“削减”系列的下半部分? 这样我就可以找回这样的东西:


(请原谅使用链接而不是图片,由于声誉限制,我没有发布它们的权限)

是的,您可以在“所有功能\欢迎”中执行操作\轴\不透明区域示例,可在TeeChart的程序组中获得,例如:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, TeeGDIPlus, TeEngine, Series, ExtCtrls, TeeProcs, Chart;

type
  TForm1 = class(TForm)
    Chart1: TChart;
    Series1: TAreaSeries;
    Series2: TAreaSeries;
    procedure FormCreate(Sender: TObject);
    procedure Series1Click(Sender: TChartSeries; ValueIndex: Integer;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure Chart1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
    ClipRect: TRect;
    procedure SeriesBeforeDraw(Sender: TObject);
    procedure SeriesAfterDraw(Sender: TObject);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses TeCanvas;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Series1.BeforeDrawValues:=SeriesBeforeDraw;
  Series1.AfterDrawValues:=SeriesAfterDraw;
end;

procedure TForm1.SeriesBeforeDraw(Sender: TObject);

  Function SeriesRect(Series:TChartSeries):TRect;
  begin
    With result do
    begin
      Left:=Series.GetHorizAxis.IStartPos;
      Right:=Series.GetHorizAxis.IEndPos;
      Top:=Series.GetVertAxis.IStartPos;
      Bottom:=Series.GetVertAxis.CalcYPosValue(700);
    end;
  end;

begin
  ClipRect:=SeriesRect( Sender as TChartSeries );

  { make opaque }
  With Chart1 do
       if CanClip then
          Canvas.ClipRectangle(ClipRect);
end;

procedure TForm1.SeriesAfterDraw(Sender: TObject);
begin
  Chart1.Canvas.UnClipRectangle;
end;

procedure TForm1.Series1Click(Sender: TChartSeries; ValueIndex: Integer;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  Caption:=IntToStr(ValueIndex);
end;

procedure TForm1.Chart1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if (Series1.Clicked(X,Y)<>-1) then
    Chart1.CancelMouse:=not PointInRect(ClipRect,X,Y);
end;

end.
单元1;
接口
使用
窗口、消息、系统工具、变体、类、图形、控件、窗体、,
对话框、TeeGDIPlus、TeEngine、Series、ExtCtrls、TeeProcs、图表;
类型
TForm1=类(TForm)
图1:TChart;
系列1:缓刑;
第二类:缓刑;
过程表单创建(发送方:ToObject);
过程系列1单击(发送方:TChartSeries;值索引:整数;
按钮:tMouse按钮;Shift:tShift状态;X,Y:整数);
程序图1移动停止(发送方:ToObject;按钮:TMouseButton;
移位:t移位状态;X,Y:整数);
私有的
{私有声明}
ClipRect:TRect;
提取前的程序系列(发送方:TObject);
程序系列AfterDraw(发送方:ToObject);
公众的
{公开声明}
结束;
变量
表1:TForm1;
实施
{$R*.dfm}
使用帆布;
过程TForm1.FormCreate(发送方:TObject);
开始
系列1.BeforeDraw值:=系列BeforeDraw;
系列1.AfterDraw值:=系列AfterDraw;
结束;
程序TForm1.SeriesBeforeDraw(发送方:TObject);
功能系列ect(系列:TChartSeries):TRect;
开始
结果呢
开始
左:=Series.GetHorizAxis.IStartPos;
右:=Series.GetHorizAxis.IEndPos;
顶部:=Series.GetVertAxis.IStartPos;
底部:=Series.GetVertAxis.CalcPosValue(700);
结束;
结束;
开始
ClipRect:=序列选择(发送方为TChartSeries);
{使不透明}
用Chart1做什么
如果坎克利普那么
Canvas.ClipRectangle(ClipRect);
结束;
程序TForm1.SeriesAfterDraw(发送方:ToObject);
开始
Chart1.Canvas.UnClipRectangle;
结束;
过程TForm1.Series1Click(发送方:TChartSeries;ValueIndex:Integer;
按钮:tMouse按钮;Shift:tShift状态;X,Y:整数);
开始
标题:=IntToStr(ValueIndex);
结束;
程序TForm1.Chart1MouseDown(发送方:ToObject;按钮:TMouseButton;
移位:t移位状态;X,Y:整数);
开始
如果(序列1.单击(X,Y)-1),则
图表1.CancelMouse:=非PointInRect(ClipRect,X,Y);
结束;
结束。
这将生成此图表:


是的,您可以在“所有功能\欢迎使用”中执行某些操作\轴\不透明区域示例,可在TeeChart的程序组中获得,例如:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, TeeGDIPlus, TeEngine, Series, ExtCtrls, TeeProcs, Chart;

type
  TForm1 = class(TForm)
    Chart1: TChart;
    Series1: TAreaSeries;
    Series2: TAreaSeries;
    procedure FormCreate(Sender: TObject);
    procedure Series1Click(Sender: TChartSeries; ValueIndex: Integer;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure Chart1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
    ClipRect: TRect;
    procedure SeriesBeforeDraw(Sender: TObject);
    procedure SeriesAfterDraw(Sender: TObject);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses TeCanvas;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Series1.BeforeDrawValues:=SeriesBeforeDraw;
  Series1.AfterDrawValues:=SeriesAfterDraw;
end;

procedure TForm1.SeriesBeforeDraw(Sender: TObject);

  Function SeriesRect(Series:TChartSeries):TRect;
  begin
    With result do
    begin
      Left:=Series.GetHorizAxis.IStartPos;
      Right:=Series.GetHorizAxis.IEndPos;
      Top:=Series.GetVertAxis.IStartPos;
      Bottom:=Series.GetVertAxis.CalcYPosValue(700);
    end;
  end;

begin
  ClipRect:=SeriesRect( Sender as TChartSeries );

  { make opaque }
  With Chart1 do
       if CanClip then
          Canvas.ClipRectangle(ClipRect);
end;

procedure TForm1.SeriesAfterDraw(Sender: TObject);
begin
  Chart1.Canvas.UnClipRectangle;
end;

procedure TForm1.Series1Click(Sender: TChartSeries; ValueIndex: Integer;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  Caption:=IntToStr(ValueIndex);
end;

procedure TForm1.Chart1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if (Series1.Clicked(X,Y)<>-1) then
    Chart1.CancelMouse:=not PointInRect(ClipRect,X,Y);
end;

end.
单元1;
接口
使用
窗口、消息、系统工具、变体、类、图形、控件、窗体、,
对话框、TeeGDIPlus、TeEngine、Series、ExtCtrls、TeeProcs、图表;
类型
TForm1=类(TForm)
图1:TChart;
系列1:缓刑;
第二类:缓刑;
过程表单创建(发送方:ToObject);
过程系列1单击(发送方:TChartSeries;值索引:整数;
按钮:tMouse按钮;Shift:tShift状态;X,Y:整数);
程序图1移动停止(发送方:ToObject;按钮:TMouseButton;
移位:t移位状态;X,Y:整数);
私有的
{私有声明}
ClipRect:TRect;
提取前的程序系列(发送方:TObject);
程序系列AfterDraw(发送方:ToObject);
公众的
{公开声明}
结束;
变量
表1:TForm1;
实施
{$R*.dfm}
使用帆布;
过程TForm1.FormCreate(发送方:TObject);
开始
系列1.BeforeDraw值:=系列BeforeDraw;
系列1.AfterDraw值:=系列AfterDraw;
结束;
程序TForm1.SeriesBeforeDraw(发送方:TObject);
功能系列ect(系列:TChartSeries):TRect;
开始
结果呢
开始
左:=Series.GetHorizAxis.IStartPos;
右:=Series.GetHorizAxis.IEndPos;
顶部:=Series.GetVertAxis.IStartPos;
底部:=Series.GetVertAxis.CalcPosValue(700);
结束;
结束;
开始
ClipRect:=序列选择(发送方为TChartSeries);
{使不透明}
用Chart1做什么
如果坎克利普那么
Canvas.ClipRectangle(ClipRect);
结束;
程序TForm1.SeriesAfterDraw(发送方:ToObject);
开始
Chart1.Canvas.UnClipRectangle;
结束;
过程TForm1.Series1Click(发送方:TChartSeries;ValueIndex:Integer;
按钮:tMouse按钮;Shift:tShift状态;X,Y:整数);
开始
标题:=IntToStr(ValueIndex);
结束;
程序TForm1.Chart1MouseDown(发送方:ToObject;按钮:TMouseButton;
移位:t移位状态;X,Y:整数);
开始
如果(序列1.单击(X,Y)-1),则
图表1.CancelMouse:=非PointInRect(ClipRect,X,Y);
结束;
结束。
这将生成此图表:


谢谢您的回答,它工作得非常好!然而,我想对这种方法补充一点:尽管序列1在Y=700值下不可见,但它仍然“物理”存在。因此,如果我单击Series1和Series2之间看似空白的灰色区域,Series1.OnClick事件仍然会被触发。我想知道是否有一种方法可以在视觉上和“物理上”剪辑系列1?@Wrackage不客气。可以,这可以使用TChart.CancelMouse属性实现,该属性控制何时停止处理鼠标单击事件。我已经扩展了实现这个的示例。谢谢你的回答,它非常有效!然而,我想对这种方法补充一点:尽管序列1在Y=700值下不可见,但它仍然“物理”存在。因此,如果我单击Series1和Series2之间看似空白的灰色区域,Series1.OnClick事件仍然会被触发。我