c++ builder > TImage가 오기 때문에 거기 비우도록 구현 v0.1, v0.2

운영 환경
C++ Builder XE4

하고 싶은 일


  • TImage는 평상시는 숨겨져 있다 (오른쪽의 화면외)
  • 특정 조건에서 TImage 표시
  • 위치 아래의 여러 구성 요소를 아래로 옮깁니다


  • v0.1 태그 사용



    구현안


  • 특정 Tag의 값을 가지는 컴퍼넌트만 시프트

  • 구현



    Unit1.cpp
    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include <pngimage.hpp>
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormShow(TObject *Sender)
    {
        Image1->Picture->LoadFromFile(L"AD2.png");
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::B_toLeftClick(TObject *Sender)
    {
        static const int kTag_move = 79;
        static const int kMargin_down = 10;
    
        // 1. Image1の高さ分、コンポーネントを下にずらす
    
        for(int idx=0; idx < this->ComponentCount; idx++) {
            TComponent *aPtr = this->Components[idx];
            if (aPtr->Tag != kTag_move) {
                continue;
            }
    
            TControl *ctlPtr = (TControl *)aPtr;
            ctlPtr->Top += ( Image1->Height + kMargin_down );
        }
    
        this->Height += Image1->Height;
    
        // 2. Image1を左に移動
        Image1->Left = 16;
    }
    //---------------------------------------------------------------------------
    

    v0.1 결과



    이동 전





    이동 후





    다른 제안



    Tag는 다른 용도로 사용할 수 있다.

    이 경우, TControl *의 리스트에, 이동 대상이 되는 컴퍼넌트의 포인터를 격납한다.
    이들에 대해서만 이동 처리를 실장하면 된다.

    v0.2 TControl * 목록에 지정



    구현



    Unit1.cpp
    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include <pngimage.hpp>
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    
    
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormShow(TObject *Sender)
    {
        Image1->Picture->LoadFromFile(L"AD2.png");
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::B_toLeftClick(TObject *Sender)
    {
        static const int kMargin_down = 10;
    
        static TControl *targetList[] = {
            Panel1,
            Button1,
            Label2,
            StringGrid1,
        };
        int targetCount = sizeof(targetList) / sizeof(targetList[0]);
    
    
        // 1. Image1の高さ分、コンポーネントを下にずらす
    
        for(int idx=0; idx < targetCount; idx++) {
            TControl *aPtr = targetList[idx];
            aPtr->Top += ( Image1->Height + kMargin_down );
        }
    
        this->Height += ( Image1->Height + kMargin_down );
    
        // 2. Image1を左に移動
        Image1->Left = 16;
    }
    //---------------------------------------------------------------------------
    

    targetList[]의 정의는 함수내에서 하고 있지만, 다른 장소에서 정의하는 것이 좋다.

    Tag 지정보다 이쪽이 좋은 점은, 코드로 의도를 알 것.
    Tag 지정의 경우는, 폼 디자인으로 Tag를 확인하지 않으면, 어느 것이 이동 대상의 컴퍼넌트인지 모른다. 소스 리딩하기 어려워진다.

    다른 장소에서 targetList[]를 선언하려고 했지만 포기했다.
    targetList[]에 저장하는 포인터는 FormShow 처리 이후에 저장할 필요가 있다.
    그것을 생각하면 처리가 복잡해진다.

    검색 키워드



    (추기 2018/10/18)
  • 거기서 거기
  • 좋은 웹페이지 즐겨찾기