當前位置:開發者網絡 >> 技術教程 >> 數據庫專欄 >> 其他相關 >> 內容
精彩推薦
分類最新教程
分類熱點教程
    
ActiveBar在PB中動態生成Outlook框架的應用
作者:未知
日期:2005-04-29
人氣:
投稿:(轉貼)
來源:未知
字體:
收藏:加入瀏覽器收藏
以下正文:

ActiveBar在PB中動態生成Outlook框架的應用







By …---…  (QQ:21417511)








 


 



一、ActiveBar簡介:

在VB、VC或者Delphi程序員看來,ActiveBar是一款設計用戶界面必不可少的ActiveX控件。使用它可以製作出像Word一樣的個性化菜單、“自定義”對話框;像Outlook的快捷按鈕欄;像CorelDRAW的入塢式窗口;像Delphi的控件選擇頁面。並且ActiveBar使用十分簡單,保存設計圖和加載設計圖都十分簡單,只用幾個方法即可。


 


 



二、ActiveBar在PB中的應用

       很早就有大俠寫了《ActiveBar控件在PowerBuilder中的應用》的文章,類似的介紹我就不多說了,沒有看過該文章的可以用Google找一下來看看。我著重介紹一下如何用ActiveBar動態生成Outlook框架。


 


 



1、  首先,我們要對ActiveBar的對象及其關係有個大體的瞭解,如下圖所示:







2、  接下來,我們來探討一下如何用ActiveBar做Outlook框架。

先創建一個custom visual userobject,裡面添置ActiveBar OLE控件ole_1,保存成:u_ActiveBar。這樣做的好處是將ActiveBar控件封裝成userobject,方便以後的調用。當然,我還喜歡在這個userobject上放一個statictext st_1,Text是:ActiveBar,這樣我以後調用時就能一目瞭然啦:) userobject的construct代碼如下:

st_1.hide( )

ole_1.x = 0

ole_1.y = 0

this.x = 0

this.y = 0

ole_1.width = this.width

ole_1.height = this.height

目的是讓ole自動放置到調用窗口的左上方,並且隱藏掉st_1。


 


 



ActiveBar提供了大量的屬性和方法,我們把這些屬性與方法轉換到u_ActiveBar中,以便以後直接調用。

下面,我們開始擴展u_ActiveBar。先把ActiveBar中常量定義到instance變量,這樣就省得每次找幫助來看1、2、3…對應的含義啦,舉例如下:

//CaptionPostion

Int   ddCPStandard                            = 0 , &

        ddCPLeft                                   = 1 , &

        ddCPRight                                 = 2 , &

        ddCPAbove                                = 3 , &

        ddCPBelow                                = 4 , &

        ddCPCenter                               = 5

//ChildBandFont3D

int     dd3DNone                                  = 0 , &

        dd3DRaisedLight                         = 1 , &

        dd3DRaisedHeavy                       = 2 , &

        dd3DInsetLight                           = 3 , &

        dd3DInsetHeavy                          = 4 


 


 



在PB中,對於ActiveBar的對象band及tool一律視為oleobject。例如我們要寫一個函數,目的是讓ActiveBar可以動態增加一個Band,我們可以在u_ActiveBar中創建如下函數:

/*------------------------------------------------------------------------------


 


 



 Function:                     public u_ActiveBar.uf_Addband


 


 



 Returns:         OLEObject


 


 



 Parameters:      value String name

                  value String caption

                  value Integer dockingarea

                  value Integer grabhandlestyle


 


 



 Description:         


 


 



--------------------------------------------------------------------------------

 2005-04-12    2.0.0              Initial version by cuixuf (Mail:cuixuf@chinarapid.com)

------------------------------------------------------------------------------*/


 


 




 


 



oleobject   lobj_band

lobj_band = create oleobject


 


 




 


 



lobj_band = ole_1.object.Bands.Add(name)

lobj_band.Caption = caption

lobj_band.ChildBandStyle = ddCBSSlidingTabs

lobj_band.DockingArea = DockingArea  

lobj_band.GrabHandleStyle = GrabHandleStyle


 


 



return lobj_band


 


 



類似的,我們可以通過userobject的函數把ActiveBar需要用到的方法和屬性集成到一起,在這裡我就不多說了。大家可以看一下我做的u_ActiveBar,我集成了一些函數,但沒有做全,如有人有興趣的話,可以幫我補全,只是不要忘了發給我一份哦。


 


 



不過,不要開心得太早,我們用ActiveBar時可能最頭痛的地方就是在動態生成tool時調用setpicture方法。ActiveBar中的幫助是這麼寫的:

[form!]Tool.SetPicture Index As ImageTypes, picture As Picture, [ color As Color ]

PB中是沒有Picture類型的,用Blob取文件內容再賦值經過測試也不行,但是我們可以想到VB中有種數據類型就是PICTURE,只好曲線救國,利用VB寫個OCX返回PICTURE類型讓PB調用。VB中的OCX寫法也很簡單,如下:

Public Function getPict (ByVal strFileName As String) As Object

    Dim X As Picture

    Set X = LoadPict (strFileName)

    Set getPicture = X

End Function

生成OCX後,註冊,並添加此OLE到u_ActiveBar中,名稱為ole_2,設為Invisible。u_ActiveBar中uf_addtool函數示例如下:

/*------------------------------------------------------------------------------


 


 



 Function:                     public u_ActiveBar.uf_Addtool


 


 



 Returns:         OLEObject


 


 



 Parameters:      value Integer id

                  value String name

                  value String caption

                  value Integer cposition

                  value String category

                  value Integer controltype

                  value String picture

                  value Integer toolstyle

                  value String tagvariant


 


 



 Description:         


 


 



--------------------------------------------------------------------------------

 2005-04-12    2.0.0              Initial version by cuixuf (Mail:cuixuf@chinarapid.com)

------------------------------------------------------------------------------*/


 


 




 


 



oleobject lobj_tool

lobj_tool = create oleobject

lobj_Tool = ole_1.object.Tools.Add(id, name)

lobj_tool.Caption = caption

lobj_tool.CaptionPosition = cposition

lobj_tool.Category = category

lobj_tool.ControlType = controltype

lobj_tool.Style = toolstyle

lobj_tool.tagVariant = tagvariant


 


 



oleobject lobj_pic

lobj_pic = ole_2.object.getpict(picture)

lobj_tool.SetPicture(ddITNormal, lobj_pic )


 


 



return lobj_tool


 


 



OK,我們做完u_ActiveBar後,現在開始來使用它了。我們做一個用ActiveBar設計器做一個frame.tb2,只有一個status的band,其它的都不做,我們進行動態創建其它的對象。

在w_frame的OPEN事件裡寫如下代碼:

string              ls_level1[]={"測試1","測試2","測試3"}, &

                      ls_level2_1[] = {"恭喜發財","萬事如意","心想事成"}, &

                      ls_level2_2[] = {"Hello","World","My God"}, &

                      ls_level2_3[] = {"嘻嘻","哈哈","關於"}

long                i, &

                      j

Oleobject        lobj_band, &

                      lobj_childband, &

                      lobj_tool

                     

ii_UniqueID = -1                  

//狀態欄

uo_1.uf_load('',"frame.tb2",1 )      

uo_1.uf_setstatuscaption( "Status", "designer", "...---... QQ:21417511" )

uo_1.uf_setstatuscaption( "Status", "operater", "用戶: cuixuf")

//Outlook

lobj_band = uo_1.uf_addband( "Outlook", "工具欄", ddDALeft, ddGSNone)

uo_1.uf_setfont3d( lobj_band, dd3DInsetLight )

lobj_band.childbands.backcolor = rgb(58,110,165)

lobj_band.childbands.childbandBackGroundStyle = 0           //0:normal,1:gradient,2:picture

lobj_band.childbands.ChildbandCaptionAlignment = 1          //0:left,1:center,2:right

lobj_band.childbands.ForeColor = rgb(0,0,0)

lobj_band.childbands.ToolForeColor = rgb(255,255,255)

uo_1.uf_removeflag( lobj_band, ddBFDockTop)

uo_1.uf_removeflag( lobj_band, ddBFDockBottom)

uo_1.uf_removeflag( lobj_band, ddBFDockRight)

uo_1.uf_removeflag( lobj_band, ddBFFloat)

uo_1.uf_removeflag( lobj_band, ddBFCustomize)

uo_1.uf_removeflag( lobj_band, ddBFHide)  


 


 



//Add tool

for i = 1 to Upperbound(ls_level1)

lobj_childband = uo_1.uf_addchildband( lobj_band, ls_level1[i], ls_level1[i] )

choose case i

        case 1

               for j = 1 to UpperBound(ls_level2_1)

//                           uo_1.uf_addtool( /*integer id*/, /*string name*/, /*string caption*/, /*integer cposition*/, /*string category*/, /*integer controltype*/, /*string picture*/, /*integer toolstyle*/, /*string tagvariant */)

                      lobj_tool = uo_1.uf_addtool( wf_getuniqueID(ii_UniqueID), ls_level2_1[j], ls_level2_1[j], ddCPBelow, ls_level1[i], ddTTButton, "find.ico", ddSIconText, ls_level2_1[j])

                      uo_1.uf_inserttool( lobj_childband, ii_UniqueID )

               next

        case 2

               for j = 1 to UpperBound(ls_level2_2)

                      lobj_tool = uo_1.uf_addtool( wf_getuniqueID(ii_UniqueID), ls_level2_2[j], ls_level2_2[j], ddCPBelow, ls_level1[j], ddTTButton, "find.ico", ddSIconText, ls_level2_2[j])

                      uo_1.uf_inserttool( lobj_childband, ii_UniqueID )

               next

        case 3

               for j = 1 to UpperBound(ls_level2_3)

                      lobj_tool = uo_1.uf_addtool( wf_getuniqueID(ii_UniqueID), ls_level2_3[j], ls_level2_3[j], ddCPBelow, ls_level1[j], ddTTButton, "find.ico", ddSIconText, ls_level2_3[j])

                      uo_1.uf_inserttool( lobj_childband, ii_UniqueID )

               next

        case else

end choose

next


 


 



//Resize u_ActiveBar

uo_1.uf_resize( this.workspacewidth( ) - 10 , this.workspaceheight( )  , mdi_1 )

uo_1.uf_resize( this.workspacewidth( )  , this.workspaceheight( )  , mdi_1 )

為了在w_frame變化窗口大小時ActiveBar及MDI窗口能隨之變化,w_frame的RESIZE事件中寫:uo_1.uf_resize( newwidth,newheight,mdi_1)


 


 



接下來,我們可以寫一個函數f_menu,放在ActiveBar的toolclick事件裡,我封裝在u_ActiveBar的ue_toolclick上,根據ActiveBar的tool tag來進行不同的工作。


 


 



這樣,一個用ACTIVEBAR動態創建Outlook的小例子就差不多完工了。我們在實際應用中,可以在數據庫中建表存儲MENU對應的模塊ID號、模塊名稱、窗口名稱、ICON圖標等等信息,結合動態生成MENU的方法(關於動態生成MENU,可以參照汽球的BLOG,嘻嘻),用戶通過自己的權限將獲得不同的模塊,從而動態生成屬於不同用戶的Outlook框架。


 


 



這是我第一次寫東東,要特別感謝楊小寶做的取Picture字段的OCX。另外,如果有說得不清楚的地方或者需要討論的事宜,請與我聯繫:) MAIL:cuixuf@sina.com,QQ:21417511。
相關文章: