Delphi 有没有可能';夹子';停机坪的下部?
我想得到一些关于使用TeeChart TAreaSeries的提示,特别是关于创建不重叠系列的提示 当我在同一个绘图上创建两个面积系列时,与相同的BottomAxis和LeftAxis相关,我得到如下结果: 如果我垂直滚动绘图,我会看到这两个系列不断向下扩展到负无穷大(Y坐标) 但我想知道是否有可能在某个Y点“削减”系列的下半部分? 这样我就可以找回这样的东西:Delphi 有没有可能';夹子';停机坪的下部?,delphi,delphi-7,vcl,teechart,Delphi,Delphi 7,Vcl,Teechart,我想得到一些关于使用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事件仍然会被触发。我