1

Delphi で、TEdit コンポーネントを含む小さなアプリケーションを開発しました。ここに画像の説明を入力
この関数を使用して、コンポーネント フィールドが空でないかどうかを検証しました。

function TF_config.Validatefields:boolean;
var 
  i : integer;
begin
 for i := 0 to ComponentCount - 1 do
 begin
   if (Components[i]is TEdit) then
   begin
      if ((TEdit(Components[i]).Text) ='') then
      begin
        MessageDlg('Enter data in all the fields',mtWarning,[MBOK],0);
        TEdit(Components[i]).SetFocus;
        result := false;
        exit;
     end;             
   end;  //end for TEdit
 end;    //end component count 
 result := true;
end;

ここで、もう 1 つのコンポーネントを追加する
ここに画像の説明を入力
必要があります。関数が有効かどうかをチェックする順序は、 ID->Name->Address->Phone->Ageです。しかし、ID->Name->Address->Age->Phoneにしたいのです。Phone
Edit コンポーネントを 削除して解決しようとしましたが、後でAge Edit コンポーネントを追加した後に追加しました。または、AgeにPhone Editコンポーネントを使用し、Phoneに新しい Edit コンポーネントを追加しました。これはコンポーネントが少ない場合は簡単ですが、コンポーネントが多い場合は面倒です。そこで、自分たちに合うように部品を配置できないかと考えていました。これは可能ですか?

4

3 に答える 3

5

TabOrder順序付けにはプロパティを使用FindNextControlし、コントロール間を移動するにはメソッドを使用できます。

于 2012-07-18T12:02:28.290 に答える
3
  1. IDE で Alt+F12 を押すか、フォームを右クリックして [テキストとして表示] を選択し、フォームのリソース (.dfm) を開きます。
  2. 必要に応じて、コンポーネントを再配置 (カット アンド ペースト) します。リソースに表示される順序は、Components実行時にフォームのプロパティにリストされる順序です。
于 2012-07-18T11:18:20.980 に答える
3

コントロールを独自のリスト/配列に配置することをお勧めします。そうすれば、そのコンテンツと順序を完全に制御でき、必要に応じてループできます。また、これにより、実際に関心のあるコントロールのみに触れ、関心のない他のコントロールに触れて時間を無駄にしないことが保証されます。また、VCL は、適切と思われる独自の内部リストの独自の順序を維持することもできます。

type
  TF_config = class(TForm)
    procedure FormCreate(Sender: TObject);
  ...
  private
    EditFields: array[0..4] of TEdit;
    function ValidateFields: Boolean; 
  ...
  end;

procedure TF_config.FormCreate(Sender: TObject);
begin
  EditFields[0] := IdEdit;
  EditFields[1] := NameEdit;
  EditFields[2] := AddressEdit;
  EditFields[3] := AgeEdit;
  EditFields[4] := PhoneEdit;
end; 

function TF_config.ValidateFields: Boolean; 
var  
  i : integer; 
begin 
  for i := Low(EditFields) to High(EditFields) do 
  begin 
    if EditFields[i].GetTextLen = 0 then 
    begin 
      MessageDlg('Enter data in all the fields', mtWarning, [MBOK], 0); 
      EditFields[i].SetFocus; 
      Result := False; 
      Exit; 
    end;              
  end;
  Result := True; 
end; 

更新: 検証する必要がある複数の種類のコントロールがある場合は、代わりにこれを行うことができます。

type 
  TF_config = class(TForm) 
    procedure FormCreate(Sender: TObject); 
  ... 
  private 
    Fields: array[0..4] of TControl; 
    function ValidateFields: Boolean;  
  ... 
  end; 

procedure TF_config.FormCreate(Sender: TObject); 
begin 
  Fields[0] := ...; 
  Fields[1] := ...; 
  ...
  Fields[4] := ...; 
end;  

function TF_config.ValidateFields: Boolean;  
var   
  i : Integer;  
  ctrl: TControl;
begin  
  Result := True;
  for i := Low(Fields) to High(Fields) do  
  begin  
    ctrl := Fields[i];
    if ctrl is TCustomEdit then // handles both TEdit and TMemo
    begin  
      if TCustomEdit(ctrl).GetTextLen = 0 then  
      begin  
        Result := False;
        Break;
      end;               
    end;
    if ctrl is TComboBox then
    begin  
      if TComboBox(ctrl).ItemIndex = -1 then  
      begin  
        Result := False;
        Break;
      end;               
    end;
    ... and so on ...
  end;
  if not Result then
  begin
    MessageDlg('Enter data in all the fields', mtWarning, [MBOK], 0);  
    ctrl.SetFocus;  
  end;
end; 
于 2012-07-18T17:28:17.400 に答える