Dll窗体中的DBGridEh,如何解决用鼠标点击数据区无法获取焦点的问题

Delphi_LiMin 2010-11-05 02:38:58
在主窗体获取焦点后,如何解决Dll窗体中的DBGridEh,用鼠标点击数据区无法获取焦点的问题???
也就是 用鼠标点击Dll窗体中的DBGridEh的数据区 ,没有任何动作...望解决~~谢谢各位..
...全文
629 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
gobiz 2010-11-05
  • 打赏
  • 举报
回复
转帖:http://qzriso.javaeye.com/blog/476450

基于Delphi的融合DLL中的窗口

 摘  要 :提出了一种简单的方法将DLL中的窗口融合(嵌入)到其他应用程序或DLL的窗口中,使用本方法可以简便地实现具有强扩展性和升级能力的软件系统。
  
1 引言
  在开发一个大型通用控制系统时曾遇到这么一个问题:该系统软件包由若干个可执行文件和动态链接库组成,因为扩展性和兼容性的要求,需要将系统划分为若干个可执行文件和动态链接库,并且在大部分DLL中封装各自的操作界面,在调用DLL时将其中包含的部分界面嵌入地显示在主界面的某个区域或某个窗口内,与主界面的其他部分浑然一体。这样主程序与DLL在功能操作上各司其职,在外部界面上又彼此交融,使用户可以通过增加和修改DLL来实现对系统内部、外部的扩展和升级;同时因为DLL的跨语言特性,内部包含操作界面的DLL可以更为方便地在以后的不同工作、不同语言环境中更好地重复使用。
  这一问题的应用较为广泛,但没有充分的资料来帮助解决,经过不断的试验,笔者将初步体会总结出来,用以抛砖引玉。本文中涉及的主程序和DLL都是在Delphi5.0下实现的,但因为其中所依赖的基础还是Windows本身的窗口机制,所以对于其他的语言平台也有实际意义。
  在Delphi中如何创建DLL及输出DLL中的函数有较多资料进行过介绍,在本文中不再赘述,本文只针对DLL中的窗口部分做重点介绍。

2 DLL中自带窗口的创建和显示
  DLL和普通EXE一样,可以自带窗口,用Delphi设 计包含窗口的DLL较其他语言更为方便。在Delphi的DLL工程中,窗口的生成和编程与普通的EXE工程基本相同,但与EXE文件不同的是:在Delphi的EXE工程中所包含的窗口是自动创建的,而DLL工程中所包含的窗口需要显示创建。
  在通常的应用中,DLL将所包含的窗口的创建和显示函数(或过程)输出,由宿主程序根据情况调用将DLL中的窗口显示出来(如点击宿主程序中的某个按钮时显示DLL中的窗口),其窗口创建和显示的过程如下:
  首先,创建一个DLL工程,并新建一个名为DllForm的Form,可以在该Form上放置任何控件。
  窗体设计完成后,在该窗口的Unit中添加如下代码:
 
  
procedure ShowDllForm:stdcall;export;
begin
if DllForm = nil then
DllForm := TDllForm.Create(Application);
DllForm.Show;
end;
在上面的代码片断中,ShowDllForm即为DLL输出的窗口创建和显示过程,宿主程序通过调用该过程来创建并显示DLL中包含的窗口。TDllForm为DLL中窗口类的类型,DllForm为该窗口类型的变量,Delphi虽然不会为DLL自动创建窗口,但会为DLL中包含的窗口类型自动建立默认的变量(如:var DllForm:TDllForm)。
  在宿主程序的某个窗口中放置一个按钮,在按钮的OnClick事件中添加ShowDllForm调用(有关方法请参阅口被显示出来。
  至此,DLL中所包含的窗口已经可以正常显示,但该窗口与宿主程序的窗口互相独立和游离,还没有融合为一体。
  注:上面的代码中用Show来显示DLL中的窗口,该函数显示的窗口为非模态形式;实际上DLL中的窗口也可以使用ShowModal函数来显示成模态的,本文阐述的是如何将DLL中的窗口与宿主程序的窗口融为一体,模态窗口显然不符合这一要求。

3 DLL中自带窗口与主程序中窗口的融合
  DLL中的窗口与宿主窗口的融合是通过Windows的子窗口机制来实现的,即把DLL中的窗口设置为宿主窗口或宿主窗口中的某一部分的子窗口,DLL中的窗口即能和宿主程序中的窗口融为一体了。
  在Windows的窗口机制中对窗口的操作依靠窗口句柄(Handle)来进行;Delphi中的可视化控件分为两种,其中一种TwinControl继承而来的控件,包括TForm,TPanel,TGroup等都是标准的Windows窗口,其Handle属性即代表其窗口句柄。这些控件都可以作为DLL中窗口融合于宿主窗口的容器,即DLL窗口可以在这些控件所在的范围内显示,宛如通过这些控件“嵌入”宿主窗口一样。
  这时DLL必须知道这些容器的窗口句柄,并将自身窗口作为容器的子窗口,ShowDllForm必须改写如下:
procedure ShowDllForm:stdcall(Parent:THandle);stdcall;export;
begin
Application.handle:=parent;
//将容器设为应用程序句柄
//以非模态创建并显示窗口
if DllForm = nil then
DllForm := TDllForm.Create(Application);
DllForm.PParentWindow:=Parent;//将容器设置为父窗口
DllForm.Show;
end;



   为了实现与宿主窗口的融合,在ShowDllForm过程中增加了以下内容:
  (1)增加了Parent入口参数,该参数为Thandle类型,是宿主程序传来的容器句柄。
  (2)增加了DllForm.ParentWindow:=Parent,该代码将DLL中窗口设为宿主窗口中容器的子窗口。
  同样,在宿主窗口中可以添加一个Panel作为DLL窗口显示的容器,并将按钮的OnClick时间中的代码修改为ShowDllForm(Panel1.Handle),将容器Panel的句柄传到DLL。
  此时运行宿主程序并点击该按钮,可以发现DLL中 的窗口显示在宿主窗口的Panel中,但仍然具有标题条,可以在Panel中进行移动;如果要解决这一问题,只需将DLL中窗口的BorderStyle属性设为bsNone即可。
  此时,DLL中窗口已经与宿主程序的窗口融为一体,只是还有一个问题,DLL窗口不能获得输入焦点,按Tab和光标键时输入焦点不会进入到DLL窗口中去,即使用鼠标将焦点强制切换到DLL窗口中,一使用Tab键焦点又会回到主程序窗口。

4 DLL中自带窗口的焦点控制
  DLL没有自己的消息循环,焦点问题的出现可能与此有关。经笔者反复试验,焦点问题可以这么解决:
   (1)宿主程序转发DLL窗口的消息
  首先,需要把ShowDllForm由procedure改为Functiion
  

function ShowDllForm:stdcall(Parent:THandle);stdcall;export;
begin
Application.handle:=parent;
//将容器设为应用程序句柄
//以非模态创建并显示窗口
if DllForm = nil then
DllForm := TDllForm.Create(Application);
DllForm.PParentWindow:=Parent;//将容器设置为父窗口
DllForm.Show;
Result := DllForm.Handle; //返回DllForm的句柄
end;

其次,在宿主程序中设置储存DLL窗口句柄的变量DllFormHandle,并在按钮的OnClick事件中利用ShowDllForm返回的句柄为其赋值。即:
  DllFormHandle:=ShowDllForm(Panel1.Handle);
  最后,在宿主程序中添加AppEvent控件,并在其OnMessage事件中增加如下代码:
  if IsDialogMessage(ExternMonitorHandle,Msg)then  
  Handled:=True;
   通过该代码转发DLL窗口的消息。
  在做了上面的改动后,可以用鼠标将输入焦点送给DLL窗口,并用Tab和光标键在DLL窗口内移动焦点,但是还不能用Tab键将焦点从宿主窗口中移到DLL窗口中。
  (2)在焦点进入容器时转换焦点到DLL窗口  为了能用Tab键将焦点从宿主窗口中移到DLL窗口中,可以在焦点进入DLL窗口容器(如Panel)时强制将焦点传送给DLL窗口;
  如,在Panel的OnEnter事件中添加如下代码: 
  SetForegroundWindow(DllFormHandle);
  //将DLL窗口设置为前景窗口 
  Windows.SetFocus(DllFormHandle);
  //将焦点交给DLL窗口
  现在,可以通过Tab键将焦点从宿主窗口中移到DLL窗口中,但是一旦焦点进入DLL窗口中后无法再回到宿主窗口。
   (3)焦点从DLL窗口的返回
  为了能使焦点从DLL窗口返回到宿主窗口,需要利 用一个“Wrap”手段,即在DLL窗口放置一个无用的WinControl控件来实现Wrap,例如一个Width,Height都
为0的Button,当焦点传递到该Button时强制返回焦点到宿主窗口;即,在Button的OnEnter事件中添加如下代码: 
  SetForegroundWindow(Application.Handle); 
  Windows.SetFocus(Application.Handle);
  因为Application.Handle中存贮着宿主窗口的句柄,这两句调用可以强制把焦点返回给宿主窗口。至此,DLL中的窗口已经可以与宿主程序的窗口完全融合到一起,并
且可以和宿主程序一起使用输入焦点。经笔者试验,可以将多个DLL中的窗口在宿主程序窗口、其他DLL窗口中嵌入显示,可以和Panel,GroupBoxM,TabControl等控
件结合起来进行DLL窗口嵌入和嵌套,实现灵活多变的、浑然一体的窗口组合。

5 结语
  在用以上方法实现了DLL与宿主程序窗口的融合后,笔者还在思索和尝试类似的软件系统动态组合方面的问题,诸如插件技术的内核和实现等,欢迎广大编程高手和爱好者予以赐教和交流。
Delphi_LiMin 2010-11-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 gobiz 的回复:]
试着在加载Dll窗体的时候,把主应用程序的Application传递进入,替换掉Dll窗体的Application。
[/Quote]

我引用了...我Dll窗体是这样引用的:
//显示 财务信息 子窗体
// 0:异常错误;
// 1:非正常使用;
// 2:成功;
function ShowFinancialForm(var App:TApplication; ParentForm:TForm; FormFalg:Integer;AppFalg:PChar): Integer;stdcall;
var
Rint:Integer;
begin
Application:= App;
Rint:=ShowForm(ParentForm,FormFalg,AppFalg);
Result:=Rint;
end;

但是当你点击这个Dll子窗体上的DBGridEh 的时候还是不行`....没有任何反映,连相关的双击事件都不能触发...., 但是你点击这个Dll子窗体上的Edit 就可以获取Edit焦点, 然后在点击Dll子窗体上的DBGridEh 就又可以获取焦点了`...一直不明白为什么....
gobiz 2010-11-05
  • 打赏
  • 举报
回复
试着在加载Dll窗体的时候,把主应用程序的Application传递进入,替换掉Dll窗体的Application。
一、 DBGridEh(增强型表格组件)功能详解.....................................................................4 二、应用实例..........................................................................................................................5 1. 定制标题行......................................................................................................................5 1) 制作复杂标题行.......................................................................................................5 2) 按钮式标题..............................................................................................................5 3) 标题行显示图片.......................................................................................................5 4) 如根据不同状态在数据单元格显示相应图片...................................................5 5) 自动显示标题行的升降排序标志符(▽降序△升序)并做相应排序...............6 6) 点dbgrideh 标题排序..............................................................................................7 7) 在DBGridEH 怎样实现多重排序(标题出现0123等排列序号)? ................ 11 8) 让dbgrid显示序号................................................................................................ 11 2. 外观布局........................................................................................................................12 1) 根据不同字段值显示相应的小图片.....................................................................12 2) 显示检查框(checkbox)外观.............................................................................12 3) 显示单、多列下拉列表.........................................................................................12 4) 显示日历下拉列表.................................................................................................13 5) 3D或平面外观效果...............................................................................................13 6) 行头和列头的启用关闭.........................................................................................13 7) DBGrid如何实现透明效果?.................................................................................13 8) 滚动条的各种应用.................................................................................................16 9) 数据行高................................................................................................................19 10) DBGrid设置Rowheight后如何将单元格内容纵向和垂直都居?..............19 11) 设置DBGridEH 自适应列宽的最好方法.........................................................20 12) Ehlib 的DBGridEh首列加序号........................................................................21 13) 分行分列、单元格的颜色设置.........................................................................23 14) 点击不同单元格列,执行不同的动作.............................................................27 15) 下拉式计算器.....................................................................................................28 16) 鼠标移到某个单元格,指针形状改变.............................................................28 17) 自动填充网格列宽到网格客户.....................................................................29 18) 从注册表或ini文件保存或恢复网格和列的层次。...................................29 3. 编辑功能........................................................................................................................29 1) 多选........................................................................................................................29 2) 文本多行显示.........................................................................................................30 3) 显示备注字段.........................................................................................................30 4) 如何让dbgrideh1 显示数据时只显示两位小数...................................................30 5) 获得当前DBGridEh单元格的序号.............................................................30 6) 怎样在dbgridEh和Edit显示金额的千分号...................................................30 7) end;请问怎么才能使DBGridEh不滚动就能提交数据?...................................32 8) 我怎么把dbgrid 里的数据一次插入到数据库呢................................................32 9) 在DBGrid可选行而又可进入编辑状态......................................................32 10) 修正DBGrideh 丢失焦点时自动关闭输入法的问题......................................35 11) DBGRIDEH选定多行删除怎么实现...............................................................36 12) DBGrid 滚动表格的代码...................................................................................37 4. 统计功能........................................................................................................................37 白波九道整理自用版 第 3 页 1) 页脚合计................................................................................................................37 2) 定制表格底部(footer)域的汇总统计行.......................................................38 3) TDBSumList说明..................................................................................................38 4) 如何工作以及为什么有时SumList的集合值计算不正确?.............................39 5) dbgrideh列求和.....................................................................................................39 5. 数据功能........................................................................................................................40 1) 查找字段点击某列值的下拉按纽弹出一个从数据库取值下拉列表...............40 2) 使用DBGridEh自动过滤实现方法.....................................................................40 3) 使用DBGridEh自动过滤实现方法2 ..................................................................41 4) DBGridEh 控件使用过滤功能 (适用ehlib 5.2 ehlib 5.3)................................42 5) 支持模糊查询.........................................................................................................43 6) ehlib4.4.50支持模糊匹配的修改方法..............................................................44 7) EhLib 5.0 Build 5.0.13的过滤字串都是模糊过滤修改.......................................45 8) 滚动条滚动时选择不变,还有自动过滤功能的实现.........................................45 9) 增量搜索................................................................................................................46 10) ehlib总是按两次ctrl+f才出来查找框,怎么办?.........................................46 11) 如何改良dbgrideh的文字过滤........................................................................46 12) 改进DBGrideh 表头点击自动排序,实现双击状态轮流.................................47 13) 改良Ehlib 的排序功能,加快排序速度.............................................................49 14) 在DbGridEh显示TreeView效果................................................................50 15) DBGridEh-KeyList、PickList............................................................................51 16) 主从表设置........................................................................................................53 17) 在DbGridEh显示表表..............................................................................55 6. 输入/输出.......................................................................................................................56 1) 导入导出数据.........................................................................................................56 2) 从多种格式导入/导出数据到TDBGridEh...........................................................57 3) DBGRID 生成EXCEL报表.................................................................................57 4) 使用TPrintDBGridEh 组件.................................................................................61 5) 打印时确定Ehlib定义的报表表头颜色? ............................................................61 6) Ehlib 的PrintDBGridEh如何印页码,即第几页共几页...................................62 7) 怎么让PrintDBGridEh只打印DbGridEh 指定的列.......................................62 8) 怎样进行横向打印/ 打印预览?........................................................................62 7. 将存在的DBGrid组件转换为DBGridEh组件...........................................................62 三、EhLib安装问题.............................................................................................................64 1. EhLib 安装步骤.............................................................................................................64 2. EhLib 安装问题dbsumlst.dcu出错) ..........................................................................64 3. 安装提示找不到.BPL文件...........................................................................................65 四、Delphi 下的优秀表格(Grid)显示控件........................................................................65 1. NextGrid .........................................................................................................................65 2. TopGrid 3.01...................................................................................................................65 3. XLGrid............................................................................................................................66 4. DevExpress ExpressQuantumGrid .................................................................................66 5. TMS Grid Pack...............................................................................................................68 6. EhLib ..............................................................................................................................71 白波九道整理自用版 第 4 页 7. ProfGrid..........................................................................................................................71 8. EasyGrid .........................................................................................................................71 五、delphi 配置文件的使用(*.ini).........................................................................71 六、窗口动画效果Animatewindow应用...........................................................................72 七、Delphi Excel to Sql Server..............................................................................................73 八、Delphi控制Excel的经验如下:..................................................................................76

5,935

社区成员

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

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