首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >德尔菲:基于文本长度的自动TEdit在移除字符时不起作用

德尔菲:基于文本长度的自动TEdit在移除字符时不起作用
EN

Stack Overflow用户
提问于 2010-03-28 00:45:56
回答 3查看 4.5K关注 0票数 0

我有一个输入编辑字段,用户可以在其中输入数据。我希望盒子的宽度至少是191 box (最小)和最大450 box(最大)。

代码语言:javascript
复制
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;

这适用于输入文本。但是当我删除一个字符时,并没有相应地缩小.

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-03-28 01:06:33

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

而且,我没有看到任何情况下,你的宽度变小。每次迭代时,它只会变得更大( 9)。

顺便说一句,你的平均字符宽度似乎是9倍。您可以使用Canvas.TextWidth来确定文本所需的实际宽度,而无需估计。

如果您想无论如何使用"9“,您应该将它命名为常量,以明确它是什么。

快速和肮脏地使用TextWidth:

代码语言:javascript
复制
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;
票数 1
EN

Stack Overflow用户

发布于 2010-03-28 01:05:55

您只是在每次文本更改时添加9,长度比8还要高--不管变化如何。您需要将它改为基于长度的函数。

像这样的东西会起作用的:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2010-03-28 17:04:00

做这样的事:

代码语言:javascript
复制
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.MinWidthConstraints.MaxWidth。这使得您的代码在.dfm中变得干净和无用。
  • 说明2: TEdit没有任何公共画布属性,您可以使用它来获取文本宽度。
  • 注释3:我不喜欢这种输入不断增加和缩小的界面,但这可能只是个人品味的问题。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2531501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档