原问题在
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;
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;
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货