我建议将控件放在您自己的列表/数组中,然后您可以完全控制其内容和顺序,并且可以在需要时循环遍历它。这也确保您只触摸您真正感兴趣的控件,而不是浪费时间触摸您不感兴趣的其他控件,并且它还允许 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;