您的位置:首页 > 产品设计 > UI/UE

Powerbuilder系列精彩问答

2006-09-20 22:35 375 查看
作者 : kinglaw
标题 : Powerbuilder系列精彩问答
关键字: Powerbuilder
分类 : PB编程
密级 : 公开
(评分: , 回复: 0, 阅读: 362)
1、如何将透明的文字放在图片上?
在Windows的API中,可以实现字符的透明输出,因此用API可以实现,下面是例子:
//API函数声明:
Function ulong GetDC (ulong hWnd) Library "USER32.DLL"
Function long ReleaseDC( long hWnd, long hDC ) Library "user32"
Function boolean TextOut (ulong hdcr, integer stx, integer sty, ref string lpString, long nCount) Library "GDI32.DLL" Alias for "TextOutA"
Function int SetBkMode (ulong hdcr, integer mode) Library "GDI32.DLL"
Function ulong SetTextColor (ulong hDC, ulong crColor) Library "GDI32.DLL"
iul_hdc = getdc(handle( p_1 ))
string ls_msg
ls_msg = "This is an example."
SetBkMode (iul_hdc, 1) //设定字符输出背景透明
SetTextColor (iul_hdc, RGB( 255,255,255 ))
TextOut (iul_hdc, 11, 11, ls_msg, len( ls_msg ))
SetTextColor (iul_hdc, RGB( 128,0,0 ))
TextOut (iul_hdc, 10, 10, ls_msg, len( ls_msg ))
ReleaseDC( handle( p_1 ), iul_hDC )

2、让PB程序不出现在Windows的任务列表中!
定义:
function long GetCurrentProcessId ( ) library "kernel32"
function long RegisterServiceProcess ( long dwProcessID, long dwtype ) library "kernel32"
Constant long RSP_SIMPLE_SERVICE = 1
Constant long RSP_UNREGISTER_SERVICE = 0
在application -> open event中:
Long ll_ProcessID
ll_ProcessID = GetCurrentProcessId ( )
RegisterServiceProcess ( ll_ProcessID, RSP_SIMPLE_SERVICE )
这样程序将不出现在任务列表中,用户也就无法强行结束任务。
记住,在application close event中要加:
Long ll_ProcessID
ll_ProcessID = GetCurrentProcessId ( )
RegisterServiceProcess ( ll_ProcessID, RSP_UNREGISTER_SERVICE)
来释放资源。

3、如何在PB程序创建硬盘子目录?
先定义一个外部函数:
FUNCTION boolean CreateDirectoryA(ref string pathname, int sa) LIBRARY "Kernel32.dll"
在自己需要建立子目录脚本中写下面代码:
boolean rtn
string l_dir
l_dir = "c:/testdir" rtn = CreateDirectoryA(l_dir, 0)
If not rtn then
MessageBox("错误", "请检查子目录是否已经存在")
end if

4、在PB中进行类似表达式求值的好方法?
在PB中进行表达式求值,可以利用DataStore对象(不用占用GUI资源),用一个Computer表达式,使用函数Describe来进行动态表达式求值。

5、PB应用程序所需的运行环境?
经过编译生成的PowerBuilder应用程序需要如下运行环境:
PowerBuilder 运行时动态连接库( Runtime Library )
在PowerBuilder 6.0中需要如下DLL库:
PBVM60.DLL (PowerBuilder 虚拟机)(必需)
PBDWE60.DLL (DataWindow 引擎)(可选)
PBRTC60.DLL (Rich Text Control)(可选)
PBTRA60.DLL (DLL used for tracing db calls)(可选)
与所需连接的数据库的直连接口(Native Driver) 或 ODBC接口(ODBC Driver)
PBSYC60.DLL (连接Sybase 的直连接口)
PBO7360.DLL (连接Oracle7.3的直连接口)
所需连接的数据库的Client端(如Sybase的Open Client, Oracle 的SQL Net)
以上是Sybase公司的建议。
我的经验是,编译好的程序必须有pbdwe60.dll和pbvm60.dll才行。
另外,如果使用ODBC联结数据库则还需pbodb60.dll,如果使用的专用接口,则需对应数据库的DLL,如Oracle7.3用PBO7360.DLL,Sybase用PBSYC60.DLL

6、PB6连接SQL SERVER7需要什么特殊设置?为什么在连接数据库时总提示“程序类型越界”?如何解决?
请到本站的PB下载特区中去下载一个PB与SQL 7.0相连的直连驱程序就行了!

7、用pb连接dbf,但在pb中删除数据后,在dbf中只做了删除标记,如何才能彻底删除?
请看网友王洪华 提供的解答:
string mysql
sqlca.autocommit=true
Mysql = "pack bdxx.dbf;"
EXECUTE IMMEDIATE :Mysql using sqlca;
sqlca.autocommit=false
是不是也很简单!

8、很多地方都讲过通过程序发现TAB键的方法,可是如何通过程序发现Shift+TAB键呢?
Subroutine keybd_event(int bVk,int bScan,ulong dwFlags,ulong dwExtraInfo) LIBRARY "user32.dll" keybd_event(16,0,0,0) 按下SHIFT键
keybd_event(9,0,0,0) 按下下TAB
keybd_event(9,0,2,0) 放开TAB键
keybd_event(16,0,0,0) 放开SHIFT键

9、有多位朋友询问关于一些API函数的应用,例如,论坛"老王"的贴子:本人做一网吧计费系统, 但是装在客户端得程序总是被人ctrl+alt+del掉, 请问在PB里如何实现隐藏任务?
我写了一个简单的例程,现在下载完整例程(5k)
说明:程序是调用SystemParametersInfo API函数完成。
先定义: Function uLong SystemParametersInfoA (ulong uAction, ulong uParam, ref any lpvParam, ulong fuWinIni) Library "user32.dll"
Integer SPI_SCREENSAVERRUNNING = 97
//使Ctrl+Alt+Del失效:
Integer i_ret
any any_value
i_ret = SystemParametersInfoA(SPI_SCREENSAVERRUNNING, 1, any_value, 0)
//恢复Ctrl+Alt+Del作用:
Integer i_ret
any any_value
i_ret = SystemParametersInfoA(SPI_SCREENSAVERRUNNING, 0, any_value, 0)

10、请问:如何将照片存入数据库之中?
定义一个Bolb 变量lb_file
将文件读到 lb_file
用 insertblob 或updateblob 就 OK 了

11、请问:如何在程序中对BLOB数据库进行写入?
和后台数据库有关:以SQLANYWAY为例:
一般用 UPDATEBLOB 和 SELECTBLOB 两个SQL语句来实现。
建一个表TABLE1,一个字段是ID,另一个是BLOB,
SELECTBLOB BLOB FROM TABLE1 WHERE ID='xx';
UPDATEBLOB SET BLOB = :BLB_X FROM TABLE1 WHERE ID='yy';
删除时删除ID为'mm'的记录即可,新增是先插入一条ID为'mm'的记录,然后 用UPDATEBLOB将数据写入表内。
其他的数据库可参照手册进行,其命令与上述差别不大!

12、请问:屏蔽窗口的ALT+F4键?
方法一:
1.在窗口的systemkey事件中增加以下代码:
IF KeyDown(KeyF4!) THEN
Message.Processed = TRUE
END IF
2.在窗口的closequery事件中增加如下代码:
Long ll_ret
IF KeyDown(keyF4!) THEN
ll_ret = 1
END IF
return ll_ret
方法二:
建一实例变量,在你的关闭程序上赋一个True然后在closequery中判断该值, 如为False则Return 1

13、请问:SQL AnyWhere安装方法?
SQL anywhere在安装PB65时的自定义安装中组件ODBC Databases Drives里的Sybase SQL anywhere 5.5.04 ,这只是安装了PB组件的ODBC驱动程序,并未安装SQL ANYWHERE但,如果你需要使用SQL Anywhere的管理工具,你还得进行如下的操作:
在正版PB6.5的第六张盘里,有一目录名是SQLANY5504,这里面就是SQL ANYWHERE的安装盘了。运行SETUP即可。
如果是盗版,那只好靠你自已去找了。 在安装目录下有一个SETUP.BMP,上面有SQL ANHWERE字样。

2004-9-26 0:38:38

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: