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;

现在我必须再添加一个组件
在此处输入图像描述
该函数检查数据是否有效的顺序是 ID->Name->Address->Phone->Age。但我希望它是ID->Name->Address->Age->Phone
我尝试解决它删除Phone Edit 组件,然后在添加Age Edit 组件后添加它。或者使用Phone Edit 组件为Age并为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 回答