zoukankan      html  css  js  c++  java
  • 修正TiAnlogDisplay显示的问题

    原来在DELPHI7下的程序移到XE2下,修修改改,总算行了。一直没注意这个TiAnlogDisplay控件,界面上用了好多这个控件,运行,显示为空,也不报错。看设计界面,也是空的,本来应当显示初始值的。用的是6.0.4 for xe2(网友自己改的),相同的源码在D7下没问题,这就奇怪了。再放个TiAnlogOuput控件(父类是TiCustomEdit),显示也没问题。这2个控件都继承自TiComponent,(中间的一些控件和显示无关),是控件自己的问题了。看源码,也看不出有什么不同的地方。它们的显示都是通过PaintTo这个方法,设断点,出问题了:

    procedure TiAnalogDisplay.iPaintTo(Canvas: TCanvas);
    var
      AText      : String;
      ATextRect  : TRect;
      ATextFlags : TiTextFlags;
    begin
      with Canvas, ATextRect do
        begin
          if not ErrorActive then
            begin
              if FPrecision >= 0 then
                AText := Trim(Format('%.' + IntToStr(FPrecision) + 'f', [FValue])) + FUnitsText
              else
                AText := Trim(Format('%g', [FValue])) + FUnitsText;
    
              Font.Assign(FFont);
              DrawBackGround(Canvas, BackGroundColor);
            end
          else
            begin
              AText := ErrorText;
              Font.Assign(ErrorFont);
              DrawBackGround(Canvas, ErrorBackGroundColor);
            end;
    
          case BorderStyle of
            ibsNone    : begin
                          ATextRect.Top    := 2;
                          ATextRect.Bottom := Height - 2;
                         end;
            ibsRaised  : begin
                          ATextRect.Top    := 2;
                          ATextRect.Bottom := Height - 2;
                         end;
            ibsLowered : begin
                          ATextRect.Top    := 2;
                          ATextRect.Bottom := Height - 4;
                         end;
          end;
    
          case FAlignment of
            iahCenter : begin
                          ATextFlags := [itfHCenter, itfVCenter, itfSingleLine];
                          ATextRect.Left  := 2;
                          ATextRect.Right := Width - 2;
                        end;
            iahLeft   : begin
                          ATextFlags := [itfHLeft, itfVCenter, itfSingleLine];
                          ATextRect.Left  := 2 + FAlignmentMargin;
                          ATextRect.Right := Width - 2;
                        end;
            else        begin
                          ATextFlags := [itfHRight, itfVCenter, itfSingleLine];
                          ATextRect.Left  := 2;
                          ATextRect.Right := Width - 2 - FAlignmentMargin;
                        end;
          end;
    
          Brush.Style := bsClear;
          iDrawText(Canvas, AText, ATextRect, ATextFlags, True, BackGroundColor);
        end;
    end;

    这儿的Right和Bottom值变成一个巨大的数!(如44062789),Hight和Width本身的值没问题,但是代码的运算(简单运算,不就是减个常数),Bottom和Right就变成一个巨大数了,怀疑表达式中的Hight和Width在运算的时候被替换了,真奇怪啊

    修改成这样:

    procedure TiAnalogDisplay.iPaintTo(Canvas: TCanvas);
    var
      AText      : String;
      ATextRect  : TRect;
      ATextFlags : TiTextFlags;
    begin
      with Canvas, ATextRect do
        begin
          if not ErrorActive then
            begin
              if FPrecision >= 0 then
                AText := Trim(Format('%.' + IntToStr(FPrecision) + 'f', [FValue])) + FUnitsText
              else
                AText := Trim(Format('%g', [FValue])) + FUnitsText;
    
              Font.Assign(FFont);
              DrawBackGround(Canvas, BackGroundColor);
            end
          else
            begin
              AText := ErrorText;
              Font.Assign(ErrorFont);
              DrawBackGround(Canvas, ErrorBackGroundColor);
            end;
    
          case BorderStyle of
            ibsNone    : begin
                          ATextRect.Top    := 2;
                          ATextRect.Bottom := Self.Height - 2;
                         end;
            ibsRaised  : begin
                          ATextRect.Top    := 2;
                          ATextRect.Bottom := Self.Height - 2;
                         end;
            ibsLowered : begin
                          ATextRect.Top    := 2;
                          ATextRect.Bottom := Self.Height - 4;
                         end;
          end;
    
          case FAlignment of
            iahCenter : begin
                          ATextFlags := [itfHCenter, itfVCenter, itfSingleLine];
                          ATextRect.Left  := 2;
                          ATextRect.Right := Self.Width - 2;
                        end;
            iahLeft   : begin
                          ATextFlags := [itfHLeft, itfVCenter, itfSingleLine];
                          ATextRect.Left  := 2 + FAlignmentMargin;
                          ATextRect.Right := Self.Width - 2;
                        end;
            else        begin
                          ATextFlags := [itfHRight, itfVCenter, itfSingleLine];
                          ATextRect.Left  := 2;
                          ATextRect.Right := Self.Width - 2 - FAlignmentMargin;
                        end;
          end;
    
          Brush.Style := bsClear;
          iDrawText(Canvas, AText, ATextRect, ATextFlags, True, BackGroundColor);
        end;
    end;

    OK,好了

  • 相关阅读:
    SpringCloud学习(二)---Eureka
    【Jmeter源码解读】001——目录结构
    TCP连接可能出现的异常总结
    TCP的socket连接
    soap-ws获取ws中的所有的接口方法
    webservice的hello world
    【环境搭建】Angular (含Hello World)
    使用Spring-boot-admin对Spring boot的服务进行监控
    idea的配置文件------application.properties和application.yml
    Spring Boot常用的注解以及含义<持续更新>
  • 原文地址:https://www.cnblogs.com/jankerxp/p/7774040.html
Copyright © 2011-2022 走看看