هدف ساخت نشاندهنده پیشرفت با گرادیان رنگی است:
جدول:
intable.png
فرم پیوسته:
informcont.png
فرم دیتاشیت:
informds.png
آپدیت:
پیشنهاد میکنم روش محاسبه و ساخت پیشنهادی جناب آقای بهرامی (پست شماره 12) رو حتما بخونین.
هدف ساخت نشاندهنده پیشرفت با گرادیان رنگی است:
جدول:
intable.png
فرم پیوسته:
informcont.png
فرم دیتاشیت:
informds.png
آپدیت:
پیشنهاد میکنم روش محاسبه و ساخت پیشنهادی جناب آقای بهرامی (پست شماره 12) رو حتما بخونین.
آخرین ویرایش به وسیله mazoolagh : چهارشنبه 16 اسفند 1402 در 20:11 عصر
اول باید یک مبنای رنگی طراحی کنیم.
در این آموزش اینجور قرارداد میکنیم که نشاندهده از:
رنگ قرمز برای 0% شروع و در 30% به نارنجی میرسه،
و بعد تا 70% به رنگ زرد و در پایان در 100% به رنگ سبز میرسه،
و در بین این مقادیر رنگ باید از بین طیف ها محاسبه بشه.
برای داشتن یک ایده تصویری این گرادیان رو به صورت html میبینیم:
با استفاده از اسم رنگ
background: linear-gradient(to right, RED0%, DARKORANGE30%, YELLOW , GREEN100%);
css0.png
یا کد رنگ
background: linear-gradient(to right, #FF00000%, #FF800030%, #FFFF00 , #008000100%);
css1.png
که به صورت زیر دیده میشه:
html.png
حالا باید یک تابع بنویسیم که (اسم اون رو Color گذاشتیم) که با گرفتن:
مولفه های RGB رنگ آغاز و پایان طیف،
و تعداد تقسیم بندی طیف،
و اندیس موقعیت در طیف،
کد رنگ متناظر رو به صورت یک string برگردونه.
در این آموزش ما محدوده مقادیر رو به 0 تا 100 محدود کردیم،
و برای این محدوده 50 گام در نظر گرفته ایم (در عمل زیاد هست و اندازه اندیکاتور رو بزرگ میکنه - حداکثر 20 گام کافی هست).
بعنوان مثال:
برای مقدار 20 که در محدوده 0 تا 30 (قرمز تا نارنجی) قرار داره باید مولفه های این دو رنگ،
همراه با تعداد بخش ها که 15 هست (100 واحد در 50 گام)،
و اندیس 10 (20 تقسیم بر اندازه هر بخش که همون 2 هست) رو به تابع بدیم،
و تابع یک مقدار رنگ که برابر 10مین رنگ از طیف 15 رنگ بین قرمز و نارنجی رو برگردونه.
برای سادگی ، درونیابی ریاضی انجام میدیم که با درونیابی واقعی رنگ (که برنامه هایی مثل فوتوشاپ یا مرورگرها انجام میدن) تفاوت داره،
ولی نتیجه به اندازه کافی رضایتبخش هست!
برای این تابع، باید یک تابع دیگه بنویسیم (به اسم RGB2Hex)
که با گرفتن مولفه های رنگ،
کد HEX رنگ رو برگردونه تا بتونیم در فیلد rtf از اون استفاده کنیم:
Public Function RGB2Hex( _
R As Integer, _
G As Integer, _
B As Integer _
) As String
RGB2Hex = "#" & Right("0" & Hex$(R), 2) & _
Right("0" & Hex$(G), 2) & _
Right("0" & Hex$(B), 2)
End Function
Public Function Color( _
R1 As Integer, _
G1 As Integer, _
B1 As Integer, _
R2 As Integer, _
G2 As Integer, _
B2 As Integer, _
steps As Integer, _
index As Integer _
) As String
Dim R As Integer
Dim G As Integer
Dim B As Integer
R = R1 + (index - 1) * (R2 - R1) / (steps - 1)
G = G1 + (index - 1) * (G2 - G1) / (steps - 1)
B = B1 + (index - 1) * (B2 - B1) / (steps - 1)
Color = RGB2Hex(R, G, B)
End Function
حالا میتونیم خیلی راحت تابعی رو بنویسیم (به اسم GetColor)
که با گرفتن اندیس (در محدوده تعداد بخش ها که در این آموزش بین 1 تا 50 هست)،
کد رنگ متناظر رو برگردونه:
Public Function GetColor(index As Integer) As String
Select Case index
Case 1 To 15 ' FROM RED=(255,0,0) TO DARKORANGE=(255,128,0)
GetColor = Color(R1:=255, G1:=0, B1:=0, R2:=255, G2:=128, B2:=0, steps:=15, index:=index)
Case 16 To 35 ' FROM DARKORANGE=(255,128,0) TO YELLOW=(255,255,0)
GetColor = Color(R1:=255, G1:=128, B1:=0, R2:=255, G2:=255, B2:=0, steps:=20, index:=index - 15)
Case Else ' 36 to 50 - FROM YELLOW=(255,255,0) TO GREEN=(0,128,0)
GetColor = Color(R1:=255, G1:=255, B1:=0, R2:=0, G2:=128, B2:=0, steps:=15, index:=index - 35)
End Select
End Function
با آماده شدن همه مقدمات، تابع نهایی رو مینویسیم (به اسم GetIndicator)
که یک مقدار (در این آموزش بیم 0 تا 100) رو میگیره،
و یک string برمیگردونه که میتونیم در یک فیلد rich text اون رو به عنوان نشان دهنده پیشرفت استفاده کنیم:
Public Function GetIndicator(value As Integer) As String
Dim s As String
Dim i As Integer
For i = 1 To value \ 2
s = s + "<font color=" + GetColor(i) + ">" + ChrW(&H2588) + "</font>"
Next
If value Mod 2 = 1 Then
s = s + "<font color=" + GetColor(i) + ">" + ChrW(&H258C) + "</font>"
End If
GetIndicator = s
End Function
در جدول نمونه یک فیلد integer به نام N ،
و یک فیلد long text (memo) با فرمت rich text به نام Indicator داریم،
که باید به صورت خودکار بر اساس مقدار N ساخته بشه.
برای این کار در رخداد Before Change جدول (دقت کنید جدول و نه فرم) از تابع GetIndicator به شکل زیر در Data Macro مربوط استفاده میکنیم:
macro1.png
macro2.png
در اینجا لازم هست از جناب آقای بهرامی گرامی بخاطر ایده این آموزش تشکر کنم.
تاپیک جناب آقای بهرامی
مبتدی: افزایش طول باکس بر اساس مقدار وارد شده (barnamenevis.org)
تاپیک مرتبط
آموزش: ساخت نشاندهنده پیشرفت برای فرم و جدول Progress Indicator in Table and Form (barnamenevis.org)
سلام جناب استاد
بنده نمونه بسیار عالی و جذاب جنابعالی رو دانلود و مشاهده کردم چیزی که در این نمونه برای بنده خیلی جای سوال داره و خیلی سعی کردم متوجه اون بشم که موفق نشدم اینست که هیچ اثری از فراخوانی ماژول(فانکشن ) در فرم و جدول وجود نداره ولی وقتی ما ماژول رو حذف کنیم و مستقیما در جدول تعداد رو تغییر بدهیم پیغام عدم دسترسی فانکشن اعلام میشه . این موضع خارج از بحث زیبائی و حرفه ای تهیه شدن نمونه خیلی سوال برانگیزه که تو کوئری فراخوانی توابع رو بارها دیده ام ولی در جدول اونهم به اینصورت نامرئی بودن فراخوانی تابع تا حالا جایی ندیده ام
سلام و روز خوش
تابع در رخداد before change جدول و در datamacro خوانده میشه!
به قسمت پایین عکس دویم در پست شماره 6 دقت کنین:
macro3.png
اول با دو IF BLOCK محدوده فیلد N رو چک و در صورت لزوم درست میکنیم،
و بعد در آخرین دستور مقدار فیلد Indicator رو برابر GetIndicator([N]) قرار میدیم و فراخوانی اینجا انجام میشه.
به این ترتیب دیگه نیازی نیست در فرم کدنویسی انجام بشه،
بخصوص اگر چند فرم مختلف با یک جدول سروکار داشته باشن.
مقدار فیلد N به هر روشی تغییر کنه عملیات خودکار هست:
چه در جدول، چه در فرم، چه با کد یا کوئری.
در همین برنامه پیوست یک روتین برای ساخت دیتا نمونه در جدول هست:
Sub CreatSampleData()
DoCmd.RunSQL "DELETE * FROM Table1"
Dim dbs As Database
Set dbs = CurrentDb
Dim rs As Recordset
Set rs = dbs.OpenRecordset("table1")
Dim i As Integer
Dim s As String
For i = 0 To 100
rs.AddNew
rs("N") = i
rs.Update
Next
rs.Close
Set rs = Nothing
Set dbs = Nothing
End Sub
اگر دقت کنین در بلوک ساخت رکورد جدید، فقط فیلد N رو مقدار دهی میکنیم و فیلد Indicator با دیتامکرو پر میشه.
برای دوستانی که میخوان کار با datamacro ها رو یاد بگیرن، جناب آقای صدیقی یک اموزش بسیار خوب رو در تاپیک زیر گذاشتن:
آموزش DataMacro
سلام استاد !
در نمونه ضمیمه شیب رنک فیلد نشان دهنده پیشرفت با استفاده از تابع RGB بدست اومده
خواستم خواهش کنم چنانچه فرصت داشتین این نمونه رو بررسی و ایراداتشو برطرف بفرمائید !
ممنون
آخرین ویرایش به وسیله eb_1345 : پنج شنبه 17 اسفند 1402 در 13:46 عصر
سلام جناب آقای بهرامی و روز خوش
روش شما تمیزتر و بهتر هست (طبق روال همیشگی)،
چون:
1- فقط از بکگراند استفاده کردین و شکستگی بین گام ها دیده نمیشه،
2- کدها سبکتر هست.
خیلی خوب شد که این رو مطرح کردین و بابت این قدردان شما هستم.
من پست اول تاپیک رو ویرایش و به این موضوع اشاره میکنم.
سلام
حالا که جناب استاد mazoolagh عزیز نمونه پست 12 بنده رو تائید کردند لازم میدونم یک توضیح مختصری در خصوص نحوه استفاده از جدول نمونه فوق خدمت دوستان ارائه بدهم
با توجه به اینکه در جدول فوق برای هریک از اعداد 0 تا 100 با استفاده از شیب رنگ یک پروگراس بار یا نشان دهنده پیشرفت ایجاد شده میتوان از این جدول در برنامه های دیگر که در فرم های پیوسته اونها نیاز به نمایش درصد پیشرفت یک فیلد خاص وجود دارد بدون هیچگونه کد نویسی ای استفاده کرد.
برای اینکار کافیست این جدول رو به جداول برنامه مربوطه اضافه کنیم و در آن برنامه در جدولی که که قرار است اطلاعات آن در فرم پیوسته نمایش داده شود یک فیلد تحت عنوان IndicatorNo ایجاد کنیم( جهت ارتباط دو جدول) سپس یک کوئری ایجاد می نمائیم و دو جدول رو با استفاده از فیلد کلیدی IndicatorNo
ارتباط میدهیم و از جدول اضافه شده فیلد Indicator و از جدول دیگر فیلدهای مد نظر به کوئری فوق اضافه می کنیم.
البته ناگفته پیداست که اگر کسی طالب تغییرات شیب رنگ در جدول TblIndicatorو انعکاس این تغییرات در فرم خود باشد بهتر است از فرم نمونه فوق هم که کدهای تغییرات شب رنگ در آن درج شده استفاده نماید
لطفاً نمونه ضمیمه رو بررسی بفرمائید
آخرین ویرایش به وسیله eb_1345 : پنج شنبه 17 اسفند 1402 در 21:12 عصر
با سلام و احترام
جناب استاد بهرامی
عالی بود ممنون
با عرض سلام خدمت استاد mazoolagh و استاد بهرامی . واقعا از کارتون لذت بردم . دستتون درد نکنه و خسته نباشید میگم .