我在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->名称 - >地址 - >电话 - >年龄。但我希望它是 ID-> Name-> Address-> Age-> Phone 。
我尝试解决这个问题,删除手机编辑组件,然后在添加年龄编辑组件后添加它。或者使用手机编辑组件为年龄并为电话添加新的编辑组件。这对于少数组件来说更容易,但是当拥有许多组件时变得乏味。
所以我想知道我们是否可以以适合我们的方式安排组件。这可能吗?
答案 0 :(得分:5)
您可以使用TabOrder
属性进行排序,使用FindNextControl
方法在控件之间移动。
答案 1 :(得分:3)
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;