صفحه 3 از 4 نخستنخست 1234 آخرینآخرین
نمایش نتایج: از شماره 21 تا 30 , از مجموع 32

موضوع: Visual Basic

  1. #21
    مدیر بازنشسته
    تاریخ عضویت
    2008/10/14
    سن
    36
    نوشته ها
    3,180

    Post کنترل Internet Transfer - قسمت دوم

    کنترل 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

  2. #22
    مدیر بازنشسته
    تاریخ عضویت
    2008/10/14
    سن
    36
    نوشته ها
    3,180

    Post کنترل Internet Transfer - قسمت اول

    کنترل 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(“www.microsoft.com”,icString)x
    مثال 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 http://www.microsoft.com,”GET”x
    ساير خواص کنترلIT :
    - AccessType : نوع دسترسي کنترل IT به اينترنت را مشخص مي کند و سه مقدار مي تواند بگيرد :
    icUseDefault : استفاده از تنظيمات رجيستري براي دسترسي به اينترنت
    icDirect : اتصال مستقيم کنترل IT به اينترنت
    icNamedProxy : اتصال به اينترنت توسط پروکسي
    - Document : نام صفحه پيش فرض که در متد Execute از آن استفاده مي شود . اگر به متد Execute پارامتر url را ندهيد از اين صفحه پيش فرض استفاده مي کند .
    - Password : کلمه رمز عبور کامپيوتر ميزبان FTP
    - Procotol : نوع پروتکل مورد استفاده در متد Execute را مشخص مي کند و 5 مقدار مي تواند بگيرد :
    icUnknown : نامعلوم
    icDefault : پروتکل پيش فرض
    icFTP : پروتکل FTP
    icHTTP : پروتکل HTTP
    icHTTP : پروتکل حفاظت شده HTTP
    - Proxy : نام ميزبان پروکسي
    - 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 را نيز شروع کرده ام ؟ علت اش اينست که تصميم دارم پس از پايان يافتن اين دو مبحث ، روش ساخت يک بازي دوبعدي چند نفره تحت شبکه را برايتان آموزش دهم .

  3. #23
    مدیر بازنشسته
    تاریخ عضویت
    2008/10/14
    سن
    36
    نوشته ها
    3,180

    Post آشنايي با BitBlt

    آشنايي با 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
    End Sub

  4. #24
    مدیر بازنشسته
    تاریخ عضویت
    2008/10/14
    سن
    36
    نوشته ها
    3,180

    Post کنترل Web Browser – ساخت مرورگر صفحات وب

    کنترل 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 مربوط به کليک دکمه بنويسيد :

    WebBrowser.Navigate textbox.text

  5. #25
    مدیر بازنشسته
    تاریخ عضویت
    2008/10/14
    سن
    36
    نوشته ها
    3,180

    Post ايجاد کلاسی برای کار با فايلهای Xml

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

  6. #26
    مدیر بازنشسته
    تاریخ عضویت
    2008/10/14
    سن
    36
    نوشته ها
    3,180

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

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

    مقدمه :

    ساختارهاي داده اي از نظر تعداد اعضا به دو دسته استاتيک و ديناميک تقسيم مي شوند . ساختارهاي استاتيک مثل آرايه هاي يک بعدي و آرايه هاي دو بعدي ، تعداد اعضاي آنها در زمان طراحي برنامه مشخص مي شود و در طول اجراي برنامه ثابت است اما تعداد اعضاي ساختارهاي داده اي ديناميک در طول اجراي برنامه تغيير مي کند . ليست پيوندي ( 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 ) و نشان دهنده انتهاي ساختار داده است .

  7. #27
    مدیر بازنشسته
    تاریخ عضویت
    2008/10/14
    سن
    36
    نوشته ها
    3,180

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

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

    ليست پيوندي

    همانطور که گفته شد ليست پيوندي مجموعه اي از يکسري داده است که اين داده ها از نوع اشيا خودارجاعي هستند . ( هر شي خودارجاعي داراي يک متغير نوع 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

  8. #28
    مدیر بازنشسته
    تاریخ عضویت
    2008/10/14
    سن
    36
    نوشته ها
    3,180

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

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

    مثالی از استفاده از کلاسهای ليست پيوندی :
    ابتدا کلاسهايي که در جلسه قبل معرفی شد را به پروژه تان اضافه کنيد . سپس در بخش کدنويسی فرمتان ، ابتدا يک شی از نوع کلاس 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 از بالاي پشته گره اي را حذف کرده و مقدار داده آن را بر مي گرداند .

  9. #29
    مدیر بازنشسته
    تاریخ عضویت
    2008/10/14
    سن
    36
    نوشته ها
    3,180

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

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

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

  10. #30
    مدیر بازنشسته
    تاریخ عضویت
    2008/10/14
    سن
    36
    نوشته ها
    3,180

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

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

    صف :
    صف نوعي ساختار داده اي است که گره ها از ابتداي صف ( سر صف 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 گفته مي شود .
    درختهاي جستجوي باينري درخت هايي هستند که در آنها مقدار فرزند چپ هر گره کمتر از گره پدر و مقدار فرزند سمت راست هر گره بيشتر از گره پدر مي باشد .

صفحه 3 از 4 نخستنخست 1234 آخرینآخرین

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

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