PDA

View Full Version : مقاله: تنظیم خصوصیات برنامه در زمان اجرا و از طریق VBA



e601
سه شنبه 17 دی 1387, 12:35 عصر
با سلام
در این تاپیک قصد دارم مباحثی رو در باب تغییر محیط کاری برنامه ها بصورت دینامیک و پویا و از طریق کدهای ویژوال بیسیک مطرح کنم و امیدوارم که مفید هم واقع بشه.

سرفصلهای این مقاله عبارتند از:
1. تنظیم خصوصیات راه اندازی یا همون گزینه هایی که در قسمت Tools>Startup تنظیم میکنیم
2. تنظیم گزینه های پیش فرض برنامه یا بعبارتی همونهایی که در قسمت Tools>Options مشخص میکنیم
در صورت تمایل دوستان به ادامه تاپیک گریزی هم به مسائل زیر خواهم زد:
3. ایجاد و اضافه کردن یک خصوصیت جدید و افزودن آن به کلکسیون Properties برنامه
4. کامپایل شرطی برنامه

موارد قابل توجه:
1. حتما در مورد مباحث مطروحه نظر بدین و بعبارتی اگه این گفته ها مفید هست اعلام کنین تا من هم به یک دید کلی برسم و بدونم که فقط واسه خودم حرف نمیزنم!!!!!!!!!!!!
2. از ارسال پستهای انحرافی خودداری بشه
3. از همه دوستانی که صاحبنظرن و به قولی دستی به آتش دارن دعوت میکنم که در بحث شرکت کنن و بار فنی تاپیک رو بالا ببرن

با تشکر...

e601
سه شنبه 17 دی 1387, 19:26 عصر
با سلام

همونطوری که در پست اول خدمت دوستان گفتم در بخش اول در مورد تنظیم خصوصیات راه اندازی برنامه بحث خواهد شد.

با یه توضیح مقدماتی شروع میکنیم...

همونطوری که همه اطلاع داریم با استفاده از منوی Tools و انتخاب گزینه Startup امکان تنظیم خصوصیات راه اندازی برنامه رو خواهیم داشت. با توجه به اینکه این تنظیمات دستی هست و ما بعد از تحویل برنامه به مشتری باید بر نحوه اجرای صحیح برنامه و بعبارتی از عدم تغییر تنظیمات اولیه راه اندازی برنامه مطمئن باشیم باید این تظیمات رو در کدهای ویژوال بیسیک قرار بدیم.

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

پس تا اینجا متوجه شدیم در پروژه های مهمی که قراره تحویل بدیم ، اعمال تنظیمات راه اندازی اولیه در برنامه نهایی کامپایل شده امری ضروری و اجتناب ناپذیره...

نکته ای که باید بدونیم اینه که تمام خصوصیات راه اندازی که در پنجره Startup پیدا میشن دارای معادل های VBA هستند. بعضی از اونا نیازمند تنظیم بصورت True یا False بوده و بعضی دیگه باید با مقادیر متنی تنظیم میشن.

جدول ضمیمه خصوصیات راه اندازی و معادل های VBA آنها و همچنین نوع مقداری که باید تنظیم بشن رو نشون میده


تا اینجا رو داشته باشید تا اگه عمری باقی بود و دوستان چراغ سبز نشون دادن ادامه شو در خدمتتون باشم...

مشتاق یادگیری
سه شنبه 17 دی 1387, 23:11 عصر
با سلام
اگر در مباحث بعدی با نمونه برنامه همراه باشد نتیجه بهتر خواهد بود
با تشکر

Profesorjd
سه شنبه 17 دی 1387, 23:21 عصر
باسلام و تشكر
با توجه به اينكه از مطالب نوشته شده ميشود بعداً‌ بصورت يك مقاله و آموزش كامل جمع كرد در صورت امكان لطف فرماييد كدها را بنويسيد

bbkyawho
چهارشنبه 18 دی 1387, 17:53 عصر
سلام
تاپیک مفیدی هست و خواهد بود ، موفق باشید
10 تا چراغ سبز

e601
چهارشنبه 18 دی 1387, 20:18 عصر
با عرض سلام

در پست دوم توضیحی مقدماتی در مورد Startup و معادلهای VBA داده شد و اینک ادامه بحث...

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

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

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

تابع زیر مقدار یک خصوصیت رو در کلکسیون Properties تنظیم کرده و در صورت پیدا نشدن ، آنرا اضافه خواهد کرد...

توضیحات:
این تابع دارای 3 آرگومان هست:
1. strPropName که نام خصوصیت هست
2. varPropType که نوع خصوصیت رو مشخص میکنه
3. varPropValue که مقدار خصوصیت هست

ضمنا خطای 3270 مربوط به پیدا نشدن خاصیت در کلکسیون خواص است



Public Function ChangeProp(strPropName As String, varPropType As Variant, varPropValue As Variant) As Integer
On Error GoTo Change_Err

Dim dbs As Object
Dim prp As Variant

Set dbs = CurrentDb

dbs.Properties(strPropName) = varPropValue
ChangeProp = True

Change_Exit:
Exit Function

Change_Err:
If Err = 3270 Then
Set prp = dbs.CreateProperty(strPropName, varPropType, varPropValue)
dbs.Properties.Append prp
Resume Next
Else
ChangeProp = False
Resume Change_Exit
End If
End Function

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

اگه دقت کرده باشین کد بالا یک تابع عمومی هست و عملا تغییر در خصوصیات راه اندازی رو انجام نمیده
بنابراین ما به یک سابروتین احتیاج داریم که عملیات واقعی رو واسه ما انجام بده...

کد زیر این کار رو انجام میده

توضیحات:
در ابتدای کد ثابتهایی تعریف شده و مقدار دهی شدن تا از اونها بتونیم برای تعیین نوع خصوصیت استفاده کنیم. در اینجا ما فقط به دو نوع Text و True/False احتیاج داریم...
سپس میتونیم برای تک تک خصوصیتهایی که در جدول پستهای قبلی به اونها اشاره شد تابع عمومی رو فراخوانی کنیم



Public Sub SetStartupProperties()

Const typ_Text As Long = 10
Const typ_Boolean As Long = 1

ChangeProp "AppTitle", typ_Text, "عنوان مورد نظر برای نمایش در نوار عنوان اصلی برنامه"
ChangeProp "StartupForm", typ_Text, "Form1"
ChangeProp "AllowFullMenus", typ_Boolean, False
ChangeProp "AllowSpecialKeys", typ_Boolean, False
Application.RefreshTitleBar

End Sub

من برای نمونه 2 تا از خصوصیات متنی و 2 تا از خصوصیاتی بولی رو قرار دادم که ناگفته پیداست که شما میتونید تمتم خصوصیات را با روش بالا تنظیم کنید.

با یه توضیح کوچک در مورد دستور Application.RefreshTitleBar این بخش رو به پایان میبرم:
بیشتر تغییرات اعمال شده تا وقتی که برنامه رو بندید و دوباره اجرا نکنید اعمال نمیشن. با این دستور موارد مثل متن نوار عنوان برنامه ، آیکون برنامه ، نوار منوی اختصاصی تعیین شده و غیره بلافاصله در برنامه اعمال خواهد شد...

تا فرصتی دیگر
یا حق...

مهدی قربانی
چهارشنبه 18 دی 1387, 21:16 عصر
سلام
دوست گرامی Eh.Masoudi ضمن تشکر از شما امیدوارم که موضوع رو تا انتها دنبال کنید .

e601
پنج شنبه 19 دی 1387, 00:30 صبح
با سلام مجدد

میریم سراغ بخش دوم آموزش...
این بخش مربوط میشه به کار کردن با گزینه های موجود در پنجره Options
این گزینه ها تعدادشون خیلی بیشتر از بخش Startup هست و میتونه عملکرد یک پایگاه داده اکسس را کنترل کنه بنابراین کنترل تک تک این خصوصیات توصیه میشه هر چند که کار سختی بنظر میرسه ولی میشه یکبار واسه همیشه کدش رو نوشت و در همه برنامه ها اعمال کرد...

پنجره Options دارای تعدادی برگه هست که تقریبا هر چیزی در مورد یک پایگاه داده در اون تنظیم میشه. از نوع فونت جداول گرفته تا تنظیم حاشیه های یک گزارش...

طبقه بندی این گزینه ها بصورت زیر هست:
1. کادرهای انتخابی که معمولا چک باکس هستند و از نوع True/False
2. گزینه های از پیش تعریف شده که در یک کومبو باکس و یا یک گروه انتخابی قرار میگیرن
3. و کادرهای متنی که در آنها یک مقدار رشته ای یا عددی وارد میشه

در ادامه همه اونها رو بررسی میکنیم ولی در حال حاضر توجه شما رو جلب میکنم به لیستی از همه گزینه های موجود در برگه Options و معادلهای آنها در VBA...

تا فرصتی دیگر
خدا نگهدار...

e601
جمعه 20 دی 1387, 13:19 عصر
با سلام مجدد
در پست قبل گزینه های معادل پنجره Option رو معرفی کردم و حالا ادامه مبحث...

ویژوال بیسیک دستوراتی برای تنظیم و یا مشاهده مقدار گزینه های مذکور فراهم کرده:
1. دستور SetOption که برای مقدار دهی یا تغییر خصوصیت استفاده میشه
2. دستور GetOption که مقدار یک خصوصیت رو بر می گردونه
لازم بذکره که در اینجا هر دوی این دستورات بر شی Application اعمال میشن

ساختار دستوری SetOption بصورت زیر میباشد:


expression.SetOption(OptionName, Setting)

آرگومان expression همان Application هست

آرگومان OptionName نام گزینه است یعنی همون هایی که در جدول پست قبل با عنوان معادلهای VBA مشخص شده.
نکته: نام گزینه باید در داخل گیومه قرار بگیره بعنوان مثال "Left Margin"

آرگومان Setting هم مقداری هستش که میخواهید گزینه داشته باشه
توضیحات: مقداری که در این متغیر قرار میگیره به نوع گزینه مورد نظر شما برای تنظیم بستگی داره. همونطوری که قبلا گفتم گزینه های پنجره Options سه نوع هستن. یا کادر ساده متنی هستن یا مقدار True/False میگیرن یا از یک کاردر کومبو/گروه گزینه انتخاب میشن.

اگر گزینه مورد نظر در پنجره بصورت چک باکس باشه در کد بصورت True/False مقدار دهی میشه
مثال: برای عدم نمایش Status Bar از کد زیر استفاده میکنیم:


Application.SetOption "Show Status Bar", False

اگه گزینه مورد نظر باید با یک رشته متن مشخص بشه به صورت زیر تنظیم میشه. مثلا تنظیم پوشه پیش فرض پایگه داده:


Application.SetOption "Default Database Directory ", "C:\My Documents"

اگر گزینه مورد به یک مقدار عددی نیاز داشت مقدار را بدون گیومه وارد کنید. مثلا برای تعیین حاشیه پیش فرض از سمت چپ گزارش به اندازه 1.5 سانتیمتر دستور زیر قابل استفاده هست:


Application.SetOption "Left Margin", 1.5

و بالاخره اگر گزینه مورد نظر در یک گروه گزینه و یا در یک کادر کومبو بود برای مشخص کردن مقدار مورد نظر باید ایندکس آن آیتم را مشخص کنید. (به نکته 1 و نکته 2 توجه کنید)

نکته 1: اولین آیتم در یک گروه گزینه یا کادر کومبو دارای ایندکس صفر میباشد.

مثال مربوط به گروه گزینه: در پنجره Options و در برگه Datasheet گروه گزینه این به نام
Default cell effect وجود دارد که استایل نمایش یک سلول را تعیین میکند. دستور زیر مقدار گزینه مورد نظر را برابر Sunken قرار میدهد


Application.SetOption "Cell Effect", 2

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


Application.SetOption " Default Field Type ", 1

نکته 2: هر چند که طبق گفته میکروسافت آیتمهای موجود در یک کادر کومبو همانند یک گروه گزینه ایندکس گذاری شده اند (یعنی اولین گزینه دارای ایندکس صفر ، دومی 1 و ...) اما برخی از گزینه ها طبق انتظار پاسخ نمیدهند بنابراین توصیه میشه که برای تنظیم مقادیر کادرهای کومبو اونها رو بررسی و آزمایش کنید

دیگه ادامه کارها هم کار راحته با استفاده ساختار With…End With هر گزینه ای که لازم دونستید رو بصورت زیر تنظیم کنید:



With Application
.SetOption "Auto Compact", True
.SetOption "Default Open Mode for Databases", 0
.SetOption "Default Font Name", "Tahoma"
.SetOption "Default Font Size", 9
.SetOption "Default Font Underline", False
.SetOption "Default Font Italic", False
End With

دستور GetOption هم که ساختاری مثل SetOption داره با این تفاوت که فقط آرگومان OptionName رو مشخص میکنید و اون مقدار گزینه مورد نظر شما رو بر میگردونه

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

در صورتیکه دوستان تمایل به ادامه آموزش دارن نظر بدن

موفق باشید و التماس دعا...

hamedMohammad
یک شنبه 22 دی 1387, 23:45 عصر
با سلام و تشکر فراوان از Eh.Masoudi عزیز
مطالب مفید و کاربردی است و انشاالله دوستان با درج تشکر ، تمایل خود را نسبت به ادامه آموزش ابراز می کنند.
یک نکته : اعمال شرط در کدهای SetOption مانند کد زیر :
Application.SetOption ("Built-In ToolBars Available"), IIf(CurrentUser() = "ADMIN", True, False)
که در این کد "ADMIN" می تواند برنامه نویس باشد.
موفق باشید.

e601
دوشنبه 23 دی 1387, 20:35 عصر
با سلام مجدد

ادامه بحث رو پی میگیریم...

موضوع: ایجاد یک خصوصیت جدید و افزودن آن به کلکسیون Properties شی مربوطه

در کدهای ارائه شده در پستهای قبلی از دستورات CreateProperty و AppendProperty برای تنظیم خصوصیات راه اندازی استفاده کردیم.
لازم میدونم دوباره یاد آوری کنم اگر خصوصیتی تغییر نکرده باشه عضوی از مجموعه Properties نیست که با استفاده از تکنیکهای ارائه شده خصوصیت مورد نظر اضافه و تنظیم میشه.

نکته جالب اینه که ما میتونیم از روشی مشابه استفاده کنیم و یک خصوصیت کاملا جدید رو به هر شیئی که متد CreateProperty به اون اعمال میشه اضافه کنیم...
از جمله این اشیا عبارتند از: کل برنامه یا بعبارتی همون پایگاه داده ، فیلدها و ...

کد زیر یک خصوصیت با نام NewProperty را ایجاد و به کلکسیون Properties پایگاه داده اضافه میکنه



Public Sub CreateNewProperty()
On Error GoTo Err_CreateNewProperty

Dim dbs As DAO.Database
Dim prpNew As DAO.Properties

Set dbs = currendb
With dbs
Set prpNew = .CreateProperty("NewProperty", dbText, "Salam")
.Properties.Append prpNew
End With

Err_CreateNewProperty:
MsgBox Err.Number & vbCrLf & Err.Description
Exit Sub
End Sub

نکات مهم:
1. NewProperty نام خصوصیت جدید هست
2. dbText نوع خصوصیت هست که میتونه یکی از انواع زیر باشه:
dbBigInt
dbBinary
dbBoolean
dbByte
dbChar
dbCurrency
dbDate
dbDecimal
dbDouble
dbFloat
dbGUID
dbInteger
dbLong
dbLongBinary
dbMemo
dbNumeric
dbSingle
dbText
dbTime
dbTimeStamp
dbVarBinary
3. متن Salam اختیاری بوده و مشخص کننده تنظیم اولیه و مقدار پیش فرض خصوصیت هستش

پاورقی 1: از دستور Append برای افزودن خاصیت جدید به کلکسیون Properties فیلدها ، ایندکس و غیره هم میشه استفاده کرد

پاورقی 2: در صورتی که نام خصوصیت تعیین شده در مجموعه خواص شی مورد نظر موجود باشه موقع افزودن آن یک خطای زمان اجرا ایجاد خواهد شد

موفق باشید...

HAMRAHSOFT.IR
سه شنبه 24 دی 1387, 06:41 صبح
دوست خوب كارت عالي ولي اگه كنار كدها يك نمونه هم ميزاشتي بهتر بود البته به نظر شخص خودم

e601
سه شنبه 24 دی 1387, 20:52 عصر
دوست خوب كارت عالي ولي اگه كنار كدها يك نمونه هم ميزاشتي بهتر بود البته به نظر شخص خودم

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

موفق باشید...

omidh999
چهارشنبه 25 دی 1387, 10:25 صبح
با سلام
در این تاپیک قصد دارم مباحثی رو در باب تغییر محیط کاری برنامه ها بصورت دینامیک و پویا و از طریق کدهای ویژوال بیسیک مطرح کنم و امیدوارم که مفید هم واقع بشه.

سرفصلهای این مقاله عبارتند از:
1. تنظیم خصوصیات راه اندازی یا همون گزینه هایی که در قسمت Tools>Startup تنظیم میکنیم
2. تنظیم گزینه های پیش فرض برنامه یا بعبارتی همونهایی که در قسمت Tools>Options مشخص میکنیم
در صورت تمایل دوستان به ادامه تاپیک گریزی هم به مسائل زیر خواهم زد:
3. ایجاد و اضافه کردن یک خصوصیت جدید و افزودن آن به کلکسیون Properties برنامه
4. کامپایل شرطی برنامه

موارد قابل توجه:
1. حتما در مورد مباحث مطروحه نظر بدین و بعبارتی اگه این گفته ها مفید هست اعلام کنین تا من هم به یک دید کلی برسم و بدونم که فقط واسه خودم حرف نمیزنم!!!!!!!!!!!!
2. از ارسال پستهای انحرافی خودداری بشه
3. از همه دوستانی که صاحبنظرن و به قولی دستی به آتش دارن دعوت میکنم که در بحث شرکت کنن و بار فنی تاپیک رو بالا ببرن

با تشکر...



علاقه مندان برنامه نويسي زيادن و مثل من پيگير - مطالب جالبيه و حتما استفاده مي كنيم

wolfstander
چهارشنبه 25 دی 1387, 11:52 صبح
سلام
هرچند من تازه واردم ولی فکر کنم از افراد حرفه ای تر بتونم چیزای بیشتری یاد بگیرم تا از کتابا
ممنون میشم اگه ادامه مباحث رو هم مطرح بفرمائید

nabeel
پنج شنبه 26 دی 1387, 18:35 عصر
با سلام به حضور Eh.Masoudi عریز

دوست من اگه اجازه بدید یک سئوال مطرح کنم

در تایپک شماره 11 اعلام فرمودید که میشه مشخصه ای جدید رو به مشخصه های موجود اضافه کرد .

یک نکته جلب توجه میکنه و اینکه آیا در هنگام معرفی یک مشخصه جدید , Access اقدام به صدور رویدادهای مرتبط هم میکنه ؟!

اجازه بدید سئوالم رو واضح تر اعلام کنم :


پاورقی 1: از دستور Append برای افزودن خاصیت جدید به کلکسیون Properties فیلدها ، ایندکس و غیره هم میشه استفاده کرد

یعنی آیا با افزوده شدن خاصیت از این طریق اکسس اونقدر هوشمند هست که رفلکس مناسبی رو از خودش به نمایش بذاره ؟

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

تصور بنده بر اینه که تغییرات مد نظرتون تنها در رابطه با مشخصه های غیر استاندارد بوده و گرنه در این خصوص نیاز به بحث وجود داره .

با تشکر از شما دوست گرامی به خاطر زحماتتان

e601
پنج شنبه 26 دی 1387, 21:42 عصر
با سلام


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

نبیل جان من منظورتو متوجه نشدم !
من در پست 11 برای نوع یک خصوصیت جدید انواعی که میشه تعیین کرد رو عنوان کردم. حالا اکسس با توجه به نوعی که برای خصوصیت تعیین کردید مقدار اونو کنترل میکنه و اگه خارج از استاندارد نوع تعیین شده باشه واکنش نشون میده

مثلا برای یک خصوصیت عددی انواع dbDecimal ، dbDouble ، dbSingle ، dbLong و غیره در اختیار شماست و حداکثر و حداقل عددی که میشه درون این نوعها قرار داد هم که مشخصه
حالا شما بر اساس کاری که میخوای انجام بدی و عددی که میخوای درون خصوصیت جدیدت بریزی باید نوع مناسب رو هم انتخاب کنی

موفق باشید...

nabeel
پنج شنبه 26 دی 1387, 22:32 عصر
Eh.Masoudi عزیز سلام

ببینید دوست من , جهت اینکه اکسس بتونه در مقابل ایندکسها عملکرد مناسبی رو به نمایش بذاره تنها معرفی نوع داده اون کفایت نمیکنه .

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

اجزاه بدید یه مثال دیگه بزنم که وضوح بیشتری داشته باشه

در مسیر زیر :


Tools l Option l Advanced l Default File Format

شما دو گزینه با ایندکسهای 0 و 1 دارید

آیا امکان اضافه نمودن ایندکسی با شماره دو و عنوان Access 2007 وجود داره .

پاسخ : بله ولی آیا این گزینه در صورت انتخاب , به اکسس این امکان رو میده که فایل رو در فرمت Access 2007 آماده کنه و یا نه !

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

اسامی باید به همون صورت تعریف شده از سوی اکسس وارد بشن مثلاً AllowSpecialKeys , آیا اکسس در صورت تعریف همین مشخصه با نام ASK میتونه همین کار رو انجام بده ؟

در اون بخشی که اشاره فرمودید به پارامتر "NewProperty" , عملاً در صورتی که بخواید اکسس استفاده سیستمی از اون داشته باشه , الزاماً باید از داخل لیست مشخصه های پیش گزیده استفاده بشه ( در تاپیکهای قبلی زحمت کشیده بودید و لیست اونها رو ارائه کرده بودید )

امکان تعریف مشخصه سیستمی غیر تعریف شده وجود نداره .

ممنون از پیگیری و پاسخی که دادید

e601
پنج شنبه 26 دی 1387, 23:56 عصر
با سلام مجدد

فکر میکنم نکاتی باید یادآوری بشه:

ذکر این موضوع رو فوق العاده ضروری میدونم که اکسس هم مثل هر برنامه ای کدهای کامپایل شده ای با الگوریتمهای خاص خودش داره. ما قرار نیست تغییری در الگوریتمهای اکسس بدیم(که نمیتونیمم این کار رو بکنیم) بلکه قراره نحوه رفتار این الگوریتمها رو به نفع خودمون و برنامه ای که مینویسیم خصوصی سازی بکنیم


ببینید دوست من , جهت اینکه اکسس بتونه در مقابل ایندکسها عملکرد مناسبی رو به نمایش بذاره تنها معرفی نوع داده اون کفایت نمیکنه .
در بخش Options وقتی شما ایندکسی رو اضافه میکنید اکسس اون ایندکس جدید رو در بین ایندکسهای اصلی و پیش گزیده خودش نمیتونه پیدا کنه
اگه به پستهای مربوط به تنظیمات Options دقت کرده باشید متوجه میشید که بنده در مورد اضافه کردن آیتمی به آیتمهای پنجره Options صحبتی نکردم بلکه گفتم برای تنظیم یک خصوصیت از دستور SetOption و برای خواندن آن از GetOption استفاده میکنیم. تمام خصوصیتهای پنجره Options ثابت و غیر قابل تغییرند بنابراین ما اجازه ای برای اضافه کردن یک گزینه به آیتمهای موجود در لیستهای این پنجره نداریم(اشاره به توضیحی که در مورد گزینه های Default File Format دادید)
بحثی که بنده در مورد اضافه کردن خصوصیت جدید به برنامه داشتم در مورد کلکسیون خواص برنامه بود. آیتمهای بخش Options جزو این کلکسیون نیستند.

توجه: برخی از مهمترین خصوصیتهای موجود در کلکسیون Properties یک پایگاه داده در پنجره Startup اومدن و برخی هم نیومدن


اجزاه بدید یه مثال دیگه بزنم که وضوح بیشتری داشته باشه
در مسیر زیر :

Tools l Option l Advanced l Default File Format

شما دو گزینه با ایندکسهای 0 و 1 دارید
آیا امکان اضافه نمودن ایندکسی با شماره دو و عنوان Access 2007 وجود داره .
پاسخ : بله ولی ...
باید بگم که پاسخ این سوال خیر هست چون ما نمیتونیم به لیست اشاره شده گزینه جدیدی اضافه کنیم و انتظار رفتار جدیدی هم از اکسس داشته باشیم...


اسامی باید به همون صورت تعریف شده از سوی اکسس وارد بشن مثلاً AllowSpecialKeys , آیا اکسس در صورت تعریف همین مشخصه با نام ASK میتونه همین کار رو انجام بده ؟
چه دلیلی داره که ما اسم خصوصیتهای از پیش تعریف شده رو عوض کنیم؟ فکر نمیکنم احتیاجی به این کار باشه...

در کل موضوعی که باید روش تاکید کنم اینه که ما قابلیت اضافه کردن یک خصوصیت جدید رو وقتی میتونیم استفاده کنیم که احتیاج هست مقداری رو در زمان اجرا (حالا به هر دلیلی که برنامه نویس واسه خودش داشته باشه) ذخیره کنیم.
یک راه اینه که اونو در رجیستری سیستم ذخیره و بازخوانی کنیم و راه دیگه اینه که یک خصوصیت به کلکسیون خواص برنامه اضافه کرده و در زمان مناسب اون رو مقدار دهی کنیم

موفق باشید...

nabeel
جمعه 27 دی 1387, 00:47 صبح
جناب آقای Eh.Masoudi سلام

موارد زیر باعث ایجاد شبه در ذهن من شدن

گزیده هایی از اونها رو مینویسم ولی این نیاز وجود داره که چند خط قبل و بعد از اونها هم در داخل تاپیکهای مربوطشون خونده بشه

عنوان تاپیک : تنظیم خصوصیات برنامه در زمان اجرا و از طریق VBA


تنظیم گزینه های پیش فرض برنامه یا بعبارتی همونهایی که در قسمت Tools>Options مشخص میکنیم

برخی از خواص در کلکسیون نشان داده نمی شوند مگر اینکه تغییر کرده یا حداقل یکبار تنظیم شده باشند

نکته جالب اینه که ما میتونیم از روشی مشابه استفاده کنیم و یک خصوصیت کاملا جدید رو به هر شیئی که متد CreateProperty به اون اعمال میشه اضافه کنیم...
از جمله این اشیا عبارتند از: کل برنامه یا بعبارتی همون پایگاه داده ، فیلدها و ...

کد زیر یک خصوصیت با نام NewProperty را ایجاد و به کلکسیون Properties پایگاه داده اضافه میکنه

خود من شخصاً هیچ مشکلی با این بخش از Access ندارم ولی تسلسل ارائه مطالب به صورتی هستش که مفاهیم به صورت دو خط موازی که در جاهایی تلاقی داشته و جای اونها عوض شده , و همین امر ایجاد اشکال میکنه

تصور میکنم اصطلاحات زیر ناخواسته در جاهایی به کار رفتن :

کلکسیون - Properties - عضو - مجموعه - شیئی - پایگاه داده - فیلد - ایندکس - خواص شی

جهت روشن شدن مطلب توصیه میکنم نیم نگاهی به ساختار درختی Access داشته باشیم .

این اصلاحات هر یک در سلسله مراتب و جایگاه خاصی قرار دارن که استفاده از اونها به صورت جایگزین نادرسته .

موفق باشید دوست گرامی

nabeel
جمعه 27 دی 1387, 02:11 صبح
سلام مجدد به حضور Eh.Masoudi عزیز

من هر روز که با اکسس کار میکنم , فقط یه چیز رو بیشتر متوجه میشم و اونم اینه که خیلی از چیزهاش رو بلد نیستم . ولی یه باور همیشگی دارم و اون اینکه , اکسس توانایی انجام هر چیزی رو در حیطه عملکردی خودش داره .

بعضی از اونها رو به واسطه قابلیتهای ذاتیش میشه انجام داد و بعضی دیگه رو به واسطه باگهاش ( متاسفانه معادل بهتری براش پیدا نکردم ) به طور مثال یکی از مواردی که خیلی از دوستان باهاش آشنا هستن مورد راست چین کردن Listbox هستش . مطمئناً خیلی ها هم در اوائل میگفتن که نمیشه ولی دیگه حالا یادی از اون نظریه ها به جا نمونده . ( در مشخصه های لیست باکس Align وجود نداره )

خوب با این پیش درآمد میرم به سراغ بحث خودمون .

متاسفانه مجبور شدم دوباره وقت بذارم برای کاری که مدتها قبل هم , به نتیجه ای در خصوص اون نرسیده بودم .


باید بگم که پاسخ این سوال خیر هست چون ما نمیتونیم به لیست اشاره شده گزینه جدیدی اضافه کنیم و انتظار رفتار جدیدی هم از اکسس داشته باشیم...

من یه تصویر در بخش زیر ضمیمه میکنم که نشون میده امکان اضافه کردن یک آیتم به داخل Combo Box های موجود در داخل پنجره Options وجود داره ( و یا در حالت کلی تغییر در کلیه کنترلها )

این کار با استفاده از یک خطای داخلی DB Engine و از طریق DAO امکان پذیره . ولی همونطوری که شما هم فرمودید اضافه شدن یک آیتم به داخل این بخش کاری رو از پیش نمیبره ( چرا که اکسس کدهای متناسب با اون گزینه رو در داخل خودش نداره )

من تصورم بر اینه که احتمالاً در بخشهایی از تاپیک تداخلی بین تعریف واژه های Set و Get در اکسس و احتمالاً خود VB بوجود اومده . یکسری از بخشهایی رو که گفتید متاسفانه در داخل Access نمیشه اجراییشون کرد . ( البته با توجه به نحوه نگارش موجود )

من قصدم از مطرح کردن سئوالات تاپیک شماره 18 زنده کردن جواب احتمالی سئوالاتی بود که مدتها بدنبالشون بودم و تصور کردم شما میخواید به اونها اشاره کنید . ولی خب ظاهراً اشتباه من محرز بوده و تصورات غلطی هم در خصوص نوشته های شما دوست عزیز داشتم

مجدداً از شما به خاطر ارائه این مقاله که مطمئناً برای طیف وسیعی از کاربرا تازگی داره و مفیده تشکر میکنم

موفق باشید

nabeel
جمعه 27 دی 1387, 02:15 صبح
متاسفانه تصویر فراموش شده بود

تصویر مورد نظر

27427

yassser
شنبه 28 دی 1387, 08:56 صبح
اگه ممكنه مطالب اين بخش رو بصورت يك مقاله در قالب فايل PDF قرار بديد.
با تشكر

e601
دوشنبه 28 بهمن 1387, 22:17 عصر
با سلام مجدد
اول باید پوزشم رو از تاخیر بوجود آمده در ارسال نمونه ها بپذیرید

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

در صورتی که نیاز به توضیح داشتید بنده در خدمتم

موفق باشید...

HAMRAHSOFT.IR
جمعه 09 اسفند 1387, 12:49 عصر
ببخشید توسط کد میشه فیلد هارا هم جابجاکرد روی فرم ؟

e601
جمعه 09 اسفند 1387, 19:41 عصر
ببخشید توسط کد میشه فیلد هارا هم جابجاکرد روی فرم ؟

سلام

دوست عزیز سوال شما ارتباطی به موضوع تاپیک نداره ولی به هر حال نمونه برنامه زیر رو ببینین

درخواست: دوستان گرامی لطف کنن و سوالاتی که ارتباط با این موضوع نداره رو جای دیگه عنوان کنن تا نظم تاپیک بهم نخوره

موفق باشید...

e601
دوشنبه 19 اسفند 1387, 22:03 عصر
با سلام مجدد

نمونه ضمیمه شده در مورد تنظیم گزینه های پنجره Options هست

قبلا در این مورد با هم صحبت کرده بودیم ولی لازمه یه یادآوری دیگه بکنم که گزینه های پنجره Options سه دسته اند:
1. گزینه هایی که Chekbox هستند و با True/Flase مقدار دهی میشن
2. گزینه هایی که گروهی هستند مثل یک Option group یا یک Combo box که برای دسترسی یا مقدار دهی آنها باید از ایندکس اونها استفاده کنیم.
نکته اول: در پست شماره 9 عرض کردم که بنا به گفته میکروسافت ایندکس اینجور گزینه ها ، از مقدار 0 شروع میشه. یعنی اولین گزینه ی یک Combo box دارای ایندکس 0 ، دومی 1 و ...
در واقع ما برای ست کردن یا خواندن مقدار گزینه باید عدد ایندکس رو وارد کنیم ، نه متنی که در پنجره Tools>Options میبینیم ! (البته این قضیه استثنا هم داره. به نکته بعدی توجه کنید)

نکته دوم: یکی از Combo box هایی که ایندکسش از 0 شماره گذاری نشده گزینه Default File Format هست که در صفحه Advanced قابل مشاهدست.
در فایل نمونه هم خواهید دید که 2 آیتم موجود در این Combo box دارای اینکس های 9 و 10 هستند که باید دستی کنترل بشن !!!

3. گزینه هایی که بصورت Textbox هستند که اگر مقدارشون رشته بود بصورت String و اگر عدد بود به شکل همون عدد تنظیم میشن.

توجه: فایل نمونه دارای مثال در مورد هر یک از حالتهای فوق هست. در صورتیکه شما حالتهای موجود در نمونه رو خوب متوجه بشید میتونید بوسیله لیستی که در پست شماره 8 ارائه کردم هر گزینه دلخواه را به راحتی مقدار دهی کرده و یا مقدار آنرا بخوانید.

یه نکته کوچیک دیگه هم عرض کنم که در فایل نمونه وقتی موس رو روی یک گزینه نگه دارید عنوان اصلی گزینه در پنجره Options بصورت Tooltip به نمایش در میاد.
همچنین با زدن دکمه تایید تنظیمات انجام شده شما ثبت شده و بلافاصله میتونید به پنجره Options رفته و نتایج را مشاهده کنید. البته عکس این موضوع هم صادقه.

موفق باشید...

alirezabahrami
سه شنبه 27 اسفند 1387, 18:03 عصر
بنام خدا

با سلام حضور جناب آقاي Eh.Masoudi
بدون ترديد مطالبي كه در اين تاپيك مطرح شده و انشاء الله نسبت به ادامه آن ازسوي جنابعالي. و ديگر اساتيد بزرگوار اقدام لازم مبذول مي گردد ، براي دوستاني كه علاقمند هستند با ديد حرفه اي تر با برنامه اكسس كار كنند بسيار آموزنده و مفيد خواهد بود . لذا شخصاً ضمن تشكر وسپاسگزاري فراوان از حضرتعالي ، استدعا دارم بلحاظ مفيد بودن موضوع ، در صورت امكان نسبت به ادامه آموزش عنايت داشته باشيد .
از ساير دوستان بزرگوار نيز تمنا دارم با درج تشکر ، تمایل خود را نسبت به ادامه اين بحث و آموزش مؤثر ابراز نمايند.
با آرزوي موفقيت براي تمام دوستان

انگوران
چهارشنبه 28 اسفند 1387, 08:03 صبح
کلکسیون - Properties - عضو - مجموعه - شیئی - پایگاه داده - فیلد - ایندکس - خواص شی

جهت روشن شدن مطلب توصیه میکنم نیم نگاهی به ساختار درختی Access داشته باشیم .

این اصلاحات هر یک در سلسله مراتب و جایگاه خاصی قرار دارن که استفاده از اونها به صورت جایگزین نادرسته .



دوست عزيز سلام _ اگه لطف كنين راجع به ساختار درختي ،‌جايگاه و در مجموع برخي مفاهيم پايه اي در vba ( كلاس و ... ) مطالبي در اختيار ما بذارين ممنون ميشم .

alirezabahrami
چهارشنبه 28 اسفند 1387, 16:55 عصر
بنام خدا

ضمن عرض سلام و تبريك به مناسبت فرا رسيدن سال نو ، از درگاه خداوند متعال آرزوي سلامتي ، سعادت و طول عمر با عزت و عاقبت بخيري براي تمامي دوستان بزرگوار ، علي الخصوص دست اندركاران اين سايت كه حقيقتاً همه بخش هاي آن داراي مطالب بسيار مفيد و آموزنده اي مي باشد را مسئلت مي نمايم .
و اما جناب آقاي Eh.Masoudi ، بخاطر مطالب مفيدي كه در اين تاپيك ارائه فرموده و انشاء الله ارائه خواهيد فرمود ابتداء وظيفه خود مي دانم كه از جنابعالي كمال قدرداني و سپاسگزاري را داشته باشم .
با عنايت به مباحث مطرح شده از سوي حضرتعالي در پست هاي قبل و اشاره به بعضي ابهامات از طرف تعدادي از دوستان ،اين حقير نيز با در نظر گرفتن اين مطلب كه متأسفانه اطلاعات خيلي زيادي در زمينه دستور العمل هاي ويژوال بيسيك ندارم . داراي ابهامي در رابطه با موضوع مطرح شده در پست شماره 11 تحت عنوان : ایجاد یک خصوصیت جدید و افزودن آن به کلکسیون Properties شی مربوطه ، هستم و مطمئنم اين ابهام براي بسياري از عزيزان كه همچون بنده داراي اطلاعات نسبي در زمينه اكسس ميباشند ، وجود دارد و آن اينكه تا جائيكه اطلاع دارم ، برنامه اكسس فاقد خصوصيتي تحت عنوان Justify همانند آنچه كه در برنامه هاي Word و Excel وجود دارد ميباشد . لذا با عنايت به توضيحاتي كه در پست فوق ارائه فرموده بوديد اين سؤال پيش آيد كه آيا در اكسس نيز اين امكان وجود دارد كه مثلاً براي يك متني كه در داخل يك تكس باكس و يا ليست باكس تايپ شده اين خصوصيت جديدرا به کلکسیون Properties اشياء مذكور اضافه نمائيم و آيكن آن را همانند آيكن هاي Align Left ، Center و Aligen right كه در منوي تولبار موجود است ، نمايش بدهيم ؟.
مزيد امتنان خواهد بود چنانچه با ارائه يك فايل نمونه بنده و ديگر دوستان را راهنمائي فرمائيد .
با تشكر فراوان و آرزوي داشتن سالي خوب و خوش براي جنابعالي و خانواده محترم

e601
جمعه 14 فروردین 1388, 18:52 عصر
بنام خدا



ضمن عرض سلام و تبريك به مناسبت فرا رسيدن سال نو ، از درگاه خداوند متعال آرزوي سلامتي ، سعادت و طول عمر با عزت و عاقبت بخيري براي تمامي دوستان بزرگوار ، علي الخصوص دست اندركاران اين سايت كه حقيقتاً همه بخش هاي آن داراي مطالب بسيار مفيد و آموزنده اي مي باشد را مسئلت مي نمايم .
و اما جناب آقاي Eh.Masoudi ، بخاطر مطالب مفيدي كه در اين تاپيك ارائه فرموده و انشاء الله ارائه خواهيد فرمود ابتداء وظيفه خود مي دانم كه از جنابعالي كمال قدرداني و سپاسگزاري را داشته باشم .
با عنايت به مباحث مطرح شده از سوي حضرتعالي در پست هاي قبل و اشاره به بعضي ابهامات از طرف تعدادي از دوستان ،اين حقير نيز با در نظر گرفتن اين مطلب كه متأسفانه اطلاعات خيلي زيادي در زمينه دستور العمل هاي ويژوال بيسيك ندارم . داراي ابهامي در رابطه با موضوع مطرح شده در پست شماره 11 تحت عنوان : ایجاد یک خصوصیت جدید و افزودن آن به کلکسیون Properties شی مربوطه ، هستم و مطمئنم اين ابهام براي بسياري از عزيزان كه همچون بنده داراي اطلاعات نسبي در زمينه اكسس ميباشند ، وجود دارد و آن اينكه تا جائيكه اطلاع دارم ، برنامه اكسس فاقد خصوصيتي تحت عنوان Justify همانند آنچه كه در برنامه هاي Word و Excel وجود دارد ميباشد . لذا با عنايت به توضيحاتي كه در پست فوق ارائه فرموده بوديد اين سؤال پيش آيد كه آيا در اكسس نيز اين امكان وجود دارد كه مثلاً براي يك متني كه در داخل يك تكس باكس و يا ليست باكس تايپ شده اين خصوصيت جديدرا به کلکسیون Properties اشياء مذكور اضافه نمائيم و آيكن آن را همانند آيكن هاي Align Left ، Center و Aligen right كه در منوي تولبار موجود است ، نمايش بدهيم ؟.
مزيد امتنان خواهد بود چنانچه با ارائه يك فايل نمونه بنده و ديگر دوستان را راهنمائي فرمائيد .
با تشكر فراوان و آرزوي داشتن سالي خوب و خوش براي جنابعالي و خانواده محترم

سلام

بنده هم متقابلا فرا رسیدن سال نو رو خدمت شما ، مدیران محترم سایت و همه کاربران عزیز تبریک عرض میکنم. امیدوارم که همه دوستان موفق و پیروز باشن.

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

موضوعی که در این تاپیک مطرح شده با برداشت شما متفاوته...

فکر کنم با یه مثال ساده موضوع روشنتر بشه.
میدونید که یک شی Recordset از نوع DAO خواصی از قبیل EOF داره که نشون میده الان در آخرین رکورد رکوردست هستیم. و یا خاصیت RecordCount که تعداد رکوردهای رکوردست رو نشون میده
همه اشیا ، خواص خاص خودشون رو دارن که ما در صورت نیاز میتونیم خواص جدیدی رو به این اشیا اضافه کنیم.

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

راه دیگه ای که ما میتونیم استفاده کنیم اینه که یک خاصیت جدید به کلکسیون خواص شی Database اضافه کنیم و متن مورد نظر رو در اون قرار داده و در زمان مناسب نمایش دهیم.

فایل ضمیمه مربوط به همین مثال هست.

موفق باشید...