修正TiKnob的指示箭头显示问题

iocom官方只支持到D7,但是可以运用于新版本,只测试过显示运用,没测试过OPC特性(这个在新版本运用中估计有问题)。

但是在新版本运用中还有有一些小BUG,比如:

修正TiAnlogDisplay显示的问题-CSDN博客

TiKnob也发现BUG。

在10.4中拖入一个TiKnob,发现"Indicator"没有显示出来,

修改

Delphi 复制代码
procedure TiKnob.DrawIndicator(Canvas: TCanvas; const CenterPoint: TPoint);
var
  InnerPoint           : TPoint;
  OuterPoint           : TPoint;
  IndicatorCenterPoint : Tpoint;
  IndicatorRect        : TRect;
  IndicatorDegrees     : Double;
  PointerEndPoint      : TPoint;
  PointerBasePoint     : TPoint;
  Point1               : TPoint;
  Point2               : Tpoint;
begin
  IndicatorDegrees := RotationStartDegrees - PositionDegrees;

  //with Canvas, IndicatorRect do
  with Canvas do
    begin
      Brush.Style := bsSolid;
      IndicatorCenterPoint := GetXYRadPoint(IndicatorDegrees, FKnobRadius - FIndicatorMargin - FIndicatorSize, CenterPoint);

      IndicatorRect := Rect(IndicatorCenterPoint.x - FIndicatorSize,
                            IndicatorCenterPoint.y - FIndicatorSize,
                            IndicatorCenterPoint.x + FIndicatorSize,
                            IndicatorCenterPoint.y + FIndicatorSize);

      if FMouseDown or FKeyDown then begin Pen.Color := FIndicatorActiveColor;   Brush.Color := FIndicatorActiveColor    end
      else                           begin Pen.Color := FIndicatorInactiveColor; Brush.Color := FIndicatorInactiveColor; end;

      case FIndicatorStyle of
        ikisDotLowered : begin
                           Ellipse(IndicatorRect.Left, IndicatorRect.Top, IndicatorRect.Right, IndicatorRect.Bottom);
                           Pen.Color := clGray;  Arc(IndicatorRect.Left, IndicatorRect.Top, IndicatorRect.Right, IndicatorRect.Bottom, IndicatorRect.Right, IndicatorRect.Top, IndicatorRect.Left, IndicatorRect.Bottom);
                           Pen.Color := clWhite; Arc(IndicatorRect.Left, IndicatorRect.Top, IndicatorRect.Right, IndicatorRect.Bottom, IndicatorRect.Left , IndicatorRect.Bottom, IndicatorRect.Right, IndicatorRect.Top);
                         end;
        ikisDotRaised  : begin
                           Ellipse(IndicatorRect.Left, IndicatorRect.Top, IndicatorRect.Right, IndicatorRect.Bottom);
                           Pen.Color := clWhite; Arc(IndicatorRect.Left, IndicatorRect.Top, IndicatorRect.Right, IndicatorRect.Bottom, IndicatorRect.Right, IndicatorRect.Top, IndicatorRect.Left, IndicatorRect.Bottom);
                           Pen.Color := clGray;  Arc(IndicatorRect.Left, IndicatorRect.Top, IndicatorRect.Right, IndicatorRect.Bottom, IndicatorRect.Left, IndicatorRect.Bottom, IndicatorRect.Right, IndicatorRect.Top);
                         end;
        ikisDot        : begin
                           Ellipse(IndicatorRect.Left, IndicatorRect.Top, IndicatorRect.Right, IndicatorRect.Bottom);
                         end;
        ikisLineCenter : begin
                           OuterPoint:=GetXYRadPoint(IndicatorDegrees,FKnobRadius-FIndicatorMargin,CenterPoint);
                           PolyLine([OuterPoint, CenterPoint]);
                         end;
        ikisLineCustom : begin
                           OuterPoint:=GetXYRadPoint(IndicatorDegrees,FKnobRadius-FIndicatorMargin,               CenterPoint);
                           InnerPoint:=GetXYRadPoint(IndicatorDegrees,FKnobRadius-FIndicatorMargin-FIndicatorSize,CenterPoint);
                           PolyLine([OuterPoint, InnerPoint]);
                         end;
        ikisTriangle   : begin
                           PointerEndPoint :=GetXYRadPoint(IndicatorDegrees,FKnobRadius-FIndicatorMargin,               CenterPoint);
                           PointerBasePoint:=GetXYRadPoint(IndicatorDegrees,FKnobRadius-FIndicatorMargin-FIndicatorSize,CenterPoint);
                           Point1 := GetXYRadPoint(IndicatorDegrees + 90, FIndicatorSize/2, PointerBasePoint);
                           Point2 := GetXYRadPoint(IndicatorDegrees - 90, FIndicatorSize/2, PointerBasePoint);
                           Polygon([Point1, Point2, PointerEndPoint]);
                         end;
      end;
    end;
end;

是由于Canvas和IndicatorRect都有Left和Top属性引起的。

重新编译(不用重新安装),正常 。

估计其它控件也有类似的问题,一般照此修改就可以。

相关推荐
pcplayer5 天前
Delphi程序和大模型交互之二
人工智能·ai·大模型·agent·delphi
xyzhan14 天前
RAD Studio Amalthea Delphi 13.1 Beta深度解析:Delphi重磅更新,原生支持Windows ARM64EC
windows·delphi·rad studio·c++ builder·delphi 13
delphi 三层源码框架1 个月前
delphi发送SSL 465端口邮件
ssl·delphi·发送邮件·indy 465端口
tanqth4 个月前
Delphi跨平台开发中为Linux开发的优劣分析
跨平台·delphi·分析·linux开发
pcplayer4 个月前
Delphi 结构体序列化为二进制串
delphi
BillKu6 个月前
在 Delphi 5 中获取 Word 文档页数的方法
word·delphi
BillKu6 个月前
Delphi 5 中操作 Word 表格时禁用鼠标交互
word·delphi
看那山瞧那水6 个月前
DELPHI 利用OpenSSL实现加解密,证书(X.509)等功能
delphi·openssl
lincats6 个月前
一步一步学习使用FireMonkey动画(6) 用实例理解动画的运行状态
ide·delphi·livebindings·delphi 12.3·firemonkey
lincats6 个月前
一步一步学习使用FireMonkey动画(3) 使用Delphi的基本动画组件类
ide·delphi·delphi 12.3·firemonkey