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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章