یادداشت های برنامه نویسی



احتمالأ برای شما پیش آمده باشد زمانی که برنامه ای با نرم افزار Access می سازید، بخواهید فرم اصلی بصورت تمام صفحه باشد و از نرم افزار Access خبری نباشد. برای این کار مراحل زیر را دنبال کنید:

1- در روال form_open فرم مربوطه ، جهت پنهان نمودن Menu های Access و . کد زیر را درج نمائید:

Private Sub Form_Open(Cancel As Integer)
DoCmd.SetWarnings False
On Error GoTo 1

            DoCmd.ShowToolbar "ribbon", acToolbarNo
            CommandBars.ActiveMenuBar.Enabled = False

            CurrentDb.Properties("ShowDocumentTabs").Value = False
            Application.SetOption "Show Status Bar", False

            'select the navigation pange
            Call DoCmd.NavigateTo("acNavigationCategoryObjectType")
            'hide the selected object
            Call DoCmd.RunCommand(acCmdWindowHide)
            DoCmd.Maximize

1: End Sub

با روال بالا، زمانی که فرم مربوطه باز می شود بصورت کامل خواهد بود، البته پس از یکبار اجرا باید برنامه را کامل ببندید و دوباره باز کنید تا حذف Tab ها هم عمل کند. در ضمن خواص Pop up و modal فرم هم باید روی No تنظیم شده باشند.

پس از بستن فرم، باید همه چیز سر جای خودش برگردد وگرنه شما در برنامه Access خود menu و . را نخواهید دید. برای اینکار دستورات قسمت 2 را بنویسید

2- در روال form_close فرم مربوطه کد زیر را درج نمائید :

Private Sub Form_Close()
DoCmd.SetWarnings False
On Error GoTo 1

            DoCmd.ShowToolbar "ribbon", acToolbarYes
            CommandBars.ActiveMenuBar.Enabled = True

            CurrentDb.Properties("ShowDocumentTabs").Value = True
            Application.SetOption "Show Status Bar", True

            Call DoCmd.SelectObject(acTable, , True)
1: End Sub

امیدوارم مطلب فوق در بهبود برنامه نویسی شما مؤثر بوده باشد. البته تغییر آی Access و . نیز به ظاهر کار بسیار کمک خواهد کرد که در مطالب بعدی حتمأ درج خواهد گردید.


در برنامه های ساخته شده توسط نرم افزار Access شاید نیاز باشد در قسمتی از برنامه با زدن یک دکمه، My Computer باز شود و مسیر دلخواه ما را نمایش دهد و بتوانیم محتویات آن فولدر یا درایو را ببینیم. برای اینکار از کدهای زیر می توان استفاده نمود:

Private Sub Command0_Click()

       Dim Path

       Path = "D:\"

       Shell "cmd /c start """" explorer.exe " & Path, vbHide

End Sub 


Private Sub Command1_Click()

       Dim Path

       Path = "E:\New folder"

       Shell "cmd /c start """" explorer.exe " & Path, vbHide

End Sub 

البته می توان صفحه Explorer را در خود فرم Access تعریف نمود تا بدون اینکه My Computer باز شود، در همان فرم Access بتوان محتویات را مشاهده نمود. برای این منظور در فرم Access یک کنترل Web browser تعریف نموده و نام آنرا WebBrowser1 قرار دهید. سپس می توانید کد زیر را در روال کلیک Command0 قرار دهید:
Private Sub Command0_Click()
       Dim Path
       Path = "E:\New folder"
       Me.WebBrowser1.ControlSource = "='" & Path & "'"
End Sub
البته این موارد صرفأ ایده هایی هستند که با خلاقیت می توان استفاده های بیشتری از آنها نمود

یکی دیگر از نیازهای ثبت لاگ های برنامه های ساخته شده که چند یوزر روی آن کار می کنند IP سیستمی است که با آن برنامه باز شده و یا ویرایش می شود. برای بدست آوردن IP سیستم بهتر است ابتدا کد مربوط به پیدا کردن IP در یک فانکشن تعریف شده، سپس در هر کجای فرم که نیاز بود از نام فانکشن استفاده نمود:

Public Function getMyIP()

   Dim myWMI As Object, myobj As Object, itm

   Set myWMI = GetObject("winmgmts:\\.\root\cimv2")

   Set myobj = myWMI.ExecQuery("Select * from Win32_NetworkAdapterConfiguration Where IPEnabled = True")

   For Each itm In myobj

        getMyIP = itm.IPAddress(0)

        Exit Function

   Next

End Function


me.text1=getMyIP

امیدوارم این موضوع نیز مفید واقع شود


در زمانی که یک برنامه Access در شبکه Share شده و Userهای زیادی از آن استفاده می کنند، شاید نیاز داشته باشید در ثبت رکوردهای جداول خود Log داشته باشید و بفهمید چه رکوردی توسط چه User و در چه زمانی ویرایش شده است. روش ثبت همراه با پیغام تأئید در مطالب بعدی ذکر خواهد شد اما فعلأ به موضوع Username کاربری که در حال ویرایش رکوردها است می پردازیم.

جهت پیدا کردن User جاری سیستم کافی است در هر قسمت از برنامه که نیاز به استفاده از Username سیستم می باشد عبارت زیر را درج نمائید:

Environ("Username")

me.log=Environ("Username") & " " & Now

امیدوارم این مطلب نیز مفید واقع شده باشد


پیرو مطلب تمام صفحه کردن فرم های ساخته شده توسط نرم افزار Access و حذف ribbon و menu bar و . ، شاید بدنبال این باشین که بخواین در زمان اجرای برنامه و لود شدن اولین فرم، آی Access به آی مورد دلخواه شما تغییر پیدا کنه. البته می دونم که اینکار رو می تونید در قسمت Option/application icon انجام بدین ولی مشکل اینجاست که با جابجا شدن برنامه یا انتقال از کامپیوتری به کامپیوتر دیگر، این آی عمل نخواهد کرد.

راهکار مناسب اینست که خود فایل Access و آی مربوطه در یک پوشه قرار داده شوند (البته درون پوشه می توانید یک فولدر بنام Data داشته باشید و آی را درون آن قرار دهید) و سپس در روال form_open به فرم دستور دهید از مسیر جاری برنامه (حالا فرقی نمی کند روی کدام درایو یا کامپیوتر باشد، هر جا که فایل Access شما باشد بنام مسیر جاری شناخته می شود) آی را بخواند و در فرم استفاده کند. برای اینکار کدهای زیر را در فرم اصلی برنامتان که از ابتدا تا آخر باز است وارد نمائید، البته می تواند آنرا بصورت ماژول دربیاورید و در تمام فرم ها استفاده کنید:

Private Sub Form_Load()

        ' other codes.

        ChangeProperty "AppIcon", dbText, CurrentProject.Path & "\\Data\myicon.ico"

        Application.RefreshTitleBar

      ' other codes.

End Sub



Function ChangeProperty(strPropName As String, varPropType As String, varPropValue As Variant) As Integer

Dim dbs As DAO.Database

Dim prp As DAO.Property

Set dbs = CurrentDb

On Error GoTo PROC_ERROR

dbs.Properties(strPropName) = varPropValue

ChangeProperty = True

PROC_EXIT:

    On Error Resume Next

    Set prp = Nothing

    Set dbs = Nothing

    Exit Function

PROC_ERROR:

If Err.Number = 3270 Then

    Set prp = dbs.CreateProperty(strPropName, varPropType, varPropValue)

    dbs.Properties.Append prp

    Resume Next

Else

    ChangeProperty = False

    Resume PROC_EXIT

End If

End Function


Sub seticon()

     ChangeProperty "AppIcon", dbText, CurrentProject.Path & "\\Data\myicon.ico"

    Application.RefreshTitleBar

End Sub

در اینجا من در کنار نرم افزار Access خودم که فرقی نمی کنه تو چه پوشه و یا تو چه درایوی باشه، یک فولدر Data قرار دادم و داخل اون آی بنام myicon.ico را قرار داده ام و برنامه در زمان اجرا این آی رو بجای آی اصلی Access استفاده می کنه. شما حتی می تونید آی رو در کنار برنامتون قرار بدین و تو پوشه Data هم نزارید که در این صورت باید در کد بالا Data\\ حذف بشه
امیدوارم این مطلب هم براتون کارائی لازم رو داشته باشه

احتمالأ برای شما پیش آمده باشد زمانی که برنامه ای با نرم افزار Access می سازید، بخواهید فرم اصلی بصورت تمام صفحه باشد و از نرم افزار Access خبری نباشد. برای این کار مراحل زیر را دنبال کنید:

1- در روال form_open فرم مربوطه ، جهت پنهان نمودن Menu های Access و . کد زیر را درج نمائید:

Private Sub Form_Open(Cancel As Integer)
DoCmd.SetWarnings False
On Error GoTo 1

            DoCmd.ShowToolbar "ribbon", acToolbarNo
            CommandBars.ActiveMenuBar.Enabled = False

            CurrentDb.Properties("ShowDocumentTabs").Value = False
            Application.SetOption "Show Status Bar", False

            'select the navigation pange
            Call DoCmd.NavigateTo("acNavigationCategoryObjectType")
            'hide the selected object
            Call DoCmd.RunCommand(acCmdWindowHide)
            DoCmd.Maximize

1: End Sub

با روال بالا، زمانی که فرم مربوطه باز می شود بصورت کامل خواهد بود، البته پس از یکبار اجرا باید برنامه را کامل ببندید و دوباره باز کنید تا حذف Tab ها هم عمل کند. در ضمن خواص Pop up و modal فرم هم باید روی No تنظیم شده باشند.

پس از بستن فرم، باید همه چیز سر جای خودش برگردد وگرنه شما در برنامه Access خود menu و . را نخواهید دید. برای اینکار دستورات قسمت 2 را بنویسید

2- در روال form_close فرم مربوطه کد زیر را درج نمائید :

Private Sub Form_Close()
DoCmd.SetWarnings False
On Error GoTo 1

            DoCmd.ShowToolbar "ribbon", acToolbarYes
            CommandBars.ActiveMenuBar.Enabled = True

            CurrentDb.Properties("ShowDocumentTabs").Value = True
            Application.SetOption "Show Status Bar", True

            Call DoCmd.SelectObject(acTable, , True)
1: End Sub

امیدوارم مطلب فوق در بهبود برنامه نویسی شما مؤثر بوده باشد. البته تغییر آی Access و . نیز به ظاهر کار بسیار کمک خواهد کرد که در مطالب بعدی حتمأ درج خواهد گردید.


زمانی که برنامه ساخته شده توسط Access از فونت خاصی که شاید بر روی همه سیستم ها نصب نباشد استفاده کند، نیاز داریم قبل از استفاده از برنامه فونتها بصورت اتوماتیک بر روی سیستم نصب شوند. برای اینکار بهتر است فونتهای برنامه را از قبل در پوشه Dataی برنامه که پوشه فونت در آن قرار داده شده کپی کرد (قبلأ گفته شد که این پوشه Data همیشه کنار برنامه اصلی قرار دارد). در کد نویسی برنامه هم می توان تعریف نمود هر بار در زمان اجرای برنامه این فونت را از مسیر بالا نصب نماید.

نمونه برنامه نصب فونت در زیر قرار داده شده که به تناسب برنامه اجرائی می توان آنرا تغییر داد و یا از دستورات مربوطه در قسمتهای دیگر برنامه استفاده نمود:

Install Font

ابتدا یک فرم ساخته و کنترل های زیر را در آن قرار دهید:

Textbox: txtPath

List Box: lstFonts

Button: btnFontInstall

در زمان لود شدن فرم، برنامه بصورت اتوماتیک به پوشه Data\Font که در مسیر جاری برنامه قرار دارد می رود و فونت های درون این پوشه را در لیست باکس قرار می دهد. سپس می توان با انتخاب فونت از لیست و زدن دکمه Install آنرا نصب نمود. پس از ساخت فرم و قرار دادن کنترل ها، کد زیر را بصورت کامل در قسمت کد نویسی برنامه وارد کنید:

Option Compare Database

Option Explicit

Private Declare PtrSafe Function AddFontResource Lib "gdi32.dll" Alias "AddFontResourceA" (ByVal lpFileName As String) As Long


Private Sub btnFontInstall_Click()

    InstallFont

End Sub


Private Sub Form_Load()

On Error GoTo 1

    Dim fs, fl, f, X As Variant

    Dim Path As String

        Path = Application.CurrentProject.Path & "\Data\Font\"

        txtPath = Path   

        LstFonts.RowSourceType = "Value List"

        LstFonts.RowSource = ""

        Set fs = CreateObject("Scripting.FileSystemobject")

        Set fl = fs.GetFolder(Path)

        Set f = fl.Files

        For Each X In f

            LstFonts.AddItem X.Name

        Next

1: End Sub


Sub InstallFont()

  Dim Result As Long

  Result = AddFontResource(LstFonts)

  MsgBox Result & " fonts added to windows font directory"

End Sub


Windows Search

ما در این پست قسمت Search گوشه بالای صفحه Explorer ویندوز رو شبیه سازی می کنیم. درایو رو انتخاب می کنیم و مطلب، فایل و . رو در قیمت Search می نویسیم و لیست موارد Search شده در پنجره Explorer به نمایش درخواهد آمد. برای انجام اینکار فرم بالا رو طراحی کنید و در اون کنترل های زیر رو قرار بدید:

Combobox: CombDrives

Textbox: txtSearch

Button: btnSearch

و حالا کدهای زیر رو در روال های مشخص شده فرم و دکمه قرار دهید:

Private Sub Form_Load()

    GetDrives

End Sub


Private Sub btnSearch_Click()

    Dim txtDrive As String

    txtDrive = Me.CombDrives & ":\"

    Call Shell("explorer.exe " & Chr(34) & "search-ms:query=" & txtSearch & "&crumb=location:" & txtDrive, vbNormalFocus)

End Sub


Sub GetDrives()

    Dim fs, dr, x As Variant

    CombDrives.RowSourceType = "Value List"

    Set fs = CreateObject("Scripting.FileSystemobject")

    Set dr = fs.Drives

    For Each x In dr

        CombDrives.AddItem x.DriveLetter

    Next

    CombDrives.Value = CombDrives.ItemData(0)

End Sub



در این تکنیک استفاده از Open File Dialog و انتخاب فایل و همچنین روش اجرای برنامه های اجرائی از داخل کدهای VBA Access نمایش داده می شود.

برای این منظور ابتدا یک فرم همانند فرم زیر ساخته و کنترل های زیر را در آن قرار دهید:

open file dialog 1

form1:

button: btnChooseFile

button: btnGo

textbox: txtApplicationName

حالا کدهای زیر را در روال های فرم وارد نمائید:

Private Sub btnChooseFile_Click()

    Dim ofd As Object

    Dim varfile As Variant

    Me.txtApplicationName = ""

    Set ofd = Application.FileDialog(3)

    ofd.AllowMultiSelect = False

    ofd.Title = "Please select one application (.exe)"

    ofd.Filters.Clear

    ofd.Filters.Add "Application (*.exe)", "*.exe"

    ofd.InitialFileName = "C:\Program Files\Internet Explorer\iexplore"

    If ofd.Show = True Then

        For Each varfile In ofd.selecteditems

            Me.txtApplicationName = varfile

        Next varfile

    End If

End Sub


Private Sub btnGo_Click()

    Call Shell(Me.txtApplicationName, vbNormalFocus)

End Sub

در این برنامه ابتدا با زدن دکمه انتخاب فایل، Application.FileDialog اجرا شده و چون فیلتر این Dialog در کدها پسوندهای .exe معرفی شده، لذا فقط می توان فایل های exe یا همان Application ها را انتخاب نمود.

با InitialFileName می توان برای Dialog تعریف نمود که در ابتدا در چه مسیری باز شود.

open file dialog 2

مرحله بعد selecteditems می باشد که با آن نام فایل انتخاب شده استخراج و در Textbox قرار می گیرد. با فرمان .Show = True در صورتی که فایلی انتخاب نشود خطائی نیز رخ نخواهد داد و در آن صورت مسیر فایل درون Textbox قرار می گیرد.

با زدن دکمه Go، فرمان Call Shell اجرا شده و فایل اجرائی مورد نظر را فراخوانی می کند.

open file dialog 3

از این تکنیک در قسمتهای مختلفی در برنامه های Access می توان استفاده نمود و ضمنأ با توجه به مورد می توان بدلخواه شرایط Dialog را نیز تغییر داد.


این مطلب را با یک مثال شروع می کنم:
ما از لیست اجناس یک جنس را انتخاب می کنیم و با زدن دکمه ، ضمن بسته شدن لیست، باید نام جنس و قیمت در فاکتور بیافتد.
برای این منظور ابتدا دو فرم ساخته و کنترل های زیر را در آنها قرار دهید:

Transfer Data between two forms


frm_TransferData1:
TextBox: txtName
TextBox: txtPrice
ListBox:  lstKala
button:   btnTransfer

frm_TransferData2:
TextBox: txtName1
TextBox: txtPrice1
button:   btnTransfer1
در ListBox فرم اول، باید در 2 ستون تعدادی قیمت و نام کالا وارد نماید. در اینجا ستون اول قیمت است و ستون دوم نام کالا
حالا کدهای زیر را در روالهای فرمها وارد نمائید:
Form1---------------------------------------------------------------
Private Sub btnTransfer_Click()
    DoCmd.OpenForm "frm_TransferData2"
    Forms![frm_TransferData2]![txtName1] = Me.txtName
    Forms![frm_TransferData2]![txtPrice1] = Me.txtPrice
    DoCmd.Close acForm, "frm_TransferData1"
End Sub

Private Sub lstKala_Click()
    Dim i As Integer
    i = Me.lstKala.ListIndex
    Me.txtPrice = Me.lstKala.Column(0, i)
    Me.txtName = Me.lstKala.Column(1, i)
End Sub

Form2----------------------------------------------------------------
Private Sub btnTransfer1_Click()
    DoCmd.OpenForm "frm_TransferData1"
End Sub
حالا فرم 1 را اجرا کنید و با انتخاب کالا از لیست باکس و زدن دکمه انتقال، نام کالا و قیمت به فرم دوم که اصطلاحأ فاکتور است وارد می شود و فرم نیز بسته می شود. در این مطلب، 2 هدف پیگیری شده، یکی خواندن و استفاده از هر دو ستون لیست باکس و دیگیری انتقال اطلاعات بین 2 فرم.
قرم دوم نیز می تواند همانند فرم اول دارای لیست باکس باشد و اطلاعات بجای انتقال به TextBox ها به ListBox منتقل شود.
این موارد صرفأ تکنیک هایی است که می توان در برنامه سازی Access از آنها استفاده نمود
امیدوارم این تکنیک ساده مفید واقع شده باشد

آخرین ارسال ها

آخرین وبلاگ ها

آخرین جستجو ها