2007-8-7 17:06
piaolingfeihu
请指教,怎么样让组件自动适应内容的大小!
多语言实现了,但是对于中文和英文的内容长度是不一样的,所以在读取的时候,还要去考虑组件的长度,是不是能够自动调节其大小,从而适应期所读内容。请各位大大指教!
如果不能够自动调节,那么就要把组件调节到足够长,这样界面的整体效果就会很难看!
2007-8-7 17:11
Passion
有AutoSize的属性就比较好办,没有的话就只有写代码调了。
2007-8-7 17:32
piaolingfeihu
谢谢
2007-8-7 17:35
piaolingfeihu
谢谢您,
这个我知道,但是怎么样去实现这样的自动调节那?比如label button等组件具有AutoSize,但是他们的长度依然会影响界面的布局阿!我的意思是整体,假设前面有个Label后面有个button,当Label加长时,button也会相应的往后移动,从而适应Label,不会把显示内容挡住!
2007-8-7 21:22
Passion
回复 #4 piaolingfeihu 的帖子
这个可以用Align来做嘛。比如这样的布局,:
object Form1: TForm1
Left = 192
Top = 107
Width = 870
Height = 640
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object pnl1: TPanel
Left = 272
Top = 88
Width = 409
Height = 289
Caption = 'pnl1'
TabOrder = 0
object lbl2: TLabel
Left = 1
Top = 1
Width = 16
Height = 287
Align = alLeft
Caption = 'lbl2'
end
object pnl2: TPanel
Left = 17
Top = 1
Width = 185
Height = 287
Align = alLeft
BevelOuter = bvNone
Caption = 'pnl2'
TabOrder = 0
object btn1: TButton
Left = 8
Top = 8
Width = 75
Height = 25
Caption = 'btn1'
TabOrder = 0
end
end
end
object btn2: TButton
Left = 128
Top = 48
Width = 75
Height = 25
Caption = 'btn2'
TabOrder = 1
OnClick = btn2Click
end
end
如果写了:
procedure TForm1.btn2Click(Sender: TObject);
begin
Self.lbl2.Caption := 'xxxxxxxxxxxxx';
end;
那么点击btn2时,label的文字改变了,长度改变了,右边的button也会自动移动。
用个Panel来容纳button是因为button没有Align属性。
2007-8-8 11:04
piaolingfeihu
谢谢您的指导
但是这只是一个特例,整个界面不可能分布的比较均匀,有很多地方含有这样的问题,不可能在调整界面是每个地方都添加 Panel,是不是可以通过程序的方式实现。
我曾经试过:按钮根据其前面的组件的 (Width - Left)调整其相对位置,但是,还有的时候按钮界于两个组件之间。操作起来就比较麻烦了阿!
我是想您能不能给我提供个编写一个独立的单元文件,从而在组建遇到一些特殊情况的时候自适应的去调整!
再次谢谢您的指导!
2007-8-8 16:09
Passion
问题是现在没有一个通用明确的规则来处理布局问题,只能用align来保证不重叠,其余的不好办啊。
2007-8-10 09:56
piaolingfeihu
谢谢您
但是还是感觉并不是能够自动适应,因为我想着整个界面上不可能只是有一个button和一个label,如果大家摇动的话都要作相应的调整。我也试了一下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
lbl1: TLabel;
pnl1: TPanel;
btn1: TButton;
btn2: TButton;
edt1: TEdit;
procedure btn1Click(Sender: TObject);
procedure edt1Change(Sender: TObject);
procedure btn2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
ss: Integer;
implementation
{$R *.dfm}
procedure TForm1.btn1Click(Sender: TObject);
var
i: Integer;
j: Integer;
begin
//i:=edt1.GetTextLen;
ShowMessage(IntToStr(btn1.Left));
ShowMessage(IntToStr(btn1.Width));
J := btn1.Left + btn1.Width;
//ShowMessage(IntToStr(lbl1.Left));
//ShowMessage(IntToStr(lbl1.Width));
{ i:=lbl1.GetTextLen;
ShowMessage(IntToStr(i)); }
end;
procedure TForm1.edt1Change(Sender: TObject);
begin
//ShowMessage(IntToStr(GetTextLen));
end;
procedure TForm1.btn2Click(Sender: TObject);
var
a, j: Integer;
// conpent : TComponent;
begin
if lbl1.Caption = 'abHiWsdfTYADFglASDF.' then Exit;
lbl1.Caption := 'abHiWsdfTYADFglASDF.';
a := lbl1.Width;
btn1.Left := btn1.Left + (a - ss);
if (edt1.Top = btn1.Top) or (edt1.Top < (btn1.Top + btn1.Height)) or ((edt1.Height - edt1.Top) < (btn1.Top + btn1.Height)) then
if edt1.Left > btn1.Left then
begin
edt1.Left := edt1.Left + (a - ss);
end;
ShowMessage(IntToStr(Form1.Width));
if Form1.Width < (btn1.Left + btn1.Width) then
begin
Form1.Width := Form1.Width + (btn1.Left + btn1.Width - Form1.Width) + 10;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ss := lbl1.Width;
end;
end.
我是定性作了一下判断并且座移动,但是还是有很多未知情况,比如,如果在窗体的边缘,窗体部能够在增大?等等问题!不过感觉这样子是不是有些太苛刻了,请您指教是不是还有其他的方法!
2007-8-15 11:26
haitao
【技术贴,Form Resize时控件位置、宽度的自动调整】
【技术贴,Form Resize时控件位置、宽度的自动调整】(希望能按等宽字体来显示下面的内容)
控件简化为“Label:[Edit_____]”这样的情形,同一行的Edit们都按比较调整宽度,Edit和Label的left都适当变化,如:
123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_
Label1:[Edit1_____________] Label2:[Edit2___________________________________________] Label3
宽度:20 宽度:50
窗体(parent)的宽度:100
如果窗体(parent)的宽度变为了:80
Label1的left和宽度都不变;
Edit1的left不变
Edit1的宽度应该变为:20*(20+50 + (80-100))/(20+50)=100/7==14;
Label2的left应该变为:原来的left+(14-20)
宽度不变;
Edit2的left应该变为:原来的left+(14-20)
Edit2的宽度应该变为:50*(20+50 + (80-100))/(20+50)=250/7==36;
Label3的left应该变为:原来的left+(14-20)+(36-50)
宽度不变
这样好像很合理,但是如果有2行,就可以看出不合理的地方了:
123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_
Label1:[Edit1_____________] Label2:[Edit2___________________________________________] Label3
宽度:20 宽度:50
123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_
Label5:[Edit5_____________] Label6:[Edit6_________________________________] Label7
宽度:20 宽度:40
如果窗体(parent)的宽度从100变为了:80
Label5的left和宽度都不变;
Edit5的left不变
Edit5的宽度应该变为:20*(20+40 + (80-100))/(20+40)=80/6==13; <--这里!原来上下对齐的Edit1和Edit5居然不对齐了!
。。。。。。
看来这种变化方式不行。。。。。。。
2007-8-15 15:43
piaolingfeihu
请问有专门这方面的控件吗?
谢谢您的回复,我想问一下有没有专门这方面的控件,我想学习一下!
2007-8-20 15:13
piaolingfeihu
问题已经得到解决!
2007-8-20 15:14
piaolingfeihu
我的方法!
我采用了首先获得组件上可显示信息的宽度,然后通过算法,实现组件的自适应宽度以及位置!
不过还是要感谢各位对我的帮助!
谢谢!
页:
[1]
Powered by Discuz! Archiver 5.0.0
© 2001-2006 Comsenz Inc.