我有一个输入编辑字段,用户可以在其中输入数据。我希望盒子宽度至少为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;
这适用于输入文字。但是当我删除一个字符时,它不会相应缩小。
答案 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。
注2:TEdit没有任何可用于获取文本宽度的公共canvas属性。
注3:我不喜欢这种增长和缩小输入的界面,但这可能只是个人品味的问题。