-
2 ضمیمه
طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)
با سلام خدمت دوستان و اساتید
بنده یه فرم منو اصلی طراحی کردم به شکل آبشاری که بر اساس نوع لاگین، بعضی کلیدها رو نشون میده بعضی ها رو نه
نمونه کلیدها هم به شکل آبشاری هست که با کلیک بر روی مثلا اطلاعات نیروی انسانی کلیدهای مربوط بهش باز میشه و هرکدوم به یه فرمی متصل شده اند.
به شکلی که وقتی کاربر1 لاگین میکنه همه کلیدها رو نشون میده و وقتی کاربر2 لاگین میکنه کلیدثبت رو نشونش نده
مشکل کار من اینه که وقتی این اتفاق میوفته کلید ثبت رو خالی میندازه و بین کلید بالایی ش و کلید پایینیش فاصله میوفته در حالی که من میخام کلید پایینی بره بچسبه به بالایی
نمونه عکس هارو آوردم
ضمیمه 145674ضمیمه 145675
اساتید اگه کسی نمونه فایلی داره یا راه حلی به ذهنش میرسه خاهشا نظر بدهد
ممنون
-
نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)
سلام
باید کد نویسی زیادی انجام بدید
-
نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)
اگر دکمه ها رو hardcode تعریف کردین یعنی یک سوئیچ برد دارین که تمام اجزای منو از پیش درش تعریف شده و با توجه به سطح دسترسی دکمه رو hidden/visible میکنین بدونین که روش نادرستی بکار بردین و نیاز به کدنویسی پیچیده و البته بیهوده دارین
در اینصورت راحتترین راه این هست که بجای visible/hidden دکمه ها اونها رو enable/disable کنین. اینجوری در جای خودشون رندر میشن و از نظر منطق کاربری هم درست هست یعنی این گزینه هست ولی برای شما نیست و در همه منوها هم دیده میشه.
اگر خیلی اصرار دارین که این دکمه ها دیده نشن درستش اینه که اصلا رندر نشن.
یعنی اول از هر چیز یک جدول برای ساختار منوها تعریف میکنین که شامل menu_item_id , menu_item_text , action و parent_menu_item_id هست.
یک جدول سطح دسترسی هم دارین حتما. در این جدول وضعیت دسترسی هر menu_item_id رو مشخص میکنین.
حالا کافی هست فقط یک بار برای همیشه یک کد بنویسین که با گرفتن پارامتر user_id دکمه های منو رو بصورت دینامیک بسازه.
خوبی این روش این هست که کد رو یکبار مینویسین ولی در هر برنامه ای یا با هر تغییر منو قابل استفاده است بدون نیاز به طراحی دوباره سوئیچ برد و کدنویسی های عجیب و غریب و بیهوده.
-
نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)
سلام
ممنون از راهنماییتون
اینکه گفتین بجای visible/hidden دکمه ها اونها رو enable/disable کنم یه مشکلی داره، اینکه نمیخام کاربر بدونه که چه دکمه ای براش غیرفعال هست و به این خاطر از حالت visible/hidden استفاده کردم
کلیت مطلبی که گفتین با تشکیل جدول چیکار کنم رو متوجه شدم ولی جزئیاتشو نمیدونم دقیق چیکار کنم و چه کدی براشون بنویسم
میشه لطف کنین اگه امکانش هست نمونه دیتابیس دارین برام بفرستین که ازش الگو بگیرم
-
نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)
سلام و روز خوش
راستش از این روش استفاده نمیکنم؛ کلا از هر روشی که پیاده کردنش در اکسس دردسر داشته باشه دوری میکنم مثل استفاده از اکتیوایکس یا api call های غیر ضروری و به همین خاطر هم نمونه ای ندارم که اینجا بگذارم.
اکسس خوبیش به همین است که خیلی سریع میشه نتیجه گرفت و در مقابل یک چیزهایی هم از دست میدین.
بصورت موردی میتونم کمک کنم مثلا چجوری یک کنترل به فرم اضافه کنیم و رخداد هم براش تعریف کنیم.
-
نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)
سلام
ببخشید بین کلام اساتید تیکه پراکنی میکنم
ایده و راهنمایی دوست عزیز mazoolagh به نظر جالب و ساده بود و خواسته آقا مهدی هم منطقی
اگه بخوایم ایندو رو ادغام کنیم و به نوعی کلاه بذاریم سر اپراتور برنامه، امکان داره کپشن دکمه های غیر فعال شده رو تغییر داد تا کارایی اونها برای اپراتور مخفی بمونه؟
مثلا شرطی نوشته بشه که اگر دکمهای به حالت غیرفعال قرار گرفته شد، متن دکمه به عبارت خاصی تغییر کنه ...
مثلا محدودیت دسترسی یا همون غیرفعال خودمون
-
نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)
نقل قول:
نوشته شده توسط
Mehr@ban
امکان داره کپشن دکمه های غیر فعال شده رو تغییر داد تا کارایی اونها برای اپراتور مخفی بمونه؟
مثلا شرطی نوشته بشه که اگر دکمهای به حالت غیرفعال قرار گرفته شد، متن دکمه به عبارت خاصی تغییر کنه ...
سلام و روز خوش
میشه ولی خواسته دوستمون این نیست - میخوان که اصلا رندر نشه گویی که نبوده همچین آپشنی.
چیزی که ایشون میخواد اصطلاحا بهش navigation bar میگن (شبیه همین navigation pane خود اکسس) و ساده اون رو که فقط یک level داره میتونین با navigation form خود اکسس براحتی بسازین و اتفاقا میشه با صفر کردن height هر menu_item اون رو ناپدید کرد (جدای از Hidden کردن)
ولی اینجا ما با چند سطح منو سروکار داریم و تنها چیزی که شبیه به این کار رو انجام میده treeview هست (از نظر عملکرد و نه ظاهر) که اون هم فقط در اکسس 32 بیت در دسترس هست.
-
1 ضمیمه
نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)
باسلام
ممنون از وقتی که برای این تاپیک گذاشتین
من توی سایت های مختلف یه جستجو کردم شبیه به این چیزی که میخامو برای ریبون اکسس پیدا کردم که نمونه دیتابیسضمیمه 145704ش رو براتون میزارم ملاحظه کنین
اگه امکانش هست نوع و نحوه کد نویسیشو نگاه کنین بنظر خاصه
فقط مشکل اینه که اینو برای ریبون اکسس نوشته و متوجه نمیشم چجوری ازش برای فرم منو دیتابیسم استفاده کنم
-
1 ضمیمه
نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)
نقل قول:
نوشته شده توسط
mazoolagh
سلام و روز خوش
میشه ولی خواسته دوستمون این نیست - میخوان که اصلا رندر نشه گویی که نبوده همچین آپشنی.
چیزی که ایشون میخواد اصطلاحا بهش navigation bar میگن (شبیه همین navigation pane خود اکسس) و ساده اون رو که فقط یک level داره میتونین با navigation form خود اکسس براحتی بسازین و اتفاقا میشه با صفر کردن height هر menu_item اون رو ناپدید کرد (جدای از Hidden کردن)
ولی اینجا ما با چند سطح منو سروکار داریم و تنها چیزی که شبیه به این کار رو انجام میده treeview هست (از نظر عملکرد و نه ظاهر) که اون هم فقط در اکسس 32 بیت در دسترس هست.
با سلام
بحثی که در مورد Level کردینو من با یه برنامه نویسی متفاوت حلش کردم که به شکل آبشاری level ها رو میاره فقط بحث نمایش و عدم نمایش کلید ها برای کاربر خاص هست و البته رندر نشدن اونها
نمونه کارمومیگذارم که نظرتونو بدین
ممنون
ضمیمه 145705
-
نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)
سلام
کسی نمیدونه چیکار باید بکنم:ناراحت:
خاهشا اگه کسی فایلی داره یا روشی به نظرش میرسه راهنمایی کنه :لبخندساده:
-
نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)
-
نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)
یک وقت هست که هدف ما رسیدن به یک عملکرد هست که خب برای داشتن منوهای چند مرحله نیاز به این روش که اینجا اومده نیست و راه های ذاتی خود اکسس بهتره و حتی یک سوئیچ برد یا ناویگیشن فرم ساده هم جوابگو هست.
در واقع تمام عملیات مرحله دوم منو رو میشه به فرم اکشن مرحله یک برد: یعنی تمام عملیات ثبت/حذف/ویرایش و ... میتونه در منوی فرم باشه (نه بعنوان یک ساب منو)
اما یک وقت هست که هدف ما پیاده کردن یک خواسته خاصی هست حتی اگر راه دیگه (شاید بهتر) هم باشه.
من کد نمونه های پیوست رو یک بررسی کردم. یکی از اون ها ظاهرا نیاز به addin پولی داره که هیچ - دومی هم که کد همین منو بود که تصاویرش در پست اول هست.
خب کلیدها همونجور که حدس زده بودم hardcode شدن و کدها به واقع بصورت غیر ضروری پیچیده است و ارزش ادیت نداره بنظرم بخصوص که کوچکترین تغییری در منو نیاز به حجم وسیع ویرایش کد داره.
برخلاف تصور طراحی این منوها بصورت دینامیک و پارامتریک بمراتب ساده تر هست. من خودم بالشخصه از این کارها نمیکنم ولی بعنوان یک چالش برنامه نویسی و همینطور در بر داشتن نکات مفید آموزشی تصمیم دارم یک نمونه اش رو بنویسم و همینجا پیوست کنم.
-
نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)
نقل قول:
نوشته شده توسط
Mehr@ban
ایشون هم البته کاسب هست که در نفس خودش ایرادی بهش نیست ولی جاش هم اینجا نیست!
پیشترها هم یک سری افرادی اینجا با همین نیت دنبال مشتری میگشتن و وقتی هم رفتن مثل بچه ها پست هاشون رو پاک کردن
-
نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)
نقل قول:
نوشته شده توسط
mazoolagh
ایشون هم البته کاسب هست که در نفس خودش ایرادی بهش نیست ولی جاش هم اینجا نیست!
پیشترها هم یک سری افرادی اینجا با همین نیت دنبال مشتری میگشتن و وقتی هم رفتن مثل بچه ها پست هاشون رو پاک کردن
قصدم تبلیغ تجارت و کسب و کار ایشون نبود
دیدم کار این بنده خدا لنگ مونده، گفتم یه آدرس صرف بدم شاید بتونه کارش رو راه بندازه هرچند با پرداخت وجه ...
میتونم از طریق پیام خصوصی باهاتون در ارتباط باشم؟
-
نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)
نقل قول:
نوشته شده توسط
Mehr@ban
میتونم از طریق پیام خصوصی باهاتون در ارتباط باشم؟
پیام خصوصی رو باز میکنم امروز ولی بی دلیل بسته نیست:
- کلا توقع این هست که پیام باید خیلی سریع پاسخ داده بشه (سریعتر از از تاپیک ها) و این حداقل برای من یکی مقدور نیست و نهایتا دلخوری پیش میاد.
- در پیام معمولا بحث به تماس تلفنی یا قرار کاری و نهایتا قرارداد و پول ... میکه و این هم از برنامه های من نیست و همون دلخوری مجددا ظاهر میشه.
--------------------
در ارتباط با موضوع:
امروز فرصت کنم بخش اول نمونه رو میگذارم. قدری پیچیده هست بهتره قدم به قدم جلو بریم.
-
2 ضمیمه
نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)
در نخستین گام یک فرم ساده میسازیم که تنها دارای دکمه های منو است (command button) و این کلیدها هم کاری انجام نمیدن (در این مرحله).
هر چند الزامی نیست ولی در اینجا با کد این فرم رو میسازیم چون:
- اسامی دکمه ها فرمولیزه است
- بعدا قرار هست رویداد onclick براشون بسازیم که این رویداد هم بر مبنای اسم دکمه کار میکنه
یک ماجول جدید بسازین و کد زیر رو در اون بریزین :
Option Compare Database
Option Explicit
Public Const NavFrm As String = "Navigation"
Public Const twips As Integer = 567
Public L1_Count, L2_Count As Integer
Public L1_Top, L1_Left, L1_Width, L1_Height, L1_Padding As Integer
Public L2_Width, L2_Height, L2_Left, L2_Padding As Integer
Public v As Variant
Public Sub Read_Parameters()
L1_Count = 10
L2_Count = 8
L1_Top = 1 * twips
L1_Left = 1 * twips
L1_Width = 4 * twips
L1_Height = 0.7 * twips
L1_Padding = 0.3 * twips
L2_Width = 3.5 * twips
L2_Height = 0.6 * twips
L2_Padding = 0.1 * twips
L2_Left = L1_Left + 0.5 * twips
End Sub
Public Function Create_Navigation_Form() As Boolean
On Error Resume Next
DoCmd.DeleteObject acForm, NavFrm
On Error GoTo error_handler
Read_Parameters
Dim frm As Form
Set frm = CreateForm
Dim Temp_Name As String
Temp_Name = frm.Name
frm.AllowLayoutView = False
frm.NavigationButtons = False
frm.RecordSelectors = False
frm.Width = 20 * twips
frm.Section(0).Height = 16 * twips
Dim Btn As CommandButton
Dim i As Integer
For i = 1 To L1_Count
Set Btn = CreateControl(Temp_Name, acCommandButton, acDetail, "", "", L1_Left, L1_Top + (i - 1) * (L1_Height + L1_Padding), L1_Width, L1_Height)
Btn.Name = "L1_" + Trim(i)
Btn.CAPTION = "Level 1 - item " + Trim(i)
Next
For i = 1 To L2_Count
Set Btn = CreateControl(Temp_Name, acCommandButton, acDetail, "", "", L1_Left + L1_Width + 2 * twips, L1_Top + (i - 1) * (L2_Height + L2_Padding), L2_Width, L2_Height)
Btn.Name = "L2_" + Trim(i)
Btn.CAPTION = "Level 2 - item " + Trim(i)
Next
DoCmd.Close acForm, Temp_Name, acSaveYes
DoCmd.Rename NavFrm, acForm, Temp_Name
Create_Navigation_Form = True
Exit Function
error_handler:
Create_Navigation_Form = False
v = MsgBox(Err.Description & vbCrLf, vbCritical, "Error Number : " & Err.Number)
End Function
حالا در پنجره immediate تابع ساخت رو اجرا کنین:
ضمیمه 145844
پس از این اگر چک کنین میبینین که یک فرم به نام Navigation ساخته شده
در گام بعدی برای این دکمه ها رویداد میسازیم (با کد مسلما)
برای راحتی برنامه رو همینجا هم پیوست میکنم
-
2 ضمیمه
نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)
در گام دو چند کار نو داریم:
- برای دکمه ها رخداد تعریف میکنیم
- باز و بسته شدن منو رو میسازیم
- یک کم به ظاهر منو میرسیم
فقط دقت کنین که در نمونه پیوست اول با کد فرم رو ساختیم بعد برای فرم کد اضافه کردیم و دستی هم به سر و روی دکمه ها کشیدیم. یعنی اگر مثل گام یک دوباره تابع ساخت فرم رو اجرا کنین کدهای اضافه شده و فرمتینگ کلیدها میپره! البته کد رو اینجا میگذارم و میتونین خودتون دوباره اون ها رو به فرم اضافه کنین.
نسبت به گام یک چند تغییر جزئی داریم که new code مشخص شده
Option Compare Database
Option Explicit
Public Const NavFrm As String = "Navigation"
Public Const twips As Integer = 567
Public L1_Count, L2_Count As Integer
Public L1_Top, L1_Left, L1_Width, L1_Height, L1_Padding As Integer
Public L2_Width, L2_Height, L2_Left, L2_Padding As Integer
Public v As Variant ' new code
Public Sub Read_Parameters()
L1_Count = 10
L2_Count = 8
L1_Top = 1 * twips
L1_Left = 1 * twips
L1_Width = 4 * twips
L1_Height = 0.7 * twips
L1_Padding = 0.3 * twips
L2_Width = 4 * twips
L2_Height = 0.7 * twips
L2_Padding = 0.1 * twips
L2_Left = L1_Left + 0.5 * twips
End Sub
Public Function Create_Navigation_Form() As Boolean
On Error Resume Next
DoCmd.DeleteObject acForm, NavFrm
On Error GoTo error_handler
Read_Parameters
Dim frm As Form
Set frm = CreateForm
Dim Temp_Name As String
Temp_Name = frm.Name
frm.AllowLayoutView = False
frm.NavigationButtons = False
frm.RecordSelectors = False
frm.Width = 20 * twips
frm.Section(0).Height = 16 * twips
Dim Btn As CommandButton
Dim i As Integer
For i = 1 To L1_Count
Set Btn = CreateControl(Temp_Name, acCommandButton, acDetail, "", "", L1_Left, L1_Top + (i - 1) * (L1_Height + L1_Padding), L1_Width, L1_Height)
Btn.Name = "L1_" + Trim(i)
Btn.CAPTION = "Level 1 - item " + Trim(i)
Btn.OnClick = "=L1_Click('" + Btn.Name + "')" ' new code
Next
For i = 1 To L2_Count
Set Btn = CreateControl(Temp_Name, acCommandButton, acDetail, "", "", L1_Left + L1_Width + 2 * twips, L1_Top + (i - 1) * (L2_Height + L2_Padding), L2_Width, L2_Height)
Btn.Name = "L2_" + Trim(i)
Btn.CAPTION = "Level 2 - item " + Trim(i)
Btn.Visible = False ' new code
Next
DoCmd.Close acForm, Temp_Name, acSaveYes
DoCmd.Rename NavFrm, acForm, Temp_Name
Create_Navigation_Form = True
Exit Function
error_handler:
Create_Navigation_Form = False
End Function
و این هم کدهای فرم navigation :
Option Compare Database
Option Explicit
Private Clicked As Integer
Private Sub Form_Load()
Read_Parameters
Clicked = 0
End Sub
Private Function L1_Click(Btn_Name As String)
Dim Btn2 As CommandButton
Dim Offset_Top As Integer
Dim i, n As Integer
n = Replace(Btn_Name, "L1_", "")
For i = 1 To L2_Count
Controls("L2_" + Trim(i)).Visible = (Clicked <> n)
Next
If Clicked = n Then
For i = 1 To L1_Count
Controls("L1_" + Trim(i)).Top = L1_Top + (i - 1) * (L1_Height + L1_Padding)
Next
Clicked = 0
Else
Offset_Top = L1_Top
For i = 2 To n
Offset_Top = Offset_Top + L1_Height + L1_Padding
Controls("L1_" + Trim(i)).Top = Offset_Top
Next
Offset_Top = Offset_Top + L1_Height + L2_Padding
For i = 1 To L2_Count
Set Btn2 = Controls("L2_" + Trim(i))
Btn2.Top = Offset_Top
Btn2.Left = L2_Left
Offset_Top = Offset_Top + L2_Height + L2_Padding
Btn2.Tag = "Level 1 - Item " + Trim(n) + vbCrLf + "Level 2 - Item " + Trim(i)
Btn2.OnClick = "=L2_Click('" + Btn2.Tag + "')"
Next
Offset_Top = Offset_Top - L2_Height - L1_Padding
For i = n + 1 To L1_Count
Offset_Top = Offset_Top + L1_Height + L1_Padding
Controls("L1_" + Trim(i)).Top = Offset_Top
Next
Clicked = n
End If
End Function
Private Function L2_Click(Arg As String)
v = MsgBox(Arg, , "Level 2 - Click")
End Function
فرمتینگ کلیدها
ضمیمه 145863
البته تعیین استایل دکمه ها با کد هم میسر هست
و اینهم نمونه ای از عملکرد کلیدها :
ضمیمه 145864
کار ما هنوز تمام نشده - تا اینجا فقط کارکرد درست دکمه ها رو ساختیم.
در گام های بعدی منو رو بتدریج کامل میکنیم جوری که هر sub_menu جداگانه ساخته میشه (از روی پارامترهای طراحی منو)
-
1 ضمیمه
نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)
-
5 ضمیمه
نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)
خب کجا بودیم؟
حالا منو رو یک پله به سمت کاربردی تر شدن و واقعی تر شدن سوق میدیم.
اول از همه باید یک جدول برای تعریف اجزا منو بسازیم. در این مرحله فقط caption و action رو تعریف میکنیم.
منظور از action اسم روتینی هست که باید با رخداد onclick دکمه اجرا بشه.
طراحی جدول
ضمیمه 145907
دیتا نمونه
ضمیمه 145908
اینجور قرارداد میکنیم که ParentID آیتم های Level 1 برابر 1- باشه.
همینجور اگر دقت کنین برای آیتم شماره 5 از سطح 1 منو هیچ ساب آیتم در سطح 2 نداریم ولی action داریم.
معنی اش این هست که اکشن تعریف شده F50 با رخداد onclick این آیتم باید اجرا بشه.
برای بقیه دکمه ها با این رویداد منو باز وبسته میشه (همون expand/collapse)
حالا یک کوئری میسازیم که براساس پارامتر ParentID@ مجموعه آیتم ها رو برگردونه
ضمیمه 145909
خروجی نمونه برای ParentID=3
ضمیمه 145910
و این هم کارکرد نمونه آیتم 3
ضمیمه 145911
-
نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)
چه تغییراتی نسبت به گام پیش داریم؟
- تمام عملیات ساخت فرم رو حذف کردیم چون دیگه نیازی بهش نداریم بنابراین ماجول پابلیک utilities نسبت به قبل سبکتر شده.
- در برابر تمام روتین های مربوط به actionها رو در این ماجول میاریم. اینجا فقط برای یک action و بعنوان راهنما و نمونه اینکار رو کردیم.
- در فرم navigation اطلاعات منو رو در رخداد onload از جدول menuitems میخونیم و برای هر آیتم از این دیتا استفاده میکنیم. کامنت برای کدها گذاشتم تا شناخت روش کار کد راحتتر باشه.
کد ماجول utilities
Option Compare Database
Option Explicit
Public Const twips As Integer = 567
Public v As Variant
Public Function F50()
v = MsgBox("procedure F50")
End Function
کدهای فرم navigation
Option Compare Database
Option Explicit
Private Const L1_Max As Integer = 10
Private Const L2_Max As Integer = 8
Private Clicked As Integer ' shows which Level 1 item clicked
Private Menu_L1() As Variant ' array to hold Level 1 captions and actions
Private Menu_L2(L1_Max) As Variant ' array to hold Level 2 captions and actions
Private L1_Count As Integer ' number of defined items in Level 1
Private i As Integer
Private L1_H, L2_H, L1_Padding, L2_Padding, L2_Left As Integer
Private Sub Form_Load()
L1_H = L1_2.Top - L1_1.Top
L1_Padding = L1_H - L1_1.Height
L2_H = L2_2.Top - L2_1.Top
L2_Padding = L2_H - L2_1.Height
L2_Left = L1_1.Left + 0.5 * twips ' right indent for Level 2 buttons : 0.5 cm
Read_Menu ' load menu data into corresponding arrays
For i = 1 To L1_Count
L1(i).CAPTION = L1_Caption(i)
L1(i).Visible = True
L1(i).OnClick = "=L1_Click(" + Trim(i) + ")"
Next
For i = L1_Count + 1 To L1_Max ' hide unused Level 1 items
L1(i).Visible = False
Next
For i = 1 To L2_Max
L2(i).Left = L2_Left ' reposition Level 2 items
Next
Collapse ' collapse menu
End Sub
Private Function L1_Click(L1_item As Integer)
If L2_Count(L1_item) = 0 Then ' no Level 2 items
Collapse
Eval (L1_Action(L1_item)) ' run action
Else
If Clicked = L1_item Then ' toggle state
Collapse
Else
Expand (L1_item)
End If
End If
End Function
Private Function L2_Count(L1_item As Integer) As Integer
L2_Count = 0
On Error Resume Next
L2_Count = UBound(Menu_L2(L1_item), 2) + 1
End Function
Public Function Read_Menu()
Dim rs As Recordset
Dim MenuQry As QueryDef
Set MenuQry = CurrentDb.QueryDefs("Menu")
MenuQry.Parameters("@ParentID") = -1 ' Level 1 items have no parent
Set rs = MenuQry.OpenRecordset
Menu_L1 = rs.GetRows(L1_Max) ' loads Level 1 items into array
L1_Count = UBound(Menu_L1, 2) + 1
For i = 1 To L1_Count ' loop through Level 1
MenuQry.Parameters("@ParentID") = i
Set rs = MenuQry.OpenRecordset
If rs.RecordCount > 0 Then
Menu_L2(i) = rs.GetRows(L2_Max) ' load Level 2 items for Level 1 item i
End If
Next
rs.Close
Set rs = Nothing
End Function
Private Function Collapse()
For i = 1 To L2_Max
L2(i).Visible = False ' hive Level 2 items
Next
For i = 2 To L1_Max
L1(i).Top = L1(i - 1).Top + L1_H
Next
Clicked = 0 ' nothing selected
End Function
Private Function Expand(n As Integer) ' n = clicked button index
Clicked = n
Dim k As Integer
k = L2_Count(n)
Dim L2TH As Integer ' Level 2 total height
If k = 0 Then
L2TH = 0
Else
L2TH = k * L2_H + L2_Padding
End If
For i = 2 To L1_Count ' start from item 2 - item 1 top is always fixed
If i = n + 1 Then
L1(i).Top = L1(n).Top + L1_1.Height + L2TH
Else
L1(i).Top = L1(i - 1).Top + L1_H
End If
Next
Dim X As Integer
X = L1(n).Top + L1_1.Height + L2_Padding
For i = 1 To k ' reposition Level 2 items
With L2(i)
.Visible = True
.CAPTION = L2_Caption(n, i)
.Top = X + (i - 1) * L2_H
.OnClick = "=" + L2_Action(n, i)
End With
Next
For i = k + 1 To L2_Max
L2(i).Visible = False
Next
End Function
Private Function L1(n As Integer) As CommandButton
Set L1 = Controls("L1_" + Trim(n))
End Function
Private Function L2(n As Integer) As CommandButton
Set L2 = Controls("L2_" + Trim(n))
End Function
Private Function L1_Caption(n As Integer) As Variant
L1_Caption = Menu_L1(0, n - 1)
End Function
Private Function L1_Action(n As Integer) As Variant
L1_Action = Menu_L1(1, n - 1)
End Function
Private Function L2_Caption(n1 As Integer, n2 As Integer) As Variant
L2_Caption = Menu_L2(n1)(0, n2 - 1)
End Function
Private Function L2_Action(n1 As Integer, n2 As Integer) As Variant
L2_Action = Menu_L2(n1)(1, n2 - 1)
End Function
-
1 ضمیمه
نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)
و اینهم خود برنامه گام 3
در گام بعدی یاد میگیریم که چجوری برای دکمه ها icon اضافه کنیم
و در گام های بعد منو رو به فرم login و جدول دسترسی کاربران پیوند میدیم
-
نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)
سلام علیکم
دستتون درد نکنه خیلی سورس کاربردی بود، فقط یه نکته:
اگر بخواهم یکی از منو ها که دارای زیر منو هم هست، بصورت پیشفرض در حالت باز باشد، چه کار باید انجام بدم؟
-
4 ضمیمه
نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)
مدتی این مثنوی تاخیر شد ...
قرار بود که به دکمه ها آیکون اضافه کنیم؛
بهترین روش این هست که تصاویر رو بعنوان resource نگهداری کنیم. اکسس بصورت خودکار هر تصویری رو که در محیط طراحی به فرم یا ریپورت اضافه بشه در جدول سیستمی resource ها نگهداری میکنه و در سراسر برنامه قابل دسترس هست - حتی اگر عکس رو بعدا از طراحی فرم/ریپورت پاک کنین در این جدول باقی میمونه.
ولی چون ما این تصاویر رو بعنوان پیوست معرفی میکنیم، اکسس اون ها رو در جدول resource ها کپی نمیکنه پس خودمون باید برای اینکار کد بنویسیم.
نسبت به گام قبلی چند تغییر کوچک داریم:
در جدول MenuItems فیلد Icon از نوع پیوست رو اضافه کردیم که تصویر دکمه رو قرار هست در خودش نگهداری کنه.
همینجور فیلد متنی FileName که وجودش ضروری نیست (اطلاعات اون از خود فیلد پیوست قابل استخراج هست) ولی کد تمیزتر و جمع و جورتری خواهیم داشت.
ضمیمه 147325
همینجور طراحی کوئری Menu
ضمیمه 147326
و حالا از یک فرم برای ثبت اطلاعات MenuItems استفاده میکنیم چون نیاز به کدی داریم که تصاویر رو به جدول Resources اضافه کنه:
ضمیمه 147327
نمونه منو:
ضمیمه 147328
-
نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)
تغییرات کوچکی در کد نمایش منو داریم (ویژگی Picture اضافه شده و توابع مربوط به اون):
For i = 1 To L1_Count
With L1(i)
.Caption = L1_Caption(i)
.Visible = True
.OnClick = "=L1_Click(" + Trim(i) + ")"
.Picture = L1_Picture(i)
End With
Next
Private Function L1_Picture(n As Integer) As Variant
L1_Picture = Nz(Menu_L1(2, n - 1), "")
End Function
For i = 1 To k ' reposition Level 2 items
With L2(i)
.Visible = True
.Caption = L2_Caption(n, i)
.Top = X + (i - 1) * L2_H
.OnClick = "=" + L2_Action(n, i)
.Picture = L2_Picture(n, i)
End With
Next
Private Function L2_Picture(n1 As Integer, n2 As Integer) As Variant
L2_Picture = Nz(Menu_L2(n1)(2, n2 - 1), "")
End Function
-
نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)
روش کپی تصاویر در جدول resources
Private Sub Icon_AfterUpdate()
Dim RS1 As Recordset
Dim RS2 As Recordset
Set RS1 = CurrentDb.OpenRecordset("MSysResources")
If Me.Icon.FileName <> "" Then
Me.FileName = Replace(Me.Icon.FileName, "." + Me.Icon.FileType, "")
RS1.AddNew
Set RS2 = RS1("Data").Value
RS2.AddNew
RS2("FileData") = Me.Icon.FileData
RS2("FileName") = Me.Icon.FileName
RS2.Update
RS2.Close
Set RS2 = Nothing
RS1("Type") = "img"
RS1("Name") = Me.FileName
RS1("Extension") = Me.Icon.FileType
RS1.Update
Else
Me.FileName = ""
End If
RS1.Close
Set RS1 = Nothing
End Sub
-
2 ضمیمه
نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)
برنامه گام چهارم همراه با چند تصویر با فرمتهای مختلف جهت تست و بررسی کارکرد برنامه
جدول resourceهای اکسس از نوع سیستمی و مخفی است.
اگر مایل به مشاهده اطلاعات این جدول هستین باید در بخش options تیک های show system objects / show hidden objects رو روشن کنین (بعنوان یادگیری و آموزش فقط)
-
نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)
نقل قول:
نوشته شده توسط
zzhkfa
سلام علیکم
دستتون درد نکنه خیلی سورس کاربردی بود، فقط یه نکته:
اگر بخواهم یکی از منو ها که دارای زیر منو هم هست، بصورت پیشفرض در حالت باز باشد، چه کار باید انجام بدم؟
سلام
کافی هست روتین Expand رو فراخوانی کنین - n ردیف منو است
Private Function Expand(n As Integer) ' n = clicked button index
....
....
End Function
-
نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)
با سلام و خسته نباشد خدمت شما دوست عزیز و تشکر از این آموزش مفیدتون
حال اگه خواسته باشیم یه فرم را با استفاده از این باتن منوها فراخوانی کنیم چه کار باید بکنیم ؟
-
1 ضمیمه
نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)
نقل قول:
نوشته شده توسط
fayaz8301614
با سلام و خسته نباشد خدمت شما دوست عزیز و تشکر از این آموزش مفیدتون
حال اگه خواسته باشیم یه فرم را با استفاده از این باتن منوها فراخوانی کنیم چه کار باید بکنیم ؟
سلام و روز خوش
در پست شماره 20 به این موضوع اشاره شده (البته مختصر)؛
برای هر button که قرار هست کاری انجام بده (باز کردن فرم یا گزارش یا اجرای کد و ...)
باید یک function پابلیک بنویسین و هر کاری که نیاز دارین در این تابع انجام بدین .
مثلا در در نمونه پیوست شده، برای کلید پنجم از منو، تابع F50 تعریف شده:
ضمیمه 155504
و در ماژول utilities (اسم ماژول اهمیتی نداره و میتونه هر اسمی باشه ولی تابع حتما باید public تعریف بشه) این تابع به شکل زیر تعریف شده:
Public Function F50()
v = MsgBox("procedure F50")
End Function
در این مثال فقط یک msgbox نمایش داده میشه،
و اگر بخواین فرم یا گزارش باز کنین کافی هست از دستور docmd.openform یا docmd.openreport استفاده کنین.
==========
همچنان میتونین بجای این روش، از navigation control هم که در پرسش قبلی شما مطرح شده استفاده کنین:
آموزش: راهنمایی در مورد دکمه های نابوری آبشاری در فرم اکسس (barnamenevis.org)
-
نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)
با سلام خدمت اساتید محترم
اگر خواسته باشیم برای هر یک از این دکمه های آبشاری به کگاربران دسترس بدهیم ، باید چکار کنیم ؟
-
نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)
نقل قول:
نوشته شده توسط
fayaz8301614
با سلام خدمت اساتید محترم
اگر خواسته باشیم برای هر یک از این دکمه های آبشاری به کگاربران دسترس بدهیم ، باید چکار کنیم ؟
سلام دوباره و روز خوش
اون یک کار مستقل هست و فکر کنم چند نمونه "دسترسی به فرم ها و گزارشها بر اساس کاربر" در همین بخش اکسس خورده.