فرض کنید باتنی دارید که بعد از تایپ حروفی در تکست باکس کار فیلتر یا جستجو را انجام داده و در صورت یافتن یا ... پیامی را در لیبلی که Visible نیست نمایان میکند و مدت معینی با TimeInterval لیبل به حالت چشمک زن در می آید و بعد از فوکس کردن به تکست باکس دوباره لیبل Hide میشود.
در رویداد کلیک باتن TimeInterval را تنظیم کنید فرضا به 300 میلی ثانیه .... در ضمن نام آبجکت لیبل lblMsg است .
Private Sub Form_Timer()L = L + 1Select Case LCase 1, 3, 5, 7, 9, 11, 13, 15, 17Me.lblMsg.Visible = TrueMe.lblMsg.Visible = FalseCase 2, 4, 6, 8, 10, 12, 14, 16, 18Case 19Me.TimerInterval = 0Me.lblMsg.forecolor = forecolorMe.lblMsg.Visible = TrueEnd SelectEnd SubPrivate Sub TxtSearch_GotFocus()Me.lblMsg.Visible = FalseEnd Sub
زمان بردن جداول به Sql حتما چک کنید فیلدهایی که پرایمری کی نیست و نباید Null باشد پر شده باشد وگرنه خطا میدهد
Int
Bigint
You might want to add a timestamp field to the table as that seems to often resolve this problem.
When a record is saved, Microsoft Access sets the Dirty property to False. When a user makes changes to a record, the property is set to True.
زمان تغییر True و ذخیره False
ComboBox.ItemData property (Access) :
مثال زیر باز شدن گزارش با شرط خاصی مشخص شده، یک لیست MultiSelection است و چنانچه کاربر یک یا چند داده را انتخاب کند و باتن cmdOpenReport را بفشارد گزارش حاوی داده ها ی گرفته شده باز میشود.
expression.Column (Index, Row)
پراپرتی کالمن در آبجکت کمبو و لیست باکس که index اشاره به ستون مورد نظر دارد و Row هم اشاره به ردیف و از صفر شروع میشوند. فرضا شما میخواهید داده ستون دو و ردیف سوم را بگیرید.
.Column(1,2)
زمانیکه پراپرتی MultiSelect کنترل لیست باکس به None تنظیم شود فقط یک آیتم می تواند انتخاب شود و پراپرتی Selected می تواند به True تنظیم شود.وقتی پراپرتی MultiSelect کنترل لیست باکسی به Simple یا Extended تنظیم شود هر کدام یا تمام آیتم های انتخاب شده می تواند پراپرتی Selected برابر True خودش را داشته باشد. پس مشخص شد با Selected می توانید مشخص کنید کدام آیتم یا آیتم ها Select شده اگر True باشد انتخاب میشود و اگر به False تنظیم شود از حالت انتخاب در می آید.
لیست باکس چند انتخابی یا Multi-Selection باند شده به فیلدی همیشه دارای پراپرتی Value مساوی با Null است . می توان از پراپرتی Selected یا مجموعه ItemSelected برای بازیابی اطلاعات آیتم هایی که انتخاب شده اند ، استفاده نمود.
عبارت زیر پنجمین آیتم در لیست را انتخاب ( Select ) می نماید
نام کنترل لیست باکس در اینجا ListBox1 است
Me!Listbox1.Selected(4)=True
در فرم امکان ساخت کنترل کمبو باکسی که MultiSelection باشد ، نیست و فقط در جدول این پراپرتی برای فیلد از نوع کمبو باکس وجود دارد.
Sets or returns the relative record number of a Recordset object's current record.
شماره رکورد مرتبط با رکورد جاری شئ رکورد ست را بر میگرداند و Zero Based است یعنی از صفر شروع میشود چون در فرم کانتینیوس نمی توان ردیف ترتیبی گذاشت برخلاف آبجکت گزارش در نتیجه برای شماره دادن به رکوردها از AbsolutePosition استفاده می نمایند البته با استفاده از BookMark که می بایست BookMark فرم و رکوردست منطبق بشوند و بعد کار اضافه کردن را انجام داد.
یادآوری میشود :
مقدار ویژگی AbsolutePosition از صفر شروع میشود تا رکورد کانت منهای یک ، اگر مقدار این پراپرتی مساوی یا بالاتر از رکوردهای پرشده باشد خطا میدهد با بررسی پراپرتی RecordCount می توانید تعداد رکوردهای پرشده در شئ رکوردست را تعیین بنمائید. حداکثر تنظیم مجاز پراپرتی AbsolutePosition مقدار پراپرتی RecordCount منهای یک است.
مقدار پراپرتی BookMark مشابه record number نیست اشتباه نشود.
می توان پراپرتی BookMark را با فرم هایی برای تنظیم بوک مارکی که بصورت یونیک رکورد خاصی را در جدول یا کوئری تحت فرم مشخص میکند بکار برد.
بوک مارک ها با رکوردهایی که نشان می دهند ذخیره نمی شوند ، فقط در حالی که فرم باز است معتبر هستند. آنها هر بار که یک فرم Bound شده باز می شود ، توسط Microsoft Access دوباره ایجاد می شوند.
پس زمانیکه فرم کانتینیوس که به جدول یا کوئری متصل است یا با عبارت SQL دیتا می گیرد باز میشود رکوردها دارای بوک مارک یونیک و واحدی هستند یا در رکورد ست هر بار که تنظیم میشود بوک مارک جدیدی به ِآن تخصیص داده خواهد شد . اگر رکوردی حذف شود و به بوک مارک مقداری تخصیص داده شود ( در همان زمان حذف ) خطا ایجاد میشود.
TEXTBOX CONTROLNAME :
ROWTEXT
IN CONTROLSOURCE PROPERTY :
=FORMROWNUMBER(ME)
'EOF POSITION AFTER LAST RECORD
DIM FRM AS FORM
DIM RS AS DAO.RECORDSET
SET FRM=ME.RECORDSETCLONE
RS.MOVELAST : RS MOVEFIRST
'ON ERTOR RESUME NEXT
IF NOT (RS.BOF OR RS.EOF) THEN
RS.BOOKMARK=FRM.BOOKMARK
FORMROWNUMBER=RS ABSOLUEPOSITION+1
END IF
SET RS=NOTHING
I HOPE TO WRITE THE CODE CORRECTLY
VARBOOKMARK IS A VARIABLE
VARBOOKMARK AS VARIANT
RS.MOVELAST
VARBOOKMARK=RS.BOOKMARK
DEBUG.PRINT ISEMPTY(VARBOOKMARK)
SN: DCount("*","TableName","[ID]<=" & [ID])
یادداشت :
پراپرتی OptionValue فقط به کنترل های زیر در یک Option Group اعمال میشود.
check box
option button
toggle button
با استفاده از برگه پراپرتی کنترل می توان این پراپرتی را مقدار داد. همینطور از طریق ماکرو یا Vba مگر اینکه بصورت دستی تنظیم کنید یا مقدار دهید.
اولین کنترلی که در Option Group قرار میگیرد مقدار یک را دارد و دومین مقدار عدد صحیح 2 و همینطور ادامه دارد چنانچه کنترل دیگری در این گروپ باشد.
پراپرتی OptionValue زمانی موجود است که کنترل داخل آپشن گروپ قرار داده شود !!! .وقتی که سه کنترل یاد شده در بالا در Option Group نباشد کنترل این پراپرتی را نخواهد داشت
در عوض این چنین کنترل هایی که در Option Group قرار نمی گیرند یک پراپرتی با نام Control Source دارد و مقدار هر کنترل در صورت سلکت شدن True و عدم انتخاب False خواهد بید.
پس چی شد دوستان طبق داکیومنت آفیس اگر شما Option Group نداشته باشید بنابراین پراپرتی Option Value هم نخواهید داشت .
فرضا در رویداد Open فرمی می نویسید که به تکست های موجود در فیلد ( کمبو باکس ) Value بدهد و در رویداد کلیک Option Group می نویسید که در صورت انتخاب هر کدام از کنترل های داخل آن Value که در رویداد Open فرم تنظیم کرده اید را در پنجره Msgbox نمایش بدهد.
---------------------------------------------
در رویداد Form_Open
Me.Controls("ABC").OptionValue = 15876
-------------------------------------
در رویداد کلیک Option Group
MsgBox "The ID for the selected shipper is " & _
Me.Controls("Ship Method Group").Value
--------------------------------------
برای مثال اگر کالمن ( فیلد ) دارای دو مقدار باشد Yes و No یا On و Off استفاده از Option Button کار انتخاب را راحت میکند.اگر کاربر یکی را انتخاب کند باعث عدم انتخاب باتن دیگر میشود پس یعنی فقط یک گزینه را می توان در یک Group انتخاب کرد و انتخاب MutiSelection نخواهید داشت مگر اینکه از Option Group استفاده نکنید و چند کنترل چک باکس تعبیه کنید
در زیر در جدول یک فیلدی ساخته شده با نام AccountClosed و دیتا تایپ YesNo ، همینجا خدمت دوستان عرض میکنم از فارسی نوشتن فیلد خودداری کنید !!!. همانطور که در تصویر زیر آن می بینید پراپرتی بنام CAPTION دارد که فارسی آنرا می توانید آنجا قید کنید دابل کوتیشن هم لازم نیست بگذارید و در تصاویر دیگر نحوه انتخاب OPTION GROUP از دیزاین فرم و کشیدن آن روی فرم را نمایش داده
در جدول شما فیلد موردنظر می تواند کمبو باکس باشد بجای YesNo و چندین آیتم را شامل شود . اگر از آپشن گروپ استفاده کنید و هر کدام از رشته های داخل کمبو را به پراپرتی OPTIONVALUE ارتباط دهید ( احتیاجی به مقدار دادن نیست چون خودشان مقدار می گیرند از یک تا ... همان نام را در آپشن به همان عبارت داخل کمبو تایپ کنید اسپیس ها یا فواصل بین کلمات را هم همانطور که در جدول است بگذارید) زمانیکه جدول را باز میکنید و روی فیلد کلیک میکنید VALUE را می بینید امتحان بنمائید.
در تصویر زیر که از یکی از سایتها کپی شده این OPTION GROUP با استفاده از رویداد AFTER UPDATE ش سابفرم را ریکوئری می کند SUB1.REQUERY
زمانیکه روی یکی از باتن ها کلیک می کنید سابفرم می بایست با توجه به ولیوی آنها فیلتر شود فرضا اگر ALL انتخاب شود باید فیلد SALE تیک خورده ها و نخورده ها (کلی ) در دیتاشیت لیست شود و چنانچه NO SALE انتخاب شود که ولیوی 2 دارد دیتاهایی که SALE آنها تیک نخورده نمایش داده شوند.
[Forms]![frm_Export]![optSelect]=0 ' ALL
[Forms]![frm_Export]![optSelect]=1 ' SALE
[Forms]![frm_Export]![optSelect]=2 ' NO SALE
(
[Forms]![frm_Export]![optSelect]=0
OR
( Sale=-1 AND [Forms]![frm_Export]![optSelect]=1)
OR
(Sale=FALSE AND [Forms]![frm_Export]![optSelect]=2)
)
فرض کنید دکمه ALL را SELECT یا انتخاب میکنید
عبارت اول TRUE
عبارت دوم TRUE AND FALSE =FALSE
عبارت سوم TRUE AND FALSE=FALSE
در نتیجه TRUE OR FALSE OR FALSE میشود TRUE و تمام
اگر دکمه SALE فشرده شود
عبارت اول FALSE چون ولیو باتن صفر نیست و یک است
عبارت دوم TRUE AND TRUE=TRUE
عبارت سوم TRUE AND FALSE = TRUE
در نتیجه FALE OR TRUE OR FALSE میشود TRUE و عبارت TRUE شده نمایش داده میشود.
اگر دکمهNO SALE فشرده شود
عبارت اول FALSE چون ولیو باتن صفر نیست و دو است
عبارت دوم TRUE AND FALSE=FALSE
عبارت سوم TRUE AND TRUE = TRUE
در نتیجه FALSE OR FALSE OR TRUE میشود TRUE و عبارت TRUE شده نمایش داده میشود. ( عبارت سوم TRUE است )
مثال دیگر سوالی که در یک تاپیک پرسیده شده بود :
دارم سعی میکنم فیلتری را روی ستونی به نام BILLED یک کوئری انجام میدهم که فیلد از نوع YESNO است ، با استفاده از کنترل چک باکس رو فرم.
جدول TIMESHEET دارم با اسم TBLTIMESHEET که حاوی اطلاعاتی مثل [DATE] [JOB NUMBER] [EMPLOYEE]
[HOURS] [BILLED] و غیره است ، زمان INVOICE برای JOB NUMBER مشخص گزارشی را برای یک JOB تولید کرده ام ، سپس چک باکسی برای هر رکورد.
من کوئری ساختم از جدول براساس فرم FRMJOBTIME در آن کوئری.یک کنترل تکست باکس روی فرم قرار داده ام برای فیلتر کردن گزارش.خب ، شرط در قسمت CRITERIA زیر ستون JOB NUMBER در کوئری مثل این است :
[Forms]![frmJobTime]![txtJobNum]
که عالی کار میکند.
حال مشکل واقعی من اینجاست :
در واقع میخواد اگر چک باکس تیکش برداشته شد تمام رکوردها نمایش داده شود
بالاخره دوستمون درژانویه سال 2015 جوابش را خودش پیدا کرد .
فرضا داخل کنترل TXTJOBNUM در فرم 1201 تایپ بشود میگوید :
tblTimesheet.[Job Number]) Like " * " & 1201 & " * "
در اینجا چون فیلد JOB NUMBER عددیست از کوتیشن استفاده نشده اگر دیتا تایپ فیلد تکست بود میشد :
tblTimesheet.[Job Number]) Like " '* " & 1201 & " * '"
در کل فرم فیلتر میشود و رکورد یا اگر یونیک نباشد یا پرایمری کی رکوردهایی را نمایش میدهد که JOB NUMBER برابر با 1201 باشد در قسمت بعد AND اضافه کرده و برای فیلد BILLED که صفر ( Uncheck ) یا منفی یک ( Checked ) میگیرد تابع شرطی نوشته با IIF که اگر کنترل چک باکس در فرم با نام CHKUNBILLEDFILTER تیک خورده بود FALSE را بر گرداند یا در غیر اینصورت * را .
tblTimesheet.[Job Number]) Like " '* " & 1201 & " * '" AND BILLED (CHECHBOX=TRUE) LIKE FALSE
عبارت بالا جاب نامبرهای *1201* را می آورد که فیلد بیلد فالز باشد.یعنی تیک چک نداشته باشند.
tblTimesheet.[Job Number]) Like " '* " & 1201 & " * '" AND BILLED (CHECHBOX=FALSE) LIKE *
عبارات بالا را تست کنید و به صحت یا عدم صحت یا کارآیی آنها پی ببرید.
Zero is used to represent false, and
One is used to represent true. For interpretation, Zero is interpreted as false and anything non-zero is interpreted as true.
برای چک باکس و خارج شدن از فیلتر روش استفاده از عبارت در کوئری بشکل زیر است :
Like [Forms]![frmName]![checkBox1] & "*" Or Is Null
So now, if the user does not wish to filter the result by selecting the check boxes, the result will show all data. Hopefully this will help others down the road
برای اینکه اگر یکی از دو تکست باکس txtDateFrom or txtDateTo نال باشد تمام رکوردها نشان داده شود باید غیر از Between ..... And دو تا شرط دیگر اضافه نمود ( دیتا تایپ در جدول از نوع DateTime است )
But you want all rows returned when either txtDateFrom or txtDateTo is Null. In that case you can add 2 conditions to your WHERE
clause:
WHERE
your_date_field Between [Forms]![Search Form]![txtDateFrom] And [Forms]![Search Form]![txtDateTo]
OR [Forms]![Search Form]![txtDateFrom] Is Null
در صورتی فیلترکردن بین دو تاریخ عمل نمیکند که فرمتی که در جدول ذخیره میشود و فرمت در کنترل تکست باکس مشابه نباشد!!! فرضا "/" در جدول ذخیره نشود مثلا کسانیکه فیلد را از نوع تکست انتخاب میکنند برای تاریخ شمسی و INPUT MASK می گذارند ولی "/" در جدول فقط نمایش داده میشود و این در حالی است که "/" در تکست باکس وجود دارد و نمایشی نیست
البته گفته شده اگر زبان به United Kingdom تغییر پیدا کند (آنها فرمت 24 ساعته دارند مثل کشور ما ) ساعت با فرمت 24 ساعته نمایش داده میشود.
Control Panel > Region > Tab : Formats > Date And Time Formats > Change To HH:SS
برای جمع ساعات ذخیره شده در جدول اکسس می طلبد که از Vba استفاده کنید . یک تابع public بنویسید .
نحوه کار بدین صورت است که اول می بایست تک به تک مقادیر h و m و s را بگیرید و با هم جمع بزنید اول از ثانیه شروع بکنید و به اضای هر 60 ثانیه یک عدد به دقیقه اضافه کنید و زمان جمع دقایق می بایست به اضای هر 60 دقیقه یک عدد به ساعت اضافه شود
8:30:15
10:12:30
9:20
در یک کوئری فرضا اختلاف بین دو Time را ذخیره می کنید بنام difftime و یک کوئری دیگر می سازید و عبارت زیر را کپی می کنید البته در تابع زیر تایپ می بایست فرمت date\time باشد وگرنه ارور میدهد یا می بایست date را از تابع حذف کنید.
x : Sum(Total(difftime))
s=15+30=45
m=30+12+20=62
h=8+10+9=27
خارج قسمت با \ بدست می آید فرضا در 60\195 عدد 3 به Minute اضافه میشود و باقیمانده با Mod که طبق عبارت فوق عدد 15 بدست می آید و همان ثانیه است.
45\60=0
195\60=3
45 Mod 60=45
195 Mod 60=15
Use Nz Function
Public Function TotalHours(tm) as date
اگر tm از نوع تکست باشد باید تک تک h ، s و m را با mid Function بگیرید !!! یا تبدیل به فرمت date\time کنید
Dim h,m,s,mm,ss as integer
h=Hour(tm)
m=Minute(tm)
s=Second(tm)
ss=iif(nz(s)\60=0,nz(s),nz(s) mod 60)
If nz(s)\60>0 Then m=m+s\60
mm=iif(nz(m)\60=0,nz(m),nz(m) mod 60)
If nz(m)\60>0 Then h=h+m\60
TotalHours=format$(.....,"Short time")
Exit Function
Second (#10:42:58 PM#)Result: 58Second (#10:14:13 AM#)Result: 13Second (#22/11/2003 10:01:04 PM#)Result: 4
vba/access/concepts/date-time/calculate-elapsed-time
I am writing VBA on Microsoft access
Do anyone know how can i set a value of a form's field by using VBA?
For example, I am writing the VBA code on form A and want to set value to a field in form B (because I haven't learnt how to pass value between forms)
Or
How can i write VBA to open a new form with value set to a particular field?
یا چگونه می توانم Vba بنویسم تا فرم جدیدی را باز کند با مقداردادن به یک فیلد بخصوصی ؟
کسی می تواند کمک کند؟ برای ۴ ساعت داشتم این کار را انجام میدادم و هنوز راه حلی نمی توانم پیدا کنم
متچکرم خیلی زیاد
جواب بزرگوارانی چون ایشان را اینطور داده اند
با هر دو فرمی که باز است این را امتحان کن
زمانیکه در جدول سینگلی که فیلد AutoNumber دارد رکوردی را حذف میکنید دیگر شماره های پشت سر هم را ندارید و می بایست چاره ای بیاندیشید یک راه این است که جدول را در نمای دیزاین باز کنید فیلد AutoNumber را حذف کنید جدول را ببندید و Compact Database را از Option بزنید و دوباره فیلد را به جدول اضافه کنید. برای جداولی که بهم ربط دارند در پیوندها توصیه آفیس را اجرا کنید با عنوان Reset AutoNumber.
Add This Code on Form Close Event whether you add new record or delete, it will recreate the Primary Keys from 1 to Last record.This code will not disturb other columns of table.
alter-table-statement-microsoft-access-sql
Sql : (AutoNumber Field Value )
CurrentDB.Execute "ALTER TABLE yourTable ALTER COLUMN myID COUNTER(1,1)"
متغیرهایی تعریف شده که زمان ارجاع به آن راحت باشید و مقادیری را به آن تخصیص بدهید با Private Type و مشخص کردن نام و دیتا تایپ آن.
Private Type CUSTOM_MSGBOX lTimeout As Long
lExitButton As Long
lInterval As Long
strPrompt As String
End Type
ClassName = Space(256)
' Make sure we spotted a messagebox (dialog)
Private hHook As Long
Public hwndMsgBox As Long
Public lTimerHandle As Long
Public hAppInstance As Long
این یک نمونه کار است هر زمان که توابع API را مطالعه کردید می توانید با چیدمان درست کدها به مقاصد خود دست یابید البته هوک کردن مشکل است اگر خطایی اتفاق بیافتد سیستم هنگ خواهد کرد به WSCRIP.SHELL و POPUT هم می توان مراجعه کرد .
CREATEOBJECT("WSCRIPT.SHELL")
OBJECT.POPUP
Wscript Popup Method vbsedit
Echo Method vbsedit
Wscript.Shell + Shell.Application Objects shell.html
فرضا ساختن مرجع آبجکت یا شئ به یک فولدر با متد NAMESPACE از آبجکت SHELL.APPLICATION
FolderItems.Count property :
Contains the number of items in the collection.
ssfWINDOWS = 36
Dim objShell,objFolder As Object
Set objShell =CreateObject("Shell.Application")
Set objFolder = objShell.NameSpace(ssfWINDOWS)
Set objFolderItems = objFolder.Items
nCount = objFolderItems.Count
اگر کسی کدی داره درباره این موضوع در نظرات کپی کنه تا دیگران هم استفاده کنند برای اینکار از توابع Windows استفاده شده و روش Hook کردن پنجره Msgbox و ارسال پیغام با SendMessageA است.برای ویندوز 32 بیت و 64 روش اظهار تابع فرق میکند.
اگر در نظر سنجی شرکت کنید و موافقت خودتون را در نظرات اعلام کنید به زودی کد خط به خط در اینجا از سایت های خارجی استخراج ودر معرض عموم قرار خواهد گرفت.
MsgBox ( prompt [, buttons ] [, title ] [, helpfile ] [, context ]
Hooks-Win32 application
SetWindowsHookEx :
Installs an application-defined hook procedure into a hook chain. You would install a hook procedure to monitor the system for certain types of events. These events are associated either with a specific thread or with all threads in the same desktop as the calling thread
UnhookWindowsHookEx :
Removes a hook procedure installed in a hook chain by the SetWindowsHookEx function
CallNextHookEx :
Passes the hook information to the next hook procedure in the current hook chain. A hook procedure can call this function either before or after processing the hook information.
CallWndProc :
An application-defined or library-defined callback function used with the SetWindowsHookEx function. The system calls this function before calling the window procedure to process a message sent to the thread
IDOK1
IDCANCEL2
IDYES6
IDNO7
Hookproc(nCode,wparam,lparam)
CbtProc https://
با تابع بالا پیغامی را به پنجره دیالوگ باکس میدهید که Title یا تکست کنترل مورد نظر تنظیم شود
در ویندوز 64 بیت نحوه اظهار کردن یک PtrSafe قبل از Function آمده و در بعضی از آرگومانها بجای تایپ Long از LongPtr استفاده شده.
Private Declare PtrSafe Function MessageBoxL Lib "user32" Alias "MessageBoxW" ( _ ByVal hWnd As LongPtr, ByVal lpText As LongPtr, ByVal lpCaption As LongPtr, _ ByVal wType As Long) As Long Private
'Declaration API functions of User32.DLL. for Office 32 or 64-bit
#If VBA7 Then
Private Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr
Private Declare PtrSafe Function MessageBoxW Lib "user32" (ByVal hwnd As LongPtr, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long
#Else
Private Declare Function GetActiveWindow Lib "user32" () As Long
Private Declare Function MessageBoxW Lib "user32" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long #End If
توابع ویندوزی برای مسیج باکس :
lpText
The message to be displayed. If the string consists of more than one line, you can separate the lines using a carriage return and/or linefeed character between each line.
lpCaption
The dialog box title. If this parameter is NULL, the default title is Error.
#If VBA7 Then
Private Declare PtrSafe Function MessageBoxA Lib "user32" ( _ ByVal hwnd As LongPtr, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long
#Else
Private Declare Function MessageBoxA Lib "user32" ( _ ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long #End If
wType
To indicate the buttons displayed in the message box, specify one of the following
برای مشخص کردن اینکه کدام باتن ها در پنجره Message Box نشان داده شوند از اعداد هگزاگون رزور شده استفاده می کنیم که هر کدام معرف باتنی است.
MB_OK=&H0
MB_OKCANCEL=&H1
MB_YESNO=&H4
MB_YESNOCANCEL=3
To display an icon in the message box, specify one of the following values.
Private Const GWL_HINSTANCE As Integer = (-6)
Private Const HCBT_ACTIVATE As Integer = 5
Private Const WH_CBT As Integer = 5
Private Const EM_SETPASSWORDCHAR = &HCC
Private Const HC_ACTION =0
Private Shared hHook As Integer
The system calls a WH_CBT hook procedure before activating, creating, destroying, minimizing, maximizing, moving, or sizing a window; before completing a system command; before removing a mouse or keyboard event from the system message queue; before setting the input focus;
hHook = SetWindowsHookEx(WH_CBT, AddressOf MsgboxProc,GetModuleHandle(vbNullString),GetCurrentThreadId
Private Declare PtrSafe Function CallNextHookEx Lib "user32" (ByVal hHook As LongPtr, _
ByVal ncode As Long, ByVal wParam As LongPtr, lParam As Any) As LongPtr
Private Declare PtrSafe Function GetModuleHandle Lib "kernel32" Alias _
"GetModuleHandleA" (ByVal lpModuleName As String) As LongPtr
Private Declare PtrSafe Function SendDlgItemMessageA Lib "user32" Alias (ByVal hDlg As LongPtr, ByVal nIDDlgItem As Long, ByVal wMsg As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As LongPtr
Private Declare PtrSafe Function GetClassNameA Lib "user32" Alias (ByVal hwnd As LongPtr, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Public Function NewProc(ByVal lngCode As Long, ByVal wParam As Long, ByVal lParam As Long) As LongPtr
If lngCode < HC_ACTION Then
NewProc = CallNextHookEx(hHook, lngCode, wParam, lParam)
'called correctly.
برای لود کردن آیکون هم باید به پنجره پیامی فرستاد و از توابع ویندوزی استفاده نمود که به آن اشاره میشود.فقط Bitmap اگر PNG باشد باید تبدیل شود که به کدهای خیلی زیاد و پیچیده اس احتیاج است و از بحث اکسس خارج .
WM_SETICON message
wParam
ICON_BIG=1
ICON_SMALL=0
lParam
handle to the new large or small icon. If this parameter is NULL, the icon indicated by wParamis removed.
Public Const WM_SETICON = &H80 Public Const ICON_SMALL = 0 Public Const ICON_BIG = 1
'// LoadImage() image types
Public Const IMAGE_BITMAP = 0
Public Const IMAGE_ICON = 1
Public Const IMAGE_CURSOR = 2
Public Const IMAGE_ENHMETAFILE = 3 '// LoadImage() flags
Public Const LR_DEFAULTCOLOR = &H0
Public Const LR_MONOCHROME = &H1
Public Const LR_COLOR = &H2
Public Const LR_COPYRETURNORG = &H4
Public Const LR_COPYDELETEORG = &H8
Public Const LR_LOADFROMFILE = &H10
Public Const LR_LOADTRANSPARENT = &H20
Public Const LR_DEFAULTSIZE = &H40
Public Const LR_LOADMAP3DCOLORS = &H1000
Public Const LR_CREATEDIBHeader = &H2000
Public Const LR_COPYFROMRESOURCE = &H4000
Public Const LR_SHARED = &H8000
hIcon = LoadImage(0&, IconPath, IMAGE_ICON, 16, 16, LR_LOADFROMFILE) If hIcon<>0 Then
SendMessageA(hWnd, WM_SETICON, 0, ByVal hIcon)
در سیستم آفیس 32 بیت البته
Private Declare Function LoadImageA Lib "user32 (ByVal hInst As Long, ByVal lpsz As String, ByVal dwImageType As Long, ByVal dwDesiredWidth As Long, ByVal dwDesiredHeight As Long, ByVal dwFlags As Long) As Long
------------------------------
مثالی دیگر از MSGBOXHOOKPROC :
SetDlgItemTextA function
Sets the title or text of a control in a dialog box.
SetDlgItemTextA( HWND hDlg, int nIDDlgItem, LPCSTR lpString)
Dim mFlags As VbMsgBoxStyle
Public Function MsgBoxHookProc(ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If uMsg = HCBT_ACTIVATE Then
SetWindowText wParam, mTitle
SetDlgItemText wParam, IDPROMPT,mPrompt
Select Case mFlags
Case vbAbortRetryIgnore
SetDlgItemText wParam, IDABORT, But1 SetDlgItemText wParam, IDRETRY, But2
SetDlgItemText wParam, IDIGNORE,But3
Case vbYesNoCancel
SetDlgItemText wParam, IDYES, But1
SetDlgItemText wParam, IDNO, But2 SetDlgItemText wParam, IDCANCEL,But3
Case vbOKOnly
SetDlgItemText wParam, IDOK, But1
Case vbRetryCancel
SetDlgItemText wParam, IDRETRY, But1
SetDlgItemText wParam, IDCANCEL,But2
Case vbYesNo
SetDlgItemText wParam, IDYES, But1 SetDlgItemText wParam, IDNO, But2
Case vbOKCancel
SetDlgItemText wParam, IDOK, But1 SetDlgItemText wParam, IDCANCEL, But2
End Select
UnhookWindowsHookEx hHook
End If
MsgBoxHookProc = False
End Function
Public Function
------------------------------
مثالی دیگر با استفاده از توابع API
You need to use Windows Hooking API
You must create a CBT hook
Run a Message Box with CBT hook
Catch a HCBT_ACTIVATE message in the Hook procedure
Set new captions for the buttons using the SetDlgItemText function
(example below changes “Yes” and “No” captions to smiles: “:-)” and “:-(” )
Release the CBT hook
Public Sub MsgBoxSmile()
' Set Hook
hHook=SetWindowsHookEx(WH_CBT, AddressOf MsgBoxHookProc,0, GetCurrentThreadId)
'Run MessageBox
MsgBox "Smiling Message Box", vbYesNo, "Message Box Hooking"
End Sub
Private Function MsgBoxHookProc(ByVal lMsg As Long,ByVal wParam As Long, ByVal lParam As Long) As Long
If lMsg = HCBT_ACTIVATE Then
SetDlgItemText wParam, IDYES, ":-)"
SetDlgItemText wParam, IDNO, ":-("
در مثال یاد شده MsgBoxSmile را در رویداد یک باتن بگذارید اگر مشکلی پیش نیاید و پنجره MSGBOX را HOOK نماید ( گفته است که این پنجره شامل دوکلید YES و NO باشد) TEXT داخل این دو باتن تغییر خواهد کرد
البته روش هوک کردن کار درستی نیست بخاطر اینکه زمان کار با کلیدها مسیج های زیادی رد و بدل میشود و چنانچه HWND پنجره درست بدست نیاید کار بیهوده ای خواهد بود و ممکن است سیستم هنگ و در پیش برد برنامه خللی وارد بنماید که مایکروسافت آفیس چنین پیشنهادی را نخواهد داد و عنوان می کنند که اگر کسی راغب است یک فرم بعنوان CUSTOM MESSAGE BOX بسازد و در آنها باتن هایی تعبیه نماید در نتیجه OFFICE هیچوقت پیشنهاد HOOKING را ارائه نخواهد داد....
Private WithEvents Win As WebBrowser
Sub SetWin()
Dim WinShell 'As New Shell32.Shell
Set WinShell = CreateObject("Shell.Application")
Set Win = WinShell.Windows(1)
End Sub
Private Sub Win_CommandStateChange(ByVal Command As Long, ByVal Enable As Boolean)
End Sub
کد زیر دیالوگ باکسی برای گرفتن یک فایل باز می کند
Private Sub lblBrowse_Click()
'declare file dialog with late binding ->
Dim fDialog As Object, strPath As String
Set fDialog = Application.FileDialog(3) 'msoFilePicker
'set parameters ->
Me.wbContent.ControlSource = ""
'initializing the file dialog ->
With fDialog
.AllowMultiSelect = False
.Filters.Clear '
.title = "Please select a file..."
'display the dialog box. If the .Show method returns True
'the user picked a file. If the .Show method returns False
'the user clicked Cancel.
If .show = True Then
strPath = .SelectedItems(1)
Debug.Print "SELECTED_FILE: " & strPath
'set source property to the string containing the full path ->
Me.wbContent.ControlSource = strPath
Me.wbContent.Requery
Else
End If
End With
البته جواب نمیدهد خودتان را خسته نکنید ممکن است برای بعضی در WebBrowser نمایش داده شود.
Me.wbContent.ControlSource = "='" & strPath & "'"
WebBrowserControl.ControlSource Property :
روی چک باکس یا Toggle Button عمل نمیکند ( ControlSource )
استفاده از پراپرتی ControlSource برای نمایش داده در کنترل
نمایش و ویرایش داده متصل به یک جدول کوئری یا عبارت Sql یا نمایش نتیجه یک عبارت .( فرضا حاصلضرب دو تکست باکس یا فیلد از جدول یاکوئری)
You can use the ControlSource property to specify what data appears in a control. You can display and edit data bound to a field in a table, query, or SQL statement. You can also display the result of an expression. Read/write String.
Navigate2 Method --->> internet-explorer
NavigateComplete2 event --->> internet-explorer
expression.DocumentComplete (pDisp, URL)
pDisp ( Required,Object)
A pointer to the IDispatch interface of the window or frame in which the document is loaded.
URL (Required,Variant)
Contains the URL of the loaded document.
Return value : Nothing
ByVal pDisp As Object
ByVal Url As Variant
Private Sub object_DocumentComplete( _ ByVal pDisp As Object, _ ByVal URL As Variant)
Set wb = WebBrowser0.Object
wb.Silent = True
With wb
.Navigate2 "about:blank"
Do Until .ReadyState = 4 '=READYSTATE_COMPLETE
'This is a somewhat inefficient way to wait, but loading a blank page should only take a couple of milliseconds
DoEvents
Loop
.Document.Open
.Document.Write "<!DOCTYPE html><HTML><HEAD><TITLE>My title</TITLE></HEAD><BODY scroll=""auto"" style=""margin: 0px; padding: 0px;"">" & _
"<embed src=""" & fileLocation & """ width=""100%"" height=""100%"" />" & _
"</BODY></HTML>"
.Document.Close
End With
With Me.WebBrowser0.Object.Document.Open
.Write "<html><head></head><body><p>Some content.</p></body></html>"
.Close
End With
Opening A Blank Page
Me.WebBrowser0.ControlSource = "about:blank"
Me.WebBrowser0.Object.Document.parentWindow.execScript ("alert('Your Access Database " & Application.CurrentProject.Name & " rocks!');")
Me.WebBrowser0.Object.Document.body...
<!DOCTYPE html> <!-- saved from url=(0016)http://localhost --> <html> <head>
بخوانید و لذت ببرید
جمع آوری از سایت های مختلف
OnLoad :
WebBrowser1.Navigate ("http://www.vbcity.com/forums/active.asp";) 'Replace with URL
Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
Next
Public WithEvents hDoc As MSHTML.HTMLDocument
Hdoc_ContextMenu=False
می توانید طبق لینک بالا لوپ را باکدهای HtmlDocument انجام بدهید ؟ در نظرات کد و نتیجه آن را مرقوم بفرمائید.
Dim HTML As HTMLDocument
Set HTML = WebBrowser1.Document HTML.All.Item("UNTextbox").Value = "UserName"
HTML.All.Item("PWTextbox").Value = "Password"
HTML.All.Item("LoginButton").Click
ورود داده به باکس UserName :
Me.WebBrowser1.Navigate="Url" ' if be true
Me.WebBrowser1.Document.All("UserName").Value = "tester"
For Each ele In WebBrowser1.document.getelementsbytagname("a")
If ele.innertext = "Log Out" Then
Private WithEvents m_body As MSHTML.HTMLBody
MsgBox "You clicked the page's body", vbInformationPrivate Function m_body_onclick() As Boolean
End Function
Web Browsing Objects htm
WebBrowser.GoForward Method webbrowser
WebBrowser.GoBack Method webbrowser
Me.WebBrowser1.Document.Window.ScrollTo(0, 300)
WebBrowser1.Document.body.Scroll = "no"
CommandStateChange : برای فعال یا غیرفعال کردن دکمه های Forward و Back در مرورگر استفاده می شود . شکل کلی فراخوانی این event بصورت زیر است :
Re: Disable webbrowser
Private Sub WebBrowser1_BeforeNavigate2(ByVa pDisp As Object, URL As Variant, Flags As Variant, TargetFrameName As Variant, PostData As Variant, Headers As Variant, Cancel As Boolean)
If Me.Visible Then Cancel = True
<a href="http://www.stackoverflow.com">http://www.stackoverflow.com</a>
<a href="mailto:test@example.com">mailto:test@example.com</a>
Support HTML in Rich Text Control :
<div>,<font>,<strong>,<em>,<u>,<ol>,<ul>,<li>,<blockquote>
<font>: face, size, color, style(with BACKGROUND-COLOR only)
<div>: align, dir
You can't select 11pt, because Access Richtext (actually HTML) doesn't store point sizes, but a fixed set of <font size=1> to <font size=7>.
strText = "<div><font face=Arial size=2>" & strText & "</font></div>"
The following table shows supported rich text formatting options:
Font name
Font Size
Bold
Italic
Underline
Align Left
Center
Align Right
Numbering
Bullets
Font Color
Text Hilight Color
Decrease Indent Or Increase
Left-To-Right
Right-To-Left
<h1>The span element</h1>
<p>My mother has
Private Sub cmdYellow_Click() Me.txtColored = MakeYellow(Me.txtEnter) End Sub
Public Function MakeYellow(TextToColor As String) As String
'Sets background shading yellow MakeYellow = "<div><font style='BACKGROUND-COLOR:#FFFF00'>" & TextToColor & "</font></div>"
End Function
<div align=justify>Your <strong>Rich Text</strong> goes here.</div>
<ol></ol>
<ul></ul>
<blockquote></blockquote>
Sub forEachExit()Dim element As VariantDim animals(0 To 5) As String'We have created an array that can hold 6 elementsanimals(0) = "Dog"animals(1) = "Cat"animals(4) = "Snake"animals(2) = "Bird"animals(3) = "Buffalo"'Here we fill each element of the arrayanimals(5) = "Duck-billed Platypus"For Each element In animals'print each element to the immediate window'iterates over the animals collectionDebug.Print elementEnd SubIf element = "Buffalo" Then Exit For'if, at any point, the element becomes equalNext
The output to the immediate window will be (we exited the loop before all items could be printed):
Dog Cat Bird Buffalo |
Dim MyArray() As String
ReDim Preserve MyArray(2)
Public Function HadleOpenForms()
Dim arr() As String
Redim Preserve arr(Forms.Count)
If forms.Count Then
For i=0 To Forms.Count-1
' quotation-marks-in-string-expressions
Arr(i)="" & Forms(i).Name & ""
x=x & iif(x="",",","") & Arr(i)
Next
Debug.Print x
Else
Exit Function
End If
End Function
تابع بالا را تست کنید چنانچه باید اصلاح شود در نظرات این یادداشت قید کنید و اگر درست است زمانیکه فرم هایتان بصورت Tabbed Document باز است اجرا و نتیجه را در نظرات کپی کنید ( در پنجره immidate window محیط vba اکسس اگر تابع درست عمل کند و خطا ندهد ، چاپ میشود)
dim intx as integerdim intCount as integerintCount = Forms.count-1for intX= intCount to 0 step -1docmd.close acform,forms(intX).namenext
Arr=Array("...","....","....")
CountOpenFrms = Application.Forms.Count
SysCmd شامل Action و دوتا آرگومان است کد زیر
مقدار عددی را برمی گرداند که مشخص میکند Object
باز است یا بسته و یا .....
ObjState = SysCmd(acSysCmdGetObjectState, _
Application.CurrentObjectType, _
Application.CurrentObjectName)
vba/api/access.acsyscmdaction
Sub ActiveObjects()
Dim frm As Form, ctl As Control
' Return Form object pointing to active form.
Set frm = Screen.ActiveForm
MsgBox frm.Name & " is the active form."
' Return Control object pointing to active control.
Set ctl = Screen.ActiveControl
MsgBox ctl.Name & " is the active control " _ & "on this form."
End Sub
در کد بالا با مسیج باکس نام فرم فعال و نام کنترل فعال را نمایش میدهد.
علائم بالا برای SendKeys اسپشیال و ویژه یا بعبارتی رزروشده هستند ، و باید داخل کروشه باشند و داخل براکت محصور می شوند
SendKeys "^{Tab}"
اجرای باتنی در سابفرم بدون کلیک روی آن
Public Function New_Main() As Form Set New_Main = New Form_frmMain End Function Sub Test() Dim mm As Form Set mm = New_Main Debug.Print mm.Controls.Count With mm.Form("frmSub") Debug.Print .Controls.Count Debug.Print .Controls("CommandButton1").Enabled .Form.CommandButton1_Click End With End Sub
برای Windowse 64 Bit قبل از فانکشن PtrSafe قرار دهید و Long هم به LongPtr
Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function EmptyClipboard Lib "user32" () As LongPrivate Declare Function CloseClipboard Lib "user32" () As LongSub ClearClipboard3()OpenClipboard (0&)EmptyClipboardCloseClipboardEnd Sub
GetData از DataObject Library :
hCap = capCreateCaptureWindow("Take a Camera Shot", WS_CHILD Or WS_VISIBLE, 0, 0, PicWebCam.Width, PicWebCam.Height, PicWebCam.hWnd, 0)
If hCap <> 0 Then
Call SendMessage(hCap, WM_CAP_DRIVER_CONNECT, 0, 0)
Call SendMessage(hCap, WM_CAP_SET_PREVIEWRATE, 66, 0&)
Call SendMessage(hCap, WM_CAP_SET_PREVIEW, CLng(True), 0&)
End If
|
For Each Ctl In Me.Controls
If Ctl.ControlType=(acTextBox Or acComboBox) Then
'DO SomeThing
Next
'If Ctl.ControlType=acTextBox Or Ctl.ControlType=acComboBox
لوپ در کنترلهای یک سابفرم :
در خط اول در کنترل های فرم می گردد چنانچه TypeName آن SubForm بود میرود به Form آن و تمام کنترل ها را در پنجره immidiate window محیط Vba نمایش میدهد ( Ctrl+G)
For Each ctl In frm.Controls
If TypeName(ctl) = "SubForm" Then
Debug.Print ctl.Name & " is a SubForm"
For Each ctlSub in ctl.Form.Controls
Debug.Print ctlSub.Name
Next
End If
Next
حال در جواب سوال بعد از ایجاد لوپ
Ctl.BackColor = IIf(Ctl.Name = Screen.ActiveControl.Name, 8454143, 16777215)
البته در کنترل تب ، تب هایی وجود دارد و هر تب فقط یک پیج دارد رفرنس به تب خاص و پیج حاوی کنترل ها ( فرضا نام تب کنترل TabCtl0 باشد.)
iTabPage=0 پیج ایندکس تب اول صفر است
For Each Ctl In TabCtl0.Pages(iTabPage).Controls
'iTabPage=iif(iTabPage>15,0,iTabPage=iTabPage+1)
For i=0 To TabCtl0.Pages.Count -1 لوپ در پیج ها
ControlType Property :
acBoundObjectFrame | Bound object frame |
acCheckBox | Check box |
acComboBox | Combo box |
acCommandButton | Command button |
acCustomControl | ActiveX (custom) control |
acImage | Image |
acLabel | Label |
acLine | Line |
acListBox | List box |
acObjectFrame | Unbound object frame or chart |
acOptionButton | Option button |
acOptionGroup | Option group |
acPage | Page |
acPageBreak | Page break |
acRectangle | Rectangle |
acSubform | Subform/subreport |
acTabCtl | Tab |
acTextBox | Text box |
acToggleButton | Toggle button |
TypeName(Ctl)
Ctl.ControlType
If TypeOf Ctl is .....