如何根据传递过来的TWinControl参数,在dll里动态创建一个带焦点的控件,如TEdit,请看代码:

fangheling 2002-12-31 11:51:17
我想在dll里做一个动态创建TEdit的函数,其中AParent为父控件参数:
function CreateEdit(AParent:TWinControl):Boolean; StdCall;
begin
with TEdit.Create(AParent) do
begin
ParentFont:=False;// 这句如果不写的话就会产生Con't Assign a TFont to TFont 的异常
Parent:=AParent;
Left:=10;
Top:=10;
end;
end;
以上代码在调用执行时无问题,但是执行后的控制不能在AParent里显示出来(也就是说看不见),但它又却实是存在在AParent里的,我用
for i:=0 to AParent.Controls.Count-1 do
时可以遍历出来的

注:
如果是创建TLable则无问题(可以看得见)
后来发现可获焦点的Win控制均不能显示,如TStaticText,TDbEdit等

请问如何解决以上问题,或变通实现?

谢谢
...全文
54 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
findcsdn 2003-01-06
  • 打赏
  • 举报
回复
这个问题与dll的分配内存有关系,在c++中也有类似情况.
可以参考下面的帖子。
http://expert.csdn.net/Expert/topic/1261/1261710.xml?temp=.3024256
fangheling 2003-01-02
  • 打赏
  • 举报
回复
AParent.insertComponent(edit); //或 AParent.insertControl(edit);
不行呀
fangheling 2003-01-01
  • 打赏
  • 举报
回复
我把返回值由Bool改为TEdit,在调用程序中这么写:

con := CreateEdit(Self); //Self为TForm
con.UpdateControlState;

这样能显示,不过在释放时(关闭form)还是有内存错误,

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

ParentWindow := AParent.Handle;

能显示,但显示出来的控件很奇怪:
1.用for 遍历AParent子控件时找不到
2.如果是TDbEdit则变平了,就像ctrl3d=false一样,并且失去了TDbEdit的一些特性,如货币字段不能自动右对齐,更改控制值后无法自动更新对应的字段数据

--------------
楼上的我再试试
fangheling 2002-12-31
  • 打赏
  • 举报
回复
up
tenyyu 2002-12-31
  • 打赏
  • 举报
回复
试下:
function CreateEdit(AParent:TWinControl):Boolean; StdCall;
var
edit: TEdit;
begin
edit := TEdit.Create(AParent) ;
with edit do
begin
ParentFont:=False;
Parent:=AParent;
Left:=10;
Top:=10;
Visible:=true;
end;
AParent.insertComponent(edit); //或 AParent.insertControl(edit);
end;
lxpbuaa 2002-12-31
  • 打赏
  • 举报
回复
将Parent:=AParent;改为:
ParentWindow := AParent.Handle;
如果还是不行的话,你就直接传递AParent.Handle的值进来,如:
function CreateEdit(HParent:HWnd):Boolean; StdCall;
begin
...
ParentWindow := HParent;
...
end;

—————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
—————————————————————————————————
fangheling 2002-12-31
  • 打赏
  • 举报
回复
不是坐标的
很奇怪的
TLabel,TShape等可以
但TEdit,TDataTimePicker不能
也就是说有焦点的不行
_GodFather 2002-12-31
  • 打赏
  • 举报
回复
先不用DLL在普通事件里测试一下你的程序有无问题。
坐标可能会导致你看不到的哦
fangheling 2002-12-31
  • 打赏
  • 举报
回复
难道一定要用回调函数来实现吗
fangheling 2002-12-31
  • 打赏
  • 举报
回复
加上
Visible:=true;
好像也不行哦
jaguarcts 2002-12-31
  • 打赏
  • 举报
回复
function CreateEdit(AParent:TWinControl):Boolean; StdCall;
begin
with TEdit.Create(AParent) do
begin
ParentFont:=False;// 这句如果不写的话就会产生Con't Assign a TFont to TFont 的异常
Parent:=AParent;
Left:=10;
Top:=10;
Visible:=true;
end;
end;

5,392

社区成员

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

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