📄 qiplotlimit.pas
字号:
FLine2ClickRect := iXYReverseRect(XYAxesReversed, X2Pixels - 5, Y1Pixels, X2Pixels + 5, Y2Pixels);
FLine2Show := True;
if FFillStyle = bsSolid then
begin
Pen.Style := LineStyle;
Pen.Width := 1;
if XYAxesReversed then
Rectangle(Y1Pixels, X1Pixels, Y2Pixels, X2Pixels)
else
Rectangle(X1Pixels, Y1Pixels, X2Pixels, Y2Pixels);
end
else if FFillStyle = bsClear then
begin
Pen.Style := LineStyle;
Pen.Width := LineWidth;
Polyline([iPointReverse(XYAxesReversed, X1Pixels, Y1Pixels), iPointReverse(XYAxesReversed, X1Pixels, Y2Pixels)]);
Polyline([iPointReverse(XYAxesReversed, X2Pixels, Y1Pixels), iPointReverse(XYAxesReversed, X2Pixels, Y2Pixels)]);
end
else
begin
Pen.Style := psClear;
if XYAxesReversed then
Rectangle(Y1Pixels, X1Pixels, Y2Pixels, X2Pixels)
else
Rectangle(X1Pixels, Y1Pixels, X2Pixels, Y2Pixels);
Pen.Style := LineStyle;
Pen.Width := 1;
Polyline([iPointReverse(XYAxesReversed, X1Pixels, Y1Pixels), iPointReverse(XYAxesReversed, X1Pixels, Y2Pixels)]);
Polyline([iPointReverse(XYAxesReversed, X2Pixels, Y1Pixels), iPointReverse(XYAxesReversed, X2Pixels, Y2Pixels)]);
end
end;
end;
//****************************************************************************************************************************************************
procedure TiPlotLimit.DrawBandY(const Canvas: TCanvas; const BackGroundColor: TColor);
var
X1Pixels : Integer;
X2Pixels : Integer;
Y1Pixels : Integer;
Y2Pixels : Integer;
begin
with Canvas do
begin
Pen.Color := Color;
Brush.Color := Color;
Brush.Style := FillStyle;
Y1Pixels := YAxis.PositionToPixels(Line1Position);
Y2Pixels := YAxis.PositionToPixels(Line2Position);
X1Pixels := XAxis.PositionToPixels(XAxis.Min);
X2Pixels := XAxis.PositionToPixels(XAxis.Max);
FLine1Show := True;
FLine1ClickRect := iXYReverseRect(XYAxesReversed, X1Pixels, Y1Pixels - 5, X2Pixels, Y1Pixels + 5);
FLine2Show := True;
FLine2ClickRect := iXYReverseRect(XYAxesReversed, X1Pixels, Y2Pixels - 5, X2Pixels, Y2Pixels + 5);
if FFillStyle = bsSolid then
begin
Pen.Style := LineStyle;
Pen.Width := 1;
if XYAxesReversed then
Rectangle(Y1Pixels, X1Pixels, Y2Pixels, X2Pixels)
else
Rectangle(X1Pixels, Y1Pixels, X2Pixels, Y2Pixels);
end
else if FFillStyle = bsClear then
begin
Pen.Style := LineStyle;
Pen.Width := LineWidth;
Polyline([iPointReverse(XYAxesReversed, X1Pixels, Y1Pixels), iPointReverse(XYAxesReversed, X2Pixels, Y1Pixels)]);
Polyline([iPointReverse(XYAxesReversed, X1Pixels, Y2Pixels), iPointReverse(XYAxesReversed, X2Pixels, Y2Pixels)]);
end
else
begin
Pen.Style := psClear;
if XYAxesReversed then
Rectangle(Y1Pixels, X1Pixels, Y2Pixels, X2Pixels)
else
Rectangle(X1Pixels, Y1Pixels, X2Pixels, Y2Pixels);
Pen.Style := LineStyle;
Pen.Width := 1;
Polyline([iPointReverse(XYAxesReversed, X1Pixels, Y1Pixels), iPointReverse(XYAxesReversed, X2Pixels, Y1Pixels)]);
Polyline([iPointReverse(XYAxesReversed, X1Pixels, Y2Pixels), iPointReverse(XYAxesReversed, X2Pixels, Y2Pixels)]);
end
end;
end;
//****************************************************************************************************************************************************
procedure TiPlotLimit.DrawPolyBandX(const Canvas: TCanvas; const BackGroundColor: TColor);
var
x : Integer;
Data1 : Double;
Data2 : Double;
Data3 : Double;
Point1 : TPoint;
Point2 : TPoint;
Point3 : TPoint;
Point4 : TPoint;
begin
if FPointList.Count < 2 then Exit;
with Canvas do
begin
Pen.Color := Color;
Pen.Width := 1;
Pen.Style := psSolid;
Brush.Color := Color;
Brush.Style := FillStyle;
for x := 1 to FPointList.Count-1 do
begin
if (FPointList.Item1[x-1] < YAxis.Min) and (FPointList.Item1[x] < YAxis.Min) then Continue;
Data1 := FPointList.Item1[x-1];
Data2 := FPointList.Item2[x-1];
Data3 := FPointList.Item3[x-1];
if Data1 > YAxis.Max then Break;
Point1 := iPointReverse(XYAxesReversed,XAxis.PositionToPixels(Data2), YAxis.PositionToPixels(Data1));
Point2 := iPointReverse(XYAxesReversed,XAxis.PositionToPixels(Data3), YAxis.PositionToPixels(Data1));
Data1 := FPointList.Item1[x];
Data2 := FPointList.Item2[x];
Data3 := FPointList.Item3[x];
Point3 := iPointReverse(XYAxesReversed,XAxis.PositionToPixels(Data2), YAxis.PositionToPixels(Data1));
Point4 := iPointReverse(XYAxesReversed,XAxis.PositionToPixels(Data3), YAxis.PositionToPixels(Data1));
if FFillStyle = bsSolid then
begin
Polygon([Point1, Point3, Point4, Point2]);
end
else
begin
Pen.Style := psClear;
Polygon([Point1, Point3, Point4, Point2]);
Pen.Style := psSolid;
Polyline([Point1, Point3]);
Polyline([Point2, Point4]);
end;
end;
end;
end;
//****************************************************************************************************************************************************
procedure TiPlotLimit.DrawPolyBandY(const Canvas: TCanvas; const BackGroundColor: TColor);
var
x : Integer;
Data1 : Double;
Data2 : Double;
Data3 : Double;
Point1 : TPoint;
Point2 : TPoint;
Point3 : TPoint;
Point4 : TPoint;
begin
if FPointList.Count < 2 then Exit;
with Canvas do
begin
Pen.Color := Color;
Pen.Width := 1;
Pen.Style := psSolid;
Brush.Color := Color;
Brush.Style := FillStyle;
for x := 1 to FPointList.Count-1 do
begin
if (FPointList.Item1[x-1] < XAxis.Min) and (FPointList.Item1[x] < XAxis.Min) then Continue;
Data1 := FPointList.Item1[x-1];
Data2 := FPointList.Item2[x-1];
Data3 := FPointList.Item3[x-1];
if Data1 > XAxis.Max then Break;
Point1 := iPointReverse(XYAxesReversed,XAxis.PositionToPixels(Data1), YAxis.PositionToPixels(Data2));
Point2 := iPointReverse(XYAxesReversed,XAxis.PositionToPixels(Data1), YAxis.PositionToPixels(Data3));
Data1 := FPointList.Item1[x];
Data2 := FPointList.Item2[x];
Data3 := FPointList.Item3[x];
Point3 := iPointReverse(XYAxesReversed,XAxis.PositionToPixels(Data1), YAxis.PositionToPixels(Data2));
Point4 := iPointReverse(XYAxesReversed,XAxis.PositionToPixels(Data1), YAxis.PositionToPixels(Data3));
if FFillStyle = bsSolid then
begin
Polygon([Point1, Point3, Point4, Point2]);
end
else
begin
Pen.Style := psClear;
Polygon([Point1, Point3, Point4, Point2]);
Pen.Style := psSolid;
Polyline([Point1, Point3]);
Polyline([Point2, Point4]);
end;
end;
end;
end;
//****************************************************************************************************************************************************
procedure TiPlotLimit.AddBandElement(Position, UpperLimit, LowerLimit: Double);
begin
if LowerLimit > UpperLimit then raise Exception.Create('the Upper Limit must be greater than or equal to the Lower Limit');
FPointList.Add(Position, UpperLimit, LowerLimit);
TriggerChange(Self);
end;
//****************************************************************************************************************************************************
procedure TiPlotLimit.ClearAllElements;
begin
FPointList.Clear;
TriggerChange(Self);
end;
//****************************************************************************************************************************************************
function TiPlotLimit.GetIsFillType: Boolean;
begin
Result := True;
if FStyle = iplsLineX then Result := False;
if FStyle = iplsLineY then Result := False;
if (FStyle = iplsBandX) and (FFillStyle = bsClear) then Result := False;
if (FStyle = iplsBandY) and (FFillStyle = bsClear) then Result := False;
end;
//****************************************************************************************************************************************************
function TiPlotLimit.iMouseHitTest(MouseData: TiPlotMouseData): Boolean;
begin
Result := inherited iMouseHitTest(MouseData);
if FLine1Show then if PtInRect(FLine1ClickRect, Point(MouseData.X,MouseData.Y)) then Result := True;
if FLine2Show then if PtInRect(FLine2ClickRect, Point(MouseData.X,MouseData.Y)) then Result := True;
end;
//****************************************************************************************************************************************************
function TiPlotLimit.GetMousePointer(APoint: TPoint): TCursor;
begin
Result := crDefault;
if not FUserCanMove then Exit;
if not TiPlotComponentAccess(Owner).SelectModeActive then Exit;
Result := crHandPoint;
if FLine1Show and FLine2Show then
begin
if LinePositionAxis = iplpaXAxis then
begin
if XYAxesReversed then Result := crSizeNS else Result := crSizeWE;
end
else
begin
if XYAxesReversed then Result := crSizeWE else Result := crSizeNS;
end;
end;
end;
//****************************************************************************************************************************************************
procedure TiPlotLimit.DoMouseLeft(MouseData: TiPlotMouseData);
begin
if not FUserCanMove then Exit;
if not TiPlotComponentAccess(Owner).SelectModeActive then Exit;
if FLine1Show and PtInRect(FLine1ClickRect, Point(MouseData.X, MouseData.Y)) then
begin
FMouseDownXAxis := MouseData.XAxisPixels;
FMouseDownYAxis := MouseData.YAxisPixels;
FMouseDownPosition := FLine1Position;
FMouseDownLine1 := True;
TriggerInvalidateNow(Self);
end
else if FLine2Show and PtInRect(FLine2ClickRect, Point(MouseData.X, MouseData.Y)) then
begin
FMouseDownXAxis := MouseData.XAxisPixels;
FMouseDownYAxis := MouseData.YAxisPixels;
FMouseDownPosition := FLine2Position;
FMouseDownLine2 := True;
TriggerInvalidateNow(Self);
end
end;
//****************************************************************************************************************************************************
procedure TiPlotLimit.DoMouseMove(MouseData: TiPlotMouseData);
begin
if FMouseDownLine1 then
begin
case LinePositionAxis of
iplpaXAxis : Line1Position := FMouseDownPosition - (XAxis.PixelsToPosition(FMouseDownXAxis) - XAxis.PixelsToPosition(MouseData.XAxisPixels));
iplpaYAxis : Line1Position := FMouseDownPosition - (YAxis.PixelsToPosition(FMouseDownYAxis) - YAxis.PixelsToPosition(MouseData.YAxisPixels));
end;
end;
if FMouseDownLine2 then
begin
case LinePositionAxis of
iplpaXAxis : Line2Position := FMouseDownPosition - (XAxis.PixelsToPosition(FMouseDownXAxis) - XAxis.PixelsToPosition(MouseData.XAxisPixels));
iplpaYAxis : Line2Position := FMouseDownPosition - (YAxis.PixelsToPosition(FMouseDownYAxis) - YAxis.PixelsToPosition(MouseData.YAxisPixels));
end;
end
end;
//****************************************************************************************************************************************************
procedure TiPlotLimit.DoMouseUp(MouseData: TiPlotMouseData);
begin
inherited;
FMouseDownLine1 := False;
FMouseDownLine2 := False;
if MouseDown and iMouseHitTest(MouseData) then
begin
TiPlotComponentAccess(Owner).DoObjectClick(Self);
end;
end;
//****************************************************************************************************************************************************
procedure TiPlotLimit.NotificationSetFocus(Sender: TObject);
begin
if Sender = Self then Exit;
if not (Sender as TiPlotObject).UserSelected then Exit;
SetUserSelected(False);
end;
//****************************************************************************************************************************************************
procedure TiPlotLimit.AddMenuItems(PopupMenu: TPopUpMenu);
begin
inherited;
AddEditMenuItems(PopupMenu);
end;
//****************************************************************************************************************************************************
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -