首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

delphi中能否变通地实现宏代换?解决方法

2012-03-09 
delphi中能否变通地实现宏代换?delphi中能否变通地实现宏代换?Delphi(Pascal) codevarstrEditName:string

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;
[解决办法]
探讨
引用:

如果只是控制visable的话

Delphi(Pascal) code

procedure TForm1.Button1Click(Sender: TObject);
var
mstr1: string;
begin
mstr1 := 'Edit1';
TControl(FindComponent(mstr1)).Visible :=……

[解决办法]
RTTI?

请参考《Delphi 的RTTI机制浅探》和《Delphi 的RTTI机制浅探(续)》
[解决办法]
探讨

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;
[解决办法]
探讨
大概看了一下这两篇文章,好像实现不了“将字符串宏代换为对象类型”的功能啊!

[解决办法]
探讨
引用:
感谢gobiz的关注

你提供的方法很好,与我上述的方法相比,可以省去数据表中ControlType字段


搞错了,你的方法也还是要使用ControlType字段的。

[解决办法]
知道控件的类型和名字,以字符串操作控件是可以的

整个dfm+pas都动态操作,也是可以的——那就是完全脚本化的delphi了
[解决办法]
探讨
引用:

引用:
引用:
感谢gobiz的关注

你提供的方法很好,与我上述的方法相比,可以省去数据表中ControlType字段


搞错了,你的方法也还是要使用ControlType字段的。


呵呵,我的方法不用ControlType字段的。


AClassNam……

[解决办法]
给你一个写得比较全的例子
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; 


[解决办法]

探讨
erhan的11楼的方法不错,可以简化掉数据表中的ControlType字段。

请教个问题,用这种方法取得edit1的text属性后,如何使得edit1获得焦点?

例如,界面上有edit1和edit2,根据数据表的记录循环一遍界面上的edit控件,如果某个edit的text为空,则使其获得焦点。

[解决办法]
赚点分真不容易,快把分给楼上吧
[解决办法]
有效回贴应有份,似乎可以新开贴再问,呵呵
[解决办法]
探讨
引用:

知道控件的类型和名字,以字符串操作控件是可以的

整个dfm+pas都动态操作,也是可以的——那就是完全脚本化的delphi了


请教,如何用变量替换下列语句中的TEdit呢?
strTmp:=TEdit(Self.FindComponent(strEditName)).visible:=False;

热点排行