PDA

View Full Version : آموزش: ساخت نشاندهنده پیشرفت با گرادیان رنگ برای فرم و جدول Gradient Progress Indicator in Table and Form



mazoolagh
دوشنبه 14 اسفند 1402, 19:29 عصر
هدف ساخت نشاندهنده پیشرفت با گرادیان رنگی است:

جدول:
155457

فرم پیوسته:
155458

فرم دیتاشیت:
155460

آپدیت:
پیشنهاد میکنم روش محاسبه و ساخت پیشنهادی جناب آقای بهرامی (پست شماره 12) رو حتما بخونین.

mazoolagh
دوشنبه 14 اسفند 1402, 19:55 عصر
اول باید یک مبنای رنگی طراحی کنیم.

در این آموزش اینجور قرارداد میکنیم که نشاندهده از:
رنگ قرمز برای 0% شروع و در 30% به نارنجی میرسه،
و بعد تا 70% به رنگ زرد و در پایان در 100% به رنگ سبز میرسه،
و در بین این مقادیر رنگ باید از بین طیف ها محاسبه بشه.

برای داشتن یک ایده تصویری این گرادیان رو به صورت html میبینیم:
با استفاده از اسم رنگ
background: linear-gradient(to right, RED0%, DARKORANGE30%, YELLOW , GREEN100%);
155461

یا کد رنگ
background: linear-gradient(to right, #FF00000%, #FF800030%, #FFFF00 , #008000100%);
155462

که به صورت زیر دیده میشه:
155463

mazoolagh
دوشنبه 14 اسفند 1402, 20:29 عصر
حالا باید یک تابع بنویسیم که (اسم اون رو 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

mazoolagh
دوشنبه 14 اسفند 1402, 20:48 عصر
حالا میتونیم خیلی راحت تابعی رو بنویسیم (به اسم 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

mazoolagh
دوشنبه 14 اسفند 1402, 20:56 عصر
با آماده شدن همه مقدمات، تابع نهایی رو مینویسیم (به اسم 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

mazoolagh
دوشنبه 14 اسفند 1402, 21:15 عصر
در جدول نمونه یک فیلد integer به نام N ،
و یک فیلد long text (memo) با فرمت rich text به نام Indicator داریم،
که باید به صورت خودکار بر اساس مقدار N ساخته بشه.

برای این کار در رخداد Before Change جدول (دقت کنید جدول و نه فرم) از تابع GetIndicator به شکل زیر در Data Macro مربوط استفاده میکنیم:

155464

155465

mazoolagh
دوشنبه 14 اسفند 1402, 21:23 عصر
در اینجا لازم هست از جناب آقای بهرامی گرامی بخاطر ایده این آموزش تشکر کنم.

تاپیک جناب آقای بهرامی
مبتدی: افزایش طول باکس بر اساس مقدار وارد شده (barnamenevis.org) (https://barnamenevis.org/showthread.php?578829)

تاپیک مرتبط
آموزش: ساخت نشاندهنده پیشرفت برای فرم و جدول Progress Indicator in Table and Form (barnamenevis.org) (https://barnamenevis.org/showthread.php?578943)

atf1379
دوشنبه 14 اسفند 1402, 22:25 عصر
سلام جناب استاد
بنده نمونه بسیار عالی و جذاب جنابعالی رو دانلود و مشاهده کردم چیزی که در این نمونه برای بنده خیلی جای سوال داره و خیلی سعی کردم متوجه اون بشم که موفق نشدم اینست که هیچ اثری از فراخوانی ماژول(فانکشن ) در فرم و جدول وجود نداره ولی وقتی ما ماژول رو حذف کنیم و مستقیما در جدول تعداد رو تغییر بدهیم پیغام عدم دسترسی فانکشن اعلام میشه . این موضع خارج از بحث زیبائی و حرفه ای تهیه شدن نمونه خیلی سوال برانگیزه که تو کوئری فراخوانی توابع رو بارها دیده ام ولی در جدول اونهم به اینصورت نامرئی بودن فراخوانی تابع تا حالا جایی ندیده ام

mazoolagh
سه شنبه 15 اسفند 1402, 13:21 عصر
سلام
چیزی که در این نمونه برای بنده خیلی جای سوال داره و خیلی سعی کردم متوجه اون بشم که موفق نشدم اینست که هیچ اثری از فراخوانی ماژول(فانکشن ) در فرم و جدول وجود نداره ولی وقتی ما ماژول رو حذف کنیم و مستقیما در جدول تعداد رو تغییر بدهیم پیغام عدم دسترسی فانکشن اعلام میشه . این موضع خارج از بحث زیبائی و حرفه ای تهیه شدن نمونه خیلی سوال برانگیزه که تو کوئری فراخوانی توابع رو بارها دیده ام ولی در جدول اونهم به اینصورت نامرئی بودن فراخوانی تابع تا حالا جایی ندیده ام

سلام و روز خوش
تابع در رخداد before change جدول و در datamacro خوانده میشه!
به قسمت پایین عکس دویم در پست شماره 6 دقت کنین:

155472
اول با دو 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 با دیتامکرو پر میشه.

mazoolagh
سه شنبه 15 اسفند 1402, 13:29 عصر
برای دوستانی که میخوان کار با datamacro ها رو یاد بگیرن، جناب آقای صدیقی یک اموزش بسیار خوب رو در تاپیک زیر گذاشتن:

آموزش DataMacro (https://barnamenevis.org/showthread.php?545694)

eb_1345
سه شنبه 15 اسفند 1402, 16:06 عصر
هدف ساخت نشاندهنده پیشرفت با گرادیان رنگی است:

سلام
دستخوش استاد!:تشویق::تشویق::تشویق:
یکی از یکی بهتر

eb_1345
سه شنبه 15 اسفند 1402, 16:20 عصر
سلام استاد !
در نمونه ضمیمه شیب رنک فیلد نشان دهنده پیشرفت با استفاده از تابع RGB بدست اومده
خواستم خواهش کنم چنانچه فرصت داشتین این نمونه رو بررسی و ایراداتشو برطرف بفرمائید !
ممنون

mazoolagh
چهارشنبه 16 اسفند 1402, 19:08 عصر
سلام !
در نمونه ضمیمه شیب رنک فیلد نشان دهنده پیشرفت با استفاده از تابع RGB بدست اومده
خواستم خواهش کنم چنانچه فرصت داشتین این نمونه رو بررسی و ایراداتشو برطرف بفرمائید !
ممنون

سلام جناب آقای بهرامی و روز خوش
روش شما تمیزتر و بهتر هست (طبق روال همیشگی)،
چون:
1- فقط از بکگراند استفاده کردین و شکستگی بین گام ها دیده نمیشه،
2- کدها سبکتر هست.
خیلی خوب شد که این رو مطرح کردین و بابت این قدردان شما هستم.

من پست اول تاپیک رو ویرایش و به این موضوع اشاره میکنم.

eb_1345
چهارشنبه 16 اسفند 1402, 23:01 عصر
سلام جناب آقای بهرامی و روز خوش
روش شما تمیزتر و بهتر هست (طبق روال همیشگی)،
چون:
1- فقط از بکگراند استفاده کردین و شکستگی بین گام ها دیده نمیشه،
2- کدها سبکتر هست.
خیلی خوب شد که این رو مطرح کردین و بابت این قدردان شما هستم.

من پست اول تاپیک رو ویرایش و به این موضوع اشاره میکنم.

سپاسگزارم استاد !🙏

eb_1345
پنج شنبه 17 اسفند 1402, 12:37 عصر
سلام
حالا که جناب استاد mazoolagh عزیز نمونه پست 12 بنده رو تائید کردند لازم میدونم یک توضیح مختصری در خصوص نحوه استفاده از جدول نمونه فوق خدمت دوستان ارائه بدهم
با توجه به اینکه در جدول فوق برای هریک از اعداد 0 تا 100 با استفاده از شیب رنگ یک پروگراس بار یا نشان دهنده پیشرفت ایجاد شده میتوان از این جدول در برنامه های دیگر که در فرم های پیوسته اونها نیاز به نمایش درصد پیشرفت یک فیلد خاص وجود دارد بدون هیچگونه کد نویسی ای استفاده کرد.
برای اینکار کافیست این جدول رو به جداول برنامه مربوطه اضافه کنیم و در آن برنامه در جدولی که که قرار است اطلاعات آن در فرم پیوسته نمایش داده شود یک فیلد تحت عنوان IndicatorNo ایجاد کنیم( جهت ارتباط دو جدول) سپس یک کوئری ایجاد می نمائیم و دو جدول رو با استفاده از فیلد کلیدی IndicatorNo
ارتباط میدهیم و از جدول اضافه شده فیلد Indicator و از جدول دیگر فیلدهای مد نظر به کوئری فوق اضافه می کنیم.
البته ناگفته پیداست که اگر کسی طالب تغییرات شیب رنگ در جدول TblIndicatorو انعکاس این تغییرات در فرم خود باشد بهتر است از فرم نمونه فوق هم که کدهای تغییرات شب رنگ در آن درج شده استفاده نماید
لطفاً نمونه ضمیمه رو بررسی بفرمائید

محمد رضا بهبودی
پنج شنبه 17 اسفند 1402, 14:30 عصر
با سلام و احترام
جناب استاد بهرامی
عالی بود ممنون

eb_1345
پنج شنبه 17 اسفند 1402, 16:10 عصر
با سلام و احترام
عالی بود ممنون

سلام
خواهش می کنم

reza_1199
پنج شنبه 17 اسفند 1402, 20:22 عصر
با عرض سلام خدمت استاد mazoolagh و استاد بهرامی . واقعا از کارتون لذت بردم . دستتون درد نکنه و خسته نباشید میگم .