delphi中能否变通地实现宏代换?
delphi中能否变通地实现宏代换?
- Delphi(Pascal) code
var strEditName:string; Begin strEditName:='edtStudentName'; //从数据库的配置表中读取此值 TEdit(Self.FindComponent(strEditName)).visible:=False;
能否实现以下代码?
- Delphi(Pascal) code
var strEditName:string; strControlKind:string;Begin strEditName:='edtStudentName'; //从数据库的配置表中读取此值(控件名称) strControlKind:='TEdit'; //从数据库的配置表中读取此值(控件类型) strControlKind(Self.FindComponent(strEditName)).visible:=False;
delphi是编译系统,没有宏代换功能,但是能不能变通地实现呢?
大家有没有这样搞过呢?
[解决办法]
可以动态创建的,你把控件对象的属性放到数据库中,然后读出来,动态创建对象。
[解决办法]
如果只是控制visable的话
- Delphi(Pascal) code
procedure TForm1.Button1Click(Sender: TObject);var mstr1: string;begin mstr1 := 'Edit1'; TControl(FindComponent(mstr1)).Visible := false;end;
[解决办法]
[解决办法]
RTTI?
请参考《Delphi 的RTTI机制浅探》和《Delphi 的RTTI机制浅探(续)》
[解决办法]
[解决办法]
先不说“宏代换”行不行,关键是您那功能写不出来通用的代码啊。
变通一下吧,你试下,这样写,应该可以满足你的需要
- Delphi(Pascal) code
procedure TForm1.Button1Click(Sender: TObject);var PropInfo: PPropInfo; //uses TypInfo mcp: TComponent;begin mcp := FindComponent('Edit1'); PropInfo := GetPropInfo(mcp.ClassInfo,'Text'); if Assigned(PropInfo) then begin ShowMessage(GetStrProp(mcp,'Text')); SetStrProp(mcp,PropInfo,'changed'); end;end;
[解决办法]
[解决办法]
[解决办法]
知道控件的类型和名字,以字符串操作控件是可以的
整个dfm+pas都动态操作,也是可以的——那就是完全脚本化的delphi了
[解决办法]
[解决办法]
给你一个写得比较全的例子
- Delphi(Pascal) code
class procedure TFunction.LoadPropValues(query: TADOQuery; obj: TComponent);var i, nCount: Integer; PropList: PPropList; PropName:string; Field :TField;begin ncount := GetTypeData(obj.ClassInfo).PropCount; GetPropList(obj.ClassInfo,PropList); try for i := 0 to ncount - 1 do begin PropName := PropList[I]^.Name; Field := query.FindField(PropName); if Assigned(Field) then begin case (PropList[I]^.PropType)^.Kind of tkInteger,tkInt64: SetOrdProp(obj,PropName,Field.AsInteger); tkString, tkWChar,tkLString: SetStrProp(obj,PropName,Field.AsString); tkWString: SetWideStrProp(obj,PropName,Field.AsWideString); end; end; end; finally FreeMem(PropList); end;end;
[解决办法]
[解决办法]
赚点分真不容易,快把分给楼上吧
[解决办法]
有效回贴应有份,似乎可以新开贴再问,呵呵
[解决办法]