1. 程式人生 > >PB控制元件:Graph圖形控制元件

PB控制元件:Graph圖形控制元件

Graph圖形控制元件

【其他】

型別軸--Category--String型、數值型、Date型、Datetime型和Time值軸--Value--數值型、Date型、Datatime型和Time系列軸--Series--String

圖形外觀
PowerBuilder
提供了17種圖形外觀,可以粗略劃分為平面圖形和立體圖形兩大類,也可以更細緻地劃分為5類,即(1)條型、列型(包括它們的立體變形);(2)區域和線型圖形(包括它們的立體變形);(3)堆積圖;(4)餅型圖(包括立體變形);(5)散點圖。

圖形控制元件的三種使用方式。使用Graph顯示樣式的資料視窗是Graph

型別控制元件最常使用的一種方式,因為這種方式提取資料比較方便,執行時動態改變要檢視的範圍也比較靈活。但是,由於這種使用方式的資料來源只侷限於資料庫,所以當應用程式還需要應用處理其他來源的資料時可以考慮使用視窗中的Graph控制元件。最後一種是在資料視窗中的Graph控制元件,因為這種方式不能自動提取資料,需要編寫的指令碼比較多,所以這種方式使用比較少。但是,因為提取資料都是由指令碼完成,所以開發人員可以有更多的靈活性,可以讓使用者在執行時根據需要更靈活地控制控制元件的執行,所以在高階的應用軟體中該控制元件還是經常使用的。

【屬性】

▲Title屬性:該屆性儲存的是Graph的標題內容,在控制元件的上方顯示的大字標題,是String

型別的屬性。建立Graph控制元件後首先就要修改該屬性,該屬性應該說明圖形中資料的用途、統計範圍等資訊。該屬性可以在執行時修改。比如,修改視窗中Graph控制元件gr_1的標題,可以使用gr_1.title="商品銷量統計";要修改Graph顯示樣式的資料視窗物件的標題,可以使用dw_1.object.gr_1.title="商品銷量統計";如果要修改資料視窗物件中Graph控制元件
gr_1
的標題,可以使用語句dw_1.object.gr_1.title="商品銷量統計"

▲GraphType屬性:指定圖形的外觀型別。該屬性的設定比較直觀,都有相應樣式的圖示,在開發時設定只要在相應的屬性視窗中選擇就可以了。如果在執行時設定,可以用指令碼修改控制元件的屬性取值。對於視窗中的Graph

控制元件使用相應的列舉值,gr_1.GraphType = Pie3D!;對於資料視窗中的控制元件或者Graph顯示祥式的資料視窗使用相應的數值,dw_1.object.gr_1.graphtype= 17

▲Axis.Label屬性:該屬性可以設定不同座標軸的標籤。其中Axis可以是categoryvaluesseries三個。當統計圖的設定需要根據使用者的選擇來確定時,需要在執行時修改座標軸標籤,可以使用該屬性。視窗中的Graph控制元件gr_1
gr_1.category.label = "haha"
gr_1.series.label = "hoho"
gr_1.values.label = "hehe"
資料視窗控制元件對應的資料視窗物件中圖形控制元件
gr_1
dw_1.object.gr_1.category.label = "xaxa"
dw_1.object.gr_1.series.label = "xoxo"
dw_1.object.gr_1.values.label = "xexe"
圖形顯示樣式的資料視窗中圖形gr_1(同上)

▲Legend屬性:當Graph中有系列時該屬性可以控制例圖(legend)是否顯示以及顯示在什麼位置。資料視窗中取值為數字,視窗控制元件中的取值為列舉型。視窗中的Graph控制元件gr_1gr_1.legend = atleft!
資料視窗控制元件對應的資料視窗物件中圖形控制元件gr_1和圖形顯示樣式的資料視窗中圖形
gr_1:
dw_1.object.gr_1.legend = 1

(其他屬性見幫助)

**Graph控制元件的屬性

General屬性頁
▲GraphType
屬性:該屬性用來定義圖形控制元件的外觀。PowerBuilder提供了17種圖形外觀,見前面

▲SeriesSortCategorySort屬性:該屬性確定系列軸和分類軸的排序方式,是列舉型屬性,有三個可用的取值:Ascending!為升序排列,Descending!為降序排列,Unsort!為原始順序。

▲Legend屬性:該屬性用來定義是否顯示例圖以及顯示在什麼位置。可用的取值有atbottom!(底部),attop!(上面),atleft!(左面),atright!(右面)和nolegend!(不顯示)。

▲Perspective屬性:該屬性用來確定圖形和視窗之間的距離,只適用於三維圖形。 通過拖動滑塊可以調整該屬性取值的大小,滑塊拖動的同時就可以看見效果。

▲Elevation屬性:該屬性用來調整三維圖形的視角,只適用於三維圖形。拖動屬性視窗中該屬性的滑塊向左移動時圖形順時針旋轉,向右移動時圖形做逆時針旋轉。

▲Rotation屬性:該屬性在水平角度旋轉圖形,只適用於三維圖形。該屬性和上面的Elevation屬性相配合,可以給使用者最佳的觀看角度。當然,在程式執行時允許使用者修改這兩個屬性是最好的。

▲OverLapPercent屬性:該屬性確定圖形的各個系列的重疊程度,以百分比的形式表示,該屬性適用於平面圖和列型圖。在屬性視窗中可以通過調節滑塊來調整屬性的取值。

▲Spacing屬性:該屬性用來確定分類軸上資料條或列之間的距離大小,以佔用條或者列寬度的百分比表示。該屬性不能用於平面區域圖、平面線型圖、平面餅圖和散點圖。例如,gr_1.Spacing=110表示資料條之間的距離為條本身寬度的110%

▲Depth屬性:該屬性用來調整三維圖形的厚度,只適用於三維圖形。

Axis屬性頁
▲Axis
下拉框:該下拉框用來選擇要設定屬性的座標軸,可以選擇的值有CategoryValues,當圖形外觀為三維並且有系列軸時還可以選擇Series。進入到Axis屬性頁時首先就應該明確該下拉框的取值。選擇不同的軸,該屬性頁中的屬性即為選定軸對應的屬性。當在指令碼中修改圖形控制元件的外觀時,也應該指定是對哪個座標軸的屬性進行操作。語句格式是:Graphcontrolname.axisname.property=屬性值。其中,axisname的值和該下拉框的可用值相同,property為座標軸的屬性。

▲Label屬性:該屬性用來定義Axis下拉框中選中的座標軸的標籤。上面已經介紹過如何在指令碼中修改該屬性,在開發環境中可以直接輸入標籤的內容。

▲ShareBackEdge屬性:布林型別屬性,該屬性用來指定三維圖形是否有背景陰影。該屬性預設為True,表示背景有陰影。

▲AutoScale屬性:布林型別的屬性,表示是否自動根據新增的資料值確定軸上顯示的資料的刻度,即是否自動確定資料的最大值和最小值。並不是對所有型別的圖形外觀都可以修改該屬性的,絕大多數的圖形外觀中該屬性都為True並且不允許為False,只有散點圖可以修改該屬性為False或者為True

▲DataType屬性:該屬性用來確定在座標軸上顯示的資料的型別。不同的座標軸可以使用的資料型別不同,在前面已經做過詳細的介紹。在開發環境中通過選擇可以指定座標軸的資料型別。

▲RoundToRoundToUnit屬性:這兩個屬性確定在AutoScale屬性選中時軸上刻度的最大值和單位。當座標軸變數的取值大於RoundTo屬性的取值時,該座標軸的最大刻度自動調整增加RoundTo的整數倍。比如,RoundTo取值為15,而座標軸變數取值為18,則自動將該軸的最大刻度調整為30;如果座標軸的最大取值為31,則座標軸自動調整最大刻度為45。當座標軸變數的最大取值都小於RoundTo屬性值時,則座標軸的最大刻度為RoundTo的取值。該屬性的設定要和座標軸的資料型別相匹配。RoundToDouble型別,RoundToUnit是列舉型別,它的取值範圍取決於座標軸的資料型別,座標軸的每種資料型別都對應一些可用的RoundToUnit取值。比如,當座標軸的DataType屬性為AdtDate!時,RoundToUnit的取值可以為rndDefault!rndyears!rndMonths!rndDays!等。

▲MinimumValueMaximunValue屬性:當AutoScale屬性為False時該屬性可用,同時RoundToRoundToUnit屬性不可用。所以只有散點圖中可以使用該屬性,該屬性用來設定座標軸的最大值和最小值。

▲ScaleType屬性:該屬性設定刻度的型別。通常的刻度型別是線型的,但有時也許需要對數型別的刻度。該屬性的三個可用值是Linear!Log10!Loge!

設定主刻度線:座標軸的刻度線可以進行二級劃分,即主刻度線和次刻度線,這樣讀取資料更方便、快捷。主刻度線的設定需要一組屬性,包括主刻度線的個數(Major Divisions),刻度線的型別(MajorTic屬性,可用的取值有4個:Outside!表示向外,Inside!表示向內,Straddle!表示交叉和Notic!表示沒有刻度線),是否顯示主刻度線網格線(MajorGridLine屬性,有6個可用的值,可以直接在下拉框中選擇需要的型別),每組幾個刻度顯示標籤(DisplayEveryNLabels屬性)等。

設定次刻度線:次刻度線的許多屬性和主刻度線的類似,包括次刻度線的個數(MinorDivisions屬性),次刻度線的型別(MinorTic)和是否顯示次刻度網格線(MinorGridLine)等。

線條風格:用來指定主軸線(PrimaryLine屬性)、輔助軸線(SecondaryLine屬性)、0值線(OriginalLine)和框架線(Frame)等的線段型別。可以使用的型別有Continuous!Dash!Dot!DashDot!DashDotDot!Transparent!

Text屬性頁該屬性頁中設定控制元件各個部分顯示的文字內容和文字的顯示方式。文字的這些顯示屬性是通過grDispAttr物件來定義的,可以在PB提供的工具Browser視窗中檢視該物件的詳細屬性。在指令碼中需要引用這些屬性時可以使用如下格式:
GraphControlName.AxisName.grDispAttrName.Property
其中的Property可以從Browser視窗中查得,其他表示相應的屬性。比如,要修改Graph控制元件gr_1Series座標軸的字型顯示屬性為Italic,可以使用下面的語句:
gr_1.Series.DispAttr.Italic=True

▲TextObject下拉框:在圖形控制元件中有很多的文字物件,在設定屬性之前應該首先指定需要設定哪些文字物件的屬性,該下拉框中就是要選擇設定屬性的文字物件。各個取值的含義如下:
Title 
圖形控制元件的標題
Value Axis Label 
資料軸的標籤
Legend 
例圖
Value Axis Text 
資料軸的文字
Category Axis Label 
分類軸的標籤
Series Axis Label 
系列軸的標籤
Category Axis Text 
分類軸的文字
Series Axis Text 
系列軸的文字

▲DisplayExpression屬性:該屬性確定文字物件的顯示內容,單擊右側的省略號按鈕彈出編輯視窗,在編輯視窗中可以編輯表示式。表示式中可以使用運算子以及系統為Graph控制元件提供的一些預設變數,這些都可以在編輯視窗中通過選擇來組合表示式。

▲Escapement屬性:該屬性用來旋轉文字物件的顯示方向(對於標題和例圖不可用)。例如,在TextObject下拉框中選擇Category Axis Label文字時,然後在Escapement屬性框中輸入900,則文字物件逆時針旋轉了90度,變成了垂直顯示。在指令碼中需要控制文字物件的旋轉角度,可以用指令碼修改相關物件的Escapement屬性。比如修改gr_1的分類軸上標籤顯示方向:gr_1.Category.LabelDispAttr.Escapement=1800

資料視窗中的圖形控制元件和Graph顯示樣式的資料視窗物件的屬性這兩種情況下的圖形實際上是相同的,都是圖形控制元件,並且都可以為圖形命名,使用該名稱引用圖形控制元件。下面的介紹中對這兩種情況不加以區分。

▲Data屬性頁該屬性頁用來設定Graph控制元件最重要的幾個屬性,即圖形控制元件的資料來源。CategoryValueSeries分別用來設定幾個軸的資料來源,可以直接選擇其中的欄位或者表示式,也可以手工輸入,資料視窗物件中的很多表達式在這裡都可以直接使用。比如,可以定義Day(RegDate)Series的資料來源,其中RegDate是一個Date型別的欄位,Day是一個提取日期的函式。對於初學者如果不能確定表示式是否正確,一個好的方法是將表示式首先在資料視窗物件的計算欄位表示式視窗中進行校驗,如果通過則可以使用。使用表示式可以更方便、精確地控制圖形的顯示。資料視窗中的Graph控制元件可以選擇顯示資料的範圍為pageall,而Graph顯示樣式的資料視窗只能選擇all,即所有的資料。

▲General屬性頁該屬性頁中設定常用的屬性,Graph顯示樣式的資料視窗有該屬性頁,實際上該屬性頁和其他顯示樣式的資料視窗區別不大,只是增加了NameLine ColorShadeColor三個屬性,這三個屬性分別用來設定圖形控制元件的名稱、線條的顏色和陰影的顏色,其他屬性參見前面關於資料視窗物件的介紹。

▲Graph屬性頁該屬性頁設定圖形的外觀,很多屬性都和視窗中的Graph控制元件在General屬性頁中的同名屬性含義是相同的,在此不再贅述。

【函式】

Graph控制元件函式

★AddCategory函式:函式的語法是controlname.AddCategory(categoryname),作用是新增一個分類軸。只有當分類軸的資料型別為string時可以使用該函式。函式執行成功返回新新增分類軸的索引號,如果已經有同名的分類軸存在則返回同名分類軸的索引號。當原分類軸設定了排序屬性,則新新增的分類軸按照原規則自動調整到適當的位置。函式執行錯誤返回-1。當需要在指定的位置新增分類軸時可以使用InsertCategory函式,當需要新增非string型別的分類袖時使用InsertCategory函式。例如,gr_1.addcatagory("pcs")的作是向圖形控制元件中新增一個名稱為pcs的分類軸。

★AddSeries函式:函式的語法是controlname.AddSeries(seriesname),作用是向圖形控制元件controlname中新增名稱為seriesname的系列軸。其中,seriesnamestring型別的引數,是要新增的系列軸的名稱。函式執行成功返回新新增的系列軸的索引號,如果已經有同名系列軸存在,則返回同名系列軸的索引號。函式執行錯誤返回-l。當需要新增其他型別的系列軸時使用InsertSeries函式。例如,向圖形控制元件gr_1中新增一個名稱為costs的系列軸,並儲存它的索引號,可以使用語句:ls_s = gr_1.addseries("costs")

★AddData函式:作用是向圖形控制元件的資料軸新增資料,該函式有兩種語法格式。controlname.AddData(seriesnumber,datavalue {,categoryvalue})用於除了散點圖之外的所有形式的圖形控制元件,而controlname.AddData(seriesnumber,xvalue,yvalue)專門用於散點圖。第一種語法格式時,將資料新增到指定系列軸的指定分類軸上(如果指定了分類軸)或者最後一個分類軸上(沒有指定分類軸);當指定的分類軸不存在時則直接建立該分類軸,並按照原來分類軸的排序規則直接將該分類軸調整到適當的位置,然後將資料新增到相應的位置;如果指定的分類軸已經存在則資料將替換原來的資料。第二種語法格式時,xvalueyvalue分別為要新增的XY軸資料的大小,新增的位置由引數seriesnumber確定。這兩種格式的函式,不管哪種都經常和函式FindSeries搭配使用,除非只有數量確定的系列軸。

★SetDataStyle函式:該函式有三種語法格式,分別用來設定圖形控制元件的顏色,線型和填充方式等。語法如下:
controlname.SetDataStyle(seriesnumber,datapointnumber,colortype,color)
controlname.SetDataStyle(seriesnumber,datapointnumber,linestyle,linewidth)
controlname.SetDataStyle(seriesnumber,datapointnumber,enumvalue)
其中controlnameGraph控制元件的名稱。各個引數的含義如下:
seriesnumber
integer型別,是要設定的資料所在系列的索引號
datapointnumber
integer型別,是要設定的資料所在資料點的索引號(也可以理解成是category的索引號)
colortype
GrcolorType列舉型別,用來指定要設定資料哪方面的顏色。可用的取值有Foreground!(文字顏色),Background!(背景顏色),LineColor!(線段的顏色)和Shade!(陰影的顏色,只適用於三維圖形)
color
long型別,為colortype的新顏色。經常使用GRB函式來計算顏色,也可以按65536*Blue + 256*Green + Red的公式自己來計算顏色的取值
linestyle
LineStyle列舉型別,用來指定線段的型別。可用的取值有Continuous!Dash!DashDot!DashDotDot!Dot!Transparent!
linewidth
integer型別,是用象素數量來表示的線段的寬度

enumvalue
:列舉型別,用來設定資料點的填充方式或者符號型別,系統會根據引數的取值自動識別是設定填充方式還是符號型別。當設定填充方式時的可用值有Bdiagonal!Diamond!Fdiagonal!Horizontal!Solid!Square!Vertical!
三種語法格式中前面的兩個引數都相同。如果想要將經過顏色設定的資料點恢復到預設的顏色,可以使用函式gr_1.ResetDataColors(seriesnumber,datapointnumber)

★SetDataPieExplore函式:該函式是一個非常有用的函式,可以使餅型圖中某部分的圖形分離出來,在進行資料分析時經常使用該函式進行強調顯示。該函式只適用於餅型圖,語法是:controlname.SetDataPieExplode(serisnumber,datapoint,percentage),其中,引數percentage表示分離的餅塊離開餅型圖中心的距離佔餅型圖半徑的百分比,取值範圍為0-100,可以為小數。函式執行成功返回1,執行失敗返回-1,如果引數為NULL,則返回NULL。經常在圖形控制元件的DoubleClicked事件中呼叫該函式和函式ObjectAtPointer配合。使使用者雙擊部分分離顯示。如:
integer li_series,li_datapoint
grobjecttype lgobt_clicked
if this.graphtype <> piegraph! and this.graphtype <> pie3d! thenreturn
lgobt_clicked = this.objectatpointer(li_series,li_datapoint)
if (li_series > 0 and li_datapoint > 0) then
this.setdatapieexplode(li_series,li_datapoint,50)
end if
和該函式相關的函式是GetDataPieExplode,它的作用是檢視某個餅塊是否從餅型圖中分離出來,並且得到分離出來的餅塊的百分比。函式的語法是:controlname.GetDataPieExplode(series,datapoint.percentage)

★SetSeriesStyle函式:該函式有四種語法格式,分別用來設定系列軸的顏色、線型、填充方式與是否重疊等。語法如下:
controlname.SetSeriesStyle(seriesname,colortype,color)
controlname.SetSeriesStyle(seriesname,linestyle,linewidth)
controlname,SetSeriesStyle(seriesname,enumvalue)
其中,引數seriesnamestring型別的系列軸的名稱,其他引數的意義和函式SetDataStyle中的同名引數是相同的。該函式經常和SeriesName函式配合使用,來讀取已知索引號的系列軸的名稱,然後再呼叫該函式設定其風格。如,下面的指令碼用來改變使用者點選處的系列軸的填充方式:
string ls_seriesname
integer li_seriesnbr,li_seriespoint
grobjecttype lgobt_mousehit
lgobt_mousehit = this.objectatpointer(li_seriesnbr,li_seriespoint) //
獲取使用者點選資訊
if lgobt_mousehit = typeseries! then //
如果點選的是系列軸
ls_seriesname = gr_1.seriesname(li_seriesnbr) //
獲取點選的系列軸的名稱
this.setseriesstyle(ls_seriesname,horizontal!) //
設定系列軸的填充方式
end if
上面的函式可以允許應用程式在執行時讓使用者根據自己的偏愛來修改圖形控制元件的外觀,另外還應該讓使用者選擇他所偏愛的圖形型別。這可以通過改變控制元件的graphtype屬性來實現,可以構建下拉列表拒和下拉圖形列表框等很多方式,讓使用者來選擇圖形控制元件的外觀。

其他函式(具體語法見幫助)
FindaCategory 
查詢特定標籤內容的分類軸的索引號
FindSeries 
查詢特定標籤內容的系列軸的索引號
GetData 
獲取指定系列、資料點處的資料
GetDataPieExplode
獲取餅圖分離的比例
GetDataStyle 
獲取資料點的外觀屬性,具體語法取決於要獲取哪方面的屬性
GetDataValue 
獲取指定系列軸、指定資料點的資料
GetSeriesStyle 
獲取系列軸的外觀屬性,具體語法取決於要獲取哪方面的屬性
ImportClipBoard 
將剪貼簿上的資料插入到圖形控制元件中
ImportFile 
從指定的檔案中輸入資料到圖形控制元件中
ImportString 
從指定的字串中輸入資料到圖形控制元件中
ModifyData 
修改指定系列軸、指定資料點的資料,有兩種語法格式
SaveAs 
按照指定的格式儲存圖形控制元件中的資料
SeriesCount 
計算圖形控制元件中系列的數目
SeriesName 
獲取指定索引號的序列的名稱
CategoryCount 
計算圖形控制元件中分類軸的數目
CategoryName 
獲取指定索引號的分類軸的名稱
DataCount 
計算指定系列軸上資料點的數目
DeleteCategory 
刪除指定的分類軸
DeleteData 
刪除指定系列軸上的指定的資料點
DeleteSeries 
刪除指定的系列軸
ObjectAtPointer 
獲取使用者滑鼠點選處控制元件的相關資訊
★ObjectAtPointer
函式是一個非常重要的函式,經常在圖形控制元件的Clicked事件或者DoubleClicked事件中用該函式獲取使用者滑鼠點選處控制元件的相關資訊,進而判斷是否選擇了圖形控制元件的特定部件,從而決定是否繼續執行其他指令碼。該函式是一個比較重要的函式,應該加以掌握。函式語法是:
controlname.objectAtPointer({Graphcontrol,}seriesnumber,datapoint)
其中,controlname是圖形控制元件的名稱,通常在圖形控制元件的相關事件中編寫指令碼時可以使用
This
指代詞或者省略;當該函式用於資料視窗時引數Graphcontrol為資料視窗物件中的圖形控制元件名稱,這時controlname為資料視窗控制元件的名稱。另外兩個引數都是用來儲存相關資訊的,其中seriesnumber儲存滑鼠點選的系列軸的索引號,datapoint用來儲存滑鼠點選處的資料點的一個integer型別的引數。函式返回值為grObjectType型別的列舉值,用來指明使用者所點選的是圖形控制元件的哪一部分。經常對該函式的返回值進行判斷,看使用者是否選擇了控制元件的特定部分。返回值有如下取值:
TypeCategory! 
分類的標籤
TypeLegend! 
在例圖框中,但不在系列標籤上
TypeCategoryAxis!
分類軸或者標籤間
TypeSeries! 
聯結系列的資料點的線(當圖形為線型時),或者是例圖框內的系列標籤
TypeCategoryLabel!
分類軸的標籤
TypeSeriesAxis! 
三維圖形的系列軸
TypeData! 
資料點或者其他資料標記
TypeSeriesLabel!
三維圖形系列軸的標籤
TypeGraph! 
圖形控制元件內不是另一個grObjectType的任何位置
TypeTitle! 
圖形的標題
TypeValueAxis! 
包括指標籤的值軸
TypeValueLabel! 
值軸的標籤


**
資料視窗中的Graph控制元件

如何在程式執行時控制資料宙口中的圖形控什,使其外觀、資料顯示等都符合使用者的要求,這些情況和視窗中的圖形控制元件是類似的。因為資料視窗中的圖形控制元件可以自動提取資料,所以大部分工作是修改控制元件的圖形外觀以及如何獲取圖形控制元件中的相關資訊。視窗中圖形控制元件的很多函式也可以使用,語法稍微有些區別,一般都比其多一個引數用來指定圖形控制元件的名稱,並且這個引數是第一個引數。比如,獲取使用者在資料視窗中圖形控制元件上點選的資訊,可以使用如下語法格式的ObjectAtPointer函式:
controlname.objectatpointer(graphcontrol,seriesnumber,datapoint)
而在視窗中的語法格式如下:
controlname.objectatpointer(seriesnumber,datapoint)
其中,引數Graphcontrolstring型別的引數,為資料視窗中的圖形控制元件的名稱。函式執行後的返回值和視窗中Graph控制元件的同名函式的返回值相同。


**
*
datastore lds_data
integer li_i
integer li_amount
string ls_name,ls_date
integer li_sno

lds_data = create datastore
lds_data.dataobject = "d_sale"
lds_data.settransobject(sqlca)
if lds_data.retrieve() <= 0 then return

for li_i = 1 to lds_data.rowcount()
li_amount = lds_data.getitemnumber(li_i,"amount")
ls_date =string(month(date(lds_data.getitemdatetime(li_i,"saledate"))))
ls_name = lds_data.getitemstring(li_i,"name")

li_sno = gr_1.findseries(ls_name)
if li_sno <= 0 then
li_sno = gr_1.addseries(ls_name)
end if
gr_1.adddata(li_sno,li_amount,ls_date)
next
*grobjecttype lgot_obj
integer li_series,li_po

lgot_obj = gr_1.objectatpointer(li_series,li_po)

if lgot_obj = typedata! then
st_1.text = string(this.getdata(li_series,li_po))
st_1.x = parent.pointerx()
st_1.y = parent.pointery()
st_1.visible = true
end if