使用 RTTI 设置组件焦点
Set component focus with RTTI
是否可以通过Rtti达到任意控制焦点属性?如果控件为空,我想要的是将其值设置为 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;
不是每个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;
是否可以通过Rtti达到任意控制焦点属性?如果控件为空,我想要的是将其值设置为 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;
不是每个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;