Delphi: автоматическое масштабирование TEdit на основе длины текста не работает при удалении символов - PullRequest
0 голосов
/ 28 марта 2010

У меня есть поле ввода ввода, где пользователь может вводить данные. Я хочу, чтобы ширина окна была не менее 191px (мин) и не более 450px (макс.).

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 ]

1 голос
/ 28 марта 2010

В вашем коде ничего не произойдет, если длина вашего текста не превышает 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;
1 голос
/ 28 марта 2010

Вы просто добавляете 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 окна редактирования, чтобы оно также сохраняло свои поля в правой части, и только изменяло размер вашей формы.

Однако вы, вероятно, захотите подумать, действительно ли это хорошая идея. Почему бы не позволить полю ввода просто иметь один размер? В целом, выглядит лучше, если окна не изменяют размеры самостоятельно.

0 голосов
/ 28 марта 2010

Сделайте что-то вроде этого:

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: Мне не нравится этот вид интерфейса с растущими и сокращающимися входами, но это, вероятно, просто вопрос личного вкуса.

...