0

我有一个输入编辑字段,用户可以在其中输入数据。我希望框宽度至少为 191 像素(最小),最大为 450 像素(最大)。

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;

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

4

3 回答 3

1

每次文本更改并且长度大于 8 时,您只需添加 9 - 无论更改如何。您需要将其设为基于长度的函数。

像这样的东西可以解决问题:

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 属性以使其也保持其右侧的边距,并且仅调整表单的大小。

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

于 2010-03-28T01:05:55.323 回答
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;
于 2010-03-28T01:06:33.223 回答
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.MinWidthConstraints.MaxWidth 。这会使您的代码在 .dfm 中像这样干净且无用的 GUI 内容。

  • 注意 2:TEdit 没有任何可用于获取文本宽度的公共画布属性。

  • 注3:我不喜欢这种输入有增有减的界面,但可能只是个人喜好问题。

于 2010-03-28T17:04:00.407 回答