PDA

View Full Version : خطا در عدم وجود referende



hamid-nice
دوشنبه 26 فروردین 1392, 13:44 عصر
سلام
یک برنامه دارم که از یک Activex استفاده می کنه
وقتی این ActiveX در برنامه وجود نداشته باشه پیغام خطا می ده

آیا می شه یک کدی نوشت که اگر AxctiveX (یا به طور کلی هر reference بکار رفته) وجود نداشت کلا برنامه بسته شود؟
البته شماره خطا رو هم نمی دونم اگه برای این مورد شماره خطا را هم بفرمایید ممنون میشم

با تشکر فراوان

hamid-nice
دوشنبه 26 فروردین 1392, 22:53 عصر
با سلام
کسی هست در این مورد بتونه کمکی کنه ؟

با تشکر

hamid-nice
سه شنبه 27 فروردین 1392, 12:01 عصر
دوستان من فقط می خوام یک error handling بنویسم تا موقعی که خطای مربوط به نبودن ocx (برای reference ) صادر می شه به جای اینکه پیغام اکسس بیاد از برنامه خارج بشه

با تشکر

alirezabahrami
چهارشنبه 28 فروردین 1392, 22:56 عصر
سلام
یک برنامه دارم که از یک Activex استفاده می کنه
وقتی این ActiveX در برنامه وجود نداشته باشه پیغام خطا می ده

آیا می شه یک کدی نوشت که اگر AxctiveX (یا به طور کلی هر reference بکار رفته) وجود نداشت کلا برنامه بسته شود؟
البته شماره خطا رو هم نمی دونم اگه برای این مورد شماره خطا را هم بفرمایید ممنون میشم

با تشکر فراوان
سلام
معمولاً اکتیوایکس های که در برنامه از آنها استفاده میشود در یک فولدر و تحت عنوان ActiveX در مسیر (کنار)برنامه نگهداری میشوند، در اینجور مواقع در هنگام باز شدن فرمی که کنترل اکتیوایکس در آن درج شده بایدچک شود که آیا اکتیو ایکس درمسیر برنامه هست یا نه ، اگربود فرم اجرا شود در غیراینصورت با صدور پیغامی مبنی بر نبود اکتیوایکس در مسیر برنامه فرم بسته شود.
اگرمی خواهید از حالت فوق پیروی کنید ابتدا کد زیر را در قسمت عمومی فرم وارد کن!


Private Declare Function PathFileExists Lib "shlwapi.dll" Alias "PathFileExistsA" (ByVal pszPath As String) As Long
Private Function FileExist(FPath As String) As Boolean
FileExist = CBool(PathFileExists(FPath))
End Function
و سپس در رویداد Form_Load کد زیر را وارد کن!

[CODE]
If Not FileExist(Application.CurrentProject.Path & "\ActiveX\NameActiveX") Then
MsgBox "!ÏÑ ãÓíÑ ÈÑäÇãå äãí ÈÇÔÏ" & "" & "NameActiveX" & "" & "ǘÊíæÇí˜Ó", vbOKOnly + vbInformation, "!ÊæÌå"
DoCmd.Close
End If




در کدفوقActiveX نام پوشه حاوی اکتیوایکس و NameActiveX نام اکتیوایکس شماست.
موفق باشید

alirezabahrami
پنج شنبه 29 فروردین 1392, 00:39 صبح
سلام جناب آقای بهرامی

به نظرم یک مقدار در روشتون , کنترل مازاد به عمل داره میاد

یک مثل فارسی میگه : سری که درد نمیکنه دستمال نمی بندن

شما دارید وجود یک فایل رو به صورت مستمر چک میکنید , همین امر مازاد هستش , تا وقتی که فایل هست نیازی به چک نیست

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

شما در مبحث خطاها با دو اصطلاح Error Handling و Error Trapping مواجه هستید

در واقع Error Trapping همون بخشی هستش که شما خطا رو در تله میندازید



On Error GoTo ErrHandler:
.
.
.

ErrHandler:
If Err.Number = XYZ Then
docmd.close
End If

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

باتشکر

alirezabahrami
پنج شنبه 29 فروردین 1392, 01:11 صبح
سلام
معمولاً اکتیوایکس های که در برنامه از آنها استفاده میشود در یک فولدر و تحت عنوان ActiveX در مسیر (کنار)برنامه نگهداری میشوند، در اینجور مواقع در هنگام باز شدن فرمی که کنترل اکتیوایکس در آن درج شده بایدچک شود که آیا اکتیو ایکس درمسیر برنامه هست یا نه ، اگربود فرم اجرا شود در غیراینصورت با صدور پیغامی مبنی بر نبود اکتیوایکس در مسیر برنامه فرم بسته شود.
اگرمی خواهید از حالت فوق پیروی کنید ابتدا کد زیر را در قسمت عمومی فرم وارد کن!


Private Declare Function PathFileExists Lib "shlwapi.dll" Alias "PathFileExistsA" (ByVal pszPath As String) As Long
Private Function FileExist(FPath As String) As Boolean
FileExist = CBool(PathFileExists(FPath))
End Function
و سپس در رویداد Form_Load کد زیر را وارد کن!

[CODE]
If Not FileExist(Application.CurrentProject.Path & "\ActiveX\NameActiveX") Then
MsgBox "!ÏÑ ãÓíÑ ÈÑäÇãå äãí ÈÇÔÏ" & "" & "NameActiveX" & "" & "ǘÊíæÇí˜Ó", vbOKOnly + vbInformation, "!ÊæÌå"
DoCmd.Close
End If




در کدفوقActiveX نام پوشه حاوی اکتیوایکس و NameActiveX نام اکتیوایکس شماست.
موفق باشید
سلام مجدد
از دستورساده Dir هم بجای استفاده از PathFileExists بصورت زیر میشود استفاده کرد:
البته نه در اینجا



If Dir(CurrentProject.Path & "\ActiveX\NameActiveX", vbDirectory) = "" Then
MsgBox
End If


موفق باشید

lorzadehj
پنج شنبه 29 فروردین 1392, 07:05 صبح
با سلام خدمت اساتید
آیا می شه کد نوشت که اگر ActiveX در هر کجای هارد ذخیره شده بود برنامه اون رو قبول کنه و نیازی به آدرس دادن دقیق reference نباشه
با تشکر فراوان

hamid-nice
پنج شنبه 29 فروردین 1392, 13:43 عصر
سلام مجدد جناب آقای بهرامی

از نظر لطف شما ممنونم

چند نکته رو هم اضافه کنم

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

تابع مورد نظر DIR هستش که به شکل زیر میتونید از اون استفاده کنید



Public Function FileExists(Path As String) As Boolean

If Not Dir(Path, vbDirectory) = vbNullString Then FileExists = True

End Function

در خصوص کد خطا که فرمودید صفر هستش ...

یکی از موارد ناخوشایند اینه که کسی که سئوال میپرسه دیگران رو علاوه بر اینکه مجاب به دادن پاسخ سئوال میکنه , مجاب به حدس زدن سئوال هم بکنه !!

توی سئوال موجود شما باید حدس بزنید که کد خطا هم چه چیزی هست !

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


موفق باشید دوست قدیمی من

با سلام و تشکر از توجه دوستان گرامی
1-
جناب پیروزمهر در مورد تابعی که معرفی کردید خیلی ممنون و مشکل با این مساله حل شد اما اگر شخصی ActiveX دیگری را که فقط نامش با ActiveX درست جایگزین کنه چون فقط نام چک شده دوباره هنگام کامپایل توابع اون به پیغام های زیر و حتی یک پیغام دیگر
" compile error"که نمی دونم شماره خطای این چند هست صادر می شه
آیا راهی برای چک اصلی یا اشتباه بودن ActiveX هست؟

2-من کد زیر را در رویداد on error فرم گذاشتم ولی نمی دونم چرا شماره خطا صادر نمی شه


Dim StrErrFa As String
Dim StrErrEn As String

StrErrFa = Nz(DLookup("[ErrFA]", "TBLErrors", "[ErrCode]=" & DataErr))
'StrErrEn = Nz(DLookup("[ErrEN]", "TBLErrors", "[ErrCode]=" & DataErr))
Response = DataErr
MsgBoxFa StrErrFa & vbCrLf & vbCrLf & StrErrEn, vbApplicationModal, "íÇã ÈÑäÇãå"


3-آیا اکسس با توابع API سازگاری خوبی نداره که گفتید تا می تونیم از اونها فاصله بگیریم لطفا کمی توضیح دهید و با چه توابع دیگر این توصیه را نیز دارید (مثلا SQL و ...)؟

4- شماره خطاهای صفر و 429 را هم بوسیکه کد زیر قرار دادم ولی بی فایده بود
On Error GoTo t


t:
If Err.Number = 0Then
MsgBoxFa " ˜Ï ãÔÎÕå ÔÎÕ ÑÇ æÇÑÏ ˜äíÏ"
End If

If Err.Number = 429Then
MsgBoxFa " ˜Ï ãÔÎÕå ÔÎÕ ÑÇ æÇÑÏ ˜äíÏ"
End If
منتظر راهنمایی شما یا دیگر دوستان در هر مورد فوق هستم

عکس های زیر صرفا با حذف اکتیوایکس از محلش صادر شده اند
با تشکر فراوان

hamid-nice
پنج شنبه 29 فروردین 1392, 20:48 عصر
با سلام
- شما قضاوت اشتباهی کردید من مخ اونها را خورده ام، اما به این نتیجه رسیدم که در مورد Access برنامه نویس حرفه ای ندارند و در این موارد کمکی نمی تونن بکنند چون این مساله مشکل قفل نیست بلکه مساله ای عمومی در مورد هر ActiveX که در اکسس بکار میره هست و مساله برنامه نویس هست

- در ضمن من اونقدر به اونها پیله کردم که قرار هست که هفته بعد یک جلسه بذاریم البته نه در مورد این موضوع (چون همونطور که گفتم این مساله اصلا مساله قفل نیست بلکه مساله برنامه نویسی هست )

- در مورد سوالات دیگه ای که مطرح کردم جوابی ندادید ! (یعنی اگر شخصی ActiveX دیگری را که فقط نامش با ActiveX درست هم نام است جایگزین کنه چون فقط نام چک شده دوباره هنگام کامپایل توابع اون به پیغام های زیر و حتی یک پیغام دیگر
" compile error"که نمی دونم شماره خطای این چند هست صادر می شه
آیا راهی برای چک اصلی یا اشتباه بودن ActiveX هست؟ )

- در مورد Pri Loader منظورتون مثل Auto it هست این برنامه در این مورد چگونه مشکل را حل می کنه آیا کار خاصی باید انجام دهیم یا همین که برنامه را با اون Run کنیم مساله حل می شه

ارادتنمند