是否可以通过Rtti获得任何控制Focus属性?我想要的是如果控件为空,则将其值设置为True。 任何帮助将不胜感激。
procedure SetFirstEmptyCtrlFocused;
function HasTextProp(aControl: TControl): Boolean;
var
Ctx: TRttiContext;
Prop: TRttiProperty;
begin
Prop := lCtx.GetType(aControl.ClassType).GetProperty('Text');
Result := (Prop <> nil) and (Prop.Visibility in [mvPublic, mvPublished])
and (Prop.GetValue(aControl).ToString = '');
end;
var
ObjList: TObjectList<TControl>;
objIdx: Integer;
Ctrl: TControl;
begin
ObjList := TObjectList<TControl>.Create;
ObjList.Add(cxTextEdit1);
ObjList.Add(cxDateEdit1);
ObjList.Add(cxTextEdit2);
for objIdx := 0 to lObjList.Count -1 do
begin
Ctrl := lObjList.Items[objIdx];
if HasTextProp(lCtrl) then
begin
SetCtrlFocused //...??
Break;
end;
end;
end;
答案 0 :(得分:3)
并非每个 TControl 都能获得焦点,只有 TWinControl 可以。因此,而不是 TControl 使用 TWinControl 并使用其方法 SetFocus :
procedure SetFirstEmptyWinCtrlFocused;
function HasTextProp(aControl: TWinControl): Boolean;
var
Ctx: TRttiContext;
Prop: TRttiProperty;
begin
Prop := Ctx.GetType(aControl.ClassType).GetProperty('Text');
Result := (Prop <> nil) and (Prop.Visibility in [mvPublic, mvPublished])
and (Prop.GetValue(aControl).ToString = '');
end;
var
ObjList: TObjectList<TWinControl>;
objIdx: Integer;
Ctrl: TWinControl;
begin
ObjList := TObjectList<TWinControl>.Create;
ObjList.Add(cxTextEdit1);
ObjList.Add(cxDateEdit1);
ObjList.Add(cxTextEdit2);
for objIdx := 0 to lObjList.Count -1 do
begin
Ctrl := lObjList.Items[objIdx];
if HasTextProp(Ctrl) then
begin
Ctrl.SetFocus;
Break;
end;
end;
end;