डेल्फी में बॉक्स और पाठ सहित टीसीचबॉक्स का कुल आकार प्राप्त करें
मैं TCheckbox का कुल आकार प्राप्त करना चाहता हूं, जिसमें डेल्फी में बॉक्स और पाठ भी शामिल है। मैं डेल्फी FMX TCheckbox / TRadiobutton Autosize में लेख की जांच करता हूं , लेकिन ऐसा लगता है कि TCheckbox में कैनवस संपत्ति नहीं है, इसलिए कोड इसके लिए फिट नहीं है।
अपडेट करें
मुझे इसका कारण बताने की आवश्यकता है कि मुझे यह जानना चाहिए। मेरे कुछ चेकबॉक्स में, मुझे चेकबॉक्स से संबंधित एक स्पाईडिट डालना होगा। उदाहरण के लिए, चेकबॉक्स में "फ़ाइल को विभाजित करें जब यह" ### "बाइट्स" से बड़ा होता है, जहां ### स्पिन संपादन होता है।
चूंकि चेकबॉक्स ऑटो-आकार का समर्थन नहीं करता है, इसलिए चेकबॉक्स को बड़ा करने का एक तरीका है ताकि यह सभी ग्रंथों के साथ हो। फिर अंतिम दृश्य चरित्र के बाद स्पिन संपादित करें।
यह एकल भाषा के लिए ठीक है, हालांकि, बहु-भाषा का समर्थन करने के लिए, कुछ भाषा दूसरों की तुलना में बहुत लंबी होगी।
ऐसे मामले में, मैं चुन सकता हूं:
- चेकबक्सो दृश्यमान भाग के आकार की गणना करें।
या
- अंतिम दृश्य चरित्र और स्पिन संपादन के बीच कुछ रिक्त स्थान रखें।
पद्धति 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 का उपयोग करता हूं। हालांकि, मेरे परीक्षण में, वास्तव में पाठ की चौड़ाई सही नहीं है, जिससे बटन पूरे पाठ को आगे नहीं बढ़ा सकता है, नीचे देखें:
जवाब
यहाँ मेरे दो सेंट हैं।
वास्तविक चेकबॉक्स का आकार प्राप्त करने के लिए, मेरा मानना है कि आपको 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;