如何找字符串的内容转换成控件(100分)

  • 主题发起人 主题发起人 chenzhou
  • 开始时间 开始时间
C

chenzhou

Unregistered / Unconfirmed
GUEST, unregistred user!
窗体上已经有一个控件了 button1:TButton
var i :string;
begin
i:='button1';
i:=button1;//不知道怎么强制转换,来对应这个控件
i.text:='michael';
end;
 
TButton(FindComponent('Button1')).Caption:='michael';
 
var i: TButton;
begin
i := TButton(self.FindComponent('button1'));
i.text:='michael';
end;
 
主要是想做一个和QQ差不多的Bar,FORM上只有一个PANEL1控件
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ToolWin, ComCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Panel1: TPanel;
procedure FormCreate(Sender: TObject);
procedure abc(HeaderControl: THeaderControl;
Section: THeaderSection);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.abc(HeaderControl: THeaderControl;
Section: THeaderSection);
var j:integer;
k:integer;
i:integer;
o:integer;
s:string;
pp:theadercontrol;
begin
j:=strtoint(copy(HeaderControl.Name,length(headercontrol.Name),1));
for i:=1 to j do //向上的
begin
pp:=Theadercontrol(panel1.FindComponent('bar'+inttostr(i)));
pp.align:=altop;
end;;
o:=0;
for i:=0 to panel1.ControlCount-1 do
if panel1.Controls.ClassType=THeaderControl then
o:=o+1;
for k:=j+1 to o do //向下的
begin
showmessage('PanelB'+inttostr(k));
end;
showmessage('panela'+inttostr(j))
//当前的
end;

procedure TForm1.FormCreate(Sender: TObject);
var i:theadercontrol;
k:THeaderSection;
j:integer;
p:tpanel;
begin
for j:=1 to 5 do
begin
i:=THeaderControl.Create(nil);
k:=THeaderSection.Create(nil);
i.OnSectionClick:=abc;
i.Parent:=panel1;
i.Name:='Bar'+inttostr(j);
k.Width:=panel1.Width-1;
k.Text:=i.Name;
k.Alignment:=taCenter;
k.MaxWidth:=k.Width;
k.MinWidth:=k.Width;
i.Sections.AddItem(k,0);
i.Cursor:=crArrow;
p:=tpanel.Create(nil);
p.Parent:=panel1;
p.Name:='panel'+inttostr(j);
p.Caption:=p.Name;
p.Width:=panel1.Width;
p.Height:=100;
p.Align:=albottom;
end;
end;

end.
 
pp.align:=altop
上面的这个地方出错
 
出错原因肯定是
panel1.FindComponent('bar'+inttostr(i));
返回值为nil,也就是不存在名为'bar'+inttostr(i)的组件
究竟是怎么不存在的……实在是无法分析了

建议用数组或者TList管理
 
LMD、RAIZE、DEVEXPRESS等控件包都有这样的控件,你没必要自己写吧...
 
转贴一篇文章,我个人觉得似乎总是不能做到完全自由。必须使用类似下面的一行代码:
ControlClass : array[0..2] of TPersistentClass = (TButton, TEdit, TLabel);

================================================================================
我希望根据一个字符串,来创建该类的对象,例如我给定'TButton',那么能在运行的时候,
动态创建Button出来?不要告诉我用if来判断或者用case来判断等等~,那样的话,有几百个
控件的话,岂不是晕倒?

请参考下面的代码,下面的代码演示了三种控件的动态创建,若需要动态创建其他的,请修
改那个数组常量即可:

function DynCreateControlByName(AClassName: string
AOwner: TWinControl = nil): TControl;

const

/// You can add any class if you want!

ControlClass : array[0..2] of TPersistentClass = (TButton, TEdit, TLabel);

var

Cls : TControlClass;

begin

Result := nil;

RegisterClasses(ControlClass);

Cls := TControlClass(GetClass(AClassName));

if Cls = nil then exit;

Result := Cls.Create(AOwner);

end;

procedure TForm1.Button1Click(Sender: TObject);

var

Control : TControl;

begin

Control := DynCreateControlByName(Edit1.Text);

if Control <> nil then

with Control do

begin

Parent := Self;

Left := Random(Self.Width) - Width;

Top := Random(Self.Width) - Height;

Perform(WM_SETTEXT,Length(Edit1.Text),integer(pchar(Edit1.Text)));

Show;

end;

end;

---------------------------------------

procedure TForm1.Button2Click(Sender: TObject);

begin

TWinControlClass(FindClass('TQRDBText')).Create(Self);

end;

initialization

RegisterClasses([TQRDBText]);

finalization

UnregisterClasses([TQRDBText]);

end.

 
多人接受答案了。
 
后退
顶部