// 返回_strSource 在 _strDest列表 中的索引号
function IndexOfList( _strSource, _strDest:string; _strDelimiter: char=';'): Integer;
var sltDest: TStrings;
begin
  _strSource := LowerCase(_strSource);
  _strDest := LowerCase(_strDest);  sltDest:= TStringList.Create;
  try
    sltDest.Delimiter := _strDelimiter;
    sltDest.DelimitedText := _strDest;
    Result := sltDest.IndexOf( _strSource );
  finally
    sltDest.Free;
  end;
end;
// 设置组件的属性
// :: objOwer 拥有组件的窗体对象;  _strCompList 需要设置属性的组件列表;   _strProperty 属性名称;  _strValue  要设置的属性值;    _strDelimiter   组件列表的分割符号
// 调用格式:  SetCompProp( MainForm, 'edit1;edit2;edit5', 'readonly', 'true')function SetCompProp( _objOwer: TForm; _strCompList, _strProperty,  _strValue: string; _strDelimiter: char=';'): boolean;
var sltDest: TStrings;
    intIndex: Integer;
    objComp: TComponent;
    strClsName: string;
begin
  sltDest:= TStringList.Create;
  try
    sltDest.Delimiter := _strDelimiter;
    sltDest.DelimitedText := _strCompList;    for intIndex := 0 to sltDest.Count -1 do
    begin
      objComp := _objOwer.FindComponent(sltDest.Strings[intIndex]);
      if not assigned(objComp) then
        continue;      strClsName := objComp.ClassName;      case IndexOfList(strClsName, 'TEdit;TComboBox;TLabel;TRichEdit;TButton;TSpeedButton;TToolButton' ) of
        0: begin   // tedit
             // ??? 请高手指点下,如何动态的设置组建的属性,如上面的调用示范:edit1.readonly 属性?
           end;
        1: begin   // TComboBox           end;
        2: begin   // TLabel           end;
        3: begin   // TRichEdit           end;
        4: begin   // TButton           end;
        5: begin   // TSpeedButton           end;
        6: begin   // TToolButton           end;
      else
      end;
      
    end;
  finally
    sltDest.Free;
  end;
end;
在此感谢!或者您有更好的方法,还请赐教 :)

解决方案 »

  1.   

    //返回找到控制
    c := findcomponent(name: string): tcomponent;
    // 如果是tedit, 则强制转换
    tedit(c).caption := 'hello world';
      

  2.   

    用ispublishedprop函数,检测一个组件是否有此属性(必须是publish属性),返回boolean
    再调用  SetPropValue 方法复制属性值,搞定。
    要uses typinfo单元
      

  3.   

    上面楼主的函数可以改成下面的
    function SetCompProp( _objOwer: TForm; _strCompList, _strProperty,  _strValue: string; _strDelimiter: char=';'): boolean;
    var sltDest: TStrings;
        intIndex: Integer;
        objComp: TComponent;
    begin
      sltDest:= TStringList.Create;
      try
        sltDest.Delimiter := _strDelimiter;
        sltDest.DelimitedText := _strCompList;    for intIndex := 0 to sltDest.Count -1 do
        begin
          objComp := _objOwer.FindComponent(sltDest.Strings[intIndex]);
          if not assigned(objComp) then
            continue;
          if IsPublishedProp(objcomp,_strProperty) then
            SetPorpValue(objcomp,_strProperty,_strValue)
        end;
      finally
        sltDest.Free;
      end;