تبلیغات :
آکوستیک ، فوم شانه تخم مرغی، صداگیر ماینر ، یونولیت
دستگاه جوجه کشی حرفه ای
فروش آنلاین لباس کودک
خرید فالوور ایرانی
خرید فالوور اینستاگرام
خرید ممبر تلگرام

[ + افزودن آگهی متنی جدید ]




صفحه 7 از 30 اولاول ... 3456789101117 ... آخرآخر
نمايش نتايج 61 به 70 از 299

نام تاپيک: آموزش گام به گام ویژوال بیسیک6.0

  1. #61
    آخر فروم باز تکنیک برتر's Avatar
    تاريخ عضويت
    Sep 2005
    پست ها
    1,705

    پيش فرض

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

    برای ايجاد درختهای جستجوی باينری در ويژوال بيسيک نياز به ايجاد دو کلاس داريم :
    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

  2. #62
    آخر فروم باز تکنیک برتر's Avatar
    تاريخ عضويت
    Sep 2005
    پست ها
    1,705

    پيش فرض

    ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 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 مي باشد .

  3. #63
    آخر فروم باز تکنیک برتر's Avatar
    تاريخ عضويت
    Sep 2005
    پست ها
    1,705

    پيش فرض

    ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 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 مي باشد .

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


  5. #64
    آخر فروم باز تکنیک برتر's Avatar
    تاريخ عضويت
    Sep 2005
    پست ها
    1,705

    پيش فرض

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

    بعلت عدم وجود اشاره گر در ويژوال بيسيک عمليات کار با فايلها در آن نسبتاً ساده می باشد .
    بطور کلی فايلها بر دو نوع هستند :
    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

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


  7. #65
    آخر فروم باز تکنیک برتر's Avatar
    تاريخ عضويت
    Sep 2005
    پست ها
    1,705

    پيش فرض

    ايجاد کلاسی برای کار با فايلهای 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 را ذخيره کنيد .

  8. #66
    آخر فروم باز تکنیک برتر's Avatar
    تاريخ عضويت
    Sep 2005
    پست ها
    1,705

    پيش فرض

    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
    Last edited by تکنیک برتر; 26-12-2005 at 01:58.

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


  10. #67
    آخر فروم باز تکنیک برتر's Avatar
    تاريخ عضويت
    Sep 2005
    پست ها
    1,705

    پيش فرض

    مديريت رشته ها در ويژوال بيسيک ۶
    توابعی که برای مديريت رشته ها در وی بی می توانيد از آنها استفاده کنيد عبارتند از :
    تابع 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



    مثال :

  11. #68
    آخر فروم باز تکنیک برتر's Avatar
    تاريخ عضويت
    Sep 2005
    پست ها
    1,705

    پيش فرض

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

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

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

    - تابع 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 ( تابع توان )

  12. #69
    آخر فروم باز تکنیک برتر's Avatar
    تاريخ عضويت
    Sep 2005
    پست ها
    1,705

    پيش فرض

    آشنايي با شی پرينتر در ويژوال بيسيک ۶
    مقدمه
    شی پرينتر ، شیي است که پرينتر پيش فرض سيستم را کنترل می کند . استفاده از شی پرينتر در ويژوال بيسيک 6 مانند کار با ساير اشيا است و بايستی از خواص و متدهای آن استفاده کرد . در ادامه با برخی از اين خواص و متدها آشنا خواهيد شد .

    چاپ متن توسط شی پرينتر

    برای چاپ متن توسط شی پرينتر کافيست خواص CurrentX و CurrentY که محل قرار گرفتن کرسر می باشد را تنظيم نوده و سپس با استفاده از متد Print متن مورد نظر را چاپ نموده و در پايان با استفاده از متد EndDoc صفحه چاپی را از پرينتر بيرون بدهيم . مثال :


    Printer.CurrentX=150
    Printer.CurrentY=200
    Printer.Print "Visual Basic Printer Object Test"
    Printer.EndDoc


    در مثال فوق فرض شده که ScaleMode برابر Pixel قرار داده شده است . توجه داشته باشيد که تا قبل از اجرای متد EndDoc عمل چاپ انجام نمی شود و فقط بعد از اين متد است که چاپ انجام شده و کاغذ بيرون می آيد .

    اگر پس از يک دستور Print ، دستور Print ديگری را استفاده کنيم متن روی خط بعدی چاپ خواهد شد . اگر بخواهيم متن بلافاصله بعد از متن اول چاپ شود بايد بعد از دستور Print اول از علامت ; استفاده کنيم .

    نکته : برای کنترل دقيق محل چاپ از CurrentX و CurrentY استفاده نمائيد .

    چاپ گرافيک توسط شی پرينتر

    به 4 روش می توان اشکال گرافيکی را توسط شی پرينتر چاپ کنيد :
    1 – چاپ دايره : با استفاده از متد Circle می توان يک دايره ، قوس و يا بيضی را در صفحه چاپ کرد . فرمت کلی اين متد بصورت زير است :

    Circle (x,y),radius,[color],[start],[end],[aspect]

    که x و y مختصات مرکز دايره و radius شعاع آن می باشد .
    پارامترهای color ، start ، end و aspect اختياری هستند و بترتيب رنگ ، محل شروع قوس ، محل خاتمه قوس و نسبت شعاع بيضی را نشان می دهند .

    2 – چاپ خط : با استفاده از متد Line می توان يک خط و مستطيل را در صفحه چاپ کرد . فرمت کلی اين متد بصورت زير است :

    Line (x1,y1)-(x2,y2),[color],[B[F]]

    که x1 و y1 مختصات شروع خط ( يا مستطيل ) و x2 و y2 مختصات انتهای خط ( يا مستطيل ) هستند .
    پارامتر color اختياری بوده و رنگ خط ( يا مستتطيل ) را نشان می دهد .
    پارامتر B اختياری بوده و نشان می دهد يک مستيل رسم شود .
    پارامتر F اختياری بوده و بهمراه B می آيد و نشان می دهد يک مستطيل توپر رسم شود .

    3 – چاپ نقطه : با استفاده از متد PSet می توان نقطه ای روی صفحه چاپ کرد و فرمت کلی آن بصورت زير است :

    PSet (x,y),[color]

    که x و y مختصات نقطه می باشند .
    پارامتر color اختياری بوده و رنگ نقطه را نشان می دهد .

    4 – چاپ تصوير : با استفاده از متد PaintPicture می توان محتويات يک فايل گرافيکی را چاپ کرد . فرمت کلی اين متد بصورت زير است :

    Printer.PaintPicture picture, x1, y1, [width1], [height1], [x2], [y2], [width2], [height2], [opcode]

    x1 و y1 مختصات قرارگرفتن تصوير در صفحه بوده و picture يک شی از کلاس IPictureDisp است . اين شی را می توان از يک PictureBox يا از خاصيت Picture فرم گرفت و يا از دستور LoadPicture استفاده کرد .

    مثال 1 :


    Printer.PaintPicture Picture1.Picture, 100, 100

    مثال 2 :

    PaintPicture LoadPicture("C:\sample.jpg"), 100, 100

    width1 و height1 طول و عرض تصوير چاپی می باشند . x2 و y2 نيز بهمراه width2 و height2 می توانند ميزان برش از تصوير اصلی برای چاپ را مشخص کنند .

    ساير خواص مهم شی پرينتر

    ColorMode : اگر پرينتر رنگی باشد ، رنگی يا تک رنگ بودن چاپ را تعيين می کند .
    Copies : تعداد چاپ را مشخص می کند .
    Font : نوع فونت چاپ متن را مشخص می کند .
    FontSize : سايز فونت چاپ متن را مشخص می کند .
    PrintQuality : کيفيت چاپ را مشخص می کند .

    ساير متدهای مهم شی پرينتر

    KillDoc : پرينت در حال چاپ را از صف چاپ حذف می کند .
    NewPage : صفحه جاری را به پايان برده و صفحه جديدی را برای چاپ آماده می کند .
    Scale : سيستم مختصات کاربر را تعيين می کند .
    TextHeight : ارتفاع متن پس از چاپ شدن در مختصات Scale را تعيين می کند .
    TextWidth : عرض متن پس از چاپ شدن در مختصات Scale را تعيين می کند

  13. #70
    آخر فروم باز تکنیک برتر's Avatar
    تاريخ عضويت
    Sep 2005
    پست ها
    1,705

    پيش فرض

    رويدادها در ويژوال بيسيک
    براي هر عملي که ميخواهيم کاربر در برنامه ما انجام دهد مي بايست در هر رويداد کد خاصي را بنويسيم تا نسبت به رفتار خاصي پاسخگو باشيم اين رويدادها تعيين ميکنند که برنامه ما نسبت به چه اعمالي حساس باشد کليک کردن يا فشردن دکمه اي خاص.

    عمل کليک : تو مثالهاي قبلي وقتي رو Command1 کليک ميکرديم يه عملي انجام ميشد چون ما تو رويداد کليک Command1 اون کدمون رو نوشتيم حالا اگه بخواهيم رويدادهاي ديگه اي هم هستن مثلا KeyDown ويا MouseMove و ... همه اينها بسته به نوعشون در مقابل رفتار کاربر عمل بخصوصي رو انجام ميدن حالا چند تا کد مينويسيم که با رويدادهاي مختلف آشنا بشيم :

    MouseMove:زماني که ماوس رو باتن حرکت کنه Caption باتن عوض ميشه.

    Private Sub Command1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Command1.Caption = "Mosee Move !"
    End Sub


    MouseDown: اگر دکمه فشار داده شود (هنوز دستمان روي دکمه ماوس است دکمه بالا نيامده)

    Private Sub Command1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Command1.Caption = "Mosee Down !"
    End Sub


    MouseUp : دکمه ماوس فشار داده شده و به سمت بالا رها مي شود بعد از عمل MouseDown

    Private Sub Command1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Command1.Caption = "Mosee Up !"
    End Sub


    رويدادهاي KeyDown وKeyPress وKeyUp هم مثل همين ها هستند تنها تفاوت چون نياز به يک دستور شرطي دارند(با يک دستور شرطي مشخص ميکنيم اگر کليد فشرده شده مثلا Ctrl بود چه عملي انجام شود) بعدا که دستورات شرطي رسيديم ميگم .DragDrop و DragOver هم همچنين.+

    ولي حالا ميخواهيم يه برنامه ساده بنويسيم که از کنترل Label استفاده مي شه . يه کنترل ليبل از سمت چپ انتخاب کنين و بندازين تو صفحه فرمتون ! برنامه ما اين کار رو ميکنه -[وقتي ماوس رو ليیل ميره رنگ اون عوض ميشه و Bold هم ميشه مثل همين لينک ها و وقتي هم ماوس رو از روش برمي داريم به حالت اول بر ميگرده ]- خب اول براي رويداد MouseMove اينها رو مينويسيم:

    Private Sub Label1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Label1.ForeColor = &HFF&
    Label1.FontBold = True
    End Sub


    و در رويداد Form_MouseMove هم اينها رو مينويسيم(همين ها رو کپي و پيست کنين)

    Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Label1.ForeColor = &H80000007
    Label1.FontBold = False
    End Sub


    حالا برنامه رو اجرا کنين ماوس رو روي ليبل بذارين و از روش بردارين -[ ...اينه ! ]

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


Thread Information

Users Browsing this Thread

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

User Tag List

قوانين ايجاد تاپيک در انجمن

  • شما نمی توانید تاپیک ایحاد کنید
  • شما نمی توانید پاسخی ارسال کنید
  • شما نمی توانید فایل پیوست کنید
  • شما نمی توانید پاسخ خود را ویرایش کنید
  •