如何控制Components数组中的项目顺序?

时间:2012-07-18 11:07:16

标签: delphi components

我在Delphi中开发了一个带有TEdit组件的小应用程序。enter image description here
我使用此函数来验证组件字段是否为空。

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;

现在我必须添加一个组件
enter image description here
函数检查数据的顺序(如果有效) ID->名称 - >地址 - >电话 - >年龄。但我希望它是 ID-> Name-> Address-> Age-> Phone
我尝试解决这个问题,删除手机编辑组件,然后在添加年龄编辑组件后添加它。或者使用手机编辑组件为年龄并为电话添加新的编辑组件。这对于少数组件来说更容易,但是当拥有许多组件时变得乏味。 所以我想知道我们是否可以以适合我们的方式安排组件。这可能吗?

3 个答案:

答案 0 :(得分:5)

您可以使用TabOrder属性进行排序,使用FindNextControl方法在控件之间移动。

答案 1 :(得分:3)

  1. 在IDE中,按Alt + F12或右键单击表单并选择“以文本形式查看”以打开表单的资源(.dfm)
  2. 根据需要重新排列组件(剪切和粘贴)。它们在资源中出现的顺序是它们在运行时在表单的Components属性中列出的顺序。

答案 2 :(得分:3)

我建议将控件放在您自己的列表/数组中,然后您可以完全控制其内容和排序,并可以在需要时循环访问它。这也确保您只触摸您实际感兴趣的控件,而不是浪费时间触及您不感兴趣的其他控件,并且它还允许VCL在其认为合适的情况下维护其自己的内部列表的排序。 / p>

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;