本帖最后由 seleron 于 2012-02-14 17:13:46 编辑

解决方案 »

  1.   

    delphi论坛这么冷清,都用C#.net了吗?我在若干年前就用C#了,好像是2002年,感觉C#.net在语法方面是盗版的java,在开发环境方面是盗版的dephi。
      

  2.   

    如果只是控制visable的话
    procedure TForm1.Button1Click(Sender: TObject);
    var
            mstr1: string;
    begin
            mstr1 := 'Edit1';
            TControl(FindComponent(mstr1)).Visible := false;
    end;
      

  3.   


    不只是控制visible还有其他属性,需要明确到控件类型,所以TControl还不行,
      

  4.   

    RTTI?请参考《Delphi 的RTTI机制浅探》《Delphi 的RTTI机制浅探(续)》
      

  5.   

    回复erhan既然你需要设置非通用的属性,则已知道且必须知道其是什么类型了,不然这个非通用的属性如何得知?你这种“宏替换”的代码如何写尼?
    ------------------------------------------------我主要是用text属性,界面上有TEdit类型和TDBEditEh类型等控件,要取得每个控件的text属性,所以用TControl不行啊。
      

  6.   

    先不说“宏代换”行不行,关键是您那功能写不出来通用的代码啊。变通一下吧,你试下,这样写,应该可以满足你的需要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;
      

  7.   

    RTTI的作用远比你想象的要多,不过只能在运行期处理VCL的Published的属性和方法。如果仅仅是处理TEdit和TDbEditEh两个类的Text属性,就很简单了。
    procedure SetEditText(const AClassName, AEditName, AEditText: String);
    var
      FVcl: TComponent;
    begin
      FVcl := FindComponent(AEditName);
      if Assigned(FVcl) then
      begin
        if AClassName = 'TEdit' then
          TEdit(FVcl).Text := AEditText
        else if AClassName = 'TDbEditEh' then
          TDbEditEh(FVcl).Text := AEditText
        else
          ShowMessage(AClassName + '不可识别!');
      end
      else
        ShowMessage(AEditName + '不存在!');
    end;
      

  8.   

    感谢erhan的关注,
    我现在是这样实现的var
      strEditName:string;  
      strControlKind:string;
      strTmp
    Begin
      ...
      strEditName:=qryTmp.Fieldbyname('ControlName').asstring;//从数据库的配置表中读取此值(控件名称)
      strControlKind:=qryTmp.Fieldbyname('ControlType').asstring;//从数据库的配置表中读取此值(控件类型)
      if strControlKind=‘TEdit' then
      begin
        strTmp:=TEdit(Self.FindComponent(strEditName)).visible:=False;
      end
      else if strControlKind=‘TDBEditEh' then
      begin
        strTmp:=TDBEditEh(Self.FindComponent(strEditName)).text;
      end
      ...
    感觉这样实现有些繁琐,关键的问题是,如果数据表中某一记录的ControlType字段的值没有在程序的if判断语句中被包含的话,程序就无法取得这个控件的text属性。
      

  9.   


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

  10.   


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

  11.   


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

  12.   

    知道控件的类型和名字,以字符串操作控件是可以的整个dfm+pas都动态操作,也是可以的——那就是完全脚本化的delphi了
      

  13.   


    AClassName 其实就是从ControlType字段取值的。
      

  14.   


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

  15.   

    给你一个写得比较全的例子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;
      

  16.   

    erhan的11楼的方法不错,可以简化掉数据表中的ControlType字段。请教个问题,用这种方法取得edit1的text属性后,如何使得edit1获得焦点?例如,界面上有edit1和edit2,根据数据表的记录循环一遍界面上的edit控件,如果某个edit的text为空,则使其获得焦点。
      

  17.   

    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;
            TWinControl(mcp).SetFocus;
    end;
      

  18.   


    好像有classclass、classof之类的
      

  19.   


    交流第一,得分第二erhan正解youthon的方法很有参考价值
      

  20.   

    erhan正解youthon提供的方法很有参考价值
      

  21.   

    To (二憨) 
    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;
    如果'Edit1'为TRzDBEdit的话,则 PropInfo := GetPropInfo(mcp.ClassInfo,'Text'); 返回nil值。有什么好的办法解决吗?