国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

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

2024-07-21 02:10:02
字體:
來源:轉載
供稿:網友

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:[email protected])

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


 


 




 


 



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:[email protected])

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


 


 




 


 



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:[email protected],qq:21417511。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 金昌市| 明溪县| 鞍山市| 昌乐县| 沙河市| 张北县| 临西县| 建平县| 安平县| 通州市| 仁布县| 滕州市| 旺苍县| 裕民县| 商南县| 金华市| 济阳县| 上犹县| 罗源县| 壶关县| 梧州市| 鲁山县| 兴隆县| 固阳县| 隆林| 新乡县| 赤城县| 通河县| 云南省| 布尔津县| 新田县| 楚雄市| 丹阳市| 汾西县| 陈巴尔虎旗| 华阴市| 九龙坡区| 浮梁县| 全州县| 城固县| 宝鸡市|