डेल्फी में बॉक्स और पाठ सहित टीसीचबॉक्स का कुल आकार प्राप्त करें

Jan 15 2021

मैं TCheckbox का कुल आकार प्राप्त करना चाहता हूं, जिसमें डेल्फी में बॉक्स और पाठ भी शामिल है। मैं डेल्फी FMX TCheckbox / TRadiobutton Autosize में लेख की जांच करता हूं , लेकिन ऐसा लगता है कि TCheckbox में कैनवस संपत्ति नहीं है, इसलिए कोड इसके लिए फिट नहीं है।

अपडेट करें

मुझे इसका कारण बताने की आवश्यकता है कि मुझे यह जानना चाहिए। मेरे कुछ चेकबॉक्स में, मुझे चेकबॉक्स से संबंधित एक स्पाईडिट डालना होगा। उदाहरण के लिए, चेकबॉक्स में "फ़ाइल को विभाजित करें जब यह" ### "बाइट्स" से बड़ा होता है, जहां ### स्पिन संपादन होता है।

चूंकि चेकबॉक्स ऑटो-आकार का समर्थन नहीं करता है, इसलिए चेकबॉक्स को बड़ा करने का एक तरीका है ताकि यह सभी ग्रंथों के साथ हो। फिर अंतिम दृश्य चरित्र के बाद स्पिन संपादित करें।

यह एकल भाषा के लिए ठीक है, हालांकि, बहु-भाषा का समर्थन करने के लिए, कुछ भाषा दूसरों की तुलना में बहुत लंबी होगी।

ऐसे मामले में, मैं चुन सकता हूं:

  1. चेकबक्सो दृश्यमान भाग के आकार की गणना करें।

या

  1. अंतिम दृश्य चरित्र और स्पिन संपादन के बीच कुछ रिक्त स्थान रखें।

पद्धति 2 बहुत अच्छी नहीं है क्योंकि कुछ भाषाओं के लिए चेकबॉक्स और स्पिन एडिट के बीच बड़ी दूरी होगी।

अपडेट २

एक और समस्या, मैं एक बटन के लिए एक ही काम करने की कोशिश करता हूं, जैसा कि नीचे है:

var
  bmp: TBitmap;
  size: TSize;
  width: Integer;
begin
  Checkbox1.Caption := Edit3.Text;
  Button3.Caption := Edit3.Text;

  bmp := TBitmap.Create;
  try
    bmp.SetSize(CheckBox1.Width, CheckBox1.Height);
    bmp.Canvas.Font := CheckBox1.Font;
    size := bmp.Canvas.TextExtent(CheckBox1.Caption);
    Width := bmp.Canvas.TextWidth(Checkbox1.Caption);
    CheckBox1.Width := size.cx + 20;
    button3.Width := size.cx;
    SpinEdit1.Left := Checkbox1.Left + Checkbox1.Width + 5;
  finally
    bmp.Free;
  end;
end;

चूंकि बटन में कोई बॉक्स नहीं है, इसलिए मैं कुछ मूल्य जोड़ने के बजाय size.cx का उपयोग करता हूं। हालांकि, मेरे परीक्षण में, वास्तव में पाठ की चौड़ाई सही नहीं है, जिससे बटन पूरे पाठ को आगे नहीं बढ़ा सकता है, नीचे देखें:

जवाब

2 AndreasRejbrand Jan 15 2021 at 21:20

यहाँ मेरे दो सेंट हैं।

वास्तविक चेकबॉक्स का आकार प्राप्त करने के लिए, मेरा मानना ​​है कि आपको Win32 थीम API ( uses UxTheme) पूछना चाहिए :

var
  h: HTHEME;
  S: TSize;
begin

  h := OpenThemeData(Handle, 'BUTTON');
  try

    if Succeeded(GetThemePartSize(h, Canvas.Handle, BP_CHECKBOX,
      CBS_UNCHECKEDNORMAL, nil, TS_DRAW, S))
    then
      ShowMessage('Check box width: ' + S.cx.ToString);

  finally
    CloseThemeData(h);
  end;

इसी प्रकार, यह पाठ की चौड़ाई (कैप्शन) को पुनः प्राप्त करता है:

var
  h: HTHEME;
  R: TRect;
begin

  h := OpenThemeData(Handle, 'BUTTON');
  try

    if Succeeded(GetThemeTextExtent(h, Canvas.Handle, BP_CHECKBOX,
      CBS_UNCHECKEDNORMAL, PChar(CheckBox1.Caption),
      Length(CheckBox1.Caption), 0, nil, R))
    then
      ShowMessage('Caption width: ' + R.Width.ToString);

  finally
    CloseThemeData(h);
  end;

जो कुछ अज्ञात है वह चेक बॉक्स और कैप्शन के बीच पैडिंग है। मैं इसे प्राप्त करने का सही तरीका नहीं जानता, लेकिन ऐसा लगता है कि यह सबसे अधिक बार एक अंतरिक्ष की चौड़ाई के समान है:

var
  h: HTHEME;
  S: TSize;
  R: TRect;
begin

  h := OpenThemeData(Handle, 'BUTTON');
  try

    if Succeeded(GetThemePartSize(h, Canvas.Handle, BP_CHECKBOX,
      CBS_UNCHECKEDNORMAL, nil, TS_DRAW, S))
    then
      ShowMessage('Check box width: ' + S.cx.ToString);

    if Succeeded(GetThemeTextExtent(h, Canvas.Handle, BP_CHECKBOX,
      CBS_UNCHECKEDNORMAL, PChar(#32+CheckBox1.Caption),
      1+Length(CheckBox1.Caption), 0, nil, R))
    then
      ShowMessage('Caption width including padding: ' + R.Width.ToString);

  finally
    CloseThemeData(h);
  end;