动态显示窗体

gulf1234 2007-01-22 11:28:55
在我的工程中,有很多的窗体,但是我都没有用“Atuo Create”,我希望在用户点击菜单后,动态加载并显示。由于我的菜单都是通过数据库中的记录来生成的,所以在用户点击菜单时,我只能获取到窗体的名称。

我在发贴前也,看了一些以前的帖子,但是都没有能解决。看看哪位大侠能帮帮我!!!
...全文
443 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
gulf1234 2007-04-10
  • 打赏
  • 举报
回复
问题尚未解决,还没有按照netfly(支点) 说的去试试呢。
试后如果还不可以,另开贴请教,答谢各位,先把该贴结了,谢谢大家的帮助。
netfly 2007-03-27
  • 打赏
  • 举报
回复
在D中, 系统一般使用CLASSLIST(D7是RegGroups)这个全局变量来保存所有注册的类的类(class of class)
例如在D5中, RegisterClass这个函数,实际就是把你的类ADD到CLASSLIST这个变量(D5里是一个TThreadList). 然后FindClass从这个全局变量中找出你的那个类的类,然后再创建.你的那个问题应该是注册的和读取的应该不是同一个地方,可以调试跟踪一下.如果不想的话,也可以根据这个原理,我们可以自己做一个自己的LIST来自己控制,自己读取(无非就是抄一次VCL的代码),呵呵.
rcyboom 2007-03-26
  • 打赏
  • 举报
回复
把窗体放到dll中,每个dll都实现几个通用函数:
createandshow;
getformname;
getmenuiten;

主程序扫描指定文件夹的所有dll文件,遍历并动态生成菜单。
每个菜单都调用这几个通用函数即可
gulf1234 2007-03-26
  • 打赏
  • 举报
回复
TO netfly(支点) :我好像不是很理解啊?你能说详细点,或者给我一个简单的例子啊?谢谢。
wwwcampus 2007-03-22
  • 打赏
  • 举报
回复
在 Unit2 中加
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 调试通过
gulf1234 2007-03-22
  • 打赏
  • 举报
回复
TO starsky2006(星空无限),
谢谢写的回帖,但是按照你的方法,那如果我有很多的窗体的话,是不是要一一列举呢?我现在就是不想一一列举,不想一有新的窗体,就要来更改这个过程。
starsky2006 2007-03-22
  • 打赏
  • 举报
回复
var
LForm: TLForm;

implementation

{$R *.dfm}

function TShowFormClass.CreateAClass(const AClassName: string): TForm;
begin
if AClassName='LForm' then
Result := LForm;
else
Result := nil;
end;
gulf1234 2007-03-22
  • 打赏
  • 举报
回复
自己顶一个
netfly 2007-03-22
  • 打赏
  • 举报
回复
如果你是用模板编程,很可能是你的系统前后有两个放CLASS的CLASSLIST(D5,D7,D6在这个地方都略有不同), 这样最好的方法是一自己定义一个全局的LIST然后自己往这个LIST里进行注册,并从这里来FIND就可以了.
gulf1234 2007-03-22
  • 打赏
  • 举报
回复
各位啊,我测试了一下,wwwcampus(稻草) 、netfly(支点)和hongqi162(失踪的月亮) 说的方法,如果我新建一个工程的话,都是可行的。

但是在我的程序中就是不行,老是报什么类不存在(我已经使用RegisterClass了)。

我用的是模板编程的,所以我想知道这啊会有什么影响啊?
netfly 2007-03-20
  • 打赏
  • 举报
回复
你的类名和你代入的字符串是一样的吗?
gulf1234 2007-03-20
  • 打赏
  • 举报
回复
不是在DLL中的。
TO zaza_bbface(我试着成熟一点~) ,
我在frmMain中已经引用了单元UnitSite(就是frmSite所对应的单元)了啊,不会这两个名字一定要一样的吧。
zaza_bbface 2007-03-20
  • 打赏
  • 举报
回复
但是每次运行的时候都报错,说“Class TfrmSite not found”.

即使我在frmSite模块的最后(.end前面)使用方法
initialization
RegisterClasses(TfrmSite);依然是这样的错误提示啊。

------------
用了RegisterClasses(TfrmSite);肯定可以找到类的,除非你的工程根本没use frmSite单元
netfly 2007-03-20
  • 打赏
  • 举报
回复
你的窗体单元是放在DLL里?
gulf1234 2007-03-20
  • 打赏
  • 举报
回复
同样的错误提示啊!救命啊!!!!!!!!!!!
netfly 2007-03-20
  • 打赏
  • 举报
回复
var
LFormClass : TFormClass;
LForm: TForm;
begin
//LFormClass := TFormClass(FindClass(AClassName)); <---------------已经进行了转换了
//LForm := LFormClass.Create(Application);

LForm := TFormClass(FindClass(AClassName)).Create(Self);
gulf1234 2007-03-20
  • 打赏
  • 举报
回复
谁能帮帮我啊,解决后,我另开贴酬谢啊。

我先设置了一个函数CreateAClass
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);依然是这样的错误提示啊。

各位大哥,快来帮帮忙啊!!!!!!!!!!!!
gulf1234 2007-01-23
  • 打赏
  • 举报
回复
zhu_jiang 2007-01-23
  • 打赏
  • 举报
回复
我看你要实现一个通用灵活的form才行,在配置里面保存好所有界面要素,根据界面名称动态创建才好
creativecn 2007-01-23
  • 打赏
  • 举报
回复
你应该把窗体建好 然后点击按钮利用语句让其显示 否则你建立一个空白的窗体干什么
加载更多回复(10)

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧