⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qiplotlimit.pas

📁 iocopm3.04源码,一套很好的工控开发工具
💻 PAS
📖 第 1 页 / 共 2 页
字号:
      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 + -