دوست عزیز، به سایت علمی نخبگان جوان خوش آمدید

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

توجه داشته باشید، در صورتی که عضو سایت نباشید نمی توانید از تمامی امکانات و خدمات سایت استفاده کنید.
نمایش نتایج: از شماره 1 تا 7 , از مجموع 7

موضوع: آموزش گام به گام ویژوال بیسیک6.0

  1. #1
    کـــــــاربر فــــعال
    رشته تحصیلی
    مکانیک سیالات
    نوشته ها
    11,179
    ارسال تشکر
    13,156
    دریافت تشکر: 21,945
    قدرت امتیاز دهی
    56319
    Array
    ریپورتر's: خوشحال2

    پیش فرض آموزش گام به گام ویژوال بیسیک6.0

    آشنایی با ویژوال بیسیک 6 تاریخچه ویژال بیسیک.
    با شناختی که از تاریخچه ویژوال بیسیک بدست می آورید راحت تر می توانید از آن استفاده کنید.
    شرکت مایکروسافت ویژوال بیسیک را براساس یک زبان برنامه نویسی به نام بیسیک که برای مبتدیان نوشته شده است ساخت.
    زبان ویژوال بیسیک بیشتر از 35 سال به اشکال مختلف رایج بوده. در واقع طراحان این زبان می خواستند یک زبان برنامه نویسی برای استفاده مبتدیان طراحی کنند.برنامه نویسان جدید می توانند با استفاده ازبیسیک به سرعت به شرع برنامه نویسی های حرفه ای با زبان های cobol .fortran . assembler
    در مقایسه به بیسیک کار بیشتری نیاز داشت.
    طبیعت بصری ویژوال بیسیک
    دیدید که ویژال بیسیک 6 چیزی بیشتر از یک زبان برنامه نویسی است. از ویژوال بیسیک در نام آن visualبه معنای بصری یا محیط نمایشی . است.
    کار با ویژال بیسیک 6
    در اولین بار که برنامه را باز می کنید با پنجره new project روبه رو می شوید در این قسمت
    نوع فورم خود را انتخاب کرده ماننده activex|standardو....
    این پنجره شامل 3 قسمت بوده
    New:در این پنجره امکان انتخاب فورم مورد نظر شما امکان پذیر می باشد.
    Existing:در این پنجره امکان انتخاب project های مختلف که در مکانهای مختلف ذخیره یا... امکان انتخاب می باشد.
    Recent:در این قسمت هر projectرا که ذخیره می کنید به صورت دسته ای جمع می شود حالا یک فایلی
    در درایو Dباشد حالا چه در درایو c.
    DON.T SHOW THIS DIALOG IN THE FUTURE
    این قسمت جلو گیری از باز شدن پینجره NEW PRIJECT می باشد.
    HELP:از این قسمت وقتی امکان استفاده می باشد که نرم افزار MSDN را نصب کرده باشید.
    معرفی قسمت های بیسیک.
    نوار ابزار:TOOLBAR:نوار ابزار VB زیر منو قرار دارد. ویژال بیسیک کلا چهار نوار ابزار دارد:
    STANDARD:این نوار ابزار زیر منو ظارهر است و پیش فرض است.
    DEBUG:وقتی از ابزارهای رفع اشکال برای ردیابی و اصلاح اشکالات استفاده می کنید. این نوار ابزار ظاهر می شود.
    EDIT:این نوار ابزار برای تنظیم کردن اشیاء بر روی فرم می باشد
    FORM EDITOR:این نوار ابزار برای تنظیم کردن اشیاء بر روی فرم می باشد.
    جعبه ابزار:TOOLBOX:
    در این پنجره تمامی شئعی های مختلف برای کار بر روی فرم هستند و حتا امکان اضافه کردن به این پنجره ها می باشد.
    پنجرهPROJECT:در این پنجره فرم های انتخبی شما با هر گروه و هر فرم مشخص شده است.
    پنجرهPROPERTISE:
    این پنجره امکان تنضیمات لازم برای هر شیئی را مشخص می کنید.
    نویسنده مجید رحیمی.
    پایان قسمت اول


    قسمت دوم ساخت اولین برنامه
    برای درک آسان بودن نرم افزار بیسیک
    الان می خواهم برایتان یک برنامه ساده بنویسم که فقط با چند خط ساده نوشته شده است .
    چون الان تازه اول کار هستیم از توابع و کارهای دیگرش شروع نمی کنم.
    ابتدا 2 عدد Taxtboxگزاشته از جعبه ابزار
    کد زیر را در Text1 قرار داده.
    If Text1.text="majid" Then
    Text2.text="rahimi"
    End If
    کد بسیار راحتی بود.
    خط اول گفتیم که اگر در Text1 نوشتند Majid
    د خط دوم نوشتیم در Text2 بنویسد Rahimi
    و در آخر گفتیم پایان
    درک کد بالا باید آسان باشد.
    ما از دستور If استفاده کردیم که در درسهای آینده خواهم گفت.
    دستور بالا يك آموزش بود براي اينكه به شما نشان بدهيم كه ويژوال بيسيك چه قدر آسان مي باشد.

    قسمت دوم
    معرفی بری فراخوانی کامپننت ها یا شیئی ها که در قسمت toolbar میتوانید دید.
    البطه خودتان هم می توانید چنین شیئی یا کامپوننت های بسازید ولی الان وقتش نیست در قسمت های بعدی آموزش می دهم.
    با زدن کلید ctrl+t یا از پنجره projectبر روی coomponntes کلیک کرده .
    پنجره componntes قابل مشاهده است. پنجره control کنترل ها یا کامپوننت های از قبل تعریف شده برای کار است که با کلید بر روی هر کدام اعمال خواصی را انجام می دهد.
    و با کلیک بر روی browse..امکان انتخاب از داخل هارد را امکان پذیر می باشد.
    فرمت این کامپوننت های ocxمی باشد.
    insertabel قسمت مخصوص کامپوننت های برنامه های مختلف می باشد . مانند ماکرومدیا فلش و.....
    که با انتخاب هر کدام می توانید مثالا می خواهید یک فایل فلش را در برنامهه خود بگزارید. به وسیله این کامپوننت های امکان پذیر است.مانند گزاشتن فیلم. صدا. تصاویر متحرک و ...... . . . .
    که با انتخاب هر کدام در کنار toolbar نمایان می شود
    ادامه دارد قسمت دوم ادامه دارد
    کار با فايل در ويژوال بيسيک - بخش اول
    مقدمه

    بعلت عدم وجود اشاره گر در ويژوال بيسيک عمليات کار با فايلها در آن نسبتاً ساده می باشد .
    بطور کلی فايلها بر دو نوع هستند :
    1 - فايلهای متنی Text File : اين فايلها فقط شامل کاراکترهای اسکی و برخی کاراکترهای خاص مانند انتهای خط و انتهای فايل هستند .
    ۲ - فايلهای باينری Binary File : شامل هر نوع کاراکتری می توانند باشند و کاربردهای گسترده ای دارند مانند بانک های اطلاعاتی ، فايلهای اجرائی ، فايلهای گرافيکی و غيره
    ويژوال بيسيک می تواند با هر دو نوع فايل کار کند .

    چگونگی باز کردن فايلها

    قبل از اينکه بتوان عمليات ورودی/خروجی را روی يک فايل انجام داد ابتدا بايستی آنرا باز کرد . باز کردن فايلها در ويژوال بيسيک توسط دستور Open انجام می شود . فرمت کلی اين دستور بصورت زير است :

    Open filename [For mode] [Access access][lock] As [#]filenumber [Len=reclen]x


    [ پارامترهای داخل کروشه اختياری هستند . ]
    filename نام فايلی است که می خواهيم آنرا باز کنيم .
    mode حالت باز کردن فايل است . اين حالتها عبارتند از :
    - Input : فايل بعنوان ورودی باز می شود .
    - Output : فايل بعنوان خروجی باز می شود .
    - Binary : فايل از نوع باينری باز می شود .
    - Append : فايل طوری باز می شود که بتوان به انتهای آن چيزی اضافه کرد .
    - Random
    access نوع دسترسی به فايل را مشخص می کند . انواع دسترسيها عبارتند از :
    - Read : خواندن فايل
    - Write : نوشتن در فايل
    - ReadWrite : خواندن و نوشتن فايل
    lock نوع دسترسی ساير برنامه ها به اين فايل را مشخص می کند . انواع دسترسيها عبارتند از :
    - Shared : دسترسی اشتراکی
    - Lock Read
    - Lock Write
    - Lock Read Write
    filenumber عددی است که ويژوال بيسيک از آن برای دسترسی به فايل استفاده می کند .اين عدد بايستی برای هر فايل منحصر بفرد و بين ۱ تا ۵۱۱ باشد . برای بدست آوردن اولين شماره آزاد می توان از تابع FreeFile استفاده کرد .
    reclen :طول بافر فايل است . اين عدد بايستی از ۳۲۷۶۷ کو چکتر باشد .

    در صورتی که فايلی که توسط filename مشخص شده وجود نداشته و فايل برای Append ، Binary ، Output و يا Random باز شده باشد در اينصورت يک فايل جديد با اين نام ساخته می شود .
    در صورتی که فايل بصورت باينری باز شده باشد پارامتر Len ناديده گرفته می شود .

    چگونگی بستن فايل

    پس از پايان کار با فايل برای بستن آن از دستور Close استفاده می کنيم . فرمت اين دستور بصورت زير است :

    Close #filenumber


    دستور Close بدون هيچ پارامتری تمام فايلهای باز را می بندد .

    کار با دايرکتوری

    ۱ - گرفتن Dir : توسط دستور Dir می توان نام فايلهای موجود در يک دايرکتوری را بر اساس پارامترهايي که به آن می دهيم پيدا کنيم . برای مثال :

    Myfile=Dir$("c:\text\*.txt)"x


    دستور فوق نام اولين فايل موجود در دايرکتوری C:\TEXT را که پسوند آنها txt باشد در متغير Myfile قرار می دهد . اگر دستور فوق را بدون پارامتر مجدداً اجرا کنيم نام دومين فايل برگرداننده می شد و الی آخر
    Dir دارای يک پارامتر اختياری است که نوع فايلهای مورد نظر را نيز می توان با آن مشخص نمود . مثال :

    Myfile=Dir$("c:\text\*.txt",vbNormal)x


    مقادير ممکن اين پارامتر عبارتند از :
    vbNormal ، vbHidden ، vbSystem ، vbDirectory
    ۲ - تغيير دايرکتوری : برای تغيير دايرکتوری از دستور ChDir استفاده می شود مثال :

    ChDir "c:\windows\system32"x


    ۳ - تغيير درايو : برای تغيير درايو از دستور ChDrive استفاده می شود مثال :

    ChDrive "E:"x


    ۴ - ساخت دايرکتوری : برای ايجاد دايرکتوری جديد از دستور MKDir استفاده می شود مثال :

    MKDir "c:\MyFolder"x


    ۵ - حذف دايرکتوری : برای حذف دايرکتوری از دستور RmDir استفاده می شود مثال :

    RmDir "C:\MyFoler"x کار با فايل در ويژوال بيسيک - بخش دوم

    خواندن از فايل :

    1 - دستور Input : توسط دستورهای Input و Line Input می توان محتوای فايلهای متنی و باينری را خواند .
    دستور Input به دو صورت بکار می رود :
    Input #Filenumber,ReadData
    ReadData=Input(Charnum,Filenumber)x
    دستور اول کل يک فايل را خوانده و در متغير ReadData قرار می دهد . دستور دوم ، تعداد Charnum بايت از فايلی با شماره Filenumber را خوانده و در متغير ReadData قرار می دهد .
    اين دو دستور تمام کاراکترهای موجود در فايل را می خوانند . برای اينکه بتوان فايل را خط به خط خواند ، از دستور Line Input استفاده کنيد :
    Line Input #Filenumber,ReadData
    البته از دستور Line Input بيشتر برای خواندن فايلهای متنی استفاده می شود زيرا ممکنست در فايل باينری هيچ کاراکتر انتهای خط ( CRLF ) وجود نداشته باشد و يکباره کل فايل خوانده شود .

    ۲ - دستور Get : از اين دستور برای خواندن فايلهای باينری با دسترسی تصادفی ( Random Access ) استفاده میشود :
    Get #Filenumber,[Recordnum%],ReadData
    اين دستور رکورد شماره Recordnum را از فايلی با شماره Filenumber می خواند و در متغير ReadData قرار می دهد . علامت کروشه نشان می دهد که پارامتر Recordnum اختياری است و در صورتيکه ذکر نشود داده ها از رکورد بعدی فايل ( جائيکه اشاره گر فايل آنجا قرار دارد ) خوانده می شوند .

    نوشتن در فايل :

    ۱ - دستور Print : توسط اين دستور می توان اطلاعاتی را در فايل قرار داد :
    Print #FileNumber,WriteData
    دستور فوق محتويات متغير WriteData را در فايلی با شماره FileNumber می نويسد . بوسيله دستور Print می توان اطلاعات را بصورت خط به خط در فايل نوشت برای مثال :
    Print #1,"Hello Visual Basic"+Vbcrlf
    عبارت Vbcrlf نشان دهنده کاراکتر انتهای خط ( CRLF ) در ويژوال بيسيک می باشد .

    ۲ - دستور Put : اين دستور برای نوشتن داده ها در فايلهای باينری با دسترسی تصادفی بکار می رود :
    Put #FileNumber,[Recordnum],WriteData
    اين دستور محتويات متغير WriteData را در رکورد شماره Recordnum قرار می دهد .

    تعيين محل رکورد در فايلهای با دسترسی تصادفی :

    برای منتقل کردن اشاره گر فايل به يک رکورد در يک فايل باينری با دسترسی اتفاقی ، از دستور Seek استفاده می شود . اين دستور محل يک بايت را در فايل می گيرد و اشاره گر فايل را در آنجا قرار می دهد بنابراين دستورات Put و Get می توانند با اين رکورد کار کنند :
    Seek #FileNumber,RecordNumber

    تشخيص انتهای فايل :

    برای اينکه متوجه شويم به انتهای يک فايل رسيده ايم از دستور EOF استفاده می کنيم . اين دستور يکی از مقادير True يا False را بر می گرداند که نشان می دهد به انتهای فايلرسيده ايم يا نه . از اين تابع در حلقه های Do-While استفاده می شود :
    Do While Not (EOF(FileNumer))x
    .
    .
    .
    Loop
    حلقه فوق تا زمانيکه فايل موردنظر به انتها نرسيده باشد اجرا خواهد شد .

    بدست آوردن طول يک فايل :

    بوسيله دستور LOF می توان طول محتويات يک فايل را بدست آورد :
    FileSize=LOF(FileNumber)x

    بدست آوردن محل اشاره گر فايل :

    توسط دستور Loc می توان محل جاری اشاره گر فايل را بدست آورد . اجرا شدن اين دستور محل اشاره گر را تغيير نمی دهد :
    FilePosition=Loc(FileNumber)x

    ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول مقدمه :

    ساختارهاي داده اي از نظر تعداد اعضا به دو دسته استاتيک و ديناميک تقسيم مي شوند . ساختارهاي استاتيک مثل آرايه هاي يک بعدي و آرايه هاي دو بعدي ، تعداد اعضاي آنها در زمان طراحي برنامه مشخص مي شود و در طول اجراي برنامه ثابت است اما تعداد اعضاي ساختارهاي داده اي ديناميک در طول اجراي برنامه تغيير مي کند . ليست پيوندي ( LinkList ) ، پشته ( Stack ) ، صف ( Queue ) و درختهاي باينري ( Tree Binary) ، نمونه هايي از ساختارهاي داده اي ديناميک هستند .
    ليست پيوندي شامل مجموعه اي از عناصر داده اي است که اضافه و حذف اعضا در هر جاي ليست ممکن است .
    پشته يک ساختار داده اي مهم در کامپايلرها و سيستم هاي عامل است که عمل اضافه و حذف عناصر از ابتداي آن انجام مي شود .
    صف يک ساختار داده اي است که عمل اضافه کردن از انتها و عمل حذف کردن از ابتداي آن انجام مي شود .
    درختهاي دودويي براي جستجوي بسيار سريع ، ذخيره سازي داده ها و کامپايل عبارات استفاده مي شوند .

    نوع داده Variant :

    نوع داده variant براي متغيرهايي بکار مي رود که بطور صريح نوع آنها تعريف نشده است مثال :
    Dim value As Variant
    اين نوع داده مي تواند هر نوع داده اي را در خود ذخيره کند . همچنين براي ايجاد ساختارهاي داده اي مثل ليست هاي پيوندي ، صف ، پشته و درخت مناسب است .
    نوع داده موجود در variant مي توان توسط توابع VarType و TypeName تعيين کرد . تابع VarType يک مقدار صحيح برمي گرداند که نشان دهنده نوع ذخيره شده در variant است .
    مثال :
    Dim value as Variant
    value=”Hello”x
    در اينصورت مقدار بازگشتي ( VarType( value برابر 4 خواهد بود .
    تابع TypeName يک رشته برمي گرداند که نشان دهنده نام نوع داده ذخيره شده در variant است .

    اخذ حافظه بطور ديناميک Dynamic Memory Allocation :

    براي ايجاد و نگهداري ساختارهاي داده اي ديناميک بايستي در هنگام اجراي برنامه بتوان فضاي بيشتري براي نگهداري داده هاي جديد بدست آورد . با استفاده از کلمه کليدي New مي توان در ويژوال بيسيک حاقظه ديناميک گرفت :
    Set NewNode=New ListNode
    که ListNode يک شي از ساختار داده اي مورد نظر ماست .

    کلاسهاي خود ارجاعي :

    کلاس خودارجاعي نوعي کلاس است که داراي يک اشاره گر ( Pointer ) به يک شي از همان نوع کلاس باشد . براي مثال اگر کلاس ما به اسم ClistNode باشد و متغير زير را در آن تعريف کنيم ، اين کلاس يک کلاس خود ارجاعي است :
    Private mNextNode as ClistNode
    از mNextNode براي لينک دادن اعضاي يک ساختار داده اي ديناميک بهم استفاده مي شود ( بعبارت ديگر گره زدن يک شي از کلاس ClistNode به يک شي ديگر از همان کلاس ) . شي هاي خودارجاعي مي توانند به همديگر لينک شوند و ساختارهاي داده اي مثل ليست پيوندي ، صف ، پشته و درخت را ايجاد کنند .
    شکل زير دو شي خود ارجاعي را نشان مي دهد که بصورت يک ليست بهم لينک شده اند . عبارت NULL بدين معنا است که شي خودارجاعي به شي ديگري اشاره نمي کند ( Nothing ) و نشان دهنده انتهاي ساختار داده است .

    کار با فايل در ويژوال بيسيک - بخش سوم
    ساير عمليات کار با فايل :

    ۱ - حذف فايل : برای حذف يک يا چند فايل از دستور Kill استفاده می شود :
    Kill "C:\Temp\MyFile.txt"x
    Kill "C:\Temp\*.txt"x

    ۲ - انتقال فايل : برای انتقال يک فايل از يک دايرکتوری به دايرکتوری ديگر از دستور Name استفاده می شود . مبدا و مقصد بايستی روی يک درايو باشند . اگر دايرکتوری مبدا و مقصد يکی باشد فايل تغيير نام داده می شود :
    Name "C:\Temp\File1.txt" To "C:\Temp2\File2.txt"x

    ۳ - کپی کردن فايل : برای کپی کردن يک فايل از يک دايرکتوری به دايرکتوری ديگر از دستور FileCopy استفاده می شود :
    FileCopy "\File1.txt\ To "C:\Temp\File2.txt"x

    ۴ - بدست آوردن تاريخ و زمان آخرين تغيير فايل و يا زمان ايجاد فايل : برای اين کار از دستور FileDateTime استفاده می شود . ابتدا بايستی يک متغير از نوع Variant تعريف کرده و سپس توسط اين دستور تاريخ و زمان موردنظر را استخراج کنيم :
    Dim FileInfo As Variant
    FileInfo=FileDateTime("C:\Temp\MyFile.txt")x

    ۵ - استخراج طول فايل : برای بدست آوردن طول يک فايل بر حسب بايت از دستور FileLen استفاده می شود :
    FileSize=FileLen("C:\MyFile.txt")x

    ۶ - تغيير صفت يک فايل : برای تغيير صفت يک فايل از دستور SetAttr استفاده می شود . پارامترهای اين دستور عبارتند از :
    0 : فايل معمولی
    2 : فايل مخفی
    4 : فايل سيستمی

    SetAttr FileNumber,FileAttrib

    مقابله با خطاهای کار با فايل :

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

    ۵۲ : شماره يا نام فايل صحيح نيست
    ۵۳ : فايل پيدا نشد
    ۵۴ : حالت فايل صحيح نيست
    ۵۵ : فايل قبلاً باز شده
    ۵۸ : فايل از قبل وجود دارد
    ۵۹ : طول رکورد صحيح نيست
    ۶۱ : ديسک پر است
    ۶۲ : عبور از انتهای فايل
    ۶۳ : شماره رکورد صحيح نيست
    ۷۰ : دسترسی ممنوع است
    ۷۱ : ديسک آماده نيست
    ۷۶ : مسير پيدا نشد

    در هنگام مقابله با خطا بهتراست از يک ساختار Select-Case استفاده کنيد :
    Select Case Err
    Case 71
    MsgBox "Drive is Not Ready"x
    .
    .
    .
    End Select
    ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم ليست پيوندي

    همانطور که گفته شد ليست پيوندي مجموعه اي از يکسري داده است که اين داده ها از نوع اشيا خودارجاعي هستند . ( هر شي خودارجاعي داراي يک متغير نوع variant براي نگهدار مقدار و يک اشاره گر به شي بعدي است ) . هر عضو ليست پيوندي را يک گره گويند . هر ليست پيوندي از طريق يک اشاره گر به اولين گره قابل دسترسي است . گره هاي بعدي از طريق قسمت لينک موجود در هر گره قابل دسترس هستند . همچنين لينک آخرين گره با Nothing تنظيم مي شود که انتهاي ليست را نشان مي دهد .
    مزيت اصلي ليست هاي پيوندي نسبت به آرايه اينست که تعداد عناصر ليست پيوندي قابل تغيير است . بعبارت ديگر ليست هاي پيوندي بصورت ديناميک هستند و طول آنها قابل تغيير است اما سايز آرايه ثابت است . ( البته ويژوال بيسطک از آرايه هاي با سايز متغير نيز پشتيباني مي کند اما اين عمل تغيير سايز اتوماتيک نيست .)
    عمل درج در ليست پيوندي ساده است و تنها بايستي دو اشاره گر تغيير يابد .
    ليست هاي پيوندي را مي توان به سادگي با قراردادن هر عضو جديد در محل صحيح بصورت sortشده نگهداري کرد .
    اعضاي ليست پيوندي در حافظه بصورت پيوسته ذخيره نمي شوند بنابراين نمي توان فوراً به هر عضو ليست دسترسي داشت ( بر خلاف آرايه ) .
    براي ايجاد ليست پيوندي در ويژوال بيسيک نياز به سه کلاس است :

    1 – کلاس ClistNode : کلاسي است که هر گره از ليست را توصيف مي کند :

    private mNodeData as Variant
    private mNextNode as ClistNode
    public Property Get Data() as Variant
    Data=mNodeData
    End Property
    Public Property Let Dta(ByVal vNewValue as Variant)x
    MNodeData=vNewValue
    End Property
    Public Property Get NextNode() as ClistNode
    Set NextNode=mNextNode
    End Property
    Public Property Let NextNode(Byval vNewValue as Variant)x
    Set mNextNode=vNewValue
    End Property



    2 – کلاس Clist براي توصيف ليست پيوندي .
    mFirstNode براي اشاره به اولين ClistNode و mLastNode براي اشاره به آخرين ClistNode در يک شي clist بکار می رود . زمانيکه يک Clsit ايجاد مي شود اين دو متغير با Nothing تنظيم مي شوند . روال Property Get Iterator يک شي ClistIterator برمي گرداند که مي توان از آن براي حرکت در بين اعضاي ليست استفاده کرد .

    Private mFirstNode as ClistNode
    Private mLastNode as ClistNode
    Public Function IsEmpty() as boolean
    IsEmpty=IIf(mFirstNode Is Nothing,True,False)x
    End function
    Public Sub InsertAtFront(insertItem as variant)x
    Dim tempNode as ClistNode
    If IsEmpty() then
    Set mFirstNode=New ClistNode
    Set mLastNode=mFirstNode
    Else
    Set tempNode=mFirstNode
    Set mFirstNode=New ClistNode
    MFirstNode.NextNode=tempNode
    End if
    MFirstNode.Data=insertItem
    End sub
    Public sub InsertAtBack(insertItem as Variant)x
    Dim tempNode as ClistNode
    If IsEmpty() then
    Set mLastNode=New ClistNode
    Set mFirstNode=mLastNode
    Else
    Set tempNode=mLastNode
    Set mLastNode=New ClistNode
    TempNode.NextNode=mLastNode
    End if
    MLastNode.Data=insertItem
    End sub
    Public function RemoveFromFront()x
    Dim removeItem as Variant
    If IsEmpty() then
    Msgbox list is empty
    RemoveFromFront=Null
    Exit function
    End if
    RemoveItem=mFirstNode.Data
    If mFirstNode Is mLastNode then
    Set mFirstNode=Nothing
    Set mLastNode=Nothing
    Else
    Set mFirstNode=mFirstNode.NextNode
    End if
    RemoveFromFront=removeItem
    End function
    Public Function RemoveFromBack()x
    Dim removeItem as Variant
    Dim current as ClistNode
    If IsEmpty() then
    Msgboc list is empty
    RemovefromBack=Null
    Exit function
    End if
    RemoveItem=mLastNode.Data
    If mFirstNode Is mLastNode then
    Set mFirstNode=nothing
    Set mLastNode=Nothing
    Else
    Set current=mFirstNode
    While Not current.NextNode Is mLastNode
    Set current=current.NextNode
    Wend
    Set mLastNode=current
    Current.NextNode=nothing
    End if
    RemoveFromBack=removeItem
    End function
    Public property Get Iterator() as variant
    Dim iter as ClistIterator
    Set iter=New ClistIterator
    Iter.StartNode=mFirstNode
    Set Iterator=iter
    End property


    عملکرد روال InsertAtFront :
    a – فراخواني IsEmpty براي تعيين خالي بودن ليست
    b – اگر ليست خالي باشد mFirstNode و mLastNode به New ClsitNode اشاره مي کنند .
    c – اگر ليست خالي نباشد گره جديد توسط اشاره دادن tempNode به اولين گره ليست و سپس اشاره دادن mFirstNode به گره New ClsitNode و سپس اشاره دادن mFirstNode.NextNode به tempNode ساخته مي شود .
    d – تنظيم mFirstNode.Data با مقدار مورد نظر
    عملکرد روال InsertAtBack :
    a – فراخواني IsEmpty براي تعيين خالي بودن ليست
    b – اگر ليست خالي باشد mFirstNode و mLastNode به New ClsitNode اشاره مي کنند .
    c – اگر ليست خالي نباشد گره جديد توسط اشاره دادن tempNode به آخرين گره ليست و سپس اشاره دادن mLastNode به گره New ClsitNode و سپس اشاره دادن tempNode.NextNode به mLastNode ساخته مي شود .
    d – تنظيم mLastNode.Data با مقدار مورد نظر
    عملکرد روال RemoveFromFront :
    a – اگر ليست خالي باشد Null برگشت داده مي شود .
    b – اگر ليست خالي نباشد داده mFirstNode به removeItem اختصاص داده مي شود .
    c – اگر ليست فقط يک گره داشته باشد mFirstNode و mLastNode با Nothing مقدار دهي مي شوند و گره از ليست حذف مي شود .
    d – اگر گره بيش از يک عضو داشته باشد mFirstNode برابر mFirstNode.NextNode مي شود .
    e – مقدار removeItem برگشت داده مي شود .
    عملکرد روال RemoveFromBack :
    a – اگر ليست خالي باشد Null برگشت داده مي شود .
    b – اگر ليست خالي نباشد داده mLastNode به removeItem اختصاص داه مي شود .
    c – اگر ليست يک گره داشته باشد mFirstNode و mLastNode با Nothing مقدار دهي مي شوند و گره از ليست حذف مي شود .
    d – اگر ليست بيش از يک گره داشته باشد متغير current برابر mFirstNode مي شود . سپس با استفاده از current روي گره هاي ليست حرکت مي کنيم تا به گره اي برسيم که به آخرين گره اشاره مي کند . سپس mLastNode را به گره اي که current به آن اشاره مي کند قرار مي دهيم و مقدار current.NextNode را Nothing مي کنيم تا بعنوان آخرين گزه ليست معرفي شود .
    e – مقدار removeItem برگشت داده مي شود .

    3 – کلاس ClistIterator : اين کلاس براي حرکت روي گره هاي ليست و دستکاري هر گره بکار مي رود . از حرکت کننده ها براي چاپ ليست و يا انجام دادن عملي بر روي هر عضو Clist مي توان استفاده کرد . اين کلاس داراي دو متغير از نوع ClistNode به نامهاي mBookmark و mFirstNode است . متغير mFirstNode به اولين گره در Clist اشاره مي کند و متغير mBookmark موقعيت فعلي حرکت کننده بر روي Clist را نشان مي دهد . روال Property Let StartNode اين دو متغير را مقدار دهي اوليه مي کند . تابع NextItem اگر مقدار mBookmark برابر Null باشد ، Null برگشت مي دهد و در غيراينصورت مقدار tempData را برابر mBookmark.Data و مقدار mBookmark را برابر mBookmark.NextNode قرار مي دهد . تابع HasMoreItems اگر ليست داراي چندين عضو باشد True برمي گرداند . روال ResetBookmark حرکت کننده را به ابتداي ليست منتقل مي کند .

    Private mBookmark as ClistNode
    Private mFirstNode as ClistNode
    Public Property Let StartNode(Byval vNewValue as variant)x
    Set mFirstNode=vNewValue
    Set mBookmark=mFirstNode
    End property
    Public function NextItem()x
    Dim tempData as varaint
    If mBookmark Is nothing then
    NextItem=Null
    Else
    TempData=mBookmark.Data
    Set mBookmark=mBookmark.NextNode
    NextItem=tempData
    End if
    End function
    Public function HasMoreItems() as boolean
    HasMoreItems=IIf(Not mBookmark Is nothing,True,False)x
    End function
    Public sub ResetmBookmark()x
    MBookmark=mFirstNode
    End sub



    در بخش سوم نمونه برنامه ای را با استفاده از اين کلاسها خواهيم ساخت .


    ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم مثالی از استفاده از کلاسهای ليست پيوندی :
    ابتدا کلاسهايي که در جلسه قبل معرفی شد را به پروژه تان اضافه کنيد . سپس در بخش کدنويسی فرمتان ، ابتدا يک شی از نوع کلاس Clist بصورت زير تعريف کنيد :

    Dim list as New Clist


    در فرمتان سه CommandButton با نامهای AddFirst ، AddLast و ShowList و نيز يک TextBox با نام ListMember قرار دهيد .
    کد زير را برای رويداد کليک شدن دکمه AddFirst بنويسيد :

    Call list.InsertAtFront(ListMember.text)x


    کد زير را برای رويداد کليک شدن دکمه AddLast بنويسيد :

    Call list.InsertAtBack(ListMember.text)x


    کد زير را برای رويداد کليک شدن دکمه ShowList بنويسيد :

    Dim elements as New ClistIterator
    Set elements=list.Iterator
    If elements.HasMoreItems=false then msgbox ("list is empty")x
    Else
    While elements.HasMoreItems
    Msgbox(elements.NextItem)x
    Wend
    end if



    پشته :
    پشته نوعي ليست پيوندي است که گره هاي جديد ، فقط به انتهاي آن مي توانند اضافه شوند . بهمين دليل به پشته ، ساختمان داده LIFO مي گويند . قسمت لينک آخرين گره پشته با Nothing مقدار دهي مي شود که نشان دهنده پايين پشته است .
    روالهاي اصلي پشته Push و Pop هستند .
    Push يک گره جديد به بالاي پشته اضافه مي کند و Pop از بالاي پشته گره اي را حذف کرده و مقدار داده آن را بر مي گرداند .


    در بخش چهارم کلاسی را برای کار با پشته معرفی خواهم کرد .

    نا له پنداشت که در سینه ی ما جا تنگ است

    رفت و برگشت سراسیمه که دنیا
    تنگ است

  2. 2 کاربر از پست مفید ریپورتر سپاس کرده اند .


  3. #2
    کـــــــاربر فــــعال
    رشته تحصیلی
    مکانیک سیالات
    نوشته ها
    11,179
    ارسال تشکر
    13,156
    دریافت تشکر: 21,945
    قدرت امتیاز دهی
    56319
    Array
    ریپورتر's: خوشحال2

    پیش فرض آموزش گام به گام ویژوال بیسیک6.0 (2)

    ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم کد:

    کلاس پشته :
    همانطور که در بخش قبل گفته شد پشته نوعی ليست پيوندی است که گره هاي جديد فقط به انتهاي آن اضافه شوند . روالهاي اصلي پشته Push و Pop هستند .
    Push يک گره جديد به بالاي پشته اضافه مي کند و Pop از بالاي پشته گره اي را حذف کرده و مقدار داده آن را بر مي گرداند .
    يک کلاس پشته را با استفاده از کلاس Clist و بصورت زير پياده سازي مي کنيم :

    Private list As New Clist
    Public Sub Push(value as Variant)x
    List.InsertAtFront(value)x
    End sub
    Public Function Pop As Variant
    Pop=list.RemoveFromFront()x
    End Function
    Public Function IsStackEmpty() As Boolean
    IsStackEmpty=list.IsEmpty()x
    End function
    Public Property Get Iterator() as variant
    Set Iterator=list.Iterator
    End Property


    در اين کلاس ابتدا يک شی از نوع کلاس Clist تعريف شده است . سپس متدهای Push توسط متد InsertAtFront و Pop توسط متد RemoveFromFront پياده سازی شده اند .
    يک برنامه نمونه :
    برای نوشتن يک برنامه برای کار با پشته ابتدا کلاس Stack را که کد آن را در بالا ديديد به پروژه تان اضافه کنيد . سپس در بخش کد مربوط به فرمتان ابتدا يک شی از نوع کلاس Stack بصورت زير تعريف کنيد :

    Dim mStack as New Stack


    سپس در فرمتان سه CommandButton با نامهای Push و Pop و ShowStack و نيز يک TextBox با نام StackMember قرار دهيد .
    کد زير را برای کليک شدن دکمه Push بنويسيد :

    mStack.push(StackMember.text)x


    کد زير را برای کليک شدن دکمه Pop بنويسيد :

    StackMember.text=mStack.Pop()x


    کد زير را برای کليک شدن دکمه ShowStack بنويسيد :

    Dim elements as New ClistIterator
    Set elements=mStack.Iterator
    If elements.HasMoreItems=false then msgbox "stack is empty"x
    Else
    While elemets.HasMoreItems
    Msgbox elements.NextItem
    Wendايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم
    صف :
    صف نوعي ساختار داده اي است که گره ها از ابتداي صف ( سر صف head ) حذف مي شوند و از انتهاي صف ( ته صف tail ) اضافه مي شوند . بنابر اين ، صف يک ساختار داده اي FIFO است . صف دارای دو متد به نامهای AddQueue و DelQueue است که اولین متد ، عنصری را به انتهای صف اضافه می کند و دومين متد ، عنصری را از ابتدای صف حذف می کند .
    براي ايجاد کلاس Cqueue از کلاس Clist استفاده مي کنيم :

    Private list as New Clist

    Public Sub AddQueue(value as Variant)x
    List.InsertAtBack(value)
    End sub

    Public Function DelQueue() as Variant
    DelQueue=list.RemoveFromFront
    End function

    Public property Get Iterator() as Variant
    Set Iterator=list.Iterator
    End Property


    درخت :
    ليستهاي پيوندي ، پشته ها و صف ها جزو ساختارهاي داده اي خطي هستند در حاليکه يک درخت ، يک ساختار داده اي دو بعدي با خصوصيات ويژه اي است . گره هاي درخت داراي دو يا چند لينک هستند . در اينجا در مورد درختهاي دودويي يا باينري بحث مي کنيم که در آن همه گره ها داراي دو لينک هستند . گره ريشه اولين گره در درخت است . هر لينک گره ريشه ، به يک فرزند اشاره مي کند . به فرزندان يک گره Siblings مي گويند . به گره بدون فرزند ، برگ يا Leaf گفته مي شود .
    درختهاي جستجوي باينري درخت هايي هستند که در آنها مقدار فرزند چپ هر گره کمتر از گره پدر و مقدار فرزند سمت راست هر گره بيشتر از گره پدر مي باشد .




    در بخش ششم يک کلاس برای پياده سازی درختهای جستجوی باينری ايجاد خواهيم کرد .
    ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم
    کلاس درختهای جستجوی باينری

    برای ايجاد درختهای جستجوی باينری در ويژوال بيسيک نياز به ايجاد دو کلاس داريم :
    1 - کلاس CTreeNode که هر ند درخت دودويي را توصيف می کند . اين کلاس دارای يک متغير به نام mNodeData از نوع Variant برای نگهداری داده هر گره است . همچنين دارای دو متغير اشاره گر به نامهای mLeft و mRight می باشد که به ترتيب به فرزند چپ و فرزند راست درخت اشاره می کنند .
    متد Get Data مقدار داده هر گره را بر می گرداند و متد Let Data مقدار داده هر گره را تنظيم می کند .
    متد Get Left آدرس فرزند چپ هر گره را برمی گرداند و متد Let Left فرزند چپ هر گره را تنظيم می کند .
    متد Get Right آدرس فرزند راست هر گره را برمی گرداند و متد Let Right فرزند راست هر گره را تنظيم می کند .
    متد Insert برای اضافه کردن فرزند به يک گره به کار می رود . اگر مقدار گره ای که می خواهيم بعنوان فرزند به درخت اضافه کنيم کوچکتر از مقدار خود گره باشد بعنوان فرزند چپ و در غير اينصورت بعنوان فرزند راست به گره اضافه می شود . اضافه شدن نيز بدين صورت است که ابتدا بررسی می شود آیا گره قبلاً فرزندی داشته است يا نه ؟ اگر نداشته باشد ( mLeft و يا mRight برابر Nothing باشد ) اين گره جديد مستقيماً به گره متصل می شود اما اگر گره قبلاً فرزندی داشته باشد متد Insert برای آن فرزند اضافه می شود و اينکار تا جايی ادامه می يابد که به گره ای برسيم که فرزندی نداشته باشد :

    Private mLeft as CtreeNode
    Private mRight as CtreeNode
    Private mNodeData as Variant

    Public Property Get Data() as variant
    Data=mNodeData
    End property
    Public Property Let Data(Byval vNewValue as Variant)x
    MNodeData=vNewValue
    End property
    Public Property Get Left() as variant
    Set Left=mLeft
    End property
    Public Property Let Left(Byval vNewValue as variant)x
    Set mLeft=vNewValue
    End property

    Public Property Get Right() as variant
    Set Right=mRight
    End Property
    Public Property Let Right(Byval vNewValue as variant)x
    Set mRight=vNewValue
    End Property

    Public Sub Insert(value as variant)x
    If valueIf mLeft Is Nothing Then
    Set mLeft=New CtreeNode
    MLeft.Data=value
    Else
    MLeft.Insert(value)x
    End if
    Elseif value>mNodeData then
    If mRight Is Nothing then
    Set mRight=New CtreeNode
    MRight.Data=value
    Else
    MRight.Insert(value)x
    End if
    End if
    End sub


    2 - کلاس CTree : اين کلاس برای ايجاد درخت بکار می رود . اين کلاس دارای متغيری بنام mRoot از نوع CTreeNode برای تعريف ريشه درخت است . همچنين يک متغير mOutputString برای نمايش دادن اعضای درخت دارد .

    Private mRoot as CtreeNode
    Private mOutputString as String

    Public Sub InsertNode(value as Varaint)x
    If mRoot Is Nothing then
    Set Mnode=New CtreeNode
    MRoot.Data=value
    Else
    MRoot.Insert(value)x
    End if
    End sub

    Public PreorderTraversal()x
    MOutputString=””x
    Call PreorderHelper(mRoot)x
    End sub

    Private Sub PreorderHelper(node As CtreeNode)x
    If node Is nothing Then
    Exit sub
    End if
    MOutputString=mOutputString & node.Data & “ “x
    Call PreorderHelper(node.left)x
    Call PreorderHelper(node.right)x
    End sub

    Public Sub InorderTraversal()x
    MOutputString=””x
    Call InorderHelper(mRoot)x
    End sub

    Private Sub InorderHelper(node as CtreeNode)x
    If node Is nothing then
    Exit sub
    End if
    Call InorderHelper(node.Left)x
    MOutputString=mOutputString & node.Data & “ “x
    Call InorderHelper(node.Right)x
    End sub

    Public PostorderTraversal()x
    MOutputString=””x
    Call PostorderHelper(mRoot)x
    End sub

    Private Sub PostorderHelper(node as CtreeNode)x
    If node Is Nothing then
    Exit sub
    End if
    Call PostorderHelper(node.Left)x
    Call PostorderHelper(node.Right)x
    MOutputString=mOutputString & node.Data & “ “x
    End sub

    Public Property Get Output() as Varaint
    Output=mOutputString
    End Property


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

    ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پايانی انواع روشهای پيمايش عناصر درخت :
    ۱ - روش InOrder : در اين روش ابتدا عناصر نيمه سمت چپ درخت ، سپس ريشه و در آخر عناصر نيمه سمت راست درخت نمايش داده می شوند .
    ۲ - روش PreOrder : در اين روش ابتدا ريشه درخت ، سپس عناصر نيمه سمت چپ و در پايان عناصر نيمه سمت راست درخت نمايش داده می شوند .
    ۳ - روش PostOrder : در اين روش ابتدا عناصر نيمه سمت چپ درخت ، سپس عناصر نيمه سمت راست درخت و در پايان ريشه درخت نمايش داده می شوند .
    مثال : درخت زير را در نظر بگيريد :




    نتيجه پيمايش InOrder درخت : 1,3,4,5,6,7,8
    نتيجه پيمايش PreOrder درخت : 5,3,1,4,7,6,8
    نتيجه پيمايش PostOrder درخت : 1,4,3,6,8,7,5
    بررسی متدهای کلاس CTree :
    متد InsertNode : اگر گره ريشه برابر Null باشد value را برابر مقدار گره ريشه قرار می دهد . در غير اينصورت متد Insert مربوط به گره ريشه فراخوانی می شود .
    متد PreorderTraversal : رشته چاپ عناصر ريشه را خالی می کند و سپس متد پيمايش Preorder را فراخوانی می کند .
    متد InorderTraversal : رشته چاپ عناصر ريشه را خالی می کند و سپس متد پيمايش Inorder را فراخوانی می کند .
    متد PostorderTraversal : رشته چاپ عناصر ريشه را خالی می کند و سپس متد پيمايش Postorder را فراخوانی می کند .
    متد Get Output : عناصر پيمايش شده درخت را برمی گرداند .
    يک برنامه نمونه :
    ابتدا کلاسهای CTreeNode و CTree را به پروژه تان اضافه کنيد . سپس متغير زير را در قسمت کدنويسی فرمتان تعريف کنيد :

    Dim mTree as New Ctree


    سپس در فرمتان يک Textbox با نام Value و دو Command Button با نامهای Insert و Show قرار دهيد .
    کد زير را برای وارد کردن عنصر به درخت برای دکمه Insert بنويسيد :

    mTree.InsertNode(Value.Text)x


    کد زير را برای پيمايش InOrder درخت برای دکمه Show بنويسيد :

    Call mTree.InorderTraversal


    شي Collection :
    ويژوال بيسيک داراي شي پيش ساخته اي به نام Collection است که مي تواند مجموعه اي از مقادير با هر نوع داده اي را در خود ذخيره کند . در واقع عناصر موجود در يک Collection مي توانند داراي نوعهاي داده اي متفاوت باشند . شي Collection قابليت رشد ديناميک دارد .
    شي Collection توسط کلمه کليدي New ايجاد مي شوند . توسط متد Add مي توان به Cllection عضو اضافه کرد و توسط متد Remove مي توان عضوي را از آن حذف کرد . هر عضو از Collection توسط متد Item قابل دستيابي است . با استفاده از خاصيت Count مي توان تعداد اعضاي موجود در Collection را تعيين نمود . بصورت پيش فرض اعضاي جديد به انتهاي Collection اضافه مي شوند ولي توسط آرگومانهاي اختياري متد Add مي توان محل اضافه شدن را تغيير داد .
    متد Remove يک شماره مي گيرد که موقعيت عضوي را که مي خواهيم آنرا حذف کنيم مشخص مي کند .
    توسط دستورات زير مي توان اعضاي يک Collection را نمايش داد :

    Dim mCollection as New Collection
    Dim element as Variant
    .
    .
    .
    For Each element In mCollection
    Msgbox element


    element متغيري از نوع variant براي اشاره به هر عضو Collection مي باشد .
    برنامه نويسی شبکه و اينترنت در Vb بخش اول مروری بر TCP/IP

    نکته : مطالب زير تنها در حد يک يادآوري مي باشد . اگر اطلاعات کمي در مورد TCP/IP داريد به کتابهاي موجود مراجعه کنيد .

    پروتکل Protocol : قراردادي است براي برقراري ارتباط در شبکه

    مدل TCP/IP : مجموعه اي از پروتکلهاي ارتباطي مرتبط بهم است که مکانيزمها و سرويسهاي مورد نياز جهت برقراري ارتباط در اينترنت را مهيا مي کنند . اين مدل شامل ۴ لايه است :
    ۱ - لايه کاربرد Application Layer : شامل برنامه هاي کاربردي و پروتکلهايي مثل Http ، Ftp ، Smtp ، Pop و Telnet مي باشد .
    ۲ - لايه انتقال Transport Layer : اين لايه شامل دو پروتکل TCP و UDP است . پروتکل TCP وظيفه کنترل رسيدن بسته هاي داده به مقصد ( TCP/IP داده ها را به بسته هاي کوچکي تقسيم مي کند که هر بسته حاوي آدرس فرستنده ، گيرنده و شماره بسته مي باشد ) ، تصحيح خطا و مرتب سازي بسته ها را برعهده دارد . UDP پروتکلي شبيه TCP است با اين تفاوت که هيچ ضمانتي براي رسيدن بسته هاي اطلاعاتي در آن وجود ندارد و معمولاً در انتقال صوت و ويدئو روي اينتزنت استفاده مي شود .
    ۳ - لايه اينترنت Internet Layer : شامل پروتکل IP است که مسئول مسيريابي بسته هاي اطلاعاتي مي باشد .
    ۴ - لايه دسترسي به شبکه Link Layer : شامل بخشي از هسته سيستم عامل و نيز درايورهاي واسط شبکه براي کار با سخت افزار شبکه مي باشد .

    سوکت Socket و پورت Port : سوکت يک ورودي انتزاعي در لايه انتقال مي باشد که براي ايجاد ارتباطات مختلف TCP/IP بکار مي رود . اغلب برنامه هاي کاربردي که از TCP و UDP استفاده مي کنند ، عمليات انتقال اطلاعات خود را با ساخت يک سوکت و سپس انجام يکسري عمليات روي آن انجام مي دهند . اين عمليات عبارتند از :
    ۱ - عمليات کنترلي : شامل اختصاص يک شماره پورت به سوکت ، initiate کردن يا accpet کردن يک ارتباط ، از بين بردن سوکت
    ۲ - عمليات انتقال داده : شامل نوشتن داده روي سوکت و خواندن داده از سوکت
    ۳ - عمليات بررسي وضعيت : مثل پيدا کردن آدرس IP مربوط به سوکت ، پيدا کردن شماره پورت سوکت و غيره

    HTTP : پروتکل انتقال داده براي وب است .

    FTP : پروتکل انتقال فايل روي اينترنت است .

    SMTP و POP : پروتکلهاي ارسال و دريافت email مي باشند
    ادامه قسمت دوم ساخت منو ها
    2 روش برای فراخوانی پنجره مربوط به منو یعنی menu editor امکان پذیر می باشد.
    1:فراخوانی از پنجره نوار ابزار کلید بر روی menu editor
    2:راست کلیک بر روی فرم و انتخاب menu editor
    بعد از باز شدن پنجره menu editor گزینه های پیش روی شما نمایان می شود.
    تعریف:
    Caption=در این قسمت نام منو را مشخص کنید.
    Name = در این قسمت نام اصلی منو که در قسمت برنامه نویسی بکار می رود می نویسید
    Index=اگر نام یک منو ماننده هم بود از این قسمت استفاده می کنید.
    helpcontextID= در این قسمت شماره آی دی برای گزاشتن راهنما را می گزاررید.
    Checked=این قسمت کنار منو یک علامت تیک می گزارد.
    Enabled= این قسمت اجرا یا غیر اجرا بودن یک فورم را نمایش می دهد.
    Visibeld= این قسمت برای نمایش دادن منو است. آیا نمایش داده شود یا خیر
    Shortcut=در این قسمت مشخص می کند که هر دکمه از یک کلید یا کلیدهای استفاده کند مانندهalt+c
    Next =برای ساخت یا جلو رفتن برای منو
    Insert=فاصله گزاری
    Deleted=پاک کردن یک منو
    اگر در قسمت caption یک – بگزارید یک جدا کننده ساخته می شود.
    کلید های راست چپ پایین بالا برای
    پایین بالا برای عوض کردن جاهای یک منو است.
    چپ و راست هم برای اینکه منو ساخته شده خودش باز کننده داشته باشد یا نه.
    در قسمت کد نویسی امکانات اینکه رنگ منو چه باشد و....... امکان پذیر است.

    ادامه قسمت دوم انواع داده ها در ویژال بیسیک؟
    قواعد اولیه:
    وقتی می خواهیم با کد کا کنیم لازم است که چند نکته مقدماتی را بدانیم.مثلا اینکه کدها به فرم ها و کنترل های برنامه متصل می شوند. در ابتدا بخاطر داشته باشید. که از طریق پنجره project می توانید برنامه های خود را سازماندهی کنید و همه فایلهای مرتبط با برنامه را مشاهده نمایید با وجودی که روالها رویداد را درون پنجره code می نویسید اما اینها به فایل های خاص برای خودشان نیاز ندارند. بلکه همراه با کنترل های مربوط در یک جا قرار می گیرند.بعنوان مثال پروژههای که تا به اینجات کار کردیم فقط شامل یک فرم بود و آن فرم کنترلها و روال های رویداد مربوط به آن کنترل ها را حفظ می کند.
    همانطوریکه خواهید دید یک فرم می تواند کدی را نگه دارد که لوزما کد روال رویداد نیست بلکه یک کد چند منظوره است.
    بعضی پروژه ها انواع دیگری از کدها را حفظ می کنند.در فصل قبل یاد گرفتید که همه کد درون روال ها ظاهر می شود و ویژال بیسیک از سابروتین و تابع پشتیبانی می کند.روالهای رویداد در گروه سابروتین قرار می گیرند اما در طول کتاب با نحوه نوشتن توابع نیز آشنا می شوید.چنانچه یک روال رویداد مربوط یک کنترل خاص نباشد می توانید در یک مدول کد جدا گانه ظاهر شود پنجره project فهرست مدولها را هم نشان می دهند.
    پنجره project properties را باز کرده از داخل منو project
    Project type= این قسمت مخصوص انتخاب نوع form می باشد.form activex……
    Startup object= این قسمن مشخص می کنید که در موقع اجراع برنامه کدام یک از فرم های شما اجرا شود.اگر که یک عدد فورم داشته باشید که همان یک عدد فورم ظاهر می شود ولی اگر تعداد فرم های شما از 2 عدد بیشتر باشد امکان انتخاب یکی ز این فرم ها امکان پذیر است.
    پنجره کد نویسی دارای چندین قسمت است.
    قسمت اعلان
    روالها عمومی
    شروع رواهای یک رویداد.
    داده ها در ویژوال بیسیک:
    برای انجام محاسبات در ویژال بیسیک لازم است چند نوع داده را پردازش کنید . مثلا با نام ها نشانی ها مقادیر پولی اعداد بزرگ و کوچک و داده های منطقی کار کنید.داده های منطقی می توانند درست یا غلط باشند. ویژال بیسیک از بسیاری از انواع داده ها پشتیبانی می کند لذا همه نیازهای برنامه نویسی را می تواند بپوشاند.
    قبل از اینکه با یک داده کار کنید لازم است به ویژوال بیسیک اعلام کنید که نوع این داده چیست .

    داه های عددی
    بطور کلی همه داده های عددی در دو گروه قرار می گیرند:
    اعداد صحیحintegers=اعداد کامل بدون ممیز اعشاری می باشند مثل 614.934-و938.3.918
    اعداد صحیح نشان دهنده سن . تعداد . سال و غیره می باشند.
    اعداد اعشاری decimals:اعداد دارای ممیز اعشاری می باشند که مقادیر کسری را نشان می دهند مثل
    8.709.0.005و-402.35534اعداد اعشاری که گاهی اعداد با ممیز شناور floating point
    نیز نامیده می شوند نشان دهنده درجه حرارت نرخ بهره و غیره می باشند. در کلیه اعداد اعشاری باید ممیز اعشاری را قرار دهید حتی اگر قسمت کسری سمت راست ممیز مساوی صفر باشند.
    هفت نوع داده عددی که ویژوال بیسیک از آنها پشتیبانی می کند.

    نوع حافظه مورد نیاز محدوده مقادیر
    Byte یک بایت 0تا 255
    Integer دوبایت -32.768تا32.767
    Long چهار بایت -2.147,483,648 تا 2,147,483,647
    Single چهار بایت ||مقادیر منفی از3.402823e+38 تا -1.401298e-45 مقادیر مثبت از1.401298e-45 تا 3.402823e+38
    Double هشت بایت ||مقادیر منفی از -1.79769313486232e+308 تا-4.9406565841247e-324مقادیر مثبت از 4.9406545841247e-324 تا 1.79769313486232e+308
    Currency هشت بایت -922,337,203,685,477,5808 تا 922,337,203, 685, 477,5807
    دقت بیشتر باعث می شود که محاسبات پولی تا دو رقمی اعشاری درست باشند.
    Decimal دوازده بایت اگر از عداد اعشاری استفاده نکنید +/-79,228,162,514,264,337,593,543,950,335 و برای 28 رقم اعشاری استفاده نکنید +/-7.9228162514264337593543950335نوع داده decimalهنوز بطور کامل در ویژوال بیسیک پشتیبانی نمی شود اما در نگارش جدید هست.
    کاراکترهای پسوند ویژوال بیسیک برای مقادیر صریح
    پسوند نوع داده
    & long
    ! single
    # double
    @ currency
    ویژوال بیسیک از چند نوع داده عددی پشتیبانی می کند.
    نوع حافظه مورد نیازش محدوده مقادیر
    Stringطول ثابت طول رشته 1تا 56.400 کاراکتر
    Stringطول متغیر طول رشته بعلاوه 10 بایت صفر تا دو میلیارد کارا کاتور
    Date 8 بایت اول ژانویه 100 تا 31 دسامبر 9999
    Boolean 2 بایت true یا false
    Object 4 بایت هر شی پنهان شده
    Variantعددی 16 بایت همه مقادیر مشابه double
    Variantمتنی طول متن بعلاوه 22 بایت مشبه string با طول متغیر
    پیشوند نام متغیرها که نوع داده را نشان می دهند
    پیشوند نوع داده مثال
    Bln Boolean blnbuttonenabled
    Byt byte bytlength
    Cur currency cursales98
    Dte date dteoverdue
    Dbl double dblscientificamt
    Int integer intyera1998
    Ing long ingweatherdistance
    Obj object objworksheetacct99
    Sng single sngsales1stqte
    Str string strfirstname
    Vnt variant vntvalue
    مثال
    در اینجا بعضی از علان ها مجاز با استفاده از dim را می بینید.
    Dim inttotal as integer
    Dim cursales99 as currency
    عملگرهای رایج محاسبات و دستکاری داده ها.
    عملگر هدف مثال نتیجه
    ^ توان 2^3 8
    * ضرب 2*3 6
    / تقسیم 2/6 3
    + جمع 3+5 8
    - تفریق 6-3 3
    Mod باقیمانده 11mode 3 2
    \ |تقسیم عدد صحیح 11\3 3
    +یا& ترکیب رشته ای "hi,"bay" "hi, bay"
    ویژوال بیسیک برای محاسبات عبارت های ریاضی از ترتیب زیر برای عملگرها تبعیت می کند
    ترتیب عملگر مثال نتیجه
    1 پرانتزها() (3+2)*7 35
    2 ^ 2^3+1 9
    3 mod,\,\.* 2+3*7 43
    4 -,+ 10-4*2+1 3


    مقدمه : کنترل Internet Transfer نسبت به کنترل WebBrowser که در روزهاي قبلي معرفي شد در سطح پايينتري قرار دارد . اين کنترل با استفاده از دو پروتکل HTTP و FTP مي تواند داده ها را منتقل کند . اين کنترل زمانيکه از پروتکل HTTP استفاده مي کند با همان روش کنترل WebBrowser به سرويس دهنده صفحات وب متصل مي شود اما بجاي آنکه صفحه وب را نمايش دهد متن Html صفحه را بازيابي مي کند . همچنين زمانيکه اين کنترل از پروتکل FTP استفاده مي کند قادرست فايلها را بين کامپيوترهاي روي شبکه منتقل سازد .
    اتصالات HTTP : همانطور که مي دانيد ، پروتکل HTTP استاندارد وب مي باشد . صفحات وب با زبان Html نوشته مي شوند و انتقال آنها از server به client توسط پروتکل HTTP صورت مي گيرد .
    متد OpenURL : ساده ترين راه استفاده از کنترل IT متد OpenURL است . شکل کلي اين متد بصورت زير است :

    Inet.OpenURL(url,DataType)x

    که url آدرس صفحه وب و DataType نوع داده بازيابي شونده است و دو مقدار icString ( داده متني ) يا icByteArray ( داده باينري ) را مي گيرد . مقدار بازگشتي اين متد ، داده هاي منتقل شده است .
    اين متد بصورت سنکرون کار مي کند يعني در تمام مدت کار آن برنامه نمي تواند کار ديگري انجام دهد . اگر از icByteArray استفاده کنيد بايد مقدار بازگشتي آنرا در يک ارايه بايت قرار دهيد .
    مثال 1 : از بخش Component در منوي Project مورد Microsoft Internet Transfer Control 6.0 را به toolbar خود اضافه کنيد . سپس يک کنترل IT روي فرم قرار دهيد و همچنين يک Rich Textbox و يک دکمه روي فرم قرار دهيد و کد زير را براي event مربوط به کليک دکمه بنويسيد :



    TextBox.text=Inet.OpenURL(

    مثال 2 : کد زير داده هاي باينري را از اينترنت خوانده و آنها را در يک فايل ذخيره مي کند :

    Dim b() as byte
    B()=Inet.OpenURL(ftp://ftp.microsoft.com/test.zip,icByteArray)x
    Open App.path & “\test.zip” For Access Write As #1
    Put #1,b()x
    Close #1


    رويداد StateChanged : کنترل IT فقط يک event دارد که StateChanged مي باشد . اين event زماني روي مي دهد که State کنترل تغيير کند . State هر اتفاقي است که برنامه بايد از آن مطلع شود . تعريف کلي اين event بصورت زير است :

    Inet_StateChanged(ByVal NewState As Integer)x

    که NewState مقداري است که حالت جديد را بيان مي کند . مقادير ممکن اين پارامتر عبارتند از :
    icNone : حالت تغيير نکرده است .
    icResolvingHost : در حال جستجوي آدرس IP کامپيوتر موردنظر .
    icHostResolved : آدرس IP کامپيوتر موردنظر يافت شد .
    icConnecting : در حال اتصال به کامپيوتر مقصد
    icConnected : اتصال به کامپيوتر مقصد برقرار شد .
    icRequesting : در حال ارسال درخواست به کامپيوتر مقصد
    icRequestSent : درخواست به کامپيوتر مقصد ارسال شد .
    icReceivingResponse : در حال دريافت پاسخ از کامپوتر مقصد .
    icResponseReceived : پاسخ کامپيوتر مقصد دريافت شد .
    icDisconnecting : در حال قطع اتصال با کامپيوتر مقصد .
    icDisconnected : اتصال مقصد با موفقيت قطع شد .
    icError : در ارتباط با کامپيوتر مقصد خطايي رخ داده است .
    icResponseCompleted : تکميل پاسخ – تمام داده ها دريافت شد .
    تشخيص خطا در عمليات انتقال داده اهميت بالايي دارد و StateChanged در صورت بروز هر خطايي مقدار icError را برمي گرداند و اطلاعات خطا را در دو خاصيت ResponseCode و ResponseInfo برمي گرداند .
    انتقال داده بصورت آسنکرون : کنترل IT متدهاي انعطاف پذير ديگري هم دارد که آسنکرون هستند و اجازه مي دهند تا همزمان با عمليات انتقال داده ، برنامه به وظايف ديگري هم بپردازد . اين متدها با استفاده از Event Driven Model کار مي کنند . بدين معني که وقتي برنامه درخواست انتقال داده اي را مي دهد کنترل IT درخواست را در زمينه برنامه انجام مي دهد و برنامه ازاد است تا به کارهاي ديگرش بپردازد . زمانيکه داده ها بازيابي شود ، داده ها را از بافر داخلي کنترل IT مي خواند .
    متد GetChunk : در عمليات انتقال آسنکرون ، بايستي داده را توسط اين متد از بافر داخلي کنترل IT بگيريم :

    Inet.GetChunk(datasize[,datatype])x

    که پارامتر datasize از نوع long بوده و تعيين مي کند چند بايت از بافر خوانده شود و پارامتر اختياري datatype نوع داده را مشخص مي کند و مي تواند مقادير icString و icByteArray را بگيرد .
    زمانيکه StateChanged وارد حالتهاي icResponseReceived و يا icResponseCompleted شد بايد از GetChunk استفاده کنيد . بدين صورت که از يک حلقه استفاده مي کنيم تا کل بافر را بخوانيم :

    Private Sub Inet_StateChanged(Byval State as Integer)x
    Dim temp1,temp2
    Select Case State
    Case icResponseCompleted
    temp1=””x
    temp2=””x
    Do
    temp1=Inet.GetChunk(512,icString)x
    temp2=temp2 & temp1
    Loop Until temp1=””x
    End Select
    End Sub

    براي بالابردن کارايي ، بهتر است از قطعات کوچک ( بين 512 تا 1024 بايتي ) استفاده کنيد .
    متد Execute : و اما انعطاف پذيرترين متد کنترل IT ، متد Execute است . فرمت کلي اين متد بصورت زير است :

    Inet.Execute(url,Command,Data,RequestHeaders)x

    که url آدرس مقصد ، Command فرماني است که به کامپيوتر مقصد داده مي شود و Data و RequestHeaders اطلاعات اضافي لازم براي اجراي فرمان داده شده است . فرمانهاي Command همان فرمانهاي HTTP هستند که عبارتند از :
    - GET : دريافت داده ها از کامپيوتر مقصد
    - HEAD : دريافت اطلاعات header از کامپيوتر مقصد
    - POST : ارسال اطلاعات لازم براي تکميل درخواست
    - PUT : ارسال فايل براي کامپيوتر ميزبان ( upload )
    فرمان GET پرکاربردترين فرمان متد Execute است و داده هاي خوانده شده را در بافر داخلي بافر کنترل IT قرار مي دهد تا بتوان با متد GetChunk آنها را بازيابي نمود .
    مثال :

    Inet.Execute

    ساير خواص کنترلIT :
    - AccessType : نوع دسترسي کنترل IT به اينترنت را مشخص مي کند و سه مقدار مي تواند بگيرد :
    icUseDefault : استفاده از تنظيمات رجيستري براي دسترسي به اينترنت
    icDirect : اتصال مستقيم کنترل IT به اينترنت
    icNamedProxy : اتصال به اينترنت توسط پروکسي
    - Document : نام صفحه پيش فرض که در متد Execute از آن استفاده مي شود . اگر به متد Execute پارامتر url را ندهيد از اين صفحه پيش فرض استفاده مي کند .
    - Password : کلمه رمز عبور کامپيوتر ميزبان FTP
    - Procotol : نوع پروتکل مورد استفاده در متد Execute را مشخص مي کند و 5 مقدار مي تواند بگيرد :
    icUnknown : نامعلوم
    icDefault : پروتکل پيش فرض
    icFTP : پروتکل FTP
    icHTTP : پروتکل HTTP
    icHTTP : پروتکل حفاظت شده HTTP
    - ----- : نام ميزبان پروکسي
    - RequestTimeOut : مدت زماني که کنترل IT صبر مي کند تا اطلاعات را دريافت کند . اگر اين خاصيت صفر باشد کنترل تا هر زمان که لازم باشد براي دريافت پاسخ صبر مي کند . در حالت سنکرون ( متد OpenURL ) بعد از سپري شدن اين مدت زمان ، يک خطا توليد مي شود و در حالت آسنکرون ( متد Execute ) رويداد StateChanged مقدار خطا را بر مي گرداند
    - ResponseCode : بعد از بروز حالت icError اين خاصيت کد خطا را مي دهد .
    - ResponseInfo : توضيحي درباره خطا
    - StillExecuting : اگر True باشد يعني کنترل مشغول انجام کار است .
    - URL : آدرس مقصد در متدهاي OpenURL و يا Execute
    - UserName : نام کاربر براي ورود به کامپيوتر ميزبان FTP

    نکته 1 : براي دريافت برنامه نمونه براي متد Execute با من تماس بگيريد .
    نکته 2 : موضوع روزهاي بعد :
    1 - اتصالات FTP با استفاده از کنترل IT
    2 – آشنايي با تکنيک Collision Detection در ساخت بازيهاي دوبعدي
    3 – آشنايي با کنترل WinSock
    نکته 3 : شايد اين سوال پيش بيايد که چرا همزمان با آموزش Internet Programming ، آموزش Game Programming را نيز شروع کرده ام ؟ علت اش اينست که تصميم دارم پس از پايان يافتن اين دو مبحث ، روش ساخت يک بازي دوبعدي چند نفره تحت شبکه را برايتان آموزش دهم . نظري نداريد ؟

    نا له پنداشت که در سینه ی ما جا تنگ است

    رفت و برگشت سراسیمه که دنیا
    تنگ است

  4. کاربرانی که از پست مفید ریپورتر سپاس کرده اند.


  5. #3
    کـــــــاربر فــــعال
    رشته تحصیلی
    مکانیک سیالات
    نوشته ها
    11,179
    ارسال تشکر
    13,156
    دریافت تشکر: 21,945
    قدرت امتیاز دهی
    56319
    Array
    ریپورتر's: خوشحال2

    پیش فرض آموزش گام به گام ویژوال بیسیک6.0

    کنترل Web Browser – ساخت مرورگر صفحات وب برنامه Internet Explorer يا iexplore.exe در واقع برنامه کوچکي است که وظيفه اصلي آن ايجاد چارچوبي براي بهم پيوستن عناصر مختلف است و اين عناصر هستند که وظايف اصلي مثل load کردن صفحات وب ، اجراي کدهاي Html و غيره را انجام مي دهند . اصلي ترين عنصري که مستقيماً توسط iexplore.exe استفاده مي شود کنترل Webbrowser ( موجود در فايل shdocrw.dll ) مي باشد . وظيفه اين فايل dll ، عبارت است از حرکت بين صفحات وب ، مديريت تاريخچه صفحات ديده شده و غيره . اين فايل خود از فايل ديگري بنام Mshtml.dll استفاده مي کند که وظيفه آن بررسي و اجراي فايلهاي html است . مايکروسافت به برنامه نويسان اين امکان را داده که بتوانند در برنامه هايشان از کنترل webbrowser استفاده کنند . با استفاده از اين کنترل مي توان به سادگي يک مرورگر وب تقريباً کامل ساخت .

    خصوصيات کنترل Webbrowser :
    Webbrowser علاوه بر خواص استانداردي مثل width ، height و … خواص زير را دارد :
    1 – Busy : اگر در حال load کردن يک صفحه يا در حال جستجو در وب باشد اين خاصيت True است . توسط متد Stop مي توان عمليات جاري را متوقف کرد .
    2 – Container : ارجاع به شي نگهدارنده کنترل webbrowser
    3 – Document : ارجاع به صفحه html فعلي . براي کار با اين صفحه html مي توان از خواص و متدهابي شي Document استفاده کرد .
    4 – LocationName : حاوي آدرس محلي است که اکنون در کنترل webbrowser ، load شده است . اگر اين محل يک صفحه html باشد عنوان آن صفحه خواهد بود و اگر اين محل يک فايل در شبکه باشد مسير کامل آن فايل خواهد بود .
    5 – LocationURL : حاوي url محلي است که فعلاً در کنترل webbrowser ، load شده است .
    6 – Offline : اگر کنترل webbrowser در حالت عدم اتصال باشد مقدار آن True و در غيراينصورت False است .
    7 – Parent : فرمي را نشان مي دهد که کنترل webbrowser در آن قرار دارد .
    8 – ReadyState : وضعيت کنترل webbrowser را برمي گرداند .

    متدهاي کنترل webbrowser : اين متدها مربوط به مرور در صفحات وب هستند :
    1- GoBack : در ليست تاريخچه url ها ، يکي به عقب برمي گردد .
    2 – GoForward : در ليست تاريخچه url ها ، يکي به جلو مي رود .
    3 – GoHome : به homepage مرورگر مي رود .
    4 – Navigate : به يک url يا فايل مي رود . ساختار اين متد بصورت زير است :

    Navigate URL [Flags,][TargetFrameName,][PostData,][Headers]x

    URL آدرس مقصد مي باشد . Flags نحوه باز شدن آدرس مقصد را تعيين مي کند . اگر اين پارامتر ذکر نشود آدرس جديد در پنجره فعلي باز خواهد شد و به ليست تاريخچه اضافه شده و اگر کپي آن در temperory cache موجود باشد از آنجا خوانده مي شود . مقادير پارامتر Flags عبارتند از :
    - NavOpenInNewWindow : آدرس جديد را در پنجره جديدي باز مي کند .
    - NavNoHistory : به ليست تاريخچه اضافه نمي شود بلکه جايگزين صفحه فعلي مي شود .
    - NavNoReadFromCache : صفحه جديد از cache خوانده نمي شود .
    - NavNoWriteToCache : صفحه جديد روي cache نوشته نمي شود

    Event هاي کنترل webbrowser : اين event ها مربوط به مرور در وب و تغيير حالت آن هستند :
    1 – CommandStateChange : براي فعال يا غيرفعال کردن دکمه هاي Forward و Back در مرورگر استفاده مي شود . شکل کلي فراخواني اين event بصورت زير است :

    Private Sub WebBrowser1_CommandStateChange(ByVal Command As Long, ByVal Enable As Boolean)


    که command فرماني است که حالت فعال آن تغيير کرده است و دو مقدار مي گيرد : 1 و 3 که بترتيب معادل فرمانهاي GoForward و GoBack هستند .
    Enable فعال يا غيرفعال بودن فرمان را تعيين مي کند .
    2 – DocumentComplete : اين event زماني فعال مي شود که صفحه در حال load شدن به حالت ReadyState_Complete برود . شکل کلي فراخواني اين event بصورت زير است :
    Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
    که pDisp ارجاعي به کنترل webbrowser است که event در آن رخ داده است و URL آدرس صفحه در حال load شدن است .
    3 – DownloadBegin : اين event در آغاز حرکت به صفحه جديد روي مي دهد و هيچ پارامتري نمي گيرد . مرورگر مي تواند در اين event پيغامي براي شروع عمليات جديد نشان مي دهد .
    4 – DownloadComplete : اين event در پايان عمليات يا در صورت انصراف کاربر يا بروز خطا روي مي دهد .
    5 – ProgressChange : با بروز هر تغييري در وضعيت load ، اين event روي مي دهد . شکل کلي فراخواني آن بصورت زير است :

    Private Sub WebBrowser1_ProgressChange(ByVal Progress As Long, ByVal ProgressMax As Long)


    که Progress نشان دهنده پيشرفت عمليات ( بايتهاي load شده ) است . پارامتر ProgressMax تعداد کل بايتهايي که بايد load شوند را نشان مي دهد بنابر اين :

    (Progress/ProgressMax)*100=درصد پيشرفت عمليات load


    يک مثال ساده :
    از منوي project مورد components را انتخاب کنيد و از ليست کنترلها ، Microsoft Internet Controls را به toolbar خود اضافه کنيد . يک کنترل WebBrowser روي فرم قرار دهيد و سايز آنرا به اندازه ابعاد فرم خود قرار دهيد . يک textbox و يک دکمه روي فرم قرار دهيد . کد زير را براي event مربوط به کليک دکمه بنويسيد :
    FTP




    پروتکل FTP علاوه بر نقل و انتقال فايل بين دو کامپيوتر ، مي تواند نوعي مديريت فايل ( مثل حذف فايل يا ايجاد پوشه ) روي کامپيوتر مقصد را انجام دهد . FTP در انتقال فايل بسيار قويتر از HTTP است ولي به مراتب پيچيده تر از HTTP مي باشد اما کنترل IT اين پيچيدگيها را از ديد برنامه نويس مخفي کرده است .
    براي کار با سرورهاي FTP بايد به آنها Login نمود . نوع خاصي از Login به نام Anonymous Login ( ورود ناشناس ) وجود دارد که با آن کاربران مي توانند بدون محدوديت از سايت FTP استفاده کنند . توجه کنيد که حتي براي ورود ناشناس هم نياز به نام کاربر و کلمه عبور است . براي ارسال نام کاربر و کلمه عبور از خواص username و password کنترل IT استفاده مي شود . اگر خاصيت username خالي باشد ( blank ) ، کنترل IT بطور خودکار از anonymous استفاده مي کند و آدرس email کاربر بعنوان passowrd استفاده مي شود .
    استفاده از متد OpenURL : متد OpenURL ساده ترين راه انجام عمليات FTP است . دستور زير از يک سايت FTP ليست مي گيرد :

    Text.text=Inet.OpenURL("ftp://ftp.microsoft.com",icString)x

    براي خواندن فايل از يک سايت FTP بايد در حالت باينري کار کرد :

    b()=Inet.OpenURL("ftp://ftp.microsft.com/test.zip",icByteArray)x


    استفاده از متد Execute : متد Execute قابليتهاي بيشتري دارد و اجرای آن در FTP نياز به دو پارامتر دارد :

    Inet.Execute(url,operation)x


    که url آدرس سايت FTP بهمراه نام و مسير فايل و پارامتر operation يک فرمان FTP است . کنترل IT با داده هاي خوانده شده FTP به دو طريق رفتار مي کند :
    برخي از داده ها مثل پاسخ فرمان DIR در بافر کنترل IT قرار مي گيرد و بايد آنها را با متد GetChunk خواند .
    برخي ديگر از داده ها مثل فايل خوانده شده با فرمان GET مستقيماً روي ديسک نوشته مي شوند و ديگر نيازي به استفاده از متد GetChunk نيست .
    فرامين FTP بسيار قوي هستند و حتي به شما اين امکان را مي دهند که فايلها را به روي کامپيوتر مقصد کپي کنيد ، به پوشه هاي کامپيوتر مقصد برويد ، فايلها را حذف کنيد و يا تغيير نام دهيد . البته بايد توجه داشت که فرامين قابل اجرا به نوع ورود به سيستم FTP بستگي دارد . اگر با کاربر anonymous به يک سايت FTP وارد شويد تنها مي تواند فايلها را ببيند و آنها را download کنيد .
    مهمترين فرامين FTP عبارتند از :
    CD path : به دايرکتوري path مي رويد .
    CDUP : به يک دايرکتوري بالاتر مي رود .
    CLOSE : بستن اتصال FTP
    DELETE file1 : حذف فايل file1
    DIR file1 : جستجوي فايل file1 روي دايرکتوري جاري
    MKDIR path : ايجاد يک دايرکتوري با نام path
    PUT file1 file2 : فايل file1 را از کامپيوتر مبدا روي فايل file2 در کامپيوتر مقصد کپي مي کند .
    PWD : نام دايرکتوري جاري در کامپيوتر مقصد را برمي گرداند .
    QUIT : قطع اتصال FTP
    GET file1 file2 : فايل file1 را از کامپيوتر مقصد روي فايل file2 در کامپيوتر مبدا کپي مي کند .
    RENAME file1 file2 : تغيير نام فايل file1 به file2
    RMDIR path : حذف دايرکتوري path در کامپيوتر مقصد
    SIZE file1 : بدست آوردن تعداد بايتهاي فايل يا دايرکتوري file1

    مقدمه :
    کنترل WinSock نسبت به تمام کنترلهاي اينترنت در سطح پايينتري قرار دارد . اين کنترل امکان ايجاد سرويسهاي شبکه اي مبتني بر پروتکلهاي TCP و UDP را مهيا مي کند . بعبارت ديگر توسط اين کنترل مي توان برنامه هاي کاربردي Client/Server ( سرويس گيرنده / سرويس دهنده ) ايجاد و با استفاده از پروتکل TCP و يا UDP بين آنها ارتباط برقرار نمود .
    با تنظيم خصوصيات و فراخواني متدهاي اين کنترل مي توانيد به راحتي به يک کامپيوتر راه دور متصل شويد و داده ها را در هر دو جهت جابجا نمائيد . نمونه کاربرهايي که مي توان با اين کنترل ايجاد نمود :
    Client-server chat ، Mail client ، Mail server ، ----- Server ، Network Game ، Port Scanner ، پياده سازي الگوريتم هاي موازي و …
    مباني TCP :
    پروتکل کنترل اينترنت ( Transfer Control Protocol ) اجازه مي دهد يک اتصال ( Connection ) را از طريق سوکت ( socket ) به يک کامپيوتر راه دور ( Remote Computer ) ساخته و استفاده کنيد . با استفاده از اين اتصال ، هر دو کامپيوتر مي توانند داده ها را بين خودشان انتقال دهند . برقراري ارتباط از طريق TCP همانند صحبت کردن با تلفن است که بايد حتماً اتصالي بين دو کامپيوتر صورت گيرد تا بتوانند با هم ارتباط برقرار کنند .
    اگر يک برنامه Client مي سازيد بايستي بدانيد که نام يا آدرس IP کامپيوتر Server چيست ( Remote Host IP ) و همچنين از طريق چه پورتي مي توانيد به آن متصل شويد ( Remote Port ) . حال بايستي به آن پورت Connect کنيد .
    همچنين اگر يک برنامه Server مي سازيد بايستي پورتي را که روي آن به درخواستها گوش مي دهيد مشخص کنيد ( LocalPort ) و سپس به پورت گوش دهيد ( Listen ) .
    زمانيکه يک کامپيوتر Client تقاضاي يک اتصال را مي دهد Server اين درخواست را Accept مي کند .
    زمانيکه يک اتصال ساخته مي شود ، هر دو کامپيوتر مي توانند داده را فرستاده و دريافت کنند .




    مباني UDP :
    پروتکل ديتاگرام کاربر ( User Datagram Protocol ) پروتکلي بدون اتصال ( Connectionless ) است . برخلاف TCP ، کامپيوترها نياز به برپا کردن يک اتصال ندارند بنابراين يک برنامه مي تواند يک client و يا يک server باشد . برقراري ارتباط در UDP شبيه ارسال نامه از طريق پست است .
    براي انتقال داده توسط UDP ابتدا بايد Local Port کامپيوتر Client تنظيم گردد . کامپيوتر Server تنها بايستي RemoteHost را برابر آدرس کامپيوتر Client قرار دهد و همچنين Remote Port را همان Local Port کامپيوتر Client قرار دهد . سپس دو کامپيوتر مي توانند داده ها را بين خود جابجا کنند .
    استفاده از کنترل WinSock :




    1 – انتخاب پروتکل: در زمان استفاده از کنترل WinSock اولين کاري که بايد انجام دهيد انتخاب يکي از پروتکلهاي TCP يا UDP است . طبيعت برنامه اي که شما مي سازيد نوع پروتکلي را که بايد استفاده کنيد مشخص مي کند . چند سوال زير به شما کمک مي کند که پروتکل مورد نيازتان را انتخاب کنيد :
    - آيا برنامه شما در زمانيکه داده فرستاده مي شود يا دريافت مي شود نياز به اطلاعاتي از طرف Server يا Client دارد ؟ اگر چنين است بايستي يک اتصال TCP قبل از ارسال يا دريافت داده ايجاد شود .
    - آيا داده بسيار بزرگ است ( مثل تصوير يا فايلهاي صوتي ) ؟ زمانيکه يک اتصال TCP ساخته مي شود پروتکل TCP اتصال را باقي نگه مي دارد و درستي ارسال داده تضمين شده است . اين اتصال در هر حال به منابع محاسباتي بيشتري نياز دارد و بنابراين پرهزينه تر است .
    - آيا داده متناوب ارسال مي شود يا در يک نشست ( Session ) ارسال خواهد شد ؟ براي مثال اگر شما يک برنامه مي سازيد که کامپترهاي مشخصي را در يک زمان خاص از انجام شدن عملياتي مطلع مي کند پروتکل UDP مناسب تر است . پروتکل UDP همچنين براي ارسال مقادير کوچک داده اي مناست تر مي باشد .
    2 – تنظيم پروتکل : براي تنظيم پروتکلي که مي خواهيد در برنامه تان از آن استفاده کنيد در زمان طراحي برنامه خاصيت Protocol کنترل WinSock را برابر sckTCPProtocol و يا sckUDPProtocol قرار دهيد . همچنين مي توانيد پروتکل خود را توسط کد زير تنظيم کنيد :

    WinSock.Protocol=sckTCPProtocol

    3 – مشخص کردن نام کامپيوتان : براي اتصال به کامپيوتر راه دور بايستي آدرس IP و يا نام کامپوتر را بدانيد .
    نام کامپيوتر در Control Panel/Network/Identification موجود است . در صورتيکه مي خواهيد دو برنامه Client و Server خود را روي يک کامپيوتر تست کنيد از آدرس IP 127.0.0.1 براي هر دو استفاده کنيد اما اگر دو برنامه را روي دو کامپيوتر مجزا در شبکه قرار داده ايد با اجراي دستور ipconfig در DOS Prompt مي توانيد آدرس IP کامپيوتر ها را بدست آوريد .
    4 – ايجاد اتصال TCP : در زمان ساخت برنامه اي که از پروتکل TCP استفاده مي کند ابتدا بايد تصميم بگيريد که اين برنامه Client است يا Server . براي ساخت يک برنامه Server بايستي روي يک پورت خاص Listen کنيد . زمانيکه Client تقاضاي يک اتصال را مي دهد ، برنامه Server مي تواند آنرا Accept کند و بنابراين اتصال کامل شده است . حال Client و Server مي توانند با هم ارتباط داشته باشند .
    مراحل زير ساخت يک سرور چت ساده بر مبناي TCP را نشان مي دهد :
    - از منوي Project گزينه Components را انتخاب کنيد و در ليست Component ها مورد Microsoft WinSock 6.0 را انتخاب کنيد .
    - يک کنترل WinSock در فرم خود قرار دهيد و نام آنرا tcpserver بگذاريد
    - دو textbox با نامهاي txtSendData و txtReceiveData و نيز يک دکمه در فرم قرار دهيد .
    - کد زير را در رويداد Form_Load بنويسيد :

    Tcpserver.LocalPort=1000
    tcpserver.Listen


    - زمانيکه درخواستي از طرف Client مي آيد رويداد ConnectionRequest اجرا مي شود . در اين رويداد ابتدا بايد چک کنيد که حالت کنترل بسته باشد . اگر چنين نيست اتصال را قبل از پذيرفتن اتصال جديد ببنديد . سپس تقاضا را بر اساس پارامتر requestID مي پذيريم :

    Private Sub tcpserver_ConnectionRequest(ByVal requestID As Long)
    If tcpserver.State <> sckClosed Then tcpserver.Close
    tcpserver.Accept requestID
    End Sub


    - حال اتصال بين Client و Server برقرار شده است . کد زير را براي event مربوط به کليک دکمه Send بنويسيد :

    Tcpserver.SendData txtSendData.text

    - اگر داده اي از طرف Client بيايد رويداد DataArrival اجرا مي شود . کد زير را براي اين رويداد بنويسيد :

    Private Sub tcpserver_DataArrival(ByVal bytesTotal As Long)
    Dim strData As String
    tcpserver.GetData strData
    txtReceiveData.Text = strData
    End Sub


    - کد زير را براي رويداد Form_Unload بنويسيد :

    Tcpserver.Close

    مراحل ساخت يک TCP Client بصورت زير است :
    - يک کنترل WinSock در فرم قرار دهيد و نام آنرا tcpclient بگذاريد .
    - دو textbox با نامهاي txtsend و txtreceive و نيز يک دکمه با نام sendدر فرم قرار دهيد .
    - يک دکمه با نام connect در فرم قرار دهيد .
    - کد زير را براي متد Form_Load بنويسيد :

    tcpclient.RemoteHost=”yourservername”x
    tcpclient.RemotePort=1000


    - کد زير را براي رويداد کليک شدن دکمه connect بنويسيد :

    tcpclient.Connect

    - کد زير را براي رويداد کليک شدن دکمه send بنويسيد :

    tctclient.SendData txtsend.Text

    - کد زير را براي رويداد DataArrival بنويسيد :

    Private Sub tcpclient_DataArrival(ByVal bytesTotal As Long)
    Dim strData As String
    tcpclient.GetData strData
    txtreceive.Text = strData
    End Sub


    - کد زير را باري رويداد Form_Unload بنويسيد :

    Tcpclient.Close

    کدهاي فوق يک سيستم Client-Server ساده را نشان مي دهد . فايل exe هر دو برنامه را بسازيد و آنها را اجرا کنيد تا بتوانيد سيستم خود را تست کنيد .
    5 – پذيرفتن بيش از يک تقاضاي اتصال : Server اي که در بالا ساخته شد تنها مي تواند تقاضاي يک اتصال را بپذيرد . با استفاده از ايجاد يک آرايه از کنترل WinSock مي توان چندين تقاضاي اتصال را پذيرفت . براي اينکار کافي است يک کپي ( instance ) از کنترل بسازيم ( با تنظيم خاصيت Index ) و متد Accept را براي instance جديد بکار ببريم . فرض کنيد يک کنترل WinSock با نام sckServer در فرم داريم که خاصيت Index آنرا صفر قرار داده ايم . همچنين يک متغير intMax از نوع Long تعريف مي کنيم که تعداد اتصالات همزمان به Server را نگه مي دارد . در event مربوط به Form_Load کد زير را بنويسيد :

    intMax=0
    sckServer(0).LocalPort=1000
    sckServer(0).Listen


    هر بار که تقاضاي يک اتصال مي رسد کد ابتدا تست مي کند که مقدار Index چقدر است . اگر مقدار Index صفر باشد متغير intMax يکي افزايش مي يابد و از intMax براي ساخت يک instance جديد از کنترل استفاده مي شود . حال از اين instance براي پذيرفتن تقاضاي اتصال استفاده مي گردد . براي اينکار کد زير را براي رويداد ConnectionRequest بنويسيد :

    Private Sub sckServer_ConnectionRequest(Index As Integer, ByVal requestID As Long)
    If Index = 0 Then
    intmax = intmax + 1
    Load sckServer(intmax)x
    sckServer(intmax).LocalPort = 0
    sckServer(Index).Accept requestID
    End If
    End Sub

    6 – ايجاد اتصال UDP : ساخت يک برنامه UDP ساده تر از برنامه هاي TCP است زيرا پروتکل UDP به اتصال نياز ندارد . در برنامه TCP بالا يک کنترل WinSock بايستي حتماً Listen مي کرد و يک کنترل ديگر يک اتصال را توسط متد Connect ايجاد نمود . در عوض پروتکل UDP نيازي به اتصال ندارد . براي ارسال داده بين دو کنترل WinSock سه مرحله بايستي انجام شود :
    - پارامتر RemoteHost برابر نام کامپيوتر مقابل است .
    - پارامتر RemotePort برابر پارامتر LocalPort کامپيوتر مقابل
    - استفاده از متد Bind براي مشخص کردن LocalPort
    چون هر دو کامپيوتر از نظر ارتباط مساوي هستند ، اين نوع برنامه ها را Peer-to-Peer گويند . براي نمونه از کد زير براي ساخت يک برنامه chat استفاده مي کنيم :
    - يک کنترل WinSock در فرم قرار دهيد و نام آنرا udppeerA بگذاريد .
    - خاصيت Protocol آنرا UDPProtocol قرار دهيد .
    - دو textbox با نامهاي txtsend و txtreceive و نيز يک دکمه در فرم قرار دهيد .
    - کد زير را براي متد Form_Load بنويسيد :

    udppeerA.RemoteHost=”nameofpeerB”x
    udppeerA.RemotePort=1001
    udppeerA.Bind 1002


    - کد زير را براي event مربوط به کليک دکمه بنويسيد :

    udppeerA.SendData txtsend.text

    - کد زير را براي رويداد DataArrival بنويسيد :

    Dim strData as String
    udppeerA.GetData strData
    txtreceive.Text=strData


    براي ساخت UDP peerB مشابه مراحل بالا عمل کنيد فقط خاصيت RemoteHost آنرا نام کامپيوتر PeerA و خاصيت RemotePort آنرا 1002 و خاصيت Bind آنرا 1001 قرار دهيد
    مقدمه :

    برای آشنايي با مبانی شبکه های TCP/IP به بحث مروری بر TCP/IP مراجعه کنيد .

    معرفی :

    کتابخانه WinPcap يک معماری برای استخراج Packet های TCP/IP و آناليز شبکه در محيطهای ۳۲ بيتی ويندوز می باشد . اين کتابخانه شامل سه بخش است :

    ۱ - يک ----- Packet در سطح هسته سيستم عامل ( Kernel )

    ۲ - يک کتابخانه dll سطح پايين ( low-level ) با نام packet.dll

    ۳ - يک کتابخانه مستقل از سيستم عامل و سطح بالا ( high-level ) با نام wpcap.dll

    ----- packet يک درايور دستگاه ( device driver ) است که به ويندوزهای ۹۵ ، ۹۸ ، ME ، NT و ۲۰۰۰ قابليت استخراج و capture کردن و نيز ارسال داده خام ( raw data ) از يک کارت شبکه را می دهد . همچنين اين امکان را دارد که packet های capture شده را در يک بافر ذخيره کند و يا آنها را ----- نمايد .
    packet.dll يک API است که بمنظور دسترسی مستقيم به عملکرد درايور packet استفاده می شود . بنابراين packet.dll يک واسط برنامه نويسی مستقل از سیستم عامل های مايکروسافت را مهيا می کند .
    Wpcap.dll مجموعه ای از ابزارهای سطح بالای اصلی برای capture را مهيا می کند که اين توابع با کتابخانه libpcap ( کتابخانه capture در سيستم عامل UNIX ) سازگار می باشند . اين توابع اجازه capture کردن packet ها را با روشی مستقل از سخت افزار شبکه و مستقل از سيستم عامل مهيا می کنند .

    دريافت کتابخانه WinPcap :

    نسخه WinPcap 2.2 :
    برای دريافت برنامه auto-installer ( شامل درايور و DLL های مربوطه ) برای سيستم هایWindows 95/98/ME/NT/2000 به آدرس زير مراجعه کنيد :
    WinPcap auto-installer (driver +DLLs)
    برای دريافت بسته توسعه دهنده اين کتابخانه که شامل برنامه های نمونه ايجاد شده توسط packet capture driver و packet.dll و libpcap است ، به آدرس زير مراجعه کنيد :
    Developer's pack
    برای دريافت source code کتابخانه WinPcap به آدرس زير مراجعه کنيد :
    WinPcap source code
    مقدمه

    PacketX مجموعه ای از کلاسهای اکتيو ايکس است که امکانات WinPcap را در ويژوال بيسيک و هر زبان برنامه نويسی ديگری که از تکنولوژی Microsoft ActiveX پشتيبانی کند مهيا می کند .
    بطور خلاصه PacketX از WinPcap برای capture کردن و ----- کردن packet های شبکه استفاده می کند . علاوه بر capture استاندارد ، شما می توانيد از PacketX برای گردآوری اطلاعات ترافيک شبکه و ارسال raw packet استفاده کنيد .

    دريافت PacketX

    برای دريافت نسخه 1.3 اين کتابخانه به آدرس زير مراجعه کنيد :
    PacketX 1.3 Download
    قبل از استفاده از PacketX بايستی WinPcap 2.3 را که آدرس آن در بخش قبل گفته شد دريافت و نصب نمائيد .

    استفاده از PacketX

    با يک مثال ساده سعی می کنم روش استفاده از اين کتابخانه را به شما آموزش دهم .
    پس از نصب PacketX وارد محيط ويژوال بيسيک شده و از منوی Project مورد Components را انتخاب کنيد .




    سپس مورد PacketX Type Library را انتخاب کنيد تا به ToolBar اضافه شود .




    اين ActiveX را در فرمتان قرار دهيد و سپس در قسمت properties آن روی Custom کليک نموده و نوع آداپتور را مشخص نمائيد .




    پس از انتخاب آداپتور با کليک روی دکمه Edit می توانيد اطلاعاتی از قبيل مد کاری و ساير بافر و نوع فيلترينگ را مشخص نمائيد .




    نام اين شی را نيز PacketX1 می گذاريم .
    در فرمتان دو دکمه به نامهای Start و Stop قرار دهيد . همچنين يک listBox با نام IPList در فرمتان قرار دهيد .
    در کد مربوط به Form_load عبارت زير را بنويسيد :

    PacketX1.Adapter.BPFilter = "port 80"x


    عبارت فوق مشخص می کند که می خواهيم packet های پورت 80 را capture کنيم .
    کد زير را برای event مربوط به کليک شدن دکمه Start بنويسيد :

    PacketX1.start


    کد زير را برای متد OnPacket مربوط به PacketX1 بنويسيد :

    Private Sub PacketX1_OnPacket(ByVal pPacket As PACKETXLibCtl.IPktXPacket)x
    IPList.AddItem (pPacket.DestIpAddress)x
    End Sub


    کد فوق آدرس IP مقصد packet ها را به يک ليست اضافه می کند . شما می توانيد اطلاعات ديگری از قبيل داده موجود در packet ، سايز داده ، آدرس مبدا ، تاريخ ارسال داده و غيره را استخراج کنيد .
    کد زير را برای event مربوط به کليک شدن دکمه Stop بنويسيد :

    PacketX1.stop



    برای اينکه بتوانيد در يک مدت خاص وضعيت دريافت و ارسال packet را بدست آوريد بايد ابتدا توسط دستور زير مد آداپتور را در حالت Statistic قرار دهيد :

    PacketX1.Adapter.Mode=PktXModeStatistics
    PacketX1.Adapter.ReadTimeout=2000 '// 2 sec


    سپس PacketX1 را start نموده و توسط متد OnStatistics اطلاعات مربوطه را استخراج کنيد .

    اطلاعات بيشتر

    برای مشاهده اطلاعات کامل در مورد ساختار PacketX و ماژولهای آن به آدرس زير مراجعه کنيد :
    PacketX Documentation
    رجيستري چيست ؟
    سيستم عامل ويندوز تنظيمات سخت افزاري و نرم افزاري خود را بطور مرکزي در يک بانک اطلاعاتي با ساختار سلسله مراتبي ذخيره مي کند که رجيستري نام دارد . رجيستري جايگزيني براي بسياري از فايلهاي پيکربندي INI ، SYS و COM است که در نسخه هاي اوليه ويندوز موجود بود . رجيستري ، سيستم عامل را با مهيا کردن اطلاعات موردنيز براي اجراي برنامه ها و load شدن component ها ، کنترل مي کند .
    رجيستري شامل انواع مختلفي از اطلاعات مي باشد مثل :
    - اطلاعات سخت افزارهاي نصب شده روي سيستم
    - اطلاعات درايورهاي نصب شده روي سيستم
    - اطلاعات برنامه هاي نصب شده روي سيستم
    - اطلاعات پروتکلهاي شبکه اي مورد استفاده در سيستم
    ساختار رجيستري شامل چندين مجموعه رکورد است که داده هاي اين رکوردها توسط بسياري از برنامه ها و اجزاي سيستم عامل خوانده و يا نوشته مي شود .
    اجزاي رجيستري
    اجزاي تشکيل دهنده رجيستري عبارتند از :
    1 – subtree : Subtree ها همانند folder هاي موجود در ريشه يک درايو هارد هستند . رجستری ويندوز داراي پنج subtree مي باشد :
    - HKEY_LOCAL_MACHINE : شامل تمام داده هاي پيکربندي براي کامپيوتر مي باشد و شامل 5 key است :Hardware ، SAM ، Security ، Software و System
    - HKEY_USERS : شامل داده هاي مربوط به تنظيمات سيستم عامل براي هر user است مثل تنظيمات desktop و محيط ويندوز
    - HKEY_CURRENT_USER : شامل داده هاي کاربر فعلي سيستم
    - HKEY_CLASSES_ROOT : شامل اطلاعات پيکربندي نرم افزار است مثل داده هاي OLE و داده هاي کلاسهاي متناظر با فايل
    - HKEY_CURRENT_CONFIG : شامل اطلاعات مورد نياز براي تنظيمات داريورهاي سخت افزاري و غيره
    2 – Key : key ها همانند folder ها و subfolder هاي روي هارد هستند . هر key متناظر با object هاي نرم افزاري يا سخت افزاري مي باشد . subkey ها key هايي هستند که درون يکسري key قراردارند .
    3 – Entry : هر key داراي يک يا چند entry است . هر entry داراي سه بخش مي باشد :
    - نام Name
    - نوع داده اي Data Type : مقدار هر entry يکي از انواع داده هاي زير است :
    REG_DWORD ، REG_SZ ، REG_EXPAND_SZ ، REG_BINARY ،
    REG_MULTI_SZ ، REG_FULL_RESOURCE_DESCRIPTOT
    - مقدار Value




    نکته 1 : براي مشاهده رجيستري و اعمال تغييرات در آن ( لطفاً اگر هيچ تجربه اي در تنظيم کردن رجيستري نداريد اطلاعات آنرا تغيير ندهيد ) ، مي توانيد از برنامه regedit.exe و يا regedt32.exe موجود در ويندوز استفاده کنيد . براي اينکار کافيست نام برنامه را در کادر Run وارد کنيد .

    نکته 2 : در قسمت دوم اين مقاله کلاسي براي خواندن و نوشتن از/به رجيستري در ويژوال بيسيک خواهم نوشت و سپس نمونه اي از کاربردهاي نوشتن يکسري اطلاعات خاص در رجيستري را خواهيم ديد .

    قسمت سوم
    کنترل برنامه ها
    کنترل برنامه ها
    عملگر های شرطی
    مثالا می خواهید برنامه ای برایحساب پرداخت ها بنویسیم.این مقدار طلب هر فروشنده را که با آن معادله دارید محاسبه می کند و چک مربوط را چاپ می نماییم.حال اگر با یکی از فروشندگان مبادله نداشته باشد چه رخ می دهد.
    می خواهیم یک چک به مبلغ صفر دلار چاپ کنیم؟؟؟ مطمئنا پاسخ منفی است. تا اینجا همه کد های که درون روال دیده ایددستور به دستور اجرا می شوند. اما به کمک عملگرهای شرطی و دستور های مر بوط می توانید. برنامه ای بنویسید. که اگر لازم بود ترتیب اجرای دستورات تغییر نکند. بنابراین برنامه شما می تواند فقط چکهایی را چاپ کند که به فروشندگان آنها مبلغیبدهکار هستند.
    ویژال بیسیک از 6 عملگرها شرطی پشتیبانی می کند.
    عملگرها:=|<|>|=<|=>|<>
    توضیح:مساوی|بزرگتر از|کوچکتر از|بزرگتر یا مساوی|کوچکتر یا مساوی|نا مساوی
    مثال:2=7|3<6|11>5|23=<23|21=>4|3<>3
    نتیجه:غلط|درست|درست|درست|در �� �ت|غلط
    داده های شرطی
    همیشه دو مقدار را با هم مقایسه کنید که از یک نوع داده باشند. مثلا می توانید دو عدد از یک نوع را با هم مقایسه کنید تا ببینید کدام بزرگتر است. همچنین می توانید رشته های را با هم و انواع boolean را نیز با هم دیگه مقایسه کنید.
    اما هیچ وقت سعی نکنید یک رشته را با یک عدد مقایسه کنید چون نتیجه معمولا اشتباه در می آید.

    دستور if
    یک از متد اول ترین فرمان های زبان ویژال بیسیک فرمان if است . فرمان if قسمتی از یک دستور چند خطی به نام دستور if می باشد که فرمت آن به شکل زیر می باشد:
    If conditional then
    Block of one or more visual basic statements
    End if
    Conditional عبارتی است که نتیجه آن true یا false می باشد. در نتیجه conditional می تواند یک متغیر بولی بشد.می تواند یک کنترل معادل با مقدار true یا false باشد یا حتی ممکن است یک عبارت طولانی تر باشد که شامل عملگرهای شرطی و امتحان یک یا چند عملگر منطقی است.
    وقتی که ما از دستور if استفاده می کنید دستور اگر می باشد مثالا می گوییم اگر فلان چیز را زد یا ...
    فلا چیز بعدی اجرا یا ... اعمال شود این دستور یکی از دستور های است که در اکثر زبان های دیگر کا می کند. و اگر از این دستور در ویبی نخواهید استفاده کنیم یه جای کار می لنگه.
    بدنه یک دستور if باید بصورت تو رفته باشد تا بتواند با یک نگاه نقاط شروع و خاتمه این دستور را تشخیص دهید . کلیه دستورات if چند خطی دارای مجموعه متناظری از دستورات end if در جایی از برنامه می باشند . دستور end if همیشه با آخرین دستور if مرتبط است بدون توجه به اینکه چقدر تو رفته باشد.
    مقایسه داده ها به وکمک if
    If (cursales > cursalesgoal) then
    Cursalarybonus=100.00
    Lblsalesnote.caption="maji"
    Lblsalesnote.backcolor=red
    Lblsalesnote.fontbold=true
    End if
    تکمیل دستور if با لغت کلیدی else
    در قسمت های بالا در مورد شکل دستور ifآشنا شدید. اما برنامه نویسان غالب اوقات از شکل توسعه یافته آن استفاده می کنند.
    که فرمت زیر را دارد.
    If conditional then
    Block of one or more visual basic statements
    Else
    Block of one or more visual basic statements
    End if
    ادامه قسمت سوم
    در اینجا نیز مانند کلیه دستورهای چند خطی برای واضح شدن بدنه دستور بصورت تو رفته می باشد.
    اما به خاطر داشته باشید. که این شیوه ضروری نیست. اولین فرمت if که قبلا دیدید کدی را نشان می داد که اگر شرط درست باشد این کد اجرا می شد.
    در این فرمت اگر شرط غلط باشد کدی برای اجرا وجود نخواهد داشت. Else بدین منظور به کار می رود.
    دستور if…elseاز آنکه if … else خاتمه یافت اجرای بقیه برنامه ادامه یافت پیدا می کند.
    دستورات if تو در تو
    If text.text="majid" then
    If text.text="majid2" then
    Text2.text="majid"
    Else
    Text2.text="majid3"
    End if
    End if
    گاهی اوقات بر اساس داده های مختلف ممکن است بخواهد یک رویداد یا نوع از روال ها را زودتر از موعد مقرر خاتمه دهید. برای انجام این کار می توانید دستور if را با دستور exit ترکیب کنید.
    Exit sub|function|do|for
    استفاده از دستور exit sub برای ختم زودرس یک روال
    دستورات if…elseتودرتو
    چنمانچه بخواهیم یک دستور if…else را درون یک دستور دیگر if……else قرار دهید باید برای شروع دستور if تو در تو از elseif استفاده کنید.
    Elseif کمک می کند تا دو یا چند دستور if….else تو در تو با هم ترکیب شوند.
    If text1.text="majid" then
    Text2.text="majidddddddd"
    Elseif text12.text="majidddddddddd"
    Text3.text="ddd"
    End if
    همانطور که دیدید ما در قسمت if می گفتیم اگر وelse را در بین if می گزاشتیم که اگر خواستیم بگویید ویا
    حال دستور elseif می گوید ویا اگر که هم ویا است و هم اگر یعنی دستور ویا دستو استفاده می شود.
    انتخاب از طریق دستور select case
    مناسب ترین موقعیت برای استفاده ار دستور select case هنگام انتخاب با وجود چند شرط است . مسلما اگر بیشتر از سه یا چهار دستور if…else تودرتو داشته باشید نتیجه یک برنامه پیچیده خواهد بود.بعبارت دیگر وارد یک منطق در هم و برهم بصورت زیر می شوید : اگر این درست باشد. بعد اگر این درست باشد.
    بعد اگر این هم درست باشد آنگاه کاری را انجام بده در غیر این صورت ... فرمت select case بصورت زیر است.
    Select case expression
    Case expressionmatch
    Block of one or more visual basic statements
    [ case expressionmatch1
    Block of one or more visual basic statements]
    [ case expressionmatch2
    Block of one or more visual basic statements]
    [ case expressionmatch3
    Block of one or more visual basic statements]
    End select
    Select caseیک مورد را از میان چند مورد انتخاب می کند. تعداد شرایطی که امتحان می شوند به نیاز شما بستگی دارد. این شرایط بصورت[case expressionmatch#...] نشان داده می شوند. فرض کنید که هیچکدام از این شرایط بر قرار نباشند.علیرغم فرمت پیچیده استفاده از دستور select case ساده است. به مثال زیر توجه کنید.
    Select case txtgrade.text
    Case "a"
    Lblannounce.caption="ma"
    Case "b"
    Lblannounce.caption="maa"
    Case "c"
    Lblannounce.caption="maj"
    Case "d"
    Lblannounce.caption="maji"
    Case "f"
    Lblannounce.caption="majid"
    Case else
    Lblannounce.caption="majid rahimy"
    End select

    نا له پنداشت که در سینه ی ما جا تنگ است

    رفت و برگشت سراسیمه که دنیا
    تنگ است

  6. کاربرانی که از پست مفید ریپورتر سپاس کرده اند.


  7. #4
    کـــــــاربر فــــعال
    رشته تحصیلی
    مکانیک سیالات
    نوشته ها
    11,179
    ارسال تشکر
    13,156
    دریافت تشکر: 21,945
    قدرت امتیاز دهی
    56319
    Array
    ریپورتر's: خوشحال2

    پیش فرض آموزش گام به گام ویژوال بیسیک6.0 (4)

    ادامه قسمت سوم
    اگر بنا به دلایلی حروفی غیز ازa|b|c|d|f درون متن ظاهر شود دستور case else اجرا شود و با تنظیم مقدار برچسب . خطایی را اعلام می کند.
    بقیر از دستورات select case دستوراتی دیگر در مورد همین مانند محدودها و.... می باشد.
    حلقه do
    ویژوال بیسیک یک دستور چند خطی به نام حلقه do دارد. در اینجا نیز مانند دستور if دستورات حلقه do با فرمت های مختلفی می آیند.
    Do while condition
    Block of one or more visual basic statements
    Loop
    Do
    Block of one or more visual basic statements
    Loop while condition
    Block of one or more visual basic statements
    Loop
    Do
    Block of one or more visual basic statements
    Loop while condition
    منظور از condition در حلقه do یک عبارت کنترل یا مقدار بولی است که درست یا غلط می باشد. فرمتی را که انتخاب می کنید اصولا به سلیقه شما بستگی دارد. اما تفاوت هایی نیز بین آنها وجود دارد.
    شما می توانید از هر شکل حلقه do استفاده کنید.
    Do while intctr <=10
    Lblout.caption=intctr
    Intctr=intctr +1
    Loop
    این قسمت ادامه دارد

    صفحه کلید و صفحه تصویر مقدمه ای بر توابع داخلی
    توابع نوعی روال هستند. تفاوت بین تابع و سابروتین آن است که تابع پس از اتمام کار خود(یعنی اجرای کد بدنه تابع)یکم مقدار را به قسمت دیگری از برنامه می فرستند. در فصل بعد یاد می گیرید که چگونه توابع را بنویسید و نیز با طرز کار آنها با تمام جزئیات آشنا می شوید.
    آشنایی با توابع داخلی:
    توابع هیچ . یک یا چند مقدار را می گیرند و یک مقدار را بر می گردانند.
    تابع داخلی internal function یا توبع ذاتی intrinisic function تابعی است که همراه ویژوال بیسیک ارایه می شود و یک کار خاص مثل محاسبه یا عملیات ورودی/خروجی را انجام می دهد.قبل از آنکه بتوانید از یک تابع داخلی استفاده کنید باید نام و پیش نیازهای آن را بدانید. با وجودی که کد درون یک تابع داخلی را نمی بینید. اما می توانید از این توابع در برنامه های خودتان استفاده کنید. توابع داخلی نیز مثل if قسمتی از زبان ویژوال بیسیک هستند
    شما از توابع برای کارهای زیادی استفاده خواهید کرد. هر چه بیشتر با توابع در این فصل و خصوصا فصل بعد آشنا شوید بهتر می توانید از آنها استفاده کنید. فعلا موضوعات زیر را بخاطر بسپارید.
    معمولا یک یا چند مقدار به یک تابع منتقل می شود و به ندرت تابعی را می بینید که به هیچ مقداری نیاز نداشته باشد. این مقادیر که به تابع منتقل می کنید آرگان می گویند.
    آرگمانargumentمقداری است که یک تابع منتقل می شود.
    هموراه بعد از نام تابع باید پرانتز بیاید البته به استثنای توابعی که هیچ آرگمانی نیاز ندارند.
    آرگمان های تابع درون پرانتز قرار می گیرند. در صورتی که چند آرگمان را منتقل می کنید باید آنها را کاملا از هم جدا نمایید.
    در ادامه این قسمت برای سادگی از اصطلاح تابع بجای تابع داخلی استفاده می شود. در این قسمت یک کنترل تصویر را روی فرم نصب کردید و برای بار کردن یک تصویر درون آن از یک تابع استفاده نمودید.
    در اینجا آن خط کد را می بینید. که برای سادگی آرگمان تابع تا حدی خلاصه شده است.
    Image1.picture=loadpicture ("\taknik.bmp")
    نام تابعloadpicture است. در این کتاب هنگام بحث راجع به توابع از پرانتزهای خالی بعد از نام تابع استفاده شده است.
    تا بتواند به راحتی نام توابع متغیر و کنترل ها را از هم تشخیص دهید. تابع فوق یک آرگومان رشته ای دارد.
    ...
    امکان پاسخ دادن کاربر از طریق تابع msgbox()
    تابع msgboxیک تابع پیغام می باشد مثالا وقتی ما یک دستوری داریم که می خواهیم کاربر بعد از انجام آن دستور یک msgbox اجرا شود و بعد از اجرا شدن این دستور کاربر با انتخاب یک یا.. از دستور از تابع msgbox .. که بطور مثال ما یک کار اشتباهی در برنامه انجام می دهیم و برنامه یک پیغام شما اشتباه بودن ما را می گوید و یا ما دکمه خروج را می زنیم پیغامی حاوی آیا شما مطمئن هستید که می خواهید از برنامه خارج شوید ک 2 راه را پیش روی شما می گزارد یکی بله و دیگری خیر با زدن بله شما از برنامه خارج می شوید ولی بازدن خیر داخل برنامه خواهید ماند.
    تابع msg box شمال:
    شمایل
    پیغام
    و دکمه ها می باشد
    نام پروژه
    به کد زیر دقت کنید
    Msgbox=("click for exit")
    کد بالا فقط ما متن اریه شده را نوشتیم و اصلا برای دکمه و شمایل چیزی ننوشتیم.
    خود msgbox اولیه شامل یک دکمه است که با زدن دکمه دستور بعدی اجرا می شود . ولی ما برای دستور کدی ننوشتید خود برنامه با زدن دکمه هر دستوری باشد اجرا می کند
    دستور msgbox("…..") فقط برای یک مطن ارایه می شود ولی اگر بخواهیم دکمه نام پروژه شمایل اضافه کنیم باید قبل از زدن msg box بنویسیم intresponse= ماننده
    Intresponse=msgbox("ms",….,……,….")
    حال برای یاد گیری بهتر یک کد کامل می نویسم
    Intresponse=msgbox("text",vbok+vbquestion+vbdefaul tbutton2,"title")
    برای اینکه ببینید کاربر کدام کلیک را انتخاب کرده باید این مقادیر استفاده کنید.
    به ترتیب
    مقدار>ثابت نامگزاری شده>توضیح
    1
    2
    3
    4
    5
    6
    7
    Vbok
    Vbcancel
    Vbabort
    Vbretry
    Vbignore
    Vbyes
    Vbno
    کاربر دکمه ok را کلیک کرده
    کاربر دکمهcancelرا انتخاب کرده است
    کاربر دکمهabortرا انتخاب کرده است
    کاربر دکمهretry را انتخاب کرده است.
    کاربر دکمه yes را انتخاب کرده است
    کاربر دکمه no را انتخاب کرده است.
    ثابت های نامگزاری شده.
    شمایل
    به ترتیب
    مقدار>ثابت های نامگزاری شده>توضیح>شمایل
    16
    32
    48
    64
    Vbcritical
    Vbquestion
    Vbexclamation
    Vbinformation
    پیغام جدی
    علامت سوال
    علامت هشدار
    اطلاعات
    نام دکمه ها
    Vbokonly
    Vbokcancel
    Vbabortretryignore
    Vbyesnocancel
    Vbyesno
    Vbretrycancel
    ادامه دارد
    آشنايي با BitBlt هدف از اين مبحث آموزشي ، آشنايي با تابع BitBlt و برخي ديگر از توابع کتابخانه Win32 GDI براي انجام برخي عمليات گرافيکي مثل double buffering و خواندن sprite از فايل است .
    نکته : sprite به کاراکترهاي متحرکي گفته مي شود که در بازيها وجود دارد .
    اولين چيزي که به آن نياز داريد ايجاد يک فرم است . خاصيت ScaleMode آنرا برابر 3-Pixel قرار دهيد . پيشنهاد مي کنم که هميشه در هنگام استفاده از فرم بهمراه API از pixel براي scalemode استفاده کنيد .
    سپس سايز فرم را به اندازه اي افزايش دهيد تا ScaleWidth برابر 320 و ScaleHeight برابر 256 شود . توجه کنيد که خاصيت HasDC فرم را True قرار دهيد . همچنين از خاصيت AutoRedraw براي فرم استفاده نمي کنيم زيرا مي خواهيم از Double Buffering استفاده کنيم که بسيار سريعتر و کارامدتر مي باشد .
    مرحله بعدي declare کردن API هايي است که به آنها نياز داريم :

    'blitting
    Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
    'code timer
    Private Declare Function GetTickCount Lib "kernel32" () As Long
    'creating buffers / loading sprites
    Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
    Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
    Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
    'loading sprites
    Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
    'cleanup
    Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
    Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long


    سوال : DC چيست ؟ DC و يا بعبارت ديگر Device Context ، hDC يک عدد است که به يک آدرس در حافظه اشاره مي کند که داده اي در آن ذخيره شده است . در هنگام استفاده از BitBlt براي اشاره کردن به آدرسي که داده گرافيکي در آنجا ذخيره شده ، استفاده مي شود .
    در مرحله بعدي نياز به ذخيره آدرسهاي DC داريم که مي سازيم . آدرسهاي DC مقادير Long هستند همچنين آنها را بصورت Public تعريف مي کنيم :

    'our Buffer's DC
    Public myBackBuffer As Long
    Public myBufferBMP As Long
    'The DC of our sprite/graphic
    Public mySprite As Long
    'coordinates of our sprite/graphic on the screen
    Public SpriteX As Long
    Public SpriteY As Long


    حال بايد تابعي بسازيم که تصاوير گرافيکي درون حافظه load کند . نکته مهمي که بايد به آن توجه کنيد اينست که يک device context خودش به تنهايي هيچ داده گرافيکي ندارد و بايستي يک bitmap موجود باشد تا درون آن load شود براي مثال يک فايل bmp يا يک bitmap خالي که از آن بعنوان back buffer استفاده مي کنيد .
    تابعي که خواهيم نوشت يک device context منطبق با صفحه مي سازد سپس فايلهاي گرافيکي مورد نظر را درون device context قرار مي دهد :

    Public Function LoadGraphicDC(sFileName As String) As Long
    'temp variable to hold our DC address
    Dim LoadGraphicDCTEMP As Long
    'create the DC address compatible with
    'the DC of the screen
    LoadGraphicDCTEMP = CreateCompatibleDC(GetDC(0))
    'load the graphic file into the DC...
    SelectObject LoadGraphicDCTEMP, LoadPicture(sFileName)
    'return the address of the file
    LoadGraphicDC = LoadGraphicDCTEMP
    End Function


    سوال : double-buffering چيست ؟ زمانيکه يک محيط گرافيکي مي سازيد تا درون آن چيزي را ترسيم کنيد ، شما sprite ها / گرافيکها / متن را درون حافظه blit مي کنيد ( offscrean ) سپس نتيجه نهايي را روي صفحه blit مي کنيد . اين عمل از لرزش تصوير يا flickering جلوگيري مي کند ( زماني رخ مي دهد که چندين sprite مستقيماً روي صفحه blit شوند ) و بسيار سريعتر از AutoRedraw است .
    قبل از اينکه مثالي براي اين تابع ذکر کنم تابع BitBlt را توضيح خواهم داد :
    BitBlt تابعي از کتابخانه dll “gdi32” است . اين تابع يک انتقال bit-block از داده هاي مرتبط به يک مستطيل از پيکسلها به يک device context مقصد انجام مي دهد . بعبارت ديگر داده هاي گرافيکي را از محيط گرافيکي ( يک bitmap ) به محيط گرافيکي ديگري ( screen يا يک form ) کپي مي کند . فرم کلي اين تابع بصورت زير است :

    Declare Function BitBlt Lib "gdi32" Alias "BitBlt" _
    (ByVal hDestDC As Long, _
    ByVal x As Long, _
    ByVal y As Long, _
    ByVal nWidth As Long, _
    ByVal nHeight As Long, _
    ByVal hSrcDC As Long, _
    ByVal xSrc As Long, _
    ByVal ySrc As Long, _
    ByVal dwRop As Long) As Long


    اولين خط بيان مي کند که ما بوسيله gdi32 DLL به تابع BitBlt دسترسي خواهيم داشت . خطوط ديگر پارامترهايي هستند که اين تابع مي گيرد :
    hDestDC : hDC مربوط به محيط مقصد ( اگر مي خواهيد مقصد يک فرم باشد از form.hDC استفاده کنيد و يا اينکه آدرس يک backbuffer را که ساخته ايد بدهيد )
    x : مختصات افقي محلي که مي خواهيد گرافيک شما ظاهر شود .
    y : مختصات عمدي محلي که مي خواهيد گرافيک شما ظاهر شود .
    nWidth : عرض گرافيک شما
    nHeight : ارتفاع گرافيک شما
    hSrcDC : hDC مربوط به محيط مبدا
    xSrc : افست x . 0 زماني استفاده مي شود که بخواهيد از سمت چپترين گوشه گرافيک مبدا عمل blit را انجام دهيد .
    ySrc : افست y
    dwRop : مد draw اي که در زمان blitting گرافيکتان مي خواهيد استفاده کنيد ( Raster Operations يا ROP ) . اين پارامتر مقادير زير را مي تواند بگيرد :
    - vbSrcCopy : داده تصوير مبدا را مستقيماً در مقصد کپي مي کند .
    - vbSrcPaint : داده هاي تصاوير مبدا و مقصد را با هم OR مي کند ( pseudo-alphablending effect )
    - vbSrcAnd : داده هاي تصاوير مبدا و مقصد را با هم AND مي کند ( pseudo-gamma effect )
    - vbSrcInvert : داده هاي تصاوير مبدا و مقصد را با هم XOR مي کند
    - vbSrcErase : ابتدا داده تصوير مقصد را invert مي کند سپس آنرا با داده تصوير مبدا AND مي کند .
    - vbDstInvert : داده تصوير مقصد را invert مي کند و داده تصوير مبدا را در نظر نمي گيرد .
    - vbNotSrcCopy : داده تصوير مبدا را invert مي کند و آنرا مستقيماً در مقصد کپي مي کند .
    - vbNotSrcErase : داده تصاوير مبدا و مقصد را OR کرده و نتيجه را invert مي کند .

    مثالي از کاربرد BitBlt :
    BitBlt Form1.hDC, PlayerX, PlayerY, 48, 48, picPlayer.hDC, 0, 0, vbSrcCopy

    حال مي خواهيم از BitBlt در يک حلقه استفاده کنيم تا يک image را در فرم حرکت دهيم :
    1 – يک فايل bmp با ابعاد 32x32 بسازيد و با نام sprite1.bmp در دايرکتوري پروژه ذخيره کنيد .
    2 – يک دکمه در فرم قرار دهيد و نام آنرا cmdTest بگذاريد .
    3 – دکمه را در گوشه بالايي فرم و در سمت راست قرار دهيد .
    4 – کد زير را براي event مربوط به کليک شدن دکمه بنويسيد :

    'Timer variables...
    Dim T1 As Long, T2 As Long
    ساخت DC براي backbuffer’
    myBackBuffer = CreateCompatibleDC(GetDC(0))
    ساخت يک سطح bitmap براي DC’
    myBufferBMP = CreateCompatibleBitmap(GetDC(0), 320, 256)
    load کردن سطح bitmap خالي درون buffer’
    SelectObject myBackBuffer, myBufferBMP
    قبل از blit کردن درون بافر بايد آنرا با black پر کنيم’
    BitBlt myBackBuffer, 0, 0, 320, 256, 0, 0, 0, vbWhiteness
    load کردن split توسط تابعي که در بالا نوشتيم’
    mySprite = LoadGraphicDC(App.Path & "\sprite1.bmp")
    cmdTest.Enabled = False
    == شروع حلقه اصلي ==’
    خواندن tickcount جاري’
    T2 = GetTickCount
    Do
    DoEvents
    T1 = GetTickCount
    اگر 15 ميلي ثانيه گذشته بود فريم بعدي شروع شود’
    If (T1 - T2) >= 15 Then
    پاک کردن محل قبلي sprite بوسيله پر کردن آنجا با black ‘
    BitBlt myBackBuffer, SpriteX - 1, SpriteY - 1,32, 32, 0, 0, 0, vbBlackness
    Blit کردن sprite درون back buffer’
    BitBlt myBackBuffer, SpriteX, SpriteY, 32, 32,mySprite, 0, 0, vbSrcPaint
    Blit کردن backbuffer روي فرم’
    BitBlt Me.hdc, 0, 0, 320, 256, myBackBuffer,0, 0, vbSrcCopy
    حرکت دادن sprite روي صفحه’
    SpriteX = SpriteX + 1
    SpriteY = SpriteY + 1
    'update timer
    T2 = GetTickCount
    End If
    Loop Until SpriteX = 320

    سپس بايد يک cleanup code بنويسيد تا حافظه هاي را که براي نگهداري تصاوير گرافيکي و buffer ها استفاده کرده ايد آزاد کنيد :

    Private Sub Form_Unload(Cancel As Integer)
    DeleteObject myBufferBMP
    DeleteDC myBackBuffer
    DeleteDC mySprite
    End


    کنترل Internet Transfer - قسمت اول مقدمه : کنترل Internet Transfer نسبت به کنترل WebBrowser که در روزهاي قبلي معرفي شد در سطح پايينتري قرار دارد . اين کنترل با استفاده از دو پروتکل HTTP و FTP مي تواند داده ها را منتقل کند . اين کنترل زمانيکه از پروتکل HTTP استفاده مي کند با همان روش کنترل WebBrowser به سرويس دهنده صفحات وب متصل مي شود اما بجاي آنکه صفحه وب را نمايش دهد متن Html صفحه را بازيابي مي کند . همچنين زمانيکه اين کنترل از پروتکل FTP استفاده مي کند قادرست فايلها را بين کامپيوترهاي روي شبکه منتقل سازد .
    اتصالات HTTP : همانطور که مي دانيد ، پروتکل HTTP استاندارد وب مي باشد . صفحات وب با زبان Html نوشته مي شوند و انتقال آنها از server به client توسط پروتکل HTTP صورت مي گيرد .
    متد OpenURL : ساده ترين راه استفاده از کنترل IT متد OpenURL است . شکل کلي اين متد بصورت زير است :

    Inet.OpenURL(url,DataType)x

    که url آدرس صفحه وب و DataType نوع داده بازيابي شونده است و دو مقدار icString ( داده متني ) يا icByteArray ( داده باينري ) را مي گيرد . مقدار بازگشتي اين متد ، داده هاي منتقل شده است .
    اين متد بصورت سنکرون کار مي کند يعني در تمام مدت کار آن برنامه نمي تواند کار ديگري انجام دهد . اگر از icByteArray استفاده کنيد بايد مقدار بازگشتي آنرا در يک ارايه بايت قرار دهيد .
    مثال 1 : از بخش Component در منوي Project مورد Microsoft Internet Transfer Control 6.0 را به toolbar خود اضافه کنيد . سپس يک کنترل IT روي فرم قرار دهيد و همچنين يک Rich Textbox و يک دکمه روي فرم قرار دهيد و کد زير را براي event مربوط به کليک دکمه بنويسيد :

    TextBox.text=Inet.OpenURL(“

    مثال 2 : کد زير داده هاي باينري را از اينترنت خوانده و آنها را در يک فايل ذخيره مي کند :

    Dim b() as byte
    B()=Inet.OpenURL(ftp://ftp.microsoft.com/test.zip,icByteArray)x
    Open App.path & “\test.zip” For Access Write As #1
    Put #1,b()x
    Close #1


    رويداد StateChanged : کنترل IT فقط يک event دارد که StateChanged مي باشد . اين event زماني روي مي دهد که State کنترل تغيير کند . State هر اتفاقي است که برنامه بايد از آن مطلع شود . تعريف کلي اين event بصورت زير است :

    Inet_StateChanged(ByVal NewState As Integer)x

    که NewState مقداري است که حالت جديد را بيان مي کند . مقادير ممکن اين پارامتر عبارتند از :
    icNone : حالت تغيير نکرده است .
    icResolvingHost : در حال جستجوي آدرس IP کامپيوتر موردنظر .
    icHostResolved : آدرس IP کامپيوتر موردنظر يافت شد .
    icConnecting : در حال اتصال به کامپيوتر مقصد
    icConnected : اتصال به کامپيوتر مقصد برقرار شد .
    icRequesting : در حال ارسال درخواست به کامپيوتر مقصد
    icRequestSent : درخواست به کامپيوتر مقصد ارسال شد .
    icReceivingResponse : در حال دريافت پاسخ از کامپوتر مقصد .
    icResponseReceived : پاسخ کامپيوتر مقصد دريافت شد .
    icDisconnecting : در حال قطع اتصال با کامپيوتر مقصد .
    icDisconnected : اتصال مقصد با موفقيت قطع شد .
    icError : در ارتباط با کامپيوتر مقصد خطايي رخ داده است .
    icResponseCompleted : تکميل پاسخ – تمام داده ها دريافت شد .
    تشخيص خطا در عمليات انتقال داده اهميت بالايي دارد و StateChanged در صورت بروز هر خطايي مقدار icError را برمي گرداند و اطلاعات خطا را در دو خاصيت ResponseCode و ResponseInfo برمي گرداند .
    انتقال داده بصورت آسنکرون : کنترل IT متدهاي انعطاف پذير ديگري هم دارد که آسنکرون هستند و اجازه مي دهند تا همزمان با عمليات انتقال داده ، برنامه به وظايف ديگري هم بپردازد . اين متدها با استفاده از Event Driven Model کار مي کنند . بدين معني که وقتي برنامه درخواست انتقال داده اي را مي دهد کنترل IT درخواست را در زمينه برنامه انجام مي دهد و برنامه ازاد است تا به کارهاي ديگرش بپردازد . زمانيکه داده ها بازيابي شود ، داده ها را از بافر داخلي کنترل IT مي خواند .
    متد GetChunk : در عمليات انتقال آسنکرون ، بايستي داده را توسط اين متد از بافر داخلي کنترل IT بگيريم :

    Inet.GetChunk(datasize[,datatype])x

    که پارامتر datasize از نوع long بوده و تعيين مي کند چند بايت از بافر خوانده شود و پارامتر اختياري datatype نوع داده را مشخص مي کند و مي تواند مقادير icString و icByteArray را بگيرد .
    زمانيکه StateChanged وارد حالتهاي icResponseReceived و يا icResponseCompleted شد بايد از GetChunk استفاده کنيد . بدين صورت که از يک حلقه استفاده مي کنيم تا کل بافر را بخوانيم :

    Private Sub Inet_StateChanged(Byval State as Integer)x
    Dim temp1,temp2
    Select Case State
    Case icResponseCompleted
    temp1=””x
    temp2=””x
    Do
    temp1=Inet.GetChunk(512,icString)x
    temp2=temp2 & temp1
    Loop Until temp1=””x
    End Select
    End Sub

    براي بالابردن کارايي ، بهتر است از قطعات کوچک ( بين 512 تا 1024 بايتي ) استفاده کنيد .
    متد Execute : و اما انعطاف پذيرترين متد کنترل IT ، متد Execute است . فرمت کلي اين متد بصورت زير است :

    Inet.Execute(url,Command,Data,RequestHeaders)x

    که url آدرس مقصد ، Command فرماني است که به کامپيوتر مقصد داده مي شود و Data و RequestHeaders اطلاعات اضافي لازم براي اجراي فرمان داده شده است . فرمانهاي Command همان فرمانهاي HTTP هستند که عبارتند از :
    - GET : دريافت داده ها از کامپيوتر مقصد
    - HEAD : دريافت اطلاعات header از کامپيوتر مقصد
    - POST : ارسال اطلاعات لازم براي تکميل درخواست
    - PUT : ارسال فايل براي کامپيوتر ميزبان ( upload )
    فرمان GET پرکاربردترين فرمان متد Execute است و داده هاي خوانده شده را در بافر داخلي بافر کنترل IT قرار مي دهد تا بتوان با متد GetChunk آنها را بازيابي نمود .
    مثال :

    Inet.Execute

    ساير خواص کنترلIT :
    - AccessType : نوع دسترسي کنترل IT به اينترنت را مشخص مي کند و سه مقدار مي تواند بگيرد :
    icUseDefault : استفاده از تنظيمات رجيستري براي دسترسي به اينترنت
    icDirect : اتصال مستقيم کنترل IT به اينترنت
    icNamedProxy : اتصال به اينترنت توسط پروکسي
    - Document : نام صفحه پيش فرض که در متد Execute از آن استفاده مي شود . اگر به متد Execute پارامتر url را ندهيد از اين صفحه پيش فرض استفاده مي کند .
    - Password : کلمه رمز عبور کامپيوتر ميزبان FTP
    - Procotol : نوع پروتکل مورد استفاده در متد Execute را مشخص مي کند و 5 مقدار مي تواند بگيرد :
    icUnknown : نامعلوم
    icDefault : پروتکل پيش فرض
    icFTP : پروتکل FTP
    icHTTP : پروتکل HTTP
    icHTTP : پروتکل حفاظت شده HTTP
    - ----- : نام ميزبان پروکسي
    - RequestTimeOut : مدت زماني که کنترل IT صبر مي کند تا اطلاعات را دريافت کند . اگر اين خاصيت صفر باشد کنترل تا هر زمان که لازم باشد براي دريافت پاسخ صبر مي کند . در حالت سنکرون ( متد OpenURL ) بعد از سپري شدن اين مدت زمان ، يک خطا توليد مي شود و در حالت آسنکرون ( متد Execute ) رويداد StateChanged مقدار خطا را بر مي گرداند
    - ResponseCode : بعد از بروز حالت icError اين خاصيت کد خطا را مي دهد .
    - ResponseInfo : توضيحي درباره خطا
    - StillExecuting : اگر True باشد يعني کنترل مشغول انجام کار است .
    - URL : آدرس مقصد در متدهاي OpenURL و يا Execute
    - UserName : نام کاربر براي ورود به کامپيوتر ميزبان FTP

    نکته 1 : براي دريافت برنامه نمونه براي متد Execute با من تماس بگيريد .
    نکته 2 : موضوع روزهاي بعد :
    1 - اتصالات FTP با استفاده از کنترل IT
    2 – آشنايي با تکنيک Collision Detection در ساخت بازيهاي دوبعدي
    3 – آشنايي با کنترل WinSock
    نکته 3 : شايد اين سوال پيش بيايد که چرا همزمان با آموزش Internet Programming ، آموزش Game Programming را نيز شروع کرده ام ؟ علت اش اينست که تصميم دارم پس از پايان يافتن اين دو مبحث ، روش ساخت يک بازي دوبعدي چند نفره تحت شبکه را برايتان آموزش دهم .

    کنترل Internet Transfer - قسمت دوم اتصالات FTP

    پروتکل FTP علاوه بر نقل و انتقال فايل بين دو کامپيوتر ، مي تواند نوعي مديريت فايل ( مثل حذف فايل يا ايجاد پوشه ) روي کامپيوتر مقصد را انجام دهد . FTP در انتقال فايل بسيار قويتر از HTTP است ولي به مراتب پيچيده تر از HTTP مي باشد اما کنترل IT اين پيچيدگيها را از ديد برنامه نويس مخفي کرده است .
    براي کار با سرورهاي FTP بايد به آنها Login نمود . نوع خاصي از Login به نام Anonymous Login ( ورود ناشناس ) وجود دارد که با آن کاربران مي توانند بدون محدوديت از سايت FTP استفاده کنند . توجه کنيد که حتي براي ورود ناشناس هم نياز به نام کاربر و کلمه عبور است . براي ارسال نام کاربر و کلمه عبور از خواص username و password کنترل IT استفاده مي شود . اگر خاصيت username خالي باشد ( blank ) ، کنترل IT بطور خودکار از anonymous استفاده مي کند و آدرس email کاربر بعنوان passowrd استفاده مي شود .
    استفاده از متد OpenURL : متد OpenURL ساده ترين راه انجام عمليات FTP است . دستور زير از يک سايت FTP ليست مي گيرد :


    Text.text=Inet.OpenURL("ftp://ftp.microsoft.com",icString)x

    براي خواندن فايل از يک سايت FTP بايد در حالت باينري کار کرد :

    b()=Inet.OpenURL("ftp://ftp.microsft.com/test.zip",icByteArray)x


    استفاده از متد Execute : متد Execute قابليتهاي بيشتري دارد و اجرای آن در FTP نياز به دو پارامتر دارد :

    Inet.Execute(url,operation)x


    که url آدرس سايت FTP بهمراه نام و مسير فايل و پارامتر operation يک فرمان FTP است . کنترل IT با داده هاي خوانده شده FTP به دو طريق رفتار مي کند :
    برخي از داده ها مثل پاسخ فرمان DIR در بافر کنترل IT قرار مي گيرد و بايد آنها را با متد GetChunk خواند .
    برخي ديگر از داده ها مثل فايل خوانده شده با فرمان GET مستقيماً روي ديسک نوشته مي شوند و ديگر نيازي به استفاده از متد GetChunk نيست .
    فرامين FTP بسيار قوي هستند و حتي به شما اين امکان را مي دهند که فايلها را به روي کامپيوتر مقصد کپي کنيد ، به پوشه هاي کامپيوتر مقصد برويد ، فايلها را حذف کنيد و يا تغيير نام دهيد . البته بايد توجه داشت که فرامين قابل اجرا به نوع ورود به سيستم FTP بستگي دارد . اگر با کاربر anonymous به يک سايت FTP وارد شويد تنها مي تواند فايلها را ببيند و آنها را download کنيد .
    مهمترين فرامين FTP عبارتند از :
    CD path : به دايرکتوري path مي رويد .
    CDUP : به يک دايرکتوري بالاتر مي رود .
    CLOSE : بستن اتصال FTP
    DELETE file1 : حذف فايل file1
    DIR file1 : جستجوي فايل file1 روي دايرکتوري جاري
    MKDIR path : ايجاد يک دايرکتوري با نام path
    PUT file1 file2 : فايل file1 را از کامپيوتر مبدا روي فايل file2 در کامپيوتر مقصد کپي مي کند .
    PWD : نام دايرکتوري جاري در کامپيوتر مقصد را برمي گرداند .
    QUIT : قطع اتصال FTP
    GET file1 file2 : فايل file1 را از کامپيوتر مقصد روي فايل file2 در کامپيوتر مبدا کپي مي کند .
    RENAME file1 file2 : تغيير نام فايل file1 به file2
    RMDIR path : حذف دايرکتوري path در کامپيوتر مقصد
    SIZE file1 : بدست آوردن تعداد بايتهاي فايل يا دايرکتوري file1
    آموزش DirectX-Graphic (قسمت اول) موضوع : ساخت يک واسط direct3D

    DirectX8 ابزاري براي ساخت تصاوير ثابت و متحرک دو بعدي و سه بعدي مي باشد .

    براي کار با DirectX8 ابتدا بايستي آنرا روي سيستم خود نصب کنيد . سپس در محيط vb از منوي project گزينه References را انتخاب کنيد . در فرمي که ظاهر مي شود اطمينان حاصل کنيد که گزينه DirectX8 for VB type library فعال باشد .

    براي کار با DirectX8 بايستي از تعريف نمودن شي پايه DirectX8 شروع نمود:
    Dim Dx as DirectX8
    شي Direct3D8 براي کنترل اشيا‌‌ سه بعدي بکار مي رود :
    Dim D3D as Direct3D8
    شي Direct3DDevice8 ، سخت افزار مربوط به رندر تصاوير را مشخص مي کند :
    Dim D3DDevice as Direct3DDevice8
    حال براي شروع کار با Direct3D ، تابع ( ) initialise را تعريف مي کنيم . اگر اينکار درست انجام شود تابع ، مقدار true را برمي گرداند :
    public function initialise () as Boolean
    Dim DispMode as D3DISPLAYMODE
    شي D3DISPLAYMODE حالت نمايش را مشخص مي نمايد .
    Dim D3Dwindow as D3DPRESENT_PARAMETERS
    شي فوق مشخص مي کند که viewport شما چگونه باشد .
    حال شي اصلي DirectX8 را مي سازيم : Set Dx=New DirectX8
    سپس شي اصلي ساخت واسط سه بعدي را مي سازيم :
    ()set D3D.Dx.Direct3Dcreate
    سپس حالت فعلي نمايش را با دستور زير استخراج مي کنيم :
    D3D.getadapterdisplaymode D3DADAPTER_DEFAULT,dispmode
    حال دو حالت براي کار با DirectX داريم :
    1 - windowed mode
    2 - fullscrean mode

    1 - براي کار با حالت پنجره اي ابتدا اين موضوع را به DirectX اطلاع مي دهيم:
    D3Dwindow.windowed=1
    سپس نوع referesh تصوير را مشخص مي کنيم:
    D3Dwindow.swapeffect=D3DSWAPEFFECT_COPY_VSYNC
    سپس بايستي فرمت بافر نگهدارنده تصاوير را مشخص کنيم :
    D3Dwindow.backbufferformat=dispmode.format

    2 - براي کار با حالت تمام صفحه ، ابتدا نوع refresh را مشخص کرده سپس تعداد بافر هاي تصوير و سرانجام نوع و سايز بافر را مشخص مي نمائيم :
    D3Dwindow.swapeffect=D3DSWAPEFFECT_DISCARD
    D3Dwindow.backbuffercount=1
    D3Dwindow.backbufferformat=dispmode.format
    D3Dwindow.backbufferheight=dispmode.height
    D3Dwindow.backbufferwidth=dispmode.width
    سپس پنجره نمايش مشخص مي گردد :
    D3Dwindow.hdevicewindow=frmMain.hwnd

    @حال بايستی يک device ساخته شود که يا از طريق سخت افزار و يا نرم افزار تصاوير را رندر نمايد :

    Set D3DDevice=D3Dcreatedevice(D3DADAPTER_DEFAULT
    ,D3DDEVTYPE_HAL,
    frmMain.hwnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,
    D3Dwindow)x,
    end sub
    درصورتي که کارت گرافيک شما امکانات رندر سخت افزاري تصاوير را ندارد از D3DDEVTYPE_REF بجاي D3DDEVTYPE_HAL استفاده کنيد .
    حال بايستي روتين render را بنويسيم . البته در اين درس تصويري براي رندر نداريم و تنها چگونگي نوشتن اين روتين را بيان خواهم کرد :
    ۱ - ابتدا بايستي device مربوط به رندر ، قبل از کشيدن تصوير در آن پاک شود :
    D3DDevice.clear 0,byval 0,D3DCLEAR_TARGET,&H0,1#,0
    عدد hex اي که در دستور فوق آمده رنگ زمينه صفحه را مشخص مي کند

    ۲ - سپس بايستي تصاوير مورد نظر را رندر کنيم . اينکار توسط دستورات زير انجام مي شود :
    D3DDevice.beginscence
    all rendering calls go between these two lines '
    D3DDEvice.endscence

    3 - در پايان بايستي صفحه را update کنيد :
    D3DDevice.present byval 0,byval 0,0,byval 0
    Api هاي ويندوز
    امروز قصد دارم در مورد API هاي ويندوز و چگونگي استفاده از آنها در ويژوال بيسيک بطور خلاصه توضيح دهم و همچنين دو مثال پراستفاده را نيز در اين زمينه بيان کنم که عبارتند از چگونگي پخش فايلهاي Wav و ساخت يک تايمر با دقت بالا :

    ۱ - آشنايي با Windows API : واژه API مخفف Application Programming Interface مي باشد . API هاي ويندوز مجموعه اي از توابع از پيش آماده موجود در سيستم عامل هستند که شما مي توانيد آنها را در برنامه هاي خود فراخواني کنيد . اين توابع در چندين کتابخانه DLL ويندوز ذخيره شده اند . براي دسترسي به اين توابع در ويژوال بيسيک ابتدا بايد آنها را برنامه خود declare کنيد . براي مثال :

    Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long


    همانطور که مي بينيد مثال فوق يک Declare از تابع sndPlaySound مي باشد که اين تابع در کتابخانه Winmm.dll موجود است . کلمه Alias نشان مي دهد که اين تابع نام ديگري در dll دارد . ساير بخشها مربوط به تعريف پارامترهاي تابع مي باشند که در مورد مثال فوق ، اين تابع دو پارامتر ورودي و يک خروجي از نوع Long دارد .
    پس از Delare کردن API در برنامه مي توانيد از آن استفاده نمائيد .

    ۲ - پخش فايلهاي Wav : تابعي که براي پخش فايلهاي Wav استفاده مي شود تابع sndPlaySound است که در بالا با آن آشنا شديد . پارامتر lpzSoundName نام و مسير فايل Wavو پارامتر uFlags چگونگي پخش فايل را مشخص مي کند . مقادير ممکن اين پارامتر عبارتند از :
    - SND_ASYNC : اجازه مي دهد طوري فايل Wav پخش شود که آنرا بتوان وقفه داد . بعبارت ديگر قادر خواهيد بود فايل Wav تان را هر زمان که بخواهيد پخش کنيد و مطمئن باشيد که حتماً شنيده مي شود .
    - SND_LOOP : فايل Wav را بطور ممتد پخش مي کند .
    - SND_NODEFAULT : اگر فايل Wav پيدا نشود صداي ديگري پخش نخواهد شد ( مثلاً برخي صداهاي default ويندوز )
    - SND_SYNC : در طول پخش فايل Wav کنترل به برنامه داده نمي شود . اين پارامتر در زمانيکه مي خواهيد فايل Wav اي را در پس زمينه برنامه تان پخش کنيد مناسب نمي باشد .
    - SND_NOSTOP : اگر فايل Wav اي قبلاً در حال پخش باشد ، فايل Wav شما آنرا دچار وقفه نمي کند . از اين پارامتر زماني استفاده مي شود که بخواهيم فايل Wav مان هيچوقت در وسط کار قطع نشود .
    اگر بخواهيد از بيش از يکي از اين پارامترها استفاده کنيد توسط Or آنها را ترکيب نمائيد مثال :

    sndPlaySound App.path & "\ding.wav", SND_ASYNC or SND_LOOP



    نکته : براي استفاده از توابع صوتي پيچيده تر بايستي از DirectSound که يکي از اجزاي DirectX مي باشد استفاده کنيد . در مورد DirectSound بعداً صحبت خواهم کرد .

    ۳ - ساخت يک تايمر با دقت بالا : شايد تا بحال از کنترل تايمر موجود در نوار ابزار ويژوال بيسيک استفاده کرده باشيد . اين تايمر داراي دقت حدود ۵۵ ميلي ثانيه است . براي دستيابي به زمانهاي با دقت بالاتر اين کنترل مفيد نخواهد بود .
    تابع GetTickCount يک API موجود در کتابخانه Kernel32.dll است . اين تابع طول زماني را که سيستم شروع به کار کرده است را برحسب ميلي ثانيه برمي گرداند :

    Private Declare Function GetTickCount Lib "kernel32" () As Long

    براي بررسي طي شدن يک مدت زماني خاص شما ابتدا بايد مقدار اين تابع را در يک متغير کمکي مثل TempTime قرار دهيد سپس در يک حلقه Do-Loop بايد اختلاف زمان GetTickCount جديد و زمان TempTime را با مقدار زماني که مي خواهيد سپري شود مقايسه کنيد :

    TempTime = GetTickCount()x
    Do While DesiredTime < GetTickCount() - TempTime
    Do some things'
    Loop


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

    ExitFunction = False
    TempTime = GetTickCount()x
    Do While not(ExitFunction)x
    If DesiredTime < GetTickCount() - TempTime then
    Reset the temporary variable'
    TempTime = GetTickCount()x
    Do some things'
    End If
    Loop


    همچنين از تابع GetTickCount مي توان براي benchmark برنامه ها استفاده کرد . بعبارت ديگر مي توان زمان اجراي يکسري دستورات خاص را بدست آورد .

    ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول مقدمه :

    ساختارهاي داده اي از نظر تعداد اعضا به دو دسته استاتيک و ديناميک تقسيم مي شوند . ساختارهاي استاتيک مثل آرايه هاي يک بعدي و آرايه هاي دو بعدي ، تعداد اعضاي آنها در زمان طراحي برنامه مشخص مي شود و در طول اجراي برنامه ثابت است اما تعداد اعضاي ساختارهاي داده اي ديناميک در طول اجراي برنامه تغيير مي کند . ليست پيوندي ( LinkList ) ، پشته ( Stack ) ، صف ( Queue ) و درختهاي باينري ( Tree Binary) ، نمونه هايي از ساختارهاي داده اي ديناميک هستند .
    ليست پيوندي شامل مجموعه اي از عناصر داده اي است که اضافه و حذف اعضا در هر جاي ليست ممکن است .
    پشته يک ساختار داده اي مهم در کامپايلرها و سيستم هاي عامل است که عمل اضافه و حذف عناصر از ابتداي آن انجام مي شود .
    صف يک ساختار داده اي است که عمل اضافه کردن از انتها و عمل حذف کردن از ابتداي آن انجام مي شود .
    درختهاي دودويي براي جستجوي بسيار سريع ، ذخيره سازي داده ها و کامپايل عبارات استفاده مي شوند .

    نوع داده Variant :

    نوع داده variant براي متغيرهايي بکار مي رود که بطور صريح نوع آنها تعريف نشده است مثال :
    Dim value As Variant
    اين نوع داده مي تواند هر نوع داده اي را در خود ذخيره کند . همچنين براي ايجاد ساختارهاي داده اي مثل ليست هاي پيوندي ، صف ، پشته و درخت مناسب است .
    نوع داده موجود در variant مي توان توسط توابع VarType و TypeName تعيين کرد . تابع VarType يک مقدار صحيح برمي گرداند که نشان دهنده نوع ذخيره شده در variant است .
    مثال :
    Dim value as Variant
    value=”Hello”x
    در اينصورت مقدار بازگشتي ( VarType( value برابر 4 خواهد بود .
    تابع TypeName يک رشته برمي گرداند که نشان دهنده نام نوع داده ذخيره شده در variant است .

    اخذ حافظه بطور ديناميک Dynamic Memory Allocation :

    براي ايجاد و نگهداري ساختارهاي داده اي ديناميک بايستي در هنگام اجراي برنامه بتوان فضاي بيشتري براي نگهداري داده هاي جديد بدست آورد . با استفاده از کلمه کليدي New مي توان در ويژوال بيسيک حاقظه ديناميک گرفت :
    Set NewNode=New ListNode
    که ListNode يک شي از ساختار داده اي مورد نظر ماست .

    کلاسهاي خود ارجاعي :

    کلاس خودارجاعي نوعي کلاس است که داراي يک اشاره گر ( Pointer ) به يک شي از همان نوع کلاس باشد . براي مثال اگر کلاس ما به اسم ClistNode باشد و متغير زير را در آن تعريف کنيم ، اين کلاس يک کلاس خود ارجاعي است :
    Private mNextNode as ClistNode
    از mNextNode براي لينک دادن اعضاي يک ساختار داده اي ديناميک بهم استفاده مي شود ( بعبارت ديگر گره زدن يک شي از کلاس ClistNode به يک شي ديگر از همان کلاس ) . شي هاي خودارجاعي مي توانند به همديگر لينک شوند و ساختارهاي داده اي مثل ليست پيوندي ، صف ، پشته و درخت را ايجاد کنند .

    نا له پنداشت که در سینه ی ما جا تنگ است

    رفت و برگشت سراسیمه که دنیا
    تنگ است

  8. کاربرانی که از پست مفید ریپورتر سپاس کرده اند.


  9. #5
    کـــــــاربر فــــعال
    رشته تحصیلی
    مکانیک سیالات
    نوشته ها
    11,179
    ارسال تشکر
    13,156
    دریافت تشکر: 21,945
    قدرت امتیاز دهی
    56319
    Array
    ریپورتر's: خوشحال2

    پیش فرض آموزش گام به گام ویژوال بیسیک6.0 (5)

    ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم ليست پيوندي

    همانطور که گفته شد ليست پيوندي مجموعه اي از يکسري داده است که اين داده ها از نوع اشيا خودارجاعي هستند . ( هر شي خودارجاعي داراي يک متغير نوع variant براي نگهدار مقدار و يک اشاره گر به شي بعدي است ) . هر عضو ليست پيوندي را يک گره گويند . هر ليست پيوندي از طريق يک اشاره گر به اولين گره قابل دسترسي است . گره هاي بعدي از طريق قسمت لينک موجود در هر گره قابل دسترس هستند . همچنين لينک آخرين گره با Nothing تنظيم مي شود که انتهاي ليست را نشان مي دهد .
    مزيت اصلي ليست هاي پيوندي نسبت به آرايه اينست که تعداد عناصر ليست پيوندي قابل تغيير است . بعبارت ديگر ليست هاي پيوندي بصورت ديناميک هستند و طول آنها قابل تغيير است اما سايز آرايه ثابت است . ( البته ويژوال بيسطک از آرايه هاي با سايز متغير نيز پشتيباني مي کند اما اين عمل تغيير سايز اتوماتيک نيست .)
    عمل درج در ليست پيوندي ساده است و تنها بايستي دو اشاره گر تغيير يابد .
    ليست هاي پيوندي را مي توان به سادگي با قراردادن هر عضو جديد در محل صحيح بصورت sortشده نگهداري کرد .
    اعضاي ليست پيوندي در حافظه بصورت پيوسته ذخيره نمي شوند بنابراين نمي توان فوراً به هر عضو ليست دسترسي داشت ( بر خلاف آرايه ) .
    براي ايجاد ليست پيوندي در ويژوال بيسيک نياز به سه کلاس است :

    1 – کلاس ClistNode : کلاسي است که هر گره از ليست را توصيف مي کند :

    private mNodeData as Variant
    private mNextNode as ClistNode
    public Property Get Data() as Variant
    Data=mNodeData
    End Property
    Public Property Let Dta(ByVal vNewValue as Variant)x
    MNodeData=vNewValue
    End Property
    Public Property Get NextNode() as ClistNode
    Set NextNode=mNextNode
    End Property
    Public Property Let NextNode(Byval vNewValue as Variant)x
    Set mNextNode=vNewValue
    End Property



    2 – کلاس Clist براي توصيف ليست پيوندي .
    mFirstNode براي اشاره به اولين ClistNode و mLastNode براي اشاره به آخرين ClistNode در يک شي clist بکار می رود . زمانيکه يک Clsit ايجاد مي شود اين دو متغير با Nothing تنظيم مي شوند . روال Property Get Iterator يک شي ClistIterator برمي گرداند که مي توان از آن براي حرکت در بين اعضاي ليست استفاده کرد .

    Private mFirstNode as ClistNode
    Private mLastNode as ClistNode
    Public Function IsEmpty() as boolean
    IsEmpty=IIf(mFirstNode Is Nothing,True,False)x
    End function
    Public Sub InsertAtFront(insertItem as variant)x
    Dim tempNode as ClistNode
    If IsEmpty() then
    Set mFirstNode=New ClistNode
    Set mLastNode=mFirstNode
    Else
    Set tempNode=mFirstNode
    Set mFirstNode=New ClistNode
    MFirstNode.NextNode=tempNode
    End if
    MFirstNode.Data=insertItem
    End sub
    Public sub InsertAtBack(insertItem as Variant)x
    Dim tempNode as ClistNode
    If IsEmpty() then
    Set mLastNode=New ClistNode
    Set mFirstNode=mLastNode
    Else
    Set tempNode=mLastNode
    Set mLastNode=New ClistNode
    TempNode.NextNode=mLastNode
    End if
    MLastNode.Data=insertItem
    End sub
    Public function RemoveFromFront()x
    Dim removeItem as Variant
    If IsEmpty() then
    Msgbox list is empty
    RemoveFromFront=Null
    Exit function
    End if
    RemoveItem=mFirstNode.Data
    If mFirstNode Is mLastNode then
    Set mFirstNode=Nothing
    Set mLastNode=Nothing
    Else
    Set mFirstNode=mFirstNode.NextNode
    End if
    RemoveFromFront=removeItem
    End function
    Public Function RemoveFromBack()x
    Dim removeItem as Variant
    Dim current as ClistNode
    If IsEmpty() then
    Msgboc list is empty
    RemovefromBack=Null
    Exit function
    End if
    RemoveItem=mLastNode.Data
    If mFirstNode Is mLastNode then
    Set mFirstNode=nothing
    Set mLastNode=Nothing
    Else
    Set current=mFirstNode
    While Not current.NextNode Is mLastNode
    Set current=current.NextNode
    Wend
    Set mLastNode=current
    Current.NextNode=nothing
    End if
    RemoveFromBack=removeItem
    End function
    Public property Get Iterator() as variant
    Dim iter as ClistIterator
    Set iter=New ClistIterator
    Iter.StartNode=mFirstNode
    Set Iterator=iter
    End property


    عملکرد روال InsertAtFront :
    a – فراخواني IsEmpty براي تعيين خالي بودن ليست
    b – اگر ليست خالي باشد mFirstNode و mLastNode به New ClsitNode اشاره مي کنند .
    c – اگر ليست خالي نباشد گره جديد توسط اشاره دادن tempNode به اولين گره ليست و سپس اشاره دادن mFirstNode به گره New ClsitNode و سپس اشاره دادن mFirstNode.NextNode به tempNode ساخته مي شود .
    d – تنظيم mFirstNode.Data با مقدار مورد نظر
    عملکرد روال InsertAtBack :
    a – فراخواني IsEmpty براي تعيين خالي بودن ليست
    b – اگر ليست خالي باشد mFirstNode و mLastNode به New ClsitNode اشاره مي کنند .
    c – اگر ليست خالي نباشد گره جديد توسط اشاره دادن tempNode به آخرين گره ليست و سپس اشاره دادن mLastNode به گره New ClsitNode و سپس اشاره دادن tempNode.NextNode به mLastNode ساخته مي شود .
    d – تنظيم mLastNode.Data با مقدار مورد نظر
    عملکرد روال RemoveFromFront :
    a – اگر ليست خالي باشد Null برگشت داده مي شود .
    b – اگر ليست خالي نباشد داده mFirstNode به removeItem اختصاص داده مي شود .
    c – اگر ليست فقط يک گره داشته باشد mFirstNode و mLastNode با Nothing مقدار دهي مي شوند و گره از ليست حذف مي شود .
    d – اگر گره بيش از يک عضو داشته باشد mFirstNode برابر mFirstNode.NextNode مي شود .
    e – مقدار removeItem برگشت داده مي شود .
    عملکرد روال RemoveFromBack :
    a – اگر ليست خالي باشد Null برگشت داده مي شود .
    b – اگر ليست خالي نباشد داده mLastNode به removeItem اختصاص داه مي شود .
    c – اگر ليست يک گره داشته باشد mFirstNode و mLastNode با Nothing مقدار دهي مي شوند و گره از ليست حذف مي شود .
    d – اگر ليست بيش از يک گره داشته باشد متغير current برابر mFirstNode مي شود . سپس با استفاده از current روي گره هاي ليست حرکت مي کنيم تا به گره اي برسيم که به آخرين گره اشاره مي کند . سپس mLastNode را به گره اي که current به آن اشاره مي کند قرار مي دهيم و مقدار current.NextNode را Nothing مي کنيم تا بعنوان آخرين گزه ليست معرفي شود .
    e – مقدار removeItem برگشت داده مي شود .

    3 – کلاس ClistIterator : اين کلاس براي حرکت روي گره هاي ليست و دستکاري هر گره بکار مي رود . از حرکت کننده ها براي چاپ ليست و يا انجام دادن عملي بر روي هر عضو Clist مي توان استفاده کرد . اين کلاس داراي دو متغير از نوع ClistNode به نامهاي mBookmark و mFirstNode است . متغير mFirstNode به اولين گره در Clist اشاره مي کند و متغير mBookmark موقعيت فعلي حرکت کننده بر روي Clist را نشان مي دهد . روال Property Let StartNode اين دو متغير را مقدار دهي اوليه مي کند . تابع NextItem اگر مقدار mBookmark برابر Null باشد ، Null برگشت مي دهد و در غيراينصورت مقدار tempData را برابر mBookmark.Data و مقدار mBookmark را برابر mBookmark.NextNode قرار مي دهد . تابع HasMoreItems اگر ليست داراي چندين عضو باشد True برمي گرداند . روال ResetBookmark حرکت کننده را به ابتداي ليست منتقل مي کند .

    Private mBookmark as ClistNode
    Private mFirstNode as ClistNode
    Public Property Let StartNode(Byval vNewValue as variant)x
    Set mFirstNode=vNewValue
    Set mBookmark=mFirstNode
    End property
    Public function NextItem()x
    Dim tempData as varaint
    If mBookmark Is nothing then
    NextItem=Null
    Else
    TempData=mBookmark.Data
    Set mBookmark=mBookmark.NextNode
    NextItem=tempData
    End if
    End function
    Public function HasMoreItems() as boolean
    HasMoreItems=IIf(Not mBookmark Is nothing,True,False)x
    End function
    Public sub ResetmBookmark()x
    MBookmark=mFirstNode
    End subايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم مثالی از استفاده از کلاسهای ليست پيوندی :
    ابتدا کلاسهايي که در جلسه قبل معرفی شد را به پروژه تان اضافه کنيد . سپس در بخش کدنويسی فرمتان ، ابتدا يک شی از نوع کلاس Clist بصورت زير تعريف کنيد :

    Dim list as New Clist


    در فرمتان سه CommandButton با نامهای AddFirst ، AddLast و ShowList و نيز يک TextBox با نام ListMember قرار دهيد .
    کد زير را برای رويداد کليک شدن دکمه AddFirst بنويسيد :

    Call list.InsertAtFront(ListMember.text)x


    کد زير را برای رويداد کليک شدن دکمه AddLast بنويسيد :

    Call list.InsertAtBack(ListMember.text)x


    کد زير را برای رويداد کليک شدن دکمه ShowList بنويسيد :

    Dim elements as New ClistIterator
    Set elements=list.Iterator
    If elements.HasMoreItems=false then msgbox ("list is empty")x
    Else
    While elements.HasMoreItems
    Msgbox(elements.NextItem)x
    Wend
    end if



    پشته :
    پشته نوعي ليست پيوندي است که گره هاي جديد ، فقط به انتهاي آن مي توانند اضافه شوند . بهمين دليل به پشته ، ساختمان داده LIFO مي گويند . قسمت لينک آخرين گره پشته با Nothing مقدار دهي مي شود که نشان دهنده پايين پشته است .
    روالهاي اصلي پشته Push و Pop هستند .
    Push يک گره جديد به بالاي پشته اضافه مي کند و Pop از بالاي پشته گره اي را حذف کرده و مقدار داده آن را بر مي گرداند
    ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم کلاس پشته :
    همانطور که در بخش قبل گفته شد پشته نوعی ليست پيوندی است که گره هاي جديد فقط به انتهاي آن اضافه شوند . روالهاي اصلي پشته Push و Pop هستند .
    Push يک گره جديد به بالاي پشته اضافه مي کند و Pop از بالاي پشته گره اي را حذف کرده و مقدار داده آن را بر مي گرداند .
    يک کلاس پشته را با استفاده از کلاس Clist و بصورت زير پياده سازي مي کنيم :

    Private list As New Clist
    Public Sub Push(value as Variant)x
    List.InsertAtFront(value)x
    End sub
    Public Function Pop As Variant
    Pop=list.RemoveFromFront()x
    End Function
    Public Function IsStackEmpty() As Boolean
    IsStackEmpty=list.IsEmpty()x
    End function
    Public Property Get Iterator() as variant
    Set Iterator=list.Iterator
    End Property


    در اين کلاس ابتدا يک شی از نوع کلاس Clist تعريف شده است . سپس متدهای Push توسط متد InsertAtFront و Pop توسط متد RemoveFromFront پياده سازی شده اند .
    يک برنامه نمونه :
    برای نوشتن يک برنامه برای کار با پشته ابتدا کلاس Stack را که کد آن را در بالا ديديد به پروژه تان اضافه کنيد . سپس در بخش کد مربوط به فرمتان ابتدا يک شی از نوع کلاس Stack بصورت زير تعريف کنيد :

    Dim mStack as New Stack


    سپس در فرمتان سه CommandButton با نامهای Push و Pop و ShowStack و نيز يک TextBox با نام StackMember قرار دهيد .
    کد زير را برای کليک شدن دکمه Push بنويسيد :

    mStack.push(StackMember.text)x


    کد زير را برای کليک شدن دکمه Pop بنويسيد :

    StackMember.text=mStack.Pop()x


    کد زير را برای کليک شدن دکمه ShowStack بنويسيد :

    Dim elements as New ClistIterator
    Set elements=mStack.Iterator
    If elements.HasMoreItems=false then msgbox "stack is empty"x
    Else
    While elemets.HasMoreItems
    Msgbox elements.NextItem
    Wend ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم صف :
    صف نوعي ساختار داده اي است که گره ها از ابتداي صف ( سر صف head ) حذف مي شوند و از انتهاي صف ( ته صف tail ) اضافه مي شوند . بنابر اين ، صف يک ساختار داده اي FIFO است . صف دارای دو متد به نامهای AddQueue و DelQueue است که اولین متد ، عنصری را به انتهای صف اضافه می کند و دومين متد ، عنصری را از ابتدای صف حذف می کند .
    براي ايجاد کلاس Cqueue از کلاس Clist استفاده مي کنيم :

    Private list as New Clist

    Public Sub AddQueue(value as Variant)x
    List.InsertAtBack(value)
    End sub

    Public Function DelQueue() as Variant
    DelQueue=list.RemoveFromFront
    End function

    Public property Get Iterator() as Variant
    Set Iterator=list.Iterator
    End Property


    درخت :
    ليستهاي پيوندي ، پشته ها و صف ها جزو ساختارهاي داده اي خطي هستند در حاليکه يک درخت ، يک ساختار داده اي دو بعدي با خصوصيات ويژه اي است . گره هاي درخت داراي دو يا چند لينک هستند . در اينجا در مورد درختهاي دودويي يا باينري بحث مي کنيم که در آن همه گره ها داراي دو لينک هستند . گره ريشه اولين گره در درخت است . هر لينک گره ريشه ، به يک فرزند اشاره مي کند . به فرزندان يک گره Siblings مي گويند . به گره بدون فرزند ، برگ يا Leaf گفته مي شود .
    درختهاي جستجوي باينري درخت هايي هستند که در آنها مقدار فرزند چپ هر گره کمتر از گره پدر و مقدار فرزند سمت راست هر گره بيشتر از گره پدر مي باشد
    ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم کلاس درختهای جستجوی باينری

    برای ايجاد درختهای جستجوی باينری در ويژوال بيسيک نياز به ايجاد دو کلاس داريم :
    1 - کلاس CTreeNode که هر ند درخت دودويي را توصيف می کند . اين کلاس دارای يک متغير به نام mNodeData از نوع Variant برای نگهداری داده هر گره است . همچنين دارای دو متغير اشاره گر به نامهای mLeft و mRight می باشد که به ترتيب به فرزند چپ و فرزند راست درخت اشاره می کنند .
    متد Get Data مقدار داده هر گره را بر می گرداند و متد Let Data مقدار داده هر گره را تنظيم می کند .
    متد Get Left آدرس فرزند چپ هر گره را برمی گرداند و متد Let Left فرزند چپ هر گره را تنظيم می کند .
    متد Get Right آدرس فرزند راست هر گره را برمی گرداند و متد Let Right فرزند راست هر گره را تنظيم می کند .
    متد Insert برای اضافه کردن فرزند به يک گره به کار می رود . اگر مقدار گره ای که می خواهيم بعنوان فرزند به درخت اضافه کنيم کوچکتر از مقدار خود گره باشد بعنوان فرزند چپ و در غير اينصورت بعنوان فرزند راست به گره اضافه می شود . اضافه شدن نيز بدين صورت است که ابتدا بررسی می شود آیا گره قبلاً فرزندی داشته است يا نه ؟ اگر نداشته باشد ( mLeft و يا mRight برابر Nothing باشد ) اين گره جديد مستقيماً به گره متصل می شود اما اگر گره قبلاً فرزندی داشته باشد متد Insert برای آن فرزند اضافه می شود و اينکار تا جايی ادامه می يابد که به گره ای برسيم که فرزندی نداشته باشد :

    Private mLeft as CtreeNode
    Private mRight as CtreeNode
    Private mNodeData as Variant

    Public Property Get Data() as variant
    Data=mNodeData
    End property
    Public Property Let Data(Byval vNewValue as Variant)x
    MNodeData=vNewValue
    End property
    Public Property Get Left() as variant
    Set Left=mLeft
    End property
    Public Property Let Left(Byval vNewValue as variant)x
    Set mLeft=vNewValue
    End property

    Public Property Get Right() as variant
    Set Right=mRight
    End Property
    Public Property Let Right(Byval vNewValue as variant)x
    Set mRight=vNewValue
    End Property

    Public Sub Insert(value as variant)x
    If valueIf mLeft Is Nothing Then
    Set mLeft=New CtreeNode
    MLeft.Data=value
    Else
    MLeft.Insert(value)x
    End if
    Elseif value>mNodeData then
    If mRight Is Nothing then
    Set mRight=New CtreeNode
    MRight.Data=value
    Else
    MRight.Insert(value)x
    End if
    End if
    End sub


    2 - کلاس CTree : اين کلاس برای ايجاد درخت بکار می رود . اين کلاس دارای متغيری بنام mRoot از نوع CTreeNode برای تعريف ريشه درخت است . همچنين يک متغير mOutputString برای نمايش دادن اعضای درخت دارد .

    Private mRoot as CtreeNode
    Private mOutputString as String

    Public Sub InsertNode(value as Varaint)x
    If mRoot Is Nothing then
    Set Mnode=New CtreeNode
    MRoot.Data=value
    Else
    MRoot.Insert(value)x
    End if
    End sub

    Public PreorderTraversal()x
    MOutputString=””x
    Call PreorderHelper(mRoot)x
    End sub

    Private Sub PreorderHelper(node As CtreeNode)x
    If node Is nothing Then
    Exit sub
    End if
    MOutputString=mOutputString & node.Data & “ “x
    Call PreorderHelper(node.left)x
    Call PreorderHelper(node.right)x
    End sub

    Public Sub InorderTraversal()x
    MOutputString=””x
    Call InorderHelper(mRoot)x
    End sub

    Private Sub InorderHelper(node as CtreeNode)x
    If node Is nothing then
    Exit sub
    End if
    Call InorderHelper(node.Left)x
    MOutputString=mOutputString & node.Data & “ “x
    Call InorderHelper(node.Right)x
    End sub

    Public PostorderTraversal()x
    MOutputString=””x
    Call PostorderHelper(mRoot)x
    End sub

    Private Sub PostorderHelper(node as CtreeNode)x
    If node Is Nothing then
    Exit sub
    End if
    Call PostorderHelper(node.Left)x
    Call PostorderHelper(node.Right)x
    MOutputString=mOutputString & node.Data & “ “x
    End sub

    Public Property Get Output() as Varaint
    Output=mOutputString
    End Propertyايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی انواع روشهای پيمايش عناصر درخت :
    ۱ - روش InOrder : در اين روش ابتدا عناصر نيمه سمت چپ درخت ، سپس ريشه و در آخر عناصر نيمه سمت راست درخت نمايش داده می شوند .
    ۲ - روش PreOrder : در اين روش ابتدا ريشه درخت ، سپس عناصر نيمه سمت چپ و در پايان عناصر نيمه سمت راست درخت نمايش داده می شوند .
    ۳ - روش PostOrder : در اين روش ابتدا عناصر نيمه سمت چپ درخت ، سپس عناصر نيمه سمت راست درخت و در پايان ريشه درخت نمايش داده می شوند .
    بررسی متدهای کلاس CTree :
    متد InsertNode : اگر گره ريشه برابر Null باشد value را برابر مقدار گره ريشه قرار می دهد . در غير اينصورت متد Insert مربوط به گره ريشه فراخوانی می شود .
    متد PreorderTraversal : رشته چاپ عناصر ريشه را خالی می کند و سپس متد پيمايش Preorder را فراخوانی می کند .
    متد InorderTraversal : رشته چاپ عناصر ريشه را خالی می کند و سپس متد پيمايش Inorder را فراخوانی می کند .
    متد PostorderTraversal : رشته چاپ عناصر ريشه را خالی می کند و سپس متد پيمايش Postorder را فراخوانی می کند .
    متد Get Output : عناصر پيمايش شده درخت را برمی گرداند .
    يک برنامه نمونه :
    ابتدا کلاسهای CTreeNode و CTree را به پروژه تان اضافه کنيد . سپس متغير زير را در قسمت کدنويسی فرمتان تعريف کنيد :

    Dim mTree as New Ctree


    سپس در فرمتان يک Textbox با نام Value و دو Command Button با نامهای Insert و Show قرار دهيد .
    کد زير را برای وارد کردن عنصر به درخت برای دکمه Insert بنويسيد :

    mTree.InsertNode(Value.Text)x


    کد زير را برای پيمايش InOrder درخت برای دکمه Show بنويسيد :

    Call mTree.InorderTraversal


    شي Collection :
    ويژوال بيسيک داراي شي پيش ساخته اي به نام Collection است که مي تواند مجموعه اي از مقادير با هر نوع داده اي را در خود ذخيره کند . در واقع عناصر موجود در يک Collection مي توانند داراي نوعهاي داده اي متفاوت باشند . شي Collection قابليت رشد ديناميک دارد .
    شي Collection توسط کلمه کليدي New ايجاد مي شوند . توسط متد Add مي توان به Cllection عضو اضافه کرد و توسط متد Remove مي توان عضوي را از آن حذف کرد . هر عضو از Collection توسط متد Item قابل دستيابي است . با استفاده از خاصيت Count مي توان تعداد اعضاي موجود در Collection را تعيين نمود . بصورت پيش فرض اعضاي جديد به انتهاي Collection اضافه مي شوند ولي توسط آرگومانهاي اختياري متد Add مي توان محل اضافه شدن را تغيير داد .
    متد Remove يک شماره مي گيرد که موقعيت عضوي را که مي خواهيم آنرا حذف کنيم مشخص مي کند .
    توسط دستورات زير مي توان اعضاي يک Collection را نمايش داد :

    Dim mCollection as New Collection
    Dim element as Variant
    .
    .
    .
    For Each element In mCollection
    Msgbox element


    element متغيري از نوع variant براي اشاره به هر عضو Collection مي باشد .

    کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم مقدمه

    بعلت عدم وجود اشاره گر در ويژوال بيسيک عمليات کار با فايلها در آن نسبتاً ساده می باشد .
    بطور کلی فايلها بر دو نوع هستند :
    1 - فايلهای متنی Text File : اين فايلها فقط شامل کاراکترهای اسکی و برخی کاراکترهای خاص مانند انتهای خط و انتهای فايل هستند .
    ۲ - فايلهای باينری Binary File : شامل هر نوع کاراکتری می توانند باشند و کاربردهای گسترده ای دارند مانند بانک های اطلاعاتی ، فايلهای اجرائی ، فايلهای گرافيکی و غيره
    ويژوال بيسيک می تواند با هر دو نوع فايل کار کند .

    چگونگی باز کردن فايلها

    قبل از اينکه بتوان عمليات ورودی/خروجی را روی يک فايل انجام داد ابتدا بايستی آنرا باز کرد . باز کردن فايلها در ويژوال بيسيک توسط دستور Open انجام می شود . فرمت کلی اين دستور بصورت زير است :

    Open filename [For mode] [Access access][lock] As [#]filenumber [Len=reclen]x


    [ پارامترهای داخل کروشه اختياری هستند . ]
    filename نام فايلی است که می خواهيم آنرا باز کنيم .
    mode حالت باز کردن فايل است . اين حالتها عبارتند از :
    - Input : فايل بعنوان ورودی باز می شود .
    - Output : فايل بعنوان خروجی باز می شود .
    - Binary : فايل از نوع باينری باز می شود .
    - Append : فايل طوری باز می شود که بتوان به انتهای آن چيزی اضافه کرد .
    - Random
    access نوع دسترسی به فايل را مشخص می کند . انواع دسترسيها عبارتند از :
    - Read : خواندن فايل
    - Write : نوشتن در فايل
    - ReadWrite : خواندن و نوشتن فايل
    lock نوع دسترسی ساير برنامه ها به اين فايل را مشخص می کند . انواع دسترسيها عبارتند از :
    - Shared : دسترسی اشتراکی
    - Lock Read
    - Lock Write
    - Lock Read Write
    filenumber عددی است که ويژوال بيسيک از آن برای دسترسی به فايل استفاده می کند .اين عدد بايستی برای هر فايل منحصر بفرد و بين ۱ تا ۵۱۱ باشد . برای بدست آوردن اولين شماره آزاد می توان از تابع FreeFile استفاده کرد .
    reclen :طول بافر فايل است . اين عدد بايستی از ۳۲۷۶۷ کو چکتر باشد .

    در صورتی که فايلی که توسط filename مشخص شده وجود نداشته و فايل برای Append ، Binary ، Output و يا Random باز شده باشد در اينصورت يک فايل جديد با اين نام ساخته می شود .
    در صورتی که فايل بصورت باينری باز شده باشد پارامتر Len ناديده گرفته می شود .

    چگونگی بستن فايل

    پس از پايان کار با فايل برای بستن آن از دستور Close استفاده می کنيم . فرمت اين دستور بصورت زير است :

    Close #filenumber


    دستور Close بدون هيچ پارامتری تمام فايلهای باز را می بندد .

    کار با دايرکتوری

    ۱ - گرفتن Dir : توسط دستور Dir می توان نام فايلهای موجود در يک دايرکتوری را بر اساس پارامترهايي که به آن می دهيم پيدا کنيم . برای مثال :

    Myfile=Dir$("c:\text\*.txt)"x


    دستور فوق نام اولين فايل موجود در دايرکتوری C:\TEXT را که پسوند آنها txt باشد در متغير Myfile قرار می دهد . اگر دستور فوق را بدون پارامتر مجدداً اجرا کنيم نام دومين فايل برگرداننده می شد و الی آخر
    Dir دارای يک پارامتر اختياری است که نوع فايلهای مورد نظر را نيز می توان با آن مشخص نمود . مثال :

    Myfile=Dir$("c:\text\*.txt",vbNormal)x


    مقادير ممکن اين پارامتر عبارتند از :
    vbNormal ، vbHidden ، vbSystem ، vbDirectory
    ۲ - تغيير دايرکتوری : برای تغيير دايرکتوری از دستور ChDir استفاده می شود مثال :

    ChDir "c:\windows\system32"x


    ۳ - تغيير درايو : برای تغيير درايو از دستور ChDrive استفاده می شود مثال :

    ChDrive "E:"x


    ۴ - ساخت دايرکتوری : برای ايجاد دايرکتوری جديد از دستور MKDir استفاده می شود مثال :

    MKDir "c:\MyFolder"x


    ۵ - حذف دايرکتوری : برای حذف دايرکتوری از دستور RmDir استفاده می شود مثال :

    RmDir "C:\MyFoler"x

    --------

    خواندن از فايل :

    1 - دستور Input : توسط دستورهای Input و Line Input می توان محتوای فايلهای متنی و باينری را خواند .
    دستور Input به دو صورت بکار می رود :
    Input #Filenumber,ReadData
    ReadData=Input(Charnum,Filenumber)x
    دستور اول کل يک فايل را خوانده و در متغير ReadData قرار می دهد . دستور دوم ، تعداد Charnum بايت از فايلی با شماره Filenumber را خوانده و در متغير ReadData قرار می دهد .
    اين دو دستور تمام کاراکترهای موجود در فايل را می خوانند . برای اينکه بتوان فايل را خط به خط خواند ، از دستور Line Input استفاده کنيد :
    Line Input #Filenumber,ReadData
    البته از دستور Line Input بيشتر برای خواندن فايلهای متنی استفاده می شود زيرا ممکنست در فايل باينری هيچ کاراکتر انتهای خط ( CRLF ) وجود نداشته باشد و يکباره کل فايل خوانده شود .

    ۲ - دستور Get : از اين دستور برای خواندن فايلهای باينری با دسترسی تصادفی ( Random Access ) استفاده میشود :
    Get #Filenumber,[Recordnum%],ReadData
    اين دستور رکورد شماره Recordnum را از فايلی با شماره Filenumber می خواند و در متغير ReadData قرار می دهد . علامت کروشه نشان می دهد که پارامتر Recordnum اختياری است و در صورتيکه ذکر نشود داده ها از رکورد بعدی فايل ( جائيکه اشاره گر فايل آنجا قرار دارد ) خوانده می شوند .

    نوشتن در فايل :

    ۱ - دستور Print : توسط اين دستور می توان اطلاعاتی را در فايل قرار داد :
    Print #FileNumber,WriteData
    دستور فوق محتويات متغير WriteData را در فايلی با شماره FileNumber می نويسد . بوسيله دستور Print می توان اطلاعات را بصورت خط به خط در فايل نوشت برای مثال :
    Print #1,"Hello Visual Basic"+Vbcrlf
    عبارت Vbcrlf نشان دهنده کاراکتر انتهای خط ( CRLF ) در ويژوال بيسيک می باشد .

    ۲ - دستور Put : اين دستور برای نوشتن داده ها در فايلهای باينری با دسترسی تصادفی بکار می رود :
    Put #FileNumber,[Recordnum],WriteData
    اين دستور محتويات متغير WriteData را در رکورد شماره Recordnum قرار می دهد .

    تعيين محل رکورد در فايلهای با دسترسی تصادفی :

    برای منتقل کردن اشاره گر فايل به يک رکورد در يک فايل باينری با دسترسی اتفاقی ، از دستور Seek استفاده می شود . اين دستور محل يک بايت را در فايل می گيرد و اشاره گر فايل را در آنجا قرار می دهد بنابراين دستورات Put و Get می توانند با اين رکورد کار کنند :
    Seek #FileNumber,RecordNumber

    تشخيص انتهای فايل :

    برای اينکه متوجه شويم به انتهای يک فايل رسيده ايم از دستور EOF استفاده می کنيم . اين دستور يکی از مقادير True يا False را بر می گرداند که نشان می دهد به انتهای فايلرسيده ايم يا نه . از اين تابع در حلقه های Do-While استفاده می شود :
    Do While Not (EOF(FileNumer))x
    .
    .
    .
    Loop
    حلقه فوق تا زمانيکه فايل موردنظر به انتها نرسيده باشد اجرا خواهد شد .

    بدست آوردن طول يک فايل :

    بوسيله دستور LOF می توان طول محتويات يک فايل را بدست آورد :
    FileSize=LOF(FileNumber)x

    بدست آوردن محل اشاره گر فايل :

    توسط دستور Loc می توان محل جاری اشاره گر فايل را بدست آورد . اجرا شدن اين دستور محل اشاره گر را تغيير نمی دهد :
    FilePosition=Loc(FileNumber)x
    --------

    ساير عمليات کار با فايل :

    ۱ - حذف فايل : برای حذف يک يا چند فايل از دستور Kill استفاده می شود :
    Kill "C:\Temp\MyFile.txt"x
    Kill "C:\Temp\*.txt"x

    ۲ - انتقال فايل : برای انتقال يک فايل از يک دايرکتوری به دايرکتوری ديگر از دستور Name استفاده می شود . مبدا و مقصد بايستی روی يک درايو باشند . اگر دايرکتوری مبدا و مقصد يکی باشد فايل تغيير نام داده می شود :
    Name "C:\Temp\File1.txt" To "C:\Temp2\File2.txt"x

    ۳ - کپی کردن فايل : برای کپی کردن يک فايل از يک دايرکتوری به دايرکتوری ديگر از دستور FileCopy استفاده می شود :
    FileCopy "\File1.txt\ To "C:\Temp\File2.txt"x

    ۴ - بدست آوردن تاريخ و زمان آخرين تغيير فايل و يا زمان ايجاد فايل : برای اين کار از دستور FileDateTime استفاده می شود . ابتدا بايستی يک متغير از نوع Variant تعريف کرده و سپس توسط اين دستور تاريخ و زمان موردنظر را استخراج کنيم :
    Dim FileInfo As Variant
    FileInfo=FileDateTime("C:\Temp\MyFile.txt")x

    ۵ - استخراج طول فايل : برای بدست آوردن طول يک فايل بر حسب بايت از دستور FileLen استفاده می شود :
    FileSize=FileLen("C:\MyFile.txt")x

    ۶ - تغيير صفت يک فايل : برای تغيير صفت يک فايل از دستور SetAttr استفاده می شود . پارامترهای اين دستور عبارتند از :
    0 : فايل معمولی
    2 : فايل مخفی
    4 : فايل سيستمی

    SetAttr FileNumber,FileAttrib

    مقابله با خطاهای کار با فايل :

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

    ۵۲ : شماره يا نام فايل صحيح نيست
    ۵۳ : فايل پيدا نشد
    ۵۴ : حالت فايل صحيح نيست
    ۵۵ : فايل قبلاً باز شده
    ۵۸ : فايل از قبل وجود دارد
    ۵۹ : طول رکورد صحيح نيست
    ۶۱ : ديسک پر است
    ۶۲ : عبور از انتهای فايل
    ۶۳ : شماره رکورد صحيح نيست
    ۷۰ : دسترسی ممنوع است
    ۷۱ : ديسک آماده نيست
    ۷۶ : مسير پيدا نشد

    در هنگام مقابله با خطا بهتراست از يک ساختار Select-Case استفاده کنيد :
    Select Case Err
    Case 71
    MsgBox "Drive is Not Ready"x
    .
    .
    .
    End Select
    ايجاد کلاسی برای کار با فايلهای Xml مقدمه :
    همانطور که در قسمت سوم مباحث برنامه نويسی اکتيوايکس های سرور سايد گفته شد برای قرار دادن پارامترهای اتصال به بانک اطلاعاتی از فايل XML استفاده خواهيم نمود . بنابراين ابتدا بايستی کلاسی برای کار با فايلهای XML بنويسيم . توجه داشته باشيد که کلاسی که در اين بخش معرفی می شود کلاسی ساده می باشد که فقط با آن می توان مقدار يک ند Node وجود در فايل xml را خواند . در صورت نياز ، می توانيد خودتان متدهای ديگری را به آن اضافه کنيد . برای اين منظور نکاتی را در انتهای همين بخش آورده ام .
    XML يک زبان نشانه ای توسعه پذير ( eXtensible Markup Language ) است که در سال 1998 توسط کنسرسيوم وب جهانی W3C ايجاد شد . XML واقعاً يک زبان نيست بلکه يک متا-زبان است و برای توصيف ساير زبانها بکار می رود . داده ها در فايلهای XML براحتی قابل تعريف و استفاده هستند .
    مثالی از يک فايل XML :


    <user>
    <name>ali</name>
    <id>12</id>
    </user>



    کار با فايلهای XML در وی بی :
    برای کار با فايلهای xml در ويژوال بيسيک بايستی ابتدا از بخش References مورد Microsoft XML 3.0 را انتخاب کنيد . سپس يک Class Modules به پروژه تان اضافه کنيد و نام آنرا XMLReader بگذاريد . در اين کلاس ابتدا يک متغير از نوع شی xml برای کار با فايلهای xml تعريف می کنيم :

    Private xml


    سپس متدی برای مقداردهی اوليه شی xml می نويسيم . اين متد دارای يک متغير ورودی است که نام فايل xml مورد نظر می باشد :

    Public Sub Initiate(ByVal filename As String)x
    Set xml = CreateObject("Microsoft.XMLDOM")x
    xml.async = False
    xml.Load (server.MapPath(filename))x
    End Sub


    توجه کنيد که در کد فوق از شی server برای يافتن مسير فيزيکی فايل XML استفاده شده است بنابراين ابتدا بايستی در Class_Initialize اين شی را مطابق مطالب درس دوم مقداردهی کنيد .

    حال بايستی متدی برای خواندن مقدار يک ند از فايل xml بنويسيم . در اين متد توسط يک حلقه for each ندهای فايل را بررسی می کنيم تا ندی را بيابيم که نامش مشابه با متغير ورودی متد است . سپس با استفاده از خاصيت nodeValue می توانيم مقدار آنرا بخوانيم .

    Public Function getvalue(ByVal NName As String) As String
    Dim x
    getvalue = ""x
    For Each x In xml.documentElement.childNodes
    If x.nodeName = NName Then
    getvalue = x.childNodes(0).nodeValue
    Exit For
    End If
    Next
    End Function


    مثالی از کار با کلاس XMLReader :
    همانطور که گفته شد می توانيم پارامترهای اتصال به بانک اطلاعاتی را در فايل XML قرار دهيم و در زمان Initiate کردن ADODB برای اتصال به بانک اطلاعاتی ، آنها را بخوانيم :

    Dim xmlf As New XMLReader
    Call xmlf.Initiate("config.xml")x
    userName = xmlf.getvalue("DataBaseID")x
    Password = xmlf.getvalue("DataBasePassword")x
    database_name = xmlf.getvalue("DataBaseName")x
    server_name = xmlf.getvalue("ServerAddress")x


    ساختار يک فايل نمونه config.xml بصورت زير می باشد :


    <Application>testIt</Application>
    <ServerAddress>192.168.0.1</ServerAddress>
    <DataBaseName>Edatabase</DataBaseName>
    <DataBaseID>Euser</DataBaseID>
    <DataBasePassword>Epass</DataBasePassword>



    ساير نکات برای توسعه کلاس فوق :
    نکات زير شما را در نوشتن کلاسی کاملتر راهنمايي می کنند :

    1 - توجه داشته باشيد که xml.documentElement بعنوان ريشه فايل xml محسوب می شود . بنابراين برای دسترسی به ريشه می توان يک شی ريشه نيز تعريف کرد :

    Dim root
    Set root = xml.documentElement


    2 - در صورتيکه يک فايل xml دارای چندين ند در ريشه اش باشد و هر ند ريشه نيز دارای چندين ند درونی باشد توسط خاصيت root.childNodes.length و با استفاده از يک حلقه for می توان به اين ندها دسترسی داشت . برای مثال فايل زير را درنظر بگيريد :


    <people>
    <user>
    <name>ali</name>
    <id>1</id>
    </user>
    <user>
    <name>reza</name>
    <id>2</id>
    </user>
    </people>



    حلقه زير روش دسترسی را به اين فايل نشنان می دهد :

    For I = 0 TO (root.childNodes.length - 1)x
    Set thisChild = root.childNodes(I)x
    name = thisChild.childNodes(0).Text
    id = thisChild.childNodes(1).Text
    Next


    3 – اضافه کردن ند به فايل : برای اضافه کردن ند از متدهای createNode و appendChild استفاده می شود برای مثال برای اضافه کردن يک user جديد به مثال فوق :

    Set newuser = xml.createNode("element", "people", "")x
    Dim name,id
    Set newname = xml.createNode("element", "name", "")x
    newname.text = yourname
    Set newid = xml.createNode("element", "id", "")x
    newid.text = yourid
    newuser.appendChild(newname)x
    newuser.appendChild(newid)x
    root.appendChild(newuser)x


    در انتها نيز بايستی فايل را ذخيره نمود :

    xml.save(Server.Mappath(filename))x


    4 – حذف يک ند از فايل : برای حذف يک ند از فايل توسط يک حلقه for بايستی ند مورد نظر را يافته و سپس توسط متد removeChild آنرا حذف کنيم :

    found = False
    For I = (root.childNodes.length - 1) TO 0 STEP -1
    Set thisChild = root.childNodes(I)x
    name = thisChild.childNodes(0).Text
    If name = searchname Then
    root.removeChild(thisChild)x
    found = True
    End If
    Next


    در انتها نيز فايل xml را ذخيره کنيد

    نا له پنداشت که در سینه ی ما جا تنگ است

    رفت و برگشت سراسیمه که دنیا
    تنگ است

  10. کاربرانی که از پست مفید ریپورتر سپاس کرده اند.


  11. #6
    کـــــــاربر فــــعال
    رشته تحصیلی
    مکانیک سیالات
    نوشته ها
    11,179
    ارسال تشکر
    13,156
    دریافت تشکر: 21,945
    قدرت امتیاز دهی
    56319
    Array
    ریپورتر's: خوشحال2

    پیش فرض آموزش گام به گام ویژوال بیسیک6.0 (5)

    ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم ليست پيوندي

    همانطور که گفته شد ليست پيوندي مجموعه اي از يکسري داده است که اين داده ها از نوع اشيا خودارجاعي هستند . ( هر شي خودارجاعي داراي يک متغير نوع variant براي نگهدار مقدار و يک اشاره گر به شي بعدي است ) . هر عضو ليست پيوندي را يک گره گويند . هر ليست پيوندي از طريق يک اشاره گر به اولين گره قابل دسترسي است . گره هاي بعدي از طريق قسمت لينک موجود در هر گره قابل دسترس هستند . همچنين لينک آخرين گره با Nothing تنظيم مي شود که انتهاي ليست را نشان مي دهد .
    مزيت اصلي ليست هاي پيوندي نسبت به آرايه اينست که تعداد عناصر ليست پيوندي قابل تغيير است . بعبارت ديگر ليست هاي پيوندي بصورت ديناميک هستند و طول آنها قابل تغيير است اما سايز آرايه ثابت است . ( البته ويژوال بيسطک از آرايه هاي با سايز متغير نيز پشتيباني مي کند اما اين عمل تغيير سايز اتوماتيک نيست .)
    عمل درج در ليست پيوندي ساده است و تنها بايستي دو اشاره گر تغيير يابد .
    ليست هاي پيوندي را مي توان به سادگي با قراردادن هر عضو جديد در محل صحيح بصورت sortشده نگهداري کرد .
    اعضاي ليست پيوندي در حافظه بصورت پيوسته ذخيره نمي شوند بنابراين نمي توان فوراً به هر عضو ليست دسترسي داشت ( بر خلاف آرايه ) .
    براي ايجاد ليست پيوندي در ويژوال بيسيک نياز به سه کلاس است :

    1 – کلاس ClistNode : کلاسي است که هر گره از ليست را توصيف مي کند :

    private mNodeData as Variant
    private mNextNode as ClistNode
    public Property Get Data() as Variant
    Data=mNodeData
    End Property
    Public Property Let Dta(ByVal vNewValue as Variant)x
    MNodeData=vNewValue
    End Property
    Public Property Get NextNode() as ClistNode
    Set NextNode=mNextNode
    End Property
    Public Property Let NextNode(Byval vNewValue as Variant)x
    Set mNextNode=vNewValue
    End Property



    2 – کلاس Clist براي توصيف ليست پيوندي .
    mFirstNode براي اشاره به اولين ClistNode و mLastNode براي اشاره به آخرين ClistNode در يک شي clist بکار می رود . زمانيکه يک Clsit ايجاد مي شود اين دو متغير با Nothing تنظيم مي شوند . روال Property Get Iterator يک شي ClistIterator برمي گرداند که مي توان از آن براي حرکت در بين اعضاي ليست استفاده کرد .

    Private mFirstNode as ClistNode
    Private mLastNode as ClistNode
    Public Function IsEmpty() as boolean
    IsEmpty=IIf(mFirstNode Is Nothing,True,False)x
    End function
    Public Sub InsertAtFront(insertItem as variant)x
    Dim tempNode as ClistNode
    If IsEmpty() then
    Set mFirstNode=New ClistNode
    Set mLastNode=mFirstNode
    Else
    Set tempNode=mFirstNode
    Set mFirstNode=New ClistNode
    MFirstNode.NextNode=tempNode
    End if
    MFirstNode.Data=insertItem
    End sub
    Public sub InsertAtBack(insertItem as Variant)x
    Dim tempNode as ClistNode
    If IsEmpty() then
    Set mLastNode=New ClistNode
    Set mFirstNode=mLastNode
    Else
    Set tempNode=mLastNode
    Set mLastNode=New ClistNode
    TempNode.NextNode=mLastNode
    End if
    MLastNode.Data=insertItem
    End sub
    Public function RemoveFromFront()x
    Dim removeItem as Variant
    If IsEmpty() then
    Msgbox list is empty
    RemoveFromFront=Null
    Exit function
    End if
    RemoveItem=mFirstNode.Data
    If mFirstNode Is mLastNode then
    Set mFirstNode=Nothing
    Set mLastNode=Nothing
    Else
    Set mFirstNode=mFirstNode.NextNode
    End if
    RemoveFromFront=removeItem
    End function
    Public Function RemoveFromBack()x
    Dim removeItem as Variant
    Dim current as ClistNode
    If IsEmpty() then
    Msgboc list is empty
    RemovefromBack=Null
    Exit function
    End if
    RemoveItem=mLastNode.Data
    If mFirstNode Is mLastNode then
    Set mFirstNode=nothing
    Set mLastNode=Nothing
    Else
    Set current=mFirstNode
    While Not current.NextNode Is mLastNode
    Set current=current.NextNode
    Wend
    Set mLastNode=current
    Current.NextNode=nothing
    End if
    RemoveFromBack=removeItem
    End function
    Public property Get Iterator() as variant
    Dim iter as ClistIterator
    Set iter=New ClistIterator
    Iter.StartNode=mFirstNode
    Set Iterator=iter
    End property


    عملکرد روال InsertAtFront :
    a – فراخواني IsEmpty براي تعيين خالي بودن ليست
    b – اگر ليست خالي باشد mFirstNode و mLastNode به New ClsitNode اشاره مي کنند .
    c – اگر ليست خالي نباشد گره جديد توسط اشاره دادن tempNode به اولين گره ليست و سپس اشاره دادن mFirstNode به گره New ClsitNode و سپس اشاره دادن mFirstNode.NextNode به tempNode ساخته مي شود .
    d – تنظيم mFirstNode.Data با مقدار مورد نظر
    عملکرد روال InsertAtBack :
    a – فراخواني IsEmpty براي تعيين خالي بودن ليست
    b – اگر ليست خالي باشد mFirstNode و mLastNode به New ClsitNode اشاره مي کنند .
    c – اگر ليست خالي نباشد گره جديد توسط اشاره دادن tempNode به آخرين گره ليست و سپس اشاره دادن mLastNode به گره New ClsitNode و سپس اشاره دادن tempNode.NextNode به mLastNode ساخته مي شود .
    d – تنظيم mLastNode.Data با مقدار مورد نظر
    عملکرد روال RemoveFromFront :
    a – اگر ليست خالي باشد Null برگشت داده مي شود .
    b – اگر ليست خالي نباشد داده mFirstNode به removeItem اختصاص داده مي شود .
    c – اگر ليست فقط يک گره داشته باشد mFirstNode و mLastNode با Nothing مقدار دهي مي شوند و گره از ليست حذف مي شود .
    d – اگر گره بيش از يک عضو داشته باشد mFirstNode برابر mFirstNode.NextNode مي شود .
    e – مقدار removeItem برگشت داده مي شود .
    عملکرد روال RemoveFromBack :
    a – اگر ليست خالي باشد Null برگشت داده مي شود .
    b – اگر ليست خالي نباشد داده mLastNode به removeItem اختصاص داه مي شود .
    c – اگر ليست يک گره داشته باشد mFirstNode و mLastNode با Nothing مقدار دهي مي شوند و گره از ليست حذف مي شود .
    d – اگر ليست بيش از يک گره داشته باشد متغير current برابر mFirstNode مي شود . سپس با استفاده از current روي گره هاي ليست حرکت مي کنيم تا به گره اي برسيم که به آخرين گره اشاره مي کند . سپس mLastNode را به گره اي که current به آن اشاره مي کند قرار مي دهيم و مقدار current.NextNode را Nothing مي کنيم تا بعنوان آخرين گزه ليست معرفي شود .
    e – مقدار removeItem برگشت داده مي شود .

    3 – کلاس ClistIterator : اين کلاس براي حرکت روي گره هاي ليست و دستکاري هر گره بکار مي رود . از حرکت کننده ها براي چاپ ليست و يا انجام دادن عملي بر روي هر عضو Clist مي توان استفاده کرد . اين کلاس داراي دو متغير از نوع ClistNode به نامهاي mBookmark و mFirstNode است . متغير mFirstNode به اولين گره در Clist اشاره مي کند و متغير mBookmark موقعيت فعلي حرکت کننده بر روي Clist را نشان مي دهد . روال Property Let StartNode اين دو متغير را مقدار دهي اوليه مي کند . تابع NextItem اگر مقدار mBookmark برابر Null باشد ، Null برگشت مي دهد و در غيراينصورت مقدار tempData را برابر mBookmark.Data و مقدار mBookmark را برابر mBookmark.NextNode قرار مي دهد . تابع HasMoreItems اگر ليست داراي چندين عضو باشد True برمي گرداند . روال ResetBookmark حرکت کننده را به ابتداي ليست منتقل مي کند .

    Private mBookmark as ClistNode
    Private mFirstNode as ClistNode
    Public Property Let StartNode(Byval vNewValue as variant)x
    Set mFirstNode=vNewValue
    Set mBookmark=mFirstNode
    End property
    Public function NextItem()x
    Dim tempData as varaint
    If mBookmark Is nothing then
    NextItem=Null
    Else
    TempData=mBookmark.Data
    Set mBookmark=mBookmark.NextNode
    NextItem=tempData
    End if
    End function
    Public function HasMoreItems() as boolean
    HasMoreItems=IIf(Not mBookmark Is nothing,True,False)x
    End function
    Public sub ResetmBookmark()x
    MBookmark=mFirstNode
    End sub

    ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم مثالی از استفاده از کلاسهای ليست پيوندی :
    ابتدا کلاسهايي که در جلسه قبل معرفی شد را به پروژه تان اضافه کنيد . سپس در بخش کدنويسی فرمتان ، ابتدا يک شی از نوع کلاس Clist بصورت زير تعريف کنيد :

    Dim list as New Clist


    در فرمتان سه CommandButton با نامهای AddFirst ، AddLast و ShowList و نيز يک TextBox با نام ListMember قرار دهيد .
    کد زير را برای رويداد کليک شدن دکمه AddFirst بنويسيد :

    Call list.InsertAtFront(ListMember.text)x


    کد زير را برای رويداد کليک شدن دکمه AddLast بنويسيد :

    Call list.InsertAtBack(ListMember.text)x


    کد زير را برای رويداد کليک شدن دکمه ShowList بنويسيد :

    Dim elements as New ClistIterator
    Set elements=list.Iterator
    If elements.HasMoreItems=false then msgbox ("list is empty")x
    Else
    While elements.HasMoreItems
    Msgbox(elements.NextItem)x
    Wend
    end if



    پشته :
    پشته نوعي ليست پيوندي است که گره هاي جديد ، فقط به انتهاي آن مي توانند اضافه شوند . بهمين دليل به پشته ، ساختمان داده LIFO مي گويند . قسمت لينک آخرين گره پشته با Nothing مقدار دهي مي شود که نشان دهنده پايين پشته است .
    روالهاي اصلي پشته Push و Pop هستند .
    Push يک گره جديد به بالاي پشته اضافه مي کند و Pop از بالاي پشته گره اي را حذف کرده و مقدار داده آن را بر مي گرداند .
    ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم کلاس پشته :
    همانطور که در بخش قبل گفته شد پشته نوعی ليست پيوندی است که گره هاي جديد فقط به انتهاي آن اضافه شوند . روالهاي اصلي پشته Push و Pop هستند .
    Push يک گره جديد به بالاي پشته اضافه مي کند و Pop از بالاي پشته گره اي را حذف کرده و مقدار داده آن را بر مي گرداند .
    يک کلاس پشته را با استفاده از کلاس Clist و بصورت زير پياده سازي مي کنيم :

    Private list As New Clist
    Public Sub Push(value as Variant)x
    List.InsertAtFront(value)x
    End sub
    Public Function Pop As Variant
    Pop=list.RemoveFromFront()x
    End Function
    Public Function IsStackEmpty() As Boolean
    IsStackEmpty=list.IsEmpty()x
    End function
    Public Property Get Iterator() as variant
    Set Iterator=list.Iterator
    End Property


    در اين کلاس ابتدا يک شی از نوع کلاس Clist تعريف شده است . سپس متدهای Push توسط متد InsertAtFront و Pop توسط متد RemoveFromFront پياده سازی شده اند .
    يک برنامه نمونه :
    برای نوشتن يک برنامه برای کار با پشته ابتدا کلاس Stack را که کد آن را در بالا ديديد به پروژه تان اضافه کنيد . سپس در بخش کد مربوط به فرمتان ابتدا يک شی از نوع کلاس Stack بصورت زير تعريف کنيد :

    Dim mStack as New Stack


    سپس در فرمتان سه CommandButton با نامهای Push و Pop و ShowStack و نيز يک TextBox با نام StackMember قرار دهيد .
    کد زير را برای کليک شدن دکمه Push بنويسيد :

    mStack.push(StackMember.text)x


    کد زير را برای کليک شدن دکمه Pop بنويسيد :

    StackMember.text=mStack.Pop()x


    کد زير را برای کليک شدن دکمه ShowStack بنويسيد :

    Dim elements as New ClistIterator
    Set elements=mStack.Iterator
    If elements.HasMoreItems=false then msgbox "stack is empty"x
    Else
    While elemets.HasMoreItems
    Msgbox elements.NextItem
    Wend

    ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم صف :
    صف نوعي ساختار داده اي است که گره ها از ابتداي صف ( سر صف head ) حذف مي شوند و از انتهاي صف ( ته صف tail ) اضافه مي شوند . بنابر اين ، صف يک ساختار داده اي FIFO است . صف دارای دو متد به نامهای AddQueue و DelQueue است که اولین متد ، عنصری را به انتهای صف اضافه می کند و دومين متد ، عنصری را از ابتدای صف حذف می کند .
    براي ايجاد کلاس Cqueue از کلاس Clist استفاده مي کنيم :

    Private list as New Clist

    Public Sub AddQueue(value as Variant)x
    List.InsertAtBack(value)
    End sub

    Public Function DelQueue() as Variant
    DelQueue=list.RemoveFromFront
    End function

    Public property Get Iterator() as Variant
    Set Iterator=list.Iterator
    End Property


    درخت :
    ليستهاي پيوندي ، پشته ها و صف ها جزو ساختارهاي داده اي خطي هستند در حاليکه يک درخت ، يک ساختار داده اي دو بعدي با خصوصيات ويژه اي است . گره هاي درخت داراي دو يا چند لينک هستند . در اينجا در مورد درختهاي دودويي يا باينري بحث مي کنيم که در آن همه گره ها داراي دو لينک هستند . گره ريشه اولين گره در درخت است . هر لينک گره ريشه ، به يک فرزند اشاره مي کند . به فرزندان يک گره Siblings مي گويند . به گره بدون فرزند ، برگ يا Leaf گفته مي شود .
    درختهاي جستجوي باينري درخت هايي هستند که در آنها مقدار فرزند چپ هر گره کمتر از گره پدر و مقدار فرزند سمت راست هر گره بيشتر از گره پدر مي باشد ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم کلاس درختهای جستجوی باينری

    برای ايجاد درختهای جستجوی باينری در ويژوال بيسيک نياز به ايجاد دو کلاس داريم :
    1 - کلاس CTreeNode که هر ند درخت دودويي را توصيف می کند . اين کلاس دارای يک متغير به نام mNodeData از نوع Variant برای نگهداری داده هر گره است . همچنين دارای دو متغير اشاره گر به نامهای mLeft و mRight می باشد که به ترتيب به فرزند چپ و فرزند راست درخت اشاره می کنند .
    متد Get Data مقدار داده هر گره را بر می گرداند و متد Let Data مقدار داده هر گره را تنظيم می کند .
    متد Get Left آدرس فرزند چپ هر گره را برمی گرداند و متد Let Left فرزند چپ هر گره را تنظيم می کند .
    متد Get Right آدرس فرزند راست هر گره را برمی گرداند و متد Let Right فرزند راست هر گره را تنظيم می کند .
    متد Insert برای اضافه کردن فرزند به يک گره به کار می رود . اگر مقدار گره ای که می خواهيم بعنوان فرزند به درخت اضافه کنيم کوچکتر از مقدار خود گره باشد بعنوان فرزند چپ و در غير اينصورت بعنوان فرزند راست به گره اضافه می شود . اضافه شدن نيز بدين صورت است که ابتدا بررسی می شود آیا گره قبلاً فرزندی داشته است يا نه ؟ اگر نداشته باشد ( mLeft و يا mRight برابر Nothing باشد ) اين گره جديد مستقيماً به گره متصل می شود اما اگر گره قبلاً فرزندی داشته باشد متد Insert برای آن فرزند اضافه می شود و اينکار تا جايی ادامه می يابد که به گره ای برسيم که فرزندی نداشته باشد :

    Private mLeft as CtreeNode
    Private mRight as CtreeNode
    Private mNodeData as Variant

    Public Property Get Data() as variant
    Data=mNodeData
    End property
    Public Property Let Data(Byval vNewValue as Variant)x
    MNodeData=vNewValue
    End property
    Public Property Get Left() as variant
    Set Left=mLeft
    End property
    Public Property Let Left(Byval vNewValue as variant)x
    Set mLeft=vNewValue
    End property

    Public Property Get Right() as variant
    Set Right=mRight
    End Property
    Public Property Let Right(Byval vNewValue as variant)x
    Set mRight=vNewValue
    End Property

    Public Sub Insert(value as variant)x
    If valueIf mLeft Is Nothing Then
    Set mLeft=New CtreeNode
    MLeft.Data=value
    Else
    MLeft.Insert(value)x
    End if
    Elseif value>mNodeData then
    If mRight Is Nothing then
    Set mRight=New CtreeNode
    MRight.Data=value
    Else
    MRight.Insert(value)x
    End if
    End if
    End sub


    2 - کلاس CTree : اين کلاس برای ايجاد درخت بکار می رود . اين کلاس دارای متغيری بنام mRoot از نوع CTreeNode برای تعريف ريشه درخت است . همچنين يک متغير mOutputString برای نمايش دادن اعضای درخت دارد .

    Private mRoot as CtreeNode
    Private mOutputString as String

    Public Sub InsertNode(value as Varaint)x
    If mRoot Is Nothing then
    Set Mnode=New CtreeNode
    MRoot.Data=value
    Else
    MRoot.Insert(value)x
    End if
    End sub

    Public PreorderTraversal()x
    MOutputString=””x
    Call PreorderHelper(mRoot)x
    End sub

    Private Sub PreorderHelper(node As CtreeNode)x
    If node Is nothing Then
    Exit sub
    End if
    MOutputString=mOutputString & node.Data & “ “x
    Call PreorderHelper(node.left)x
    Call PreorderHelper(node.right)x
    End sub

    Public Sub InorderTraversal()x
    MOutputString=””x
    Call InorderHelper(mRoot)x
    End sub

    Private Sub InorderHelper(node as CtreeNode)x
    If node Is nothing then
    Exit sub
    End if
    Call InorderHelper(node.Left)x
    MOutputString=mOutputString & node.Data & “ “x
    Call InorderHelper(node.Right)x
    End sub

    Public PostorderTraversal()x
    MOutputString=””x
    Call PostorderHelper(mRoot)x
    End sub

    Private Sub PostorderHelper(node as CtreeNode)x
    If node Is Nothing then
    Exit sub
    End if
    Call PostorderHelper(node.Left)x
    Call PostorderHelper(node.Right)x
    MOutputString=mOutputString & node.Data & “ “x
    End sub

    Public Property Get Output() as Varaint
    Output=mOutputString
    End Property
    ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی انواع روشهای پيمايش عناصر درخت :
    ۱ - روش InOrder : در اين روش ابتدا عناصر نيمه سمت چپ درخت ، سپس ريشه و در آخر عناصر نيمه سمت راست درخت نمايش داده می شوند .
    ۲ - روش PreOrder : در اين روش ابتدا ريشه درخت ، سپس عناصر نيمه سمت چپ و در پايان عناصر نيمه سمت راست درخت نمايش داده می شوند .
    ۳ - روش PostOrder : در اين روش ابتدا عناصر نيمه سمت چپ درخت ، سپس عناصر نيمه سمت راست درخت و در پايان ريشه درخت نمايش داده می شوند .
    بررسی متدهای کلاس CTree :
    متد InsertNode : اگر گره ريشه برابر Null باشد value را برابر مقدار گره ريشه قرار می دهد . در غير اينصورت متد Insert مربوط به گره ريشه فراخوانی می شود .
    متد PreorderTraversal : رشته چاپ عناصر ريشه را خالی می کند و سپس متد پيمايش Preorder را فراخوانی می کند .
    متد InorderTraversal : رشته چاپ عناصر ريشه را خالی می کند و سپس متد پيمايش Inorder را فراخوانی می کند .
    متد PostorderTraversal : رشته چاپ عناصر ريشه را خالی می کند و سپس متد پيمايش Postorder را فراخوانی می کند .
    متد Get Output : عناصر پيمايش شده درخت را برمی گرداند .
    يک برنامه نمونه :
    ابتدا کلاسهای CTreeNode و CTree را به پروژه تان اضافه کنيد . سپس متغير زير را در قسمت کدنويسی فرمتان تعريف کنيد :

    Dim mTree as New Ctree


    سپس در فرمتان يک Textbox با نام Value و دو Command Button با نامهای Insert و Show قرار دهيد .
    کد زير را برای وارد کردن عنصر به درخت برای دکمه Insert بنويسيد :

    mTree.InsertNode(Value.Text)x


    کد زير را برای پيمايش InOrder درخت برای دکمه Show بنويسيد :

    Call mTree.InorderTraversal


    شي Collection :
    ويژوال بيسيک داراي شي پيش ساخته اي به نام Collection است که مي تواند مجموعه اي از مقادير با هر نوع داده اي را در خود ذخيره کند . در واقع عناصر موجود در يک Collection مي توانند داراي نوعهاي داده اي متفاوت باشند . شي Collection قابليت رشد ديناميک دارد .
    شي Collection توسط کلمه کليدي New ايجاد مي شوند . توسط متد Add مي توان به Cllection عضو اضافه کرد و توسط متد Remove مي توان عضوي را از آن حذف کرد . هر عضو از Collection توسط متد Item قابل دستيابي است . با استفاده از خاصيت Count مي توان تعداد اعضاي موجود در Collection را تعيين نمود . بصورت پيش فرض اعضاي جديد به انتهاي Collection اضافه مي شوند ولي توسط آرگومانهاي اختياري متد Add مي توان محل اضافه شدن را تغيير داد .
    متد Remove يک شماره مي گيرد که موقعيت عضوي را که مي خواهيم آنرا حذف کنيم مشخص مي کند .
    توسط دستورات زير مي توان اعضاي يک Collection را نمايش داد :

    Dim mCollection as New Collection
    Dim element as Variant
    .
    .
    .
    For Each element In mCollection
    Msgbox element


    element متغيري از نوع variant براي اشاره به هر عضو Collection مي باشد .

    کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم مقدمه

    بعلت عدم وجود اشاره گر در ويژوال بيسيک عمليات کار با فايلها در آن نسبتاً ساده می باشد .
    بطور کلی فايلها بر دو نوع هستند :
    1 - فايلهای متنی Text File : اين فايلها فقط شامل کاراکترهای اسکی و برخی کاراکترهای خاص مانند انتهای خط و انتهای فايل هستند .
    ۲ - فايلهای باينری Binary File : شامل هر نوع کاراکتری می توانند باشند و کاربردهای گسترده ای دارند مانند بانک های اطلاعاتی ، فايلهای اجرائی ، فايلهای گرافيکی و غيره
    ويژوال بيسيک می تواند با هر دو نوع فايل کار کند .

    چگونگی باز کردن فايلها

    قبل از اينکه بتوان عمليات ورودی/خروجی را روی يک فايل انجام داد ابتدا بايستی آنرا باز کرد . باز کردن فايلها در ويژوال بيسيک توسط دستور Open انجام می شود . فرمت کلی اين دستور بصورت زير است :

    Open filename [For mode] [Access access][lock] As [#]filenumber [Len=reclen]x


    [ پارامترهای داخل کروشه اختياری هستند . ]
    filename نام فايلی است که می خواهيم آنرا باز کنيم .
    mode حالت باز کردن فايل است . اين حالتها عبارتند از :
    - Input : فايل بعنوان ورودی باز می شود .
    - Output : فايل بعنوان خروجی باز می شود .
    - Binary : فايل از نوع باينری باز می شود .
    - Append : فايل طوری باز می شود که بتوان به انتهای آن چيزی اضافه کرد .
    - Random
    access نوع دسترسی به فايل را مشخص می کند . انواع دسترسيها عبارتند از :
    - Read : خواندن فايل
    - Write : نوشتن در فايل
    - ReadWrite : خواندن و نوشتن فايل
    lock نوع دسترسی ساير برنامه ها به اين فايل را مشخص می کند . انواع دسترسيها عبارتند از :
    - Shared : دسترسی اشتراکی
    - Lock Read
    - Lock Write
    - Lock Read Write
    filenumber عددی است که ويژوال بيسيک از آن برای دسترسی به فايل استفاده می کند .اين عدد بايستی برای هر فايل منحصر بفرد و بين ۱ تا ۵۱۱ باشد . برای بدست آوردن اولين شماره آزاد می توان از تابع FreeFile استفاده کرد .
    reclen :طول بافر فايل است . اين عدد بايستی از ۳۲۷۶۷ کو چکتر باشد .

    در صورتی که فايلی که توسط filename مشخص شده وجود نداشته و فايل برای Append ، Binary ، Output و يا Random باز شده باشد در اينصورت يک فايل جديد با اين نام ساخته می شود .
    در صورتی که فايل بصورت باينری باز شده باشد پارامتر Len ناديده گرفته می شود .

    چگونگی بستن فايل

    پس از پايان کار با فايل برای بستن آن از دستور Close استفاده می کنيم . فرمت اين دستور بصورت زير است :

    Close #filenumber


    دستور Close بدون هيچ پارامتری تمام فايلهای باز را می بندد .

    کار با دايرکتوری

    ۱ - گرفتن Dir : توسط دستور Dir می توان نام فايلهای موجود در يک دايرکتوری را بر اساس پارامترهايي که به آن می دهيم پيدا کنيم . برای مثال :

    Myfile=Dir$("c:\text\*.txt)"x


    دستور فوق نام اولين فايل موجود در دايرکتوری C:\TEXT را که پسوند آنها txt باشد در متغير Myfile قرار می دهد . اگر دستور فوق را بدون پارامتر مجدداً اجرا کنيم نام دومين فايل برگرداننده می شد و الی آخر
    Dir دارای يک پارامتر اختياری است که نوع فايلهای مورد نظر را نيز می توان با آن مشخص نمود . مثال :

    Myfile=Dir$("c:\text\*.txt",vbNormal)x


    مقادير ممکن اين پارامتر عبارتند از :
    vbNormal ، vbHidden ، vbSystem ، vbDirectory
    ۲ - تغيير دايرکتوری : برای تغيير دايرکتوری از دستور ChDir استفاده می شود مثال :

    ChDir "c:\windows\system32"x


    ۳ - تغيير درايو : برای تغيير درايو از دستور ChDrive استفاده می شود مثال :

    ChDrive "E:"x


    ۴ - ساخت دايرکتوری : برای ايجاد دايرکتوری جديد از دستور MKDir استفاده می شود مثال :

    MKDir "c:\MyFolder"x


    ۵ - حذف دايرکتوری : برای حذف دايرکتوری از دستور RmDir استفاده می شود مثال :

    RmDir "C:\MyFoler"x

    --------

    خواندن از فايل :

    1 - دستور Input : توسط دستورهای Input و Line Input می توان محتوای فايلهای متنی و باينری را خواند .
    دستور Input به دو صورت بکار می رود :
    Input #Filenumber,ReadData
    ReadData=Input(Charnum,Filenumber)x
    دستور اول کل يک فايل را خوانده و در متغير ReadData قرار می دهد . دستور دوم ، تعداد Charnum بايت از فايلی با شماره Filenumber را خوانده و در متغير ReadData قرار می دهد .
    اين دو دستور تمام کاراکترهای موجود در فايل را می خوانند . برای اينکه بتوان فايل را خط به خط خواند ، از دستور Line Input استفاده کنيد :
    Line Input #Filenumber,ReadData
    البته از دستور Line Input بيشتر برای خواندن فايلهای متنی استفاده می شود زيرا ممکنست در فايل باينری هيچ کاراکتر انتهای خط ( CRLF ) وجود نداشته باشد و يکباره کل فايل خوانده شود .

    ۲ - دستور Get : از اين دستور برای خواندن فايلهای باينری با دسترسی تصادفی ( Random Access ) استفاده میشود :
    Get #Filenumber,[Recordnum%],ReadData
    اين دستور رکورد شماره Recordnum را از فايلی با شماره Filenumber می خواند و در متغير ReadData قرار می دهد . علامت کروشه نشان می دهد که پارامتر Recordnum اختياری است و در صورتيکه ذکر نشود داده ها از رکورد بعدی فايل ( جائيکه اشاره گر فايل آنجا قرار دارد ) خوانده می شوند .

    نوشتن در فايل :

    ۱ - دستور Print : توسط اين دستور می توان اطلاعاتی را در فايل قرار داد :
    Print #FileNumber,WriteData
    دستور فوق محتويات متغير WriteData را در فايلی با شماره FileNumber می نويسد . بوسيله دستور Print می توان اطلاعات را بصورت خط به خط در فايل نوشت برای مثال :
    Print #1,"Hello Visual Basic"+Vbcrlf
    عبارت Vbcrlf نشان دهنده کاراکتر انتهای خط ( CRLF ) در ويژوال بيسيک می باشد .

    ۲ - دستور Put : اين دستور برای نوشتن داده ها در فايلهای باينری با دسترسی تصادفی بکار می رود :
    Put #FileNumber,[Recordnum],WriteData
    اين دستور محتويات متغير WriteData را در رکورد شماره Recordnum قرار می دهد .

    تعيين محل رکورد در فايلهای با دسترسی تصادفی :

    برای منتقل کردن اشاره گر فايل به يک رکورد در يک فايل باينری با دسترسی اتفاقی ، از دستور Seek استفاده می شود . اين دستور محل يک بايت را در فايل می گيرد و اشاره گر فايل را در آنجا قرار می دهد بنابراين دستورات Put و Get می توانند با اين رکورد کار کنند :
    Seek #FileNumber,RecordNumber

    تشخيص انتهای فايل :

    برای اينکه متوجه شويم به انتهای يک فايل رسيده ايم از دستور EOF استفاده می کنيم . اين دستور يکی از مقادير True يا False را بر می گرداند که نشان می دهد به انتهای فايلرسيده ايم يا نه . از اين تابع در حلقه های Do-While استفاده می شود :
    Do While Not (EOF(FileNumer))x
    .
    .
    .
    Loop
    حلقه فوق تا زمانيکه فايل موردنظر به انتها نرسيده باشد اجرا خواهد شد .

    بدست آوردن طول يک فايل :

    بوسيله دستور LOF می توان طول محتويات يک فايل را بدست آورد :
    FileSize=LOF(FileNumber)x

    بدست آوردن محل اشاره گر فايل :

    توسط دستور Loc می توان محل جاری اشاره گر فايل را بدست آورد . اجرا شدن اين دستور محل اشاره گر را تغيير نمی دهد :
    FilePosition=Loc(FileNumber)x
    --------

    ساير عمليات کار با فايل :

    ۱ - حذف فايل : برای حذف يک يا چند فايل از دستور Kill استفاده می شود :
    Kill "C:\Temp\MyFile.txt"x
    Kill "C:\Temp\*.txt"x

    ۲ - انتقال فايل : برای انتقال يک فايل از يک دايرکتوری به دايرکتوری ديگر از دستور Name استفاده می شود . مبدا و مقصد بايستی روی يک درايو باشند . اگر دايرکتوری مبدا و مقصد يکی باشد فايل تغيير نام داده می شود :
    Name "C:\Temp\File1.txt" To "C:\Temp2\File2.txt"x

    ۳ - کپی کردن فايل : برای کپی کردن يک فايل از يک دايرکتوری به دايرکتوری ديگر از دستور FileCopy استفاده می شود :
    FileCopy "\File1.txt\ To "C:\Temp\File2.txt"x

    ۴ - بدست آوردن تاريخ و زمان آخرين تغيير فايل و يا زمان ايجاد فايل : برای اين کار از دستور FileDateTime استفاده می شود . ابتدا بايستی يک متغير از نوع Variant تعريف کرده و سپس توسط اين دستور تاريخ و زمان موردنظر را استخراج کنيم :
    Dim FileInfo As Variant
    FileInfo=FileDateTime("C:\Temp\MyFile.txt")x

    ۵ - استخراج طول فايل : برای بدست آوردن طول يک فايل بر حسب بايت از دستور FileLen استفاده می شود :
    FileSize=FileLen("C:\MyFile.txt")x

    ۶ - تغيير صفت يک فايل : برای تغيير صفت يک فايل از دستور SetAttr استفاده می شود . پارامترهای اين دستور عبارتند از :
    0 : فايل معمولی
    2 : فايل مخفی
    4 : فايل سيستمی

    SetAttr FileNumber,FileAttrib

    مقابله با خطاهای کار با فايل :

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

    ۵۲ : شماره يا نام فايل صحيح نيست
    ۵۳ : فايل پيدا نشد
    ۵۴ : حالت فايل صحيح نيست
    ۵۵ : فايل قبلاً باز شده
    ۵۸ : فايل از قبل وجود دارد
    ۵۹ : طول رکورد صحيح نيست
    ۶۱ : ديسک پر است
    ۶۲ : عبور از انتهای فايل
    ۶۳ : شماره رکورد صحيح نيست
    ۷۰ : دسترسی ممنوع است
    ۷۱ : ديسک آماده نيست
    ۷۶ : مسير پيدا نشد

    در هنگام مقابله با خطا بهتراست از يک ساختار Select-Case استفاده کنيد :
    Select Case Err
    Case 71
    MsgBox "Drive is Not Ready"x
    .
    .
    .
    End Select

    ايجاد کلاسی برای کار با فايلهای Xml مقدمه :
    همانطور که در قسمت سوم مباحث برنامه نويسی اکتيوايکس های سرور سايد گفته شد برای قرار دادن پارامترهای اتصال به بانک اطلاعاتی از فايل XML استفاده خواهيم نمود . بنابراين ابتدا بايستی کلاسی برای کار با فايلهای XML بنويسيم . توجه داشته باشيد که کلاسی که در اين بخش معرفی می شود کلاسی ساده می باشد که فقط با آن می توان مقدار يک ند Node وجود در فايل xml را خواند . در صورت نياز ، می توانيد خودتان متدهای ديگری را به آن اضافه کنيد . برای اين منظور نکاتی را در انتهای همين بخش آورده ام .
    XML يک زبان نشانه ای توسعه پذير ( eXtensible Markup Language ) است که در سال 1998 توسط کنسرسيوم وب جهانی W3C ايجاد شد . XML واقعاً يک زبان نيست بلکه يک متا-زبان است و برای توصيف ساير زبانها بکار می رود . داده ها در فايلهای XML براحتی قابل تعريف و استفاده هستند .
    مثالی از يک فايل XML :


    <user>
    <name>ali</name>
    <id>12</id>
    </user>



    کار با فايلهای XML در وی بی :
    برای کار با فايلهای xml در ويژوال بيسيک بايستی ابتدا از بخش References مورد Microsoft XML 3.0 را انتخاب کنيد . سپس يک Class Modules به پروژه تان اضافه کنيد و نام آنرا XMLReader بگذاريد . در اين کلاس ابتدا يک متغير از نوع شی xml برای کار با فايلهای xml تعريف می کنيم :

    Private xml


    سپس متدی برای مقداردهی اوليه شی xml می نويسيم . اين متد دارای يک متغير ورودی است که نام فايل xml مورد نظر می باشد :

    Public Sub Initiate(ByVal filename As String)x
    Set xml = CreateObject("Microsoft.XMLDOM")x
    xml.async = False
    xml.Load (server.MapPath(filename))x
    End Sub


    توجه کنيد که در کد فوق از شی server برای يافتن مسير فيزيکی فايل XML استفاده شده است بنابراين ابتدا بايستی در Class_Initialize اين شی را مطابق مطالب درس دوم مقداردهی کنيد .

    حال بايستی متدی برای خواندن مقدار يک ند از فايل xml بنويسيم . در اين متد توسط يک حلقه for each ندهای فايل را بررسی می کنيم تا ندی را بيابيم که نامش مشابه با متغير ورودی متد است . سپس با استفاده از خاصيت nodeValue می توانيم مقدار آنرا بخوانيم .

    Public Function getvalue(ByVal NName As String) As String
    Dim x
    getvalue = ""x
    For Each x In xml.documentElement.childNodes
    If x.nodeName = NName Then
    getvalue = x.childNodes(0).nodeValue
    Exit For
    End If
    Next
    End Function


    مثالی از کار با کلاس XMLReader :
    همانطور که گفته شد می توانيم پارامترهای اتصال به بانک اطلاعاتی را در فايل XML قرار دهيم و در زمان Initiate کردن ADODB برای اتصال به بانک اطلاعاتی ، آنها را بخوانيم :

    Dim xmlf As New XMLReader
    Call xmlf.Initiate("config.xml")x
    userName = xmlf.getvalue("DataBaseID")x
    Password = xmlf.getvalue("DataBasePassword")x
    database_name = xmlf.getvalue("DataBaseName")x
    server_name = xmlf.getvalue("ServerAddress")x


    ساختار يک فايل نمونه config.xml بصورت زير می باشد :


    <Application>testIt</Application>
    <ServerAddress>192.168.0.1</ServerAddress>
    <DataBaseName>Edatabase</DataBaseName>
    <DataBaseID>Euser</DataBaseID>
    <DataBasePassword>Epass</DataBasePassword>



    ساير نکات برای توسعه کلاس فوق :
    نکات زير شما را در نوشتن کلاسی کاملتر راهنمايي می کنند :

    1 - توجه داشته باشيد که xml.documentElement بعنوان ريشه فايل xml محسوب می شود . بنابراين برای دسترسی به ريشه می توان يک شی ريشه نيز تعريف کرد :

    Dim root
    Set root = xml.documentElement


    2 - در صورتيکه يک فايل xml دارای چندين ند در ريشه اش باشد و هر ند ريشه نيز دارای چندين ند درونی باشد توسط خاصيت root.childNodes.length و با استفاده از يک حلقه for می توان به اين ندها دسترسی داشت . برای مثال فايل زير را درنظر بگيريد :


    <people>
    <user>
    <name>ali</name>
    <id>1</id>
    </user>
    <user>
    <name>reza</name>
    <id>2</id>
    </user>
    </people>



    حلقه زير روش دسترسی را به اين فايل نشنان می دهد :

    For I = 0 TO (root.childNodes.length - 1)x
    Set thisChild = root.childNodes(I)x
    name = thisChild.childNodes(0).Text
    id = thisChild.childNodes(1).Text
    Next


    3 – اضافه کردن ند به فايل : برای اضافه کردن ند از متدهای createNode و appendChild استفاده می شود برای مثال برای اضافه کردن يک user جديد به مثال فوق :

    Set newuser = xml.createNode("element", "people", "")x
    Dim name,id
    Set newname = xml.createNode("element", "name", "")x
    newname.text = yourname
    Set newid = xml.createNode("element", "id", "")x
    newid.text = yourid
    newuser.appendChild(newname)x
    newuser.appendChild(newid)x
    root.appendChild(newuser)x


    در انتها نيز بايستی فايل را ذخيره نمود :

    xml.save(Server.Mappath(filename))x


    4 – حذف يک ند از فايل : برای حذف يک ند از فايل توسط يک حلقه for بايستی ند مورد نظر را يافته و سپس توسط متد removeChild آنرا حذف کنيم :

    found = False
    For I = (root.childNodes.length - 1) TO 0 STEP -1
    Set thisChild = root.childNodes(I)x
    name = thisChild.childNodes(0).Text
    If name = searchname Then
    root.removeChild(thisChild)x
    found = True
    End If
    Next


    در انتها نيز فايل xml را ذخيره کنيد

    نا له پنداشت که در سینه ی ما جا تنگ است

    رفت و برگشت سراسیمه که دنیا
    تنگ است

  12. کاربرانی که از پست مفید ریپورتر سپاس کرده اند.


  13. #7
    کـــــــاربر فــــعال
    رشته تحصیلی
    مکانیک سیالات
    نوشته ها
    11,179
    ارسال تشکر
    13,156
    دریافت تشکر: 21,945
    قدرت امتیاز دهی
    56319
    Array
    ریپورتر's: خوشحال2

    پیش فرض آموزش گام به گام ویژوال بیسیک6.0 (6)

    Server-Side ActiveX Dll Programming- بخش 1,2,3,4,5,6 مقدمه
    با قراردادن کدهای ASP درون component های server side ، برنامه نويس نه تنها می تواند از قابليت های ويژوال بيسيک در نوشتن کدهای خود استفاده کند بلکه سرعت load صفحات ASP وی نيز افزايش می يابد . همچنين اين روش راهکاری برای کپسوله سازی و حفاظت از کدهای ASP می باشد .
    در اين درس يک نمونه اکتيويکس server-side را توسط ويژوال بيسيک ايجاد نموده و از آن در صفحات ASP استفاده خواهيم کرد .

    اجزای Server-Side
    اکتيوکس های server-side بر خلاف اکتيوکس های clict-side بر روی سرور وب اجرا می شوند و بنابراين بايستی وب سرور مورد استفاده با اين تکنولوژی سازگار باشد . زمانيکه وب سرور دستوری را برای پردازش يکسری اطلاعات درون يک صفحه ASP دريافت می کند دستوراتی که درون تگهای قرار دارند بررسی می شوند . با استفاده از ويژوال بيسيک می توان يک اکتيوکس dll ساخت که جايگزين اين کدهای ASP شود . در اينصورت تنها کافيست يک شی از کلاسهای موجود در اين dll ساخته شود تا بتوان از قابليتهای آن استفاده نمود .

    ايجاد ActiveX Dll در ويژوال بيسيک
    برای ساخت يک اکتيواکس ويژوال بيسيک را اجرا کرده و توسط گزينه New Project پروژه ای از نوع ActiveX Dll ايجاد کنيد . پس از اينکه شما روی آيکون ActiveX dll کليک کنيد ويژوال بيسيک پروژه ای پيش فرض بهمراه ي: کلاس خالی برای شما ايجاد می کند . می توانيد هم نام پروژه و هم نام کلاس را تغيير دهيد همچنين می توانيد کلاسهای ديگری به پروژه اضافه کنيد .
    حال برای اينکه بتوان دستورات ASP را استفاده نموده بايستی از منوی Project وارد بخش References شده و مورد Microsoft Active Server Pages Object Library را انتخاب کنيد .

    استفاده از متدهای ASP در کلاس های ActiveX
    بمنظور استفاده از متدهای ASP در کلاسهای ActiveX بايستی ابتدا روتينی به اسم OnStartPage در داخل کلاس تعريف کنيد . ساختار اين روتين بصورت زير است :

    Public Sub OnStartPage(PassedScriptingContext As ScriptingContext)x

    End Sub


    زمانيکه کاربر يک صفحه ASP را که شامل شی ای از کلاس ما باشد فراخوانی کند IIS ، SciptingContext را به شی ما پاس می دهد . ScriptingContext حاوی تمام متدها و خصوصيات ASP می باشد که برای استفاده در دسترس هستند . حال بايستی در روتين OnStartPage تمام اشيای ASP که توسط ScriptingContext در دسترس هستند را به اشيايي از همان نوع assign کنيم تا در صورت لزوم بتوانيم از آنها استفاده نمائيم . بنابراين قبل از نوشتن روتين OnStartPage متغيرهای زير را تعريف می کنيم :

    Private MyScriptingContext As ScriptingContext
    Private MyApplication As Application
    Private MyRequest As Request
    Private MyResponse as Response
    Private MyServer As Server
    Private MySession As Session


    حال در روتين OnStartPage بايستی اشيا فوق را مقداردهی کنيد :

    Public Sub OnStartPage(PassedScriptingContext As ScriptingContext)x
    Set MyScriptingContext=PassedScriptingContext
    Set MyApplication=MyScriptingContext.Application
    Set MyRequest=MyScriptingContext.Request
    Set MyResponse=MyScriptingContext.Response
    Set MyServer=MyScriptingContext.Server
    Set MySession=MyScriptingContext.Session
    End Sub



    از تمام اشيا فوق مشابه نوشتن صفحات ASP می توانيم در متدهايي که برای کلاس می نويسيم استفاده کنيم . برای مثال کد ASP زير را در نظر بگيريد :





    حال فرض کنيد می خواهيم همين دستورات را در يک متد از کلاس بنويسيم :

    Public Sub MyMethod()x
    Dim MyTempVar As String
    MyTempVar=MyRequest.Form(“username”)x
    MyResponse.Write(“You Entered : “ & MyTempVar)x
    End Sub


    نکته ديگری که بايد در نظر داشت نوشتن روتينی است که در زمان پايان کار با شی فراخوانی می شود . اين روتين OnEndPage نام دارد و در آن اشيايي که در روتين OnStartPage مقداردهی کرده ايم را آزاد می کنيم :

    Public Sub OnEndPage()x
    Set MyScriptingContext=Nothing
    Set MyApplication= Nothing
    Set MyRequest= Nothing
    Set MyResponse= Nothing
    Set MyServer= Nothing
    Set MySession= Nothing
    End Sub


    پس از نوشتن متدهای موردنظرتان پروژه را ذخيره کنيد . حال برای کامپايل پروژه از منوی File مورد File/Make Dll را انتخاب نمائيد تا پروژه کامپايل شده و فايل dll موردنظرتان ساخته شود . اين فايل را در دايرکتوريي که صفحات ASP شما در آنجا قرار دارد کپی کنيد .
    نکته ای که بايد مورد توجه قرار داد اينست که در صورتيکه می خواهيد از اين dll در سيستم ديگری استفاده کنيد ابتدا بايستی آنرا رجيستر کنيد . برای رجيستر کردن يک dll از برنامه regsvr32.exe موجود در دايرکتوری سيستم ويندوز استفاده می شود :

    Regsvr32.exe C:\InetPub\wwwroot\Example\Example.dll


    استفاده از ActiveX Dll در صفحات ASP
    برای استفاده از کلاس نوشته شده در فايل dll در صفحات ASP ابتدا بايستی يک شی از آن کلاس ايجاد کنيم :





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

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

    +COM چيست ؟
    روشی که برای دسترسی به Object های ASP در درس گذشته بيان شد تا IIS 3.0 استفاده می شد . اين روش استفاده از متدهای OnStart و OnEnd بود . البته گرچه هنوز اين روش از سوی IIS ورژن ۵ پشتيبانی می شود اما دارای يک مشکل است :
    اگر بخواهيد از يک کلاس در کلاس ديگری استفاده کنيد نمی توانيد در کلاس مورد استفاده ، دو متد ذکر شده را قرار دهيد و بنابراين به اشيای ASP دسترسی نخواهيد داشت .
    راه حلی که برای اين مشکل ارائه شد تکنولوژی +COM می باشد .
    بطور خلاصه در اين تکنولوژی شیی به اسم ObjectContext وجود دارد که از طريق آن می توانيد به اشيای ASP دسترسی داشته باشيد .
    برای استفاده از تکنولوژی +COM ابتدا از منوی Project ، References را انتخاب کرده و مورد زير را انتخاب کنيد :
    COM+ Services Type Library
    سپس در کلاسهای خود متغيرهای زير را تعريف کنيد :


    Dim Request As ASPTypeLibrary.Request
    Dim Response As ASPTypeLibrary.Response
    Dim Server As ASPTypeLibrary.Server
    Dim Session As ASPTypeLibrary.Session
    Dim Application As ASPTypeLibrary.Application


    حال در متد Initialize هر کلاس بايستی شی ObjectContext را تعريف کرده و مقداردهی کنيد . سپس متغيرهای بالا را با استفاده از اين شی مقداردهی نمائيد :


    Private Sub Class_Initialize()x
    Dim objCtx As ObjectContext
    Set objCtx = GetObjectContext
    Set Request = objCtx.item("Request")x
    Set Response = objCtx.item("Response")x
    Set Server = objCtx.item("Server")x
    Set Session = objCtx.item("Session")x
    Set Application = objCtx.item("Application")x
    End Sub



    + موضوع درس بعد : دسترسی به Database در کلاسهای اکتيوايکس Server-Side

    پاسخ به سوالات شما :
    ۱ - چه جوری دکمه ها و ليست باکس ها در ويژوال بيسيک را شکل اکس پی کنيم؟اصلان می شه؟
    پاسخ : ؟؟؟؟
    ۲ - تويه vb چطوری ميشه فايله اجرايیdllهاشو نخاد و بدونه اونا اجرا بشه ؟
    پاسخ : برنامه های اجرايي ويژوال بيسيک برای اجرا شدن به يکسری فايلهای ديگه نياز دارند مثلاً Vb Runtime Dll . برای اينکه به اين فايلها نيازی نباشد بايستی يک برنامه نصب setup file برای پروژه تان بسازيد تا بتوان برنامه را روی هر کامپيوتری نصب و اجرا کرد . ساده تري راه استفاده از ابزار Package & Deployment موجود در ويژوال استديو است . ابزارهای حرفه ای تر عبارتند از : InstallShield ، InstallWise ، Setup Factory و ...
    ۳ - اگه ممکنه يه توضيحی درباره ی دي کد کردن دی ال ال mpr دهيد .
    پاسخ : ؟؟؟؟
    ۴ - چطوری ميشه تو يه تکس باکس در ويژوال بيسيک فرمان داد اينتر شود يعنی به خط بعدی رود؟ ( يعنی زمانی که مولتی لاين است‌)
    پاسخ : استفاده از کاراکتر vbCrLf
    ۵ - من مي خوام با زبانهايي PHP و ASP برنامه بنويسيم ولي تمامي اين زبانها Server_side هستند و من بايد روي سرور اين كار ها رو انجام بدم من مي خوامم بدونم كه چه طوري مي تونم كامپيوتر خودمو وب سرور كنم البته يه چيزهاي مي دونم كه بايد IIS رو نصب كنم ولي نه به طور كامل خواهش مي كنم كمكم كنيد
    پاسخ : بايستی ويندوز ۲۰۰۰ يا XP نصب کرده و از IIS آنها استفاده کنيد . البته در ويندوزز ۲۰۰۰ IIS بطور اتوماتيک نصب نمی شود و بايد آنرا خودتان اضافه کنيد . برای اطلاعات بيشتر در مورد کار با IIS به کتاب ها و مراجع اينترنتی مراجعه کنيد مراجعه کنيد .

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

    خلاصه ای بر چگونگی کار با بانک های اطلاعاتی ( Database ) در وی بی :
    + برای آشنايي کامل با چگونگی کار با بانک های اطلاعاتی در ويژوال بيسيک و بطور کلی Database Programming به کتاب برنامه نويسی بانک های اطلاعاتی در ويژوال بيسيک انتشارات نص رجوع کنيد .

    قبل از اينکه چگونگی نوشتن يک کلاس Database برای استفاده در ASP را آموزش دهم ، مقدمه ای بر چگونگی کار با بانک های اطلاعاتی در وی بی را شروع می کنم .
    برای کار با بانک های اطلاعاتی در ويژوال بيسيک روشها و امکانات مختلفی وجود دارد که يکی از بهترين آنها استفاده از تکنولوژی ( ADO ( ActiveX Data Object می باشد . بدون هيچ توضيحی در مورد ساختار اين تکنولوژی و نيز ساير روشهای ديگر ، به سراغ روش استفاده از اين تکنولوژی می روم :
    - برای کار با ADODB ابتدا بايستی از Reference ها مورد Microsoft ActiveX Data Object را انتخاب کرد .
    - قدم بعد تعريف يک شی ADO Connection برای اتصال به بانک اطلاعاتی است :


    Dim cn As ADODB.Connection


    - سپس بايستی اين شی ADO Connection را ايجاد نمود :


    Set cn = New ADODB.Connection


    - همچنين بايستی يک شی ADO Recordset برای گرفتن مجموعه ای از رکوردهای بانک اطلاعاتی تعريف کرد :


    Dim rs As ADODB.Recordset


    - حال بايستی اتصال به بانک اطلاعاتی را باز نمود . در اين مرحله با توجه به نوع بانک اطلاعاتی و اتصالی که می خواهيم داشته باشيم عبارت اتصال ممکن است متفاوت باشد . فرض کنيم عبارت اتصال را در يک متغير نوع String به اسم ConnString قرار دهيم :
    • در صورتی که بانک اطلاعاتی مقصد SQL Server باشد و بخواهيم بطور مستقيم و بدون استفاده از واسط ODBC به آن متصل شويم :


    ConnString=”Provider=SQLOLEDB.1;Password=yourpas sowrd;Persist Security Info=True;User ID=yourusername; Initial Catalog=yourDatabaseName;Data Source=yourServerName”


    • در صورتی که بانک اطلاعاتی مقصد SQL Server باشد و بخواهيم با استفاده از واسط ODBC به آن متصل شويم :


    ConnString=”Provider=MSDASQL.1;Password=yourpass owrd;Persist Security Info=True;UserID=yourusername;DataSource=yourODBC_ DataSourceName;Mode=ReadWrite”


    • در صورتی که بانک اطلاعاتی مقصد Access باشد :


    ConnString=” Provider=Microsoft.Jet.OLEDB.4.0;Data
    Source=yourDatabaseFilePath;Persist Security Info=False”



    حال بايستی اين اتصال را باز نمود :


    cn.Open(ConnString)x



    - قدم بعدی ايجاد شی ADO Recordset می باشد :


    Set rs = New ADODB.Recordset



    - سپس بايستی با توجه به کاری که می خواهيم با جداول آن بانک اطلاعاتی انجام دهيم يک sql query را توسط شی Recordset به آن بفرستيم :


    rs.Open yourSQLquery,cn,OpenKeyset, adLockOptimistic


    بعبارت ديگر نوع باز کردن Recordset متفاوت است و توسط query مورد نظر مشخص می شود برای مثال برای انتخاب فيلدهای يک Table :
    SELECT DISTINCT yourfields from yourtable WHERE yourcondition
    نکته : نوع قفل کردن مجموعه رکورد می تواند adLockReadOnly نيز باشد .

    - حال با استفاده از اين Recordset می توان يکسری کار را روی رکوردهای موجود در جداول انجام داد برای مثال :
    ۱ – حرکت به ابتدای مجموعه رکورد :


    rs.MoveFirst


    ۲ – حرکت در طول مجموعه رکورد :


    Do
    tmp = rs.fields(0)x
    .
    .
    .
    rs.MoveNext
    Loop Until (rs.EOF)x


    3 – بستن مجموعه رکورد و بستن اتصال به بانک اطلاعاتی :


    rs.Close
    cn.Close


    4 – حذف رکورد جاری از مجموعه رکورد :


    rs.delete


    5 - ايجاد رکورد جديد در مجموعه رکورد :


    Dim fields(RecordsetFieldsCount) As Variant
    Dim values(RecordsetFieldsCount) As Variant
    fields(0) = Field 1 Name
    fields(1) = Field 2 Name
    .
    .
    .
    fields(n) = Field n Name

    values(0) = Field 1 Value
    values(1) = Field 2 Value
    .
    .
    .
    values(n)= Field n Value

    rs.AddNew fields, values
    rs.update



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

    آشنايي با چند query برای کار با جداول بانک های اطلاعاتی

    1- SELECT : برای انتخاب رکوردها از يک جدول استفاده می شود . فرمت کلی اين دستور بصورت زير است :


    SELECT fieldnames FROM tablename WHERE condition ORDER BY fieldnames


    مثال : فرض کنيد يک جدول به اسم mytable داريم که دارای دو فيلد به نامهای id از نوع integer و name از نوع string باشد :
    – انتخاب تمامی رکوردهای جدول :
    query="Select * from mytable"x
    - انتخاب فيلد name تمام رکوردهای جدول :
    query="Select name from mytable"x
    - انتخاب رکوردهايي از جدول که فيلد id آنها برابر 2 باشد :
    query="Select * from mytable where id=2"x
    - انتخاب رکوردهايي از جدول که فيلد name آنها برابر a باشد :
    query="Select * from mytable where name=’a’"x
    توجه داشته باشيد که چون فيلد name از نوع string است در دستور فوق از ‘ برای مقدار فيلد name استفاده شده است .
    - انتخاب رکوردهايي از جدول که فيلد id آنها برابر 2 و فيلد name آنها برابر a باشد و بر حسب id مرتب شده باشند .
    query="Select * from mytable where id=2 and name=’a’ order by id"x
    نکته : در صورتيکه بخواهيم از يک متغير برای مقداردهی به يک فيلد در query استفاده کنيد با توجه به اينکه آن متغير از نوع integer و يا string است بايد بصورت زير عمل کنيم :
    Dim mId as integer
    Dim mName as string
    mId=1
    mName="a"x
    query="Select * from mytable where id=" & str(mId) & " and name=’" & mName & "’"x

    2 – INSERT : اين دستور برای قرار دادن يک رکورد در جدول استفاده می شود . فرمت کلی اين دستور بصورت زير است :


    INSERT INTO tablename (field1name,field2name,…) VALUES (field1value,field2value,…)x


    مثال :
    query="Insert into mytable (id,name) values (1,’a’)"x

    3 – UPDATE : اين دستور برای تغيير مقادير يک رکورد از جدول استفاده می شود . فرمت کلی اين دستور بصورت زير است :


    UPDATE tablename SET field1name=field1value, field2name=field2value,…


    مثال :

    query="Update mytable set id=2 , name=’b’"x

    4 – DELETE : اين دستور برای حذف يک يا چند رکورد از جدول استفاده می شود . فرمت کلی اين دستور بصورت زير است :


    DELETE FROM tablename WHERE condition


    مثال :

    query="Delete from mytable where id=1"x

    حال که با تکنولوژی ADODB و نيز query های مختلف برای کار با جداول بانک های اطلاعاتی آشنا شديد می توانيم کلاسی برای کار با بانک های اطلاعاتی بنويسيم و از آن در صفحات asp استفاده کنيم اما همانطور که در قسمت قبل ديديد برای اتصال به يک بانک اطلاعاتی نياز به يکسری اطلاعات مثل نام سرور ، نام بانک اطلاعاتی و ... داريم . چند روش برای دادن اين اطلاعات وجود دارد :
    1 – در کلاسی که می نويسيم اين مقادير را مشخص کنيم . اشکال اين روش اينست که از کلاس نوشته شده تنها برای يک کاربرد خاص می توانيم استفاده کنيم و در صورتيکه سرور بانک اطلاعاتی و يا نام بانک اطلاعاتی ويا username و password اتصال تغيير کند بايستی در کلاس نوشته شده نيز تغييرات را اعمال کرده و مجدداً آنرا کامپايل کنيم .
    2 – راه حل دوم اينست که پارامترها را از طريق asp به متد اتصال موجود در کلاس بفرستيم برای مثال :
    Set db=server.createobject(“dbclass.database)x
    Db.connect(servername,databasename,username,passwo rd)x
    که coonect متد اتصال به بانک اطلاعاتی در کلاس database می باشد .


    3 – روش سوم آنست که اين پارامترها را در يک فايل XML قراردهيم و در متد connect آنها را از فايل بخوانيم . مزيت اين روش اينست که پارامترها هم به آسانی قابل تغيير بوده و هم براحتی آنها می توان آنها را استخراج نمود .

    برای اين منظور بايستی ابتدا يک کلاس برای خواندن اطلاعات از فايل xml بنويسيم که موضوع درس بعد می باشد .

    نکته : در صورتيکه با فرمت فايلهای xml آشنا نيستيد پيشنهاد می کنم يک مطالعه مقدماتی در اين زمينه انجام دهيد .

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

    نوشتن کلاس Database - بخش اول :

    پس از مباحثی که در مورد شی ADODB و چگونگی استفاده از آن در وی بی و نيز استفاده از فايلهای XML داشتيم اکنون می توانيم يک کلاس کامل و قدرتمند برای کار با بانکهای اطلاعاتی در ASP بنويسيم .

    مراحل کار بصورت زير می باشد :

    ۱ - ابتدا يک پروژه از نوع ActiveX Dll ايجاد کنيد و نام آنرا DBase بگذاريد .

    ۲ - از بخش References مواردی را که در مباحث قبلی گفته شد به پروژه اضافه کنيد .

    ۳ - متغير Cn را برای کلاس بصورت زير تعريف کنيد :



    Private Cn As ADODB.Connection



    ۴ - ابتدا يک متد به اسم InitialConnection برای کلاس می نويسيم . در اين متد ابتدا پارامترهای اتصال به بانک اطلاعاتی را مشابه آنچه در درس قبل گفته شد از يک فايل XML به اسم config.xml می خوانيم و با استفاده از آنها اتصال به بانک اطلاعاتی را باز می کنيم :

    Public Sub InitialConnection()x
    Dim userName, Password, database_name, server_name
    Dim xmlf As NewXMLReader
    Call xmlf.Initiate("config.xml")x
    userName = xmlf.getvalue("DataBaseID") x
    Password = xmlf.getvalue("DataBasePassword") x
    database_name = xmlf.getvalue("DataBaseName") x
    server_name = xmlf.getvalue("ServerAddress")x
    Set Cn = CreateObject("ADODB.Connection")x
    Cn.ConnectionString = "Provider=SQLOLEDB.1;Password=" & Password & ";Persist Security Info=True;User ID=" & userName & ";Initial Catalog=" & database_name & ";Data Source=" & server_name
    Cn.Mode = adModeReadWrite
    Cn.Open
    End Sub

    لازم به ذکر است که XMLReader کلاس کار با فايلهای XML است که در قسمت قبلی در مورد آن صحبت کرديم .

    5 - برای بستن اتصال متد زير را به کلاس اضافه کنيد :

    Public Sub EndConnection()x
    Cn.Close
    Set Cn = Nothing
    End Sub

    6 - برای اجرای query هايي که نتيجه آنها از نوع Boolean است ( مثل Insert و Delete ) متدی به اسم ExecuteUpdate را به کلاس اضافه کنيد :

    Public Function ExecuteUpdate(ByVal squery As String) As Boolean
    Dim myrs As New Recordset
    If Not (makesInjection(squery)) Then
    myrs.LockType = adLockOptimistic
    Set myrs = Cn.Execute(squery) x
    ExecuteUpdate = True
    Exit Function
    Else
    ExecuteUpdate = False
    Exit Function
    End If
    End Function

    6 - برای اجرای query هايي که نتيجه آنها از نوع RecordSet است ( مثل Select ) متدی به اسم ExecuteQuery را به کلاس اضافه کنيد :

    Public Function ExecuteQuery(ByVal squery As String) As Recordset
    If Not (makesInjection(squery)) Then
    Set ExecuteQuery = Cn.Execute(squery)x
    Exit Function
    Else
    Set ExecuteQuery = Nothing
    Exit Function
    End If
    End Function

    همانطور که می بينيد در دو متد ExecuteUpdate و ExecuteQuery از تابعی به اسم makesInjection استفاده شده است . اين تابع بررسی می کند که آيا در query ورودی SQL-Injection وجود دارد يا نه .

    - اين تابع موضوع قسمت بعدی اين سلسله مباحث می باشد .
    ------------------------------------------------

    نوشتن کلاس Database : بخش دوم

    sql-injection چيست ؟

    همانطور که می دانيد در اغلب برنامه های کاربردی تحت وب از بانکهای اطلاعاتی استفاده می شود . اين برنامه ها داده های ورودی کاربر را از طريق فرمهای html دريافت کرده و بر اساس آن يک query توليد کرده و آنرا به بانک اطلاعاتی ارسال می کنند . در واقع ارتباط بين برنامه تحت وب با بانک اطلاعاتی بر اساس توليد query از داده های کاربر برقرار می شود . اکثر اين برنامه ها از زبان SQL برای اين ارتباط استفاده می کنند . اما نکته ای که در اين بين وجود دارد اينست که توليد query بر اساس داده هايی که کاربر مستقيماً در فيلدهای ورودی صفحه وب وارد کرده می تواند خطرناک باشد . بعبارت ديگر اگر برنامه محتويات يک فيلد را که توسط کاربر وارد شده در جلوی يک دستور SQL بچسباند و آنرا جهت اجرا روی بانک اطلاعاتی بفرستد در اينصورت يک هکر ماهر که با زبان SQL آشنا باشد می تواند محتويات اين فيلدها را طوری با دستورات SQL پر کند و چون ای داده ها مستقيماً برای توليد query استفاده می شود ممکنست آن query تبديل به يک فرمان مخرب شده و پس از اجرا ، اهداف نفوذگر را برآورده نمايد .

    مثال : فرض کنيد دو فيلد به اسمهای username و password در يک فرم وب قرار دارد که برای ورود به يک سايت استفاده می شود . همچنين فرض کنيد از اطلاعات اين فيلدها بطور مستقيم يک query بصورت زير برای بانک اطلاعاتی ارسال شود :

    us=request.form("username")
    psw=request.form("password")
    query="SELECT * FROM Users WHERE username='"&us&"' AND password='"&psw&"'"

    حال در صورتيکه هکر يک username صحيح ( مثلاً xxx ) از سيستم را بداند و در فيلد username مقدار صحيح را وارد کرده و در فيلد password عبارت زير را وارد کند :

    1111111' or username='xxx'

    در اينصورت query بصورت زير در می آيد :

    SELECT * FROM Users WHERE username='xxx' AND password='111111' or username='xxx'

    در اينصورت هکر بدون دانستن يک password مجاز می تواند به سيستم وارد شود .
    اين امر بخاطر آنست که چون فيلدهای وارد شده توسط کاربر بطور مستقيم در query قرار داده شده اند هکر توانسته کاراکتر ' را که در زبان SQL يک کاراکتر کنترلی بوده و عملکرد خاصی دارد ( عمل خاتمه دادن به عبارت SQL ) را در در query بگنجاند و سپس با دادن دستورات SQL مناسب کنترل را بدست بگيرد .

    اين سناريو می تواند بسيار خطرناکتر باشد زيرا هکر می تواند از ساير دستورات SQL مثل INSERT و DELETE نيز استفاده کند .

    - در نگارش مطالب فوق از کتاب " نفوذگری در شبکه و روشهای مقابله با آن " نوشته مهندس احسان ملکيان استفاده شده است . برای آشنايی بيشتر با sql-injection و روشهای مقابله با آن به صفحات ۳۲۰ تا ۳۲۸ اين کتاب مراجعه کنيد .

    برای مقابله با اين حملات بايستی از داده های ارسال شده توسط کاربر مستقيماً query توليد نکنيم بلکه ابتدا عدم وجود کاراکترهای کنترلی مثل ' و " و ; و *و غيره را در آن بررسی کنيم . برنامه ابتدا بايد در query وجود چنين کاراکترهايی را در مکانهای غيرمجاز بررسی کند . در بخش بعدی برنامه ای را جهت بررسی query های SQL بمنظور مقابله با sql-injection ارائه خواهم داد .

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

    تابع بررسی وجود sql-injection که در قسمت قبل در آن صحبت کرديم بصورت زير است :

    Private Function makesInjection(ByVal query As String) As Boolean
    Dim specialCharacters() As String
    Dim inQoute As Boolean
    specialCharacters = "-- ;,"
    inQoute = False
    For i = 1 To Len(query)
    Char = Mid(query, i, 1)
    If Mid(query, i, 1) = "'" And inQoute = False Then
    inQoute = True
    GoTo EndFor
    End If
    If Mid(query, i, 1) = "'" And inQoute = True Then
    inQoute = False
    GoTo EndFor
    End If
    If inQoute = False Then
    For Index = 1 To UBound(specialCharacters)
    schar = specialCharacters(Index)
    cchar = Mid(query, i, Len(schar))
    If schar = cchar Then
    Exit For
    End If
    Next
    If Index < UBound(specialCharacters) Then
    makesInjection = True
    Exit Function
    End If
    End If

    EndFor:
    Next
    If inQoute = True Then
    makesInjection = True
    Else
    makesInjection = False
    End If
    End Function

    ورودی اين تابع query شما و خروجی آن false ياtrue است .
    عملکرد تابع بصورت زير است :
    اين تابع در طول رشته query شروع به حرکت می کند و هر کاراکتر از آنرا بررسی می نمايد . در صورتيکه کاراکتر جاری ‘ باشد و داخل ‘ ’ نباشيم متغير مربوط به آن true شده و حلقه يکی بجلو می رود . اما در صورتيکه کاراکتر جاری ‘ باشد و داخل ‘ ’ باشيم متغير مربوط به آن false شده و حلقه يکی بجلو می رود . سرانجام در صورتيکه داخل ‘ ’ نباشيم بررسی می شود که اين کاراکتر يکی از کاراکترهای غير مجاز ( کاراکترهای موجود در رشته specialCharacters ) نباشد که اگر باشد تابع true بر می گرداند .
    پس از اتمام حلقه متغير مربوط به ‘ بررسی می شود که اگر true باشد در صورت injection وجود داسته و تابع نيز true بر می گرداند .

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

    نکته ای در مورد شی Recordset :

    متد ExecuteQuery که در کلاس Database نوشتيم يک رکوردست را بعنوان نتيجه انجام query ورودی روی بانک اطلاعاتی شما برمی گرداند .
    همانطور که می دانيد توسط خصوصيت RecordCount می توان تعداد رکوردهای نتيجه شده از يک query را که در رکوردست قرار دارند بدست آورد .
    اما مشکلی وجود دارد اينست که با روشی که ما در قسمتهای قبل برای اجرای query در اين متد استفاده کرده بوديم ( myrs = Cn.Execute query ) نمی توان از خاصيت Recordcount رکوردست استفاده نمود زيرا هميشه ۱- برمی گرداند . بعبارت ديگر در عبارت زير مقدار count هميشه ۱- خواهد بود :

    myrs.execute(query)
    count=myrs.RecordCount

    برای حل اين مشکل بايستی رکوردست را با CursorType مساوی adOpenStatic باز کرد . بعبارت ديگر بجای دستورات فوق از دستور زير استفاده کنيد :

    myrs.Open squery, Cn, adOpenStatic, adLockOptimistic
    count=myrs.RecordCount


    مديريت رشته ها در ويژوال بيسيک ۶ توابعی که برای مديريت رشته ها در وی بی می توانيد از آنها استفاده کنيد عبارتند از :
    تابع Asc : کد اسکی اولين کاراکتر رشته ورودی را بر می گرداند .
    فرمت کلی آن بصورت زير است :


    Asc(string)


    - تابع AscW کد یونيکد اولين کاراکتر را بر می گرداند .

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


    Chr(charcode)


    - تابع ChrW بر حسب يونيکد عمل می کند .

    تابع LCase : تمام کاراکترهای رشته ورودی را به حروف کوچک تبديل می کند .
    فرمت کلی آن بصورت زير است :


    LCase(string)

    تابع UCase : تمام کاراکترهای رشته ورودی را به حروف کوچک تبديل می کند .
    فرمت کلی آن بصورت زير است :


    UCase(string)

    تابع Left : رشته ای را بر می گرداند که شامل تعداد مشخصی از کاراکترهای سمت چپ رشته ورودی است .
    فرمت کلی آن بصورت زير است :


    Left(string, length)


    String : رشته ورودی
    Length : طول رشته مورد نظر

    مثال :

    Left(“abcdef”,3)=”abc”

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


    Right(string, length)

    مثال :

    Right(“abcdef”,3)=”def”


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


    Space(number)

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


    Len(string)

    مثال : Len(“abcdefg”)=7

    تابع Trim : اين تابع space هايي که در ابتدا يا انتهای رشته باشد را حذف می کند .
    فرمت کلی آن بصورت زير است :


    Trim(string)

    - توابع LTrim و RTrim فقط از چپ و راست عمل می کنند .

    مثال :

    Trim(“ abc”)=”abc”

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


    Mid(string, start[, length])


    string : رشته ورودی .
    start : محل شروع اولين کاراکتر رشته ای که می خواهيم از رشته ورودی استخراج کنيم .
    Length : اين پارامتر اختياری است و طول رشته ای است که می خواهيم از رشته ورودی استخراج کنيم . اگر اين پارامتر وارد نشود کليه کاراکترها از start به بعد استخراج خواهند شد .

    مثال : Mid(“abcdefg”,2,3)=bcd


    تابع Instr : اين تابع محل اولين وقوع يک رشته را درون رشته ديگر نشان می دهد .
    فرمت کلی آن بصورت زير است :


    InStr([start, ]string1, string2[, compare])


    Start : اين پارامتر اختياری است و محل شروع جستجو را نشان می دهد . اگر اين پارامتر وارد نشود جستجو از ابتدای رشته آغاز می شود .
    String1 : رشته ای که جستجو در آن انجام می شود .
    String2 : رشته مورد جستجو
    Compare : اين پارامتر اختياری است و نوع جستجو را نشان می دهد . اگر اين پارامتر 0 داده شود جستجوی متنی انجام می شود و اگر 1 داده شود جستجوی باينری انجام می شود .

    مثال : Instr(3,”abcdabg”,”ab”)=5

    اگر طول رشته string1 برابر صفر باشد مقدار بازگشتی صفر است . اگر string1 يا string2 برابر Null باشد مقدار بازگشتی نيز Null است . اگر طول رشته string2 برابر صفر باشد مقدار بازگشتی start خواهد بود . اگر رشته string2 درون string1 پيدا نشود مقدار بازگشتی صفر است . اگر start بزرگتر از طول رشته string1 باشد مقدار بازگشتی صفر است .

    تابع InstrRev : برعکس تابع Instr می باشد يعنی عمل جستجو را از انتهای رشته انجام می دهد .
    فرمت کلی آن بصورت زير است :


    InstrRev(stringcheck, stringmatch[, start[, compare]])


    تابع Replace : رشته ای را برمی گرداند که در آن يک رشته خاص با رشته ديگری به تعداد دفعات مشخصی جايگزين شده است .
    فرمت کلی آن بصورت زير است :


    Replace(expression, find, replace[, start[, count[, compare]]])

    Expression : رشته اصلی
    Find : رشته مورد جستجو
    Replace : رشته جايگزين
    Start : محل شروع جايگزينی . در صورتيکه اين متغير وارد نشود جايگزينی از ابتدا رشته انجام می شود .
    Count : تعداد دفعات جايگزينی . در صورتيکه اين متغير وارد نشود جايگزينی در تمام رشته انجام خواهد شد .
    Compare : نوع جستجو را نشان می دهد . اگر اين پارامتر 0 داده شود جستجوی متنی انجام می شود و اگر 1 داده شود جستجوی باينری انجام می شود .

    مثال :

    Replace(“abcadea”,”a”,”x”)=”xbcxdex �� ��

    اگر طول رشته expression برابر صفر باشد مقدار بازگشتی رشته ای با طول صفر است . اگر طول رشته find صفر باشد مقدار بازگشتی خود expression است . اگر طول رشته replace صفر باشد مقدار بازگشتی expression ای است که در آن تمام find ها حذف شده است . اگر start بزرگتر از طول رشته expression باشد مقدار بازگشتی رشته ای با طول صفر است . اگر count برابر صفر باشد مقدار بازگشتی خود expression است .


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


    StrReverse(expression)

    مثال :

    StrReverse(“abcd”)=”dcba”

    تابع Split : آرايه ای از تعداد مشخصی رشته برمی گرداند که اين رشته ها توسط يک کاراکتر جداکننده ( delimiter ) از درون يک رشته استخراج شده اند .
    فرمت کلی آن بصورت زير است :


    Split(expression[, delimiter[, limit[, compare]]])

    Expression : رشته اصلی
    Delimiter : اين پارامتر اختياری است و کاراکتر جداسازی را نشان می دهد . در صورتيکه اين پارامتر وارد نشود کاراکتر فاصله ( “ “ ) برای جداسازی استفاده می شود . در صورتيکه طول اين کاراکتر صفر باشد يک آرايه تک عضوی که شامل کل expression است برگردانده می شود .
    Limit : تعداد رشته های موجود در آرايه را نشان می دهد . در صورتيکه اين پارامتر داده نشود کليه رشته های جداشده در آرايه خروجی قرار می گيرند .
    Compare : نوع جستجو را نشان می دهد . اگر اين پارامتر 0 داده شود جستجوی متنی انجام می شود و اگر 1 داده شود جستجوی باينری انجام می شود .

    مثال :


    Dim Ar(3) as String
    Ar=Split(“a#bd#cde”,”#”)


    تابع Join : تعدادی رشته موجود در يک آرايه را بهم متصل می کند و رشته حاصل شده را بعنوان نتيجه بر می گرداند .
    فرمت کلی آن بصورت زير است :


    Join(sourcearray[, delimiter])

    Sourcearray : آرايه شامل رشته هايي که می خواهيم بهم متصل کنيم .
    Delimiter : کاراکتری که برای اتصال رشته ها بهم استفاده می شود . اين کاراکتر در بين رشته اهی اتصالی می آيد و اگر داده نشود از کاراکتر فاصله استفاده می شود . اگر طول اين کاراکتر صفر باشد رشته های بدون هيچ جداکننده ای بهم متصل می شوند .


    مثال :


    Dim Ar(3) as String
    Ar(1)=”ab”
    Ar(2)=”c”
    Ar(3)=”def”
    Join(Ar,”*”)=”ab*c*def”


    تابع StrComp : اين تابع دو رشته ورودی را با هم مقايسه می کند .
    فرمت کلی اين تابع بصورت زير است :


    StrComp(string1, string2[, compare])

    String1 : رشته اول
    String2 : رشته دوم
    Compare : نوع مقايسه را نشان می دهد . اگر اين پارامتر 0 داده شود مقايسه متنی انجام می شود و اگر 1 داده شود مقايسه باينری انجام می شود .

    اگر string1 کوچکتر از string2 باشد مقدار بازگشتی 1- است . اگر دو رشته مساوی باشند مقدار بازگشتی صفر است . اگر string1 بزرگتر از string2 باشد مقدار بازگشتی 1 است .


    تابع StrConv : در يک رشته ورودی تغييراتی را اعمال می کند .
    فرمت کلی آن بصورت زير است :


    StrConv(string, conversion)

    String : رشته ورودی
    Conversion : نوع عمل تبديل را نشان می دهد . مقادير ممکن اين متغير عبارتند از :



    توضيح
    مقدار

    تبديل به حروف بزرگ
    1

    تبديل به حروف کوچک
    2

    تبديل اولين کاراکتر هر لغت در رشته به حرف بزرگ
    3

    تبديل به يک رشته يونيکد
    64

    تبديل از رشته يونيکد به کدپيچ پيش فرض سيستم
    128

    توابع رياضی و ويژوال بيسيک مقدمه

    برای نوشتن برنامه های مهندسی ، محاسباتی ، گرافيکی و آماری نياز داريد تا از برخی توابع رياضی استفاده نمائيد . ويژوال بيسيک ۶ دارای مجموعه ای از توابع است که برای انجام محاسبات عددی پيش بينی شده اند . در اين مقاله ابتدا با اين توابع آشنا شده و سپس چگونگی ايجاد ساير توابع رياضی را که در ميان اين مجموعه وجود ندارند خواهيد ديد . در پايان نيز با توابع رياضی موجود در دات نت آشنا می شويد .

    توابع رياضی موجود در ويژوال بيسيک ۶

    - تابع Abs (قدرمطلق) : مقدار بدون علامت يک عدد را برمی گرداند .
    - تابع Atn (آرک تانژانت) : خروجی تابع عددی از نوع double است که برابر زاويه ای است که تانژانت آن عدد ورودی تابع است .
    - تابع Cos ( کسينوس ) : خروجی تابع عددی از نوع double است که برابر کسينوس زاويه ورودی است .
    - تابع Exp (توان نمانی) : خروجی تابع عددی از نوع double است که برابر e به توان ورودی تابع است .
    - تابع Int (تابع کف يا تابع جزء صحيح) : نزديکترين عدد صحيح مساوی يا کوچکتر نسبت به عدد ورودی را برمی گرداند .
    - تابع Log (لگاريتم ) : خروجی تابع عددی از نوع double است که برابر لگاريم طبيعی عدد ورودی است ( لگاريتم بر مبنای عددe يا همان Ln )
    - تابع Round ( گرد کردن ) : خروجی تابع عددی از نوع double است که برابر نزديکترين عدد صحيح به مقدار عدد ورودی است .
    - تابع Sgn (علامت) : خروجی تابع عددی از نوع صحيح است که نشان دهنده علامت عدد ورودی است .
    - تابع Sin (سينوس ) : خروجی تابع عددی از نوع double است که برابر سينوس زاويه ورودی است .
    - تابع Sqr (جذر) : خروجی تابع عددی از نوع double است که برابر ريشه دوم يا جذر عدد ورودی است .
    - تابع Tan (تانژانت) : خروجی تابع عددی از نوع double است که برابر با تانژانت زاويه ورودی ( برحسب راديان ) می باشد .

    نکته : برای محاسبه توان n ام يک عدد ( n می توان صحيح يا اعشاری باشد ) از اپراتور ^ استفاده نمائيد . برای مثال :

    2^5=32

    9^0.5=3

    4.2^3.7=202.31

    چگونگی ايجاد ساير توابع رياضی که در ويژوال بيسيک ۶ وجود ندارند

    جدول زير چگونگی محاسبه ساير توابع رياضی که در ويژوال بيسيک ۶ وجود ندارند را نشان می دهد :

    سکانت
    Sec(X) = 1 / Cos(X)

    کسکانت
    Cosec(X) = 1 / Sin(X)

    کتانژانت
    Cotan(X) = 1 / Tan(X)

    آرک سينوس
    Arcsin(X) = Atn(X / Sqr(1-X * X ))

    آرک کسينوس
    Arccos(X) = Atn(-X / Sqr(1-X * X)) + 2 * Atn(1)

    آرک سکانت
    Arcsec(X) = Atn(X / Sqr(X * X - 1)) + Sgn((X) -1) * (2 * Atn(1))

    آرک کسکانت
    Arccosec(X) = Atn(X / Sqr(X * X - 1)) + (Sgn(X) - 1) * (2 * Atn(1))

    آرک کتانژانت
    Arccotan(X) = Atn(X) + 2 * Atn(1)

    سيونس هيپربوليک
    HSin(X) = (Exp(X) - Exp(-X)) / 2

    کسينوس هيپربوليک
    HCos(X) = (Exp(X) + Exp(-X)) / 2

    تانژانت هيپربوليک
    HTan(X) = (Exp(X) - Exp(-X)) / (Exp(X) + Exp(-X))

    سکانت هيپربوليک
    HSec(X) = 2 / (Exp(X) + Exp(-X))

    کسکانت هيپربوليک
    HCosec(X) = 2 / (Exp(X) - Exp(-X))

    کتانژانت هيپربوليک
    HCotan(X) = (Exp(X) + Exp(-X)) / (Exp(X) - Exp(-X))

    آرک سينوس هيپربوليک
    HArcsin(X) = Log(X + Sqr(X * X + 1))

    آرک کسينوس هيپربوليک
    HArccos(X) = Log(X + Sqr(X * X - 1))

    آرک تانژانت هيپربوليک
    HArctan(X) = Log((1 + X) / (1 - X)) / 2

    آرک سکانت هيپربوليک
    HArcsec(X) = Log((Sqr(1-X * X) + 1) / X)

    آرک کسکانت هيپربوليک
    HArccosec(X) = Log((Sgn(X) * Sqr(X * X + 1) +1) / X)

    آرک کتانژانت هيپربوليک
    HArccotan(X) = Log((X + 1) / (X - 1)) / 2

    لگاريتم بر مبنای N
    LogN(X) = Log(X) / Log(N)



    اعداد π و e در ويژوال بيسيک 6

    برای استفاده از عدد پی و عدد e در برنامه های خود ثوابت زير را تعريف نمائيد :

    Const Pi = 3.14159265358979
    Const e = 2.71828182845904

    همچنين عدد پی را می توان به صورت زير تعريف کرد :

    Pi = 4*Atn(1)

    تبديل راديان / درجه

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

    Degree(x) =x*180/Pi

    برای تبديل يک زاويه که بر حسب درجه بيان شده به راديان آنرا در عدد پی ضرب کرده و سپس بر 180 تقسيم می کنيم :

    Rad(x) =x*Pi/180

    توابع رياضی و VB.Net

    مجموعه توابع رياضی در در ويژوال بيسيک دات نت وجود دارند بسيار قويتر و کاملتر هستند . اين مجموعه توابع در کلاس System.Math موجود می باشند :

    - در کلاس Math دو ثابت به اسم E و PI برای نشان دادن پايه لگاريتم طبيعی و عدد پی وجود دارند .

    - توابع مثلثاتی : Acos ( آرک کسينوس ) ، Asin ( آرک سينوس) ، Atan ( آرک تانژانت) ، Atan2 ( آرک تانژانت خارج قسمت تقسيم ورودی ها ) ، Cos ( کسينوس ) ، Sin ( سينوس ) ، Tan ( تانژانت )

    - توابع عمومی : Abs ( قدرمطلق ) ، BigMul ( حاصلضرب کامل دو عدد 32 بيتی ) ، Ceiling ( تابع سقف ) ، DivRem ( خارج قسمت نقسيم دو عدد ) ، Floor ( تابع کف ) ، IEEERemainder ( باقيمانده نقسيم دو عدد ) ، Max ( ماکزيمم بين دو عدد ) ، Min ( مينيمم بين دو عدد ) ، Round ( تابع گرد کردن ) ، Sign ( تابع علامت ) ، Sqrt ( تابع جذر )

    - توابع هيپربوليک : Cosh ( کسينوس هيپربوليک ) ، Sinh ( سينوس هيپربوليک ) ، Tanh ( تانژانت هيپربوليک )

    - توابع نمايي و لگاريتمی : Exp ( عدد e به توان مقدار ورودی ) ، Log ( لگاريتم ) ، Log10 ( لگاريتم بر پايه 10 ) ، Pow ( تابع توان

    نا له پنداشت که در سینه ی ما جا تنگ است

    رفت و برگشت سراسیمه که دنیا
    تنگ است

  14. کاربرانی که از پست مفید ریپورتر سپاس کرده اند.


اطلاعات موضوع

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

در حال حاضر 1 کاربر در حال مشاهده این موضوع است. (0 کاربران و 1 مهمان ها)

موضوعات مشابه

  1. مقاله: یادگیری الکترونیکی
    توسط آبجی در انجمن بخش مقالات وب و اینترنت
    پاسخ ها: 0
    آخرين نوشته: 21st February 2010, 10:59 PM
  2. معرفی: هيئت هاي استانداردهاي بين المللي آموزش حسابداري
    توسط پديده در انجمن اصول حسابداري و استاندارد ها
    پاسخ ها: 0
    آخرين نوشته: 21st February 2010, 05:01 PM
  3. مقاله: آموزش و پرورش در اسپانیا
    توسط *مینا* در انجمن علوم تربیتی
    پاسخ ها: 0
    آخرين نوشته: 20th November 2009, 10:49 PM
  4. معرفی: بزرگترين دانشگاه های الکترونیکی جهان
    توسط engeneer_19 در انجمن تازه های برق
    پاسخ ها: 0
    آخرين نوشته: 8th August 2009, 10:23 PM

کلمات کلیدی این موضوع

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •