原问题在
http://expert.csdn.net/Expert/topic/2223/2223099.xml?temp=.2263605
请您到哪儿帮我up一下。
如何实现在程序运行期间创建一个控件,并从.ini文件中配置此控件的类型及其他参数
例如:我在按下Button1后,程序从.ini文件中读取数据,根据读取的数据,在界面上创建Label1,并且Label1的Caption为‘创建成功’
这样的代码可以实现我一部分的需求
Label2 := TLabel.create(form1); 
Label2.parent := form1;
Label2.Left := 0; 
Label2.top := 0; 
Label2.Height := 100; 
Label2.width := 100; 
Label2.Show;
因为我希望在.ini 中这样配置
[object]
object=TLabel 
name=Label2
parent = form1
Left = 0 
top = 0 
Height = 100 
width = 100 
第一行为控件类型,第二行为控件名称,这是固定的。从第三行开始我所定义的参数顺序可能和程序里不一样,并且如果我在.ini中如果加入这样的2行
    Color = clMedGray
    ParentColor = False
程序中也必须将实现
Label2.Color := clMedGray;
Label2.ParentColor := False;
但这样我还得重新修改程序,那不是我希望做的。其实我的想法很简单,delphi或cbc中当我们在from上添加一个控件时,form文件中就会添加
  object Label1: TLabel
    Left = 152
    Top = 152
    Width = 32
    Height = 13
    Caption = 'Label1'
这样的内容,如果我们在对象观察器里修改Color为clMedGray,form文件中就会添加
这样的内容    
    Color = clMedGray
    ParentColor = False
  (备注:要把clMedGray存成整数,通过ini的readinteger读)
我只是想把这种对控件的创建和修改由我自己实现,这样当程序编译成exe后,我还可以添加和修改他
类似这样可以
var
  Ini: TIniFile;
begin
  Ini := TIniFile.Create( ChangeFileExt( Application.ExeName, '.INI' ) );
  try
    Top     :=  Ini.ReadInteger( 'Form', 'Top', 100 );
    Left    :=  Ini.ReadInteger( 'Form', 'Left', 100 );
    Width   :=  Ini.ReadInteger( 'Form', 'Width', 500 );
    Height  :=  Ini.ReadInteger( 'Form', 'Height', 300 );
    Caption :=  Ini.ReadString( 'Form', 'Caption', 你的form );
    Color:=  Ini.ReadString( 'Form', 'Caption', clMedGray );
不过那会将label的所有属性写一遍啊,换成其他控件还要再写一遍。
在搜索大富翁和本站后,发现大家主要谈的是释放分配的资源、能被用户拖动
、事件等等,有位quark(夸克)老兄还写了动态创建控件标准函数
还有一位写了这样一个过程,基本符合我的题意,可是他的例子只对'Enabled','Visble','Width','Height'这些参数有用,其他的没有用。
当然,我可以再添加其他的一些,如字体,颜色等等。能否还有更好的方法,不用象下面这样对每个属性都定义在PropertyNames,只要控件本身有的属性,能直接在.ini中都能付值。
procedure TForm1.SetComponentValue(const Expression: string);
const
  PropertyNames: Array [0..3] of String = (
    'Enabled','Visble','Width','Height');
var
  CName, RestStr, ProName, ValStr: string;
  MarkPos, i, Index: integer;
  AControl: TControl; AComponent: TComponent;
begin
  MarkPos := Pos('.',Expression);
  CName := Copy(Expression, 1, MarkPos-1);
  AComponent := FindComponent(CName);
  if not (AComponent is TControl) then
    exit;  AControl := AComponent as TControl;
  RestStr := Copy(Expression, MarkPos+1,255);
  MarkPos := Pos(':=',RestStr);
  ProStr := Copy(RestStr,1,MarkPos-1);
  RestStr := Copy(RestStr, MarkPos+2,255);
  ValStr := Copy(RestStr,1,255);  index := -1;
  for i := 0 to 4 do
    if CompareText(ProStr, PropertyNames[i]) = 0 then
    begin
      index := i;
      Break;
    end;
  case Index of
    0: AControl.Enabled := CompareText(ValStr,'True') = 0;
    1: AControl.Vasible := CompareText(ValStr,'True') = 0;
    2: AControl.Width := Val(ValStr);
    3: AControl.Height := Val(ValStr);
  end;
end;