0

ユーザーがデータを入力できる入力編集フィールドがあります。ボックスの幅を少なくとも 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;

これは、テキストを入力する場合に機能します。しかし、1 つの文字を削除しても、それに応じて縮小されません。

4

3 に答える 3

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 に答える
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 つにしないのはなぜですか? 一般に、ウィンドウが自動的にサイズ変更されない方が見栄えがよくなります。

于 2010-03-28T01:05:55.323 に答える
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 に答える