[教程]调用 TBrowseForFolder 的正确姿势

2017-08-22 • C++ BuilderDelphi教程 • 暂无评论 • swish •浏览 562 次

TBrowseForFolder 是 Delphi / C++ Builder 中自带的一个浏览目录的对话框,位于 StdActns 单元(后期为 Vcl.StdActns 单元),不幸的是,这个动作代码天生残疾(从诞生到现在一直没改过这个问题),要让其好用,有两种解决办法:

第一种:刮骨疗毒=>修改 StdActns 单元的代码

  1. 将 StdActns 单元复制到你工程目录下;
  2. 打开这个单元,并在 TBrowseForFolder.ExecuteTarget 实现中,找到下面这段代码:
     
    1
    2
    3
    4
    5
    with BrowseInfo do
    begin
    hwndOwner := Application.Handle;
    pidlRoot := RootItemIDList;
    ....

    将 hwndOwner 的值由 Application.Handle 改为:

     
    1
    2
    3
    4
    if Assigned(Screen.ActiveForm) then
       hwndOwner:=Screen.ActiveForm.Handle
    else
       hwndOwner:=Application.Handle;

    然后分别使用 Release/Debug 模式编译这个单元。

  3. 复制 Release/Debug 两种模式下的相应 StdActns 的 dcu 到 Delphi/C++ Builder 的安装目录中对应的位置,覆盖原来的 dcu 文件。

第二种:投机取巧=>既然你设置的 hwndOwner 是 Application.Handle,那我在调用这个动作前,先把 Application.Handle 窗口置前就好了,这样子,弹出的浏览目录对话框就不会跑到其它窗口后面了。所以,此时正确的姿势就成了:

 
1
2
SetForegroundWindow(Application.Handle);
BrowseForFolder.Execute;

注意此时,你就不能将动作绑定到一个控件上了,而要在控件的 OnClick 一类的事件中,手动调用。

好了,比较一下两个的优劣:

  • 第一种唯一的问题就是每次升级 Delphi 你都需要处理一遍,直到官方修改这个问题;
  • 第二种唯一的问题是你要多写两行代码,不需要管 Delphi 升级的问题。

如何取舍,在于你而不在于我。同样的问题,在 FMX 中依然存在,同样的办法解决。

原创文章转载请注明:转载自:[教程]调用 TBrowseForFolder 的正确姿势

调用 TBrowseForFolder 的正确姿势的更多相关文章

  1. Installshield调用DLL的正确姿势

    脚本如下 szDllPath = SUPPORTDIR ^ "TestCom.dll";       set oMyTest = CoCreateObjectDotNet(szDl ...

  2. vue里使用create、mounted调用方法的正确姿势

    参考:https://blog.csdn.net/Honnyee/article/details/82421844

  3. 判断是否为gif/png图片的正确姿势

    判断是否为gif/png图片的正确姿势 1.在能取到图片后缀的前提下 1 2 3 4 5 6 7 8 9 //假设这是一个网络获取的URL NSString *path = @"http:/ ...

  4. ios监听ScrollView/TableView滚动的正确姿势

    主要介绍 监测tableView垂直滚动的舒畅姿势 监测scrollView/collectionView横向滚动的正确姿势 1.监测tableView垂直滚动的舒畅姿势 通常我们用KVO或者在scr ...

  5. 解锁redis锁的正确姿势

    解锁redis锁的正确姿势 redis是php的好朋友,在php写业务过程中,有时候会使用到锁的概念,同时只能有一个人可以操作某个行为.这个时候我们就要用到锁.锁的方式有好几种,php不能在内存中用锁 ...

  6. jquery选中radio或checkbox的正确姿势

    jquery选中radio或checkbox的正确姿势 Intro 前几天突然遇到一个问题,没有任何征兆的..,jquery 选中radio button单选框时,一直没有办法选中,后来查了许多资料, ...

  7. 程序员节应该写博客之.NET下使用HTTP请求的正确姿势

    程序员节应该写博客之.NET下使用HTTP请求的正确姿势 一.前言 去年9月份的时候我看到过外国朋友关于.NET Framework下HttpClient缺陷的分析后对HttpClient有了一定的了 ...

  8. Redis实现分布式锁的正确姿势

    分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKeeper的分布式锁.本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上已经有各种介绍Re ...

  9. 使用 Java8 Optional 的正确姿势(转)

    我们知道 Java 8 增加了一些很有用的 API, 其中一个就是 Optional. 如果对它不稍假探索, 只是轻描淡写的认为它可以优雅的解决 NullPointException 的问题, 于是代 ...

随机推荐

  1. 201621123008 《Java 程序设计》 第九周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 本次作业题集集合 1. List中指定元素的删除(题集题目) 1.1 实验总结.并回答:列举至 ...

  2. How to use external classes and PHP files in Laravel Controller?

    By: Povilas Korop Laravel is an MVC framework with its own folder structure, but sometimes we want t ...

  3. swift NSdata 转换 nsstring

    result = NSString(data: data, encoding: NSUTF8StringEncoding) 做HTTP 请求时 遇到 打印结果看  所以~~~

  4. Vue router 全局路由守卫

    记录一下全局路由守卫的使用: 方法一:定义一个数组用于检测与管理需要登录的页面,全局路由守卫配合本地存储判断是否跳转 import Vue from 'vue' import Router from ...

  5. mybatis 插入数据并返回主键值

    <insert id="insert" parameterType="com.pojo.TSubject" useGeneratedKeys=" ...

  6. IOS初级:app的图标

    1,首先准备6张png图,分辨率一定要正确,不然报错(The app icon set named "AppIcon" did not have any applicable co ...

  7. ContextMune上下文菜单中,二级菜单获取及状态设置

    ContextMune上下文菜单中,二级菜单获取及状态设置 在使用ContextMune上下文菜单中,能够通过二级菜单来获取及状态设置 //二级菜单获取和状态设置((ToolStripDropDown ...

  8. hdu6069 多校Counting Divisors

    思路:对于n^k其实就是每个因子的个数乘了一个K.然后现在就变成了求每个数的每个质因子有多少个,但是比赛的时候只想到sqrt(n)的分解方法,总复杂度爆炸,就一直没过去,然后赛后看官方题解感觉好妙啊! ...

  9. Linux网桥模式配置

    Linux网关模式下将有线LAN和无线LAN共享网段实现局域网内互联: 思路其实很简单:就是将虚拟出一个bridge口,将对应的有线LAN和无线LAN都绑定在这个虚拟bridge口上,并给这个brid ...

  10. 第9章 符合Python风格的对象

    #<流畅的Python>读书笔记 # 第9章 符合Python风格的对象 # 本章包含以下话题: # 支持用于生成对象其他表示形式的内置函数(如repr().bytes(),等等) # 使 ...