[教程]调用 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. imaplib.error: command: SEARCH => got more than 10000 bytes

    imaplib.error: command: SEARCH => got more than 10000 bytes 使用IMAPLIB进行标记邮件状态的时候,在 typ,data=M.sea ...

  2. Codeforces 792B. Counting-out Rhyme

    B. Counting-out Rhyme time limit per test: 1 second memory limit per test: 256 megabytes input: stan ...

  3. cocos jsb工程转html 工程

    1 CCBoot.js prepare方法:注掉下面这行,先加载moduleConfig中的脚本后加载user脚本 //newJsList = newJsList.concat(jsList); // ...

  4. 解决SecureCRT超时自动断开的问题

    http://blog.csdn.net/hcwzq/article/details/7944941. http://discuzx.sinaapp.com/mediawiki-chapter.htm ...

  5. 旅行家的预算(NOIP1999&水题测试2017082301)

    题目链接:旅行家的预算 这题还可以,不算太水. 这题贪心即可. 我们采取如下动作: 如果在装满油的情况下能到达的范围内,没有加油站,则无解. 如果在装满油的情况下能到达的范围内,油价最低的加油站的油价 ...

  6. mysql之存储引擎和文件配置

    (查看系统服务,在运行里输入services.msc) 补充:将mysql做成系统服务:mysqld --install 取消:mysqld --romove 在服务中可以直接鼠标操作mysql服务的 ...

  7. 2018.12.17 hdu2138 How many prime numbers(miller-rbin)

    传送门 miller−rabbinmiller-rabbinmiller−rabbin素数测试的模板题. 实际上miller−rabinmiller-rabinmiller−rabin就是利用费马小定 ...

  8. google pay app权限使用说明

    android.permission.CAMERA. 个人中心使用头像时需要使用该权限. android.permission.READ_PHONE.获取用户DeviceId,作为用户单点登录唯一值.

  9. react native的注释

    在react native 中是这样写注释的: {/*这里是注释*/}

  10. c++关键字volatile的作用

    1.易变性 1.1概念 编译器对volatile修饰的变量,当要读取这个变量时,任何情况下都会从内存中读取,而不会从寄存器缓存中读取(因为每次都从内存中读取体现出变量的“易变”) 1.2测试代码(VS ...