نمایش نتایج 1 تا 31 از 31

نام تاپیک: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)

  1. #1

    Question طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)

    با سلام خدمت دوستان و اساتید
    بنده یه فرم منو اصلی طراحی کردم به شکل آبشاری که بر اساس نوع لاگین، بعضی کلیدها رو نشون میده بعضی ها رو نه
    نمونه کلیدها هم به شکل آبشاری هست که با کلیک بر روی مثلا اطلاعات نیروی انسانی کلیدهای مربوط بهش باز میشه و هرکدوم به یه فرمی متصل شده اند.
    به شکلی که وقتی کاربر1 لاگین میکنه همه کلیدها رو نشون میده و وقتی کاربر2 لاگین میکنه کلیدثبت رو نشونش نده
    مشکل کار من اینه که وقتی این اتفاق میوفته کلید ثبت رو خالی میندازه و بین کلید بالایی ش و کلید پایینیش فاصله میوفته در حالی که من میخام کلید پایینی بره بچسبه به بالایی
    نمونه عکس هارو آوردم

    1.jpg2.jpg
    اساتید اگه کسی نمونه فایلی داره یا راه حلی به ذهنش میرسه خاهشا نظر بدهد
    ممنون

  2. #2
    کاربر دائمی آواتار saeed1234n
    تاریخ عضویت
    تیر 1390
    محل زندگی
    قرچک
    پست
    777

    نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)

    سلام

    باید کد نویسی زیادی انجام بدید

  3. #3
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: طراحی فرم منو اصلی پویا در اکسس (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 دکمه های منو رو بصورت دینامیک بسازه.
    خوبی این روش این هست که کد رو یکبار مینویسین ولی در هر برنامه ای یا با هر تغییر منو قابل استفاده است بدون نیاز به طراحی دوباره سوئیچ برد و کدنویسی های عجیب و غریب و بیهوده.

  4. #4

    نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)

    سلام
    ممنون از راهنماییتون
    اینکه گفتین بجای visible/hidden دکمه ها اونها رو enable/disable کنم یه مشکلی داره، اینکه نمیخام کاربر بدونه که چه دکمه ای براش غیرفعال هست و به این خاطر از حالت visible/hidden استفاده کردم
    کلیت مطلبی که گفتین با تشکیل جدول چیکار کنم رو متوجه شدم ولی جزئیاتشو نمیدونم دقیق چیکار کنم و چه کدی براشون بنویسم
    میشه لطف کنین اگه امکانش هست نمونه دیتابیس دارین برام بفرستین که ازش الگو بگیرم

  5. #5
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)

    سلام و روز خوش

    راستش از این روش استفاده نمیکنم؛ کلا از هر روشی که پیاده کردنش در اکسس دردسر داشته باشه دوری میکنم مثل استفاده از اکتیوایکس یا api call های غیر ضروری و به همین خاطر هم نمونه ای ندارم که اینجا بگذارم.
    اکسس خوبیش به همین است که خیلی سریع میشه نتیجه گرفت و در مقابل یک چیزهایی هم از دست میدین.

    بصورت موردی میتونم کمک کنم مثلا چجوری یک کنترل به فرم اضافه کنیم و رخداد هم براش تعریف کنیم.

  6. #6
    کاربر دائمی آواتار Mehr@ban
    تاریخ عضویت
    آبان 1389
    محل زندگی
    بچه محله امام رضا
    پست
    562

    نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)

    سلام
    ببخشید بین کلام اساتید تیکه پراکنی میکنم

    ایده و راهنمایی دوست عزیز mazoolagh به نظر جالب و ساده بود و خواسته آقا مهدی هم منطقی

    اگه بخوایم ایندو رو ادغام کنیم و به نوعی کلاه بذاریم سر اپراتور برنامه، امکان داره کپشن دکمه های غیر فعال شده رو تغییر داد تا کارایی اونها برای اپراتور مخفی بمونه؟

    مثلا شرطی نوشته بشه که اگر دکمه‌ای به حالت غیرفعال قرار گرفته شد، متن دکمه به عبارت خاصی تغییر کنه ...
    مثلا محدودیت دسترسی یا همون غیرفعال خودمون

  7. #7
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)

    نقل قول نوشته شده توسط Mehr@ban مشاهده تاپیک
    امکان داره کپشن دکمه های غیر فعال شده رو تغییر داد تا کارایی اونها برای اپراتور مخفی بمونه؟
    مثلا شرطی نوشته بشه که اگر دکمه‌ای به حالت غیرفعال قرار گرفته شد، متن دکمه به عبارت خاصی تغییر کنه ...
    سلام و روز خوش

    میشه ولی خواسته دوستمون این نیست - میخوان که اصلا رندر نشه گویی که نبوده همچین آپشنی.

    چیزی که ایشون میخواد اصطلاحا بهش navigation bar میگن (شبیه همین navigation pane خود اکسس) و ساده اون رو که فقط یک level داره میتونین با navigation form خود اکسس براحتی بسازین و اتفاقا میشه با صفر کردن height هر menu_item اون رو ناپدید کرد (جدای از Hidden کردن)

    ولی اینجا ما با چند سطح منو سروکار داریم و تنها چیزی که شبیه به این کار رو انجام میده treeview هست (از نظر عملکرد و نه ظاهر) که اون هم فقط در اکسس 32 بیت در دسترس هست.

  8. #8

    نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)

    باسلام
    ممنون از وقتی که برای این تاپیک گذاشتین
    من توی سایت های مختلف یه جستجو کردم شبیه به این چیزی که میخامو برای ریبون اکسس پیدا کردم که نمونه دیتابیسTabGroupEN.rarش رو براتون میزارم ملاحظه کنین
    اگه امکانش هست نوع و نحوه کد نویسیشو نگاه کنین بنظر خاصه
    فقط مشکل اینه که اینو برای ریبون اکسس نوشته و متوجه نمیشم چجوری ازش برای فرم منو دیتابیسم استفاده کنم

  9. #9

    نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)

    نقل قول نوشته شده توسط mazoolagh مشاهده تاپیک
    سلام و روز خوش

    میشه ولی خواسته دوستمون این نیست - میخوان که اصلا رندر نشه گویی که نبوده همچین آپشنی.

    چیزی که ایشون میخواد اصطلاحا بهش navigation bar میگن (شبیه همین navigation pane خود اکسس) و ساده اون رو که فقط یک level داره میتونین با navigation form خود اکسس براحتی بسازین و اتفاقا میشه با صفر کردن height هر menu_item اون رو ناپدید کرد (جدای از Hidden کردن)

    ولی اینجا ما با چند سطح منو سروکار داریم و تنها چیزی که شبیه به این کار رو انجام میده treeview هست (از نظر عملکرد و نه ظاهر) که اون هم فقط در اکسس 32 بیت در دسترس هست.

    با سلام
    بحثی که در مورد Level کردینو من با یه برنامه نویسی متفاوت حلش کردم که به شکل آبشاری level ها رو میاره فقط بحث نمایش و عدم نمایش کلید ها برای کاربر خاص هست و البته رندر نشدن اونها
    نمونه کارمومیگذارم که نظرتونو بدین
    ممنون

    Database2.rar

  10. #10

    نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)

    سلام
    کسی نمیدونه چیکار باید بکنم
    خاهشا اگه کسی فایلی داره یا روشی به نظرش میرسه راهنمایی کنه

  11. #11
    کاربر دائمی آواتار Mehr@ban
    تاریخ عضویت
    آبان 1389
    محل زندگی
    بچه محله امام رضا
    پست
    562

    نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)

    اینجا رو یه بررسی کنید شاید به نتیجه برسید
    http://officebaz.ir/%d8%b1%d9%88%d8%...9%d8%b3%d8%b3/

  12. #12
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)

    یک وقت هست که هدف ما رسیدن به یک عملکرد هست که خب برای داشتن منوهای چند مرحله نیاز به این روش که اینجا اومده نیست و راه های ذاتی خود اکسس بهتره و حتی یک سوئیچ برد یا ناویگیشن فرم ساده هم جوابگو هست.
    در واقع تمام عملیات مرحله دوم منو رو میشه به فرم اکشن مرحله یک برد: یعنی تمام عملیات ثبت/حذف/ویرایش و ... میتونه در منوی فرم باشه (نه بعنوان یک ساب منو)

    اما یک وقت هست که هدف ما پیاده کردن یک خواسته خاصی هست حتی اگر راه دیگه (شاید بهتر) هم باشه.
    من کد نمونه های پیوست رو یک بررسی کردم. یکی از اون ها ظاهرا نیاز به addin پولی داره که هیچ - دومی هم که کد همین منو بود که تصاویرش در پست اول هست.

    خب کلیدها همونجور که حدس زده بودم hardcode شدن و کدها به واقع بصورت غیر ضروری پیچیده است و ارزش ادیت نداره بنظرم بخصوص که کوچکترین تغییری در منو نیاز به حجم وسیع ویرایش کد داره.

    برخلاف تصور طراحی این منوها بصورت دینامیک و پارامتریک بمراتب ساده تر هست. من خودم بالشخصه از این کارها نمیکنم ولی بعنوان یک چالش برنامه نویسی و همینطور در بر داشتن نکات مفید آموزشی تصمیم دارم یک نمونه اش رو بنویسم و همینجا پیوست کنم.

  13. #13
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)

    نقل قول نوشته شده توسط Mehr@ban مشاهده تاپیک
    اینجا رو یه بررسی کنید شاید به نتیجه برسید
    http://officebaz.ir/%d8%b1%d9%88%d8%...9%d8%b3%d8%b3/
    ایشون هم البته کاسب هست که در نفس خودش ایرادی بهش نیست ولی جاش هم اینجا نیست!
    پیشترها هم یک سری افرادی اینجا با همین نیت دنبال مشتری میگشتن و وقتی هم رفتن مثل بچه ها پست هاشون رو پاک کردن

  14. #14
    کاربر دائمی آواتار Mehr@ban
    تاریخ عضویت
    آبان 1389
    محل زندگی
    بچه محله امام رضا
    پست
    562

    نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)

    نقل قول نوشته شده توسط mazoolagh مشاهده تاپیک
    ایشون هم البته کاسب هست که در نفس خودش ایرادی بهش نیست ولی جاش هم اینجا نیست!
    پیشترها هم یک سری افرادی اینجا با همین نیت دنبال مشتری میگشتن و وقتی هم رفتن مثل بچه ها پست هاشون رو پاک کردن
    قصدم تبلیغ تجارت و کسب و کار ایشون نبود
    دیدم کار این بنده خدا لنگ مونده، گفتم یه آدرس صرف بدم شاید بتونه کارش رو راه بندازه هرچند با پرداخت وجه ...

    میتونم از طریق پیام خصوصی باهاتون در ارتباط باشم؟

  15. #15
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)

    نقل قول نوشته شده توسط Mehr@ban مشاهده تاپیک
    میتونم از طریق پیام خصوصی باهاتون در ارتباط باشم؟
    پیام خصوصی رو باز میکنم امروز ولی بی دلیل بسته نیست:
    • کلا توقع این هست که پیام باید خیلی سریع پاسخ داده بشه (سریعتر از از تاپیک ها) و این حداقل برای من یکی مقدور نیست و نهایتا دلخوری پیش میاد.
    • در پیام معمولا بحث به تماس تلفنی یا قرار کاری و نهایتا قرارداد و پول ... میکه و این هم از برنامه های من نیست و همون دلخوری مجددا ظاهر میشه.


    --------------------

    در ارتباط با موضوع:
    امروز فرصت کنم بخش اول نمونه رو میگذارم. قدری پیچیده هست بهتره قدم به قدم جلو بریم.

  16. #16
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: طراحی فرم منو اصلی پویا در اکسس (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 تابع ساخت رو اجرا کنین:
    1.png

    پس از این اگر چک کنین میبینین که یک فرم به نام Navigation ساخته شده

    در گام بعدی برای این دکمه ها رویداد میسازیم (با کد مسلما)

    برای راحتی برنامه رو همینجا هم پیوست میکنم
    فایل های ضمیمه فایل های ضمیمه

  17. #17
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: طراحی فرم منو اصلی پویا در اکسس (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



    فرمتینگ کلیدها
    2.png
    البته تعیین استایل دکمه ها با کد هم میسر هست


    و اینهم نمونه ای از عملکرد کلیدها :
    3.png


    کار ما هنوز تمام نشده - تا اینجا فقط کارکرد درست دکمه ها رو ساختیم.
    در گام های بعدی منو رو بتدریج کامل میکنیم جوری که هر sub_menu جداگانه ساخته میشه (از روی پارامترهای طراحی منو)

  18. #18
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)

    برنامه گام دو
    فایل های ضمیمه فایل های ضمیمه

  19. #19
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)

    خب کجا بودیم؟

    حالا منو رو یک پله به سمت کاربردی تر شدن و واقعی تر شدن سوق میدیم.
    اول از همه باید یک جدول برای تعریف اجزا منو بسازیم. در این مرحله فقط caption و action رو تعریف میکنیم.
    منظور از action اسم روتینی هست که باید با رخداد onclick دکمه اجرا بشه.

    طراحی جدول
    31.png


    دیتا نمونه
    32.png
    اینجور قرارداد میکنیم که ParentID آیتم های Level 1 برابر 1- باشه.
    همینجور اگر دقت کنین برای آیتم شماره 5 از سطح 1 منو هیچ ساب آیتم در سطح 2 نداریم ولی action داریم.
    معنی اش این هست که اکشن تعریف شده F50 با رخداد onclick این آیتم باید اجرا بشه.
    برای بقیه دکمه ها با این رویداد منو باز وبسته میشه (همون expand/collapse)



    حالا یک کوئری میسازیم که براساس پارامتر ParentID@ مجموعه آیتم ها رو برگردونه
    33.png


    خروجی نمونه برای ParentID=3
    34.png

    و این هم کارکرد نمونه آیتم 3
    35.png

  20. #20
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: طراحی فرم منو اصلی پویا در اکسس (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


  21. #21
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)

    و اینهم خود برنامه گام 3

    در گام بعدی یاد میگیریم که چجوری برای دکمه ها icon اضافه کنیم
    و در گام های بعد منو رو به فرم login و جدول دسترسی کاربران پیوند میدیم
    فایل های ضمیمه فایل های ضمیمه

  22. #22
    کاربر تازه وارد آواتار zzhkfa
    تاریخ عضویت
    مهر 1389
    محل زندگی
    قم
    پست
    73

    نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)

    سلام علیکم
    دستتون درد نکنه خیلی سورس کاربردی بود، فقط یه نکته:
    اگر بخواهم یکی از منو ها که دارای زیر منو هم هست، بصورت پیشفرض در حالت باز باشد، چه کار باید انجام بدم؟

  23. #23
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)

    مدتی این مثنوی تاخیر شد ...

    قرار بود که به دکمه ها آیکون اضافه کنیم؛
    بهترین روش این هست که تصاویر رو بعنوان resource نگهداری کنیم. اکسس بصورت خودکار هر تصویری رو که در محیط طراحی به فرم یا ریپورت اضافه بشه در جدول سیستمی resource ها نگهداری میکنه و در سراسر برنامه قابل دسترس هست - حتی اگر عکس رو بعدا از طراحی فرم/ریپورت پاک کنین در این جدول باقی میمونه.

    ولی چون ما این تصاویر رو بعنوان پیوست معرفی میکنیم، اکسس اون ها رو در جدول resource ها کپی نمیکنه پس خودمون باید برای اینکار کد بنویسیم.


    نسبت به گام قبلی چند تغییر کوچک داریم:

    در جدول MenuItems فیلد Icon از نوع پیوست رو اضافه کردیم که تصویر دکمه رو قرار هست در خودش نگهداری کنه.
    همینجور فیلد متنی FileName که وجودش ضروری نیست (اطلاعات اون از خود فیلد پیوست قابل استخراج هست) ولی کد تمیزتر و جمع و جورتری خواهیم داشت.
    41.png

    همینجور طراحی کوئری Menu
    42.png


    و حالا از یک فرم برای ثبت اطلاعات MenuItems استفاده میکنیم چون نیاز به کدی داریم که تصاویر رو به جدول Resources اضافه کنه:
    43.png

    نمونه منو:
    44.png

  24. #24
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: طراحی فرم منو اصلی پویا در اکسس (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

  25. #25
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: طراحی فرم منو اصلی پویا در اکسس (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

  26. #26
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)

    برنامه گام چهارم همراه با چند تصویر با فرمتهای مختلف جهت تست و بررسی کارکرد برنامه

    جدول resourceهای اکسس از نوع سیستمی و مخفی است.
    اگر مایل به مشاهده اطلاعات این جدول هستین باید در بخش options تیک های show system objects / show hidden objects رو روشن کنین (بعنوان یادگیری و آموزش فقط)
    فایل های ضمیمه فایل های ضمیمه

  27. #27
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)

    نقل قول نوشته شده توسط zzhkfa مشاهده تاپیک
    سلام علیکم
    دستتون درد نکنه خیلی سورس کاربردی بود، فقط یه نکته:
    اگر بخواهم یکی از منو ها که دارای زیر منو هم هست، بصورت پیشفرض در حالت باز باشد، چه کار باید انجام بدم؟
    سلام
    کافی هست روتین Expand رو فراخوانی کنین - n ردیف منو است
    Private Function Expand(n As Integer)   ' n = clicked button index
    ....
    ....
    End Function

  28. #28

    نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)

    با سلام و خسته نباشد خدمت شما دوست عزیز و تشکر از این آموزش مفیدتون
    حال اگه خواسته باشیم یه فرم را با استفاده از این باتن منوها فراخوانی کنیم چه کار باید بکنیم ؟

  29. #29
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)

    نقل قول نوشته شده توسط fayaz8301614 مشاهده تاپیک
    با سلام و خسته نباشد خدمت شما دوست عزیز و تشکر از این آموزش مفیدتون
    حال اگه خواسته باشیم یه فرم را با استفاده از این باتن منوها فراخوانی کنیم چه کار باید بکنیم ؟
    سلام و روز خوش
    در پست شماره 20 به این موضوع اشاره شده (البته مختصر)؛

    برای هر button که قرار هست کاری انجام بده (باز کردن فرم یا گزارش یا اجرای کد و ...)
    باید یک function پابلیک بنویسین و هر کاری که نیاز دارین در این تابع انجام بدین .

    مثلا در در نمونه پیوست شده، برای کلید پنجم از منو، تابع F50 تعریف شده:
    Screenshot 2024-03-16 125738.png

    و در ماژول utilities (اسم ماژول اهمیتی نداره و میتونه هر اسمی باشه ولی تابع حتما باید public تعریف بشه) این تابع به شکل زیر تعریف شده:
    Public Function F50()
    v = MsgBox("procedure F50")
    End Function


    در این مثال فقط یک msgbox نمایش داده میشه،
    و اگر بخواین فرم یا گزارش باز کنین کافی هست از دستور docmd.openform یا docmd.openreport استفاده کنین.

    ==========
    همچنان میتونین بجای این روش، از navigation control هم که در پرسش قبلی شما مطرح شده استفاده کنین:
    آموزش: راهنمایی در مورد دکمه های نابوری آبشاری در فرم اکسس (barnamenevis.org)

  30. #30

    نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)

    با سلام خدمت اساتید محترم
    اگر خواسته باشیم برای هر یک از این دکمه های آبشاری به کگاربران دسترس بدهیم ، باید چکار کنیم ؟

  31. #31
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    71
    پست
    3,044

    نقل قول: طراحی فرم منو اصلی پویا در اکسس (Dynamic Form)

    نقل قول نوشته شده توسط fayaz8301614 مشاهده تاپیک
    با سلام خدمت اساتید محترم
    اگر خواسته باشیم برای هر یک از این دکمه های آبشاری به کگاربران دسترس بدهیم ، باید چکار کنیم ؟
    سلام دوباره و روز خوش
    اون یک کار مستقل هست و فکر کنم چند نمونه "دسترسی به فرم ها و گزارشها بر اساس کاربر" در همین بخش اکسس خورده.

تاپیک های مشابه

  1. ساخت فرم بصورت تمام صفحه در اکسس
    نوشته شده توسط takhte در بخش Access
    پاسخ: 2
    آخرین پست: چهارشنبه 29 آذر 1391, 19:41 عصر
  2. چگونگی اتصال فرم ها به جداول در اکسس
    نوشته شده توسط پوریا_م در بخش Access
    پاسخ: 3
    آخرین پست: سه شنبه 16 فروردین 1390, 19:16 عصر
  3. گفتگو: تکمیل فرم بک آپگیری اتومات در اکسس
    نوشته شده توسط کوروش بزرگ در بخش Access
    پاسخ: 0
    آخرین پست: جمعه 08 مرداد 1389, 22:27 عصر
  4. سوال: طراحی فرم ها و pageها در ASP.net
    نوشته شده توسط naser2009 در بخش ASP.NET Web Forms
    پاسخ: 1
    آخرین پست: سه شنبه 31 شهریور 1388, 18:16 عصر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •