在我的工程中,有很多的窗体,但是我都没有用“Atuo Create”,我希望在用户点击菜单后,动态加载并显示。由于我的菜单都是通过数据库中的记录来生成的,所以在用户点击菜单时,我只能获取到窗体的名称。 我在发贴前也,看了一些以前的帖子,但是都没有能解决。看看哪位大侠能帮帮我!!!
解决方案 »
- 以前的delphi工程文件,拷过来重新连接数据库出现这个问题,未曾遇到过,请高手指点!
- 同志们好,同志们辛苦啦!!!转做管理,散散分~~~~~~~~~~~~~~~~~~
- 有关DOA的问题??
- 如何实现Word文件内字符查找?
- 在quickrep中对于qrlabel的caption如何动态控制?
- 关于只屏蔽(Ctrl+Alt+Ctrl)的程序
- 我想双击执行文件,下面的代码有错,请帮忙!
- 求助!关于并口编程的问题
- 再次请教高手们:请教在PARADOX表中增加一个BZ字段,此字段是备注型的?
- 请教dock问题,将一Form dock到一panel,怎么才能显示出标题栏(关闭按钮)??
- 利用MOVE进行内存拷贝无效的问题
- 为什么可用分不见涨呢?好几天了
建一个Data Module用TAction,静态的将所有创建窗口语句写上,然后菜单与TAction绑定,,最后与数据库联接来控制TAction的显示
你是说,先把窗体生成的语句都写在代码中,每一个窗体的生成代码都是作为一个ACTION来处理。是吧?但是这样的工作量也很大啊,我就是不想这样处理。
//创建一个类
function TShowFormClass.CreateAClass(const AClassName: string): TForm;
var
LFormClass : TFormClass;
LForm: TForm;
begin
LFormClass := TFormClass(FindClass(AClassName));
LForm := LFormClass.Create(Application);
Result := LForm;
end;
并在调用事件中,如下写,但是执行到该语句时,系统提示类“FfrmUsers”不存在,但是该窗体肯定是存在。
procedure TfrmMain.Button1Click(Sender: TObject);
var
LForm: TForm;
begin
LForm := CreateAClass('TfrmUsers');
try
LForm.ShowModal;
finally
LForm.Free;
end;end;
Case TMenuItem(Sender).Tag of
1:fm1:=TForm1.Create;
2:fm2:=TForm2.Create;
...
end;
这样所有的菜单使用同样的事件。
1:fm1:=TForm1.Create;
2:fm2:=TForm2.Create;
...
end;中列举下。其实hongqi162(失踪的月亮)说的倒是我想要的,但是还是有问题,不行。
function TfrmMain.CreateAClass(const AClassName: string): TForm;
var
LFormClass : TFormClass;
LForm: TForm;
begin
LFormClass := TFormClass(FindClass(AClassName));
LForm := LFormClass.Create(Application);
Result := LForm;
end;然后在BUTTON的事件中调用,
procedure TfrmMain.Button1Click(Sender: TObject);
var
LForm: TForm;
begin
LForm := CreateAClass('TfrmSite');
try
LForm.ShowModal;
finally
LForm.Free;
end;
end;但是每次运行的时候都报错,说“Class TfrmSite not found”.即使我在frmSite模块的最后(.end前面)使用方法
initialization
RegisterClasses(TfrmSite);依然是这样的错误提示啊。各位大哥,快来帮帮忙啊!!!!!!!!!!!!
LFormClass : TFormClass;
LForm: TForm;
begin
//LFormClass := TFormClass(FindClass(AClassName)); <---------------已经进行了转换了
//LForm := LFormClass.Create(Application); LForm := TFormClass(FindClass(AClassName)).Create(Self);
initialization
RegisterClasses(TfrmSite);依然是这样的错误提示啊。------------
用了RegisterClasses(TfrmSite);肯定可以找到类的,除非你的工程根本没use frmSite单元
TO zaza_bbface(我试着成熟一点~) ,
我在frmMain中已经引用了单元UnitSite(就是frmSite所对应的单元)了啊,不会这两个名字一定要一样的吧。
LForm: TLForm;implementation{$R *.dfm}function TShowFormClass.CreateAClass(const AClassName: string): TForm;
begin
if AClassName='LForm' then
Result := LForm;
else
Result := nil;
end;
谢谢写的回帖,但是按照你的方法,那如果我有很多的窗体的话,是不是要一一列举呢?我现在就是不想一一列举,不想一有新的窗体,就要来更改这个过程。
initialization
RegisterClass(TForm2);
在 Unit1 中
procedure TForm1.Button1Click(Sender: TObject);
var
pc: TPersistentClass;
fc: TFormClass;
f: TForm;
begin
pc := FindClass('TForm2');
fc := TFormClass(pc);
f := fc.Create(Self);
f.Show;
end;win2003 + d7 调试通过
createandshow;
getformname;
getmenuiten;主程序扫描指定文件夹的所有dll文件,遍历并动态生成菜单。
每个菜单都调用这几个通用函数即可
例如在D5中, RegisterClass这个函数,实际就是把你的类ADD到CLASSLIST这个变量(D5里是一个TThreadList). 然后FindClass从这个全局变量中找出你的那个类的类,然后再创建.你的那个问题应该是注册的和读取的应该不是同一个地方,可以调试跟踪一下.如果不想的话,也可以根据这个原理,我们可以自己做一个自己的LIST来自己控制,自己读取(无非就是抄一次VCL的代码),呵呵.
试后如果还不可以,另开贴请教,答谢各位,先把该贴结了,谢谢大家的帮助。