一个关于TCheckBox的问题(100分)

  • 主题发起人 主题发起人 dmg01
  • 开始时间 开始时间
D

dmg01

Unregistered / Unconfirmed
GUEST, unregistred user!
如何实现TCheckbox的类似于TLabel的AutoSize那样的属性,即根据TCheckBox的Caption自动设定TCheckBox的Width?
 
procedure TForm1.Button1Click(Sender: TObject);
var x:integer;
begin
checkbox1.Caption:='123456789987654321';
checkbox1.Width:=length(checkbox1.Caption)+x;//x的值自己试一下
end;
 
x的值是多少?
Length的是Caption的字符个数,而With则是像素啊?!
 
如果按楼上的DFW所说的做的话肯定不行的。
因为length(checkbox1.Caption)返回的是字符个数,它的长度与每个字符在窗体上显示的
宽度是不同的。这点也就决定了不能用它来加一上个固定的X作为这个控件的宽度。我的想
法是这样的:
checkbox1.Width:=(Caption中的中文个数)*每个中文在窗体上显示的宽度+
(Caption中的英文个数)*每个英文在窗体上显示的宽度;
每个中英文在窗体上显示的宽度是可以用label作试验得到的。
你可需要考虑到字体大小不同的情况
如果你经常要使用到这种情况的话最好自己定义一个Tcheckbox类的属性。
 
to bluekiller:
你说得同样也不行,哪有这样的笨方法?

try this:

procedure TForm1.FormShow(Sender: TObject);
begin
checkbox1.Width := Self.Canvas.TextWidth(checkbox1.caption) + 20;
end;

测试的时候可将Checkbox1的Color属性改成其他的,容易看出效果。

100分都给我吧!
 
imok方法的改进
procedure TForm1.Button1Click(Sender: TObject);
var x:integer;
begin
checkbox1.Caption:='123456789987654321';
label1.caption:=checkbox1.caption;
label1.visible:=false;//在设计时直接设定
label1.autosize:=true;//在设计时直接设定
checkbox1.Width:=label1.width+x;//x的值自己试一下,就是那个小框框的宽度
end;

程序没试,你自己试试吧
 
不好意思,刚才没看到楼上说的,
出去试了一试,把x设为20,两种方法都可以,不过当然是楼上老兄更高一筹哇:)
 
小框框的宽度一定是一个固定的值么?
 
刚才试了一下,无论是加宽,加高还是改变字体大小,小框框都不会变,应该是固定的
结果也是对的
 
to Adnil:
刚才我按你所说的方法试了一下,你的方法的确可以,但却不完全——没有考虑到字体大小
的改变,如果把字体变大了那就不大对了。我觉得应该加入字体大小的因素,你再试一下,
把它完善,OK?
嘻嘻,又学了点东东。谢各位了。
 
不会吧,小我试的时候,小框一直都是一个样子,但小框和字的间距有很小变化。是不
是和字的长度有关?
 
其实如果只注重那个 CheckBox 的小框的宽度的话,你可以将 CheckBox 的 Width
设一个很大的数(如 1000),再把 Form1 的 AutoScroll 设为 False ,程序会自动把多余
的去掉。当然,这是一种无赖的办法
 
其实Adnil的办法已经很接近了,但他没考虑到CheckBox的Font与Self.Font不一致时的情况
所以应该用下面的办法:
var
ACanvas: TCanvas;
notUsed: HWND;
begin
ACanvas := TCanvas.Create;
//用TCanvas的目的是为了计算CheckBox1的Caption的宽、高
//当然可能有更好的办法,没有再去找了。
try
ACanvas.Handle := GetDeviceContext(notUsed);
ACanvas.Font.Assign(CheckBox1.Font);
CheckBox1.Width := ACanvas.TextWidth(CheckBox1.Caption) + 20;
CheckBox1.Height := ACanvas.TextHeight(CheckBox1.Caption);
finally
ACanvas.Free;
end;
end;
 
很简单,固定值加Caption的宽度
 
谢谢各位,问题已解决了
 
xianjun, 你好
小第想问一下你GetDeviceContext的含义,也就是HDC与Handle的区别,在你的例子中
如果我改为:Acanvas.Handle:=notused;为什么执行后CheckBox不见了.
 
GetDeviceContext就是取得当前窗口的Canvas.Handle罢了
你把它换成 ACanvas.Handle := Canvas.Handle也是一样的。
HDC指的是the Windows GDI handle to the device context
而TWinControl.Handle是the window handle for the underlying Microsoft Windows screen object.
所以两个是完全不同的东西,你把它改成Acanvas.Handle:=notused;后
ACanvas.TextHeight(CheckBox1.Caption)返回0,把CheckBox1.Width := 0后,当然看不见了。
 
GetDeviceContext就是取得当前窗口的Canvas.Handle罢了
你把它换成 ACanvas.Handle := Canvas.Handle也是一样的。
HDC指的是the Windows GDI handle to the device context
而TWinControl.Handle是the window handle for the underlying Microsoft Windows screen object.
所以两个是完全不同的东西,你把它改成Acanvas.Handle:=notused;后
ACanvas.TextHeight(CheckBox1.Caption)返回0,把CheckBox1.Width := 0后,当然看不见了。
 
楼上的你们好:
我不明白:当我把ACanvas.Handle:=Canvas.Handle;时编译错误显示:
undeclare canvas 我想是因为TCHeckBox没有Canvas吧.
 
后退
顶部