本人想做一个像DELPHI本身一样的窗体设计器,能把我们设计好的界面保存到数据库里,到时程序运行时直接从数据库里读出这些数据来创建表单和里面的控件。这个应怎么做呀,我没什么思路,还有请问那位有RIIT方面的资料可不可以传一份给我,我会很感激的,必有重谢呀。本人.
解决方案 »
- 线程问题???
- 如何编写串口读写程序?
- 一个计算收费的问题!!帮帮忙急啊!
- 怪问题!大家来看看
- project.exe raised exception class eoleexception with message'from子句语法错误。'什么意思呢?
- 用OPENROWSET把Excel导入数据表,出错了
- ???????一些关于crate的问题,清高手赐教。(在线等待)??????
- 急!用Delphi如何读写文件的创建、修改、访问日期和时间?
- 如何实现一个小的底层问题?
- 关于TPersistentClass使用时遇到的难理解的问题?
- 连接sybase数据库错误希望大家帮我一吧
- Indy控件上传文件的问题(急)
保存后就是。DFM文件格式
只要窗体设计时遵循一定的规则就可以了
用D的流化技术
将窗体上的重建保存到流里注意:
是保存窗体上的控件
不包括窗体
以流化的方式写入和读出就可以了
看看TComponent的流化处理
我自己在项目中经常这类处理
或者自己看VCL关于这方面的东东
看看这里的讨论
这几天没有时间帮你实现了
要看存储过程的说
你稍等
事实上要做到像Delphi的IDE那样,难度不小的。有很多细节问题要考虑的
不过,从根本上来说,就是动态创建控件,RTTI,还是流化操作,
要真现实起来就不是一天两天可以解决的。楼主你要的话,给你一个小小的程序吧,我想用处也不大,不过拿去看看也好吧。
给我邮箱
《delphi4从入门到精通》第4章里有简单一点的例子Property Editor也不会弄
To inforum(收台 灭日) ,你的做好了吗?有机会我们一起讨论一下吧。
Delphi的dfm问题本身也是一个流文件而已,可以研究以下Delphi的TFileStream类.
我只要把这个新创建的窗体和控件生成DFM,然后存入数据库的一个字段。
应该已经发了例程给你了我再根据你实际要求说说:
设计界面
无非是想让客户或自己重新排放控件的位置或增加之
而并不是去实现一个IDE
那么
只要遵循一定的规则
如:我们在窗体上放一TPanel
其他控件都放在上面
使用流化的技术
将TPanel保存至数据库中
同时,其所有子控件也被保存
就这么简单关于控件属性
可以根据RTTI来读取或设置事件属性和代码
同样的
我们可以编写一些通用的操作方法
让客户或自己编写伪代码
来“解释”执行之
谁懂得如何把.BPL里的控件读出来的?
http://community.csdn.net/Expert/topic/3399/3399647.xml?temp=.5094568
罗修帮了我很大忙。但我最终还是放弃了。因太难了。前后我共研究了一个月的时间呢!可惜。但我的论文研究方向还是和您相似的。
《个性化界面定制方法的研究与实现》控件的属性修改我目前已经在研究了。有空可以联系。[email protected]
使用LoadPackage载入BPL,
LoadPackage做了两件事情,
1,BPL也是DLL,调用LOADLIBRARY载入它。
2,调用BPL的initialization函数一般在
initialization的时候,会把BPL里面的类REGISTER一下,
这样你就可以通过FINDCLASS之类的函数找到它使用它。。
如果你要察看一个第三方提供的bpl里面的需要注册到设计环境的组件类,你可以用这样的办法var
//用于保存类
CompClasses: TList;
ClassesNoIcon: TList;procedure MyRegisterComponentsProc(const aPage: string;
const aComponentClasses: array of TComponentClass);
var
I: Integer;
begin
for I := Low(aComponentClasses) to High(aComponentClasses) do
CompClasses.Add(aComponentClasses[I]);
end;procedure MyRegisterNoIconProc(const aComponentClasses: array of TComponentClass);
var
I: Integer;
begin
for I := Low(aComponentClasses) to High(aComponentClasses) do
ClassesNoIcon.Add(aComponentClasses[I]);
end;procedure GetPackageUnits(
const Name: string;
NameType: TNameType;
Flags: Byte;
Param: Pointer);
begin
if (NameType = ntContainsUnit) then
//其实还应该检查一下Flags
TStrings(Param).Add(Name);
end;procedure GetRegisteredClassInPackage(const aPackageName: string);
var
I: Integer;
Dummy: Integer;
UnitOrPkgName: string;
RegisterProc: TProcedure;
Module: THandle;
UnitList: TStrings;
OrgRegComp, OrgRegNoIcon: Pointer;
begin
OrgRegComp := @RegisterComponentsProc;
OrgRegNoIcon := @RegisterNoIconProc;
try
RegisterComponentsProc := MyRegisterComponentsProc;
RegisterNoIconProc := MyRegisterNoIconProc; Module := LoadPackage(aPackageName);
try
UnitList := TStringList.Create();
try
GetPackageInfo(Module, UnitList, Dummy, GetPackageUnits); for I := 0 to UnitList.Count-1 do
begin
UnitOrPkgName := UnitList[I]; RegisterProc := GetProcAddress(Module, PChar(Format('@%s@Register$qqrv', [UnitOrPkgName])));
//找每个单元的register函数,如果有就调用 if Assigned(RegisterProc) then
RegisterProc();
end;
finally
UnitList.Destroy();
end;
finally
UnloadPackage(Module);
end;
finally
RegisterComponentsProc := OrgRegComp;
RegisterNoIconProc := OrgRegNoIcon;
end; //那么,现在CompClasses和ClassesNoIcon里面的类就是你想知道的类了
end;
不过这个方法不太安全,随手写的,仅供参考
[email protected]