虽然PowerBuilder有Grid风格的DataWindow,但不够灵活,如果想打印一张边框粗线条或双线,内框为细线条的表格直接使用Grid风格的DataWindow就不能实现。因此许多人都用Tabular风格的DataWindow,然后自己用Line来实现Grid。 在调整线条位置是一个即伤脑筋又伤眼睛的事件,而一旦需要调整行高,所有工作都得重来,试一试用下面方法,会大大减轻你的工作量:
在vertical lines,改变它的属性,在Expressions Tab上,y1行上输入0,y2行上输入rowheight() - 1
在horizontal lines, 设置 y1 和 y2 = rowheight() - 5
这样PowerBuilder会自动调整线的坐标,你只需要设置横线的长度和x1,x2的坐标即可。 马上Preview一下,看一看效果! 你再也不需要因为行的高度发生改变而重新调整线条位置。
Oracle 8客户端安装配置:请将以下文件拷贝到运行文件所在目录
一、ODBC动态库 :
ctl3d32.dll msvcrt40.dll odbc16gt.dll odbc32.dll odbc32gt.dll odbccp32.dll
odbccr32.dll odbcint.dll
二、建立EXTRA子目录,将MSVCRT.DLL文件拷贝到该子目录下
EXTRA\MSVCRT.DLL
三、ORACLE动态库及配置文件
Tnsnames.ora CORE35O.DLL NASNSNT.DLL NAUNTSNT.DLL
NCRNT.DLL Nlnt.dll NLSRTL32.DLL Nnfdnt.dll NNFNNT.DLL
NSNT.DLL NTNT.DLL NTTNT.DLL CIW32.DLL Ora73.dll OTRACE73.DLL
Sqlnet.ora Sqltnsnt.dll CORE35.DLL
四、PB动态库
pbvm70.dll pbdwe70.dll Pbo7370.dll PBO8470.DLL pbodb70.dll libjcc.dll
在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 )
打开动态窗口的方法:
window newarray[3]
string win[3]
int i
win[1] = "w_employee"
win[2] = "w_customer"
win[3] = "w_sales"
for i = 1 to 3
Open(newarray[i], win[i])
next
Window Plugin的窗口可以通过如下代码得到指定参数的数值:
ContextKeyword icxk_base
String is_values[]
//通过GetContextService函数创建内容信息服务
this.GetContextService("Keyword", icxk_base)
//使用GetContextKeywords函数访问用户定义的参数message
icxk_base.GetContextKeywords("message", is_values)
//将读出的数据显示
Integer li_count
FOR li_count = 1 to UpperBound(is_values)
lb_1.AddItem(is_values[li_count])
MessageBox("Window Plug-in",is_values[li_count])
NEXT
如何从两个结果集中再用条件检索出新的结果集?
类似如下语句:
select c.*
from
( select a.* from a
union all
select b.* from b
) c
where c.id = ’12345’
在数据窗口中如何隐藏某计算单元?
在它的properties\expression\visible属性中设置为“IF(1=2,1,0)”就可以了。
如何在PB中实现对数据库表的锁定?
1、pb在做完update,delete操作后,未commit前数据库会自动锁定记录的。
2、如果select后想锁定查询结果中的记录,使用select * from table1 for update;。
利用Api函数ShellAboutA可以显示一个与Windows操作系统风格一致的About对话框。 首先声明如下外部函数:
function int ShellAboutA(ulong al_hWnd, string as_szApp, string as_szOtherStuff, ulong hIcon)
library "shell32"
ShellAboutA(handle(parent),"关于...#摆渡人工作室","欢迎光临摆渡人工作室",0)
如何取得当前光标处的颜色?请参考以下代码:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var
DC:HDC;
X,Y:Integer;
begin
X:=Mouse.CursorPos.X;
Y:=Mouse.CursorPos.Y;
if Key<>VK_Return then Exit;
DC:=GetDC(0);
Color:=GetPixel(DC,X,Y);
end;
介绍一种利用结构实现在TreeView的一项中存放多个参数的方法:
str_data tmpdata (str_data是一个自定义结构)
TreeViewItem tvi_result
//...
tmpdata.wlbm = ls_wlbm
tmpdata.zhyl = ld_zhyl
tmpdata.sff = ls_sff
tvi_result.data = tmpdata
固定数据窗口前几列的方法,例如第一列名为“id”,固定该列且后半部分从下一列开始显示:dw_1.HSplitScroll = True
dw_1.Object.DataWindow.HorizontalScrollSplit = dw_1.object.id.Width
dw_1.Object.DataWindow.HorizontalScrollPosition2 = dw_1.object.id.Width
打印数据窗口最后一页的方法:
string ls_pagecount
ls_PageCount = dw_1.describe("Evaluate(’PageCount()’,0)")
dw_1.object.datawindow.print.page.range = ’" + ls_PageCount + "’"
dw_1.print()
如何当编辑框得到焦点时自动选中内容:this.selecttext(1,len(sle_1.text))
使用Ole对象与Word等通讯时,如何避免启动多个Word等程序:
OLEObject ole_object
ole_object = CREATE OLEObject
li_ret = ole_object.ConnectToObject("","word.application")
IF li_ret <> 0 THEN
//如果Word还没有打开,则新建。
li_ret = ole_object.ConnectToNewObject("word.application")
if li_ret <> 0 then
MessageBox(’OLE错误’,’OLE无法连接!错误号:’ + string(li_ret))
return
end if
ole_object.visible = true
END IF
利用WaveOutGetNumDevs()函数可以得到音频输出设备的个数,从而可以判断用户计算机是否安装了声卡,决定是否取消声音播放程序。
用下面表达式可得到记录在某组中的行号: Getrow()-First(Getrow() for Group 1)+1
利用AncestorReturnValue可以得到被继承对象中处理代码的返回值。
如何实现在PB环境中创建的数据库中没有PB-Catalogs表?
设置PB.INI文件中的PBNoCatalog=1即可。
在运行PB的快捷方式中加上如下参数可以实现打开PB时直接打开各画板:
"C:\Program Files\Sybase\PB6\pb60.exe" /p datawindows ,数据窗口
/p windows ,窗口;/p datawindows ,库;/p userobjects ,用户对象;/p funtions ,全局函数;/p database ,数据库画板;/p menus ,菜单。。。
使用Application属性可以实现(在Application的Open事件中添加代码):
1、将菜单工具条右键弹出菜单显示的是中文:
ToolbarPopMenuText="左边,顶端,右边,底端,浮动,显示文本,显示提示"
ToolbarFrameTitle="工具条"
ToolbarSheetTitle="工具条"
2、不显示弹出菜单:ToolbarUserControl = false
3、修改缺省MDIHelp文本:MicroHelpDefault = "欢迎使用质量管理系统"
4、修改数据窗口错误消息框标题:dwmessagetitle = "数据有误"
5、隐藏PowerTips:ToolbarTips = false
6、工具条上显示文本:ToolbarText = true
如何在PB中实现延时:
subroutine Sleep(long dwMilliseconds) library "kernel32.dll",延时1秒则调用: Sleep(1000) //单位是毫秒。
在数据窗口中使用全局函数可以实现一些好功能:
1、给含有多个Nested报表的复合式数据窗口赋值;
2、进行复杂的运算,然后将结果传回数据窗口,制作复杂的报表。
在VC中,int是32位;而在PowerBuilder中int是16位,long则是32位;
在PB中调用屏幕保护的方法:send(handle(This),274,61760,0)
隐藏任务栏的方法:在OnCreate事件里利用Window API函数SetWindowLong: SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW); PB使用时首先声明函数FUNCTION long SetWindowLong(ulong hWnd, integer nIndex, ulong dwNewLong) library "user32.dll"
ALIAS FOR "SetWindowLongA",然后调用:SetWindowLong(Handle(this),-20,128);
使用WinExec函数实现启动拨号连接,“我的连接”是你创建的拨号程序的名称:WinExec(’rundll32.exe rnaui.dll,RnaDial ’+’我的连接’,9);
如何判断数据窗口中是否存在某列?可以利用Describe("column_name.width")是否为"!"来判断;
有时我们需要得到下拉数据窗口中的显示值,方法很简单:
ls_value = dw_1.Describe("Evaluate(’LookupDisplay(column_name)’,"+string(row_number)+")")
如何生成固定长度的前面加零的数字编号,例如:12生成"00012",1234生成"01234"。方法很简单: String(ll_number, "00000")