| | #21 (permalink) |
| همکار انجمن ها ![]() | مقدمه : کنترل WinSock نسبت به تمام کنترلهاي اينترنت در سطح پايينتري قرار دارد . اين کنترل امکان ايجاد سرويسهاي شبکه اي مبتني بر پروتکلهاي TCP و UDP را مهيا مي کند . بعبارت ديگر توسط اين کنترل مي توان برنامه هاي کاربردي Client/Server ( سرويس گيرنده / سرويس دهنده ) ايجاد و با استفاده از پروتکل TCP و يا UDP بين آنها ارتباط برقرار نمود . با تنظيم خصوصيات و فراخواني متدهاي اين کنترل مي توانيد به راحتي به يک کامپيوتر راه دور متصل شويد و داده ها را در هر دو جهت جابجا نمائيد . نمونه کاربرهايي که مي توان با اين کنترل ايجاد نمود : Client-server chat ، Mail client ، Mail server ، Proxy Server ، Network Game ، Port Scanner ، پياده سازي الگوريتم هاي موازي و … مباني TCP : پروتکل کنترل اينترنت ( Transfer Control Protocol ) اجازه مي دهد يک اتصال ( Connection ) را از طريق سوکت ( socket ) به يک کامپيوتر راه دور ( Remote Computer ) ساخته و استفاده کنيد . با استفاده از اين اتصال ، هر دو کامپيوتر مي توانند داده ها را بين خودشان انتقال دهند . برقراري ارتباط از طريق TCP همانند صحبت کردن با تلفن است که بايد حتماً اتصالي بين دو کامپيوتر صورت گيرد تا بتوانند با هم ارتباط برقرار کنند . اگر يک برنامه Client مي سازيد بايستي بدانيد که نام يا آدرس IP کامپيوتر Server چيست ( Remote Host IP ) و همچنين از طريق چه پورتي مي توانيد به آن متصل شويد ( Remote Port ) . حال بايستي به آن پورت Connect کنيد . همچنين اگر يک برنامه Server مي سازيد بايستي پورتي را که روي آن به درخواستها گوش مي دهيد مشخص کنيد ( LocalPort ) و سپس به پورت گوش دهيد ( Listen ) . زمانيکه يک کامپيوتر Client تقاضاي يک اتصال را مي دهد Server اين درخواست را Accept مي کند . زمانيکه يک اتصال ساخته مي شود ، هر دو کامپيوتر مي توانند داده را فرستاده و دريافت کنند . مباني UDP : پروتکل ديتاگرام کاربر ( User Datagram Protocol ) پروتکلي بدون اتصال ( Connectionless ) است . برخلاف TCP ، کامپيوترها نياز به برپا کردن يک اتصال ندارند بنابراين يک برنامه مي تواند يک client و يا يک server باشد . برقراري ارتباط در UDP شبيه ارسال نامه از طريق پست است . براي انتقال داده توسط UDP ابتدا بايد Local Port کامپيوتر Client تنظيم گردد . کامپيوتر Server تنها بايستي RemoteHost را برابر آدرس کامپيوتر Client قرار دهد و همچنين Remote Port را همان Local Port کامپيوتر Client قرار دهد . سپس دو کامپيوتر مي توانند داده ها را بين خود جابجا کنند . استفاده از کنترل WinSock : 1 – انتخاب پروتکل: در زمان استفاده از کنترل WinSock اولين کاري که بايد انجام دهيد انتخاب يکي از پروتکلهاي TCP يا UDP است . طبيعت برنامه اي که شما مي سازيد نوع پروتکلي را که بايد استفاده کنيد مشخص مي کند . چند سوال زير به شما کمک مي کند که پروتکل مورد نيازتان را انتخاب کنيد : - آيا برنامه شما در زمانيکه داده فرستاده مي شود يا دريافت مي شود نياز به اطلاعاتي از طرف Server يا Client دارد ؟ اگر چنين است بايستي يک اتصال TCP قبل از ارسال يا دريافت داده ايجاد شود . - آيا داده بسيار بزرگ است ( مثل تصوير يا فايلهاي صوتي ) ؟ زمانيکه يک اتصال TCP ساخته مي شود پروتکل TCP اتصال را باقي نگه مي دارد و درستي ارسال داده تضمين شده است . اين اتصال در هر حال به منابع محاسباتي بيشتري نياز دارد و بنابراين پرهزينه تر است . - آيا داده متناوب ارسال مي شود يا در يک نشست ( Session ) ارسال خواهد شد ؟ براي مثال اگر شما يک برنامه مي سازيد که کامپترهاي مشخصي را در يک زمان خاص از انجام شدن عملياتي مطلع مي کند پروتکل UDP مناسب تر است . پروتکل UDP همچنين براي ارسال مقادير کوچک داده اي مناست تر مي باشد . 2 – تنظيم پروتکل : براي تنظيم پروتکلي که مي خواهيد در برنامه تان از آن استفاده کنيد در زمان طراحي برنامه خاصيت Protocol کنترل WinSock را برابر sckTCPProtocol و يا sckUDPProtocol قرار دهيد . همچنين مي توانيد پروتکل خود را توسط کد زير تنظيم کنيد : WinSock.Protocol=sckTCPProtocol 3 – مشخص کردن نام کامپيوتان : براي اتصال به کامپيوتر راه دور بايستي آدرس IP و يا نام کامپوتر را بدانيد . نام کامپيوتر در Control Panel/Network/Identification موجود است . در صورتيکه مي خواهيد دو برنامه Client و Server خود را روي يک کامپيوتر تست کنيد از آدرس IP 127.0.0.1 براي هر دو استفاده کنيد اما اگر دو برنامه را روي دو کامپيوتر مجزا در شبکه قرار داده ايد با اجراي دستور ipconfig در DOS Prompt مي توانيد آدرس IP کامپيوتر ها را بدست آوريد . 4 – ايجاد اتصال TCP : در زمان ساخت برنامه اي که از پروتکل TCP استفاده مي کند ابتدا بايد تصميم بگيريد که اين برنامه Client است يا Server . براي ساخت يک برنامه Server بايستي روي يک پورت خاص Listen کنيد . زمانيکه Client تقاضاي يک اتصال را مي دهد ، برنامه Server مي تواند آنرا Accept کند و بنابراين اتصال کامل شده است . حال Client و Server مي توانند با هم ارتباط داشته باشند . مراحل زير ساخت يک سرور چت ساده بر مبناي TCP را نشان مي دهد : - از منوي Project گزينه Components را انتخاب کنيد و در ليست Component ها مورد Microsoft WinSock 6.0 را انتخاب کنيد . - يک کنترل WinSock در فرم خود قرار دهيد و نام آنرا tcpserver بگذاريد - دو textbox با نامهاي txtSendData و txtReceiveData و نيز يک دکمه در فرم قرار دهيد . - کد زير را در رويداد Form_Load بنويسيد : Tcpserver.LocalPort=1000 tcpserver.Listen - زمانيکه درخواستي از طرف Client مي آيد رويداد ConnectionRequest اجرا مي شود . در اين رويداد ابتدا بايد چک کنيد که حالت کنترل بسته باشد . اگر چنين نيست اتصال را قبل از پذيرفتن اتصال جديد ببنديد . سپس تقاضا را بر اساس پارامتر requestID مي پذيريم : Private Sub tcpserver_ConnectionRequest(ByVal requestID As Long) If tcpserver.State <> sckClosed Then tcpserver.Close tcpserver.Accept requestID End Sub - حال اتصال بين Client و Server برقرار شده است . کد زير را براي event مربوط به کليک دکمه Send بنويسيد : Tcpserver.SendData txtSendData.text - اگر داده اي از طرف Client بيايد رويداد DataArrival اجرا مي شود . کد زير را براي اين رويداد بنويسيد : Private Sub tcpserver_DataArrival(ByVal bytesTotal As Long) Dim strData As String tcpserver.GetData strData txtReceiveData.Text = strData End Sub - کد زير را براي رويداد Form_Unload بنويسيد : Tcpserver.Close مراحل ساخت يک TCP Client بصورت زير است : - يک کنترل WinSock در فرم قرار دهيد و نام آنرا tcpclient بگذاريد . - دو textbox با نامهاي txtsend و txtreceive و نيز يک دکمه با نام sendدر فرم قرار دهيد . - يک دکمه با نام connect در فرم قرار دهيد . - کد زير را براي متد Form_Load بنويسيد : tcpclient.RemoteHost=”yourservername”x tcpclient.RemotePort=1000 - کد زير را براي رويداد کليک شدن دکمه connect بنويسيد : tcpclient.Connect - کد زير را براي رويداد کليک شدن دکمه send بنويسيد : tctclient.SendData txtsend.Text - کد زير را براي رويداد DataArrival بنويسيد : Private Sub tcpclient_DataArrival(ByVal bytesTotal As Long) Dim strData As String tcpclient.GetData strData txtreceive.Text = strData End Sub - کد زير را باري رويداد Form_Unload بنويسيد : Tcpclient.Close کدهاي فوق يک سيستم Client-Server ساده را نشان مي دهد . فايل exe هر دو برنامه را بسازيد و آنها را اجرا کنيد تا بتوانيد سيستم خود را تست کنيد . 5 – پذيرفتن بيش از يک تقاضاي اتصال : Server اي که در بالا ساخته شد تنها مي تواند تقاضاي يک اتصال را بپذيرد . با استفاده از ايجاد يک آرايه از کنترل WinSock مي توان چندين تقاضاي اتصال را پذيرفت . براي اينکار کافي است يک کپي ( instance ) از کنترل بسازيم ( با تنظيم خاصيت Index ) و متد Accept را براي instance جديد بکار ببريم . فرض کنيد يک کنترل WinSock با نام sckServer در فرم داريم که خاصيت Index آنرا صفر قرار داده ايم . همچنين يک متغير intMax از نوع Long تعريف مي کنيم که تعداد اتصالات همزمان به Server را نگه مي دارد . در event مربوط به Form_Load کد زير را بنويسيد : intMax=0 sckServer(0).LocalPort=1000 sckServer(0).Listen هر بار که تقاضاي يک اتصال مي رسد کد ابتدا تست مي کند که مقدار Index چقدر است . اگر مقدار Index صفر باشد متغير intMax يکي افزايش مي يابد و از intMax براي ساخت يک instance جديد از کنترل استفاده مي شود . حال از اين instance براي پذيرفتن تقاضاي اتصال استفاده مي گردد . براي اينکار کد زير را براي رويداد ConnectionRequest بنويسيد : Private Sub sckServer_ConnectionRequest(Index As Integer, ByVal requestID As Long) If Index = 0 Then intmax = intmax + 1 Load sckServer(intmax)x sckServer(intmax).LocalPort = 0 sckServer(Index).Accept requestID End If End Sub 6 – ايجاد اتصال UDP : ساخت يک برنامه UDP ساده تر از برنامه هاي TCP است زيرا پروتکل UDP به اتصال نياز ندارد . در برنامه TCP بالا يک کنترل WinSock بايستي حتماً Listen مي کرد و يک کنترل ديگر يک اتصال را توسط متد Connect ايجاد نمود . در عوض پروتکل UDP نيازي به اتصال ندارد . براي ارسال داده بين دو کنترل WinSock سه مرحله بايستي انجام شود : - پارامتر RemoteHost برابر نام کامپيوتر مقابل است . - پارامتر RemotePort برابر پارامتر LocalPort کامپيوتر مقابل - استفاده از متد Bind براي مشخص کردن LocalPort چون هر دو کامپيوتر از نظر ارتباط مساوي هستند ، اين نوع برنامه ها را Peer-to-Peer گويند . براي نمونه از کد زير براي ساخت يک برنامه chat استفاده مي کنيم : - يک کنترل WinSock در فرم قرار دهيد و نام آنرا udppeerA بگذاريد . - خاصيت Protocol آنرا UDPProtocol قرار دهيد . - دو textbox با نامهاي txtsend و txtreceive و نيز يک دکمه در فرم قرار دهيد . - کد زير را براي متد Form_Load بنويسيد : udppeerA.RemoteHost=”nameofpeerB”x udppeerA.RemotePort=1001 udppeerA.Bind 1002 - کد زير را براي event مربوط به کليک دکمه بنويسيد : udppeerA.SendData txtsend.text - کد زير را براي رويداد DataArrival بنويسيد : Dim strData as String udppeerA.GetData strData txtreceive.Text=strData براي ساخت UDP peerB مشابه مراحل بالا عمل کنيد فقط خاصيت RemoteHost آنرا نام کامپيوتر PeerA و خاصيت RemotePort آنرا 1002 و خاصيت Bind آنرا 1001 قرار دهيد |
| | |
| | |
| | #22 (permalink) |
| همکار انجمن ها ![]() | مقدمه : برای آشنايي با مبانی شبکه های TCP/IP به بحث مروری بر TCP/IP مراجعه کنيد . معرفی : کتابخانه WinPcap يک معماری برای استخراج Packet های TCP/IP و آناليز شبکه در محيطهای ۳۲ بيتی ويندوز می باشد . اين کتابخانه شامل سه بخش است : ۱ - يک ----- Packet در سطح هسته سيستم عامل ( Kernel ) ۲ - يک کتابخانه dll سطح پايين ( low-level ) با نام packet.dll ۳ - يک کتابخانه مستقل از سيستم عامل و سطح بالا ( high-level ) با نام wpcap.dll ----- packet يک درايور دستگاه ( device driver ) است که به ويندوزهای ۹۵ ، ۹۸ ، ME ، NT و ۲۰۰۰ قابليت استخراج و capture کردن و نيز ارسال داده خام ( raw data ) از يک کارت شبکه را می دهد . همچنين اين امکان را دارد که packet های capture شده را در يک بافر ذخيره کند و يا آنها را ----- نمايد . packet.dll يک API است که بمنظور دسترسی مستقيم به عملکرد درايور packet استفاده می شود . بنابراين packet.dll يک واسط برنامه نويسی مستقل از سیستم عامل های مايکروسافت را مهيا می کند . Wpcap.dll مجموعه ای از ابزارهای سطح بالای اصلی برای capture را مهيا می کند که اين توابع با کتابخانه libpcap ( کتابخانه capture در سيستم عامل UNIX ) سازگار می باشند . اين توابع اجازه capture کردن packet ها را با روشی مستقل از سخت افزار شبکه و مستقل از سيستم عامل مهيا می کنند . دريافت کتابخانه WinPcap : نسخه WinPcap 2.2 : برای دريافت برنامه auto-installer ( شامل درايور و DLL های مربوطه ) برای سيستم هایWindows 95/98/ME/NT/2000 به آدرس زير مراجعه کنيد : WinPcap auto-installer (driver +DLLs) برای دريافت بسته توسعه دهنده اين کتابخانه که شامل برنامه های نمونه ايجاد شده توسط packet capture driver و packet.dll و libpcap است ، به آدرس زير مراجعه کنيد : Developer's pack برای دريافت source code کتابخانه WinPcap به آدرس زير مراجعه کنيد : WinPcap source code |
| | |
| | #23 (permalink) |
| همکار انجمن ها ![]() | مقدمه PacketX مجموعه ای از کلاسهای اکتيو ايکس است که امکانات WinPcap را در ويژوال بيسيک و هر زبان برنامه نويسی ديگری که از تکنولوژی Microsoft ActiveX پشتيبانی کند مهيا می کند . بطور خلاصه PacketX از WinPcap برای capture کردن و ----- کردن packet های شبکه استفاده می کند . علاوه بر capture استاندارد ، شما می توانيد از PacketX برای گردآوری اطلاعات ترافيک شبکه و ارسال raw packet استفاده کنيد . دريافت PacketX برای دريافت نسخه 1.3 اين کتابخانه به آدرس زير مراجعه کنيد : PacketX 1.3 Download قبل از استفاده از PacketX بايستی WinPcap 2.3 را که آدرس آن در بخش قبل گفته شد دريافت و نصب نمائيد . استفاده از PacketX با يک مثال ساده سعی می کنم روش استفاده از اين کتابخانه را به شما آموزش دهم . پس از نصب PacketX وارد محيط ويژوال بيسيک شده و از منوی Project مورد Components را انتخاب کنيد . سپس مورد PacketX Type Library را انتخاب کنيد تا به ToolBar اضافه شود . اين ActiveX را در فرمتان قرار دهيد و سپس در قسمت properties آن روی Custom کليک نموده و نوع آداپتور را مشخص نمائيد . پس از انتخاب آداپتور با کليک روی دکمه Edit می توانيد اطلاعاتی از قبيل مد کاری و ساير بافر و نوع فيلترينگ را مشخص نمائيد . نام اين شی را نيز PacketX1 می گذاريم . در فرمتان دو دکمه به نامهای Start و Stop قرار دهيد . همچنين يک listBox با نام IPList در فرمتان قرار دهيد . در کد مربوط به Form_load عبارت زير را بنويسيد : PacketX1.Adapter.BPf i l. t e r = "port 80"x عبارت فوق مشخص می کند که می خواهيم packet های پورت 80 را capture کنيم . کد زير را برای event مربوط به کليک شدن دکمه Start بنويسيد : PacketX1.start کد زير را برای متد OnPacket مربوط به PacketX1 بنويسيد : Private Sub PacketX1_OnPacket(ByVal pPacket As PACKETXLibCtl.IPktXPacket)x IPList.AddItem (pPacket.DestIpAddress)x End Sub کد فوق آدرس IP مقصد packet ها را به يک ليست اضافه می کند . شما می توانيد اطلاعات ديگری از قبيل داده موجود در packet ، سايز داده ، آدرس مبدا ، تاريخ ارسال داده و غيره را استخراج کنيد . کد زير را برای event مربوط به کليک شدن دکمه Stop بنويسيد : PacketX1.stop برای اينکه بتوانيد در يک مدت خاص وضعيت دريافت و ارسال packet را بدست آوريد بايد ابتدا توسط دستور زير مد آداپتور را در حالت Statistic قرار دهيد : PacketX1.Adapter.Mode=PktXModeStatistics PacketX1.Adapter.ReadTimeout=2000 '// 2 sec سپس PacketX1 را start نموده و توسط متد OnStatistics اطلاعات مربوطه را استخراج کنيد . اطلاعات بيشتر برای مشاهده اطلاعات کامل در مورد ساختار PacketX و ماژولهای آن به آدرس زير مراجعه کنيد : PacketX Documentation |
| | |
| | #24 (permalink) |
| همکار انجمن ها ![]() | رجيستري چيست ؟ سيستم عامل ويندوز تنظيمات سخت افزاري و نرم افزاري خود را بطور مرکزي در يک بانک اطلاعاتي با ساختار سلسله مراتبي ذخيره مي کند که رجيستري نام دارد . رجيستري جايگزيني براي بسياري از فايلهاي پيکربندي INI ، SYS و COM است که در نسخه هاي اوليه ويندوز موجود بود . رجيستري ، سيستم عامل را با مهيا کردن اطلاعات موردنيز براي اجراي برنامه ها و load شدن component ها ، کنترل مي کند . رجيستري شامل انواع مختلفي از اطلاعات مي باشد مثل : - اطلاعات سخت افزارهاي نصب شده روي سيستم - اطلاعات درايورهاي نصب شده روي سيستم - اطلاعات برنامه هاي نصب شده روي سيستم - اطلاعات پروتکلهاي شبکه اي مورد استفاده در سيستم ساختار رجيستري شامل چندين مجموعه رکورد است که داده هاي اين رکوردها توسط بسياري از برنامه ها و اجزاي سيستم عامل خوانده و يا نوشته مي شود . اجزاي رجيستري اجزاي تشکيل دهنده رجيستري عبارتند از : 1 – subtree : Subtree ها همانند folder هاي موجود در ريشه يک درايو هارد هستند . رجستری ويندوز داراي پنج subtree مي باشد : - HKEY_LOCAL_MACHINE : شامل تمام داده هاي پيکربندي براي کامپيوتر مي باشد و شامل 5 key است :Hardware ، SAM ، Security ، Software و System - HKEY_USERS : شامل داده هاي مربوط به تنظيمات سيستم عامل براي هر user است مثل تنظيمات desktop و محيط ويندوز - HKEY_CURRENT_USER : شامل داده هاي کاربر فعلي سيستم - HKEY_CLASSES_ROOT : شامل اطلاعات پيکربندي نرم افزار است مثل داده هاي OLE و داده هاي کلاسهاي متناظر با فايل - HKEY_CURRENT_CONFIG : شامل اطلاعات مورد نياز براي تنظيمات داريورهاي سخت افزاري و غيره 2 – Key : key ها همانند folder ها و subfolder هاي روي هارد هستند . هر key متناظر با object هاي نرم افزاري يا سخت افزاري مي باشد . subkey ها key هايي هستند که درون يکسري key قراردارند . 3 – Entry : هر key داراي يک يا چند entry است . هر entry داراي سه بخش مي باشد : - نام Name - نوع داده اي Data Type : مقدار هر entry يکي از انواع داده هاي زير است : REG_DWORD ، REG_SZ ، REG_EXPAND_SZ ، REG_BINARY ، REG_MULTI_SZ ، REG_FULL_RESOURCE_DESCRIPTOT - مقدار Value نکته 1 : براي مشاهده رجيستري و اعمال تغييرات در آن ( لطفاً اگر هيچ تجربه اي در تنظيم کردن رجيستري نداريد اطلاعات آنرا تغيير ندهيد ) ، مي توانيد از برنامه regedit.exe و يا regedt32.exe موجود در ويندوز استفاده کنيد . براي اينکار کافيست نام برنامه را در کادر Run وارد کنيد . نکته 2 : در قسمت دوم اين مقاله کلاسي براي خواندن و نوشتن از/به رجيستري در ويژوال بيسيک خواهم نوشت و سپس نمونه اي از کاربردهاي نوشتن يکسري اطلاعات خاص در رجيستري را خواهيم ديد . |
| | |
| | #25 (permalink) |
| همکار انجمن ها ![]() | قسمت سوم کنترل برنامه ها کنترل برنامه ها عملگر های شرطی مثالا می خواهید برنامه ای برایحساب پرداخت ها بنویسیم.این مقدار طلب هر فروشنده را که با آن معادله دارید محاسبه می کند و چک مربوط را چاپ می نماییم.حال اگر با یکی از فروشندگان مبادله نداشته باشد چه رخ می دهد. می خواهیم یک چک به مبلغ صفر دلار چاپ کنیم؟؟؟ مطمئنا پاسخ منفی است. تا اینجا همه کد های که درون روال دیده ایددستور به دستور اجرا می شوند. اما به کمک عملگرهای شرطی و دستور های مر بوط می توانید. برنامه ای بنویسید. که اگر لازم بود ترتیب اجرای دستورات تغییر نکند. بنابراین برنامه شما می تواند فقط چکهایی را چاپ کند که به فروشندگان آنها مبلغیبدهکار هستند. ویژال بیسیک از 6 عملگرها شرطی پشتیبانی می کند. عملگرها:=|<|>|=<|=>|<> توضیح:مساوی|بزرگتر از|کوچکتر از|بزرگتر یا مساوی|کوچکتر یا مساوی|نا مساوی مثال:2=7|3<6|11>5|23=<23|21=>4|3<>3 نتیجه:غلط|درست|درست|درست|در� �ت|غلط داده های شرطی همیشه دو مقدار را با هم مقایسه کنید که از یک نوع داده باشند. مثلا می توانید دو عدد از یک نوع را با هم مقایسه کنید تا ببینید کدام بزرگتر است. همچنین می توانید رشته های را با هم و انواع boolean را نیز با هم دیگه مقایسه کنید. اما هیچ وقت سعی نکنید یک رشته را با یک عدد مقایسه کنید چون نتیجه معمولا اشتباه در می آید. دستور if یک از متد اول ترین فرمان های زبان ویژال بیسیک فرمان if است . فرمان if قسمتی از یک دستور چند خطی به نام دستور if می باشد که فرمت آن به شکل زیر می باشد: If conditional then Block of one or more visual basic statements End if Conditional عبارتی است که نتیجه آن true یا false می باشد. در نتیجه conditional می تواند یک متغیر بولی بشد.می تواند یک کنترل معادل با مقدار true یا false باشد یا حتی ممکن است یک عبارت طولانی تر باشد که شامل عملگرهای شرطی و امتحان یک یا چند عملگر منطقی است. وقتی که ما از دستور if استفاده می کنید دستور اگر می باشد مثالا می گوییم اگر فلان چیز را زد یا ... فلا چیز بعدی اجرا یا ... اعمال شود این دستور یکی از دستور های است که در اکثر زبان های دیگر کا می کند. و اگر از این دستور در ویبی نخواهید استفاده کنیم یه جای کار می لنگه. بدنه یک دستور if باید بصورت تو رفته باشد تا بتواند با یک نگاه نقاط شروع و خاتمه این دستور را تشخیص دهید . کلیه دستورات if چند خطی دارای مجموعه متناظری از دستورات end if در جایی از برنامه می باشند . دستور end if همیشه با آخرین دستور if مرتبط است بدون توجه به اینکه چقدر تو رفته باشد. مقایسه داده ها به وکمک if If (cursales > cursalesgoal) then Cursalarybonus=100.00 Lblsalesnote.caption="maji" Lblsalesnote.backcolor=red Lblsalesnote.fontbold=true End if تکمیل دستور if با لغت کلیدی else در قسمت های بالا در مورد شکل دستور ifآشنا شدید. اما برنامه نویسان غالب اوقات از شکل توسعه یافته آن استفاده می کنند. که فرمت زیر را دارد. If conditional then Block of one or more visual basic statements Else Block of one or more visual basic statements End if ادامه دارد |
| | |
| | #26 (permalink) |
| همکار انجمن ها ![]() | ادامه قسمت سوم در اینجا نیز مانند کلیه دستورهای چند خطی برای واضح شدن بدنه دستور بصورت تو رفته می باشد. اما به خاطر داشته باشید. که این شیوه ضروری نیست. اولین فرمت if که قبلا دیدید کدی را نشان می داد که اگر شرط درست باشد این کد اجرا می شد. در این فرمت اگر شرط غلط باشد کدی برای اجرا وجود نخواهد داشت. Else بدین منظور به کار می رود. دستور if…elseاز آنکه if … else خاتمه یافت اجرای بقیه برنامه ادامه یافت پیدا می کند. دستورات if تو در تو If text.text="majid" then گاهی اوقات بر اساس داده های مختلف ممکن است بخواهد یک رویداد یا نوع از روال ها را زودتر از موعد مقرر خاتمه دهید. برای انجام این کار می توانید دستور if را با دستور exit ترکیب کنید.If text.text="majid2" then Text2.text="majid" Else Text2.text="majid3" End if End if Exit sub|function|do|for استفاده از دستور exit sub برای ختم زودرس یک روال دستورات if…elseتودرتو چنمانچه بخواهیم یک دستور if…else را درون یک دستور دیگر if……else قرار دهید باید برای شروع دستور if تو در تو از elseif استفاده کنید. Elseif کمک می کند تا دو یا چند دستور if….else تو در تو با هم ترکیب شوند. If text1.text="majid" then همانطور که دیدید ما در قسمت if می گفتیم اگر وelse را در بین if می گزاشتیم که اگر خواستیم بگویید ویاText2.text="majidddddddd" Elseif text12.text="majidddddddddd" Text3.text="ddd" End if حال دستور elseif می گوید ویا اگر که هم ویا است و هم اگر یعنی دستور ویا دستو استفاده می شود. انتخاب از طریق دستور select case مناسب ترین موقعیت برای استفاده ار دستور select case هنگام انتخاب با وجود چند شرط است . مسلما اگر بیشتر از سه یا چهار دستور if…else تودرتو داشته باشید نتیجه یک برنامه پیچیده خواهد بود.بعبارت دیگر وارد یک منطق در هم و برهم بصورت زیر می شوید : اگر این درست باشد. بعد اگر این درست باشد. بعد اگر این هم درست باشد آنگاه کاری را انجام بده در غیر این صورت ... فرمت select case بصورت زیر است. Select case expression Select caseیک مورد را از میان چند مورد انتخاب می کند. تعداد شرایطی که امتحان می شوند به نیاز شما بستگی دارد. این شرایط بصورت[case expressionmatch#...] نشان داده می شوند. فرض کنید که هیچکدام از این شرایط بر قرار نباشند.علیرغم فرمت پیچیده استفاده از دستور select case ساده است. به مثال زیر توجه کنید.Case expressionmatch Block of one or more visual basic statements [ case expressionmatch1 Block of one or more visual basic statements] [ case expressionmatch2 Block of one or more visual basic statements] [ case expressionmatch3 Block of one or more visual basic statements] End select Select case txtgrade.text Case "a" Lblannounce.caption="ma" Case "b" Lblannounce.caption="maa" Case "c" Lblannounce.caption="maj" Case "d" Lblannounce.caption="maji" Case "f" Lblannounce.caption="majid" Case else Lblannounce.caption="majid rahimy" End select |
| | |
| | #27 (permalink) |
| همکار انجمن ها ![]() | ادامه قسمت سوم اگر بنا به دلایلی حروفی غیز ازa|b|c|d|f درون متن ظاهر شود دستور case else اجرا شود و با تنظیم مقدار برچسب . خطایی را اعلام می کند. بقیر از دستورات select case دستوراتی دیگر در مورد همین مانند محدودها و.... می باشد. حلقه do ویژوال بیسیک یک دستور چند خطی به نام حلقه do دارد. در اینجا نیز مانند دستور if دستورات حلقه do با فرمت های مختلفی می آیند. Do while condition Block of one or more visual basic statements Loop Do Block of one or more visual basic statements Loop while condition Block of one or more visual basic statements Loop Do Block of one or more visual basic statements Loop while condition منظور از condition در حلقه do یک عبارت کنترل یا مقدار بولی است که درست یا غلط می باشد. فرمتی را که انتخاب می کنید اصولا به سلیقه شما بستگی دارد. اما تفاوت هایی نیز بین آنها وجود دارد. شما می توانید از هر شکل حلقه do استفاده کنید. Do while intctr <=10 Lblout.caption=intctr Intctr=intctr +1 Loop این قسمت ادامه دارد |
| | |
| | #28 (permalink) |
| همکار انجمن ها ![]() | مقدمه ای بر توابع داخلی توابع نوعی روال هستند. تفاوت بین تابع و سابروتین آن است که تابع پس از اتمام کار خود(یعنی اجرای کد بدنه تابع)یکم مقدار را به قسمت دیگری از برنامه می فرستند. در فصل بعد یاد می گیرید که چگونه توابع را بنویسید و نیز با طرز کار آنها با تمام جزئیات آشنا می شوید. آشنایی با توابع داخلی: توابع هیچ . یک یا چند مقدار را می گیرند و یک مقدار را بر می گردانند. تابع داخلی internal function یا توبع ذاتی intrinisic function تابعی است که همراه ویژوال بیسیک ارایه می شود و یک کار خاص مثل محاسبه یا عملیات ورودی/خروجی را انجام می دهد.قبل از آنکه بتوانید از یک تابع داخلی استفاده کنید باید نام و پیش نیازهای آن را بدانید. با وجودی که کد درون یک تابع داخلی را نمی بینید. اما می توانید از این توابع در برنامه های خودتان استفاده کنید. توابع داخلی نیز مثل if قسمتی از زبان ویژوال بیسیک هستند شما از توابع برای کارهای زیادی استفاده خواهید کرد. هر چه بیشتر با توابع در این فصل و خصوصا فصل بعد آشنا شوید بهتر می توانید از آنها استفاده کنید. فعلا موضوعات زیر را بخاطر بسپارید. معمولا یک یا چند مقدار به یک تابع منتقل می شود و به ندرت تابعی را می بینید که به هیچ مقداری نیاز نداشته باشد. این مقادیر که به تابع منتقل می کنید آرگان می گویند. آرگمانargumentمقداری است که یک تابع منتقل می شود. هموراه بعد از نام تابع باید پرانتز بیاید البته به استثنای توابعی که هیچ آرگمانی نیاز ندارند. آرگمان های تابع درون پرانتز قرار می گیرند. در صورتی که چند آرگمان را منتقل می کنید باید آنها را کاملا از هم جدا نمایید. در ادامه این قسمت برای سادگی از اصطلاح تابع بجای تابع داخلی استفاده می شود. در این قسمت یک کنترل تصویر را روی فرم نصب کردید و برای بار کردن یک تصویر درون آن از یک تابع استفاده نمودید. در اینجا آن خط کد را می بینید. که برای سادگی آرگمان تابع تا حدی خلاصه شده است. Image1.picture=loadpicture ("\taknik.bmp") نام تابعloadpicture است. در این کتاب هنگام بحث راجع به توابع از پرانتزهای خالی بعد از نام تابع استفاده شده است. تا بتواند به راحتی نام توابع متغیر و کنترل ها را از هم تشخیص دهید. تابع فوق یک آرگومان رشته ای دارد. ... امکان پاسخ دادن کاربر از طریق تابع msgbox() تابع msgboxیک تابع پیغام می باشد مثالا وقتی ما یک دستوری داریم که می خواهیم کاربر بعد از انجام آن دستور یک msgbox اجرا شود و بعد از اجرا شدن این دستور کاربر با انتخاب یک یا.. از دستور از تابع msgbox .. که بطور مثال ما یک کار اشتباهی در برنامه انجام می دهیم و برنامه یک پیغام شما اشتباه بودن ما را می گوید و یا ما دکمه خروج را می زنیم پیغامی حاوی آیا شما مطمئن هستید که می خواهید از برنامه خارج شوید ک 2 راه را پیش روی شما می گزارد یکی بله و دیگری خیر با زدن بله شما از برنامه خارج می شوید ولی بازدن خیر داخل برنامه خواهید ماند. تابع msg box شمال: شمایل پیغام و دکمه ها می باشد نام پروژه به کد زیر دقت کنید Msgbox=("click for exit") کد بالا فقط ما متن اریه شده را نوشتیم و اصلا برای دکمه و شمایل چیزی ننوشتیم. خود msgbox اولیه شامل یک دکمه است که با زدن دکمه دستور بعدی اجرا می شود . ولی ما برای دستور کدی ننوشتید خود برنامه با زدن دکمه هر دستوری باشد اجرا می کند دستور msgbox("…..") فقط برای یک مطن ارایه می شود ولی اگر بخواهیم دکمه نام پروژه شمایل اضافه کنیم باید قبل از زدن msg box بنویسیم intresponse= ماننده Intresponse=msgbox("ms",….,……,….") حال برای یاد گیری بهتر یک کد کامل می نویسم Intresponse=msgbox("text",vbok+vbquestion+vbdefaul tbutton2,"title") برای اینکه ببینید کاربر کدام کلیک را انتخاب کرده باید این مقادیر استفاده کنید. به ترتیب مقدار>ثابت نامگزاری شده>توضیح 1 2 3 4 5 6 7 Vbok Vbcancel Vbabort Vbretry Vbignore Vbyes Vbno کاربر دکمه ok را کلیک کرده کاربر دکمهcancelرا انتخاب کرده است کاربر دکمهabortرا انتخاب کرده است کاربر دکمهretry را انتخاب کرده است. کاربر دکمه yes را انتخاب کرده است کاربر دکمه no را انتخاب کرده است. ثابت های نامگزاری شده. شمایل به ترتیب مقدار>ثابت های نامگزاری شده>توضیح>شمایل 16 32 48 64 Vbcritical Vbquestion Vbexclamation Vbinformation پیغام جدی علامت سوال علامت هشدار اطلاعات نام دکمه ها Vbokonly Vbokcancel Vbabortretryignore Vbyesnocancel Vbyesno Vbretrycancel ادامه دارد |
| | |
| | #29 (permalink) |
| همکار انجمن ها ![]() | هدف از اين مبحث آموزشي ، آشنايي با تابع 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 |
| | |
| | #30 (permalink) |
| همکار انجمن ها ![]() | مقدمه : کنترل Internet Transfer نسبت به کنترل WebBrowser که در روزهاي قبلي معرفي شد در سطح پايينتري قرار دارد . اين کنترل با استفاده از دو پروتکل HTTP و FTP مي تواند داده ها را منتقل کند . اين کنترل زمانيکه از پروتکل HTTP استفاده مي کند با همان روش کنترل WebBrowser به سرويس دهنده صفحات وب متصل مي شود اما بجاي آنکه صفحه وب را نمايش دهد متن Html صفحه را بازيابي مي کند . همچنين زمانيکه اين کنترل از پروتکل FTP استفاده مي کند قادرست فايلها را بين کامپيوترهاي روي شبکه منتقل سازد . اتصالات HTTP : همانطور که مي دانيد ، پروتکل HTTP استاندارد وب مي باشد . صفحات وب با زبان Html نوشته مي شوند و انتقال آنها از server به client توسط پروتکل HTTP صورت مي گيرد . متد OpenURL : ساده ترين راه استفاده از کنترل IT متد OpenURL است . شکل کلي اين متد بصورت زير است : Inet.OpenURL(url,DataType)x که url آدرس صفحه وب و DataType نوع داده بازيابي شونده است و دو مقدار icString ( داده متني ) يا icByteArray ( داده باينري ) را مي گيرد . مقدار بازگشتي اين متد ، داده هاي منتقل شده است . اين متد بصورت سنکرون کار مي کند يعني در تمام مدت کار آن برنامه نمي تواند کار ديگري انجام دهد . اگر از icByteArray استفاده کنيد بايد مقدار بازگشتي آنرا در يک ارايه بايت قرار دهيد . مثال 1 : از بخش Component در منوي Project مورد Microsoft Internet Transfer Control 6.0 را به toolbar خود اضافه کنيد . سپس يک کنترل IT روي فرم قرار دهيد و همچنين يک Rich Textbox و يک دکمه روي فرم قرار دهيد و کد زير را براي event مربوط به کليک دکمه بنويسيد : TextBox.text=Inet.OpenURL(“[برای مشاهده لینکها باید ثبت نام کنید] ] مثال 2 : کد زير داده هاي باينري را از اينترنت خوانده و آنها را در يک فايل ذخيره مي کند : Dim b() as byte B()=Inet.OpenURL(ftp://ftp.microsoft.com/test.zip,icByteArray)x Open App.path & “\test.zip” For Access Write As #1 Put #1,b()x Close #1 رويداد StateChanged : کنترل IT فقط يک event دارد که StateChanged مي باشد . اين event زماني روي مي دهد که State کنترل تغيير کند . State هر اتفاقي است که برنامه بايد از آن مطلع شود . تعريف کلي اين event بصورت زير است : Inet_StateChanged(ByVal NewState As Integer)x که NewState مقداري است که حالت جديد را بيان مي کند . مقادير ممکن اين پارامتر عبارتند از : icNone : حالت تغيير نکرده است . icResolvingHost : در حال جستجوي آدرس IP کامپيوتر موردنظر . icHostResolved : آدرس IP کامپيوتر موردنظر يافت شد . icConnecting : در حال اتصال به کامپيوتر مقصد icConnected : اتصال به کامپيوتر مقصد برقرار شد . icRequesting : در حال ارسال درخواست به کامپيوتر مقصد icRequestSent : درخواست به کامپيوتر مقصد ارسال شد . icReceivingResponse : در حال دريافت پاسخ از کامپوتر مقصد . icResponseReceived : پاسخ کامپيوتر مقصد دريافت شد . icDisconnecting : در حال قطع اتصال با کامپيوتر مقصد . icDisconnected : اتصال مقصد با موفقيت قطع شد . icError : در ارتباط با کامپيوتر مقصد خطايي رخ داده است . icResponseCompleted : تکميل پاسخ – تمام داده ها دريافت شد . تشخيص خطا در عمليات انتقال داده اهميت بالايي دارد و StateChanged در صورت بروز هر خطايي مقدار icError را برمي گرداند و اطلاعات خطا را در دو خاصيت ResponseCode و ResponseInfo برمي گرداند . انتقال داده بصورت آسنکرون : کنترل IT متدهاي انعطاف پذير ديگري هم دارد که آسنکرون هستند و اجازه مي دهند تا همزمان با عمليات انتقال داده ، برنامه به وظايف ديگري هم بپردازد . اين متدها با استفاده از Event Driven Model کار مي کنند . بدين معني که وقتي برنامه درخواست انتقال داده اي را مي دهد کنترل IT درخواست را در زمينه برنامه انجام مي دهد و برنامه ازاد است تا به کارهاي ديگرش بپردازد . زمانيکه داده ها بازيابي شود ، داده ها را از بافر داخلي کنترل IT مي خواند . متد GetChunk : در عمليات انتقال آسنکرون ، بايستي داده را توسط اين متد از بافر داخلي کنترل IT بگيريم : Inet.GetChunk(datasize[,datatype])x که پارامتر datasize از نوع long بوده و تعيين مي کند چند بايت از بافر خوانده شود و پارامتر اختياري datatype نوع داده را مشخص مي کند و مي تواند مقادير icString و icByteArray را بگيرد . زمانيکه StateChanged وارد حالتهاي icResponseReceived و يا icResponseCompleted شد بايد از GetChunk استفاده کنيد . بدين صورت که از يک حلقه استفاده مي کنيم تا کل بافر را بخوانيم : Private Sub Inet_StateChanged(Byval State as Integer)x Dim temp1,temp2 Select Case State Case icResponseCompleted temp1=””x temp2=””x Do temp1=Inet.GetChunk(512,icString)x temp2=temp2 & temp1 Loop Until temp1=””x End Select End Sub براي بالابردن کارايي ، بهتر است از قطعات کوچک ( بين 512 تا 1024 بايتي ) استفاده کنيد . متد Execute : و اما انعطاف پذيرترين متد کنترل IT ، متد Execute است . فرمت کلي اين متد بصورت زير است : Inet.Execute(url,Command,Data,RequestHeaders)x که url آدرس مقصد ، Command فرماني است که به کامپيوتر مقصد داده مي شود و Data و RequestHeaders اطلاعات اضافي لازم براي اجراي فرمان داده شده است . فرمانهاي Command همان فرمانهاي HTTP هستند که عبارتند از : - GET : دريافت داده ها از کامپيوتر مقصد - HEAD : دريافت اطلاعات header از کامپيوتر مقصد - POST : ارسال اطلاعات لازم براي تکميل درخواست - PUT : ارسال فايل براي کامپيوتر ميزبان ( upload ) فرمان GET پرکاربردترين فرمان متد Execute است و داده هاي خوانده شده را در بافر داخلي بافر کنترل IT قرار مي دهد تا بتوان با متد GetChunk آنها را بازيابي نمود . مثال : Inet.Execute [برای مشاهده لینکها باید ثبت نام کنید] ] ساير خواص کنترلIT : - AccessType : نوع دسترسي کنترل IT به اينترنت را مشخص مي کند و سه مقدار مي تواند بگيرد : icUseDefault : استفاده از تنظيمات رجيستري براي دسترسي به اينترنت icDirect : اتصال مستقيم کنترل IT به اينترنت icNamedProxy : اتصال به اينترنت توسط پروکسي - Document : نام صفحه پيش فرض که در متد Execute از آن استفاده مي شود . اگر به متد Execute پارامتر url را ندهيد از اين صفحه پيش فرض استفاده مي کند . - Password : کلمه رمز عبور کامپيوتر ميزبان FTP - Procotol : نوع پروتکل مورد استفاده در متد Execute را مشخص مي کند و 5 مقدار مي تواند بگيرد : icUnknown : نامعلوم icDefault : پروتکل پيش فرض icFTP : پروتکل FTP icHTTP : پروتکل HTTP icHTTP : پروتکل حفاظت شده HTTP - 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 را نيز شروع کرده ام ؟ علت اش اينست که تصميم دارم پس از پايان يافتن اين دو مبحث ، روش ساخت يک بازي دوبعدي چند نفره تحت شبکه را برايتان آموزش دهم . |
| | |
![]() |
| برچسب ها (کلمات کلیدی) |
| آموزش ویژوال بیسیک , آموزش، ویژوال بیسیک , visual basic tutorial |
| ابزار هاي گفتگو | جستجو اين تالار |
| نمايش رسم | |
| |
گفتگو هاي مشابه | ||||
| نام گفتگو | شروع کننده گفتگو | تالار | پاسخ ها | آخرين پست |
| 83 نرم افزار آموزشی فارسی و تعاملی و رایگان! | hesam_akbari | نرم افزارهای اینترنتی | 0 | 02-18-2008 02:48 PM |
| نظام آموزشي كشورهاي جهان | Night Silence | علم و دانش و مقالات علمی | 22 | 01-04-2008 09:05 PM |
| مقالات و اخبار مرتبط با موسیقی | admin | موسیقی و رادیو | 104 | 07-20-2006 12:56 AM |