CnPack Forum » CnVCL 组件包 » 请指教,怎么样让组件自动适应内容的大小!


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.