C++Builder 程序员博客
3 Sep
各位好,我现在想创建的一个应用程序,类似资源管理器,左边是一个TreeView的控件,右边是工作用的界面,现在我想在TreeView控件里点击不同的节点时,右边可以切换成不同的工作界面,请问该怎么做,谢谢了
这两天都有人问这样的问题
思路lz描述的很清楚了 你就点击TreeView 获取节点标识
然后根据标识 显示对应的东西 有什么难点?
响应事件,切换界面。
经曲的资源管理器界面,一般是左边一个TreeView,右边一个ListView,顶部是Menu + ToolBar,底部是StatusBar
在TreeView的OnClick中,根据你的需求(谁知道你要切换什么界面呢),动态的增加删除右侧ListView中的项目就行了,或者交替显示多个不同的ListView。如此而已。
模糊的需求只能模糊的回答。
父节点+…+父节点+单击节点的名称=完整路径
listview显示路径中的所有文件和文件夹。
谢谢,右边的工作界面比较复杂,包括按钮和一些图表控件以及PageControl控件,基本的思路我明白了,刚学BCB,还不是很熟,谢谢zzbinfo和妖哥前辈们的解答
28 Aug
主要是转换UI上的文字信息 转换为Unicode吗
麻烦各位前辈给点意见
哈 找到TNT了 用Unicode看看 写ini是不是浪费啊 直接在程序中替换就好 ini就是保存下设置 两位前辈 谢谢啦
22 Aug
有项应用,想在按钮按下时,开始Timer1(控件),当这个按钮的代码执行完毕(约需2-15秒钟)时,停止Timer1。TIMER1执行的是开启进度条显示。
———————————-
可当我按下按钮时(正在执行,按钮还未弹起)。进度条并未开始显示(即时钟控件未开启工作)。我将开启timer1的代码写到按钮的Mouse_Down中时,鼠标点击按钮未松开时Timer1工作,松开后Timer停止(像是系统停止响应一样),真到按钮执行完,Timer才接着工作(进度条接着显示)。
Application->ProcessMessages();
呵,忘了说一句:Application-> ProcessMessages() 这个我用了。不行。
我又偿试了一个,在窗口显示时就启用timer(启用进度条显示),当程序运行时,进度条静止,直到代码运行完毕才开启动。
上代码来的快一些
系统运行该事件时,需要时间长,在此期间,想加入一个ProgressBar_ctrl(true);//开启进度条显示
,但是达不到效果,程序运行时,进度条也静止状态。如何让他动起来?
————————————-
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String vpn_tunnel_gw;
//ProgressBar_ctrl(true); //开启进度条显示
//Application->ProcessMessages();
if(DialUpVPN(vpn_conn_name))
{
vpn_tunnel_gw= GetRouteTable_vpn_tunnel();
//添加隧道路由
AddVpnTunnelRoute(vpn_tunnel_gw);
Application->MessageBoxA(L"恭喜:VPN拨号成功!",L"信息",64);
//将拨号成功的帐号信息写入INI文件
WriteLoginInfoToIni(Edit1->Text ,Edit2->Text );
exit(0);
}
else
{
Application->MessageBoxA(L"VPN拨号失败!请检查帐号信息或重启操作系统!",L"信息",48);
}
//ProgressBar_ctrl(false); //关闭进度条
}
没有看见你进度条递增的代码 你放哪里的?
写到Timer1的事件里了。通过下面函数来控制开启和关闭。
//ProgressBar_ctrl(true); //开启进度条显示
//ProgressBar_ctrl(false); //关闭进度条
你这需求,用多线程来搞比较合适。
谢谢妖哥,听你的指示,用多线程搞定了。不用多线程似乎有难度。
第一次接触学习了多线程,也得谢谢妖哥。
4 Aug
3 Aug
目前我实现了一个MDI程序,我想通过双击方式,然后用我自己的MDI程序打开这个文件。目前文件类型已经和我的MDI程序关联起来了。因为这个MDI程序只允许一个进程实例。所以在没有启动的时候可以通过双击文件,在MDI show的时候获得传入文件的参数(文件名),然后将这个文件显示到子窗体中。
未实现点: 但是我想在任意时刻双击自定义文件的时候,MDI都能接受到这个消息并将获得这个文件名。从而在子窗体中显示出这个文件的内容。这个应该怎么做呢?
在你的应用程序中,判断ParamCount>1,说明有参数代入,ParamStr(1)就是双击的那个文件名。
那就是要在程序中用一个循环来不断检测这个参数值?
不需要。
关键的问题在于,你是如何“这个MDI程序只允许一个进程实例”,在这里做文章就行了。
是不是可以这样,你双击文件的时候其实都是要启动你的应用程序检测的,如果有实例已经运行的时候可以给你已有的实例发个消息,然后,你的应用处理这个消息就可以了吧
3 Aug
目前我实现了一个MDI程序,我想通过双击方式,然后用我自己的MDI程序打开这个文件。目前文件类型已经和我的MDI程序关联起来了。因为这个MDI程序只允许一个进程实例。所以在没有启动的时候可以通过双击文件,在MDI show的时候获得传入文件的参数(文件名),然后将这个文件显示到子窗体中。
未实现点: 但是我想在任意时刻双击自定义文件的时候,MDI都能接受到这个消息并将获得这个文件名。从而在子窗体中显示出这个文件的内容。这个应该怎么做呢?
在你的应用程序中,判断ParamCount>1,说明有参数代入,ParamStr(1)就是双击的那个文件名。
那就是要在程序中用一个循环来不断检测这个参数值?
不需要。
关键的问题在于,你是如何“这个MDI程序只允许一个进程实例”,在这里做文章就行了。
是不是可以这样,你双击文件的时候其实都是要启动你的应用程序检测的,如果有实例已经运行的时候可以给你已有的实例发个消息,然后,你的应用处理这个消息就可以了吧
3 Aug
目前我实现了一个MDI程序,我想通过双击方式,然后用我自己的MDI程序打开这个文件。目前文件类型已经和我的MDI程序关联起来了。因为这个MDI程序只允许一个进程实例。所以在没有启动的时候可以通过双击文件,在MDI show的时候获得传入文件的参数(文件名),然后将这个文件显示到子窗体中。
未实现点: 但是我想在任意时刻双击自定义文件的时候,MDI都能接受到这个消息并将获得这个文件名。从而在子窗体中显示出这个文件的内容。这个应该怎么做呢?
在你的应用程序中,判断ParamCount>1,说明有参数代入,ParamStr(1)就是双击的那个文件名。
那就是要在程序中用一个循环来不断检测这个参数值?
不需要。
关键的问题在于,你是如何“这个MDI程序只允许一个进程实例”,在这里做文章就行了。
是不是可以这样,你双击文件的时候其实都是要启动你的应用程序检测的,如果有实例已经运行的时候可以给你已有的实例发个消息,然后,你的应用处理这个消息就可以了吧
3 Aug
目前我实现了一个MDI程序,我想通过双击方式,然后用我自己的MDI程序打开这个文件。目前文件类型已经和我的MDI程序关联起来了。因为这个MDI程序只允许一个进程实例。所以在没有启动的时候可以通过双击文件,在MDI show的时候获得传入文件的参数(文件名),然后将这个文件显示到子窗体中。
未实现点: 但是我想在任意时刻双击自定义文件的时候,MDI都能接受到这个消息并将获得这个文件名。从而在子窗体中显示出这个文件的内容。这个应该怎么做呢?
在你的应用程序中,判断ParamCount>1,说明有参数代入,ParamStr(1)就是双击的那个文件名。
那就是要在程序中用一个循环来不断检测这个参数值?
不需要。
关键的问题在于,你是如何“这个MDI程序只允许一个进程实例”,在这里做文章就行了。
是不是可以这样,你双击文件的时候其实都是要启动你的应用程序检测的,如果有实例已经运行的时候可以给你已有的实例发个消息,然后,你的应用处理这个消息就可以了吧
21 Jul
一个MDI程序,因为每个窗口关联了一个线程,不同的窗口输出不同的信息。但是在某些情况下,某些窗口的信息不是用户想要看到的,所以我想在这个时候隐藏掉这个窗口,但是不能关闭窗口,因为窗口中输出的信息是来源于与窗口关联的线程中的。但是MDI似乎无法Hide一个子窗体,当我在FormClose的时候 Action = caHide;时 就会提示错误信息。
查了很久都不知道为什么,所以请教各位大侠,有没有什么方法可以隐藏掉子窗体。或者给我讲讲其底层原理也OK。
谢谢各位了!
不能隐藏
不过你可以让别的窗体显示
覆盖此窗体
问题已解决,非常感谢妖哥!!
15 Jul
程序需要一个服务程序和若干个dll,在制作安装程序的时候,
将服务程序和dll放在程序的目录,或者放到系统system32目录,这2个位置有什么区别?
对程序运行有什么影响?
没什么大的区别,只是不过system32目录默认存在于path环境变量中.
对于不同的WINDOWS用户,会不会有权限的区别?
如果没有刻意设置NTFS文件权限的话,没什么影响.
假如lpPathName参数指定了一个路径,SetDllDirectory函数支持一个预备的搜索顺序。这个预备的搜索顺序如下:
1. 应用程序所在的路径
2. lpPathName参数指定的目录
3. Windows SYSTEM目录。通过调用GetSystemDirectory函数可以获取这个目录的路径。
4. 16位系统的目录。并没有函数可以获取这个目录的路径,但是它会被查找。
5. Windows目录。通过调用GetWindowsDirectory函数可以获取这个目录的路径。
6. PATH环境变量指定的路径。请注意,这并不包括每个应用程序的应用程序路径注册表项中指定。在应用程序路径注册表项的键值并不作为DLL的搜索路径。
如果lpPathName参数为一个空字符串,当前目录将会从搜索顺序中删除。
SetDllDirectory 有效地禁用安全DLL搜索模式,而在搜索指定的目录路径。要恢复安全 DLL搜索模式的SafeDllSearchMode注册表值的基础和恢复当前目录到搜索顺序,调用 lpPathName的参数值为NULL的SetDllDirectory函数。
放在system目录可以共享给其他程序使用,放在程序的目录一般就这个程序用,不需要共享。
没太大区别
放 SYSTEM32 所有程序都可以直接读取(有环境变量设置)
放程序自己的目录,除非其他程序指定目录,否则无法自己找到
或者可以这么说 SYSTEM32 是为了 DLL 之类的文件能共享而设立的
应用程序在调用这些函数的时候,会按照如下的顺序查找这些动态连接库文件:
(1)应用程序所在的当前目录
(2)Windows目录
(3)Windows系统目录
(4)系统环境变量指示的目录
如果在这些目录中找不到DLL文件,程序就会出现运行异常。所以,为了保证程序的正常运行,用户最好把需要的特定动态连接库放在程序所在的目录中,这样也可以避免各种潜在的覆盖冲突。
现在的硬盘大大的,没必要放到 Windows 等共享目录里,而放到应用程序所在的当前目录,优点是便于维护、升级、卸载等。缺点只是占用硬盘空间。而现在的硬盘大大的,因此缺点就微不足道,就没必要放到 Windows 等共享目录里。
学习了。。。现在经常使用Dll。。。
good!~ 好贴。。解答了我现在的疑问 哈哈