2010-03-28 5 views
0

J'ai un champ d'édition d'entrée où l'utilisateur peut entrer des données. Je veux que la largeur de la boîte soit d'au moins 191px (min) et maximum de 450px (max).Delphi: Autoscale TEdit basé sur la longueur du texte ne fonctionne pas lors de la suppression des caractères

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; 

Cela fonctionne pour la saisie de texte. Mais quand je supprime un char, il ne se redimensionne pas en conséquence.

Répondre

1

Dans votre code, rien ne se passera si votre texte comporte moins de 8 caractères.

En outre, je ne vois aucune condition sous laquelle votre largeur devient plus petite. Il ne fait que grossir (de 9) à chaque itération. A propos, vous semblez multiplier par 9 comme une largeur de caractère moyenne. Vous pouvez utiliser Canvas.TextWidth pour déterminer la largeur réelle requise par le texte sans estimer.

Si vous voulez utiliser "9" de toute façon, vous devriez le nommer comme une constante pour clarifier ce que c'est.

rapide et sale à l'aide 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

Vous ajoutez juste 9 chaque fois que le texte change et la longueur est supérieure à 8 - quel que soit le changement. Vous devez en faire une fonction basée sur la longueur à la place.

Quelque chose comme ça ferait l'affaire:

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; 

Ce n'est pas vraiment une solution très jolie, bien - changer toutes ces propriétés de la même manière est laid. Au lieu de cela, puisqu'il apparaît que vous redimensionnez également le formulaire, vous pouvez modifier la propriété Anchors de votre zone d'édition pour lui faire conserver sa marge sur le côté droit, et redimensionner uniquement votre formulaire.

Cependant, vous voudrez probablement considérer si c'est vraiment une bonne idée. Pourquoi ne pas laisser le champ de saisie avoir une seule taille? En général, il est préférable que les fenêtres ne se redimensionnent pas d'elles-mêmes.

+0

+1 parce que vous remettez en question la facilité d'utilisation de cette approche – dummzeuch

0

quelque chose comme ça:

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; 
  • Note 1: Ne pas essayer manuellement pour limiter la taille. Au lieu de cela, définissez Constraints.MinWidth et Contraintes.MaxWidth via l'éditeur de propriétés. Cela laisse votre code propre et inutile comme ça dans le fichier .dfm.

  • Remarque 2: TEdit ne possède aucune propriété de canevas publique que vous pouvez utiliser pour obtenir la largeur du texte.

  • Note 3: Je n'aime pas ce type d'interface avec des entrées croissantes et rétrécissantes, mais c'est probablement juste une question de goût personnel.

+0

On note 1 bon;) Sur Note 2: J'utilisé les formulaires toile. Fonctionne comme un charme. Note 3: Le client le veut ainsi ... – Acron