Delphi:基于文本长度的自动缩放TEdit在删除字符时不起作用

时间:2010-03-28 00:45:57

标签: delphi scale

我有一个输入编辑字段,用户可以在其中输入数据。我希望盒子宽度至少为191px(min),最大为450px(max)。

procedure THauptform.edtEingabeChange(Sender: TObject);
begin

// Scale
if Length(edtEingabe.Text) > 8 then
    begin
        if Hauptform.Width <= 450 then
            begin
                verschiebung := verschiebung + 9;
                // The initial values like 'oldedtEingabeWidth' are global vars.
                edtEingabe.Width := oldedtEingabeWidth + verschiebung;
                buDo.Left := oldbuDoLeft + verschiebung;
                Hauptform.Width := oldHauptformWidth + verschiebung;
            end;
    end;
end;

这适用于输入文字。但是当我删除一个字符时,它不会相应缩小。

3 个答案:

答案 0 :(得分:1)

每次文本更改时,您只需添加9,长度大于8 - 无论更改如何。你需要根据长度使它成为一个函数。

这样的事情可以解决问题:

procedure THauptform.edtEingabeChange(Sender: TObject); 
var
  len: integer;
  additionalWidth: integer;
begin
  len := Length(edtEingabe.Text);
  if len <=8 then
    additionalWidth:=0
  else
    additionalWidth:=(len-8)*9; //Assuming we need an extra 9 pixels per character after the 8th one
  if additionalWidth > 259 then additionalWidth := 259; // maximum - minimum

  edtEingabe.Width := 191 + additionalWidth;
  Width := OriginalFormWidth + additionalWidth; // You'll need to know what the minimum width of your form is
end;

这不是一个非常漂亮的解决方案 - 以同样的方式改变所有这些属性是丑陋的。相反,由于您似乎也在调整表单大小,您可以更改编辑框的Anchors属性,使其保持右侧边距,并仅调整表单大小。

但是,您可能想要考虑这是否真的是一个好主意。为什么不让输入字段只有一个大小?一般来说,如果窗口不能自行调整大小,效果会更好。

答案 1 :(得分:1)

在您的代码中,当您的文字长度少于8个字符时,不会发生任何事情。

另外,我没有看到宽度变小的任何条件。每次迭代时它只会变大(乘以9)。

顺便说一句,您似乎乘以9作为平均字符宽度。您可以使用Canvas.TextWidth来确定文本所需的实际宽度而不进行估算。

如果你想使用“9”,你应该把它命名为常数,以明确它是什么。

使用TextWidth快速和脏:

const
   MAX_EINGABE_WIDTH = 450;
   MIN_EINGABE_WIDTH = 191;

procedure THauptform.edtEingabeChange(Sender: TObject);
var Width: Integer;
begin

    // Scale
    Width := edtEingabe.Canvas.TextWidth(edtEingabe.Text);
    if Width > MAX_EINGABE_WIDTH then
       Width := MAX_EINGABE_WIDTH
    else if Width < MIN_EINGABE_WIDTH then
       Width := MIN_EINGABE_WIDTH

    edtEingabe.Width := Width;

end;

答案 2 :(得分:0)

做这样的事情:

procedure THauptform.edtEingabeChange(Sender: TObject);
var
  Edit:TEdit;
begin
  Edit := TEdit(Sender);
  Edit.Width := Canvas.TextWidth(Edit.Text+' |')+
                  Edit.Padding.Left+
                  Edit.Padding.Right;
end;
  • 注1:请勿手动尝试限制大小。而是通过属性编辑器设置 Constraints.MinWidth Constraints.MaxWidth 。这使得你的代码在.dfm。

  • 中保持清洁和无用的GUI
  • 注2:TEdit没有任何可用于获取文本宽度的公共canvas属性。

  • 注3:我不喜欢这种增长和缩小输入的界面,但这可能只是个人品味的问题。