بسم الله الرحمن الرحيم

 

 

الكاتب الموضوع: ملف عشوائي وامكانيات متقدمة
فرهاد حمدي

مبرمج محترف

عضو شرف


عضو رقم: 502

تم ارسال الموضوع في 08 ديسمبر 2000 11:09 AM                     

بسم الله الرحمن الرحيم
ساحاول وضع ملف عشوائي للبيانات بصورة مبسطة مع زيادة امكانياتها على مراحل وفي دروس متعاقبة انشاء الله
وكذلك وضع امكانية الترتيب تصاعديا ام تنازليا وحسب الحقل المحدد.
في هذه المرحلة تحتاج الى فورم واحد فقط واداتين صندوق نص واربعة ازرار اوامر واداة عنوان واحد

اذا كان برنامجك يتكون من فورم واحد فقط ضع العيارات التالية في قسم التصريحات العامة من الفورم
واذا كانت تحتوي اكثر من فورم اضف ملف Module الى المشروع وضع العبارات التالية فيها لتتمكن من استدعاءها من جميع النوافذ ولا تكتب كلمة Private
 

code:
Private Type AType
    name As String * 40
    city As String * 40
End Type

Dim a As AType
Dim FileNum As Integer
Dim CurrentRecord As Long
Dim LastRecord As Long
 

 

 


في هذا الكود اعلننا عن نوع المتحولات في ملف البيانات العشوائي.
وكما هو واضح فكل سجل يتكون من حقلين من نوع تكست بطول ثابت 40 محرف
واعلننا عن المتغيرات اللازمة وهي رقم الملف وعدد السجلات والسجل الحالي
والمتحول a ينتمي للنوع AType وبما انه متكون عنصرين فان المتحول a ايضا يحما نفس الصفات وبنفس الاسماء
 

code:
Private Sub Form_Load()
FileNum = FreeFile
Open App.Path + "\mydata.dat" For Random As FileNum Len = Len(a)
LastRecord = FileLen(App.Path + "\mydata.dat") / Len(a)
If LastRecord > 0 Then
    CurrentRecord = 1
    ShowRecord
End If
Label1.Caption = Str(CurrentRecord) + " / " + Str(LastRecord)
End Sub

 


في حدث التحميل للفورم قمنا بفتح الملف وفحص عدد السجلات واذا كانت اكثر من واحد يستدعى الاجراء ShowRecord ليعرض محتوياتها في صندوق النص رقم1 ورقم 2
 

code:
Private Sub Command1_Click()
If LastRecord > 0 Then
    CurrentRecord = 1
    ShowRecord
Else
    Beep
    MsgBox "لا يوجد سجلات"
End If
End Sub

 


في هذا الزر نقوم بفحص عدد السجلات فاذا كانت اكثر من صفر نتحول الى السجل الاول ونستدعي الاجراء ShowRecord لاظهار البيانات
 

code:
Private Sub Command2_Click()
If LastRecord > 0 Then
    If CurrentRecord > 1 Then
        CurrentRecord = CurrentRecord - 1
        ShowRecord
    Else
        Beep
        MsgBox "وصل السجلات الى البداية"
    End If
Else
    Beep
    MsgBox "لا يوجد سجلات"
End If
End Sub

 


في هذا الزر نقوم بفحص عدد السجلات فاذا كانت صفر نظهر رسالة تبين للمستخدم عدم وجود سجلات واذا كان اكبر من واحد نتحول سجل واحد الى الخلف ونستدعي الاجراء ShowRecord لاظهار البيانات
 

code:
Private Sub Command3_Click()
If LastRecord > 0 Then
    If CurrentRecord < LastRecord Then
        CurrentRecord = CurrentRecord + 1
        ShowRecord
    Else
        Beep
        MsgBox "وصل السجلات الى النهاية"
    End If
Else
    Beep
    MsgBox "لا يوجد سجلات"
End If

End Sub
 

 

 


في هذا الزر نقوم بفحص عدد السجلات فاذا كانت صفر نظهر رسالة تبين للمستخدم عدم وجود سجلات واذا كان اقل من عدد مجموع السجلات نتحول سجل واحد الى الامام ونستدعي الاجراء ShowRecord لاظهار البيانات
 

code:
Private Sub Command4_Click()
If LastRecord > 0 Then
    CurrentRecord = LastRecord
    ShowRecord
Else
    Beep
    MsgBox "لا يوجد سجلات"
End If

End Sub
 

 

 


في هذا الزر نقوم بفحص عدد السجلات فاذا كانت اكثر من صفر نتحول الى السجل الاخير ونستدعي الاجراء ShowRecord لاظهار البيانات
 

code:
Public Sub ShowRecord()
Get #FileNum, CurrentRecord, a
Text1.Text = Trim(a.name)
Text2.Text = Trim(a.city)
Label1.Caption = Str(CurrentRecord) + " / " + Str(LastRecord)
End Sub

 


هذا الاجراء يقوم بالحصول على حقول السجل الحالي واسناد قيمها الى صناديق النصوص المحددة لكل واحد منها واظهار حالة السجلات في اداة العنوان

اصبح الموضوع طويلا ولكن كان لابد من ذلك ليكون مفهوما اكثر
وفي الدرس القادم سنضيف امكانية اضافة وتعديل وحذف السجلات انشاء الله

فرهاد حمدي
farhad_hamdi@yahoo.com
التسامح انناء نبيل مثل سنبلة قمح ممتلئة

[This message has been edited by فرهاد حمدي (edited 09-12-2000).]


المشاركات 285 | من كردستان العراق- دهوك | سجل في: اغسطس 2000  |  IP: تم رصد IP

LOOP

عضو جديد

عضو رقم: 285

تم ارسال الموضوع في 08 ديسمبر 2000 01:32 PM                     

جزاك الله خيراً


المشاركات 12 | من الخبر | سجل في: يونية 2000  |  IP: تم رصد IP

فرهاد حمدي

مبرمج محترف

عضو شرف


عضو رقم: 502

تم ارسال الموضوع في 09 ديسمبر 2000 10:33 AM                     

بسم الله الرحمن الرحيم
اعتذر عن وجود اخطاء في كود الدرس الاول ولذلك ارجو من الاخوان الذين اخذو الكود ان يراجعوا الكود مرة اخرة فقد تم تصحيحها.
وسبب الاخطا هو اني كتبت الكود دون ان اجربه. ولذلك اكرر اعتذاري.
نكتفي في درس اليوم نضيف امكانية اضافة سجل جديد وحفظ التغيرات وازالة سجل .
اضف ثلاثة ازرار اوامر جديدة الي الفرم
 

code:
Private Sub Command5_Click()
LastRecord = LastRecord + 1
CurrentRecord = LastRecord
a.name = ""
a.city = ""
Put #FileNum, CurrentRecord, a
ShowRecord
End Sub

 


في هذا الكود نضيف سجل جديد الى اخر السجلات ونحول السجل الحالي الى السجل الاخير والمستحدث الان.
ثم نضع فيها قيم افتراضية ونستدعي الاجراء ShowRecord لاظهارها.
وبعد ذلك نبدا بكتابة الحقول.
وعلينا ان نحفظها قبل اضافة سجل جديد او الانتقال الي سجل اخر.
 

code:
Private Sub Command6_Click()
a.name = Text1.Text
a.city = Text2.Text
Put #FileNum, CurrentRecord, a
End Sub

 


في هذا الكود نقوم بوضع محتويات صناديق النص في الحقول المحددة لها ونحفظها في الملف.
 

code:
Private Sub Command7_Click()
If CurrentRecord = 0 Then
    Beep
    MsgBox "لا يوجد سجلات"
    Exit Sub
End If
Dim b As AType
Dim tmpFileNum As Integer
Dim tmpCurrentRecord As Long
Dim tmpLastRecord As Long
tmpFileNum = FreeFile
Open App.Path + "\mydata.tmp" For Random As tmpFileNum Len = Len(b)
Dim i As Long
For i = 1 To LastRecord
    If i <> CurrentRecord Then
        Get #FileNum, i, a
        tmpLastRecord = tmpLastRecord + 1
        tmpCurrentRecord = tmpLastRecord
        Put #tmpFileNum, tmpCurrentRecord, a
    End If
Next i
Close #FileNum
Close #tmpFileNum
Kill App.Path + "\mydata.dat"
Name App.Path + "\mydata.tmp" As App.Path + "\mydata.dat"
FileNum = FreeFile
Open App.Path + "\mydata.dat" For Random As FileNum Len = Len(a)
LastRecord = FileLen(App.Path + "\mydata.dat") / Len(a)
If CurrentRecord > LastRecord Then
    CurrentRecord = CurrentRecord - 1
    If CurrentRecord > 0 Then ShowRecord
End If
Label1.Caption = Str(CurrentRecord) + " / " + Str(LastRecord)
End Sub

 


في هذا الكود نقوم اولا بفحص السجل الحالي فاذا كان اكبر من صفر نبدا بفتح ملف مؤقت بنفس مواصفات الملف الاصلي.
ثم نقوم بقراءة السجلات واحدة بعد الاخرى فاذا كانت لا تساوي السجل الحالي والذي نريد حذفه نضعه في الملف الموقت الى ان ننتهي من ذلك وبعدها نغلق الملفين ونحذف الملف الاصلي ونعيد تسمية الملف المؤقت باسم الملف الاصلي ونعيد فتحه.
فاذا كان السجل المحذوف هو السجل الاخير نتحرك خطوة واحدة الا الخلف لان عدد السجلات ينقصها واحد.
اما اذا لم يكن السجل المحذوف السجل الاخير نعرض السجل الواقع بعد السجل المحذوف والذي تراجع خطوة واحدة الى الخلف واصبح في محل السجل المحذوف.
واخيرا نفحص السجل الحالى فاذا كان يساوي صفرا اي لم يبقى في الملف اي سجل نخرج من الاجراء ونعرض حالة السجلات في اداة العنوان اما اذا كان اكبر من صفر نستدعي ShowRecord لاظهارها.

نكتفي في هذا الدرس بهذه الاضافات وانشاء الله في الدرس القادم سنضيف امكانية الترتيب.

فرهاد حمدي
farhad_hamdi@yahoo.com
التسامح انحناء نبيل مثل سنبلة قمح ممتلئة

[This message has been edited by فرهاد حمدي (edited 09-12-2000).]


المشاركات 285 | من كردستان العراق- دهوك | سجل في: اغسطس 2000  |  IP: تم رصد IP

أسامة محمد

مبرمج نشيط

عضو رقم: 363

تم ارسال الموضوع في 09 ديسمبر 2000 01:50 PM                     

جزاك الله خيرا وكثر من امقالك
===============
حبي لك


المشاركات 238 | من السعودية | سجل في: يوليه 2000  |  IP: تم رصد IP

وليد الأنصاري

عضو نشيط

عضو رقم: 472

تم ارسال الموضوع في 09 ديسمبر 2000 04:43 PM                     

ملحوظة صغيرة أرجو من الأخوة التخلي عن الطريقة التالية
MyPath=App.Path & "\MyFile.Dat"
وإستبدالها بالتالي
MyPath=App.Path
if Right$(MyPath,1) <> "\" then MyPath = MyPath & "\"
فلو صادف وجود الملف على الروت سوف نحصل بالطريقة الأولى على النتيجة التالية

MyPath=App.Path & "\MyFile.Dat"
d:\\MyFile.Dat

يحدث ذلك الخطأ عندما يكون الملف التنفيذي على روت القرص المدمج
 


المشاركات 73 | من السعودية - الدمام | سجل في: يوليه 2000  |  IP: تم رصد IP

فرهاد حمدي

مبرمج محترف

عضو شرف


عضو رقم: 502

تم ارسال الموضوع في 09 ديسمبر 2000 05:40 PM                     

بسم الله الرحمن الرحيم
ملاحظة جيدة
ولكن بما ان الملف الذي نتعامل معه معلوم وموقعه على دليل البرنامج الذي نعمل عليه وليس على روت احد الاقراص وللاختصار لم اكتب الكود الذي ذكره الاخ وليد الانصاري.
اما اذا كان موقع الملف غير معلوم وتجنبا للاخطاء فمن الافضل اختبار الحرف الاخير من مسار الملف فاذا لم يكن يساوي خط مائل فيجب اضافة خط مائل اليه وبعدها اضافة اسم الملف اما اذا كان يساوي خط مائل فعندها فقط نضيف اسم الملف.

فرهاد حمدي
farhad_hamdi@yahoo.com
التسامح انحناء نبيل مثل سنبلة قمح ممتلئة


المشاركات 285 | من كردستان العراق- دهوك | سجل في: اغسطس 2000  |  IP: تم رصد IP

فرهاد حمدي

مبرمج محترف

عضو شرف


عضو رقم: 502

تم ارسال الموضوع في 10 ديسمبر 2000 10:55 AM                     

بسم الله الرحمن الرحيم
في هذا الدرس نكتفي باضافة امكانية ترتيب السجلات تصاعديا وسنقوم بمقارنة الحقلين حقل الاسم واسم المدينة معا ويمكن استخدام حقل واحد فقط اواكثر من حقل حسب الرغبة.
ضع على الفورم زر اوامر جديد
 

code:
Private Sub Command8_Click()
Dim i, T As Long
Dim SS As AType
For i = 1 To LastRecord
    Get #FileNum, i, a
    SS = a
Label1.Caption = Str(Int((i / LastRecord) * 100)) & " %"
DoEvents
    For T = i To LastRecord
        Get #FileNum, T, a
        If StrComp(a.name + a.city, SS.name + SS.city) = -1 Then
            Put #FileNum, i, a
            Put #FileNum, T, SS
            SS = a
        End If
    Next T
     DoEvents
Next i
CurrentRecord = LastRecord
ShowRecord
End Sub

 


في هذا الكود انشانا متغيير جديد يشبه المتغير a لنستعمله وسيطا عند تبديل محتويات السجلات
ولدينا حلقتين احدهما يبدا من السجل الاول وينتهي بالسجل الاخير
وفيها نقرأ محتويات السجل ونضعها في المتغيير SS
ونعرض النسبة المؤية لتقدم العملية في اداة العنوان
والحلقة الثانية تبدا من السجل الذي وصل اليه الحلقة الاولى وتنتهي بالسجل الاخير
اذا كانت نتيجة الدالة StrCopm = -1 فان ذلك يعني ان السجل الذي وجدناه في هذه الحلقة الثانية اصغر من السجل الذي قراناه في الحلقة الاولى
وعندها نبدا بتغير محتويات السجلين ونضع القيمة الجديدة في المتغيير ss
اذا اردنا ان يكون الترتيب تنازلبا تكتب بدل -1 نكتب 1
وهذا الى ان نصل الى نهاية الحلقة الاولى ونعرض السجل الاخير للمستخدم
وللتوضيح اكثر هو اننا نقوم بمقارنة السجل الاول مع ما بعده من سجلات الى ان نصل الى السجل الاخير وبعدها نتحرك الى السجل الثاني و نقوم بمقارنته بما بعده الى ان نصل السجل الاخير ونتحرك الى الثالث وهكذا...
ففي كل مرة يضيق نطاق المقارنة الى ان ينتهي عملية مقارنة السجلات.

املي هو ان تكونوا قد استفدتم
فاذا كانت لكم ملاحظات او استفسارات فانا في الخدمة
واذا اردتم نتابع الموضوع اكثر لنضيف اليه عمليات اخرى ايضا

فرهاد حمدي
farhad_hamdi@yahoo.com
التسامح انحناء نبيل مثل سنبلة قمح ممتلئة


المشاركات 285 | من كردستان العراق- دهوك | سجل في: اغسطس 2000  |  IP: تم رصد IP

 

جميع الحقوق محفوظةلمنتدى فيجوال بيسك

Powered by Infopop Corporation
Ultimate Bulletin BoardTM 6.04e