C++ Builder XE4 > 차이 > this->ScaleBy(100/s_curFactor, 100); 및 this->ScaleBy(100, s_curFactor * 100); > 전자는 계산 오차를 발생

운영 환경
C++ Builder XE4

관련


  • C++ Builder XE4 > geometry > 오른쪽 배치의 TEdit 글꼴 크기를 확대할 때 왼쪽 배치의 TChart를 나머지 공간에서 그리는 크기로 떨어뜨림 > ScaleBy()로 처리

  • 위에서 작업하는 동안 IDE 버그로 인한 오차 축적을 발견했습니다.

    앞으로 같은 문제를 만날지도 모르기 때문에 기사로 잘라낸다.

    증상 및 구현


  • 글꼴 크기를 변경할 수 있는 소프트웨어
  • ScaleBy() 사용
  • 폰트 사이즈 변경을 반복하는 것으로 오차가 축적된다
  • TButton의 가로 폭이 좁아진다


  • Unit1.cpp
    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    
    enum {
        FONT_SMALL = 0,
        FONT_MEDIUM,
        FONT_LARGE,
        FONT_EXTRA_LARGE,
        FONT_HUGE,
    };
    
    static float s_curFactor = 1.0; // 拡大率
    static int s_cntChangeSize = 0; // フォントサイズ変更回数
    
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::CMB_fontSizeChange(TObject *Sender)
    {
        s_cntChangeSize += 1;
        Label1->Caption = IntToStr(s_cntChangeSize);
    
    //-----------
        int preH = this->Height;
        int preW = this->Width;
    
        this->ScaleBy(100 / s_curFactor, 100); // 拡大率を使って拡大するため、一旦1.0の倍率に戻す
    //  this->ScaleBy(100, s_curFactor * 100); // 拡大率を使って拡大するため、一旦1.0の倍率に戻す
    
        switch(CMB_fontSize->ItemIndex){
        case FONT_SMALL:
            s_curFactor = 1.00; // 結果を見て調整する
            break;
        case FONT_MEDIUM:
            s_curFactor = 1.20; // 結果を見て調整する
            break;
        case FONT_LARGE:
            s_curFactor = 1.40; // 結果を見て調整する
            break;
        case FONT_EXTRA_LARGE:
            s_curFactor = 1.60; // 結果を見て調整する
            break;
        case FONT_HUGE:
            s_curFactor = 1.80; // 結果を見て調整する
            break;
        }
    
        this->ScaleBy(100 * s_curFactor, 100);
    
        // 元の高さ、幅に戻すことで、パネルのコンポーネントのサイズだけを拡大できる
        // (結果として、TChartは小さくなる)
        this->Height = preH;
        this->Width = preW;
    }
    //---------------------------------------------------------------------------
    

    재현 방법


  • 1. 글꼴 크기를 Huge로 설정
  • 2. 글꼴 크기를 Small로 설정
  • 3. 1단계로 돌아가기(s_cntChangeSize가 16이 될 때까지)


    Button의 B 문자가 절반 사라집니다.

    대책



    대책을 실시하지만, 이하를 검토했다.
  • IDE 버전 업시에도 문제가없는 대책

  • 버전 고유의 버그 대응은, 장래의 IDE 버전 업시에는 된다.
    어떤 버전에서도 문제가 없는 구현이 바람직하다.

    아래의 방법으로 대처할 수 있는 것을 발견했다.
    //  this->ScaleBy(100 / s_curFactor, 100); // 拡大率を使って拡大するため、一旦1.0の倍率に戻す
        this->ScaleBy(100, s_curFactor * 100); // 拡大率を使って拡大するため、一旦1.0の倍率に戻す
    



    Button B의 문자 표시에 문제가 없어졌습니다.

    좋은 웹페이지 즐겨찾기