کلینیک فوق تخصصی اکسس ( کاربرد vba در اکسس )

کلینیک فوق تخصصی اکسس ( کاربرد vba در اکسس )

به اشتراک گذاری اطلاعات کسب شده در اکسس از سایت آفیس و سایت های تخصصی خارجی
کلینیک فوق تخصصی اکسس ( کاربرد vba در اکسس )

کلینیک فوق تخصصی اکسس ( کاربرد vba در اکسس )

به اشتراک گذاری اطلاعات کسب شده در اکسس از سایت آفیس و سایت های تخصصی خارجی

فراخوانی کامند باتن



BUT FIRST YOU MUST change the clik procedure behind the command button from
"Private Sub cmdButton_Click()" to "Public Sub cmdButton_Click()".


تبدیل Private به Public و تامام 


ساخت Navigation Bar با Command Button


انتقال باتن ها به موقعیت جدید و رو به پائین در فرم 


تصور کنید سه کامند باتن ساخته و زیر هم قرار داده اید و بعنوان Menu از آن استفاده می نمائید.


 پراپرتی Name باتن ها را به M0 تا M2 تغییر داده اید.


حال در ذهن تصور کنید زمان کلیک کردن روی اولین باتن بنام M0 ،  زیر آن به اندازه 3 برابر ارتفاع این باتن به سمت پائین انتقال  یابد و بالطبع می بایست پراپرتی Top باتن های M1 و M2 نیز تغییر یابند.


زمان کلیک روی باتن M1 می بایست فاصله ایجاد شده Clear شده و زیر این باتن به اندازه ی 5 برابر ارتفاعش فاصله ایجاد کند بالطبع در موقعیت پراپرتی Top باتن M2 نیز تاثیر گذاراست.


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


در ضمن چنانچه روی باتن M2 کلیک کرده اید که فاصله ایجادشده زمان کلیک کردن دوباره یا کلیک کردن روی باتن دیگر فاصله Clear شده و در صورت کلیک روی باتن دیگر فاصله ی مربوطه ایجاد شود.


برای Clear یا برگشت باتن ها به همان موقعیت اولیه می بایست در رویداد لود فرمی که باتن ها قرار دارند پراپرتی Top آن ها را در متغیرهایی ذخیره کرد.



زمان کلیک روی M0 


M1.Top=M1.Top+3xM1.Heigth

M2.Top=M1.Top+M1.Heigth


زمان کلیک روی M1 ( پاک کردن فاصله ایجاد شده یا به موقعیت اولیه برگرداندن باتن ها )


M0.Top=که چون بالاتر است تغییری ندارد

M1.Top=PrimaryValue ( Store in variable )

یا

پراپرتی Top کنترل M1 باید بشود Top کنترل M0 باضافه یک ارتفاع کنترل M0 و خب باتن ها در اینجا ارتفاعشان یکیست اگر ارتفاع فرق کند کدهای بیشتری احتیاج است 

M1.Top=M0.Top+1×M0.Heigth

Top کنترل M0 که تغییری نمیکند چون در بالاترین موقعیت قرار دارد . TOP کنترل M2 یا سومین باتن میشود TOP خود باتن باضافه 5 برابر ارتفاع کنترل .( 5 چیست ؟  در بالاتر گفته شد )

M2.Top=M2.Top+5×M2.Heigth


در صورتیکه ارتفاع کنترل کامند باتن ها یکی باشد شما احتیاجی به کد نویسی بیشتری ندارید و از Top همان کنترل اول و Heigth هر کنترلی که در آن هستید می توانید برای مقاصد خود  استفاده بنمائید.


حال اگر روی M1 کلیک کردید و فاصله زیر آن ایجاد شد و دوباره روی همان M1 کلیک کردید می بایست فاصله حذف ( البته تغییر موقعیت باتن های بعدی باید از آن یاد کرد ) و کل باتن ها در موقعیت اولیه خودشان قرار بگیرند یعنی همان پراپرتی Top خودشان را که از قبل داشتند. حال چه کاری باید انجام داد؟؟؟؟


چون اگر دوباره روی همان باتن M1 کلیک کنید موقعیت M2 تغییر خواهد کرد و به همان موقعیتی که در اولین کلیک رفته  ، شروع اضافه شدن به پراپرتی TOP خواهد بود یعنی با هر بار کلیک روی باتن M1 باتن M2 به پائین و پائین تر حرکت میکند و این خواسته ی ما چی ؟ نیست.


دقیقا تمام فرآیندهایی که تصور کردم را به همین نحو که گفته شد اجرا کنید تا به پراپرتی ها و عملکردشون مسلط شوید و بدون داشتن سیستم کد درستی را تولید کنید مگر اینکه اشتباه SYNTAX یا نوشتاری یا غلط املائی داشته باشید.


در فرآنید یاد شده در این یادداشت فاصله باتن ها نسبت به هم صفر است اگر بین باتن ها فاصله گذاشته باشید باید آنرا هم در نظر بگیرید ( PADDING ) و به کدتون اضافه کنید.


برای کد نویسی قبل از اینکه از رویدار OnClick هر باتن استفاده کنید باید رویه ی پایلیکی بنویسید که در باتن های 0 تا 2 ( M0 TO M2 ) لوپ بزند و پراپرتی TOP باتن های بعد از باتن فشرده شده را به جلو براند و باتن های قبل از آن  به موقعیت قبلی خود بازگردند.


فرض کنید باتن M1 را فشردید اول عدد آن را استخراج می کنید و در متغیری ذخیره می کند فرضا میشود X=1 


در تصویر پائین از تابع IIF استفاده شده تا اگر عددی از عدد دیگر بزرگترشد خروجی آن چه خواهدبود فرضا اگر 0<0 باشد N را برمیگرداند و اگر 0<1 باشد که TRUE است Y را.

با تابع REPLACE  کاراکترهای بعد ازM را استخراج کردیم یعنی 0 یا 1


می توان تابعی با نام   HandleBtnClk   نوشت و در آن لوپی ایجادکرد و تصویر اول را در نظر بگیرید


فرض کنید سه باتن با نام های M0 M1 M2 دارید باتن M1 را PRESS می کنید انتظار آن است که M0 و M1 ثابت و در موقعیت خود بمانند و باتن M2 به اندازه پراپرتی TOP خودش و 5 برابر ارتفاع باتن M0 ( در اینجا فرض شده ارتفاع باتن ها یکیست و PADDING همه صفر است و دقیقا باتن به همدیگر چسبیده اند ) به پائین و TOP جدید منتقل شود.


آرایه ای به نام (2) BTN تعریف شده که مقادیر 3 ، 5 و 1 را برای ضرب در ارتفاع یک باتن در خود ذخیره میکند فرضا اگر باتن M1 فشرده شد عدد 5 برگردانده شود و در M0.HEIGTH ضرب شود.


For i=0 To 2
Me("M" & i).Top= Me0.Top+M0.Heigth × iif(i>x,btn(x)+i,i)
Next


در لوپ بالا چنانچه M1 فشرده شود با توجه به تابع IIF در تصویر داریم 

x=1, BTN(1)=5


i>x .... 0>1 .... i=0

M0.TOP=M0.TOP+M0.HEIGTH × 0

i>x.....1>1 ....i=1

M1.TOP=M0.TOP+M0.HEIGTH × 1

i>x.....2>1....BTN(1)=5

عدد i را به() BTN اضافه کردیم چون مبدا را از M0.TOP گرفتیم 

M2.TOP=M0.TOP+M0.HEIGTH×7


اگر روی باتن M0 کلیک کنید x برابر 0 با تابع Replace ( البته این تابع را باید در تابع Val بگذارید تا عدد برگرداند ) و (0)BTN برابر 3 میشود ( عدد 3 منظور بین باتن M0 و M1 سه تا باتن فاصله بیافتد ، افتااااااد !!! )


i>x .... 0>0 .... i=0

M0.TOP=M0.TOP+M0.HEIGTH × 0

i>x.....1>0 ....BTN(0)=3

عدد i را به() BTN اضافه کردیم چون مبدا را از M0.TOP گرفتیم 

M1.TOP=M0.TOP+M0.HEIGTH × (3+1)

i>x.....2>0....BTN(0)=3

M2.TOP=M0.TOP+M0.HEIGTH×(3+2)


فقط مشکل اینجاست که اگر شما برای بار دوم و چندم روی باتن کلیک کنید چون TOP آنها در هر بار کلیک  تغییر میکند بقیه باتن ها رو به پائین و پائین تر حرکت یا انتقال داده خواهند شد 


اینجاست که می توانید متغیری تعریف کنید که پراپرتی TAG باتن را به یک تغییر دهد و چک کند چنانچه یک بودBTN(x)+i عمل نکند  آیا امکانپذیر خواهد بود؟ این یک طرح است و می توان متغیری به نام CLICKED از نوع BOOLEAN حتی تعریف کرد.


For i=0 To 2
Me("M" & i).Top= Me0.Top+M0.Heigth × iif(i>x And 

Me("M" & x).Tag=1,btn(x)+i,i)

Me("M" & i).Tag=iif(i=x And Me("M" & x).Tag=0,1,0)

Next

AND بین دو مقایسه فقط در صورتیکه دوطرف TRUE باشد TRUE است در غیر اینصورت جواب FALSE است می توانید با زدن CTRL+G و رفتن به پنجره IMMIDIATE WINDOW امتحان نمائید.


فرض کنیم TAG تمام باتن ها صفر است و برای اولین بار روی باتن M1 کلیک کرده ایم.

Me("M" & i).Top= Me0.Top+M0.Heigth × iif(i>x And 

Me("M" & x).Tag=1,btn(x)+i,i)

Me("M" & i).Tag=iif(i=x And Me("M" & x).Tag=0,1,0)



i=0 , x=1 , M1.TAG=0

i>x , 0>1=FALSE  AND M1.TAG=1 =FALSE ANS=FALSE i=0

M0.TOP=M0.TOP+M0.HEIGTH × 0

i=x , 0=1=FALSE AND M1.TAG=0=TRUE ANS=FALSE

M0.TAG=0

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

i=1 ,  x=1 , M1.TAG=0

i>x , 1>1=FALSE AND M1.TAG=1=FALSE ANS=FALSE i=0

M1.TOP=M0.TOP+M0.HEIGHT × 1

i=x , 1=1=TRUE AND M1.TAG=0=TRUE ANS=TRUE

M1.TAG=1

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

i=2 , x=1  ,  M1.TAG=1

i>x , 2>1=TRUE AND M1.TAG=1=TRUE ANS=TRUR  BTN(x)=5

M2.TOP=M0.TOP+M0.HEIGHT × (5+2)

i=x ,  2=1=FALSE AND M1.TAG=0=FALSE ANS=FALSE

M2.TAG=0

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


اگر دوباره روی M1 کلیک کنیم چه اتفاقی خواهد افتاد.


داریم 


M1.TAG=1


i=0 , x=1 , M1.TAG=1

i>x ,  0>1=FALSE AND M1.TAG=1=TRUE ANS=FALSE i=0

M0.TOP=M0.TOP+M0.HEIGHT × 0

i=x , 0=1=FALSE AND M1.TAG=0=FALSE ANS=FALSE 

M0.TAG=0

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


i=1 , x=1 , M1.TAG=1

i>x ,  1>1=FALSE AND M1.TAG=1=TRUE ANS=FALSE i=1

M1.TOP=M0.TOP+M0.HEIGHT × 1

i=x , 1=1=TRUE AND M1.TAG=0=FALSE ANS=FALSE

M1.TAG=0


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


i=2 , x=1 , M1.TAG=0

i>x ,  2>1=TRUE AND M1.TAG=1=FALSE ANS=FALSE i=2

M0.TOP=M0.TOP+M0.HEIGHT × 2

i=x , 2=1=FALSE AND M1.TAG=0=TRUE ANS=FALSE 

M2.TAG=0


خب طبق تصویری که در ذهن کشیده شد همراه با عملکرد توابع و عملگرهای منطقی بعد از کلیک کردن بار دوم روی باتن M1 پراپرتی TAG تمام کنترل ها به صفر تغییر پیدا نمود.



حال فرض بر این است که اگر یکبار روی باتن M1 کلیک شد و M2 به موقعیت چند برابر HEIGTH کنترل M0 لانچ یا پرتاب شد چنانچه این بار روی باتن M0 کلیک شد چه اتفاقی خواهد افتاد.


در این فرض معلومات تصویر ذهنی ما چنین خواهد بود.

M0.TAG=0

M1.TAG=1

M2.TAG=0

لوپ را ران می کنیم 

i=0 , x=0 , M0.TAG=0

i>x , 0>0=FALSE AND M0.TAG=1=FALSE ANS=FALSE i=0

M0.TOP=M0.TOP+M0.HEIGTH × 0

i=x , 0=0=TRUE AND M0.TAG=0=TRUE ANS=TRUE

M0.TAG=1

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

i=1 , x=0 , M0.TAG=1

i>x , 1>0=TRUE AND M0.TAG=1=TRUE ANS=TRUE BTN(x)=3

M1.TOP=M0.TOP+M0.HEIGTH × (3+1)

i=x , 1=0=FALSE AND M0.TAG=0=FALSE ANS=FALSE

M1.TAG=0

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

i=2 , x=0 , M0.TAG=1

i>x , 2>0=TRUE AND M0.TAG=1=TRUE ANS=TRUE BTN(x)=3

M2.TOP=M0.TOP+M0.HEIGTH × (3+2)

i=x , 2=0=FALSE AND M0.TAG=0=FALSE ANS=FALSE

M2.TAG=0

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



Public Function HandleBtnClk(C As Control)


تابع نوشته شده بالا را میتوان در رویداد کلیک باتن ها گذاشت و از این بازی شیرین که پرتاب باتن های بعدی است ، لذت برد .



aparat


CommandButton.Move method (Access)


expression.Move (LeftTopWidthHeight)


 آرگومان LEFT  در این متد لازم و ضروری است .