使用RTTI设置组件焦点(Set component focus with RTTI)

编程入门 行业动态 更新时间:2024-10-27 02:18:54
使用RTTI设置组件焦点(Set component focus with RTTI)

是否可以通过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;

Is it possible to reach any control Focus property through Rtti? What I want is to set its value to True if the control is Empty. Any help would be greatly appreciated.

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;

Not every TControl can receive the focus, only TWinControl can. So instead of TControl use TWinControl and use its method 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;

更多推荐

本文发布于:2023-08-01 20:02:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1364838.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:组件   焦点   RTTI   focus   component

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!