تغییر رنگ و Drill Down در نمودارها
تغییر رنگ و Drill Down در نمودارها
فصل ۳۳ — دستکاری رنگ نمودارها
در Chartهای Application کاربران اغلب میخواهند رنگ Segmentهای Pie Chart یا Barها تغییر کند. تغییر دستی ساده است، اما گاهی Color باید Dynamic باشد. نویسنده نمونهای از گزارش معاملات ارزی شرح میدهد که مشتریان Currencyهای متفاوتی داشتند و ترتیب Record Source باعث میشد مثلاً USD برای یک Customer آبی و برای دیگری قرمز باشد. درخواست کاربران این بود که هر Currency صرفنظر از ترکیب داده، رنگ ثابت خود را داشته باشد.
برای مثال Tableای با Fieldهای Currency (Text) و Val (Number/Double) بسازید و مقادیر زیر را وارد کنید:
| Currency | Value |
|---|
| USD | 1627.89 |
| GBP | 4533.21 |
| EUR | 3445.67 |
| AUD | 3289.45 |
| HKD | 3345.56 |
Table را tblCurrency ذخیره کنید، یک Chart روی Form قرار دهید، tblCurrency را Row Source و Pie Chart را نوع نمودار انتخاب کنید. در Chart Options/Data Labels گزینهٔ Category Name را فعال کنید. در VBE نیز Reference به Microsoft Graph 12.0 Object Library اضافه کنید.
Private Sub Form_Activate()
Dim ch As Graph.Chart, Temp As String, PointCount As Integer
Set ch = Me.Graph0.Object
PointCount = ch.SeriesCollection(1).Points.Count
For n = 1 To PointCount
Select Case ch.SeriesCollection(1).Points(n).DataLabel.Text
Case "USD"
ch.SeriesCollection(1).Points(n).Interior.Color = QBColor(9)
Case "GBP"
ch.SeriesCollection(1).Points(n).Interior.Color = QBColor(10)
Case "EUR"
ch.SeriesCollection(1).Points(n).Interior.Color = QBColor(11)
Case "AUD"
ch.SeriesCollection(1).Points(n).Interior.Color = QBColor(12)
Case "HKD"
ch.SeriesCollection(1).Points(n).Interior.Color = QBColor(13)
End Select
Next n
Set ch = Nothing
End Sub
Chart Object به Graph0 اشاره میکند. Loop تمام Pointهای Series اول را پیمایش میکند؛ هر Point یک Segment Pie یا یک Bar است. Select Case بر اساس DataLabel.Text رنگ Interior را با QBColor تعیین میکند. Currencyها ممکن است موقعیتشان در نمودار عوض شود اما رنگ اختصاصیافته ثابت میماند.
فصل ۳۴ — Drill Down روی نمودارها
نویسنده از Applicationای در Excel یاد میکند که User روی یک Balloon در Chart کلیک میکرد و Chart دیگری جزئیات همان Element را نمایش میداد. در Excel این کار با Class Module و GetChartElement انجام میشد، اما Engine نمودار Access متفاوت است و این Method را ندارد. با API Call و رویکردی جایگزین همچنان میتوان Drill Down ساخت.
همان Table tblCurrency و Pie Chart فصل قبل را بسازید و Reference به Microsoft Graph 12.0 Object Library را اضافه کنید.
در Declarations فرم:
Private Type POINTAPI
x As Long
y As Long
End Type
Private Declare Function GetCursorPos Lib "user32" _
(lpPoint As POINTAPI) As Long
Private Declare Function GetPixel Lib "gdi32" _
(ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Private Declare Function GetWindowDC Lib "user32" (ByVal hwnd As Long) _
As Long
این بخش Type جدید POINTAPI و سه API Call با نامهای GetCursorPos، GetPixel و GetWindowDC را تعریف میکند. در Mouse Down نمودار:
Private Sub Graph0_MouseDown(Button As Integer, Shift As Integer, x As Single, _
y As Single)
Dim cPos As POINTAPI, Temp1 As Long, Temp2 As Long, Pointcount As Integer
Dim ch As Graph.Chart, PCol As Long
Call GetCursorPos(cPos)
Temp = GetWindowDC(0)
Temp1 = cPos.x
Temp2 = cPos.y
PCol = GetPixel(Temp, Temp1, Temp2)
Set ch = Me.Graph0.Object
Pointcount = ch.SeriesCollection(1).Points.Count
For n = 1 To Pointcount
If ch.SeriesCollection(1).Points(n).Interior.Color = PCol Then
MsgBox ch.SeriesCollection(1).Points(n).DataLabel.Text
End If
Next n
End Sub
GetCursorPos مختصات Cursor را بر حسب Pixel میگیرد؛ مختصات x/y خود Mouse Down استفاده نشده چون بر حسب Twip مقیاس میشوند. GetWindowDC Device Context را میگیرد و GetPixel رنگ Pixel زیر Cursor را در PCol قرار میدهد. سپس رنگ هر Point نمودار با PCol مقایسه میشود و در صورت Match، DataLabel آن Segment نمایش داده میشود.
برای ادامهٔ کار میتوان Query موجود در Row Source نمودار را با توجه به Data Label کلیکشده تغییر داد تا جزئیات آن نمایش داده شود؛ یا یک Subform زیر Chart قرار داد تا اجزای تشکیلدهندهٔ Segment را نشان دهد.
صفحهٔ پایانی این بخش در نسخهٔ اصلی عمداً خالی است.