هل هناك فرق بين وضع الصور في قاعدة البيانات وخصوصا في الجداول مباشرة عن طريق عنصر التحكم OLE وبين وضع رابط نصي فقط يشير الى مكان وجود الصوره في اي محرك من محركات الاقراص على جهاز الكمبيوتر ؟
الاجابه :
طبعا الفارق كبير جدا بين الوضعين بدلالة تضخم حجم قاعدة البيانات التي تحتوي على الصور لانها تكون مضمنه اذن دعونا نأخذ الميزات والعيوب لكل نوع من الانواع
النوع الاول : في حالة وضع الصوره مياشرة في الجدول
المميزات :
1. بما انه تم تضمين هذه الصور في الجدول اذن اصبحت جزء من قاعدة البيانات . وهذه الميزه مهما نقلت قاعدة البيانات الى اي مكان فستضل مرتبطه بالقاعده .
2. لا يمكن ازالتها بسهوله . او التحكم بها لانها اصبحت بيانات ثنائيه .
العيوب :
1. تضخم قاعدة البيانات نظرا لما تحويه من صور مدمجه مع القاعدة
2. لا يقبل الا صيغة الصور من نوع BMP والكل يعلم ان هذا النوع كبير نسبيا مقارنة مع باقي الصيغ الخاصه بالصور .
3. مشكلة نقل قاعدة البيانات الى موقع اخر وهي بحجم كبير جدا قد يصل الى واحد قيقا بايت .
4. مشكلة فتح قاعدة البيانات المحملة بالصور فإذا انهارت لا يمكن اصلاحها ابدا نظرا لضخامتها .
النوع الثاني : في حالة وضع الصور في مجلد منفصل او في اي مكان من الكمبيوتر .
المميزات :
1. يعتبر هذا النوع من الانواع المفضلة لقواعد البيانات اكسيس نظرا لخفته وحجمة الصغير جدا .
2. الصور تكون على شكل مسار في جدول مثل C:\MyPhoto\za.jpg وهذا المسار لا يأخذ حيزا كبيرا من مساحة القاعدة فهو يشير فقط الى موقع الصوره
3. هذا النوع يقبل جميع صيغ الصور المعروفه مثل BMP و JPG و GIF و WMF و PSD
4. يتم التحكم بحجم الصوره من تكبير وتصغير تمدد او قطع .
العيوب :
1. عند نقل القاعدة تفقد الارتباط بالصور المخزن مسارها في الجدول ولن تظهر الصور حتى يتم تعريف الارتباط مجددا .
والان دعونا نقوم بعمل هذه القاعدة و ماذا نحتاج لذلك .
كل ما نحتاجه هو جدول به حقلين وليكن اسمه مثلا Imagetable
الحقل الاول : معرف او ImageID ..... ونوعه ترقيم تلقائي
الحقل الثاني : مسار الصوره او ImagePath ونوعه تص وحجمه 255 حرف
نموذج مبني على الجدول السابق وليكن اسم النموذج مثلا Imageform
1. نقوم بعرض النموذج في وضع التصميم ومن ثم نقوم بزيادة مساحته للاسفل بحيث يتسع لمكان صوره
2. نقوم بإدراج صوره في النموذج وذلك من خلال اشرطة الاداوت ومن ثم نختار ادراج ونختار صوره لتكون هي الاساس في حالة عدم وجود صورة او سجل جديد . وستكون هي بمثابة اطار وسوف نسمي هذا الاطار الخاص بالصوره ImageFrame
3. ننتقل الى مربع النص ImagePath ونختار خصائصه ومن ثم نضع هذا الكود في حدث الحالي وفي حدث بعد التحديث
Private Sub Form_Current() On Error Resume Next Me![ImageFrame].Picture = Me![ImagePath] End Sub
و
Private Sub ImagePath_AfterUpdate() On Error Resume Next Me![ImageFrame].Picture = Me![ImagePath] End Sub
من خلال الاحداث السابقه تم ربط الاطار ImageFrame الخاص بالصوره مع مربع النص ImagePath بحيث لو تغير مسار الصوره تتغير الصوره مع ما هو مكتوب في مربع النص .
الى هنـــــــــــــــا كل الامور ماشيه تمام باقي علينا بعض التحسينات فليس من المعقول انه كلما اردنا ادراج صوره ان نكتب ذلك يدويا فالعملية متعبه لذا سنقوم بعمل التالي :
بجانب مربع النص او قريب منه نقوم بوضع زر امر وليكن اسمه مثلا cmdAdd يعني زر امر اضافه صوره ونضع له في حدث عند النقر هذا الكود
Private Sub cmdAdd_Click() Dim strFilter As String Dim lngflags As Long Dim varFileName As Variant
strFilter = "All Files (*.*)" & vbNullChar & "*.*" _ & vbNullChar & "All Files (*.*)" & vbNullChar & "*.*"
lngflags = tscFNPathMustExist Or tscFNFileMustExist _ Or tscFNHideReadOnly
نلاحظ ان الحدث التالي يستدعى وحده نمطيه بها هذه الوظيفه tsGetFileFromUser
اذن كل ما علينا هو نسخ هذا الكود ووضعه في وحدة نمطية جديده وليكن اسمها مثلا basBrowseFiles
Option Compare Database Option Explicit Private Declare Function ts_apiGetOpenFileName Lib "comdlg32.dll" _ Alias "GetOpenFileNameA" (tsFN As tsFileName) As Boolean
Private Declare Function ts_apiGetSaveFileName Lib "comdlg32.dll" _ Alias "GetSaveFileNameA" (tsFN As tsFileName) As Boolean
Private Declare Function CommDlgExtendedError Lib "comdlg32.dll" () As Long
Private Type tsFileName lStructSize As Long hwndOwner As Long hInstance As Long strFilter As String strCustomFilter As String nMaxCustFilter As Long nFilterIndex As Long strFile As String nMaxFile As Long strFileTitle As String nMaxFileTitle As Long strInitialDir As String strTitle As String flags As Long nFileOffset As Integer nFileExtension As Integer strDefExt As String lCustData As Long lpfnHook As Long lpTemplateName As String End Type
' Flag Constants Public Const tscFNAllowMultiSelect = &H200 Public Const tscFNCreatePrompt = &H2000 Public Const tscFNExplorer = &H80000 Public Const tscFNExtensionDifferent = &H400 Public Const tscFNFileMustExist = &H1000 Public Const tscFNPathMustExist = &H800 Public Const tscFNNoValidate = &H100 Public Const tscFNHelpButton = &H10 Public Const tscFNHideReadOnly = &H4 Public Const tscFNLongNames = &H200000 Public Const tscFNNoLongNames = &H40000 Public Const tscFNNoChangeDir = &H8 Public Const tscFNReadOnly = &H1 Public Const tscFNOverwritePrompt = &H2 Public Const tscFNShareAware = &H4000 Public Const tscFNNoReadOnlyReturn = &H8000 Public Const tscFNNoDereferenceLinks = &H100000
Public Function tsGetFileFromUser( _ Optional ByRef rlngflags As Long = 0&, _ Optional ByVal strInitialDir As String = "", _ Optional ByVal strFilter As String = "All Files (*.*)" & vbNullChar & "*.*", _ Optional ByVal lngFilterIndex As Long = 1, _ Optional ByVal strDefaultExt As String = "", _ Optional ByVal strFileName As String = "", _ Optional ByVal strDialogTitle As String = "", _ Optional ByVal fOpenFile As Boolean = True) As Variant
On Error GoTo tsGetFileFromUser_Err Dim tsFN As tsFileName Dim strFileTitle As String Dim fResult As Boolean
' Allocate string space for the returned strings. strFileName = Left(strFileName & String(256, 0), 256) strFileTitle = String(256, 0)
' Set up the data structure before you call the function With tsFN .lStructSize = Len(tsFN) .hwndOwner = Application.hWndAccessApp .strFilter = strFilter .nFilterIndex = lngFilterIndex .strFile = strFileName .nMaxFile = Len(strFileName) .strFileTitle = strFileTitle .nMaxFileTitle = Len(strFileTitle) .strTitle = strDialogTitle .flags = rlngflags .strDefExt = strDefaultExt .strInitialDir = strInitialDir .hInstance = 0 .strCustomFilter = String(255, 0) .nMaxCustFilter = 255 .lpfnHook = 0 End With
' Call the function in the windows API If fOpenFile Then fResult = ts_apiGetOpenFileName(tsFN) Else fResult = ts_apiGetSaveFileName(tsFN) End If
' If the function call was successful, return the FileName chosen ' by the user. Otherwise return null. Note, the CancelError property ' used by the ActiveX Common Dialog control is not needed. If the ' user presses Cancel, this function will return Null. If fResult Then rlngflags = tsFN.flags tsGetFileFromUser = tsTrimNull(tsFN.strFile) Else tsGetFileFromUser = Null End If
tsGetFileFromUser_End: On Error GoTo 0 Exit Function
tsGetFileFromUser_Err: Beep MsgBox Err.Description, , "Error: " & Err.Number _ & " in function basBrowseFiles.tsGetFileFromUser" Resume tsGetFileFromUser_End
End Function
' Trim Nulls from a string returned by an API call.
Private Function tsTrimNull(ByVal strItem As String) As String
On Error GoTo tsTrimNull_Err Dim I As Integer
I = InStr(strItem, vbNullChar) If I > 0 Then tsTrimNull = Left(strItem, I - 1) Else tsTrimNull = strItem End If
tsTrimNull_End: On Error GoTo 0 Exit Function
tsTrimNull_Err: Beep MsgBox Err.Description, , "Error: " & Err.Number _ & " in function basBrowseFiles.tsTrimNull" Resume tsTrimNull_End
End Function
الان نقوم بحفظ ما قمنا بعمله ونختبر هذه القاعده وذلك بإدارج صور من خلال الزر الخاص بمربع حوار فتح الملفات
الحمد لله القاعدة اجتازت الاختبار وتم ادارج اول صوره من صنع يدينا وبكل بساطه ولكن لحظه لم ننتهي بعد .
طيب نريد نعمل شوية حركات فنيه ولمسات سحريه على البرنامج . مو مشكلة نعمل وفيها ايه طالما البرنامج حيكون ممتاز حسب المواصفات والمقاييس العالميه ISO2005
نرغب في عمل تقرير بحيث يعرض مره يعرض كل الصور دفعه وحده وعلى شكل صفحات ومره يعرض لنا صوره وحده فقط في السجل وكمان فيه شغله ثانيه ياريت تشيلون كل حاجة من التقرير وتتركوا بس الصوره في التقرير عشان احنا محتاجين هذا البرنامج لعرض صور المعاملات التي سحبناها بالاسكانر ووضعناها في مجلد خاص .
ابشروا حاضرين كل حاجه حنعملها بس لا تعصبوا علينا .
شوف ياعم نعمل تقرير مبني على الجدول ونسمي هذا التقرير مثلا rptImage سهله ولا اسهل منها وبعدين
نروح لاشرطة الادوات ونختار ادراج صوره " فاكرين الحركه دي لما عملناها في النموذج " حركه حلوه والا ايه رأيكم .
ونختار لها صوره عشان اذا ما فيه سجل او ان السجل جديد تعرض لنا هذه الصور " يوجد مع الملف المرفق صوره من صنع ايديه .
وكمان نسمي اطار الصوره ImageFrame كما سميناه في النموذج . وبعدين ......... وبعدين انت معاك خلونا نكمل ... كل شويه وبعدين وبعدين :lol: :lol:
الان نقوم بعرض التقرير في وضع تصميم ونذهب الى حدث تفصيل التقرير ونضع هذا الكود
Private Sub تفصيل_Format(Cancel As Integer, FormatCount As Integer) Me![ImageFrame].Picture = Me![ImagePath] End Sub
انتبه لكلمة " تفصيل " في النسخه العربيه من الاكسيس في الكود ممكن تكون تكون في النسخ الانجليزيه detail غيرها اذا عندك نسخة عنجليزيه ;)
نقوم الان بالتجربه وهل الكلام ده صحيح والا لألألألأ
الحمد لله البرنامج اجتاز الاختبار وكل ما اخترنا او غيرنا صوره في النموذج بتتغير كمان في التقرير ... احمدك يارب .
فاضل شغله بسيطه نعرض التقرير في عرض التصميم ونختار مربع النص ImagePath والتسميه الخاصه به و ImageID والتسميه الخاصه به ونختار خصائص ثم نختار مرئي ( لا )
الان استطعنا اخفاء كل شيئ عدى فريم او اطار الصوره نقوم بسحب الاطراف وتكبير الاطار يمين ويسار وفوق وتحت حتى يأخذ مساحة التقرير ونحاسب لايزيد حجم التقرير عن الطول والعرض اللازم عشان ما تختفي الصور . راجع التقرير في المثال المرفق . طيب وبعدين ؟؟
لا حول ولا قوة الا بالله وبعدين معاك انت خلينا نكمل . " ما عليش ياجماعه اصل فيه حاجه في الماوس بتعلق بالكتابه عشان كذا دايم اكتب وبعدين :lol: :lol:
الان سوف نعرض صفحه واحده فقط من التقرير والمسأله سهله
نقوم بعمل زر امر وخلونا نسميه مثلا ViewOne ونقوم بإختيار حدث له عند النقر ونضع هذا الكود
Private Sub ViewOne_Click() Dim strReportName As String Dim strCriteria As String If NewRecord Then MsgBox "الرجاء ادراج صوره جديده" _ , vbInformation, "Invalid Action" Exit Sub Else strReportName = "rptImage" strCriteria = "[ImageID]= " & Me![ImageID] DoCmd.OpenReport strReportName, acViewPreview, , strCriteria End If End Sub
وايضا نعمل زر للطباعه ونضع به هذا الكود في حدث عند النقر
Private Sub ViewOne_Click() Dim strReportName As String Dim strCriteria As String If NewRecord Then MsgBox "الرجاء ادراج صوره جديده" _ , vbInformation, "Invalid Action" Exit Sub Else strReportName = "rptImage" strCriteria = "[ImageID]= " & Me![ImageID] DoCmd.OpenReport strReportName, acViewPreview, , strCriteria End If End Sub
طيب وبعدين ..... يووووووووووووه
نقوم بعمل بقية الاوامر مثل اضافة وحذف وخروج وتحسين مظهر النموذج ..... وبعدين :lol:
تم النشر منذ (معدل)
من مجلد منفصل عن القاعده
اعزائي الكرام
السلام عليكم ورحمة الله وبركاته
سؤال :
هل هناك فرق بين وضع الصور في قاعدة البيانات وخصوصا في الجداول مباشرة عن طريق عنصر التحكم OLE وبين وضع رابط نصي فقط يشير الى مكان وجود الصوره في اي محرك من محركات الاقراص على جهاز الكمبيوتر ؟
الاجابه :
طبعا الفارق كبير جدا بين الوضعين بدلالة تضخم حجم قاعدة البيانات التي تحتوي على الصور لانها تكون مضمنه اذن دعونا نأخذ الميزات والعيوب لكل نوع من الانواع
النوع الاول : في حالة وضع الصوره مياشرة في الجدول
المميزات :
1. بما انه تم تضمين هذه الصور في الجدول اذن اصبحت جزء من قاعدة البيانات . وهذه الميزه مهما نقلت قاعدة البيانات الى اي مكان فستضل مرتبطه بالقاعده .
2. لا يمكن ازالتها بسهوله . او التحكم بها لانها اصبحت بيانات ثنائيه .
العيوب :
1. تضخم قاعدة البيانات نظرا لما تحويه من صور مدمجه مع القاعدة
2. لا يقبل الا صيغة الصور من نوع BMP والكل يعلم ان هذا النوع كبير نسبيا مقارنة مع باقي الصيغ الخاصه بالصور .
3. مشكلة نقل قاعدة البيانات الى موقع اخر وهي بحجم كبير جدا قد يصل الى واحد قيقا بايت .
4. مشكلة فتح قاعدة البيانات المحملة بالصور فإذا انهارت لا يمكن اصلاحها ابدا نظرا لضخامتها .
النوع الثاني : في حالة وضع الصور في مجلد منفصل او في اي مكان من الكمبيوتر .
المميزات :
1. يعتبر هذا النوع من الانواع المفضلة لقواعد البيانات اكسيس نظرا لخفته وحجمة الصغير جدا .
2. الصور تكون على شكل مسار في جدول مثل C:\MyPhoto\za.jpg وهذا المسار لا يأخذ حيزا كبيرا من مساحة القاعدة فهو يشير فقط الى موقع الصوره
3. هذا النوع يقبل جميع صيغ الصور المعروفه مثل BMP و JPG و GIF و WMF و PSD
4. يتم التحكم بحجم الصوره من تكبير وتصغير تمدد او قطع .
العيوب :
1. عند نقل القاعدة تفقد الارتباط بالصور المخزن مسارها في الجدول ولن تظهر الصور حتى يتم تعريف الارتباط مجددا .
والان دعونا نقوم بعمل هذه القاعدة و ماذا نحتاج لذلك .
كل ما نحتاجه هو جدول به حقلين وليكن اسمه مثلا Imagetable
الحقل الاول : معرف او ImageID ..... ونوعه ترقيم تلقائي
الحقل الثاني : مسار الصوره او ImagePath ونوعه تص وحجمه 255 حرف
نموذج مبني على الجدول السابق وليكن اسم النموذج مثلا Imageform
1. نقوم بعرض النموذج في وضع التصميم ومن ثم نقوم بزيادة مساحته للاسفل بحيث يتسع لمكان صوره
2. نقوم بإدراج صوره في النموذج وذلك من خلال اشرطة الاداوت ومن ثم نختار ادراج ونختار صوره لتكون هي الاساس في حالة عدم وجود صورة او سجل جديد . وستكون هي بمثابة اطار وسوف نسمي هذا الاطار الخاص بالصوره ImageFrame
3. ننتقل الى مربع النص ImagePath ونختار خصائصه ومن ثم نضع هذا الكود في حدث الحالي وفي حدث بعد التحديث
و
من خلال الاحداث السابقه تم ربط الاطار ImageFrame الخاص بالصوره مع مربع النص ImagePath بحيث لو تغير مسار الصوره تتغير الصوره مع ما هو مكتوب في مربع النص .
الى هنـــــــــــــــا كل الامور ماشيه تمام باقي علينا بعض التحسينات فليس من المعقول انه كلما اردنا ادراج صوره ان نكتب ذلك يدويا فالعملية متعبه لذا سنقوم بعمل التالي :
بجانب مربع النص او قريب منه نقوم بوضع زر امر وليكن اسمه مثلا cmdAdd يعني زر امر اضافه صوره ونضع له في حدث عند النقر هذا الكود
نلاحظ ان الحدث التالي يستدعى وحده نمطيه بها هذه الوظيفه tsGetFileFromUser
اذن كل ما علينا هو نسخ هذا الكود ووضعه في وحدة نمطية جديده وليكن اسمها مثلا basBrowseFiles
الان نقوم بحفظ ما قمنا بعمله ونختبر هذه القاعده وذلك بإدارج صور من خلال الزر الخاص بمربع حوار فتح الملفات
الحمد لله القاعدة اجتازت الاختبار وتم ادارج اول صوره من صنع يدينا وبكل بساطه ولكن لحظه لم ننتهي بعد .
طيب نريد نعمل شوية حركات فنيه ولمسات سحريه على البرنامج . مو مشكلة نعمل وفيها ايه طالما البرنامج حيكون ممتاز حسب المواصفات والمقاييس العالميه ISO2005
نرغب في عمل تقرير بحيث يعرض مره يعرض كل الصور دفعه وحده وعلى شكل صفحات ومره يعرض لنا صوره وحده فقط في السجل وكمان فيه شغله ثانيه ياريت تشيلون كل حاجة من التقرير وتتركوا بس الصوره في التقرير عشان احنا محتاجين هذا البرنامج لعرض صور المعاملات التي سحبناها بالاسكانر ووضعناها في مجلد خاص .
ابشروا حاضرين كل حاجه حنعملها بس لا تعصبوا علينا .
شوف ياعم نعمل تقرير مبني على الجدول ونسمي هذا التقرير مثلا rptImage سهله ولا اسهل منها وبعدين
نروح لاشرطة الادوات ونختار ادراج صوره " فاكرين الحركه دي لما عملناها في النموذج " حركه حلوه والا ايه رأيكم .
ونختار لها صوره عشان اذا ما فيه سجل او ان السجل جديد تعرض لنا هذه الصور " يوجد مع الملف المرفق صوره من صنع ايديه .
وكمان نسمي اطار الصوره ImageFrame كما سميناه في النموذج . وبعدين ......... وبعدين انت معاك خلونا نكمل ... كل شويه وبعدين وبعدين :lol: :lol:
الان نقوم بعرض التقرير في وضع تصميم ونذهب الى حدث تفصيل التقرير ونضع هذا الكود
انتبه لكلمة " تفصيل " في النسخه العربيه من الاكسيس في الكود ممكن تكون تكون في النسخ الانجليزيه detail غيرها اذا عندك نسخة عنجليزيه ;)
نقوم الان بالتجربه وهل الكلام ده صحيح والا لألألألأ
الحمد لله البرنامج اجتاز الاختبار وكل ما اخترنا او غيرنا صوره في النموذج بتتغير كمان في التقرير ... احمدك يارب .
فاضل شغله بسيطه نعرض التقرير في عرض التصميم ونختار مربع النص ImagePath والتسميه الخاصه به و ImageID والتسميه الخاصه به ونختار خصائص ثم نختار مرئي ( لا )
الان استطعنا اخفاء كل شيئ عدى فريم او اطار الصوره نقوم بسحب الاطراف وتكبير الاطار يمين ويسار وفوق وتحت حتى يأخذ مساحة التقرير ونحاسب لايزيد حجم التقرير عن الطول والعرض اللازم عشان ما تختفي الصور . راجع التقرير في المثال المرفق . طيب وبعدين ؟؟
لا حول ولا قوة الا بالله وبعدين معاك انت خلينا نكمل . " ما عليش ياجماعه اصل فيه حاجه في الماوس بتعلق بالكتابه عشان كذا دايم اكتب وبعدين :lol: :lol:
الان سوف نعرض صفحه واحده فقط من التقرير والمسأله سهله
نقوم بعمل زر امر وخلونا نسميه مثلا ViewOne ونقوم بإختيار حدث له عند النقر ونضع هذا الكود
وايضا نعمل زر للطباعه ونضع به هذا الكود في حدث عند النقر
طيب وبعدين ..... يووووووووووووه
نقوم بعمل بقية الاوامر مثل اضافة وحذف وخروج وتحسين مظهر النموذج ..... وبعدين :lol:
خلاص انتهينا وهذا ملف مرفق
Photo2005.rar
من خلال المشاركه احببت ان اضفي نوع من المرح لان الموضوع طويل وحتى لا يمل القارئ الكريم احببنا يفرفش ويتعلم ويستفيد مع احترامي وتقديري للجميع
اختكم
زهره
تم تعديل بواسطه zahrahشارك هذا الرد
رابط المشاركة
شارك الرد من خلال المواقع ادناه