2、“跑马灯”的实现技巧
有时需要用一矩形条显示少量用户特别关心的信息,这条信息串首尾相连,向一个方向循环滚动,我们通常将其称作“跑马灯”。证券业中常用“跑马灯”来显示不断变化的股票行情;实际应用中也常通过“跑马灯”来监视是否死机。我们可以写一个简单的函数running_horse()来实现“跑马灯”的显示。 running_horse有两个参数, 第一个参数的参数名为textline,类型为string,传值; 第二个参数的参数名为num,类型为int,传值;函数返值类型为string。 该函数的代码仅一句: returnMid(textline,(num+1))+Left(textline,num) 下面就可以调用running_horse()函数了。先在一个窗口里定义好单行编辑器sle_running_horse,在该窗口的Open事件下写上: sle_running_horse.text="Iamtestingrunning_horse!" Timer(0.2) 然后在该窗口的Timer事件下调running_horse(),代码如下: sle_running_horse.text=running_horse(sle_running_horse.text,1) 这样,当你打开这个窗口时,“跑马灯”便会运转起来。可以在程序中加些语句,适时地增减sle_running_horse.text中的内容,你便会在“跑马灯”中看到相应变化的信息。
三、有关菜单的编程技巧右键菜单的实现技巧:
当你在相应的窗口或控制上按鼠标右键时,就会在鼠标所指位置弹出菜单,这就是右键菜单。程序中支持右键菜单会为用户的操作带来许多方便,同时鼠标右键可以分担部分左键的功能。右键菜单在证券期货业中的许多大型行情分析软件中得到了广泛的应用。在PowerBuilder中实现右键菜单非常简单,仅两个步骤:1.设计相应菜单;2.在窗口或控制的Rbuttondown事件下写上调用语句。
先在MenuPainter中创建菜单rbuttonpop,rbuttonpop有一个菜单条目(Menuitem)m_choice。然后在需要调用该菜单的窗口或控制的Rbuttondown事件下写上: m_rbutton popNewMenu NewMenu=Createm_rbuttonpop NewMenu.m_choice.PopMenu(PointerX(),PointerY()) 至此,右键菜单制作完毕。上述语句中的NewMenu的数据类型为m_rbuttonpop,当你在相应位置按鼠标右键时,弹出的菜单NewMenu是菜单m_rbuttonpop的一个实例(Instance)。
四、有关数据窗口的编程技巧
数据窗对象是PowerBuilder中最重要的概念之一,它是PowerBuilder应用区别于其它Windows应用的重要特征,同时也是PowerBuilder的价值所在。PowerBuilder应用通常通过数据窗对象从数据库或其它数据源取得数据并加以显示,其数据的输入、添加、修改和删除也大都通过数据窗对象来实现。故理解并掌握数据窗概念对于用好PowerBuilder具有重要意义。下面给出了有关数据窗的几个编程技巧。
1、自动调整大小的数据窗
在PowerBuilder应用运行过程中,常常会用鼠标拖动窗口角以改变窗口大小,尤其是在多文档窗口(MDI)中,通常有多个sheet存在的情况下,有时为了察看后面窗口中的数据而将前面窗口缩小,但窗口缩小了,其中的数据窗并没有缩小,由此而不能方便地使用数据窗的卷滚条,那么怎样使前面窗口中的数据窗大小随窗口的大小自动调整呢?
很简单,我们只需要在数据窗所在窗口的Resize事件下写上一句话: Resize(dw_datamon,this.Workspacewidth()-50,this.Workspaceheight()-50) 其中dw_datamon是数据窗的名字,数字50可以调整。这样,你就拥有了一个会随窗口大小变化而自动调整大小的数据窗了。卷滚条用起来很方便,不信试试。
2、Retrieve后不回卷的数据窗
我们经常面对一大堆数据,其具体体现就是数据窗很长,需要拉动垂直卷滚条才能看到后面的数据,当你在包含长数据窗的窗口的Timer事件中写下Retrieve()语句后,令人气恼的事情就会发生:Timer事件一执行,数据窗就翻回第一页;如果Timer事件执行的时间间歇很短,那我们就永远没有足够的时间来察看后面的数据了。下面我们着手解决这个问题。可能你已经注意到了,每个数据窗都拥有两个与Retrieve有关的事件:Retrievestart和Retrieveend,它们分别允许我们在Retrieve的前后干一些事,这正是我们所需要的。实际上,就这两个事件,我们已经能够提出两个解决方案了。 其一,在Retrievestart事件中,保存当前数据窗中可见的数据行;然后Retrieve;接着在Retrieveend事件中,恢复先前保存的数据行。 其二,在Retrievestart事件中,保存当前垂直卷滚块的位置;Retrieve后再恢复其位置。后者使用了动态数据窗函数,实现起来更简洁一些,下面详细探讨。假设你已设计好了一个在窗口w_datamon中的数据窗dw_datamon,现在可以先定义一个保存垂直卷滚块位置的类型为string的Globle变量old_vspos,然后在该数据窗的Retrievestart事件下输入以下语句以保存其位置: old_vspos=this.dwDescribe("DataWindow.VerticalScrollPosition") dw_datamon.SetRedraw(false) 在相应的Retrieveend事件下输入恢复垂直卷滚块位置的语句: this.dwModify("DataWindow.VerticalScrollPosition="+old_vspos) dw_datamon.SetRedraw(true) 这样,数据窗上的工作已做完。下面是相应窗口上的工作。该窗口的Open事件下: dw_datamon.Settrans(sqlca) dw_datamon.Retrieve() timer(6) 该窗口的Timer事件下: Setfocus(w_datamon) Retrieve(dw_datamon) 至此,Retrieve后不会回卷的数据窗dw_datamon已经可以工作了。值得注意的是,数据窗的排序分类等操作应在Retrieve前就在数据库表中完成,否则Retrievestart事件保存的卷滚块位置很可能并不是你所期待的,换句话说,Retrievestart事件应发生在所有数据窗操作之后;另外,在每次Retrieve后,应将处于该数据窗上的Focus移开,以免具有焦点的数据窗的第一行第一列总要显示,故在窗口w_datamon的Timer事件中设置了Setfocus(w_datamon)这条语句。
上一页 [1] [2] [3] [4] [5] 下一页
|