The page cannot be found
The page you are looking for might have been removed, had its name changed, or is temporarily unavailable.

Please try the following:

  • If you typed the page address in the Address bar, make sure that it is spelled correctly.
  • Open the home page, and then look for links to the information you want.
  • Click the Back button to try another link.

HTTP 404 - File not found
Internet Information Services

Technical Information (for support personnel)

  • More information:
    Microsoft Support


نظرات دوستان

:نام
:ايميل
:آي دي ياهو
:سايت شما

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

نیلوفر
سایتتون خیلی قشنگ وآموزندست اما می خواستم سوال بپرسم راجع به گزارش گیری از مایکر سافت پروجکت به کجا مراجعه کنم؟

سلام
سایتتون خیلی قشنگ وآموزندست اما می خواستم سوال بپرسم راجع به گزارش گیری از مایکر سافت پروجکت به کجا مراجعه کنم؟

محمد
سايتتون خيلي عاليه

mohsen
من يك سوال دارم و اگر دوستان جواب رو ميدونن برام بفرستند . متشكرم . مي خوام توي Delfi از جدول ها(در كل از Data base) اكسس استفاده كنم . ولي چچطوري ؟

مهدي پژوهنده
سلام از مقاله هاي خوبتون ممنونم يه سوال دارم: چطور ميشه آهنگ يا عكس رو توي برنامه هاي پاسكال استفاده كرد؟ ممنون ميشم اگه اين مشكلم رو حل كنيد.

mohsen
سلام مرسی . خیلی مقالاتتون جالبه . البته ببخشیدا یه خوردم کمه . چقدر جالب میشه اگه انجمن هم تو سایتتون بزارید . قسمت پرسش و پاسخم باشه خیلی کارتون بهتر میشه . ولی بازم میگم جیلی جالبه

امیر
یک انتقاد داشتم و این که لطفا مطالب رو پراکنده ننویسید بلکه به صورت سری آموزشی باشه. به نظر من اینطور بهتره. با تشکر

mohammad
lotfan amoozeshh narmafzare matlab ro ham bezarin dar soorat emkan toolbox hasho ham hamintor.mamnoon

mohamad
با سلام چگونه مي توان يك messagebox درasp.net نشان داد و ديگر اينكه چگونه ميتوان از listview در asp.net استفاده كرد ممنون.

مصطفي
khili aliye mamnoon az zahmatatun

بهشت
سلام و خسته نباشيد. سايت شما حرف نداره. تنها چيزي كه منو وادار كرده تا اين وقت شب بيدار بمونم، مطالب بسيار مفيد و عالي اين سايت هستش كه اصلا نمي تونم ازشون بگذرم. همينجوري ادامه بدين. اميدوارم هميشه موفق باشين.

محمد
اينجانب تا کنون به هيچ سايتي نظر نداده ام. اما با ديدن سايت عالي شما حيفم آمد که نظر ندهم سايت فو ق العاده عالي داريد خيلي خيلي متشکرم.

هانيه
من خيلي از مقاله هاي مفيد شما در سايت استفاده كردم واقعا متشكرم من دنباله مقاله هايي راجع ‍‍C#.net تحت وب هستم .لطفا اين موضوع را هم درسايت قرار دهيد .

Hamid
سلام خسته نباشيد من يک مشکلی گير کردم که اميدوارم دوستان کمکم کنند من چند فايل DataBase در فورمت Excel دارم ولی نمی دونم چطور ميتونم يک موتور Search براشون در يک سايت قرار بدم آيا Asp برای اين کار مناسب است يا نه ؟ خواهش می کنم مرا راهنمايی کنيد

يوسف
خيلي جالب بود از زحمات همتون ممنونم.

داود دودی شریف ابادی
بنام او که هستی همه ازوست هرچند پیر خسته دل نا توان شدهام هرگه که یاد تو مکنم جوان شدهام بابا دمتان گرم خیلی باحالیت

محسن فروغ افکن
میخواستم برای شما چند تا از شعر هایم را بفرستم آیا شما مایل به خواندن شعر های من هستید

محسن فروغ افکن
میخواستم برای شما چند تا از شعر هایم را بفرستم آیا شما مایل به خواندن شعر های من هستید

محسن فروغ افکن
میخواستم برای شما چند تا از شعر هایم را بفرستم آیا شما مایل به خواندن شعر های من هستید

لينك به ما

Dev.ir
ارتباط با ما
نظر شما
صفحه اصلي سايت
© www.Dev.ir - All Rights Reserved


Contact Us

<%@ Language=VBScript CODEPAGE="65001"%> Contact Us

PersianYahoo @ Gmail.com جهت تماس با ما ميتوانيد با ايميل روبرو مکاتبه کنيد

در صورت تمايل ميتوانيد در صفحه نظرات نيز مطلب خود را بنويسيد

پيشاپيش از ارتباط شما ممنونيم

لينك به ما


Dev.ir -مرجع برنامه نويسان

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security

لينك به ما

Dev.ir
ارتباط با ما
نظر شما

لينک دوستان
پرشين ياهو
طراح وب ، ماکرومديا


Dev.ir -مرجع برنامه نويسان

تعريف كلي از اكسسAccess
access
تابع تبديل عدد به حروف
access
بستن دكمه شيفت
access
صدور پيغامهاي فارسي بجاي پيغامهاي Error اكسس
access
ماجول تاريخ هجري شمسي با توابع جانبي آن
access
ایراد The search key was not found in any record
access
Join کردن بيش از ۲ جدول براي Database هاي Access
access

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security

لينك به ما

Dev.ir
ارتباط با ما
نظر شما

لينک دوستان
پرشين ياهو
طراح وب ، ماکرومديا


Dev.ir -مرجع برنامه نويسان

آموزش فلش : لود کردن صدا بصورت داینامیک
actionscript
آموزش فلش : لود کردن عکس بصورت داینامیک
actionscript
اکشن اسکریپت : اولويت عملگر هاي فلش
actionscript
اكشن اسكريپت : استفاده از عملگرها براي دستكاري مقادير عبارت ها (بخش اول)
actionscript
اكشن اسكريپت - متغير ها در فلش
actionscript
اكشن اسكريپت : كنترل در زمان اجرا
actionscript
اكشن اسكريپت : متغير هاي رشته اي ، عددي و بولين و نال
actionscript
اکشن اسکریپت ، یک زبان شیئ گرا
actionscript
Action Script - FScommand
actionscript
آشنایی با سمبل ها در فلش
actionscript
قالب دستوري اكشن اسكريپت
actionscript

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security

لينك به ما

Dev.ir
ارتباط با ما
نظر شما

لينک دوستان
پرشين ياهو
طراح وب ، ماکرومديا


Dev.ir -مرجع برنامه نويسان

ارتباط به منابع داده در ADO.NET
ado
ASP.NET و پايگاه داده
ado
مقايسه ADO و ADO.NET
ado
بررسی شیئ DataView در ASP.NET
ado
معرفی ADO و کاربرد آن در ASP بخش 1 و2
ado

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security

لينك به ما

Dev.ir
ارتباط با ما
نظر شما

لينک دوستان
پرشين ياهو
طراح وب ، ماکرومديا


Dev.ir -مرجع برنامه نويسان

ورود اطلاعات فارسی با استفاده از جاوااسکريپت
asp
يک شمارنده ساده يا کونتور
asp
ارسال ايميل در ASP ساده و کار آمد
asp
درج تاريخ شمسی
asp
فرستادن فايل يا Upload از صفحه وب
asp
ارسال ايميل با کمک ASP
asp
شي RESPONSE و استفاده از فايل هاي include
asp
برنامه کاربردي تحت وب چيست ؟
asp
فرم ها در ASP
asp
طرز ساخت کوکي ها
asp
آبجکت Response در ASP
asp
راه اندازي ASP
asp
شروع کار با ASP
asp

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security

لينك به ما

Dev.ir
ارتباط با ما
نظر شما

لينک دوستان
پرشين ياهو
طراح وب ، ماکرومديا


Dev.ir -مرجع برنامه نويسان

upload کردن فايل به سرور در ASP.NET
aspdotnet
Namespace چيست؟
aspdotnet
Smart Navigation چيست؟
aspdotnet
چرا به دات نت احتياج داريم؟
aspdotnet
نشان دادن قابليتهای مرورگر در ASP.NET
aspdotnet
آشنائی با ASP.NET
aspdotnet
نحوه پردازش صفحات ASP.NET بر روي سرويس دهنده وب
aspdotnet
ارسال ایمیل در ASP.NET با استفاده از HTML Template
aspdotnet
اضافه کردن تصویر به پایگاه داده
aspdotnet
برسی کوکی‌ها (Cookies) و جلسات (Sessions) در ASP.NET
aspdotnet
باز کردن پنجره Popup در ASP.NET با استفاده از Code Behind
aspdotnet
آشنائی با فرم‌های وب در ASP.NET
aspdotnet

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security

لينك به ما

Dev.ir
ارتباط با ما
نظر شما

لينک دوستان
پرشين ياهو
طراح وب ، ماکرومديا


Dev.ir -مرجع برنامه نويسان

نمايش Menu روی Tray Icon
c
Modless Dialog
c
Tray Icon
c
DialUp
c
مقدمه ای بر پردازش تصوير
c
تغيير رنگ پس زمينه ديالوگ
c
Socket - Socket Programming چيست ؟
c
توابع مجازی
c
ارث بری کلاسها ( مشتق کردن کلاسی از کلاس دیگر )
c
چند ريختی Polymorphism
c
سازنده ها و مخربها در يک کلاس
c
سطح دسترسی در کلاسها
c
کلاس چیست ؟include
c

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security

لينك به ما

Dev.ir
ارتباط با ما
نظر شما

لينک دوستان
پرشين ياهو
طراح وب ، ماکرومديا


Dev.ir -مرجع برنامه نويسان

مقدمه اي بر سي شارپ : قسمت بيستم
c-sharp
مقدمه اي بر سي شارپ : قسمت نوزدهم
c-sharp
مقدمه اي بر سي شارپ : قسمت هجدهم
c-sharp
مقدمه اي بر سي شارپ : قسمت هفدهم
c-sharp
مقدمه اي بر سي شارپ : قسمت شانزدهم
c-sharp
مقدمه اي بر سي شارپ : قسمت پانزدهم
c-sharp
مقدمه اي بر سي شارپ : قسمت چهاردهم
c-sharp
مقدمه اي بر سي شارپ : قسمت سيزدهم
c-sharp
مقدمه اي بر سي شارپ : قسمت دوازدهم
c-sharp
مقدمه اي بر سي شارپ : قسمت يازدهم
c-sharp
مقدمه اي بر سي شارپ : قسمت دهم
c-sharp
مقدمه اي بر سي شارپ : قسمت نهم
c-sharp
مقدمه اي بر سي شارپ : قسمت هشتم
c-sharp
مقدمه اي بر سي شارپ : قسمت هفتم
c-sharp
مقدمه اي بر سي شارپ : قسمت ششم
c-sharp
مقدمه اي بر سي شارپ : قسمت پنجم
c-sharp
مقدمه اي بر سي شارپ : قسمت چهارم
c-sharp
مقدمه اي بر سي شارپ : قسمت سوم
c-sharp
مقدمه اي بر سي شارپ : قسمت دوم
c-sharp
مقدمه اي بر سي شارپ : قسمت اول
c-sharp
آشنائی با زبان #C
c-sharp

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security

لينك به ما

Dev.ir
ارتباط با ما
نظر شما

لينک دوستان
پرشين ياهو
طراح وب ، ماکرومديا


Dev.ir -مرجع برنامه نويسان

مقایسه Coldfusion و ASP
coldfusion
دفاع از کلدفیوژن در برابر پدرخوانده اش
coldfusion
آموزش کلد فیوژن : متغیر های Client و Session
coldfusion
آموزش ColdFusion ، ساختار Switch/Case
coldfusion
دستورهای شرطی در ColdFusion
coldfusion
درك و رفع نقص پيام هاي error در كلد فيوژن
coldfusion
آموزش ColdFusion ،انواع داده ي پيچيده : آرايه ها
coldfusion
آموزش کلد فیوژن: انواع داده پيچيده : ليست ها
coldfusion
کار با پایگاه داده ها در کلدفیوژن
coldfusion
ColdFusion مقدماتی، قسمت اول
coldfusion

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security

لينك به ما

Dev.ir
ارتباط با ما
نظر شما

لينک دوستان
پرشين ياهو
طراح وب ، ماکرومديا


Dev.ir -مرجع برنامه نويسان

انواع استایل ها
css
ده نکته برای افزایش سرعت بارگزاری صفحات وب
css
استايل (CSS) چيست؟
css
صفحات دو ستونی در CSS
css
رنگ ScrollBar صفحه سايت خود را عوض كنيد
css
CSS و كاربرد آن در طرح هاي امروزي
css

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security

لينك به ما

Dev.ir
ارتباط با ما
نظر شما

لينک دوستان
پرشين ياهو
طراح وب ، ماکرومديا


Dev.ir -مرجع برنامه نويسان

مدیریت حافظه در دلفی
delphi
آرایه‌ها در دلفی
delphi
نكات مفید كار در محیط دلفی
delphi
تاریخچه زبان دلفی
delphi
تغییر Hint برای هر ستون از DBGrid در دلفی
delphi
نمایش میزان كپی شدن فایل با ProgressBar در دلفی
delphi
نصب ProgressBar روی StatusBar در دلفی
delphi
استفاده از DLL‌ها در دلفی
delphi
محدودكردن تغییر اندازه فرم در دلفی
delphi

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security

لينك به ما

Dev.ir
ارتباط با ما
نظر شما

لينک دوستان
پرشين ياهو
طراح وب ، ماکرومديا


Dev.ir -مرجع برنامه نويسان

دریم ویور : رویاباف طراحان وب
html
سایت خود را مطابق تکنولوژی جستجوگر ها طراحی کنید
html
متاتگ چیست ؟
html
نمايش عكسي به دنبال نشانگر ماوس
html
تگ Anchor و شناسه href
html
دو نکته بسيار مهم در مورد فارسی نويسی
html
تگ های اچتمل
html
مقده اي بر وب و زبان html
html
قرار دادن تصوير در صفحات و کد جدول
html
معرفي تگ هاي اوليه در اچ تي ام ال
html
آموزش زبان صفحات وب HTML
html

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security

لينك به ما

Dev.ir
ارتباط با ما
نظر شما

لينک دوستان
پرشين ياهو
طراح وب ، ماکرومديا


Dev.ir -مرجع برنامه نويسان

بنيادهاي كلاس java
java
دستورات انتخاب در جاوا
java
استفاده از پرانتزها
java
عملگر ?
java
عملگر انتساب The Assignment Operator
java
عملگرهاي منطقي بولي Boolean
java
عملگرهاي رابطه اي
java
عملگرها ی ریاضی و بیتی
java
اولين برنامه ساده java
java
آرايه ها در جاوا
java
متغيرها و اعمال روی آنها
java
انواع اعداد اعشاري جاوا
java
آموزش جاوا - integers ( اعداد صحيح )
java
جاوا را بشناسیم
java

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security

لينك به ما

Dev.ir
ارتباط با ما
نظر شما

لينک دوستان
پرشين ياهو
طراح وب ، ماکرومديا


Dev.ir -مرجع برنامه نويسان

JavaScript چيست؟
javascript
افکت قلب و لب همراه باموس.
javascript
لرزش صفحه وب سايت هنگام باز شدن
javascript
کد بارش بارون و بارش برف در صفحه وبلاگ
javascript
خاموش کردن قابليت کليک راست
javascript
نمايش پيغامهاي تصادفي در نوار وضعيت
javascript
طريقه Fade كردن عكسها با استفاده از جاوا اسكريپت
javascript
Preload براي صفحات وب
javascript

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security

لينك به ما

Dev.ir
ارتباط با ما
نظر شما

لينک دوستان
پرشين ياهو
طراح وب ، ماکرومديا


Dev.ir -مرجع برنامه نويسان

آموزش پاسکال قسمت چهارم
pascal
آموزش پاسکال قسمت سوم
pascal
آموزش پاسکال قسمت دوم
pascal
آموزش پاسکال قسمت اول
pascal

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security

لينك به ما

Dev.ir
ارتباط با ما
نظر شما

لينک دوستان
پرشين ياهو
طراح وب ، ماکرومديا


Dev.ir -مرجع برنامه نويسان

انواع متغييرها در PHP
php
درج تاريخ شمسی، ميلادی و ساعت جاری در صفحات HTML
php
Hot Linking(نقره داغ وب مسترها)
php
يا بافر کردن خروجی
php
چگونه IP در PHP لاگ می شود
php
PHP و برنامه نويسی شی گرا
php
کوتيشن يا دابل کوتيشن؛ کی و کجا استفاده کنيم؟!
php
نصب فارسي نوك FarsiNuke در كلاينت XP,2000
php
نمايش متن بصورت تصويري در اينترنت
php
كارتهاي الكترونيكي با php وmysql
php
چگونه يك برنامه لاگين امن و حرفه اي طراحي كنيد ?
php
مديريت فايل هاي ارسالي توسط كاربران
php
۷ دلیل برای اینكه استفاده از PHP بهتر از ASP می باشد
php
نکاتی مفید در مورد تنظیم php.ini
php
استفاده از تابع تبدیل تاریخ شمسی به میلادی و برعکس
php
راهنمای کامل نصب PHP بر روی windows
php
روش نصب PHP بروى Windows ها
php

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security

لينك به ما

Dev.ir
ارتباط با ما
نظر شما

لينک دوستان
پرشين ياهو
طراح وب ، ماکرومديا


Dev.ir -مرجع برنامه نويسان

استراتژي حفاظت از اطلاعات در شبکه هاي کامپيوتري ( بخش دوم )
security
استراتژي حفاظت از اطلاعات در شبکه هاي کامپيوتري ( بخش اول )
security
نقش عوامل انساني در امنيت شبکه هاي کامپيوتري
security
ايمن سازي سرويس دهنده FTP
security
امنيت برنامه های وب ( بخش سوم )
security
امنيت برنامه هاي وب ( بخش دوم )
security
امنيت برنامه هاي وب ( بخش اول )
security

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security

لينك به ما

Dev.ir
ارتباط با ما
نظر شما

لينک دوستان
پرشين ياهو
طراح وب ، ماکرومديا


Dev.ir -مرجع برنامه نويسان

خلاصه سازی داده ها
sqlserver
ارتباط دادن جداول
sqlserver
مرتب سازی و انتخاب کردن سطرها
sqlserver
عبارت SELECT
sqlserver
بازيابی سطرها
sqlserver
ايجاد کردن نمودار پايگاه داده
sqlserver
شناخت عبارت INSERT
sqlserver
جداول موقت
sqlserver
ايجاد کردن ارتباطات
sqlserver
ايجاد کردن Check Constraint
sqlserver
ايجاد کردن شئی های جدول
sqlserver
ايجاد کردن يک پايگاه اطلاعاتی
sqlserver
ايجاد كردن جداول و تغییر دادنشان
sqlserver
شناخت ايندکس ها
sqlserver
امنيت 2000 SQL Server
sqlserver
نسخه برداری کردن و باز گرداندن پايگاه داده ها
sqlserver
معرفی SQL و دستورات عمومی آن
sqlserver

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security

لينك به ما

Dev.ir
ارتباط با ما
نظر شما

لينک دوستان
پرشين ياهو
طراح وب ، ماکرومديا


Dev.ir -مرجع برنامه نويسان

آشنايي با RAS API و WinInet API – کامل
vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7
vb
آموزش DirectX Input - بخش 1,2,3
vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4
vb
آموزش DirectXAudio - بخش 1و2و3و4
vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4
vb
API هاي ويندوز و طرز استفاده آنها در وی بی
vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی
vb
کنترل WinSock - قسمت 1,2
vb
اضافه کردن آيکون به منو
vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲
vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک
vb
رويدادها در ويژوال بيسيک
vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶
vb
توابع رياضی و ويژوال بيسيک
vb
مديريت رشته ها در ويژوال بيسيک ۶
vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6
vb
ايجاد کلاسی برای کار با فايلهای XML
vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم
vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی
vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم
vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم
vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم
vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم
vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم
vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول
vb
API هاي ويندوز
vb
مباحث پيشرفته Direct3D - مقدمه
vb
کنترل Internet Transfer - قسمت دوم
vb
کنترل Internet Transfer - قسمت اول
vb
آشنايي با BitBlt
vb
کنترل Web Browser – ساخت مرورگر صفحات وب
vb
آموزشDirectX-Graphic قسمت دهم
vb
آموزش DirectX-Graphic قسمت نهم
vb
آموزشDirectX-Graphic قسمت هشتم
vb
آموزشDirectX-Graphic قسمت هفتم
vb
آموزشDirectX-Graphic قسمت ششم
vb
آموزشDirectX-Graphic قسمت پنجم
vb
آموزشDirectX-Graphic قسمت چهارم
vb
آموزش DirectX-Graphic قسمت سوم
vb
آموزش DirectX-Graphic قسمت دوم
vb
آموزش DirectX-Graphic قسمت اول
vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security

لينك به ما

Dev.ir
ارتباط با ما
نظر شما

لينک دوستان
پرشين ياهو
طراح وب ، ماکرومديا


Dev.ir -مرجع برنامه نويسان

انواع داده ای در Visual Basic.NET
vbdotnet
ساختارهای شرطی در Visual Basic.NET
vbdotnet
متغيرهای ايستا در ASP.NET
vbdotnet
آشنايی با Visual Basic.NET- متغيرها
vbdotnet
بررسی اعتبار داده ها توسط VB.NET در فرم های وب
vbdotnet
دستيابی به بانک اطلاعاتی Access با استفاده از VB.NET
vbdotnet
معرفی اوليه VB.NET
vbdotnet

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security

لينك به ما

Dev.ir
ارتباط با ما
نظر شما

لينک دوستان
پرشين ياهو
طراح وب ، ماکرومديا


Dev.ir -مرجع برنامه نويسان

XML در دات نت 2
xml
XML در دات نت
xml
آشنايي با XML قسمت چهارم
xml
آشنايي با XML قسمت سوم
xml
آشنايي با XML قسمت دوم
xml
XML چيست ؟
xml

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security

لينك به ما

Dev.ir
ارتباط با ما
نظر شما

لينک دوستان
پرشين ياهو
طراح وب ، ماکرومديا


Dev.ir -آرشيو مقالات آموزشي

شروع کار با ASP

يك فايل ASP مى تواند حاوى متون، Tagهاى HTML و اسكريپت ها باشد. اسكريپت ها در يك فايل ASP بر روى سرور اجرا مى شوند.

به عنوان پيش نياز چه چيزى را بايد بدانيد؟
قبل از شروع، بايد با مسائل زير را تا حدودى آشنا باشيد

  • WWW و HTML و مسائل اوليه ساخت صفحات Web
  • يك زبان اسكريپت نويسى همچون JavaScript يا VBScript

ASP چيست؟

  • ASP حروف اختصارى A ctive Server Pages است.
  • ASP برنامه اى است كه درون IIS اجرا مى شود.
  • IIS حروف اختصارى I nternet Information Services است.
  • IIS به عنوان يك مولفه رايگان با ويندوز 2000 عرضه مى شود.
  • IIS همچنين به عنوان جزئى از Windows NT 4.0 Option Pack است.
  • Option Pack مى تواند از سايت مايكروسافت داون لود شود.
  • PWS نسخه كوچكتر - ولى كاملا عمل كننده - از IIS است.
  • PWS را مى توانيد در سى دى ويندوز 95 يا 98 خود پيدا كنيد.

سازگارى ASP

  • ASP تكنولوژى مايكروسافت است.
  • براى اجراى IIS بايد ويندوز NT نسخه 4.0 يا بالاتر را داشته باشيد.
  • براى اجراى PWS بايد ويندوز 95 يا بالاتر را داشته باشيد.
  • ChiliASP تكنولوژى است كه ASP را بدون نياز سيستم عامل ويندوز اجرا مى كند.
  • InstantASP تكنولوژى ديگرى است كه ASP را بدون نياز به سيستم عامل ويندوز اجرا مى كند.

يك فايل ASP چيست؟

  • يك فايل ASP تقريبا شبيه به يك فايل HTML است.
  • يك فايل ASP مى تواند حاوى متن، XML، HTML، و اسكريپت باشد.
  • اسكريپت هاى درون يك فايل ASP بر روى Server اجرا مى شود.
  • يك فايل ASP پسوند "asp." دارد.

فرق ASP با HTML چيست؟

  • وقتى كه Browser (كاوشگر اينترنت) درخواست يك فايل HTML را بكند، Server آن فايل را بر مى گرداند.
  • وقتى كه Browser درخواست يك فايل ASP را بكند، IIS درخواست مربوطه را به موتور (هسته‌اى كه وظيفه اصلى را بازى مى كند) ASP ارجاع مى دهد. موتور ASP فايل ASP را خط به خط مى خواند، و اسكريپت هاى درون فايل را اجرا مى كند. در نهايت فايل ASP به عنوان يك فايل HTML ساده به Browser برگردانده مى شود.

ASP چه كارى مى تواند براى شما انجام دهد؟

  • به طور ديناميكى محتويات يك Web page را ويرايش يا اضافه كند.
  • به درخواست هاى كاربر كه از فرم هاى HTML ارسال شده اند پاسخ دهد.
  • به هر گونه اطلاعات با بانك اطلاعاتى دسترسى پيدا كرده و نتايج را به Browser برگرداند.
  • سفارشى نمودن (Customize) يك Web page تا براى كاربران مختلف مفيدتر باشد.
  • مزاياى استفاده از ASP به جاى CGI و Perl سرعت و سادگى است.
  • فراهم كردن امنيت بيشتر به گونه اى كه كد ASP شما از طريق Browser قابل مشاهده نيست.
  • از آن جايى كه فايلهاى ASP به شكل HTML برگردانده مى شوند، ميتوانند بوسيله هر Browserى مشاهده گردند.
  • برنامه نويسى درست ASP مى تواند ترافيك شبكه را به حداقل برساند.
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
ورود اطلاعات فارسی با استفاده از جاوااسکريپت | asp
يک شمارنده ساده يا کونتور | asp
ارسال ايميل در ASP ساده و کار آمد | asp
درج تاريخ شمسی | asp
فرستادن فايل يا Upload از صفحه وب | asp
ارسال ايميل با کمک ASP | asp
شي RESPONSE و استفاده از فايل هاي include | asp
برنامه کاربردي تحت وب چيست ؟ | asp
فرم ها در ASP | asp
طرز ساخت کوکي ها | asp
آبجکت Response در ASP | asp
راه اندازي ASP | asp
شروع کار با ASP | asp

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


راه اندازي ASP

شما مي توانيد ASP را بدون نياز به يک سرور خارجي اجرا کنيد. براي انجام اين کار شما بايد Microsoft's Personal Web Server (PWS) يا (Internet Information Server (IIS را در رايانه خود نصب کنيد.

چگونه ASP را در رايانه خود اجرا کنيد؟
شما مي توانيد ASP را بدون سرور خارجي در رايانه شخصي خود اجرا کنيد. براي انجام اين کار بايد Microsoft's (Personal Web Server (PWS يا (Internet Information Server (IIS را در رايانه خود نصب کنيد.
اگر در مورد اجراي ASP جدي هستيد، بايد حداقل ويندوز 98، نسخه دوم (Second Edition) داشته باشيد.
اگر در مورد اجراي ASP بسيار جدي هستيد، بايد از ويندوز 2000 استفاده کنيد.

چگونه PWS را در ويندوز 95 نصب کنيد و ASP اجرا کنيد؟
(Personal Web Server (PWS همراه ويندوز 95 نيست!!
براي اجراي ASP بر روي ويندوز 95، شما بايد "Windows NT 4.0 Option Pack" را از مايکروسافت داون لود کنيد.
داون لود "Windows NT 4.0 Option Pack"

چگونه PWS را در ويندوز NT نصب کنيد و ASP اجرا کنيد؟

(Personal Web Server (PWS همراه ويندوز NT نيست!!
براي اجراي ASP بر روي ويندوز 95، شما بايد "Windows NT 4.0 Option Pack" را از مايکروسافت داون لود کنيد.
داون لود "Windows NT 4.0 Option Pack"

چگونه PWS را در ويندوز 98 نصب کنيد و ASP اجرا کنيد؟

1. شاخه Add-ons را در سي دي ويندوز 98 خود باز کنيد، شاخه PWS را پيدا کرده و فايل setup.exe را اجرا کنيد.

2. يک شاخه Inetpub در هارد شما ايجاد خواهد شد. آن را باز کنيد و شاخه wwwroot را پيدا کنيد.

3. يک شاخه جديد درست کنيد و نام آن را چيزي شبيه به "MyWeb" بگذاريد.

4. از يک ويرايشگر متن استفاده کنيد و کدهاي ASPي را بنويسيد، فايل را به نام "test1.asp" را در شاخه "MyWeb" ضبط کنيد.

5. مطمئن شويد که وب سرور شما اجرا است - برنامه نصب يک آيکن جديد در Task Bar شما اضافه کرده است (اين نشانه PWS است). بر روي آن کليک کنيد و دکمه Start را در پنجره اي که آمده بزنيد.

6. Browser خود را باز کنيد و تايپ کنيد "http://localhost/MyWeb/test1.asp"، تا اولين صفحه ASP خود را ببينيد.

چگونه PWS را در ويندوز Me نصب کنيد و ASP اجرا کنيد؟
(Personal Web Server (PWS در ويندوز Me وجود ندارد !!
مقاله مربوطه را در سايت مايکروسافت بخوانيد

چگونه IIS را در ويندوز 2000 نصب کنيد و ASP اجرا کنيد؟

1. از دکمه Start به Settings و سپس Control Panel برويد.

2. در پنجره Control Panel آيکن Add/Remove Programs را انتخاب کنيد.

3. در پنجره Add/Remove Programs گزينه Add/Removes Windows Components را انتخاب کنيد.

4. در پنجره جديد گزينه Internet Information Services را انتخاب کرده، OK را بزنيد.

5. يک شاخه Inetpub در هارد شما ايجاد خواهد شد. آن را باز کنيد و شاخه wwwroot را پيدا کنيد.

6. يک شاخه جديد درست کنيد و نام آن را چيزي شبيه به "MyWeb" بگذاريد.

7. از يک ويرايشگر متن استفاده کنيد و کدهاي ASPي را بنويسيد، فايل را به نام "test1.asp" را در شاخه "MyWeb" ضبط کنيد.

8. مطمئن شويد که وب سرور شما اجرا است - برنامه نصب يک آيکن جديد در Task Bar شما اضافه کرده است (اين نشانه IIS است). بر روي آن کليک کنيد و دکمه Start را در پنجره اي که آمده بزنيد.

9. Browser خود را باز کنيد و تايپ کنيد "http://localhost/MyWeb/test1.asp"، تا اولين صفحه ASP خود را ببينيد.

چگونه IIS را در ويندوز XP نصب کنيد و ASP اجرا کنيد؟
نکته: شما نمي توانيد ASP را روي ويندوز XP نسخه خانگي (Home Edition) اجرا کنيد.

1. از دکمه Start به Settings و سپس Control Panel برويد.

2. در پنجره Control Panel آيکن Add/Remove Programs را انتخاب کنيد.

3. در پنجره Add/Remove Programs گزينه Add/Removes Windows Components را انتخاب کنيد.

4. در پنجره جديد گزينه Internet Information Services را انتخاب کرده، OK را بزنيد.

5. يک شاخه Inetpub در هارد شما ايجاد خواهد شد. آن را باز کنيد و شاخه wwwroot را پيدا کنيد.

6. يک شاخه جديد درست کنيد و نام آن را چيزي شبيه به "MyWeb" بگذاريد.

7. از يک ويرايشگر متن استفاده کنيد و کدهاي ASPي را بنويسيد، فايل را به نام "test1.asp" را در شاخه "MyWeb" ضبط کنيد.

8. مطمئن شويد که وب سرور شما اجرا است - برنامه نصب يک آيکن جديد در Task Bar شما اضافه کرده است (اين نشانه IIS است). بر روي آن کليک کنيد و دکمه Start را در پنجره اي که آمده بزنيد.

9. Browser خود را باز کنيد و تايپ کنيد "http://localhost/MyWeb/test1.asp"، تا اولين صفحه ASP خود را ببينيد.

لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
ورود اطلاعات فارسی با استفاده از جاوااسکريپت | asp
يک شمارنده ساده يا کونتور | asp
ارسال ايميل در ASP ساده و کار آمد | asp
درج تاريخ شمسی | asp
فرستادن فايل يا Upload از صفحه وب | asp
ارسال ايميل با کمک ASP | asp
شي RESPONSE و استفاده از فايل هاي include | asp
برنامه کاربردي تحت وب چيست ؟ | asp
فرم ها در ASP | asp
طرز ساخت کوکي ها | asp
آبجکت Response در ASP | asp
راه اندازي ASP | asp
شروع کار با ASP | asp

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آبجکت Response در ASP

شما نمي توانيد سورس کد هاي ASP را بوسيله انتخاب گزينه View Source در Browser مشاهده کنيد، شما فقط خروجي فايل ASP را مشاهده مى‌کنيد که HTML ساده است. زيرا که اسکريپت ها قبل از اين که نتايج به Browser فرستاده شود بر روي سرور اجرا مى‌گردد.
قواعد اساسي نحو
يک فايل ASP به طور عادي دقيقا همانند HTML حاوي Tagهاي HTML است. اگر چه، يک فايل ASP مي تواند همچنين حاوي Scriptها نيز باشد. اين اسکريپت ها به وسيله علامت هاي %> و <% احاطه شده اند. اسکريپت هاي سرور بر روي سرور اجرا مي شود و مي تواند حاوي هر گونه expressions، دستورات (Statements)، توابع، يا عملگرهايي باشد.

آبجکت Response
متد Write مربوط به آبجکت Response براي فرستادن محتويات به Browser استفاده مي شود. به عنوان مثال، دستورات زير براي فرستادن متن "سلام دنيا!" به Browser استفاده مى‌شود.

<%
response.write("سلام دنيا!")
%>

VBScript
اين امکان وجود دارد که از که از زبان هاي مختلف اسکريپت نويسي در فايلهاي ASP استفاده کنيد. اگرچه زبان پيش فرض، VBScript است.

<html>
<body>
<%
response.write("سلام دنيا!") %>
</body>
</html>

مثال بالا "سلام دنيا!" را در قسمت body متن مي نويسد.

JavaScript
براي اين که JavaScript را به عنوان زبان پيش فرض براي يک صفحه خاص مشخص کنيد مي بايست از راهنماهاي زباني در ابتداي صفحه خود استفاده کنيد:

<%@ language="javascript"%>
<html>
<body>
<%
Response.Write("Hello World!")
%>
</body>
</html>

نکته: JavaScript برعکس VBScript به بزرگ يا کوچک بودن حروف حساس است. شما مجبور خواهيد بود که وقتي زبان احتياج دارد، کد ASP خود را با حروف بزرگ يا کوچک بنويسيد.

ساير زبان هاي اسکريپ نويسي
ASP همراه با VBScript و JScript (پياده سازي مايکروسافت از JavaScript) عرضه مي شود. اگر شما مي خواهيد که با زبان ديگري همچون PERL - REXX يا Phyton کد بنويسيد، مجبور خواهيد بود که موتور Script مربوط به آنها را نصب کنيد.
مهم: به خاطر اين که اسکريپت ها بر روي سرور اجرا مي شوند، به هيچ وجه لازم نيست Browserي که فايل ASP را نشان مي دهد از Scripting پشتيباني کند!
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
ورود اطلاعات فارسی با استفاده از جاوااسکريپت | asp
يک شمارنده ساده يا کونتور | asp
ارسال ايميل در ASP ساده و کار آمد | asp
درج تاريخ شمسی | asp
فرستادن فايل يا Upload از صفحه وب | asp
ارسال ايميل با کمک ASP | asp
شي RESPONSE و استفاده از فايل هاي include | asp
برنامه کاربردي تحت وب چيست ؟ | asp
فرم ها در ASP | asp
طرز ساخت کوکي ها | asp
آبجکت Response در ASP | asp
راه اندازي ASP | asp
شروع کار با ASP | asp

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


طرز ساخت کوکي ها

يك Cookie اغلب براى شناسائى كاربر استفاده مى‌شود.

مثالها
Cookie خوش‌آمدگويى
چگونه يك Cookie خوش‌آمدگويى درست كنيم.

يك Cookie چيست؟
يك Cookie اغلب براى شناسندن كاربر استفاده مى‌شود. يك Cookie يك فايل كوچك است كه سرور آن را در كامپيوتر كاربر جاسازى مى‌كند. هر بار كه همان كامپيوتر يك صفحه را درخواست مى‌كند، Cookie نيز فرستاده مى‌شود. با ASP شما مى‌توانيد هم مقادير Cookie را بسازيد و هم آنها را استخراج نماييد.
چگونه يك Cookie بسازيد؟
Response.Cookie براى ساختن Cookie استفاده مى‌شود.

توجه: Response.Cookie بايد قبل از تگ درج شود.

در مثال زير، ما يك Cookie درست خواهيد كردم و اسم آن را "firstname" مى‌گذاريم و مقدار "Alex" را به آن مى‌دهيم:

<% Response.Cookies("firstname")="Alex" %>همچنين امكان دارد كه خصوصياتى را مثل تاريخ انقضاى cookie را به آن بدهيد:

<% Response.Cookies("firstname")="Alex" Response.Cookies("firstname").Expires=#May 10,2002# %>
چگونه مقدار cookieها را استخراج كنيم
دستور "Request.Cookies" براى استخراج اطلاعات از cookieها استفاده مى‌شود.

در مثال زير، ما مقدار cookieى با نام "firstname" را استخراج كرده و در صفحه نشان داديم:

<% fname=Request.Cookies("firstname") response.write("Firstname=" & fname) %>خروجى:

Firstname=Alex

يك Cookie با كليد
اگر يك cookie حاوى مجموعه‌اى از مقادير باشد، مى‌گوييم آن cookie دارى كليدهايى است.

در مثال زير، ما يك مجموعه cookie با نام "user" درست مى‌كنيم. cookie به نام "user" داراى كليدهايى است كه حاوى اطلاعاتى راجع به كاربر است.

<%
Response.Cookies("user")("firstname")="John"
Response.Cookies("user")("lastname")="Smith"
Response.Cookies("user")("country")="Norway"
Response.Cookies("user")("age")="25"
%>

خواندن همه Cookieها
به كد زير نگاه كنيد:
<%
Response.Cookies("firstname")="Alex"
Response.Cookies("user")("firstname")="John"
Response.Cookies("user")("lastname")="Smith"
Response.Cookies("user")("country")="Norway"
Response.Cookies("user")("age")="25"
%>

فرض كنيم كه سرور شما همه cookieهاى بالا را به كاربر فرستاده است.

حالا ما مى‌خواهيم تمام cookieها را كه به كاربر فرستاده شده است را بخوانيم. مثال زير نشان مى‌دهد كه چگونه اين كار را انجام دهيم (توجه داشته باشيد كه در مثال پايين با استفاده از HasKeys چك مى‌كند كه آيا cookie كليد دارد يا نه؟

<html>
<body>
<%
dim x,y
for each x in Request.Cookies
  response.write("<p>")
  if Request.Cookies(x).HasKeys then
    for each y in Request.Cookies(x)
      response.write(x & ":" & y & "=" & Request.Cookies(x)(y))
      response.write("<br />")
    next
  else
    Response.Write(x & "=" & Request.Cookies(x) & "<br />")
  end if
  response.write "</p>"
next
%>
</body>
</html>

خروجى:

firstname=Alex user:firstname=John user:lastname=Smith user: country=Norway user: age=25

اگر Browser داراى پشتيبانى Cookie نباشد چه اتفاقي مى‌افتد؟

اگر برنامه شما با Browserى سر و كار داشته باشد كه cookie را پشتيبانى نمى‌كند، بايد از روش‌هاى ديگرى براى انتقال اطلاعات از يك صفحه به صفحات ديگر در برنامه خود استفاده كنيد. دو راه براى انجام اين كار هست:

1. اضافه كردن پارامترها به URL

شما مى‌توانيد پارامترها را به URL اضافه كنيد:

<a href="welcome.asp?fname=John&lname=Smith">
Go to Welcome Page</a>

و مقادير موجود در "welcome.asp" را همچون مثال زير استخراج كنيد:

<% fname=Request.querystring("fname") lname=Request.querystring("lname") response.write("

Hello " & fname & " " & lname & "!

") response.write("

Welcome to my Web site!

") %>2. استفاده از form
شما مى‌توانيد از فرم‌ها استفاده كنيد. وقتى كه كاربر روى دكمه Submit كليك كند فرم ورودى‌هاى كاربر را به "welcome.asp" رد مى‌كند:

<form method="post" action="welcome.asp">
First Name:  <input type="text" name="fname" value="">
Last Name: <input type="text" name="lname" value="">
<input type="submit" value="Submit">
</form>

مقادير موجود در "welcome.asp" را همچون اين مثال استخراج كنيد:

<%
fname=Request.form("fname")
lname=Request.form("lname")
response.write("<p>Hello " & fname & " " & lname & "!</p>")
response.write("<p>Welcome to my Web site!</p>")
%>
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
ورود اطلاعات فارسی با استفاده از جاوااسکريپت | asp
يک شمارنده ساده يا کونتور | asp
ارسال ايميل در ASP ساده و کار آمد | asp
درج تاريخ شمسی | asp
فرستادن فايل يا Upload از صفحه وب | asp
ارسال ايميل با کمک ASP | asp
شي RESPONSE و استفاده از فايل هاي include | asp
برنامه کاربردي تحت وب چيست ؟ | asp
فرم ها در ASP | asp
طرز ساخت کوکي ها | asp
آبجکت Response در ASP | asp
راه اندازي ASP | asp
شروع کار با ASP | asp

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


فرم ها در ASP

مثالها
يك فرم با متد "get"
چگونه با استفاده از دستور Request.QueryString به كاربر عكس‌العمل نشان دهيد.

يك فرم با متد "post"
چگونه با استفاده از دستور Request.Form به كاربر عكس‌العمل نشان دهيد.

يك فرم با Radio Buttonها
چگونه با استفاده از دستور Request.Form و از طريق Radio Buttonها به كاربر عكس‌العمل نشان دهيد.

ورودى كاربر
آبجكت Request مى‌تواند براى گرفتن اطلاعات از كاربر از فرم‌ها استفاده گردد.

<form method="get" action="simpleform.asp">
First Name: <input type="text" name="fname">
<br />
Last Name: <input type="text" name="lname">
<br /><br />
<input type="submit" value="Submit">
</form>

ورودى‌هاى كاربر مى‌توانند از دو طريق استفاده گردد: با Request.QueryString يا Request.Form

Request.QueryString

دستور Request.QueryString براى جمع كردن مقادير موجود در يك فرم با متد "get" استفاده مي شود. اطلاعات فرستاده شده از فرمى با متد "get" براي هر كسى قابل مشاده است (اين اطلاعات در قسمت آدرس Browser نشان داده مي شود) و در مورد مقدار اطلاعات محدوديت دارد.

اگر كاربر در فرمى با متد "get" مقدار "Bill" و "Gates" را وارد كنيد، URLى كه به سرور فرستاده مى‌شود شبيه به اين خواهد بود:

http://www.irandevelopers.com/simpleform.asp?fname=Bill&lname=Gates

فرض كنيد فايل "simpleform.asp" حاوى اسكريپت زير است:

<body>
Welcome
<%
response.write(request.querystring("fname"))
response.write(" " & request.querystring("lname"))
%>
</body>

Browser خط زير در قسمت Body سند نشان خواهد داد:

Welcome Bill Gates

Request.Form

دستور Request.Form براي جمع كردن اطلاعات از يك فرم با متد "post" استفاده مى‌شود. اطلاعات فرستاده شده از فرمى با متد POST براي بقيه غيرقابل مشاهده است و هيچ محدوديتى در مقدار اطلاعات فرستاده شده ندارد.

اگر كاربر در فرمى با متد "post" كلمه "Bill" و "Gates" را تايپ كند، URLى كه به سرور فرستاده مى‌شود شبيه به اين خواهد بود:

http://www.w3schools.com/simpleform.asp

فرض كنيد كه فايل "simpleform.asp" حاوى اسكريپت زير باشد:

<body>
Welcome
<%
response.write(request.form("fname"))
response.write(" " & request.form("lname"))
%>
</body>

Browser خط زير در قسمت Body سند نشان خواهد داد:

Welcome Bill Gates

تصديق فرم يا تست معتبر بودن (درست بودن) مقادير ورودى
ورودى كاربر بايد در Browser در هر جايى كه امكان داشت (با استفاده از اسكريپتهاى client) تصديق گردد. تصديق Browserى سريعتر است و زمان load شدن سرور را نيز كاهش مى‌دهد

در صورتى كه مقادير ورودى كاربر وارد Database مى‌شود لازم است كه معتبرسازى يا تصديق ورودى‌هاى كاربر بر روى سرور انجام شود. يك راه خوب براى تصديق ورودى‌هاى كاربر، به جاى فرستادن اطلاعات به يك صفحه ديگر، پست كردن آنها به خود فايل است. در آن صورت كاربر مى‌تواند خطاها را در خود صفحه‌اى كه فرم در آن قرار دارد مشاهده نمايد. اين پيدا كردن خطا را براى وى ساده‌تر مى‌كند.
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
ورود اطلاعات فارسی با استفاده از جاوااسکريپت | asp
يک شمارنده ساده يا کونتور | asp
ارسال ايميل در ASP ساده و کار آمد | asp
درج تاريخ شمسی | asp
فرستادن فايل يا Upload از صفحه وب | asp
ارسال ايميل با کمک ASP | asp
شي RESPONSE و استفاده از فايل هاي include | asp
برنامه کاربردي تحت وب چيست ؟ | asp
فرم ها در ASP | asp
طرز ساخت کوکي ها | asp
آبجکت Response در ASP | asp
راه اندازي ASP | asp
شروع کار با ASP | asp

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


برنامه کاربردي تحت وب چيست ؟
يك برنامه كاربردي تحت وب بايك وب سايت تفاوت دارد . يك وب سايت شامل اطلاعات ثابتي است كه از پيش آماده شده و به صورت فايل هاي HTML ذخيره شده اند .در اين حالت جهت حركت اطلاعات از سرويس دهنده به
سرويس گيرنده مي باشد . در واقع وب سايت اطلاعات را به كاربر ارائه مي دهد .
بين درخواست ها ، سرويس دهنده از عملكرد سرويس گيرنده اطلاعي ندارد . سرويس گيرنده مي تواند از يك محل به محل ديگر بپرد و اين كار روي وب سايت اوليه هيچ تاثيري ندارد ، چون هر يك از صفحات به صورت يك واحد كاملا جدا مي باشند . در واقع وب سايت شامل گروهي از فايل هاي HTML از هم جدا مي باشد .
در مقابل ، يك برنامه كاربردي تحت وب ، اطلاعات را براي يك كاربر يا گروهي از كاربران به شكلي خاص فرمت كرده و ارائه مي دهد . در اين حالت ، جهت حركت اطلاعات دو طرفه مي باشد ؛ محتوياتي كه توسط مرور گر
نمايش داده مي شوند ، بر حسب اطلاعات ورودي كاربر يا هويت وي تعيين مي گردند .
بنابر اين يك برناها كاربردي تحت وب ، اطلاعات را به صورت ديناميكي ارائه مي دهد نه به صورت فايل هاي HTML ثابت . در واقع وظيفه برنامه ، فراهم كردن اطلاعات بر حسب شرايط است كه اين اطلاعات معمولا از پايگاه داده ( Database ) بدست مي آيد . برنامه كاربردي نه تنها اطلاعات مي دهد ، بلكه مي تواند از كاربر اطلاعات بگيرد و بكارهاي مختلف پاسخ مناسب دهد . به عبارت ديگر ، يك برنامه كاربردي ، عملكرد كاربر را از يك در خواست به
درخواست ديگر رديابي مي كند . بنابراين كاربر مي تواند آن گونه كه در يك وب سايت به جستجو و گردش مي پردازد ، به شكل دلخواه تمام صفحات يك برنامه كاربردي را برسي و مشاهده كند . بلكه اين برنامه كاربردي است كه صفحات مناسب را در شرايط مقتضي به طور ديناميكي توليد كرده و به كاربر ارائه مي دهد .
براي نوشتن برنامه هاي كاربردي تحت وب از زبان هاي مختلفي مي توان استفاده كرد ، مثل : Perl , Python , Java , C , C ++ , Visual Basic حتي Quick Basic يا Script هاي Unix .
در هر صورت مواردي كه در زير به آنها اشاره مي شود جزء ضروريات يك برنامه كاربردي هستند :
- ارتباط با يك پايگاه داده
- سرعت
- كار با رشته ها
- امنيت ( Security )
- تراكنش ها ( Tranaactions )
تراكنش چيست ؟
يك برنامه كاربردي تحت وب اغلب بايد كارهاي مختلفي انجام دهد كه هر يك از آنها براي تداوم اعتبار اطلاعات بايد به طور كامل انجام شوند . هنگام كار با يك پايگاه داده ، معمولا اين كار ها را بصورت يك تراكنش در نظر مي گيريم . يك تراكنش قرار دادي است كه موفقيت يا عدم موفقيت مجموعه اي از عمليات را تضمين مي كند كه در صورت عدم موفقيت ، اطلاعات بايد دست نخورده باقي بمانند . به عنوان يك نمونه كلاسيك ، مي توانيم يك حساب چك ( Checking Account ) را در نظر بگيريم .
هنگامي كه يك چك را به حساب خود مي گذاريد ، بانك مبلغ مشخص شده را از حساب مربوطه برداشته و به حساب شما واريز مي كند . كل اين عمليات در صورتي موفقيت آميز خواهد بود كه برداشت و واريز پول به طور كامل انجام شود . در اين حالت عمل دو گانه برداشت از يك حساب و واريز به يك حساب ديگر را يك تراكنش مي گوييم .

تفاوت ميان برنامه هاي IIS و DHTML
برنامه هاي IIS ، برنامه هايي هستند كه برروي سرويس دهنده و تحت Microsoft Internet Information Server اجرا مي شوند . در مقابل ، برنامه هاي DHTML برنامه Microsoft Internet Explorer استفاده مي كنند و به اين ترتيب به ورودي هاي كاربر پاسخ سريع مي دهند .
اين برنامه ها براي نوشتن بازي ها و شبيه سازي محيط و گرفتن اطلاعات از كاربر مناسب هستند . متاسفانه اين نوع برنامه ها به نسخه چهارم IE يا نسخه هاي بالاتر آن نياز دارند . با توجه به اين كه در اين كتاب به تفصيل در مورد ASP و
مسائل حاشيه اي آن بحث خواهيم كرد ، بد نيست كمي بيشتر در مورد برنامه هاي IIS توضيح دهيم . چون هدف از يادگيري ASP ، نوشتن برنامه هاي IIS مي باشد كه بر روي سرويس دهنده اجرا مي شوند .
برنامه هاي IIS با چندين مرورگر مختلف و نسخه هاي متفاوت آنها سازگاري دارند . همچنين در محيط هاي مختلف Mak يا Unix نيز اجراء مي شوند . بنابر اين اين نوع برنامه ها براي نوشتن برنامه هاي تجاري كه مخاطبين زيادي دارند مناسب هستند ؛ چون دليلي ندارد همه كاربران از ويندوز استفاده كرده و يا نسخه IE را در اختيار داشته باشند.
با توجه به اين كه برنامه هاي IIS برروي سرويس دهنده اجرا مي شوند ، براي به روز در آوردن آنها تنها كافي است كد موجود برروي سرويس دهنده را تغيير داد. اين نوع برنامه ها از هر محلي قابل دسترسي مي باشند . هنگامي كه يك برنامه IIS برروي سرويس دهنده نصب شده و به اجرا در آمد ، هر كامپيوتري كه بتواند به آن سرويس دهنده متصل شود مي تواند از آن برنامه استفاده كند .
شما مي توانيد براي شناسايي كاربران ، به آنها نام و كلمه عبور اختصاص دهيد و هنگام برقراري ارتباط با برنامه كاربردي ، نام و كلمه عبور را در خواست كنيد . با توجه به اين كه تمام اطلاعات بر روي يك كامپيوتر ذخيره مي شوند ،
هنگامي كه كاربر برنامه كاربردي را ترك كند ، هيچ نوع اطلاعاتي را از دست نمي دهد .
در قسمت بعد ، در مورد چگونگي كاركرد برنامه هاي IIS بحث خواهيم كرد .
چگونگي در خواست فايل ها توسط مرورگر :
هنگامي كه شما يك آدرس URL در فيلد آدرس مرورگر خود تايپ مي كنيد ، چند چيز اتفاق مي افتد . مرورگر ، آدرس وارد شده را تحليل كرده و پيغامي به سرويس دهنده نام ( Name Server ) مي فرستد تا نام مشخص شده
(به عنوان مثال ، Microsoft . com ) را به يك آدرس IP ( Internet Protocol ) – (به عنوان مثال ، 207.84.25.32 ) ترجمه كند . سپس مرورگر با استفاده از آن آدرس IP به سرويس دهنده مربوطه متصل شده و فايل را درخواست مي كند . سرويس دهنده فايل را مي خواند و محتويات آن را به مرورگر بر مي گرداند . در اين مرحله مرورگر ، دستورات HTML آن فايل را تحليل و فرمت فايل راتعيين مي كند . بيشتر فايل هاي HTML درون خود به تصاوير گرافيكي اشاره مي كنند. اين اشاره ها به صورت رفرنس (Reference ) بوده كه هريك از آنها نيز بايك آدرس
URL مشخص مي شوند .
بنابراين كل اين عمليات براي تك تك تصاوير و يا فايل هاي ديگري كه با رفرنس به آنها اشاره شده است تكرار مي شود.
به اين ترتيب پروسه نمايش يك فايل HTML شامل تعدادي تراكنش كوچك بين سرويس گيرنده ( يعني مرورگر ) و سرويس دهنده وب مي باشد .
برنامه هاي IIS نيز تقريبا به همين صورت عمل مي كنند. ابتدا يك مرورگر يك صفحه را از سرويس دهنده درخواست مي كند . اين درخواست هميشه براي يك فايل خاص مي باشد . پاسخ سرويس دهنده به نوع فايل درخواستي بستگي دارد. اگر فايل مورد نظر از نوع HTML (با پسوند .htm يا .html ) باشد ، سرويس دهنده به سادگي محتويات فايل را مي خواند و محتويات آنرا به صورت يك رشته در آورده و براساس قوانين URL كد گذاري مي كند و سپس رشته حاصله را به مرورگر برمي گرداند . كل اين پروسه ، از درخواست تا پاسخ ، يك تراكنش مابين سرويس گيرنده و سرويس دهنده تلقي مي شود . سرويس گيرنده همواره تراكنش را شروع مي كند و سپس تا زمان رسيدن پاسخ از سوي سرويس دهنده منتظر مي ماند كه در اين زمان تراكنش كامل شده و خاتمه مي يابد .
درخواست فايل از سرويس دهنده وب مشابه هنگامي است كه در Windows Explorer روي يك فايل شبكه اي ( فايلي كه برروي كامپيوتر سرويس دهنده قرار دارد ) دوبار – كليك مي كنيد ؛ البته با دو تفاوت :
-
- سرويس دهنده وب هيچگاه اجازه نمي دهد كه برنامه محلي شما (يعني مرورگر ) فايل درخواستي را باز كرده يا درآن چيزي بنويسيد ؛ در عوض خودش فايل را باز مي كند و محتويات آن را برميگرداند .
- ارتباط مابين سرويس گيرنده و سرويس دهنده گذرا ( Transient ) است . براي برقراري ارتباط با سرويس دهنده وب نيازي به مشخص كردن نام درايوي كه فايل بر روي آن قرار دارد نيست . پس از اين كه سرويس دهنده وب به درخواست شما پاسخ داد، ارتباط را قطع مي كند.
هنگامي كه تراكنش كامل شد ، سرويس دهنده وب ، سرويس گيرنده را به طور كلي از ياد مي برد . اگر بلا فاصله كليد
Refresh ( موجود برروي نوار ابزار IE ) را كليك كنيد . سرويس دهنده وب ، آن تراكنش را تكرار مي كند و اصلا به خاطر نمي آورد كه 5 ثانيه قبل اين فايل توسط شما درخواست شده است .
اگر ارتباط براساس پروتكل استاندارد HTTP برقرارشود ، بيشتر فايل ها به چندين تراكنش نياز دارند ، يكي براي فايل Html اصلي و بقيه براي يكايك فايل هاي گرافيكي كه در فايل اصلي به آنها اشاره شده است . بنابراين براي نمايش يك فايل كه شامل 5 تصوير گرافيكي است ، مرورگر درخواست جداگانه به سرويس دهنده وب مي فرستد .
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
ورود اطلاعات فارسی با استفاده از جاوااسکريپت | asp
يک شمارنده ساده يا کونتور | asp
ارسال ايميل در ASP ساده و کار آمد | asp
درج تاريخ شمسی | asp
فرستادن فايل يا Upload از صفحه وب | asp
ارسال ايميل با کمک ASP | asp
شي RESPONSE و استفاده از فايل هاي include | asp
برنامه کاربردي تحت وب چيست ؟ | asp
فرم ها در ASP | asp
طرز ساخت کوکي ها | asp
آبجکت Response در ASP | asp
راه اندازي ASP | asp
شروع کار با ASP | asp

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


شي RESPONSE و استفاده از فايل هاي include

براي پاسخ گويي به مرورگر ، از متدهاي شيء Response استفاده مي شود . در واقع شيء Response راهي براي برقراري ارتباط با سرويس گيرنده است .

شيء Scripting Context :
اين شيء امكان دسترسي اشياء ActiveX خارجي به اشياء دروني ASP را فراهم مي كند. البته بهتر است به جاي اين شيء از شيء Object Context استفاده كنيد . براي گرفتن شيء Object Context نيز بايد متد Object Context() را فراخواني كنيد .
شيء Scripting Context ، تمام اشياء ASP را درون خود جمع مي كند . هنگامي كه يك صفحه ASPكه شامل رفرنس هايي به اشياء ActiveX مي باشد اجراء ميشود ، ابتدا موتور ASP متد On Start Page هر يك از آن اشياء ActiveX را فراخواني كرده و شيء Scripting Context را به عنوان پارامتر به آن مي فرستد. اشياء ActiveX با استفاده از اين پارامتر مي توانند اشاره گر هايي به اشياء Server ، Application ، Request و Response به دست آورند. در اين جا ليستي از ويژگي هاي شيء Scripting Context را ملاحظه مي كنيد :
• Server
• Application
• Session
• Request
• Response

هر يك از اين 5 ويژگي يك اشاره گر ( Pointer ) به يكي از اشياء دروني ASP بر مي گردانند .
• توجه : Microsoft توصيه مي كند كه به جاي استفاده از شيء Scripting Context از متد
get Object Context اگر چه امكان استفاده از شيء Scripting Context كماكان وجود دارد، ولي بايد بدانيد كه اين شيء از رده خارج شده و در برنامه هاي جديد خود نبايد از آن استفاده كنيد .

شيء Object Context :
شيء Object Context به عنوان پل ارتباطي با MTS ( Microsoft Transaction Server ) تلقي مي شود. با MTS شما مي توانيد كاري كنيد كه اشياء ActiveX در تراكنش هايي كه صفحه ASP آغاز شده اند شركت كنند. همچنين با استفاده از شيء Object Context در هنگام نوشتن اشياء ActiveX مي توانيد به اشياء دروني ASP دسترسي پيدا كنيد .
آشنايي با ساختار يك برنامه ASP
از نظر موتور ASP ، يك برنامه كاربردي عبارت است از مجموعه اي از تمام فايل و زير دايركتوري هاي ( Subdirectory ) موجود در يك دايركتوري كه شامل فايل Global . asa باشد . بيشتر برنامه هاي كاربردي ASP شامل فايل هاي ASP و فايل هاي Include ( با پسوند .inc ) هستند كه هر دوي آنها مي توانند تركيبي از HTML ، كد و فايل هاي گرافيكي باشند. البته شما مي توانيد فايل هاي ASP را با فايل هاي HTML يا هر فايل ديگري كه براي سرويس دهنده قابل شناسايي باشد تركيب كنيد .

بالاترين دايركتوري در اين ساختار شامل فايل Global . asa است . اين فايل دايركتوري ريشه ( Root Directory )
برنامه كاربردي را مشخص مي كند .
اولين باري كه يك كاربر يكي از فايل هاي ASP موجود در يكي از دايركتوري هاي برنامه را درخواست مي كند ، موتور ASP ساختار درختي درختي دايركتوري ها را به سمت بالا طي ميكند تا فايل Global . asa را پيدا كند و يا به ريشه وب ( Root Web Directory ) برسد . اين نكته از اهميت زيادي برخوردار است ، چون اگر شما چند برنامه كاربردي را درون هم قرار دهيد ( كه به آنها برنامه هاي كاربردي تودرتو – Nested Applications - مي گويند ) ، فايل Global . asa كه براي هر درخواست كاربر اجرا مي شود بستگي دارد به اين كه كاربر ابتدا كدام فايل را درخواست نمايد . چون نمي توان اولين درخواست كاربر را كنترل نمود ، بهتر است برنامه هاي ASP را درون هم قرار ندهيد ؛ مگر اين كه دليل موجهي براي اين كار داشته باشيد .
ساختن يك برنامه كاربردي وب تحت IIS 4.0 به يك مرحله ديگر نيز دارد : شما بايد به IIS بگوييد كه دايركتوري مجازي ( Virtual Directory ) در برگيرنده فايل Global . asa ، دايركتوري ريشه برنامه كاربردي است .
صرف نظر از اين كه كدام فايل درخواست شود، فايل Global . asa همواره اولين فايلي خواهد بود كه اجرا ميشود. بنابراين اگر در نظر داريد كاربر برنامه كاربردي شما را با صفحه خاصي كه مورد نظر شماست آغاز كند ، اين فايل بهترين جايي است كه ميتوانيد مرورگر را به آن صفحه هدايت كنيد .
برنامه كاربردي كه درشكل قبل ملاحظه فرموديد ، شامل چندين فايل ASP و دو زيردايركتوري به نام هاي images و include مي باشد. البته از نظر تعيين ساختار دايركتوري هاي يك برنامه كاربردي هيچ محدوديتي وجود ندارد ؛ شما مي توانيد همه فايل ها را درون يك دايركتوري قرار دهيد . ولي در عمل ، بهتر است كه فايل ها را بر اساس كارايي آنها دسته بندي كنيد چون اين كار ساختن و نگهداري برنامه را بسيار آسان تر مي كند .
• توجه : دايركتوري ريشه وب و دايركتوري ريشه برنامه ASP لزوما نبايد يكسان باشند. به عنوان مثال ،
مي توانيد براي چندبرنامه كاربردي ASP ازيك فايل Global . asa استفاده كنيد. در اين شرايط مي توانيد فايل Global . asa را درون يك دايركتوري قرار داده و سپس هر يك از زير دايركتوري هاي درون آن را به عنوان يك دايركتوري مجازي تعريف كنيد كه بر اساس برنامه كاربردي مربوطه نامگذاري شده اند . ساختار دايركتوري موجود در شكل زير ، شامل 4 برنامه كاربردي است : 401k ، Paycheck ، Retirement ، Timesheet .

بالاترين دايركتوري ، كه HR Applications نام دارد، شامل فايل Global . asa است . هر زمان كه يك كاربر به يكي از 4 برنامه كاربردي موجود متصل شود ، موتور ASP ساختار درختي دايركتوري هارا بالا مي رود تا به دايركتوري
HR Applications كه در بر گيرنده فايل كه Global . asa است برسد . يكي از دلايلي كه مي توان براي مرتب كردن برنامه ها به اين شكل در نظر گرفت ، اين است كه ممكن است هر چهار برنامه از يك روش امنيتي استفاده كنند و يا ممكن است تمام برنامه ها از يك نوع روش براي برقراي ارتباط با پايگاه داده و يا از يك پايگاه داده مشترك استفاده كنند و شما بخواهيد اطلاعات اوليه را در فايل Global . asa تنظيم كنيد .

استفاده از فايل هاي Include :
براي جلوگيري از تكرار كد يا دستورات HTML در صفحات ASP ، مي توانيد از فايل هاي خارجي استفاده كرده و آنها را در صفحات ASP خود بگنجانيد . يك فايل Include در يك فايل ASP از دستور INCLUDE استفاده مي شود . دستور INCLUDE مشابه اين است كه محتويات فايل include مورد نظر را درون يك صفحه ديگر قرار دهيد.در اين جا مثالي از يك دستور INCLUDE را مشاهده مي كنيد :

<!--# INCLUDE = “C:\ include \my Include .inc” -- >

اين دستور سبب مي شود كه سرويس دهنده آن را با محتويات فايل مشخص شده جايگزين كند. دو نوع دستور INCLUDE موجود است : يكي # INCLUDE FILE و ديگري # INCLUDE VIRTUAL . نوع اول براي مشخص كردن فايل به يك آدرس فيزيكي نياز دارد در حالي كه نوع دوم به آدرس مجازي به فايل اشاره مي كند . به هر حال از هر روشي كه استفاده كنيد، موتور ASP قبل از شروع پردازش دستورات ، آن را با محتويات فايل مورد نظر جايگزين مي كند . بنابر اين براي گنجانيدن يك فايل نمي توانيد از دستورات شرطي استفاده كنيد . به عنوان مثال ، كد زير به گونهاي كه انتظار مي رود عمل نخواهد كرد ؛ موتور ASP هر دو فايل را خواهد گنجاند :

< %
if my Var = True than
% >
< ! -- # INCLUDE FILE = “ C: \ include \ my Include . inc” -- >
< %
else
%>
< ! -- # INCLUDE FILE = “ C: \ include \ your Include . inc” -- >
< %
end if
% >

هنگامي كه موتور ASP اين فايل را تحليل مي كند ، دو دستور INCLUDE را با فايل هاي نامبرده جايگزين مي كند و اين كار را قبل از اجراي دستور if…end if انجام مي دهد . پس باز هم تاكيد مي كنم : شما با استفاده از كد نمي توانيد براي موتور ASP تعيين كنيد كه كدام فايل را بگنجاند و يا اين كه اصلا يك فايل را بگنجاند يا خير.
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
ورود اطلاعات فارسی با استفاده از جاوااسکريپت | asp
يک شمارنده ساده يا کونتور | asp
ارسال ايميل در ASP ساده و کار آمد | asp
درج تاريخ شمسی | asp
فرستادن فايل يا Upload از صفحه وب | asp
ارسال ايميل با کمک ASP | asp
شي RESPONSE و استفاده از فايل هاي include | asp
برنامه کاربردي تحت وب چيست ؟ | asp
فرم ها در ASP | asp
طرز ساخت کوکي ها | asp
آبجکت Response در ASP | asp
راه اندازي ASP | asp
شروع کار با ASP | asp

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


ارسال ايميل با کمک ASP

استفاده از آبجکت CDONTS که يکي از کامپوننتهاي ويندوز سرور 2000 و ان تي مي باشد به راحتي مي توان در اسکريپتهاي سمت سرور
ايميل ارسال کرد.
طريقه استفاده به شکل زير مي باشد

<%
Dim objNewMail
Set objNewMail = Server.CreateObject("CDONTS.NewMail")
%>

مقادير قابل تنظيم براي اين آبجکت به شرح جدول زير مي باشد.

From | يک مقدار رشته اي که آدرس پست الکترونيکي فرستنده را مشخص مي کند (به طور مثال Me@somewhere.com)
To | يک مقدار رشته اي که آدرس پست الکترونيکي گيرنده را مشخص مي کند. (به طور مثال, someone@somewhere.com) آدرس گيرنده هاي مختلف با استفاده از علامت روبرو امکان پذير ميباشد ";"
Subject | عنوان پيام
Body | متن پيام
Cc | آدرس پست الکترونيکي شخصي که قرار است يک کپي از نامه را دريافت کند
Bcc | آدرس الکترونيکي شخصي که قرار است يک کپي از نامه را دريافت کند ( بدون اطلاع دريافت کننده نامه)
Importance | يک مقدار عددي که نشان دهنده در جه اهميت نامه مي باشد (براي مثال خيلي مهم , مهم , عادي )
BodyFormat | يک مقدار عددي که نشان دهنده فرمت اطلاعات متن نامه مي باشد ObjMail.BodyFormat = 0 (HTML format) ObjMail.BodyFormat = 1 (متن عادي)
MailFormat | يک مقدار عددي که نشان دهنده فرمت اطلاعات نامه مي باشد ObjMail.MailFormat = 0 (Mime format) ObjMail.MailFormat = 1 (متن عادي)

متودهاي اين آبجکت

AttachFile | اين متود يک فايل را به نامه پيوست مي کند
AttachURL | اين متود آدرس فايل پيوست شده را تخصيص مي دهد
Send | اين متود نامه را ارسال مي کند

بعد از ارسال ايميل مقادير در حافظه باقي مي ماند و شما بايد حافظه را خالي کنيد. همچنين براي ارسال يک ايميل جديد بايد يک آبجکت جديد
ايجاد کرده و از آن استفاده کنيد. کد زير نحوه استفاده از اين آبجکت را در asp نشان مي دهد.

<%
Option Explicit

Dim objNewMail

' ابتدا يک آبجکت از نوع cdonts ايجاد مي کنيم
Set objNewMail = Server.CreateObject("CDONTS.NewMail")

' بعد از ايجاد آبجکت ما بايد مقادير مربوط به آن را تنظيم کنيم

objNewMail.From = "webmaster@iran.com"
objNewMail.To = "test@yahoo.com"

objNewMail.Subject = "اين يک ايميل تستي است"
objNewMail.Body = "اين متن نامه است"
objNewMail.Send

' بعد از ارسال ايميل با استفاده از کد زير فضاي حافظه را خالي مي کنيم

Set objNewMail = Nothing

Response.Write "ايميل ارسال شد"

%>
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
ورود اطلاعات فارسی با استفاده از جاوااسکريپت | asp
يک شمارنده ساده يا کونتور | asp
ارسال ايميل در ASP ساده و کار آمد | asp
درج تاريخ شمسی | asp
فرستادن فايل يا Upload از صفحه وب | asp
ارسال ايميل با کمک ASP | asp
شي RESPONSE و استفاده از فايل هاي include | asp
برنامه کاربردي تحت وب چيست ؟ | asp
فرم ها در ASP | asp
طرز ساخت کوکي ها | asp
آبجکت Response در ASP | asp
راه اندازي ASP | asp
شروع کار با ASP | asp

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


فرستادن فايل يا Upload از صفحه وب

در اينجا به ذكر نمونه اي از يك كد آماده براي بارگزاري فايل از طريق صفحه وب ( Upload ) به يك سرويس دهنده مي پردازيم . اين كدها از مجموعه موجود در سايت

گرفته شده اند . در ابتدا بايد هر دو فايل زير را بسازيد :

upload_page.asp :

upload_class.asp :

حالا كافيست در فايل اول در خط 15 مسير را براي ذخيره فايلها روي سرويس‌دهنده خود مشخص كنيد :

.Path = "D:\Inetpub\wwwroot\test";

مسير تعيين شده بايد حتماً موجود باشد
لينک مقاله
http://asp.persianblog.com :منبع

مقالات مرتبط با اين موضوع
ورود اطلاعات فارسی با استفاده از جاوااسکريپت | asp
يک شمارنده ساده يا کونتور | asp
ارسال ايميل در ASP ساده و کار آمد | asp
درج تاريخ شمسی | asp
فرستادن فايل يا Upload از صفحه وب | asp
ارسال ايميل با کمک ASP | asp
شي RESPONSE و استفاده از فايل هاي include | asp
برنامه کاربردي تحت وب چيست ؟ | asp
فرم ها در ASP | asp
طرز ساخت کوکي ها | asp
آبجکت Response در ASP | asp
راه اندازي ASP | asp
شروع کار با ASP | asp

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


درج تاريخ شمسی

تا به حال الگوريتم‌های زيادی برای نمايش تاريخ جاری بر اساس تقويم جلالی ارائه شده‌اند . در زير يک نمونه ساده ولی کارآمد آن ارائه می شود . اين نمونه تاريخ Server را نشان می دهد . برای اينكه تاريخ از روی كامپيوتر بازديدكننده محاسبه شود كافيست runat=server را از كد حذف كنيد .
لينک مقاله
http://asp.persianblog.com :منبع

مقالات مرتبط با اين موضوع
ورود اطلاعات فارسی با استفاده از جاوااسکريپت | asp
يک شمارنده ساده يا کونتور | asp
ارسال ايميل در ASP ساده و کار آمد | asp
درج تاريخ شمسی | asp
فرستادن فايل يا Upload از صفحه وب | asp
ارسال ايميل با کمک ASP | asp
شي RESPONSE و استفاده از فايل هاي include | asp
برنامه کاربردي تحت وب چيست ؟ | asp
فرم ها در ASP | asp
طرز ساخت کوکي ها | asp
آبجکت Response در ASP | asp
راه اندازي ASP | asp
شروع کار با ASP | asp

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


ارسال ايميل در ASP ساده و کار آمد

با اين کد ساده می توان صفحه‌ای برای ارسال ايميل ايجاد کرد . اين کُد را يک هندی به نام مستعار Prince Joseph نوشته است و آنطور که گفته ملزومات سيستمی آن برای اجرا عبارتند از : يک ويندوز نسخه سرويس دهنده و SMTP Service بر روی IIS . اين دو صفحه با استفاده از کامپوننت يا ابزار CDO که توسط شرکت مايکروسافت ارائه شده کار می کنند .

: mailSend.htm

<html><body>
<form id=frmMail method=post action=mailSend.asp>
TO:<input type=text name=txtTo size=30><br>
FROM:<input type=text name=txtFrom size=30><br>
SUBJECT:<input type=text name=txtSubject size=30><br>
BODY:<textarea rows="5" name=txtBody cols="28">
</textarea><br>
<input type=submit value="Send the Mail">
</form>
</body></html>

mailSend.asp :

<%@ Language=VBScript %>
<%
Dim objMail
Set objMail = CreateObject("CDONTS.NewMail")
objMail.From = Request.Form("txtFrom")
objMail.To= Request.Form("txtTo")
objMail.Subject= Request.Form("txtSubject")
objMail.Body= Request.Form("txtBody")
objMail.Send
Set objMail = Nothing
Response.Write "Mail should have been sent"
%>
لينک مقاله
http://asp.persianblog.com :منبع

مقالات مرتبط با اين موضوع
ورود اطلاعات فارسی با استفاده از جاوااسکريپت | asp
يک شمارنده ساده يا کونتور | asp
ارسال ايميل در ASP ساده و کار آمد | asp
درج تاريخ شمسی | asp
فرستادن فايل يا Upload از صفحه وب | asp
ارسال ايميل با کمک ASP | asp
شي RESPONSE و استفاده از فايل هاي include | asp
برنامه کاربردي تحت وب چيست ؟ | asp
فرم ها در ASP | asp
طرز ساخت کوکي ها | asp
آبجکت Response در ASP | asp
راه اندازي ASP | asp
شروع کار با ASP | asp

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


يک شمارنده ساده يا کونتور

اين برنامه يک مثال خوب از نحوه باز کردن ، خواندن و نوشتن داخل يک فايل است که نياز به هيچ نوع بانک اطلاعاتی هم ندارد . اين فايل را با اسم counter.asp ذخيره کنيد و در کنارش يک فايل متنی ساده به کمک NotePad و به نام database.inc ايجاد کنيد و در سطر اولش هم عدد صفر يا هر عدد ديگری را که مايليد پيش‌فرض شمارنده شما باشد بنويسيد. فراموش نکنيد که سطح دسترسی لازم برای نوشتن را نيز به اين فايل بدهيد . با کمی ابتکار می توان اين شمارنده را به نوع گرافيکی تبديل کرد. حتی می توانيد به تعداد صفحات سايت ، فايل ايجاد کنيد تا تعداد مشاهده هر صفحه را به تنهايی رديابی کنيد.

<%
Dim objFSO , objFile
set objFSO = createobject("scripting.filesystemobject")
set objFile = objFSO.opentextfile(server.mappath("database.inc"))
'get the current count and store in counter
counter = clng(objFile.readline)
'add one to the current count
counter = counter + 1
'close file object
objFile.close
'write a new text object with the same name and new count
Set objFile = objFSO.CreateTextFile(server.mappath("database.inc"), true)
objFile.writeline(counter)
'close file object
objFile.close
'
counter_length = len(counter)
'loop through the hit count and display the image
for i = 1 to counter_length
%>
<%= mid(counter,i,1) %>
<%
next
%>
لينک مقاله
http://asp.persianblog.com :منبع

مقالات مرتبط با اين موضوع
ورود اطلاعات فارسی با استفاده از جاوااسکريپت | asp
يک شمارنده ساده يا کونتور | asp
ارسال ايميل در ASP ساده و کار آمد | asp
درج تاريخ شمسی | asp
فرستادن فايل يا Upload از صفحه وب | asp
ارسال ايميل با کمک ASP | asp
شي RESPONSE و استفاده از فايل هاي include | asp
برنامه کاربردي تحت وب چيست ؟ | asp
فرم ها در ASP | asp
طرز ساخت کوکي ها | asp
آبجکت Response در ASP | asp
راه اندازي ASP | asp
شروع کار با ASP | asp

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


روش نصب PHP بروى Windows ها

روش نصب PHP بروى windows 95/98/Me NT/2000/XP
PHP بر روى win32 بدو صورت نصب مىشود

1 - بصورت CGI executable
2 - بصورت server module SAPI

1 - نصب PHP بصورت CGI executable :
نصب PHP بصورت CGI executable بسيار ساده مىباشد براى اين كار شما بايد بر روى PC خود يكى از web server هاى زير را داشته باشيد

Personal Web Server 3 and 4 or newer
Internet Information Server 3 and 4 or newer
Apache 1.3.x
OmniHTTPd 2.0b1 and up
Oreilly Website Pro
Xitami
Netscape Enterprise Server, iPlanet
در سايت www.php.net شما مىتوانيد php Installer را بر روى PC خود ذخيره كنيد
اين برنامه php را بر روى PC شما بصورت CGI executable و با پشتيبانى MySQL نصب خواهد كرد و web Server شما را بصورت automatic تنظيم خواهد كرد
--------------------------------------------------------------------------------
2 - نصب PHP بر روى win32 بصورت server module SAPI :

نصب PHP بصورت server module SAPI بر روى Apache توسط دوست عزيزمان آقاى على نادرى در قسمت مقالات بطور كامل توضيح داده شده است
و اما نصب PHP بر روى IIS :
جهت اين كار ابتدا بايد PHP را از اين آدرس Windows Binaries بر روى PC خود ذخيره كنيد
محتويات اين فايل كه بصورت zip است را در شاخه‌اى كه مىخواهيد php را نصب كنيد قرار دهيد c:\php خوب است
پس از اين كار فايل‌هاى php4ts.dll و sapi/php4isapi.dll و dlls/*.dll را در شاخه system ذخيره كنيد

c:\windows\system for Windows 9x/ME
c:\winnt\system32 for Windows NT/2000
c:\windows\system32 for Windows XP
فايل php.ini-recommended را به php.ini تغيير نام داده و در شاخه WINDOWS ذخيره كنيد
در فايل php.ini تغييرات زير را ايجاد كنيد:
شما بايد extension_dir را به شاخه extension هاى مورد نظر خود تغيير دهيد چنانچه مطابق با توضيحات پيش رفته باشيد اين مسير c:\php\extensions مىباشد
فايل browscap.ini را در

c:\windows\system\inetsrv\browscap.ini on Windows 9x/Me,
c:\winnt\system32\inetsrv\browscap.ini on NT/2000,
c:\windows\system32\inetsrv\browscap.ini on XP.
جنانجه پس از نصب PHP فايلهاى شما در شناختن variable ها مشكل داشتيد در فايل php.ini پارامتر register_globals را از off به on تغيير دهيد
سپس در IIS در قسمت

Home Directory > configuration > App Mappings :

Executable : C:\WINNT\system\php4isapi.dll
Extension : .php
را اضافه كنيد در قسمت ISAPI نيز

Filter Name : php
Executable : C:\WINNT\system\php4isapi.dll

پس از يك بار stop / start كردن IIS شما مىتوانيد PHP را بر روى PC خود اجرا كنيد
موفق باشيد

مصطفى افتخارى زاده
لينک مقاله
http://www.iranPHP.net :منبع

مقالات مرتبط با اين موضوع
انواع متغييرها در PHP | php
درج تاريخ شمسی، ميلادی و ساعت جاری در صفحات HTML | php
Hot Linking(نقره داغ وب مسترها) | php
يا بافر کردن خروجی | php
چگونه IP در PHP لاگ می شود | php
PHP و برنامه نويسی شی گرا | php
کوتيشن يا دابل کوتيشن؛ کی و کجا استفاده کنيم؟! | php
نصب فارسي نوك FarsiNuke در كلاينت XP,2000 | php
نمايش متن بصورت تصويري در اينترنت | php
كارتهاي الكترونيكي با php وmysql | php
چگونه يك برنامه لاگين امن و حرفه اي طراحي كنيد ? | php
مديريت فايل هاي ارسالي توسط كاربران | php
۷ دلیل برای اینكه استفاده از PHP بهتر از ASP می باشد | php
نکاتی مفید در مورد تنظیم php.ini | php
استفاده از تابع تبدیل تاریخ شمسی به میلادی و برعکس | php
راهنمای کامل نصب PHP بر روی windows | php
روش نصب PHP بروى Windows ها | php

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


راهنمای کامل نصب PHP بر روی windows
لينک مقاله
http://www.oxygenws.com :منبع

مقالات مرتبط با اين موضوع
انواع متغييرها در PHP | php
درج تاريخ شمسی، ميلادی و ساعت جاری در صفحات HTML | php
Hot Linking(نقره داغ وب مسترها) | php
يا بافر کردن خروجی | php
چگونه IP در PHP لاگ می شود | php
PHP و برنامه نويسی شی گرا | php
کوتيشن يا دابل کوتيشن؛ کی و کجا استفاده کنيم؟! | php
نصب فارسي نوك FarsiNuke در كلاينت XP,2000 | php
نمايش متن بصورت تصويري در اينترنت | php
كارتهاي الكترونيكي با php وmysql | php
چگونه يك برنامه لاگين امن و حرفه اي طراحي كنيد ? | php
مديريت فايل هاي ارسالي توسط كاربران | php
۷ دلیل برای اینكه استفاده از PHP بهتر از ASP می باشد | php
نکاتی مفید در مورد تنظیم php.ini | php
استفاده از تابع تبدیل تاریخ شمسی به میلادی و برعکس | php
راهنمای کامل نصب PHP بر روی windows | php
روش نصب PHP بروى Windows ها | php

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


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

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

استفاده از تابع تبدیل تاریخ شمسی به میلادی و بالعکس در PHP

برای دریافت توابع کافیست که کد توابع را از این آدرس دریافت کنید :

http://www.iranphp.net/modules/sections/index.php?op=viewarticle&artid=19

بوسیله یک Copy و Paste متن این توابع را درون یک فایل جدید بنام به عنوان مثال
jalali.php ذخیره کنید .

برای اینکه بتوانید از این توابع در برنامه خود استفاده کنید کافیست در ابتدای
برنامه خود دستور زیر را وارد کنید :

<?php require_once "jalali.php\";?>

با این کار دو تابع با نامهای gregorian_to_jalali و jalali_to_gregorian در اختیار
شما قرار می گیرند که به ترتیب برای تبدیل تاریخ میلادی به شمسی و شمسی به میلادی
مورد استفاده قرار می گیرند .

برای اینکه بتوانم نحوه استفاده از این دو تابع را شرح دهم به ذکر مثالهایی در
این مورد می پردازم .

1- تبدیل تاریخ میلادی به شمسی

برای این کار باید از تابع gregorian_to_jalali استفاده کنید . این تابع 3 متغیر
را از ورودی دریافت می کند که به ترتیب سال، ماه و روز می باشد که همگی از نوع
عددی می باشند .

برای مثال اگر بخواهیم تاریخ 2002-11-25 را که درون یک متغیر داریم به شمسی تبدیل
کنیم و سپس آنرا درون یک متغیر قرار دهیم ابتدا باید عناصر تاریخ میلادی رو جدا
کنیم . برای این کار می توانیم در دستور زیر استفاده کنیم :

<?php $gdate='2002-11-25';
list( $gyear, $gmonth, $gday ) = preg_split ( '/-/', $gdate );
?>

در اینجا از دستور preg_spilit برای جدا کردن عناصر تاریخ $gdate توسط جداکننده
– استفاده کرده ایم . همانطور که می بینید syntax این دستور به این صورت است که
2 متغیر به عنوان ورودی دریافت می کند . اولی به عنوان delimiter می باشد که چون
می توان به صورت regex نیز آنرا وارد کرد باید بین دو slash (/) قرار گیرد و متغیر
دوم هم که همان متغییری است که تاریخ میلادی ما در آن قرار دارد .

چون خروجی این دستور یک آرایه است از دستور list استفاده کرده ایم تا عناصر آرایه
را هر کدام در یک متغیر قرار دهیم . هم اکنون روز، ماه و سال میلادی را هر کدام
در یک متغیر داریم . حال می توانیم از تابع gregorian_to_jalali استفاده کنیم :

<?php
list( $jyear, $jmonth, $jday ) = gregorian_to_jalali($gyear, $gmonth, $gday);
?>

در اینجا مشخص است که 3 متغیر سال، ماه و روز میلادی را به عنوان متغیر های ورودی
تابع grogorian_to_jalali وارد کرده ایم و چون خروجی این تابع از نوع آرایه است
توسط دستور list هر کدام از عناصر این آرایه را در یک متغیر قرار می دهیم . این
متغیر های حاوی اطلاعات سال،‌ ماه و روز همان تاریخ به شمسی می باشند . برای اینکه
آنها را به صورت قابل نمایش در یک متغیر قرار دهیم می توانیم این خط را به برنامه
اضافه کنیم :

<?php
$jdate = $jyear."/\".$jmonth.\"/\".$jday;
?>

در صوتیکه مقدار $jdate را نمایش دهید همان تاریخ از نوع شمسی خواهد بود که چیزی
شبیه به مقدار زیر است :

4/9/1381

حال در صورتیکه بخواهید تاریخ همین لحظه را به صورت شمسی بدست آورید می توانید
از برنامه زیر استفاده کنید :

<?php
list($gyear, $gmonth, $gday ) = preg_split ('/-/', date("Y-m-d\"));
list( $jyear, $jmonth, $jday ) = gregorian_to_jalali($gyear, $gmonth, $gday);

$jdate = $jyear.\"/\".$jmonth.\"/\".$jday;
?>

همانطور که ملاحظه کردید از دستور date با آرگومان داده شده تاریخ فعلی سیستم
استخراج می شود و در همان روال توضیح داده شده تبدیل به شمسی شده و در متغیر $jdate
قرار می گیرد .

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

<?php
function get_jalali_date( $gdate='now' )
{

if ( $gdate == 'now' )
{
list($gyear, $gmonth, $gday ) = preg_split ('/-/', date("Y-m-d\"));
}
else
{
list( $gyear, $gmonth, $gday ) = preg_split ( '/-/', $gdate );
}
list( $jyear, $jmonth, $jday ) = gregorian_to_jalali($gyear, $gmonth, $gday);
return $jyear.\"/\".$jmonth.\"/\".$jday;

}
?>

تابعی با نام get_jalali_date تعریف کردیم که یک متغیر به عنوان ورودی دریافت
می کند که این همان تاریخ به میلادی است . در صوتیکه هنگام صدا کردن این تابع تاریخ
میلادی را به عنوان ورودی برای این تابع وارد کرده باشید،‌ تابع همان تاریخ را
به شمسی تبدیل کرده و در خروجی بر می گرداند،‌ ولی اگر هیچ متغیری به عنوان ورودی
به این تابع ندهید،‌ تاریخ همان لحظه را به شمسی برای شما در خروجی بر می گرداند
.

مثلا برای تبدیل همان تاریخ 2002-11-25 به شمسی و قرار دادن آن در یک متغیر می
توانیم با استفاده از تابع بالا اینگونه عمل کنیم :

<?php $jdate = get_jalali_date("2002-11-25\");?>

و یا برای بدست آوردن تاریخ همین لحظه و قرار دادن آن در یک متغیر اینگونه عمل
می کنیم :

<?php $jdate = get_jalali_date();?>

همانطور که می بینید کار بسیار ساده تر شد.

2- تبدیل تاریخ شمسی به میلادی :

با توضیحاتی مشابه می توانید از تابع jalali_to_gregorian استفاده کنید . مانند
تابع قبل این تابع هم سه متغیر به عنوان ورودی دریافت می کند که عبارتند از سال،
ماه و روز که همگی به شمسی هستند . سپس در جواب آرایه ای شامل سه قسمت که سال،‌
ماه و روز میلادی همان تاریخ هستند را بر می گرداند .

برای نمونه اگر بخواهیم تاریخ 4/9/1381 را به میلادی تبدیل کنیم کاری مشابه برنامه
زیر انجام می دهیم :

<?php
$jdate="1381/9/4\";
list( $jyear, $jmonth, $jday ) = preg_split ( '/\//', $jdate );
list( $gyear, $gmonth, $gday ) = jalali_to_gregorian($jyear, $jmonth, $jday);
$gdate = $gyear.\"-\".$gmonth.\"-\".$gday;
?>

تنها تفاومت موجود با تابع بالا استفاده از / برای جداسازی اجزاء تاریخ شمسی می
باشد . همانطور که گفتیم تابع preg_split آرگومان اول خود که همان delimiter (‌
جدا کننده )‌ می باشد را به صورت regex می گیرد که باید بین دو علامت / باشد ،‌
در اینجا باید قبل / که نشان دهنده کاراکتر delimiter ما می باشد یک \ (‌back slash
)‌ قرار می دهیم که جداکننده مشخص باشد .

توضیح خاص دیگری هم ندارد و همانند تابع تبدیل میلادی به شمسی اینجا هم می توانیم
تابعی با نام get_gregorian_date بسازیم که کار را راحتتر کند . ایجاد این تابع
را به خواننده واگذار می کنم J

سید حمید رضا هاشمی گلپایگانی
لينک مقاله
http://www.iranPHP.net :منبع

مقالات مرتبط با اين موضوع
انواع متغييرها در PHP | php
درج تاريخ شمسی، ميلادی و ساعت جاری در صفحات HTML | php
Hot Linking(نقره داغ وب مسترها) | php
يا بافر کردن خروجی | php
چگونه IP در PHP لاگ می شود | php
PHP و برنامه نويسی شی گرا | php
کوتيشن يا دابل کوتيشن؛ کی و کجا استفاده کنيم؟! | php
نصب فارسي نوك FarsiNuke در كلاينت XP,2000 | php
نمايش متن بصورت تصويري در اينترنت | php
كارتهاي الكترونيكي با php وmysql | php
چگونه يك برنامه لاگين امن و حرفه اي طراحي كنيد ? | php
مديريت فايل هاي ارسالي توسط كاربران | php
۷ دلیل برای اینكه استفاده از PHP بهتر از ASP می باشد | php
نکاتی مفید در مورد تنظیم php.ini | php
استفاده از تابع تبدیل تاریخ شمسی به میلادی و برعکس | php
راهنمای کامل نصب PHP بر روی windows | php
روش نصب PHP بروى Windows ها | php

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


نکاتی مفید در مورد تنظیم php.ini

فايل پيکربندي PHP
قبل از شروع مطالب نگاهي اجمالي به ويژگيهاي فايل پيکربندي PHP منطقي به نظر مي رسد. نام اين فايل php.ini مي باشد و به دلايلي از ساختار کلي فايلهاي ini که بيشتر در برنامه هاي کاربردي ويندوز استفاده مي شود، پيروي مي کند. اين فايل متني به صورت ASCII مي باشد که به بخشهايي (session) تقسيم مي شود. هر بخش متغيرهايي را که مربوط به آن بخش مي شوند، در بر مي گيرد. هر بخش چيزي شبيه زير مي باشد:

[MySection]
variable=\"value\"
anothervariable=\"anothervalue\"

نام بخش در يک جفت براکت"[]" در بالا قرار مي گيرد. و زير آن در هر سطر يک متغير با مقدارش قرار مي گيرد. متغيرها به حروف حساس (case sensitive) هستند و نمي توانند شامل فاصله (space) باشند، در حالي که مقادير متناظر آنها مي توانند اعداد، رشته کاراکتري (string) و يا Boolean باشند.

سمي کالن ";" در ابتداي هر سطر به عنوان نشانگر درج توضيحات (comment) مي باشد. اين راهي ساده براي فعال يا غيرفعال کردن ويژگيهاي PHP مي باشد، به جاي حذف کردن يک سطر مي توانيد به اين روش آن را به توضيح تبديل کرده که در پردازش فايل ها شرکت نخواهد کرد. در صورتي که فکر مي کنيد ممکن است بعد ها بخواهيد از ويژگي که اکنون به کارتان نمي آيد، استفاده کنيد بهتر است آن را پاک نکنيد.

براي اينکه PHP بتواند فايل php.ini را تشخيص بدهد بايد آن را در دايرکتوري جاري، دايرکتوري که در متغير $PHPRC تعريف شده، يا دايرکتوري که هنگام کامپايل مشخص شده است(براي ويندوز اين همان دايرکتوري اصلي PHP است) نگهداريد.

بعد از اينکه شما تغييراتي در فايل php.ini داديد براي آنکه تغييرات اعمال شوند بايد سرور خود را مجددا راه اندازي نماييد (سرور را restart کنيد). البته فرض بر اين است که شما قبلا در حال استفاده PHP بر سرور خود بوده ايد. براي استفاده هاي command-line از PHP فايل پيکربندي php.ini در هرباري که برنامه PHP احضار مي شود خوانده و چک مي شود.

تنظيم ويژگيهاي مفسر
اولين مرحله در اين مقاله از مهمترين گامهاي آن مي باشد، ويژگيهايي که به مفسر زبان PHP مربوط مي شود. اولين مورد در اينجا engine variable مي باشد که چک مي کند که PHP engine بايد فعال "on" يا غير فعال "off" باشد. Off کردن اين متغير به معني اين است که کدهاي PHP توسط سرور تفسير نشوند.معمولاً نيازي به اين تغيير حس نمي شود، پس اين متغير را به صورت on رها کنيد.

engine=On

متغير short_open_tag کنترل مي کند که آيا مفسر بايد تگهاي کوتاه را همانند تگ استاندارد تشخيص دهد يا نه.در صورتي که تشخيص مي دهيد اين نمونه تگها باعث ناسازگاري با ديگر زبانها مي شوند يا اينکه تصميم به استفاده از قوانين syntax مختص PHP داريد مي توانيد آن را off کنيد.

short_open_tag = On

معمولاً session, cookie و اطلاعات HTTP header در يک اسکريپت PHP بايد قبل از توليد هرگونه خروجي توسط آن اسکريپت فرستاده شوند. در صورتي که اين در برنامه شما امکان پذير نيست مي توانيد هر چه را که PHP به نام output buffering مي شناسد، توسط متغيرهاي output_buffering فعال کنيد.

با on بودن output buffering، زبان PHP خروجي اسکريپت شما را در يک بافر مخصوص نگه مي دارد و هنگامي آنها را مي فرستد که به طور مشخص به آن دستور داده شود. اين به شما امکان مي دهد که cookieها يا اطلاعات HTTP header را از وسط يا انتهاي کد اسکريپت خود بفرستيد. هرچند اين مي تواند کارآيي را در حاشيه کاهش دهد.

output_buffering = Off

شما مي توانيد با يک عدد به عنوان مقدار براي متغير output_buffering اندازه بافر را تعيين کنيد.

output_buffering = 2048

هنگامي که PHP شروع به کار مي کند يک پيام حاوي شماره نسخه خود به هدر استاندارد سرور مي افزايد.براي غيرفعال کردن آن مي توانيد متغير expose_PHP را off کنيد.اين مي تواند مفيد باشد، مثلا اگر بخواهيد امکانات وب سرور خود را از ديد هکرها پنهان کنيد.

expose_PHP = On

تنظيم مسير جستجوي
شما مي توانيد مسير جستجويي را براي PHP با تنظيم متغير include_patch که ليستي از مسيرها را مي پذيرد، مشخص کنيد. PHP هنگامي که با فايلي که مسير آن مشخص نشده است ، مواجه مي شود به طور اتوماتيک اين مسيرها را چک مي کند.
اگر شما کتابخانه اي از توابع يا مجموعه اي از کلاسها داريد که زياد از آنها استفاده مي کنيد مي توانيد دايرکتوري موقعيت آنها را در اين متغير قرار دهيد. همچنين اين متغير مکان مناسبي براي اضافه کردن دايرکتوري PEAR خود PHP مي باشد، که مجموعه اي از کلاسهايي که بسيار استفاده مي شوند را شامل مي شود.

include_path = \".:/usr/local/lib/php/pear:\"

کاربران ويندوز براي مشخص کردن چندين دايرکتوري بايد از سمي کالن";" بين آنها استفاده کنند و کاربران unix از کالن ":".

دو متغير جالب در اين زمينه auto_prepend_file و auto_append_file مي باشند. اين متغيرها فايلهايي را مشخص مي کنند که PHP به ابتدا يا انتهاي هر سند PHP اضافه خواهد کرد. اين مورد بيشتر براي اضافه کردن header و footer به صفحاتي است که توسط PHP ايجاد مي شوند، به طوري که باعث مي شود تعدادي خط کد به هر سند PHP که شما مي نويسيد اضافه گردد.
اين فايلها هم مي توانند اسکريپتهاي PHP و هم html معمولي باشند، ولي کدهاي PHP براي اين امر بايد در تگ استاندارد محصور شده باشند.

auto_prepend_file = /home/web/includes/header.php
auto_append_file = /home/web/includes/legal.php

چگونگي رفتار با خطاها
خطا ها در PHP در چهار دسته مي آيند: parsing errors يا خطاي زمان تجزيه (کامپايل)، تذکرات درمورد خطاهاي موجود در کد مثلا مقدار دهي نکردن يک متغير، warning يا هشدار و fatal error. معمولا هنگامي که PHP با يکي از خطاهاي parsing error يا warning يا fatal error مواجه مي شود، خطاها را نمايش مي دهد و اگر خطا از نوع fatal error باشد اجراي اسکريپت را در همان نقطه متوقف مي کند. شما مي توانيد اين رفتار را با متغير error_reporting که چند فيلد خطا را مي گيرد و تنها خطاهايي را که با آنها سازگار باشند نمايش مي دهد، اصلاح کنيد.

error_reporting = E_ALL

براي غير فعال کردن نمايش خطاها مقدار متغير display_errors را به نادرست تغيير دهيد و به جاي آن پيام خطاها را در ثبات خطاها از طريق متغير log_errors بنويسيد.
انجام اين کار براي امنيت بيشتر مفيد است، با غيرفعال کردن نمايش خطا شما اطلاعات ويژه سيستم خود را مخفي مي کنيد بدون توجه به اينکه آيا کاربران قصد خراب کردن سايت شما را دارند يا فقط استفاده مي کنند.به جاي آن شما بايد خطاها را در يک فايل دلخواه يا ثبات خطاي سيستم (system logger)، با تنظيم مقدار متغير error_log به مسير فايل انتخابي يا مقدار پيش فرض "syslog"، ثبت کنيد. فقط به ياد داشته باشيد که مرتبا به اين فايل سربزنيد تا ببينيد که در برنامه شما چه خطاهايي وجود دارد.

display_errors = Off
log_errors = On
error_log = \"error.log\"

فعال کردن توسعه ها
توسعه هاي متعددي براي PHP موجود است. در سيستمهاي يونيکس لازم است که اين توسعه ها در زمان کامپايل ساخته شوند. در ويندوز، dll هاي باينري وجود دارند که بايد ضميمه شوند. متغير extension_dir محتوي نام شاخه اي است که PHP در آن به دنبال اين توسعه ها مي گردد. مثلا:

extension_dir = \"C:\Program Files\Internet Tools\Apache\bin\php4\extensions\"

نسخه ويندوز PHP به همراه ۲۰ توسعه منتشر مي شود که تمامي آنها در فايل php.ini ليست شده اند. براي فعال کردن هر توسعه، علامت سمي کالن جلوي آن را حذف کرده و سرور خود را از نو راه اندازي کنيد. براي غير فعال کردن يک توسعه نيز مي توانيد جلوي آن علامت سمي کالن رو اضافه کنيد.

اگر توسعه مورد نظرتان در ليست توسعه ها در فايل php.ini نيست از متغير extension استفاده کرده و نام dll مورد نظر را به آن نسبت دهيد. مثلا:

extension=php_domxml.dll
extension=php_dbase.dll

تنظيم متغيرهاي مربوط به توسعه ها
متغير هاي مربوط به توسعه ها، در بخش جداگانه اي از فايل پيکربندي (php.ini) ذخيره مي شوند. براي مثال تمام متغيرهايي که به توسعه هاي MySQL مربوط مي شوند بايد در قسمت [MySQL] در فايل php.ini، قرار بگيرند.

اگر قصد استفاده از تابع mail در PHP را داريد، 3 متغير وجود دارد که بايد آنها را تنظيم کنيد. متغيرهاي SMTP و sendmail_from (در ويندوز) يا sendmail_path (در يونيکس) در هنگام ارسال e-mail از طريق تابع mail مورد استفاده قرار مي گيرند. در ويندوز اين متغير ها براي تنظيم SMTP Server و همچنين براي تعيين آدرس From در ساختار e-mail به کار مي روند. در يونيکس متغير sendmail_path مسير MTA يا Mail Transfer Agent را براي ارسال mail تنظيم مي کند.

SMTP = myserver.localnet.com
sendmail_from = me@localhost.com
sendmail_path = /usr/sbin/sendmail

متغيرهاي java.class.path ، java.home، java.library و java.library.path همگي آدرس کلاس ها و کتابخانه هاي جاوا را تنظيم ميکنند. اين مقادير به وسيله توسعه هاي جاوا مورد استفاده قرار مي گيرند. بنابراين اگر مي خواهيد PHP بتواند ارتباط صحيحي با برنامه هاي جاواي شما برقرار کند از درستي و معتبر بودن مقادير اين متغير ها اطمينان حاصل کنيد.

java.class.path = .\php_java.jar
java.home = c:\jdk
java.library = c:\jdk\jre\bin\hotspot\jvm.dll
java.library.path = .\

متغير session.save_path مشخص کننده آدرس شاخه موقتي است که براي ذخيره اطلاعات session ها بکار مي رود. معمولا اين متغير به طور پيش فرض مقدار /tmp را دارد، اما از آنجا که اين شاخه در ويندوز وجود ندارد بايد آن را با آدرس درست شاخه موقت ويندوز تصحيح کنيد در غير اين صورت هنگام فراخواني دستور session_start با خطا مواجه مي شويد. همچنين مي توانيد با تنظيم متغير session.cookie_lifetime مدت اعتبار cookie هاي session را بر حسب ثانيه مشخص کنيد.

session.save_path = c:\windows\temp
session.cookie_lifetime = 1800

تنظيمات مربوط به امنيت
تعدادي متغير در php.ini وجود دارد که به امنيت PHP نصب شده بر روي سيستم شما مريوط مي شوند. مهمترين آنها متغير safe_mode مي باشد که به طور مثال استفاده از آن براي محدود کردن آنچه کاربر مي تواند از طريق PHP انجام دهد بهISP ها توصيه ميشود.

safe_mode = Off

اگر safe mode فعال باشد (safe_mode = on) مي توانيد با تنظيم متغير safe_mode_include_dir مشخص کنيد که کدام شاخه ها براي فايل ها مورد جستجو قرار بگيرند. همچنين ميتوانيد نوع برنامه هايي که کدهاي PHP مي توانند از طريق فرمان exec آنها را اجرا کنند، را محدود کنيد. بدين منظور بايد اين برنامه هاي مجاز را در يک شاخه مخصوص قرار دهيد و از طريق متغير safe_mode_include_dir به PHP بگوييد که تنها در آن شاخه به دنبال آنها بگردد.بدين ترتيب تنها برنامه هاي درون اين شاخه توسط فرمان exec قابل دسترس خواهند بود.

safe_mode_include_dir = /usr/local/lib/php/safe-include
safe_mode_exec_dir = /usr/local/lib/php/safe-bin

شما مي توانيد اعمال مربوط به فايل ها را از طريق متغير open_basedir محدود کنيد. آدرس نسبت داده شده به اين متغير به عنوان ريشه اصلي (root) براي اعمال مربوط به فايل ها به کار مي رود. وقتي که اين متغير مقدار مي گيرد فايلهايي که در ساختار درختي اين ريشه نباشند براي PHP غير قابل دسترس خواهند بود. اين روش مناسبي براي محدود کردن کاربران يک سيستم اشتراکي مي باشد تا آنها تنها به آدرسهاي مربوط به خودشان دسترسي داشته باشند.

open_basedir = /home/web/

متغير max_execution_time تعيين ميکند که PHP حداکثر چند ثانيه منتظر پايان يافتن يک کد باشد قبل از آنکه به اجبار آن را خاتمه دهد. وقتي کد شما گرفتار حلقه هاي بينهايت ميشود اين متغير بکار مي آيد.اگر چه ممکن است اين موضوع گاهي مزاحمت ايجاد کند مثلا زماني که کد نوشته شده نياز به انجام اعمال زمانبري دارد، مثلا upload کردن يک فايل حجيم. در اين مواقع بايد مواظب باشيد که اين مقدار را افزايش دهيد تا مانع آن شويد که PHP اجراي کد شما را در وسط يک کار مهم خاتمه دهد.

max_execution_time = 90

تنظيمات مربوط به upload فايل ها و متغير هاي فرمها
اگر پيکربندي هاي امنيتي که تاکنون ذکر شد کافي نيست باز هم مي توانيد با غير فعال کردن قابليت upload فايل از طريق متغير file_uploads، يا با محدود کردن حداکثر حجم قابل upload از طريق متغير upload_max_filesize سيستم خود را از اين هم امن تر کنيد. اغلب تمايل خواهيد داشت که فضاي کوچکي را براي upload فايلها اختصاص دهيد مگر اينکه برنامه اي داشته باشيد که قرار باشد فايل هايي نظير يک گالري عکس يا يک FTP Service را پذيرا باشد.

file_uploads = On
upload_max_filesize = 2M

اگر تمايلي به upload کردن فايلها نداريد اما از تعداد زيادي فرم در صفحات PHP تان استفاده ميکنيد، 2 متغير ديگر وجود دارد که بايد برايتان جالب باشد. اول متغير register_globals، علت بيشترين سردردهاي برنامه نويسان با سابقهPHP در PHP 3.x اين متغير به طور پيش فرض فعال بود (on) که موجب ميشد وقتي يک فرم submit مي شد متغيرهاي آن بطور اتوماتيک به متغيرهاي PHP تبديل شوند.
مسايل امنيتي موجب شد که در PHP 4.x اين متغير بطور پيش فرض غير فعال باشد. (off). در نتيجه متغيرهاي فرم تنها به کمک آرايه هاي ويژه $_GET و $_POST قابل دسترس باشند. اين امر خيلي از کدهاي نوشته شده با PHP 3.x را با مشکل مواجه ساخت. مثلا مقداري که در يک فيلد وارد شده بود در PHP 3.x با $email قابل دسترس بود در حالي که در PHP 4.x با $_POST[email] يا $_GET[email] ميتوان به آن رجوع کرد.
ميتوانيد اين متغير را غير فعال کنيد (off) تا امنيت بيشتري را در برابر حملاتي که از طريق فرمها صورت مي گيرند برقرار کنيد. به منظور سازگاري با کدهاي نوشته شده با PHP 3.x آن را فعال کنيد:

register_globals = on

متغير ديگري که به کار با فرم ها مربوط ميشود post_max_size است که کنترل مي کند حداکثر چه حجم داده اي توسط متد POST يک فرم پذيرفته شود. به نظر نمي آيد که زماني لازم شود اين مقدار را از 8 MB افزايش دهيد. در عوض احتمال دارد بخواهيد آن را به يک مقدار واقعي تر تغيير دهيد. به هر حال اگر قصد داريد از امکانات upload فايل در PHP استفاده کنيد اين مقدار را بيشتر از مقدار متغير upload_max_size قرار دهيد.

post_max_size = 8M

يک متغير جديد هم در PHP 5 معرفي شده است: max_input_time. که حداکثر زمان بر حسب ثانيه که عمل دريافت داده هاي ورودي از طريق POST ،GET و PUT مي تواند طول بکشد را مشخص مي کند. اگر برنامه شما تحت يک اتصال کند اجرا مي شود بهتر است اين مقدار را افزايش دهيد تا به برنامه اجازه دهيد مدت بيشتري را به دريافت داده هاي ورودي اختصاص دهد.

max_input_time = 90

افزايش کارآيي
هنوز مقادير ديگري هم وجود دارد که با دستکاري آنها مي توانيد کارايي مفسر PHP را بالا ببريد. به منظور جلوگيري از اجراي کدهايي که ممکن است تمام حافظه موجود سيستم را اشغال کنند، PHP به شما اجازه مي دهد که براي استفاده از حافظه محدوديتي معين کنيد. اين کار از طريق متغير memory_limit قابل انجام است که حداکثر ميزان حافظه قابل استفاده توسط يک برنامه واحد را مشخص مي کند.

memory_limit = 8M

مقدار متغير memory_limit اغلب بايد از مقدار متغير post_max_size بيشتر باشد.
مساله ديگري که با دانستن آن مي توانيد کارايي را افزايش دهيد غير فعال کردن متغيرهاي $argc و $argv است که تعداد و محتواي آرگومان هاي خط فرمان که به يک برنامه ارسال شده اند، را مشخص مي کنند.

register_argc_argv = false

همينطور غير فعال کردن آرايه هاي $HTTP_GET_VARS , $HTTP_POST_VARS . چرا که به احتمال زياد در دنياي جديد $_GET , $_POST ديگر نيازي به آنها نيست. غير فعال کردن اين اجزا باعث بهبود کارآيي مي شود البته فقط در PHP 5 و از طريق متغيرregister_long_arrays قابل انجام است.

register_long_arrays = false

تابع ini_set
و در آخر نکاتي در مورد تابع ini_set. در حالي کهPHP تمام تنظيمات اش را در هنگام بالا آمدن، از فايل php.ini مي خواند، اين اجازه را به شما مي دهد که اين تنظيمات را به کمک تابع جالب ini_set و در برنامه خود انجام دهيد. البته اين تغييرات فقط براي همان برنامه اي که در آن از تابع ini_set استفاده کرده ايد اعمال مي شوند .اين تابع 2 آرگومان مي گيرد: نام متغير پيکربندي اي که مي خواهيد مقدارش را تغيير دهيد و مقدار جديد آن. اين هم يک مثال که حداکثر زمان اجراي مجاز براي برنامه اي که اين کد در داخل آن نوشته شده است را افزايش مي دهد.

<?php

ini_set('max_execution_time', 600);

// more code

?>

باز هم يادآوري مي شود که اين تنظيمات در داخل هر برنامه اي که نوشته شود فقط همان برنامه را تحت الشعاع قرار مي دهد. وقتي که برنامه خاتمه پيدا کند مقدار متغير به طور اتوماتيک به مقدار اوليه تغيير خواهد کرد.

اگر برنامه هايPHP شما بر روي يک سرور مشترک (Shared Server) اجرا مي شوند احتمالا شما دسترسي به فايل پيکربندي php.ini نخواهيد داشت. در اين موارد تابع ini_set کمک شاياني مي کند. چرا که اجازه مي دهد تنظيمات مورد نظرتان را براي برنامه هاي خودتان اعمال کنيد

مترجمان:
فرشاد پايدار
farshadcdeb@yahoo.com
جابر صادقي
www.rahacomputer.g3z.com
لينک مقاله
http://www.iranPHP.net :منبع

مقالات مرتبط با اين موضوع
انواع متغييرها در PHP | php
درج تاريخ شمسی، ميلادی و ساعت جاری در صفحات HTML | php
Hot Linking(نقره داغ وب مسترها) | php
يا بافر کردن خروجی | php
چگونه IP در PHP لاگ می شود | php
PHP و برنامه نويسی شی گرا | php
کوتيشن يا دابل کوتيشن؛ کی و کجا استفاده کنيم؟! | php
نصب فارسي نوك FarsiNuke در كلاينت XP,2000 | php
نمايش متن بصورت تصويري در اينترنت | php
كارتهاي الكترونيكي با php وmysql | php
چگونه يك برنامه لاگين امن و حرفه اي طراحي كنيد ? | php
مديريت فايل هاي ارسالي توسط كاربران | php
۷ دلیل برای اینكه استفاده از PHP بهتر از ASP می باشد | php
نکاتی مفید در مورد تنظیم php.ini | php
استفاده از تابع تبدیل تاریخ شمسی به میلادی و برعکس | php
راهنمای کامل نصب PHP بر روی windows | php
روش نصب PHP بروى Windows ها | php

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


۷ دلیل برای اینكه استفاده از PHP بهتر از ASP می باشد

مقدمه :

به دلیل سٶالات زیادی كه در مورد این موضوع شده بود تصمیم گرفتم كه كمی در مورد این موضوع تحقیق و نتیجه برای
استفاده همان در سایت IranPHP.net برای استفاده همگان قرار دهم . قبلا گفته باشم كه اینها تنها برداشت های شخصی
من در این تحقیق می باشد و خوشحال می شوم كه بقیه ایرادات من را در این تحقیق برایم ارسال كنند به دلیل اینكه من
تجربه كار با ASP را ندارم و همچنین بعضی اطلاعات من مربوط به ASP است و NET. را شامل نمی شود .

۱- سرعت ، سرعت ، سرعت
اولین باری كه یك كد به زبان PHP نوشتم بر روی یك كامپیوتر Pentium 166Mhz بود بر روی سیستم عامل Linux و به
همراه Apache Web Server . بسیار برایم جالب بود كه چقدر كد های من سریع اجرا می شوند . یعنی در آن موقع با
اگر شما یك Windows NT بر روی آن می توانستید سوار كنید و به فرض كه IIS هم بر روی آن بالا می آمد فكر كنم
اصلا وقت Serve كردن صفحات عادی html را نداشت چه برسد به اینكه بخواهد ASP را هم اجرا كند . علتش این است
كه Microsoft از یك Technology در اجرا كردن كدهای زبان ASP استفاده می كند كه در آن هر موقع شما تصمیم به
استفاده از یك عنصر خارجی مانند VBScript, MSSQL, ODBC و خیلی چیزهای دیگر كه در حقیقت از Engine های
خارجی استفاده می كنند دستور به آن Engine خارجی می دهد و جواب بدست آمده را بررسی و برای استفاده در اختیار
ادامه برنامه می گذارد . همین رفت و برگشت و اجرا كردن Engine های خارجی باعث كند شدن سرویس دهی می شود كه
این را شما به خوبی می توانید در استفاده از MSSQL به طرق مختلف احساس كنید . مثلا اگر شما خود MSSQL Extentions
برای استفاده از MSSQL استفاده كنید برای یك Query مشترك ۱.۸۸ ثانیه زمان تلف می شود و اگر همان را با استفاده
از ODBC اجرا نماﺋید زمانی در حدود ۹.۵۴ ثانیه تلف می شود كه این خود نشان می دهد كه ASP اینها را به تنهاﺋی اجراء
نمی كند و از Engine های ویندوز استفاده می كند .

۲- استفاده بهینه از Memory
در IIS4 اگر شما در یك صفحه مثلا ۲۰ بار یك صفحه را Include كنید این صفحه ۲۰ بار در حافظه بارگذاری می شود و در
حقیقت حافظه شما ۲۰ برابر زیادتر اشغال می شود . البته شنیدم كه این مشكل در ویندوز ۲۰۰۰ و IIS5 حل شده است
اما بازهم برای كسانی كه ASP را مینویسند و می خواهند آنرا بر روی سرور های Hosting كه دارای سیستم عامل NT
هستند اجرا كنند مشكل زا است و باعث كند شدن سیستم می شود و در Load بالا مسلما مشكل زا خواهد شد .
این مشكل به طور كلی در PHP وجود نداشته و ندارد و استفاده درست از Memory در هنگام اجرای یك كد باعث شده است
كه صفحات در Load بالا نیز به خوبی قابل رٶیت باشند .

۳- خرج اضافی ندارید !
مثلا در ASP اگر بخواهید از امكاناتی نظیر Encryption یا File Uploading یا ارسال نامه توسط كد برنامه استفاده كنید
باید امكانات اضافی برای این كار خریداری كنید و نصب كنید تا این امكانات به IIS شما اضافه گردد . این در حالیست كه
در PHP همه اینها در هنگام Compile در نظر گرفته می شوند و همگی از امكانات Standard این زبان هستند و هیچ نصب
یا خرج اضافی در كار نیست .

۴- MySQL بهترین انتخاب، بیشترین سرعت
در اینجا قصد ندارد به مقایسه MySQL و MSSQL بپردازم . اما به خاطر قدرت خارق العاده MySQL و سازگار بودن این
DBMS با زبان PHP به صورتیكه PHP اتصال به MySQL را به صورت دستورات Internally پشتیبانی می كند و حتی نیاز
به نصب Module اضافی برای این كار نمی باشد ، از سرعت بسیار بالاﺋی در كار با SQL برخوردار است كه شاید بعدا در
مورد MySQL مقاله ای نوشتم .

۵- نزدیك بودن Syntax به ++C/C و Java
از آنجاﺋیكه اكثر برنامه نویسان از ++C/C استفاده كرده اند و بخاطر محبوب بودن بی حد Java معمولا با Syntax های
این دو زبان اكثرا آشنا هستند . PHP هم اكثر Syntax های خود را شبیه به این زبانها انتخاب كرده است كه برای یادگیری
دوباره Syntax دستورات دچار مشكل نشوید كه مسلما Microsoft اصلا برایش این مساﺋل مشكل حساب نمی شود .

۶- رفع ایرادات ، سریع ، بی دردسر
تا حالا از Microsoft خواسته اید كه ایرادی را در سیستمهای خود رفع كند ؟ مسلما اگر شركت بزرگی مانند Boeing
نباشید حرف شما خیلی خریدار ندارد یا لااقل به این زودی ها به نتیجه نمی رسید .
OpenSource بودن PHP این امكان را به شما می دهد كه شخصا اقدام به رفع مشكل كنید و آنرا برای دستندركاران PHP
ارسال كنید و یا اینكه در Mailing List های عمومی PHP موضوع را مطرح كنید و خواهید دید كه از سراسر دنیا برای
رفع ایراد شما Patch ارسال می گردد .

۷- اجرا بر روی Platform های مختلف
درست است كه خیلی از این ایرادات را Microsoft رفع خواهد كرد و Technology های جدیدتر اراﺋه خواهد كرد ( چه
بسا این Net. كه الان آمده همه را درست كرده باشد ) اما یك مشكل اساسی برای ASP وجود دارد و آن این است كه
ASP بدون Windows یعنی هیچ ! بدلیل اینكه ASP نصفی از كدها را توسط Engine های ویندوز اجرا می كند كه در
سیستم عامل های دیگر خبری از آنها نیست . لذا ASP در سیستم عاملهای دیگر همیشه دارای ضعفهای بزرگی است .
اما PHP به دلیل آنكه توسط GNU C Compiler در همه Platform ها قابل Compile شدن است و از Engine های خاص
هیچ سیستم عاملی برای اجرای كدها استفاده نمی كند قابلیت اجرا بر روی تعدا زیادی از OS ها را داراست كه این یك
مزیت برای برنامه نویس ها محسوب می شود

لينک مقاله
http://www.iranPHP.net :منبع

مقالات مرتبط با اين موضوع
انواع متغييرها در PHP | php
درج تاريخ شمسی، ميلادی و ساعت جاری در صفحات HTML | php
Hot Linking(نقره داغ وب مسترها) | php
يا بافر کردن خروجی | php
چگونه IP در PHP لاگ می شود | php
PHP و برنامه نويسی شی گرا | php
کوتيشن يا دابل کوتيشن؛ کی و کجا استفاده کنيم؟! | php
نصب فارسي نوك FarsiNuke در كلاينت XP,2000 | php
نمايش متن بصورت تصويري در اينترنت | php
كارتهاي الكترونيكي با php وmysql | php
چگونه يك برنامه لاگين امن و حرفه اي طراحي كنيد ? | php
مديريت فايل هاي ارسالي توسط كاربران | php
۷ دلیل برای اینكه استفاده از PHP بهتر از ASP می باشد | php
نکاتی مفید در مورد تنظیم php.ini | php
استفاده از تابع تبدیل تاریخ شمسی به میلادی و برعکس | php
راهنمای کامل نصب PHP بر روی windows | php
روش نصب PHP بروى Windows ها | php

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


مديريت فايل هاي ارسالي توسط كاربران

حتما تا بحال سايت هايي را ديده ايد كه به كاربران اجازه Upload فايل از طريق صفحات (فرم هاي) Html را مي دهند به عنوان مثال در قسمت Profile هاي ياهو كه شما به عنوان يك كاربر عادي مي توانيد تصوير خود را كه يك فايل با فرمت Gif يا Jpg است و يا نمونه پيغام صوتي خود را به Profile تان اضافه كنيد و يا بخش آرشيو سايت هاي تحقيقاتي كه به اعضاي خود اجازه مي دهند نتايج كار خود را در قالب يك فايل PDF و يا بصورت Zip شده بر روي سايت قرار دهند .
به مطالب گفته شده در بالا حتما به اين نتجه رسيده ايد كه در اينگونه سيستم ها سه نكته اساسي قرار داد .
1- چكونگي ارسال فايل با استفاده از پروتكل HTTP به جاي FTP.
2- بررسي فرمت فايل و جلوگيري از Upload فايل هاي غير مجاز.
3- بررسي اندازه فايل و جلوگيري از ارسال فايلهاي حجيم.

براي دريافت فايل از كاربر ابتدا بايد فرمي به شكل زير ايجاد كرد :

<form name=\"form1\" method=\"post\" action=\"_URL_\"

enctype=\"multipart/form_data\">

<input type=\"file\" name=\"userfile\">
<input type=\"submit\" name=\"Submit\" value=\"Submit\">
</form>

عبارت multipart/form_data فرم بالا را از فرمهايي كه تا بحال با آن كار كرده ايم متمايز مي كند . در فرم بالا قبل از دكمه Submit كادر مخصوص در يافت فايل قرار گرفته در واقع اين همان فايلي است كه كاربر قصد ارسال به سرور را دارد.
در اين فرم _URL_ اشاره به برنامه PHP اي دارد كه قصد داريد عمل دريافت فايل را در آنجا انجام دهيد .تا اينجا فرم مورد نياز طراحي شده است حال با يك برنامه ساده مثل نمونه زير مي توان فايل را از Client خوانده و بر روي سرور ذخيره كرد.

<?
  if(isset( $Submit ))   {
if ($_FILES['userfile']['type'] == "image/gif\"){   copy ($_FILES['imagefile']['tmp_name'], \"files/\".$_FILES['imagefile']['name'])
  or die (\"Could not copy\");

  echo \"\";
  echo \"Name: \".$_FILES['imagefile']['name'].\"\";
  echo \"Size: \".$_FILES['imagefile']['size'].\"\";
  echo \"Type: \".$_FILES['imagefile']['type'].\"\";
  echo \"Copy Done....\";
  }
  else {
  echo \"\";
  echo \"Could Not Copy, Wrong Filetype (\" .$_FILES['imagefile']['name'].\")\";

  }
  }?>

اين برنامه در صورتي كه فايل ارسالي يك فايل GIF باشد آنرا با همان نامي كه روي كامپيوتر كاربر قرارداشته در شاخه Files بر روي سرور ذخيره مي كند .البته همانطور كه ميدانيد متغيير هايي كه براي Upload فايل تعريف مي شوند بسته به نسخه PHP و تنظيمات آن متفاوت مي باشند .
بعد از يك Upload موفق ، هنگامي كه track_vars فعال باشد آرايه هاي $_FILESو $HTTP_POST_FILES ايجاد مي گردند . سرانجام اگر register_globals فعال باشد متغييرها به صورت globals ايجاد خواند شد.

توجه : track_vars از نسخه 4.0.3 به طور پيش فرض فعال است . از PHP 4.1.0 به بعد ترجيحا از متغيير عمومي $_FILES به جاي $HTTP_POST_FILES استفاده مي گردد .

$HTTP_POST_FILES/$_FILES : به منظور مهيا كردن مشخصات فايل (هاي) ارسال شده ايجاد شده اند . محتواي اين دو متغيير به شرح زير است البته توجه كنيد كه ‘userfile’ نام انتخابي ما در هنگام ساخت فرم HTML است .

<? $HTTP_POST_FILES['userfile']['name'] ?>

نام اصلي فايل بر روي كامپيوتر كاربر.

<? $HTTP_POST_FILES['userfile']['type'] ?>

شناسه محتواي (MIME type) فايل . در برنامه فوق تنها به فايلهاي GIF اجازه ذخيره
شدن داده مي شود حال چنانچه بخواهيم كاربر را محدود به ارسال فايل هاي Wavنماييم
بايد مقدار اين متغيير را با "audio/wav" مقايسه كنيم .

<? $HTTP_POST_FILES['userfile']['size'] ?>[code]
اندازه فايل برحسب بايت .

[code]<? $HTTP_POST_FILES['userfile']['tmp_name'] ?>

نام موقتي كه فايل در هنگام Upload موقتا با آن نام بر روي سرور ذخيره مي گردد
.

توجه : متغيير $_FILES تنها در نسخه هاي 4.1.0 و بالاتر شناخته شده است و نيز نسخه 3 PHP از $HTTP_POST_FILES حمايت نمي كند .

همچنين اگر در فايل PHP.INI پارامتر register_globals فعال باشد متغييرهاي زير موجود خواهند بود :

<? $userfile
$userfile_name
$userfile_size
$userfile_type ?>

فايل ها به طور پيش فرض در دايركتوري فايلهاي موقت سرور ذخيره مي شوند مگر اينكه مكان ديگري توسط upload_tmp_dir در فايل PHP.INI تعيين شده باشد . در پايان اجراي اسكريپت چناچه فايل ارسال شده از طرف كاربر را به مكان ديگري انتقال ندهيد و يا نام آن را تغيير ندهيد توسط سيستم اين فايل پاك خواهد شد.

در صورت استفاده از PHP4.1.0 و بالاتر مي توانيد خط اول برنامه فوق را بصورت زير بنويسيد :

<?
if(is_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name'])) <br />
  { <br />
  //In PHP 4.1.0 or later, $_FILES should be used instead of $HTTP_POST_FILES.

ارسال چنين فايل به طور همزمان :

همانطور كه ميدانيد يك برنامه را مي توان به چنيدن روش مختلف پياده سازي كرد ولي چه خوب است كه اين پياده سازي همراه با استفاده بهينه از گرامر زبان باشد .براي اينكه كاربر بتواند بيش از يك فايل را در يك لحظه ارسال كند فرمي به شكل زير طراحي كنيد .

<form name=\"form1\" method=\"post\" action=\"_URL_\"

enctype=\"multipart/form_data\">

<input type=\"file\" name=\"userfile[]\">
<input type=\"file\" name=\"userfile[]\">
<br />
  <input type=\"submit\" name=\"Submit\" value=\"Submit\">
</form>

همانطور كه مشاهده مي شود اين فرم داراي دو كادر دريافت فايل است كه به نام آنها به صورت يك آرايه است . پس از ارسال اين فرم بر روي سرور متغيير هاي :

<? $HTTP_POST_FILES['userfile']['name'][0]
$HTTP_POST_FILES['userfile']['size'][0]
$HTTP_POST_FILES['userfile']['type'][0]
$HTTP_POST_FILES['userfile']['tmp_name'][0]?>

دلالت بر مشخصات فايل اولي و متغييرهاي :

<? $HTTP_POST_FILES['userfile']['name'][1]
$HTTP_POST_FILES['userfile']['size'][1]
$HTTP_POST_FILES['userfile']['type'][1]
$HTTP_POST_FILES['userfile']['tmp_name'][1]?>

دلالت بر مشخصات فايل دوم دارند .
همينطور الي آخر مي توان چندين فايل را ارسال كرد .

روش HTTP PUT
روش ديگري نيز براي ارسال فايل به سرور وجود دارد كه بسيار ساده تر از روش بالا عمل مي كند ولي چون اين روش براي حفظ امنيت سرور نياز به تنظيمات خاصي در سرورها دارد از توضيح آن در اينجا صرف نظر كرده ام . چنانچه مايل به آشنايي با اين روش هستيد به آدرس زير مراجعه كنيد

http://www.php-center.de/en-html-manual/features.file-upload.put-method.html

درهنگام نوشتن چنين برنامه هايي مراقب مجوز هايي كه به دايركتوري ذخيره اين فايل ها مي دهيد و همچنين بررسي اينكه فايل ارسال شده از طرف كاربر همان چيزي است كه بايد باشد باشيد .فراموش نكنيد كه هميشه عده اي بر روي اينترنت به دنبال راهي براي نفوذ به كامپيوتر و يا وب سايت شما هستند بد نيست نگاهي هم به مقاله زير داشته باشيد
http://securityresponse.symantec.com/avcenter/security/Content/2208.html
لينک مقاله
http://www.iranPHP.net :منبع

مقالات مرتبط با اين موضوع
انواع متغييرها در PHP | php
درج تاريخ شمسی، ميلادی و ساعت جاری در صفحات HTML | php
Hot Linking(نقره داغ وب مسترها) | php
يا بافر کردن خروجی | php
چگونه IP در PHP لاگ می شود | php
PHP و برنامه نويسی شی گرا | php
کوتيشن يا دابل کوتيشن؛ کی و کجا استفاده کنيم؟! | php
نصب فارسي نوك FarsiNuke در كلاينت XP,2000 | php
نمايش متن بصورت تصويري در اينترنت | php
كارتهاي الكترونيكي با php وmysql | php
چگونه يك برنامه لاگين امن و حرفه اي طراحي كنيد ? | php
مديريت فايل هاي ارسالي توسط كاربران | php
۷ دلیل برای اینكه استفاده از PHP بهتر از ASP می باشد | php
نکاتی مفید در مورد تنظیم php.ini | php
استفاده از تابع تبدیل تاریخ شمسی به میلادی و برعکس | php
راهنمای کامل نصب PHP بر روی windows | php
روش نصب PHP بروى Windows ها | php

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


چگونه يك برنامه لاگين امن و حرفه اي طراحي كنيد ?

سرفصل‌ها :
1ـ اين اسكريپت چگونه كار مي كند | پيشنيازها | الگوي بانك اطلاعاتي
2ـ اتصال به بانك اطلاعاتي |‌ متغيرهاي جلسات
3ـ هسته اسكريپت | ورود كاربران
4ـ كنترل مداوم اعتبار ورود | اطمينان از معتبر بودن اطلاعات جلسات

اين آموزش در سطح متوسط طراحي گرديده و به شما خواهد آموخت كه چگونه يك برنامه لاگين امن و حرفه اي طراحي كنيد . بزودي ياد مي گيريم كه چگونه با استفاده از توابع كوكي ها دسترسي به جلسات را قانوني كنيم و از سرقت جلسات جلوگيري كنيم.

1ـ اين اسكريپت چگونه كار مي كند ؟
در اين قسمت مي خواهم برايتان دليل انتخاب اين متد براي لاگين امن را برايتان توضيح دهم فراموش نكنيد كه اصولا امنيت قانون ندارد و شما نيز با استفاده از تجربيات و توانايي هاي هوشي خود بايد به فكر توسعه و طراحي موارد مشابه و امن تر نمائيد و به هيچ وجه به اين حد بسنده نكنيد:
/tmpكاربراني كه قادرند تا به سرور دست يابي داشته باشند مي تواند جلسات معتبر لاگينها را از شاخه پيش فرض
كه به منظور ذخيره سازي اطلاعات جلسات استفاده ميشود مشاهده نمايند روش جلوگيري از اين نوع حمله كنترل آي پي مي باشد.
كساني كه بر روي ميزبان شما سايتي دارند قادرند جلسات معتبر براي سايت شما توليد كنند توجه بفرمائيد كه برخي سايتها سرورهاي اختصاصي دارند كه به لحاظ امنيتي بسيار مطلوبترند مثل سايت پرشين بلاگ
برخي از اون آدمايي كه به قول خودمون آخرشن و اند حكن مي تونن شبكه رو بو بكشن و كوكي‌ها رو بقاپن
كنترل آي پي اين مشكل رو هم حل مي كنه

2-1ـ اما پيش نيازها
شما اول از همه بايد بدونين كه چه اطلاعاتي از كاربران قرار كه در سايت ذخيره بشه در اين مثال براي سهولت آموزش ساده ترين شكل ممكن رو فرض قرار دادم ضمنن چون الان همه ديگه پي اچ پي 4.1 به بالا دارن من هم از استفاده كردم اگر مي خواين كه اين اسكريپت رو روي نسخه هاي قديمي تر اجرا كنين شما super global arrays
مجبوريد كه از
$GLOBALS['HTTP_SESSION_VARS']
استفاده كنيد.

الگوي بانك اطلاعاتي ـ1-3
اين فقط يك مثال ساده با ساختاري مناسب براي مديريت اگر كه مايليد اين مثال را براي كاربران ثبت نام شده استفاده كنيد مي توانيد ستونهاي را به دلخواه اضافه كنيد
من الگوي بانك اطلاعاتي را كه از ماي اس كيو ال استفاده مي كنه اينجا گذاشتم شما مي تونين از ديگر بانكهاي اطلاعاتي نيز استفاده كنيد:

CREATE TABLE member (
id int NOT NULL auto_increment,
username varchar(20) NOT NULL default '',
password char(32) binary NOT NULL default '',
cookie char(32) binary NOT NULL default '',
session char(32) binary NOT NULL default '',
ip varchar(15) binary NOT NULL default '',
PRIMARY KEY (id),
UNIQUE KEY username (username)
);

فيلدهاي پسورد و كوكي براي استفاده از ام دي فايو طراحي شدن كوكي مقدارش براي زمانيست كه كاربر بخواهد اطلاعات برايش ذخيره شود و فيلدهاي جلسه و آي پي براي جلسه آي دي و آي پي كاربر استفاده مي شوند.

ــــــــــــــــــــــــــــــــــــــ
2ـ اتصال به بانك اطلاعاتي

function &db_connect() {

require_once 'DB.php';

PEAR::setErrorHandling(PEAR_ERROR_DIE);

$db_host = 'localhost';
$db_user = 'root';
$db_pass = '';
$db_name = 'shaggy';

$dsn = \"mysql://$db_user:$db_pass@unix+$db_host/$db_name\";

$db = DB::connect($dsn);

$db->setFetchMode(DB_FETCHMODE_OBJECT);
return $db;

}

اين تابع شما را به بانك اطلاعاتي متصل مي كند و يك اشاره گر به شي بانك اطلاعاتي پير باز مي گرداند

2-2ـ متغيرهاي جلسات:
براي سهولت در امر دستيابي به اطلاعات كاربران من اون رو يك متغير جلسه ثبت مي كنم ولي براي جلوگيري از پيغام خطا و همچنين ست كردن برخي پيش فرض ها از تابع زير استفاده مي كنم:

function session_defaults() {

$_SESSION['logged'] = false;
$_SESSION['uid'] = 0;
$_SESSION['username'] = '';
$_SESSION['cookie'] = 0;
$_SESSION['remember'] = false;
}

براي ست كردن يه مقادير پيش فرض از تابع بالا و براي چك كردن از تابع زير

if (!isset($_SESSION['uid']) ) {
session_defaults();
}

رو فرا خواني كنيمsession_startالبته فراموش نمي كنيم كه قبل از اينها بايد تابع

3ـ هسته اسكريپت:
براي ايجاد يكپارچگي ساده تر با ديگر اسكريپتها و ساخت مدوله شده تر هسته اسكريپت رو يك آبجكت با ظاهري خيلي ساده مي سازم

class User {

var $db = null; // PEAR::DB pointer
var $failed = false; // failed login attempt
var $date; // current date GMT
var $id = 0; // the current user's id

function User(&$db) {

$this->db = $db;
$this->date = $GLOBALS['date'];

if ($_SESSION['logged']) {
$this->_checkSession();
} elseif ( isset($_COOKIE['mtwebLogin']) ) {
$this->_checkRemembered($_COOKIE['mtwebLogin']);

}

}

اين كلاس كه تعريف ميشه آبجكت ما رو ميسازه البته اين كاملا مدوله شده نيست اما يك تاريخ مشكل بزرگي نيست و شما مي تونين اونو با اسكريپتهايي كه بقيه دوستان نوشتن به صورت شمسي توليد كنيد در اينجا ما چنين چيزي رو مي سازيم:

$date = gmdate(\"'Y-m-d'\");
$db = db_connect();
$user = new User($db);

حالا براي روشن شدن هدف كد يعني لاگين كردن تلاش مي كنيم ما ابتدا كنترل مي كنيم كه آيا كاربر لاگين كرده يا نه اگر اين كار رو كرده بود ما جلسات رو چك مي كنيم(فراموش نكنين كه اين يك كد امنيتي) وگرنه يك كوكي رو نام گذاري مي كنيم براي كنترل كردن اين به ما اجازه مي ده كه بينندگان سايت رو شناسايي كنيم

3-1ـ لاگين كردن كاربران:

براي اجازه دادن به كاربران براي لاگين كردن شما بايد يك فرم وب بسازيد پس از اعتبار سنجي فرم شما مي تونيد اعتبار كاربر رو براي تائيد اطلاعات وارد شده كنترل كنيد كه براي اينكار از
$user->_checkLogin('username', 'password', remember)
استفاده مي كنيم
خاطر نشان مي كنيم كه يوزر نيم و پسورد البته نبايد ثابت باشند و ريممبر يك مقدار بولين است كه به كاربر اجازه مي دهد تا با درست قرار دادن مقدار آن لاگين خودكار را فعال بسازد

function _checkLogin($username, $password, $remember) {

$username = $this->db->quote($username);
$password = $this->db->quote(md5($password));

$sql = \"SELECT * FROM member WHERE \" .
\"username = $username AND \" .
\"password = $password\";

$result = $this->db->getRow($sql);

if ( is_object($result) ) {
$this->_setSession($result, $remember);
return true;
} else {
$this->failed = true;
$this->_logout();
return false;
}

}

تعريف تابع بايد در مكاني كنار كلاس تعريف شده يوزر باشه مانند تمام كدهاي پائين در تابع از متدPEAR::DB's quote استفاده كردم تا اطلاعات با امنيت كامل به بانك اطلاعاتي انتقال پيدا كنند و به صورت بي ختري نيز از آن رهاي يابند و باز گردنند من از تابع ام دي فايو ترجيحا به جاي توابع ماي اسكيو ال استفاده كردم تا شما اگر مايل بوديد بتوانيد از بانكهاي اطلاعاتي ديگر نيز استفاده كنيد.
حلقه ور بهينه شده زيراكه يوزرنيم به صورت منفرد تعريف شده است نيازي به كنترل خطاهاي بانك اطلاعاتي نيست زيراكه خطاهاي پيشفرض قبلا در بالا ست شدند چنانچه آبجكت با رزالت بانك اطلاعاتي متچ شود لذا متغير جلسات ست مي شوند و مقدار ترو باز ميگردد وگرنه مقدار فلد با ترو برابر مي گردد شما مي تونين اينجا يك دستور كنترلي قرار دهيد تا پيغام سقوط عمليات لاگين رو اعلام كنه و براي انجام لاگ اوت براي اين بيننده كافيست تا session_defaults() را اجرا كنيم

3-3ـ وضع كردن جلسه:

function _setSession(&$values, $remember, $init = true) {

$this->id = $values->id;
$_SESSION['uid'] = $this->id;
$_SESSION['username'] = htmlspecialchars($values->username);
$_SESSION['cookie'] = $values->cookie;
$_SESSION['logged'] = true;

if ($remember) {

$this->updateCookie($values->cookie, true);

}

if ($init) {

$session = $this->db->quote(session_id());
$ip = $this->db->quote($_SERVER['REMOTE_ADDR']);

$sql = \"UPDATE member SET session = $session, ip = $ip WHERE \" .
\"id = $this->id\";
$this->db->query($sql);

}

}

اين متد متغير جلسه را ست مي كند و همچنين اگر در خواست كوكي براي داشتن لاگين مسمتر (خودكار) ارسال شده باشد
همچنين اين متد يك پارامتر دارد كه معين مي كند كه اين بار اول لاگين كردن است يا نه (از طريق فرم يا كوكي)
يا كنترل جلسه براي اولين بار نيست.

4ـ لاگين خود كار:
اگر بينندگان در خواست كنند كه كوكي ارسال بشه تا دفعات بعدي از لاگين كردن در هر مشاهده از سايت بپريد
اين دو متد به شما براي رسيدن به اين مهم كمك خواهد كرد

function updateCookie($cookie, $save) {

$_SESSION['cookie'] = $cookie;
if ($save) {

$cookie = serialize(array($_SESSION['username'], $cookie) );
set_cookie('mtwebLogin', $cookie, time() + 31104000, '/directory/');
}

}

4-1ـ كنترل لاگين خود كار:
اگر كاربران لاگين خودكار را انتاخاب كرده باشند كه به اسكريپت اجازه ذخيره كوكي را مي دهد كه كنترل مي شه از طريق متد زير

function _checkRemembered($cookie) {

list($username, $cookie) = @unserialize($cookie);
if (!$username or !$cookie) return;

$username = $this->db->quote($username);
$cookie = $this->db->quote($cookie);

$sql = \"SELECT * FROM member WHERE \" .
\"(username = $username) AND (cookie = $cookie)\";

$result = $this->db->getRow($sql);

if (is_object($result) ) {
$this->_setSession($result, true);
}

}

اين تابع هرگز نبايد توسط پيغام خطايي متوقف شود براي ساختن چيزهاي امن تر با كوكي ها مقدار كوكي در كوكي ذخير مي شود نه پسورد كاربر يكي از اين راه ها مي تونه درخواست يك لغت عبور باشه براي ناحيه اي كه به امنيت بيشتري نياز دارد

5-5ـ مطمئن شدن از اعتبار جلسه:

function _checkSession() {

$username = $this->db->quote($_SESSION['username']);
$cookie = $this->db->quote($_SESSION['cookie']);
$session = $this->db->quote(session_id());
$ip = $this->db->quote($_SERVER['REMOTE_ADDR']);

$sql = \"SELECT * FROM member WHERE \" .
\"(username = $username) AND (cookie = $cookie) AND \" .
\"(session = $session) AND (ip = $ip)\";

$result = $this->db->getRow($sql);

if (is_object($result) ) {
$this->_setSession($result, false, false);
} else {
$this->_logout();
}

}

پوف بالاخره آخرين قسمت كار ما كنترل مي كنيم كه آيا كوكي ذخيره شده در جلسه درست هست يا نه جلسه آي دي و آي پي كاربر
با يك پارامتر كه اجازه مي ده كه بفهميم كه اين اولين بار لاگين كردن در سيستم هست بنابراين setSessionفراخواني
مقدار آي پي و آي دي در جلسه بروز رساني نشود كه در بقيه موارد بطور معمول انجام مي شود
لينک مقاله
http://www.iranPHP.net :منبع

مقالات مرتبط با اين موضوع
انواع متغييرها در PHP | php
درج تاريخ شمسی، ميلادی و ساعت جاری در صفحات HTML | php
Hot Linking(نقره داغ وب مسترها) | php
يا بافر کردن خروجی | php
چگونه IP در PHP لاگ می شود | php
PHP و برنامه نويسی شی گرا | php
کوتيشن يا دابل کوتيشن؛ کی و کجا استفاده کنيم؟! | php
نصب فارسي نوك FarsiNuke در كلاينت XP,2000 | php
نمايش متن بصورت تصويري در اينترنت | php
كارتهاي الكترونيكي با php وmysql | php
چگونه يك برنامه لاگين امن و حرفه اي طراحي كنيد ? | php
مديريت فايل هاي ارسالي توسط كاربران | php
۷ دلیل برای اینكه استفاده از PHP بهتر از ASP می باشد | php
نکاتی مفید در مورد تنظیم php.ini | php
استفاده از تابع تبدیل تاریخ شمسی به میلادی و برعکس | php
راهنمای کامل نصب PHP بر روی windows | php
روش نصب PHP بروى Windows ها | php

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


كارتهاي الكترونيكي با php وmysql

آيا شما تا به حال خواسته ايد كه كارتهاي الكترونيكي براي سايت تان بسازيد ؟ اين كار را اخيرا من انجام داده ام و همزمان با آن همه يك روش كار درست بدست آوردم . بنابراين اينجا يك خودآموز سريع است و از اين جهت شما مجبور نيستيد كارهايي را كه من انجام داده ام را بپذيريد . همچنين در اين خودآموز شما ممكن است براي نكات بيشتر ارجاعهايي به “ Floppydogs” داشته باشيد . ولي آنچه بر روي آن است نيز از روي كد من در Floppydogs.com آمده است .
حال آيا اينكه شما فكر كنيد كه اين كار يك قطعه session ساده و آسان مي خواهد، درست است ؟ خير ، اينكار را نكنيد، خود من هم دقيقا علت آن را نمي دانم چرا كه اگر من در session_destory( ) اين كار را انجام مي دادم session ID از پذيرفتن آن به اين روش امتناع مي ورزيد .
اشكال اين ايجاد كردن ها زماني بود كه كاربر يك e_card را ارسال مي نمود و موقعي كه سعي مي كرد كه برگردد و يك كارت جديد را ايجاد كند اينكار را نمي توانست انجام دهد زيرا كه خطايي مبني بر ID مشابه پيش مي آمد ( چه زحمتي! ) . براي اينكار اول از همه من، بايد عكسها را بسازم و آشكار است كه همه آنها بر روي
صفحه index.php نمايش داده مي شود ، كد اينجا :

<A HREF=\"makecard.php?image=imagename.jpg\">

به طور معمول هر تصوير يك imagename متفاوت دارد حالا من براي ساختن makecard.php در جائيكه كاربر مي رسد و در his/her/its اطلاعات شخصي را وارد مي كند از session ها استفاده نمودم كه در صورت صرفنظر از اين قسمت اين خودآموز ديگر بلا استفاده مي شود .

<?
  session_start();
  session_register("image\");
  ?>
  <HTML>

رجيستر سازي تصوير به اين معني است كه موقعي session خراب شده است، كاربر عكس را انتخاب و به نام متغير آن به چسباند . همه اطلاعات session بايد همزمان با شروع HTML شروع به رفتن كند . حال كد زير :

  <CENTER>

  <IMG SRC=\"<?echo $image;?>\">
  </CENTER>
  <form action=\"sendcard.php\" method=GET>
Your Name:
  <input type=text name=s_name size=25 maxlength=50>
  <?escapeshellcmd($s_name);?>
  <p>
  Your Email Address:
  <input type=text name=s_email size=25 maxlength=50><?escapeshellcmd($s_email);?>
  <p>
  Receiver's Name: <input type=text name=r_name size=25 maxlength=50>
  <?escapeshellcmd($r_name);?>
  <p>
  Receiver's Email Address: <input type=text name=r_email size=25 maxlength=50>
  <?escapeshellcmd($r_email);?>
  <p>
  Your Personal Message:<BR>
  <TEXTAREA name=message cols=50 rows=5 wrap></TEXTAREA>
  <?escapeshellcmd($message);?>
  <P>
<input type=submit value=\"Send my card!\">
  <input type=reset value=\"Clear it\">
  </form>

اگر شما بدانيد كه چگونه از فرم ها استفاده كنيد در اغلب مواقع ضروري بيشتر بايد
از آن استفاده كنيد .
در اينجا يكي از خصيصه هاي امنيتي Escapeshellcmd( ) اينست كه كاربران بدجنس نمي
توانند دستورات mysql را وارد فيلد ها بكنند و از آن طريق اطلاعات شما را بگيرند
.اگر شما همه جزئيات آن را بخواهيد ، مي توانيد در راهنماي دستي آن نگاه كنيد .
در ادامه من در يك جا به اين مسأله برخورد كردم كه اگر كاربر يك تصوير را انتخاب
كند و در آن موقع به ذهنش برسد كه بايد برگردد و his/her/its را تغيير داده بايد
چكار كند زيرا كه تصوير يك متغير رجيستر شده است و در تصوير اول هيچ موضوعي نمانده
كه انتخاب نشده باشد . با اين وجود خوشبختانه اين حالت نيز آسان مي باشد و در بالاي
صفحه index.php من به راحتي كد زير را اضافه كردم :

<?
  session_start();
  session_destroy();
  ?>

و سپس به ياد مي آورد كه قبل از هر كاري از HTML آن را وارد كند و حالا كارت را
مي فرستد .
قدم اول اين بود كه يك جدول درون mysql ايجاد كنيد ، شما مي توانيد خودآموز هاي
بيشتر را از روي devshed پيدا كنيد .براي گرفتن يك ID منحصر به فرد براي هر كارت
من از يك تابع استفاده كردم ( كه دوباره هر كدام قبل از HTML مي روند ) و آن را
به صورت session_destory( ) ذكر كردم تا نتواند ظاهر شود و ID خودش را خراب كند
. به همين دليل اطلاعات در داخل session هستند اگر شما كتاب Core php programming
را كه منبع اصلي من نيز مي باشد را داشته باشيد اين تابع را خواهيد شناخت .

<?php
  session_start();
  function CreateID($length=16){
  $Pool = "ABCDEFGHIJKLMNOPQRSTUVWXYZ\";
  $Pool .= \"1234567890floppydogs\";
  for($index = 0; $index < $length; $index++){
  $sid .= substr($Pool,(rand()%(strlen($Pool))), 1);
  }
  return($sid);
  }
  $sid=CreateID();
  ?>

اساسا اين تابع يك مجموعه طبقه بندي شده از 16 كاراكتر را توليد مي كند كه از
كاراكتر هاي انتخابي من ساخته شده است مشروط بر اينكه درون $Pool باشد .حال هر
چيزي مي خواهيد وارد جدول mysql بكنيد و ترتيب نگهداري متغير هايتان را به ياد
داشته باشيد . اگر در آنجا يك عنصر با همان ID وجود داشته باشد mysql بصورت اتوماتيك
در صورتي كه اجرا شود يك خطا برمي گرداند كه در مورد ( نتيجه !) است و يك ID جديد
مي سازد .

<?
$result = mysql_query("INSERT INTO ecards VALUES('$sid', '$s_name', '$s_email','$r_name',
  '$r_email','$message', '$image')\");
  if(!$result){
  $sid=CreateID();
  $result = mysql_query(\"INSERT INTO ecards VALUES('$sid', '$s_name', '$s_email','$r_name',
  '$r_email','$message', '$image')\");
  }
?>

حال با پست كردن موفقيت آميز يك پيام با عنوان him/her/its گيرنده مي فهمد كه
he/she/it يك e_card دارد ! و در پايان نمي تواند session را خراب كند همچنين كاربر
مي تواند در صورتي كه he/she/it بخواهد برود و كارتي ديگر بسازد .

<?php
  $mailTo = "$r_email\";
  $mailSubject = \"You Have A FloppyDog!\";
  $mailHeader = \"From: $s_name\";
  $message = \"You lucky person, you! Someone has thought of you in a warm
  and fuzzy way and sent you a floppydog studios (TM) e-card! You can view this
  card at the following webpage: \";
  $message .= \"http://www.floppydogs.com/ecards/viewcard.php?ID=\";
  $message .= $sid;
  mail($mailTo, $mailSubject, $message, $mailHeader);
  session_destroy();
  ?>

اين هم از اين . لحظات خوشي با e_card سازي داشته باشيد .اگر شما بخواهد همه اين
كارها را ببينيد مي توانيد مقداري از كارتهاي الكترونيكي را موقعيكه همه آنها روي
هم گذاشته شد از طريق floppydogs.com براي دوستانتان بفرستيد .

موفق باشيد
حميد اردشيري
لينک مقاله
http://www.iranPHP.net :منبع

مقالات مرتبط با اين موضوع
انواع متغييرها در PHP | php
درج تاريخ شمسی، ميلادی و ساعت جاری در صفحات HTML | php
Hot Linking(نقره داغ وب مسترها) | php
يا بافر کردن خروجی | php
چگونه IP در PHP لاگ می شود | php
PHP و برنامه نويسی شی گرا | php
کوتيشن يا دابل کوتيشن؛ کی و کجا استفاده کنيم؟! | php
نصب فارسي نوك FarsiNuke در كلاينت XP,2000 | php
نمايش متن بصورت تصويري در اينترنت | php
كارتهاي الكترونيكي با php وmysql | php
چگونه يك برنامه لاگين امن و حرفه اي طراحي كنيد ? | php
مديريت فايل هاي ارسالي توسط كاربران | php
۷ دلیل برای اینكه استفاده از PHP بهتر از ASP می باشد | php
نکاتی مفید در مورد تنظیم php.ini | php
استفاده از تابع تبدیل تاریخ شمسی به میلادی و برعکس | php
راهنمای کامل نصب PHP بر روی windows | php
روش نصب PHP بروى Windows ها | php

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


نمايش متن بصورت تصويري در اينترنت
< ?php
function strimage($str){
    header ("Content-type: image/png");
    $font = 4;
    $width = ImageFontWidth($font) * strlen($str);
    $height = ImageFontHeight($font);

    $im = @ImageCreate ($width,$height);
    $background_color = ImageColorAllocate ($im, 150, 150, 150); //gray background
    $text_color = ImageColorAllocate ($im, 0, 0,0);//black text
    ImageString ($im, $font, 0, 0, $str, $text_color);
    ImagePNG ($im);
}
strimage("iranvig.com");
?>

لازم هست بگم فقط در صورتي اين برنامه كار ميكنه كه شما اونو بعنوان يه صفحه php توي يه سايت كه php رو پشتيباني ميكنه آپلود كند چون دستورات ساختن تصوير از متن توي كلاينت اجرا نميشه.
لينک مقاله
http://www.iranvig.com :منبع

مقالات مرتبط با اين موضوع
انواع متغييرها در PHP | php
درج تاريخ شمسی، ميلادی و ساعت جاری در صفحات HTML | php
Hot Linking(نقره داغ وب مسترها) | php
يا بافر کردن خروجی | php
چگونه IP در PHP لاگ می شود | php
PHP و برنامه نويسی شی گرا | php
کوتيشن يا دابل کوتيشن؛ کی و کجا استفاده کنيم؟! | php
نصب فارسي نوك FarsiNuke در كلاينت XP,2000 | php
نمايش متن بصورت تصويري در اينترنت | php
كارتهاي الكترونيكي با php وmysql | php
چگونه يك برنامه لاگين امن و حرفه اي طراحي كنيد ? | php
مديريت فايل هاي ارسالي توسط كاربران | php
۷ دلیل برای اینكه استفاده از PHP بهتر از ASP می باشد | php
نکاتی مفید در مورد تنظیم php.ini | php
استفاده از تابع تبدیل تاریخ شمسی به میلادی و برعکس | php
راهنمای کامل نصب PHP بر روی windows | php
روش نصب PHP بروى Windows ها | php

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


نصب فارسي نوك FarsiNuke در كلاينت XP,2000

در اين قسمت به شرح چگونگي نصب سيستم جذاب phpNuke مي پردازيم. نا اينجاي کار به شرح موارد زير پرداختيم.

  • نصب سرور Apache
  • شرح نصب بانک اطلاعاتي MySQL، برنامه MySQLCC و phpMyAdmin
  • شرح نصب و تنظيم زبان اسکريپت نويسي php

براي راه اندازي phpNuke نياز به تمامي موارد فوق مي باشد. براي در يافت phpNuke که فارسي شده برروي اين قسمت کليک نماييد. اگر مايل مي باشيد phpNuke را از خود سايت اصلي Nuke دريافت نماييد به اينجا برويد. پس از Extract کردن فايل، 3 تا شاخه درست ميشه:

  • html (که تمامي فايل هاي Nuke توش قرار داره)
  • sql (در اين شاخه فايل farsinuke.sql موجود مي باشد، که طي مقاله به آن اشاره خواهم کرد)
  • upgrades (فايل هاي مربوط به upgrade کردن سيستم)

براي راه اندازي phpNuke بايد مراحل زير را انجام دهيم:

I. قرار دادن فايل هاي phpNuke در شاخه htdocs

II. ساختن يک database براي phpNuke و وارد کردن (Import) ساختار جدول ها و اطلاعات مربوط به database اين سيستم

III. تنظيم phpNuke براي برقراري اتصال با بانک اطلاعاتي

IV. راه اندازي اين سيستم و ساختن يک شناسه (User Name) براي مدير

1. قرار دادن فايل هاي phpNuke در شاخه htdocs
ابتدا بايد فايل هاي درون شاخه html را در شاخه اصلي (root) سرور Apache که همان htdocs مي باشد قرار دهيم. اگر تمامي فايل هاي درون html در root قرار بگيرند شما با هر بار رفتن به اين آدرس : http://localhost با صفحه اصلي phpNuke مواجه مي شويد. اما اگر مايل مي باشيد با رفتن به شاخه (folder) خاصي به صفحه اصلي phpNuke برويد آنرا درون شاخه دلخواه خود بگذاريد، به عنوان مثال من در حال حاضر حدود 5-4 تا phpNuke روي کامپيوترم براي کارهاي متفاوت دارم و هر کدام در شاخه اي جداگانه مي باشند. مثلا يکي در /htdocs/bb2nuke ديگري در /htdocs/farsinuke و... قرار دارند.

2. ساختن يک database براي phpNuke
قدم بعدي براي راه اندازي اين سيستم ساختن يک database براي nuke مي باشد. براي ساختن database هم مي توان از MySQLCC و هم از phpMyAdmin استفاده نمود.فرض ميکنيم شما مي خواهيد اسم database خود را nuke بگذاريد. در اين قسمت من به شرح استفاده از MySQLCC و phpMyAdmin ميپردازم:

A. استفاده از MySQLCC:
به محيط MySQLCC رفته و به سرور MySQL متصل شويد، پس از اتصال برروي Databases يک Right-Click کنيد و گزينه New Database را انتخاب نماييد.سپس نام database خود را وارد نماييد، من فرض مي کنم که شما nuke وارد کرديد. پس از وارد کردن نام database خود، بايد ساختار جدول هاي phpNuke و بعضي مقادر پيشفرض آنرا وارد نماييم. براي اين کار از فايل farsinuke.sql که در شاخه sql موجود مي باشد استفاده مي کنيم.(چگونگي Execute کردن دستورات sql در مقالات گذشته شرح داده شده است، ولي بازم ميگم). database که ساختيد رو انتخاب کنيد، سپس دکمه آبي رنگ SQL را فشار دهيد. پس از فشاردادن اين دکمه به اين (براي ديدن عكس كليك كنيد) صفحه مي رويد. سپس از طريق منو، فايل farsnuke.sql رو باز کنيد و دکمه ! که در عکس mouse برروي آن قرار دارد را فشار دهيد. پس از فشار دادن دكمه ! تمامي دستورات اجرا مي شوند.. به اين کار به اصطلاح Import کردن اطلاعات مي گويند.

B. استفاده از phpMyAdmin:
براي استفاده از phpMyAdmin ابتدا به محيط آن رفته، سپس در قسمت Create new database نام database خود که nuke مي باشد را وارد نماييد. پس از درست کردن database شما بصورت خودکار به صفحه مربوط به database و جدول هاي آن مي رويد. سپس در قسمت نوار بالاي صفحه برروي SQL كليك نماييد. با انجام اينكار به صفحه مربوط به Import کردن اطلاعات مي رويد. وقتي به صفحه SQL رفتيد دکمه Brows رو فشار دهيد و فايل farsinuke.sql رو انتخاب نماييد. وقتي اين فايل را انتخاب نموديد، دکمه GO را فشار دهيد. سپس کمي صبر کنيد تا اطلاعات وارد database شوند.

3. تنظيم phpNuke براي برقراري اتصال با بانک اطلاعاتي
بعد از درست کردن يک database براي phpNuke بايد Nuke را تنظيم کنيد تا با اين database ارتباط برقرار کند. براي اين منظور فايل config.php را اديت کنيد و در آن موارد زير را تغيير دهيد:

آدرس سرور MySQL | "localhost" | $dbhost = | 32
user name شما براي استفاده از db | "root" | $dbuname = | 33
password شما براي استفاده از db | "123456" | $dbpass = | 34
نام database | "nuke" | $dbname = | 35
پيشوند جدول هاي شما* | "nuke" | $dbprefex = | 36
پيشوند نام کاربران شما* | "nuke" | $user_prefex = | 37
نوع بانک اطلاعاتي* | "MySQL" | $dbtype = | 38
* موارده مشخص شده نياز به تغيير نداردند!

4. بعد از تنظيم فايل config.php سيستم ما آماده به کار مي باشد، به Browser خود رفته، و آدرس جايي که phpNuke رو قرار داديد رو وارد نماييد، فرض مي کنيم phpNuke رو در اينجا قرار داده ايد : c:\apache\htdocs\farsinuke بنابر اين آدرس URL دسترسي به nuke اين مي باشد : http://localhost/farsinuke . ولي اولين کاري که بايد انجام دهيد، بايد يک User براي مدير سايت درست کنيد! براي اين کار به اين آدرس برويد : http://localhost/farsinuke/admin.php و فرم مربوطه را پر کنيد!

کلیه حقوق این مقاله متعلق به جناب آقای محمد آ نوید میباشد.
لينک مقاله
http://www.iranvig.com :منبع

مقالات مرتبط با اين موضوع
انواع متغييرها در PHP | php
درج تاريخ شمسی، ميلادی و ساعت جاری در صفحات HTML | php
Hot Linking(نقره داغ وب مسترها) | php
يا بافر کردن خروجی | php
چگونه IP در PHP لاگ می شود | php
PHP و برنامه نويسی شی گرا | php
کوتيشن يا دابل کوتيشن؛ کی و کجا استفاده کنيم؟! | php
نصب فارسي نوك FarsiNuke در كلاينت XP,2000 | php
نمايش متن بصورت تصويري در اينترنت | php
كارتهاي الكترونيكي با php وmysql | php
چگونه يك برنامه لاگين امن و حرفه اي طراحي كنيد ? | php
مديريت فايل هاي ارسالي توسط كاربران | php
۷ دلیل برای اینكه استفاده از PHP بهتر از ASP می باشد | php
نکاتی مفید در مورد تنظیم php.ini | php
استفاده از تابع تبدیل تاریخ شمسی به میلادی و برعکس | php
راهنمای کامل نصب PHP بر روی windows | php
روش نصب PHP بروى Windows ها | php

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


کوتيشن يا دابل کوتيشن؛ کی و کجا استفاده کنيم؟!

آيا شما هم جز اون دسته از افرادی هستيد که هنگام کدنویسی PHP، همواره از دابل کوتيشن برای مشخص کردن يک رشته کاراکتر استفاده می کنيد؟!
به نظر می رسه اکثر مثالها و نمونه هايی که حتی در راهنمای PHP وجود داره تمايل زيادی به استفاده از دابل کوت رو نشون میده. اگرچه راه دومی هم وجود داره که به مراتب بهتر از قبلی هم هست و اون استفاده از کوتيشن يا (Single Quote) به جای Double Quoteهاست. برای مثال به جای:

<?php
echo "Visit http://www.phpmystery.com";
?>

ميتوان از:

<?php
echo 'Visit http://www.phpmystery.com';
?>

استفاده کرد. خوب حتما اين تو ذهنتون شکل گرفته که «چه فرقی داره؟»
پاسخ اينه که در مثال بالا هيچ تفاوتی وجود نداره اما به مثال زير توجه کنيد:
ميخواهيم يه تکه کد HTML رو داخل يک متغير ذخيره کنيم؛ اگر از دابل کوتیشن استفاده کنیم:

<?php
echo "<table border=\"1\" cellspacing=\"0\" cellpadding=\"0\">";
?>

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

<?php
echo '<table border="1" cellspacing="0" cellpadding="0">';
?>

همونطور که می بينيد اگر رشته کاراکتر، حاوی کاراکتر (") باشه بايد اون رو با کاراکتر بک اسلش (\) اسکيپ کنيم تا Parse Error پيش نياد ولی در مثال دوم می بيينم که هر چه داخل (') باشه، عينا و حرف به حرف نوشته ميشه.
دليل بعدی اينکه راه دوم پرفورمنس بالاتری داره! استفاده از کوتيشن همواره سريعتر از دابل کوتيشن هست و در برخی موارد اين تفاوت چند صد درصد ميشه!
با نگاهی به Benchmark زیر فکر کنم همه چیز روشن بشه.

double (") vs. single (') quotes
Is a there a difference in using double (") and single (') quotes for strings. Call 1'000x
+ 101 % 1: single (') quotes. Just an empty string: $tmp[] = ''; Total time: 3[ms]
+ 100 % 2: double (") quotes. Just an empty string: $tmp[] = ""; Total time: 3[ms]
+ 111 % 3: single (') quotes. 20 bytes Text : $tmp[] = 'aaaaaaaaaaaaaaaaaaaa'; Total time: 3[ms]
+ 118 % 4: double (") quotes. 20 bytes Text : $tmp[] = "aaaaaaaaaaaaaaaaaaaa"; Total time: 3[ms]
+ 115 % 5: single (') quotes. 20 bytes Text and 3x a $ : $tmp[] = 'aa $ aaaa $ aaaa $ a'; Total time: 3[ms]
+ 461 % 6: double (") quotes. 20 bytes Text and 3x a $ : $tmp[] = "aa $ aaaa $ aaaa $ a"; Total time: 13[ms]
+ 113 % 7: double (") quotes. 20 bytes Text and 3x a \$ : $tmp[] = "aa \$ aaaa \$ aaaa \$ a"; Total time: 3[ms]

نتيجه: توی رشته کاراکترهایی که در " قرار میدید، از کاراکتر $ به تنهایی استفاده نکنید، مگر اینکه بخواهید مقدار یک متغیر را جانشین کنید و اگر هم خواستید این کار رو انجام بدید بهتره اون رو با یک بک اسلش اسکیپ کنید.
وقتی از کاراکترهای خاصی نظیر n\ یا r\ و t\ که برای فرمت بندی رشته کاراکتر بکار میره، استفاده می کنید، اگر اونها رو داخل ' قرار بدید اثر خودشون رو از دست میدن و باید حتما داخل " قرار بگیرند.

<?php
echo 'check out http://www.phpmystery.com' . "\n\r" . 'to discover unknowns about PHP';
?>

با اين تفاسير ميشه گفت:
۱» اگر متغيری داخل رشته کاراکتر نيست که بخواهيد مقدارش جانشين بشه از کوتيشن استفاده کنيد.
۲» اگر متغيری داخل رشته کاراکتر باشه افزودن {} باعث سرعت عملکرد ميشه.(*)

<?php
$sql = "select * from `mytable` where `status` = '{$status}' order by name"
?>

۳» بجای دستور Print از Echo استفاده کنيد.

(*) دو جا هست که آکولادها به کار ما ميان؛ اولا وقتی که بخواهيم يک سری کاراکتر درست چسبيده به نام متغير رو نمايش بديم و مورد بعدی وقتی عبارتی که ميخواهيم درون رشته کاراکتر جای بديم يک متغير ساده نباشه(مثلا یک آرایه دوبعدی یا خروجی متد یک آبجکت یا Property اون آبجکت باشه)
برای مثال:

<?php
$sport1 = 'volley';
$plan1 = "I will play $sport1ball in the summertime";
$plan2 = "I will play {$sport1}ball in the summertime";
?>

مشکل از اونجا ناشی ميشه که مفسر وقتی داخل یه رشته کاراکتر به $ برخورد کنه، تا رسيدن به فاصله خالی شروع به جمع آوری کاراکترها ميکنه و نام متغير رو تشخیص ميده و اگر قبلا مقدار گرفته بود، مقدارش رو جايگزين ميکنه وگرنه مقدار NULL يا هيچ رو به جای نام متغير قرار ميده. همونطور که فهميديد خروجی مثال بالا به قرار زيره:

<?php
// $plan1 = 'I will play in the summertime';
// $plan2 = 'I will play volleyball in the summertime'
?>
لينک مقاله
http://www.phpmystery.com :منبع

مقالات مرتبط با اين موضوع
انواع متغييرها در PHP | php
درج تاريخ شمسی، ميلادی و ساعت جاری در صفحات HTML | php
Hot Linking(نقره داغ وب مسترها) | php
يا بافر کردن خروجی | php
چگونه IP در PHP لاگ می شود | php
PHP و برنامه نويسی شی گرا | php
کوتيشن يا دابل کوتيشن؛ کی و کجا استفاده کنيم؟! | php
نصب فارسي نوك FarsiNuke در كلاينت XP,2000 | php
نمايش متن بصورت تصويري در اينترنت | php
كارتهاي الكترونيكي با php وmysql | php
چگونه يك برنامه لاگين امن و حرفه اي طراحي كنيد ? | php
مديريت فايل هاي ارسالي توسط كاربران | php
۷ دلیل برای اینكه استفاده از PHP بهتر از ASP می باشد | php
نکاتی مفید در مورد تنظیم php.ini | php
استفاده از تابع تبدیل تاریخ شمسی به میلادی و برعکس | php
راهنمای کامل نصب PHP بر روی windows | php
روش نصب PHP بروى Windows ها | php

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


PHP و برنامه نويسی شی گرا

PHP تا چه حد شی گراست؟! آيا تمام امکاناتی که در زبانهای برنامه نويسی شی گرای کاملی همچون Java وجود داره، در PHP هم پشتيبانی ميشه؟! پاسخ به اين سوال تا حدی بر ميگرده به معيارها و شرايطی که شما برای شی گرا بودن یک زبان مدنظر داريد. در اين پست من سعی ميکنم امکاناتی که نوعا در يک زبان برنامه نويسی شی گرا وجود داره رو بررسی کنم و حرفايی که PHP در هر مورد برای گفتن داره رو تا حدی توضيح بدم. (این راهنما بیشتر برای کسانی هست که از زبانهای OO دیگری میخوان به PHP روی بیارن.)
لازم به ذکر است که تنها به قابلیت های موجود در نسخه پایدار PHP که از Zend Engine 1 بعنوان مفسر(Parser) خود بهره می بره، پرداخته شده است.
وراثت یگانه(Single Inheritance):
PHP به شما اجازه میده که با استفاده از عبارت extends یک کلاس فرزند تعریف کنید که تمام مشخصه ها و رفتارهای کلاس والد رو دارا هست.(تعریف یک کلاس، از کلاس دیگه به ارث می رسه.)
وراثت چندگانه(Multiple Inheritance):
PHP از وراثت چندگانه پشتیبانی به عمل نمی یاره و هیچ نشانی از وراثت واسطه که در جاوا وجود داره دیده نمیشه. هر کلاس حداکثر یک کلاس والد خواهد داشت.
سازنده ها(Constructors):
هر کلاس می تونه یک تابع سازنده داشته باشه که در نسخه فعلی PHP که از Zend Engine 1 بهره می بره، باید همنام کلاس باشه. در نسخه بعدی PHP که مجهز به ZE2 می باشد، تابع سازنده هر کلاس ()construct__ نام خواهد گرفت. تابع سازنده کلاسهای والد به طور اتوماتیک فراخوانی نمی شن مگر اینکه صریحا احضار بشن!
تخریب کننده ها(Destractors):
نسخه فعلی PHP (با ZE 1) تابع تخریب کننده نداره، بیشتر به این خاطر هست که آزاد سازی حافظه و برگرداندن حافظه تخصیص یافته دست برنامه نویس نیست. اما نسخه های بعدی تابع تخریب کننده را دارا می باشد.
کپسوله سازی و کنترل دسترسی(Encapsulation):
هيچ پشتيبانی از کپسوله سازی در نسخه جاری PHP به عمل نيومده و تمام مشخصه ها و رفتارها Public هستند، اما تو نسخه بعدی دو نوع Private و Protected افزوده شده است.
چند شکلی(Polymorphism):
PHP چند شکلی رو به این صورت پشتیبانی میکنه که اجازه میده نمونه کلاس های فرزند به جای نمونه کلاسهای والد استفاده بشه.
اتصال دیر یا زود(Early vs. late binding)
دو پاسخ مناسب به این موضوع به قرار ذیل هست:
۱) از اونجایی که PHP یک زبان Loosely Type هست، این سوال پیش نمی یاد.
۲) تمام اتصالات Late هستند. در PHP مقادیر دارای نوع هستند ولی متغیرها بی نوع هستند، بنابراین این سوال که اگه نوع متغیر و مقدار متفات باشه کدوم متد فراخوانی بشه، به وجود نمی یاد.
توابع ايستا(Static Functions)
پشتيبانی صريحی از Class Functionها وجود نداره اما ميشه که با استفاده از سينتکس ()Classname::function ميشود تابع يک کلاس رو فراخوانی کرد. اين تابع تا وقتيکه به يک متغير داخلی ارجاع نکنه ، به عنوان يک Class Function در نظر گرفته ميشه.
درون نگری(Introspection):
در اين مورد PHP با دست پر ظاهر شده و توابع متنوعی برای کسب اطلاعات در مورد يک کلاس وجود داره، مثلا بازيابی نام کلاس، نام يک تابع، نام متغيرهای(مشخصه های) يک نمونه کلاس و ...

در آینده بیشتر با این مفاهیم آشنا میشیم.

»» حالا به نظر شما آيا زبانهای برنامه نويسی وب واقعا به OOP نياز دارند؟!
لينک مقاله
http://www.phpmystery.com :منبع

مقالات مرتبط با اين موضوع
انواع متغييرها در PHP | php
درج تاريخ شمسی، ميلادی و ساعت جاری در صفحات HTML | php
Hot Linking(نقره داغ وب مسترها) | php
يا بافر کردن خروجی | php
چگونه IP در PHP لاگ می شود | php
PHP و برنامه نويسی شی گرا | php
کوتيشن يا دابل کوتيشن؛ کی و کجا استفاده کنيم؟! | php
نصب فارسي نوك FarsiNuke در كلاينت XP,2000 | php
نمايش متن بصورت تصويري در اينترنت | php
كارتهاي الكترونيكي با php وmysql | php
چگونه يك برنامه لاگين امن و حرفه اي طراحي كنيد ? | php
مديريت فايل هاي ارسالي توسط كاربران | php
۷ دلیل برای اینكه استفاده از PHP بهتر از ASP می باشد | php
نکاتی مفید در مورد تنظیم php.ini | php
استفاده از تابع تبدیل تاریخ شمسی به میلادی و برعکس | php
راهنمای کامل نصب PHP بر روی windows | php
روش نصب PHP بروى Windows ها | php

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


چگونه IP در PHP لاگ می شود

برای ثبت IP کسانی که از سایت دیدار کرده اند باید کار های زیر را انجام دهیم:
1 فایلی به نام log.php ایجاد کنیم.
2 کد های زیر را در در فایل log.php قرار داده و ذخیره کنیم:

<?php
$ip = $SERVER['REMOTE_ADDR'];
$fp = fopen("ip.txt", "a");
fputs($fp, "$ip\n");
fclose($fp);
?>

3 فایلی به نام ip.txt ایجاد کنیم.
4. فایل ها و CHMOD ip.txt را به 0666 آپلود کنیم.
5. کد های زیر را در صفحه ی مورد نظر خود بالا تر از تگ <html> قرار دهیم:
<? include ("log.php"); ?>
برای دیدن نتیجه به yourwebsite.com/ip.txt مراجعه کنید.
لينک مقاله
http://www.persianhackers.net :منبع

مقالات مرتبط با اين موضوع
انواع متغييرها در PHP | php
درج تاريخ شمسی، ميلادی و ساعت جاری در صفحات HTML | php
Hot Linking(نقره داغ وب مسترها) | php
يا بافر کردن خروجی | php
چگونه IP در PHP لاگ می شود | php
PHP و برنامه نويسی شی گرا | php
کوتيشن يا دابل کوتيشن؛ کی و کجا استفاده کنيم؟! | php
نصب فارسي نوك FarsiNuke در كلاينت XP,2000 | php
نمايش متن بصورت تصويري در اينترنت | php
كارتهاي الكترونيكي با php وmysql | php
چگونه يك برنامه لاگين امن و حرفه اي طراحي كنيد ? | php
مديريت فايل هاي ارسالي توسط كاربران | php
۷ دلیل برای اینكه استفاده از PHP بهتر از ASP می باشد | php
نکاتی مفید در مورد تنظیم php.ini | php
استفاده از تابع تبدیل تاریخ شمسی به میلادی و برعکس | php
راهنمای کامل نصب PHP بر روی windows | php
روش نصب PHP بروى Windows ها | php

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


يا بافر کردن خروجی

Buffering يا بافر کردن خروجی، امکان پیشرفته ای است که از نسخه چهار PHP افزوده شده است. با فعالسازی OB، دیگر خروجی حاصل از اجرای اسکریپت شما، مستقیما به سمت کلاینت ارسال نمی شود و در عوض، این خروجی در حافظه موقتی سرویس دهنده که اصطلاحا بافر نامیده می شود، ذخیره می شود.
خوب؛ با قرار گرفتن خروجی در بافر، می توان قبل از ارسال محتویات به مرورگر، یک سری عملیات خاص روی خروجی انجام داد. برای مثال در اين مطلب، به کاربرد بسیار سودمند آن یعنی «فشرده سازی محتوا » اشاره کردم. از دیگر عملیاتی که می توان نام برد، تبدیل اسناد XML به HTML (مثلا اطلاعات را از سند XML بخوانیم و بوسیله تگهای HTML نمایش دهیم) یا مثلا به کمک عبارات باقاعده (regex)، تمام لینکها یا اصطلاحا URLهای گنجانده شده در خروجی را تغییر داد. یا هر عملیاتی که برای دستکاری رشته کاراکتر می تونید فکرشو بکنید.
بعد از انجام تغییرات، خروجی پردازش شده را می توان به راحتی به سمت کلاینت ارسال و بافر را خالی کرد.
شاید پیش خودتون فکر کنید، اگه من نخوام عملیاتی روی خروجی اپلیکیشن ام انجام بدم چی؟
حتی اگه شما نخواهید، پردازش خاصی روی خروجی اپلیکیشن اتون انجام بدید، بافر کردن خروجی، پرفورمنس و بازدهی سایتهای وب مبتنی بر PHP را بهبود می بخشد، زیرا تعداد عملیات های ورودی/خروجی(I/O) روی سرویس دهنده را کاهش می دهد. فراخوانی لایه I/O سرویس دهنده وب، معمولا عملیات پرخرجی است. گردآوری خروجی در یک بلاک بزرگ و انجام تنها یک عملیات I/O روی آن به مراتب سریعتر از زمانی است که برای هر تکه خروجی منتشر شده توسط PHP، یک عملیات I/O صورت پذیرد. منظورم زمانی است که دستورات echo و print را صدا می زنید.
حالا اگر اسکریپتهای PHP شما، صفحات HTMLای با حجم بیش از 10K را بعنوان خروجی تولید می کنند، تخصیص و آزادسازی بافر، ممکن است زمان بیشتری را در مقایسه با کاهش دفعات عملیات های I/O مصرف کند. بنابراین مطابق سایر مواردی که در علوم کامپیوتر وجود دارد، راه حل، یافتن تعادل مناسبی بین پرهیز از بافرینگ و استفاده تمام و کمال از بافرینگ است. خوشبختانه، بافرکردن خروجی PHP به کاربران امکان رسیدن به این تعادل را می دهد. به جای اینکه تمام خروجی بافر شود، ما می توانیم به PHP بگیم که خروجی را بصورت Chunked(قطعه ای) بافر کند. با بافر کردن خروجی به صورت قطعه ای، ما می توانیم مقدار داده های بافر شده را تا مقدار معینی محدود کنیم و هر موقع که به این مقدار رسیدیم و اصطلاحا بافر پر شد، بافر را خالی کنیم. مقدار متعادلی که برای بافر کردن خروجی قطعه ای پیشنهاد می شود، 4K است.این مقدار به طرز قابل توجهی، دفعات عملیات I/O را کاهش می دهد، بدون اینکه مقدار زیادی از حافظه اشغال شود یا overhead تخصیص دهی حافظه قابل ملاحظه ای را تحمیل کند.
برای نمونه، اگر اندازه متوسط یک صفحه HTML تولید شده توسط PHP برابر با 50K باشد، PHP معمولا بین ۵۰۰ تا ۱۰هزار عملیات I/O انجام میدهد. اما با یک بافر ۴ کیلوبایتی، این تعداد به ۱۲ تا ۱۳ عملیات کاهش می یابد که بسیار قابل توجه است.
اگر می خواهید این بافر ۴ کیلوبایتی را برای تمام سایت خود فعال کنید، دستورالعمل output_buffering واقع در فایل پیکربندی php.ini را به مقدار ۴۰۹۶ ست کنید. اگه هم می خواهید برای اسکریپتهای خاصی از OB استفاده کنید، از تابع ob_start استفاده کنید. برای مثال با نوشتن:

<?php
ob_start(null, 4096);
// rest of script
?>

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

*) Buffer مکانی در حافظه کامپيوتر است که می توان اطلاعاتی را به مدت کوتاهی در آن ذخیره کرد.(حافظه موقتی)

توضیح تکمیلی:
برمی گردیم به اون زمانی که OB نبود! برای ضبط خروجی یک اسکریپت، باید اون رو در یک رشته کاراکتر می ریختیم و وقتی کارمون تمام شد، اون رو اکو می کردیم.

<?php
$output = "<html><body>";
$output .= "Today is ".strftime("%A, %B %e %Y");
$output .= "</body></html>";

echo $output;
cache($output);

اگه از اون دسته از برنامه نويسان وبی هستيد که اين رشته خطير! رو با اسکريپتهای CGI مبتنی بر Perl ياد گرفتيد، اسکريپت بالا يادآور خاطرات دردناکی است که باهاش مواجه هستید. اگه هم تجربه اين جور اسکريپتها را نداريد، تنها می تونيد دورانی رو تصور کنيد که اسکريپتهای وب اين شکلی بودند!
با استفاده از OB، اسکريپت به حال عادی برگشت. تنها کاری که بايد انجام بديد، اينه که قبل از توليد خروجی بنويسيد:

<?php ob_start(); ?>

با اين کار، OB رو فعال می کنيد و از این به بعد، تمام خروجی ها، در بافر داخلی ذخيره می شود. حالا می تونيد کد صفحه را مثل يه اسکريپت معمولی، اضافه کنيد.

<html>
<body>
Today is <?= strftime("%A, %B %e %Y") ?>
</body>
</html>

خوب به جايی رسيديم که محتويات صفحه توليد شده؛ چه می کنيم؟! اول، محتويات بافر رو می گيريم و بعد هم اون رو خالی می کنيم.

<?php
$output = ob_get_contents();
ob_end_flush();
?>

()ob_get_contents، محتويات فعلی بافر را به صورت رشته کاراکتر بر می گردونه که می تونيد هر بلايی سرش در بياريد. ()ob_end_flush هم بافرينگ رو متوقف می کنه و محتويات فعلی بافر رو به سمت کلاينت روانه می کنه. اگه بخواهيد، محتويات رو در يک متغير بصورت رشته کاراکتری ذخيره کنيد و ديگه اون رو سمت مرورگر نفرستيد، می تونيد ()ob_end_clean را صدا کنيد تا بافرينگ رو متوقف کنه و کل محتويات بافر رو هم منهدم کنه! نکته قابل توجه اين هست که هر دوی اين توابع، بعد از اتمام کارشون، بافر رو از بين می برند. بنابراين برای گرفتن محتويات بافر، تابع ()ob_get_contents رو بايد قبل از خاتمه بافرينگ فراخوانی کنيد.
لينک مقاله
http://www.phpmystery.com :منبع

مقالات مرتبط با اين موضوع
انواع متغييرها در PHP | php
درج تاريخ شمسی، ميلادی و ساعت جاری در صفحات HTML | php
Hot Linking(نقره داغ وب مسترها) | php
يا بافر کردن خروجی | php
چگونه IP در PHP لاگ می شود | php
PHP و برنامه نويسی شی گرا | php
کوتيشن يا دابل کوتيشن؛ کی و کجا استفاده کنيم؟! | php
نصب فارسي نوك FarsiNuke در كلاينت XP,2000 | php
نمايش متن بصورت تصويري در اينترنت | php
كارتهاي الكترونيكي با php وmysql | php
چگونه يك برنامه لاگين امن و حرفه اي طراحي كنيد ? | php
مديريت فايل هاي ارسالي توسط كاربران | php
۷ دلیل برای اینكه استفاده از PHP بهتر از ASP می باشد | php
نکاتی مفید در مورد تنظیم php.ini | php
استفاده از تابع تبدیل تاریخ شمسی به میلادی و برعکس | php
راهنمای کامل نصب PHP بر روی windows | php
روش نصب PHP بروى Windows ها | php

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


Hot Linking(نقره داغ وب مسترها)

اگه شما هم سايتی داريد که میزبان تصاوير و عکسهای منحصر به فردی هست، يکی از مشکلاتی که با اون مواجه اید، Hot Linking است. يعنی سايتهای ديگه، با لينک دادن به تصاوير در صفحات خودشون، چنان وانمود می کنند که اين عکسها، توسط اونها گرفته شده و متعلق به اونهاست و یا میزبانی تصاویر رو بر عهده دارند. علاوه بر مسائل کپی رايتی که پيش مياد، Hot Link شدن تصاوير، پهنای باند شما رو هم مصرف میکنه. راه حلهای مختلفی برای حل این مشکل پیشنهاد میشه. یک راه حل مستلزم استفاده از امکان mod_rewrite آپاچی هست که بر حسب اطلاعات رجوع دهنده(referral) که مرورگر در اختیار میگذاره(که نمیشه همیشه به اون اعتماد کرد) ببینیم که آیا رجوع دهنده، آدرس وب خودمون هست یا نه. برای مثال:

SetEnvIfNoCase Referer "^http://www\.phpmystery\.com/" locally_linked=1
SetEnvIfNoCase Referer "^http://phpmystery\.com/" locally_linked=1
SetEnvIfNoCase Referer "^$" locally_linked=1

<FilesMatch "\.(gif|png|jpe?g)$">
Order Allow,Deny
Allow from env=locally_linked
</FilesMatch>

راهکار ديگر استفاده از Session است تا معلوم کنيم، بازديد کننده ای که در حال مشاهده تصوير است، از سايت ما می باشد. اينکار بدين طريق صورت ميگيرد که ابتدا متغييری در Session رجيستر می کنيم که در صورت وجود اين متغير، ويزيتور قادر به مشاهده تصاوير است. البته اسکريپت دومی هم وجود دارد که تصاوير رو رندر ميکنه:

<?php
// Start a session
session_start();

// Register a variable in the session
$_SESSION['viewImages'] = TRUE;
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title> Preventing Hotlinking </title>
<meta http-equiv="Content-Type"
content="text/html; charset=iso-8859-1" />
</head>
<body>
<p>Here is the image:</p>
<img src="11.php?img=php-big.png" />
</body>
</html>

همانطور که متوجه شديد، در اسکريپت بالا ابتدا يک Session رو آغاز می کنيم، در ادامه متغير viewImages رو در Session رجيستر می کنيم. سپس از تگ img به يک اسکرپيت PHP اشاره می شود که وظيفه واکشی تصوير رو بر عهده داره.
کد اسکريپت دوم:

<?php
// Start a session
session_start();

// Check to see if $viewImages is registered
if (isset($_SESSION['viewImages']) &&
$_SESSION['viewImages'] == TRUE) {

// An array of available images
$images = array(
'phpmystery_logo.jpg',
'php-big.png'
);

// If $_GET['img'] is set and is available...
if (isset($_GET['img']) && in_array($_GET['img'], $images)) {

// Get the image information
$dims = getimagesize('sample_images/' . $_GET['img']);

// Send the correct HTTP headers
header('content-disposition: inline; filename=' .
$_GET['img']);
header('content-type: ' . $dims['mime']); # PHP 4.3+
header('content-length: ' .
filesize('sample_images/' . $_GET['img']));

// Display the image
readfile('sample_images/' . $_GET['img']);

} else {
die('Invalid or no image specified');
}

} else {
die('This image is protected from hotlinking');
}
?>

در اسکريپت بالا، ابتدا بررسی می شود که آيا متغير viewImage در Session رجيستر شده و مقدار آن برابر True است. اگر چنین بود، سپس نام فايل تصويری که در آرايه سراسری GET_$ رجيستر شده، بررسی می شود که در آرايه تصاوير موجود باشد. بعد از اين مرحله، اسکريپت با استفاده از تابع getimagesize نوع فايل(MIME type) را تشخيص داده و هدرهای مناسب رو فرستاده و نهایتا تصوير را نمايش ميدهد.
با اينکار جلوی تمام Hot Linker ها رو می تونيد بگيريد.
لينک مقاله
http://www.phpmystery.com :منبع

مقالات مرتبط با اين موضوع
انواع متغييرها در PHP | php
درج تاريخ شمسی، ميلادی و ساعت جاری در صفحات HTML | php
Hot Linking(نقره داغ وب مسترها) | php
يا بافر کردن خروجی | php
چگونه IP در PHP لاگ می شود | php
PHP و برنامه نويسی شی گرا | php
کوتيشن يا دابل کوتيشن؛ کی و کجا استفاده کنيم؟! | php
نصب فارسي نوك FarsiNuke در كلاينت XP,2000 | php
نمايش متن بصورت تصويري در اينترنت | php
كارتهاي الكترونيكي با php وmysql | php
چگونه يك برنامه لاگين امن و حرفه اي طراحي كنيد ? | php
مديريت فايل هاي ارسالي توسط كاربران | php
۷ دلیل برای اینكه استفاده از PHP بهتر از ASP می باشد | php
نکاتی مفید در مورد تنظیم php.ini | php
استفاده از تابع تبدیل تاریخ شمسی به میلادی و برعکس | php
راهنمای کامل نصب PHP بر روی windows | php
روش نصب PHP بروى Windows ها | php

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


ColdFusion مقدماتی، قسمت اول

مقدمه

Coldfusion ، توليد شده توسط شرکت Allaire (در سال 2001 Allaire به Macromedia پيوست)، شامل يک سرور و مجموعه ابزارهايی برای استفاده از پايگاه داده ها در صفحات وب می باشد. با استفاده از ColdFusion، شخصی می تواند نامی را در يک صفحه وب وارد کند، و سرور اطلاعات مربوط به آن نام را از پايگاه داده درخواست کند و اطلاعات استخراج شده را به صورت صفحات HTML نشان دهد.

برنامه های ColdFusion در فايل هايی با پسوند .cfm ذخيره می شوند. برنامه های ColdFusion، دارای تگ هايی می باشند که ارتباط با پايگاه داده و کار با داده ها را آسان می سازد. اين تگ ها با CF شروع می شوند. مانند : CFQuery، CFMail و ...

شروع کار

برای اجرای سرور coldfusion :

1- اگر در ويندوز 98 هستيد، Start->Macromedia ColdFusion MX -> ColdFusion MX Start

2- اگر از ويندوز 2000 يا XP استفاده می کنيد،

Control Panel -> Administrative Tools -> Services

سپس ، از پانل سمت راست، ColdFusion MX Application Server را پيدا کنيد و راست کليک کرده و start را انتخاب کنيد.

اولين برنامه ColdFusion شما

برای نوشتن يک برنامه ColdFusion به يک ويرايشگر نياز داريد. اين ويرايشگر می تواند هر ويرايشگر مورد علاقه شما مانند : HTML-Kit، HomeSite، Notepad و ... باشد. فقط بايد فايل خود را با پسوند .cfm و بصورت متنی ذخيره کنيد. من برای نوشتن مثال های اين مقاله از Notepad ويندوز استفاده کرده ام.

1- Notepad را باز کنيد.

2- کد زير را تايپ کنيد :

<HTML>

<HEAD>

<Title>

Salam

</Title>

</HEAD>

<Body>

<CFSet MyVar="Hello World" />

<CFOutput>#MyVar#</CFOutput>

</Body>

</HTML>

3- يک دايرکتوری جديد به نام mysite در زيرشاخه wwwroot کلدفيوژن ايجاد کنيد.

4- فايل خود را در دايرکتوری جديد با نام MyPage.cfm ذخيره کنيد.

دقت کنيد که “Save As Type” را برابر All Files (*.*) قرار دهيد تا با پسوند txt ذخيره نگردد.

1- يک پنجره Internet Explorer باز کنيد و به آدرس زير برويد :

http://localhost:8500/mysite/MyPage.cfm

http://localhost:8500/ به مسير زيرشاخه wwwroot مسيری که ColdFusion در آن نصب شده است اشاره می کند در اينجا C:\CfusionMX\wwwroot. و بقيه آدرس مسير فايل مورد نظر نسبت به wwwroot می باشد.

توضيح برنامه بالا :

<HTML>

<HEAD>

<Title>

Salam

</Title>

</HEAD>

<Body>

< "CFSet MyVar="Hello World>

<CFOutput>#MyVar#</CFOutput>

</Body>

</HTML>

قسمت های سبز کد بالا کد HTML معمولی می باشند.

و اما قسمت های سياه کد بالا :

<CFSet MyVar=”Hello World” />

يک متغير به نام MyVar ايجاد می شود و مقدار آن برابر "Hello World" قرار می گيرد. کلا برای ايجاد و مقدار دهی به متغير ها دو راه وجود دارد. راه اول استفاده از CFSet می باشد که پس از نوشتن CFSet نام متغير و سپس علامت مساوی و سپس مقدار جديد متغير را می نويسيم. راه دوم، استفاده استفاده از CFParam به شکل زير می باشد :

<CFParam name=”MyVar” default=”DefaultValue”>

اگر متغيری به نام MyVar وجود نداشته باشد، با اجرای خط بالا، متغيری با نام MyVar و مقدار DefaultValue ايجاد می گردد و اگر از قبل متغيری با نام MyVar وجود داشته باشد هيچ اتفاقی نمی افتد. يعنی متغير MyVar مقدار پيشين خود را حفظ می کند.

و اما خط زير :

<CFOutput>#MyVar#</CFOutput>

عبارات بين <CFOutput></CFOutput> مورد بررسی قرار می گيرد و هر عبارتی که بين ## قرار داشته باشد، مقدار معادل آن جايگزين می گردد. مثلا در مثال بالا، بجای #MyVar# ، Hello World جايگزين می شود.

پس از اجرای کد بالا، کد HTML زير به عنوان نتيجه کد ColdFusion ايجاد می گردد و به مرور گر کاربر فرستاده می شود :

<HTML>

<HEAD>

<Title>

Salam

</Title>

</HEAD>

<Body>

Hello World

</Body>

</HTML>

متغير ها در ColdFusion

قوانين نام گذاری متغير ها :

1- نام متغيرها تشکيل شده است از يک حرف بعلاوه چندين کاراکتر حرفی، عددی يا underscore.

2- نام متغيرها بايد يک کلمه باشند و دارای space نباشند.

3- از حروف خاص مانند ! يا ? در نام گذاری متغيرها نمی توانيد استفاده کنيد.

4- نام متغيرها حساس به کوچکی و بزرگی حروف نمی باشند.

برای نشان دادن مقدار يک متغير از <CFOutput> به شکل زير استفاده می کنيم:

<CFOutput>

# This is the Value for a variable : #MyVar

</CFOutput>

MyVar نام متغير می باشد. بقيه عبارت به همان صورت به خروجی فرستاده خواهند شد.

پایان قسمت اول

هرگونه پیشنهاد و سوال خود را به irancoldfusion@yahoo.com ايميل بزنيد. در قسمت بعد نحوه کار کردن با پايگاه داده را ياد خواهم داد.
لينک مقاله
http://www.macromediax.com :منبع

مقالات مرتبط با اين موضوع
مقایسه Coldfusion و ASP | coldfusion
دفاع از کلدفیوژن در برابر پدرخوانده اش | coldfusion
آموزش کلد فیوژن : متغیر های Client و Session | coldfusion
آموزش ColdFusion ، ساختار Switch/Case | coldfusion
دستورهای شرطی در ColdFusion | coldfusion
درك و رفع نقص پيام هاي error در كلد فيوژن | coldfusion
آموزش ColdFusion ،انواع داده ي پيچيده : آرايه ها | coldfusion
آموزش کلد فیوژن: انواع داده پيچيده : ليست ها | coldfusion
کار با پایگاه داده ها در کلدفیوژن | coldfusion
ColdFusion مقدماتی، قسمت اول | coldfusion

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


کار با پایگاه داده ها در کلدفیوژن

برای کار با پایگاه داده در کلدفیوژن، ابتدا باید برای آن پایگاه داده یک Datasource تعریف کنید. مثلا، برای ایجاد یک Datasource برای یک پایگاه داده Microsoft Access به روش زیر عمل می کنیم :

اگر در ویندوز 98 هستید، به Control Panel -> Data Sources (ODBC) بروید.

اگر در ویندوز 2000 یا ویندوز XP هستید، به Control Panel -> Administrative Tools -> Data Sources(ODBC) بروید.

به System DSN بروید.

Add ... را کلیک کنید.

در پنجره باز شده، “Microsoft Access Driver" را انتخاب کنید و روی Finish کلیک کنید.

در پنجره باز شده برای Datasource خود یک نام انتخاب کنید.

روی Select ... کلیک کنید و فایل Access مورد نظر را انتخاب کنید.

به Start -> Programs -> Macromedia Coldfusion MX -> Administrator بروید.

کلمه عبور را وارد کنید.

از قسمت سمت چپ صفحه Data Sources را انتخاب کنید.

در Data Source Name نام Datasource خود را بنویسید.

از Driver ، گزینه ی JDBC-ODBC Bridge را انتخاب کنید و روی Add کلیک کنید.

در صفحه ای که ظاهر می شود، از لیست ODBC DSN، نام Datasource ی را که درControl Panel ایجاد کرده بودید را انتخاب کنید.

روی Submit کلیک مکنید.

برای نمایش داده های یک پایگاه داده در یک برنامه کلدفیوژن، از تق <CFQuery> به روش زیر استفاده می کنیم :

<CFQuery Datasource=”mydatasource” name=”query_name”>

Select field_1,field_2,field_3 from table_name

</CFQuery>

<CFOutput query=”query_name”>

Field 1 : #field_1# <BR>

Field 2 : #field_2# <BR>

Field 3 : #field_3# <BR>

</CFOutput>

Select field_1,field_2,field_3 from table_name یک عبارت SQL می باشد که سه فیلد field_1، field_2، و field_3 تمام رکوردهای جدول table_name از پایگاه داده ای که datasource “mydatasource” را به آن نسبت داده ایم را انتخاب می کند و سپس نتیجه را در متغیر query_name قرار می دهد.

<CFQuery ...> یک حلقه چرخشی روی تمام رکوردهای متغیر query_name انجام می دهد و در هر مرحله مقادیر فیلد های هر رکورد به صورت متغیر در دسترس هستند و می توان عملیات مختلفی روی آن ها انجام داد. مثلا در کد بالا در هر مرحله مقادیر داخل ## با مقادیر واقعی فیلد های هر رکورد جایگزین می گردند و نمایش داده می شوند.

برای افزودن یک رکورد به یک پایگاه داده، مراحل زیر را باید انجام دهیم :

ابتدا یک فرم HTML ساده برای دریافت اطلاعات و ارسال آن ها به صفحه action ایجاد می کنیم :

<HTML>

<HEAD>

<TITLE>A Title</TITLE>

</HEAD>

<BODY>

<Form action=”add.cfm” method=”post”>

Name : <input type=”text” name=”name”>

<BR>

Last name: <input type=”text” name=”lastname”>

<BR>

<input type=”submit”>

</Form>

</BODY>

</HTML>

برای یادگیری مطالب بیشتر در این باره به کتاب ها و مراجع HTML مراجعه فرمائید.

سپس صفحه action را برای افزودن رکورد جدید به پایگاه داده ایجاد می کنیم (add.cfm) :

<CFQuery name=”add_query” datasource=”mydatasource”>

Insert Into my_table(

Field_1,

Field_2)

Values(

‘#form.name#’,

‘#form.lastname#’)

</CFQuery>

این کد یک رکورد به جدول my_table پایگاه داده ای که mydatasource به آن اشاره می کند، با مقادیر فیلد های form.name و form.lastname اضافه می کند. Form.name یک متغیر است که به مقدار Submit شده ی فیلد name در فرم HTML اشاره می کند و مقدار آن با مقدار اصلی عوض می گردد.

برای محدود کردن نمایش رکوردها ی یک پایگاه داده از عبارت SQL ی مانند مثال زیر استفاده می کنیم :

Select field1,field2,field3 from my_table where field1>0 AND field2=2

این عبارت نتایج را به نتایجی که مقدار field1 آن ها بزرگتر از صفر و مقدار field2 آن ها برابر 2 می باشد، محدود می کند. برای اطلاعات بیشتر در این زمینه به کتاب ها و مراجع SQL مراجعه کنید.

کنترل جریان برنامه :

در این قسمت چند شیوه کنترل جریان برنامه را توضیح می دهم و بقیه را برای قسمت های بعدی می گذارم.

برای اجرا کردن کد یک فایل cfm دیگر در جایی از برنامه ی مان، از cfinclude به صورت زیر استفاده می کنیم :

<cfinclude template=”myfile.cfm”>

این دستور در هر کجا از برنامه قرار بگیرد، با کد های موجود در فایل myfile.cfm جایگزین می گردد.

برای هدایت کردن مرور گر به یک صفحه ی دیگر یا یک آدرس اینترنتی دیگر، از cflocation به صورت زیر استفاده می کنیم :

<cflocation url=”http://google.com/”>

<cflocation url=”mypage.cfm”>

این دستور ها باعث توقف اجرای برنامه جاری می شوند و مرورگر کاربر را به صفحه ی مشخص شده ( مثلا http://google.com در مثال اول و mypage.cfm در مثال دوم) می فرستد.

برای انجام دادن کار ها بر اساس شرط یا شروط، از ساختار cfif/cfelseif/cfelse به صورت زیر استفاده می کنیم :

<cfif condition1 >

Do something here if condition1 is true

<cfelseif condition2 >

Do another thing here if condition2 is true

<cfelse>

Do some other thing here if neither condition1 nor condition2 is true

</cfif>

در این جا اگر شرط condtion1 درست باشد، کد قسمت اول اجرا می گردد (و بقیه قسمت ها اجرا نمی گردند.) وگرنه اگر شرط condition2 درست باشد، کد قسمت دوم اجرا می گردد. و گرنه، کد قسمت آخر (سوم) اجرا می گردد.

شروط در کلدفیوژن عباراتی مثل Var1 EQ Var2 به معنی اینکه آیا مقدار Var1 با مقدار Var2 برابر می باشد یا نه و یا Var1 Is Not Var2 به معنی اینکه آیا مقادیر Var1 و Var2 نا برابر می باشند یا نه، هستند.

برای توقف اجرای برنامه از cfabort استفاده می کنیم :

<CFAbort>
لينک مقاله
http://www.macromediax.com :منبع

مقالات مرتبط با اين موضوع
مقایسه Coldfusion و ASP | coldfusion
دفاع از کلدفیوژن در برابر پدرخوانده اش | coldfusion
آموزش کلد فیوژن : متغیر های Client و Session | coldfusion
آموزش ColdFusion ، ساختار Switch/Case | coldfusion
دستورهای شرطی در ColdFusion | coldfusion
درك و رفع نقص پيام هاي error در كلد فيوژن | coldfusion
آموزش ColdFusion ،انواع داده ي پيچيده : آرايه ها | coldfusion
آموزش کلد فیوژن: انواع داده پيچيده : ليست ها | coldfusion
کار با پایگاه داده ها در کلدفیوژن | coldfusion
ColdFusion مقدماتی، قسمت اول | coldfusion

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آموزش کلد فیوژن: انواع داده پيچيده : ليست ها

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

<cfset List_of_employees="Hadi Moshayedi,Hossein Sharafi,Ben Forta">
<cfset List_of_animals="Elephant;Horse;Monkey">
<cfset List_of_salaries="12000,1300,5000,4000">

به کاراکتري که مقادير را از هم جدا مي کند، Delimiter گويند. مثلا , (کاما) در مثال اول و ; در مثال دوم.
همانطور که در مثال هاي بالا ديديد، براي ايجاد ليست ها از <cfset ... > استفاده مي کنيم و مقادير اوليه را تنظيم مي کنيم.

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

<cfset myList="hadi,coldfusion,something">
<cfset myList = ListAppend(myList,"php")>

مثال بالا مقدار جديد "php" را به انتهاي ليست اضافه مي کند. اين تابع، داراي پارامتر سومي مي باشد که اختياري مي باشد و مي تواند مانند مثال بالا ذکر نشود. اين پارامتر سوم، Delimiter ليست را مشخص مي کند و به صورت پيش فرض مقدار آن کاما مي باشد. اگر در ليست از Delimiter ي به غير از کاما استفاده کرده باشيم، براي افزودن يک مقدار به انتهاي ليست به صورت زير عمل مي کنيم :

<cfset myList="hadi;coldfusion;something">
<cfset myList = ListAppend(myList,"php",";")>

ListAppend مقدار جديد را به انتهاي ليست اضافه مي کرد. براي افزودن يک مقدار به ابتداي ليست، از تابع ListPrepend ، به همان صورت که از ListAppend استفاده مي کرديم، استفاده مي کنيم. به مثال هاي زير توجه فرمائيد :

<cfset myList="a,b,c,d">
<cfset myList = ListPrepend(myList,"0")>
<!--- Now, myList contains "0,a,b,c,d" --->

<cfset myList="a;b;c;d">
<cfset myList = ListPrepend(myList,"0",";")>
<!--- Now, myList contains "0;a;b;c;d" --->

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

<cfset myList="a,b,c,d">
<cfset myList = ListInsertAt(myList,3,"h")>

در مثال بالا، مقدار "h" سومين عنصر از ليست خواهد شد. مانند توابع ديگري که در اين مقاله معرفي گرديد، اين تابع نيز داراي پارامتر اختياري چهارمي هست که Delimiter ليست را مشخص مي کند و مقدار پيش فرض آن کاما مي باشد.

استخراج مقداري از ليست با استفاده از انديس آن
براي استخراج مقدار عنصري از ليست با استفاده از انديس آن، از تابع ListGetAt استفاده مي کنيم. به صورت زير :

<cfset myList="a,b,c,d">
<cfset second_item=ListGetAt(myList,2)>

کد بالا مقدار عنصر دوم ليست myList را در متغير second_item قرار مي دهد.
اين تابع نيز داراي پارامتر اختياري مشخص کننده Delimiter مي باشد.

توابع ListFirst و ListLast به ترتيب مقدار عنصر اول، و مقدار عنصر آخر ليست را مي دهند. تابع ListRest تمام عناصر يک ليست به غير از عنصر اول را به عنوان خروجي مي دهد.

<cfset myList="a,b,c,d">
<cfset first_item = ListFirst(myList)>
<!--- first_item contains "a" now --->
<cfset last_item = ListLast(myList)>
<!--- last_item contains "d" now --->
<cfset rest_items = ListRest(myList)>
<!--- rest_items contains "b,c,d" now --->

براي بدست آوردن تعداد عناصر يک ليست از تابع ListLen به صورت زير استفاده مي کنيم :

<cfset myList="a,b,c,d">
<cfset myListLen = ListLen(myList)>
<!---Now, myListLen Equals 4 --->
<cfset myList="a;b;c;d">
<cfset myListLen = ListLen(myList,";")>
<!---Now, myListLen Equals 4 --->

براي حذف عنصري از ليست، از تابع ListDeleteAt به صورت زير استفاده مي کنيم :

<cfset myList="a,b,c,d">
<cfset myList = ListDeleteAt(myList,2)>

کد بالا عنصر دوم ليست را حذف مي کند.

جستجو در ليست ها
براي پيدا کردن مقداري در ليست، از تابع ListFind استفاده مي کنيم. اين تابع موقعيت اولين عنصري که داراي مقدار دلخواه باشد را به عنوان خروجي بر مي گرداند.

<cfset myList="Hadi,Hossein,Ben">
<cfset Pos1 = ListFind(myList,"Ben")>
<!--- Pos1 equals 3 now --->

تابع ListContains موقعيت اولين عنصري که داراي مقدار شامل عبارت مورد نظر را به عنوان خروجي بر مي گرداند.

<cfset myList="Hadi,Hossein,Ben">
<cfset Pos2 = ListContains(myList,"se")>
<!--- Pos2 equals 2 now --->

کد بالا مقدار ۲ را در متغير Pos2 قرار مي دهد، زيرا عبارت Hossein شامل عبارت se مي باشد.
ListFind و ListContains بين حروف بزرگ و کوچک تفاوت قائل مي شوند. براي اينکه در جستجو حروف بزرگ و کوچک يکسان باشند به جاي توابع بالا از توابع ListFindNoCase و ListContainsNoCase استفاده مي کنيم.

ليست هاي داراي عناصر خالي
عناصر خالي، عناصري از ليست هستند که داراي هيچ مقداري نمي باشند. براي درک چگونگي کار با آن ها به مثال زير توجه کنيد :

<cfset myList = "Hadi,,Hossein,Ben,,">

فکر مي کنيد ليست myList داراي چند عنصر مي باشد؟ شايد فکر کنيد که اين ليست داراي شش عنصر مي باشد، ولي کلدفيوژن عناصر داراي مقدار خالي را حساب نمي کند ... پس ليست بالا از نظر کلدفيوژن سه عنصر دارد و "Ben" مقدار عنصر سوم آن مي باشد.
براي ايجاد عناصر خالي، از کاراکتر فاصله به جاي مقدار خالي استفاده کنيد، مانند مثال زير :

<cfset myList = "Hadi, ,Hossein,Ben, , ">

ليست بالا از نظر کلدفيوژن شش عنصر دارد.

براي تغيير مقدار عنصري از ليست از تابع ListSetAt مانند مثال زير استفاده مي کنيم :

<cfset myList = "Hadi,Hossein,Ben">
<cfset myList = ListSetAt(myList,1,"Good Boy")>
<!--- myList = "Good Boy,Hossein,Ben" --->

کد بالا مقدار عنصر اول ليست را از Hadi به Good Boy تغيير مي دهد.

مرتب سازي عناصر ليست
براي مرتب سازي عناصر يک ليست از تابع ListSort استفاده مي کنيم. اين تابع داراي دو پارامتر اجباري که اولي مشخص کننده ليست، و دومي مشخص کننده نوع مرتب سازي مي باشد، مي باشد.

<cfset myList = "a,d,c,v">
<cfset myList = ListSort(myList,"text")>

مقادير قابل قبول براي پارامتر دوم عبارتند از "text"، "textnocase"، و "numeric". مرتب سازي "text" بين حروف بزرگ و کوچک تفاوت قائل مي باشد و در مرتب سازي حروف بزرگتر اول تر قرار مي گيرند ... "textnocase" براي حروف بزرگ و کوچک ارزش يکساني قائل مي باشد. "numeric" عناصر بر اساس ارزش عددي آن ها مرتب مي سازد.
پارانتر سوم که اختياري مي باشد، ترتيب مرتب سازي را مشخص مي سازد. "asc" (مقدار پيش فرض) مشخص مي کند که مرتب سازي از ارزش کمتر به ارزش بيشتر باشد . "desc" براي مرتب سازي از ارزش بيشتر به ارزش کمتر به کار مي رود. به مثال هاي زير توجه کنيد :

<cfset myList = "a,d,c,v">
<cfset myList = ListSort(myList,"text")>
<!--- myList = "a,c,d,v" --->
<cfset myList = "a,B,c,d">
<cfset myList = ListSort(myList, "textnocase", "desc")>
<!--- myList = "d,c,B,a" --->

Delimiter هاي يک ليست
توابعي که براي کار با ليست ها به کار مي روند تقريبا همه شان يک پارامتر آخري اختياري دارند که Delimiter ليست را مشخص مي سازد. Delimiter هايي که اکثرا مورد استفاده قرار مي گيرند، عبارتند از : کاما، ;، |، ~ .
براي تغيير Delimiter يک ليست از تابع ListChangeDelims به صورت زير استفاده مي کنيم :

<cfset myList = "a;b;c;d">
<cfset myList = ListChangeDelims(myList, ",", ";")>
<!--- myList = "a,b,c,d" --->

پارامتر دوم مشخص کننده Delimiter جديد و پارامتر سوم مشخص کننده Delimiter قبلي مي باشد. پارامتر سوم اختياري مي باشد و داراي مقدار پيش فرض کاما مي باشد.

ايجاد حلقه(Loop) روي عناصر ليست
براي ايجاد حلقه روي عناصر يک ليست، به صورت زير عمل مي کنيم :

<cfset myList = "a;b;c;d">
<cfoutput>
<cfloop list="#myList#" index="theElement" delimiters=";" >
#theElement#<br>
</cfloop>
</cfoutput>

در کد بالا، theElement ابتدا مقدار "a" ، سپس مقدار "b" ، سپس مقدار "c" و در آخر مقدار "d" مي گيرد و در هر مرحله کد بين <cfloop ...></cfloop> را براي مقادير theElement اجرا مي کند. delimiters اختياري مي باشد و داراي مقدار پيش فرض کاما مي باشد.

مناسب سازي يک ليست براي عبارات SQL
ليست زير را در نظر بگيريد :

<cfset myList = "pear,lemon,orange,citron">

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

SELECT *
FROM Fruit
WHERE FruitName IN ('pear','lemon','orange','citron')

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

SELECT *
FROM Fruit
WHERE FruitName IN (#myList#)

زيرا عناصر ليست داراي ' (single quote) در دو طرفشان نمي باشند. براي اين منظور، از تابع ListQualify استفاده مي کنيم. مانند مثال زير :

SELECT *
FROM Fruit
WHERE FruitName IN (#ListQualify(myList,"'")#))

موارد استفاده از ليست ها
اينکه کجا از ليست ها استفاده کنيد، بستگي به خودتان و خلاقيت و نحوه ي تفکر شما دارد. اما من شخصا از ليست ها در موارد زير استفاده مي کنم :

  1. وقتي مي خواهم در يک متغير کوکي (cookie) بيش از يک مقدار قرار دهم. زيرا نمي توان به کوکي ها مقادير آرايه اي داد، ليست ها در اين جا يکي از انتخاب هاي خوب براي استفاده مي باشد. روش ديگري هم وجود دارد که بعدا در باره ي آن صحبت خواهم کرد.
  2. هنگامي مي خواهم ليستي از مقادير را در يک فيلد از يک رکورد در پايگاه داده ذخيره کنم. در اين مورد نيز نمي توان از آرايه ها استفاده کرد.
لينک مقاله
http://www.macromediax.com :منبع

مقالات مرتبط با اين موضوع
مقایسه Coldfusion و ASP | coldfusion
دفاع از کلدفیوژن در برابر پدرخوانده اش | coldfusion
آموزش کلد فیوژن : متغیر های Client و Session | coldfusion
آموزش ColdFusion ، ساختار Switch/Case | coldfusion
دستورهای شرطی در ColdFusion | coldfusion
درك و رفع نقص پيام هاي error در كلد فيوژن | coldfusion
آموزش ColdFusion ،انواع داده ي پيچيده : آرايه ها | coldfusion
آموزش کلد فیوژن: انواع داده پيچيده : ليست ها | coldfusion
کار با پایگاه داده ها در کلدفیوژن | coldfusion
ColdFusion مقدماتی، قسمت اول | coldfusion

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آموزش ColdFusion ،انواع داده ي پيچيده : آرايه ها

آرايه ها نيز مانند ليست ها، براي ذخيره سازي مقادير متعدد، تحت يک نام مي باشند. اما، برخلاف ليست ها، اين ذخيره سازي در قسمت ها جدا از هم انجام مي گيرد و مانند ليست ها تمام مقادير در يک رشته اي از مقادير جدا شده به وسيله ي حرف جدا کننده ذخيره نمي گردند.

ليست ها داده هاي ساده مي باشند، چون فقط يک رشته مي باشند، در حالي که آرايه ها داده هاي پيچيده مي باشند، چون متشکل از چندين قسمت قابل آدرس دهي مي باشند و داراي چنيدن مقدار مختلف مي باشند.

ايجاد يک آرايه

برخلاف ليست، که يک رشته ساده مي باشد، آرايه ها نوع داده ي پيچيده اي مي باشند که توسط تابع ArrayNew() ايجاد مي گردند. مانند مثال زير :

<cfset myArray = ArrayNew(1) >

تکه کد بالا، يک آرايه ي يک بعدي ايجاد مي کند و آن را به ArrayNew تخصيص مي دهد. يک آرايه مي تواند تا 3 بعد داشته باشد.

ارجاع به عضوي از يک آرايه

براي دسترسي به عضوي از آرايه، مانند مثال زير عمل مي کنيم :

<cfoutput>#MyArray[2]#</cfoutput>

مثال بالا مقدار عنصر دوم آرايه را چاپ مي کند. بر خلاف اکثر زبان هاي برنامه نويسي، انديس آرايه در کلدفيوژن از يک شروع مي شود.

افزودن عنصري به آرايه

براي افزودن عنصري به آرايه از ArrayAppend() به شکل زير استفاده مي کنيم :

<cfset myArray = ArrayNew(1)>

<cfset ArrayAppend(myArray,”apple”)>

به تفاوت ArrayAppend و ListAppend توجه کنيد :

<cfset myList = ListAppend(myList, “apple”)>

<cfset ArrayAppend(myArray,”apple”)>

ListAppend مقدار ليست اصلي را تغيير نمي دهد، بلکه يک ليست جديد با يک مقدار جديد افزوده شده به انتهاي آن ايجاد مي کند. اما ArrayAppend تغييرات را روي آرايه ي اصلي اعمال مي کند، و مقدار بازگشتي آن در صورت موفقيت تابع true مي باشد و در غير اين صورت false مي باشد. بنابراين شما حتي نياز نداريد که مقدار بازگشتي را ذخيره کنيد.

همچنين براي افزودن عنصري به ابتداي يک آرايه از تابع ArrayPrepend مانند مثال زير استفاده مي کنيم :

<cfset ArrayPrepend(myArray,”lemon”)>

شما همچنين مي توانيد عنصري را ميان عناصر موجود اضافه کنيد . مثلا فرض کنيد آرايه ي ما داراي عناصر زير باشد :

1 : peach

2 : apple

شما مي توانيد عنصري را ميان عناصر اول و دوم اضافه کنيد . بدين منظور از تابع ArrayInsertAt به صورت زير استفاده مي کنيم :

<cfset ArrayInsertAt(myArray,2,”lemon”)>

پس از اجراي کد بالا آرايه ي ما داراي عناصر زير خواهد بود :

1 : peach

2 : lemon

3 : apple

شما همچنين مي توانيد يک عنصر براي آرايه بوسيله عمل تخصيص ايجاد کنيد. مثلا، براي آرايه ي بالا، کد زير را اجرا مي کنيم :

<cfset myArray[4]=”blueberry”>

حال، آرايه ي ما داراي چهار عنصر زير مي باشد :

1 : peach

2 : lemon

3 : apple

4 : blueberry

شما همچنين مي توانيد از مقدار دهي به برخي از عناصر صرف نظر کنيد :

<cfset myArray[6]=”pomegranate”>

پس از اجراي کد بالا آرايه ما به صورت زير مي باشد :

1 : peach

2 : lemon

3 : apple

4 : blueberry

5 : هيچ عنصري با انديس پنج وجود ندارد

6 : pomegranate

به آرايه ي بالا توجه کنيد، هيچ عنصري با انديس 5 وجود ندارد و اين به اين معني نيست که آرايه ي پنجم داراي مقدار خالي مي باشد، فقط، هيچ عنصري با انديس 5 وجود ندارد.

حذف عنصري از يک آرايه

براي حذف عنصري از آرايه مي توانيد از تابع ArrayDeleteAt به صورت زير استفاده کنيد :

<cfset ArrayDeleteAt(myArray,2)>

تابع بالا عنصر دوم از آرايه را حذف مي کند.

براي پاک کردن کل آرايه ، يعني حذف تمام عناصر از تابع ArrayClear مانند زير استفاده مي کنيم :

<cfset ArrayClear(myArray)>

بدست آوردن اطلاعاتي در رابطه با آرايه :

براي تست کردن اينکه آيا هيچ عنصري در آرايه موجود مي باشد يا نه ، از تابع ArrayIsEmpty به صورت زير استفاده مي کنيم :

<cfif ArrayIsEmpty(myArray)>

This Array is empty.

<cfelse>

This Array has some elements.

</cfif>

براي بدست آوردن تعداد عناصر يک آرايه از تابع ArrayLen بصورت زير استفاده مي کنيم :

<cfset numElements = ArrayLen(myArray) >

ArrayLen عناصر تعريف نشده را نيز حساب مي کند.

پيدا کردن عنصري در آرايه :

براي پيدا کردن عناصر در يک ليست دو تابع ListFind و ListFindnocase وجود داشتند، ولي هيچ تابعي براي جستجو بر روي آرايه ها وجود ندارد. بنابراين، براي جستجو در يک آرايه، بايد از cfloop مانند مثال زير استفاده کرد :

<cfloop from=”1” to=”#ArrayLen(myArray)#” index=”I”>

<cfif myArray[I] EQ “apple”>

<cfbreak>

</cfif>

</cfloop>

پس از اجراي کد بالا، I داراي انديس عنصر داراي مقدار apple مي باشد.

برخي توابع رياضي براي آرايه ها :

تابع ArrayMin براي پيدا کردن کمترين مقدار موجود در آرايه به کار مي رود.

تابع ArrayMax براي پيدا کردن بيشترين مقدار موجود در آرايه به کار مي رود.

تابع ArraySum براي پيدا کردن مجموع مقادير موجود در آرايه به کار مي رود.

تابع ArrayAvg براي پيدا کردن ميانگين مقادير موجود در آرايه به کار مي رود.

به عنوان مثال، به تکه کد زير توجه کنيد :

<cfset NumericArray=ArrayNew(1)>

<cfset NumericArray[1]=10>

<cfset NumericArray[2]=12>

<cfset NumericArray[3]=11>

<cfset NumericArray[4]=20>

<cfset NumericArray[5]=10>

<cfset Minimum=ArrayMin(NumericArray)>

<cfset Maximum=ArrayMax(NumericArray)>

<cfset Sum=ArraySum(NumericArray)>

<cfset Avg=ArraySum(NumericArray)>

تعويض جاي عناصر يک آرايه :

فرض کنيد عناصر آرايه ي ما به صورت زير باشند :

1 : peach

2 : lemon

3 : apple

4 : blueberry

براي تعويض جاي عنصر اول و عنصر سوم ، از تابع ArraySwap به صورت زير استفاده مي کنيم :

<cfset ArraySwap(myArray,1,3)>

حال عناصر آرايه ي ما به صورت زير مي باشند :

1 : apple

2 : lemon

3 : peach

4 : blueberry

مرتب سازي عناصر يک آرايه :

همانند ليست ها، شما مي توانيد عناصر يک آرايه را به راحتي مرتب کنيد :

<cfset ArraySort(myArray,”text”,”asc”>

پس از اينکه کد بالا اجرا شد، آرايه داراي عناصر به ترتيب زير مي باشد :

1 : apple

2 : blueberry

3 : lemon

4 : peach

اگر عنصر تعريف نشده اي در آرايه موجود باشد، و شما بخواهيد آرايه را مرتب کنيد، کلدفيوژن يک خطا ايجاد مي کند.

همانند براي ListSort()، دومين پارامتر تابع ArraySort، نوع مرتب سازي که مي خواهيد انجام دهيد را مشخص مي کند :

· Numeric : آرايه را به صورت عددي مرتب سازي مي کند. اگر عنصري از آرايه نتواند به يک عدد تبديل شود، يک خطا رخ مي دهد.

· Text : آرايه را به صورت الفبايي مرتب سازي مي کند، و حساس به بزرگي و کوچکي حروف مي باشد.

· Textnocase : آرايه را به صورت الفبايي مرتب سازي مي کند، و حساس به بزرگي و کوچکي حروف نمي باشد.

سومين پارامتر تابع ArraySort() مي تواند “asc” و يا “desc" باشد. بستگي دارد به اينکه شما مي خواهيد آرايه را به صورت از کوچک به بزرگ مرتب کنيد و يا از بزرگ به کوچک مرتب کنيد.

تغيير اندازه ي يک آرايه :

هر وقت که شما يک عنصر را به آرايه اضافه مي کنيد، مقداري حافظه از سرور کلدفيوژن براي آن عنصر تخصيص مي دهيد. اگر مقدار حافظه ي کافي در محل جاري آرايه موجود نباشد، کلدفيوژن مجبور است که تمام آرايه را يک جا به محل حافظه ي ديگري انتقال دهد. اگر تعداد زيادي عنصر در آرايه موجود باشد، اين عمليات از CPU و حافظه بيهوده استفاده مي کند.

به خاطر بهنيه سازي، اگر تعداد عناصر يک آرايه را از اول مي دانيد، مي توانيد قبل از شروع به افزودن عناصر به آرايه بوسيله ي تابع ArrayResize حافظه مورد نياز را از قبل اختصاص دهيد. مانند مثال زير :

<cfset ArrayResize(myArray, 500)>

براي بدست آوردن حداکثر بهينه سازي، از تابع ArrayResize بلافاصله بعد از استفاده از ArrayNew استفاده کنيد.

تبديل بين آرايه ها و ليست ها

براي تبديل يک آرايه ي موجود به يک ليست جديد، از تابع ArrayToList به صورت زير استفاده مي کنيم :

<cfset NewList = ArrayToList(myArray)>

براي تبديل يک ليست موجود به يک آرايه ي جديد، از تابع ListToArray به صورت زير استفاده مي کنيم :

<cfset NewArray = ListToArray(myList)>
لينک مقاله
http://www.macromediax.com :منبع

مقالات مرتبط با اين موضوع
مقایسه Coldfusion و ASP | coldfusion
دفاع از کلدفیوژن در برابر پدرخوانده اش | coldfusion
آموزش کلد فیوژن : متغیر های Client و Session | coldfusion
آموزش ColdFusion ، ساختار Switch/Case | coldfusion
دستورهای شرطی در ColdFusion | coldfusion
درك و رفع نقص پيام هاي error در كلد فيوژن | coldfusion
آموزش ColdFusion ،انواع داده ي پيچيده : آرايه ها | coldfusion
آموزش کلد فیوژن: انواع داده پيچيده : ليست ها | coldfusion
کار با پایگاه داده ها در کلدفیوژن | coldfusion
ColdFusion مقدماتی، قسمت اول | coldfusion

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


درك و رفع نقص پيام هاي error در كلد فيوژن

پيام خطاي : ColdFusion—Access Denied

اين پيام خطا هنگام كار با يكي از پايگاه هاي داده فايلي مايكروسافت (مانند Access و يا FoxPro) رخ ميدهد .هنگامي كه كلدفيوژن در حال دسترسي به پايگاه داده ها از طريق Data Source باشد . اين ايراد معمولا زماني رخ ميدهد كه شما مشغول رونويسي بانك داده ها از طريق FTP و يا كپي روي آن هستيد .

بهترين راه حل اين مشكل كنار گذاشتن coldfusion services و يا غير فعال كردن Maintain Database Connection از بخش data source در ColdFusion Administrator است .

پيام خطاي : ColdFusion—Operation must use an updateable query error

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

براي حل اين مسئله در ويندوز NT به آدرس زير برويد :

Start > Settings > Control Panel > Services و روي ColdFusion Application Server service كليك كنيد و start-up account را بخاطر بسپاريد . در حالت پيش فرض بايد System Account باشد .بعد به پوشه اي برويد كه فايل بانك اطلاعاتي در آن است و به آن account اجازه دسترسي به پوشه مورد نظر را بدهيد. حتي اگر كنترل پوشه ميگويد همه (everyone) حق دسترسي دارند باز هم بايد اكانت ColdFusion startup را اضافه كنيد
لينک مقاله
http://www.macromediax.com :منبع

مقالات مرتبط با اين موضوع
مقایسه Coldfusion و ASP | coldfusion
دفاع از کلدفیوژن در برابر پدرخوانده اش | coldfusion
آموزش کلد فیوژن : متغیر های Client و Session | coldfusion
آموزش ColdFusion ، ساختار Switch/Case | coldfusion
دستورهای شرطی در ColdFusion | coldfusion
درك و رفع نقص پيام هاي error در كلد فيوژن | coldfusion
آموزش ColdFusion ،انواع داده ي پيچيده : آرايه ها | coldfusion
آموزش کلد فیوژن: انواع داده پيچيده : ليست ها | coldfusion
کار با پایگاه داده ها در کلدفیوژن | coldfusion
ColdFusion مقدماتی، قسمت اول | coldfusion

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


دستورهای شرطی در ColdFusion

برای تصميم گيری بر اساس شرايط مختلف می توان از ساخت if/else/elseif استفاده کرد :

<cfif condition>

<!--- Some code to go if condition is TRUE --->

</cfif>

ColdFusion چک می کند که آيا شرط condition دارای مقدار True می باشد يا False . اگر اين مقدار True باشد کد بين جفت تق را اجرا می کند. مانند مثال زير :

<CFIF myVar EQ MyOtherVar>

Two Variables are equal to eachother .

</CFIF>

اگر بخواهيد coldfusion يک کد خاص برای مواقعی که شرط False می باشد را اجرا کند از ساختار زير استفاده می کنيم :

<CFIF myVar EQ MyOtherVar>

Two variables are equal to eachother.

<CFELSE>

<!--- This part will be executed if the condition is FALSE --->

Two variables are not equal.

</CFIF>

شما می توانيد اين ساخت شرطی را با افزودن cfelseif گسترش دهيد :

<CFIF myVar Greater Than MyOtherVar>

<cfoutput>#myvar# > #myotherVar# </cfoutput>

<CFELSEIF myVar EQ MyOtherVar>

<cfoutput> #myVar# = #MyOtherVar# </cfoutput>

<CFELSE>

<cfoutput> #myVar# < #myOtherVar# </cfoutput>

</CFIF>

اگر شرط موجود در cfif صحيح نباشد شرط مجود در cfelseif های موجود به ترتيب چک می شود. اگر هيچ کدام درست نباشند ٬ کد موجود پس از cfelse اجرا می شود .
لينک مقاله
http://www.macromediax.com :منبع

مقالات مرتبط با اين موضوع
مقایسه Coldfusion و ASP | coldfusion
دفاع از کلدفیوژن در برابر پدرخوانده اش | coldfusion
آموزش کلد فیوژن : متغیر های Client و Session | coldfusion
آموزش ColdFusion ، ساختار Switch/Case | coldfusion
دستورهای شرطی در ColdFusion | coldfusion
درك و رفع نقص پيام هاي error در كلد فيوژن | coldfusion
آموزش ColdFusion ،انواع داده ي پيچيده : آرايه ها | coldfusion
آموزش کلد فیوژن: انواع داده پيچيده : ليست ها | coldfusion
کار با پایگاه داده ها در کلدفیوژن | coldfusion
ColdFusion مقدماتی، قسمت اول | coldfusion

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آموزش ColdFusion ، ساختار Switch/Case

ساختار Switch/Case يک عبارت را در برابر چندين شرط، ارزيابي مي کند و سپس کد مربوطه را اجرا مي کند.

مثلا، تکه کد زير را در نظر بگيريد :

<cfif myVar EQ 1>

One

<cfelseif myVar EQ 2>

Two

<cfelseif myVar EQ 3>

Three

</cfif>

تکه کد بالا مقدار myVar را سه بار ارزيابي مي کند و هر بار تست مي کند که آيا مقدار آن برابر مقدار خاصي هست يا نه. کد بالا را مي توان به صورت بهتر مي توان نوشت :

<cfswitch expression=”#myVar#”>

<cfcase value=1>

One

</cfcase>

<cfcase value=2>

Two

</cfcase>

<cfcase value=3>

Three

</cfcase>

</cfswitch>

هر دو کد يک کار واحد انجام مي دهند اما ساختار cfswitch بهينه تر مي باشد، زيرا مقدار متغير myVar به جاي سه بار، يک بار ارزيابي مي کند. کلدفيوژن عبارات cfswitch را بسيار بهينه تر از عبارات cfif اجرا مي کند ، زيرا براي اجراي cfif، هر دفعه هر مقدار هر عبارت شرطي را ارزيابي مي کند (true يا false) تا آنجا مقدار يک عبارت true شود، ولي cfswitch ابتدا مقدار عبارت را ارزيابي مي کند (يک بار) و سپس قسمت مطابق با آن را اجرا مي کند.

مقادير ذکر شده در cfcase بايد از نوع ثابت باشند و نمي توانند متغير و يا عبارت باشند. به عنوان مثال، تکه کد زير مجاز نيست :

<cfswitch expression=”#MyVar#”>

…

<cfcase value=”#1+1#”>

Two

</cfcase>

…

</cfswitch>

در کد زير cfdefaultcase برابر cfelse در ساختار cfif مي باشد.

<cfswitch expression=”#myVar#”>

<cfcase value=1>

One

</cfcase>

<cfcase value=2>

Two

</cfcase>

<cfcase value=3>

Three

</cfcase>

<cfdefaultcase>

Some Other Number

</cfdefaultcase>

</cfswitch>

کد بالا به اين معناست که اگر هيچ يک از مقادير cfcase برابر مقدار عبارت نبودند، بلوک کد مربوط به cfdefaultcase را اجرا کند.

اگر چه ساختار هاي cfswitch مزاياي زيادي دارند، اما در اغلي اوقات نمي توان از آن به جاي cfif استفاده کرد. مثلا به کد زير توجه کنيد :

<cfif MyVar GREATER THAN myOtherVar>

<cfoutput>#MyVar#</cfoutput>

<cfesleif myVar EQUAL myOtherVar>

<cfoutput>#MyVar+MyOtherVar#</cfoutput>

<cfelse>

<cfoutput>#MyOtherVar#</cfoutput>

</cfif>

اين کد را نمي توان به وسيله ساختار cfswitch نوشت. زيرا عبارات شرطي کد بالا چيزي بيشتر از يک مقايسه ي برابري ساده مي باشند.
لينک مقاله
http://www.macromediax.com :منبع

مقالات مرتبط با اين موضوع
مقایسه Coldfusion و ASP | coldfusion
دفاع از کلدفیوژن در برابر پدرخوانده اش | coldfusion
آموزش کلد فیوژن : متغیر های Client و Session | coldfusion
آموزش ColdFusion ، ساختار Switch/Case | coldfusion
دستورهای شرطی در ColdFusion | coldfusion
درك و رفع نقص پيام هاي error در كلد فيوژن | coldfusion
آموزش ColdFusion ،انواع داده ي پيچيده : آرايه ها | coldfusion
آموزش کلد فیوژن: انواع داده پيچيده : ليست ها | coldfusion
کار با پایگاه داده ها در کلدفیوژن | coldfusion
ColdFusion مقدماتی، قسمت اول | coldfusion

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آموزش کلد فیوژن : متغیر های Client و Session

از من درخواست شده بود که در باره ی متغیرهای Session بنویسم. از آن جایی که بین متغیر های Session و Client و تشابه هایی وجود دارد، آن ها را در یک مقاله توضیح می دهم.

1- متغیرهای Client

متغیرهای Client به جای اینکه در سیستم کاربر ذخیره گردد، در سرور Coldfusion ذخیره می گردند. متغیرهای Client با مرورگر کاربر یک جفت تشکیل می دهند و برای هر مرورگر یک Client.MyVar وجود دارد. برای این که سرور کلدفیوژن بتواند تشخیص بدهد که کدام متغیر Client مربوط به کدام مرورگر می باشد، از یک جفت متغیر CFID و CFTOKEN استفاده می کند. بعدا در باره ی این دو متغیر بحث خواهیم کرد.

برای تنظیم حداکثر مدت زمان باقی ماندن متغیرهای Client، از Administrator کلدفیوژن استفاده می شود. مقدار پیش فرض 90 روز می باشد. شما می توانید این مقدار تا یک روز پایین بیاورید. اگر از متغیرهای مربوط به CFID و CFTOKEN خاصی ، در این مدت زمان استفاده نگردد، متغیرهای مربوط به آن از روی سرور پاک می گردد.

برای استفاده از متغیرهای Client، ابتدا باید با استفاده از cfapplication، مقدار clientManagement را true کنید. به این صورت :

<cfapplication clientManagement=”true” … >

سپس، برای ایجاد متغیرهای Client از CFSet و یا CFParam به صورت زیر استفاده کنید :

<CFSet Client.MyVar=1>

<CFParam name=”Client.MyVar” default=”1”>

یکی از کاربردهای جالب متغیرهای Client، متغیر Client.LastVisit می باشد که خود به خود ایجاد می گردد و مقدار آن خود به خود به روز می گردد و دارای مقدار تاریخ آخرین روزی است که وب سایت جاری توسط یک مرورگر در خواست شده است. برای استفاده از این متغیر، به مثال زیر توجه کنید :

<CFOUTPUT>

Welcome back to the Web

SuperShop, your last visit

was on #DateFormat(Client.LastVisit)#.

</CFOUTPUT>

برای حذف کردن یک متغیر Client، از تابع DeleteClientVariable() به صورت زیر استفاده کنید :

<cfset result=DeleteClientVariable(“MyVar”)>

2- متغیر های Session

متغیرهای Session در RAM سیستمی که سرور کلدفیوژن در آن اجرا می شود ذخیره می گردند و مانند متغیرهای Client برای هر مرورگر مجزایی متغیرهای Session مجزا ایجاد می شوند و این متغیرها نیز، توسط متغیرهای CFToken و CFID از هم باز شناخته می شوند.

تفاوت های بین متغیرهای Client و متغیرهای Session عبارت است از :

· متغیرهای session قادر به ذخیره سازی انواع داده ی پیچیده مانند Structure ها و آرایه ها می باشند، ولی متغیر های Client تنها قادر به ذخیره سازی داده های ساده مانند رشته های متنی و اعداد می باشند.

· متغیرهای session نیاز به استفاده از CFLock می باشند ولی متغیر های Client نیازی به استفاده از CFLock ندارند. (بعدا در این مقاله استفاده از CFLock را شرح خواهم داد.)

· مدت عمر متغیرهای کمتر از مدت عمر متغیرهای Client می باشد.

· اگر سرور Coldfusion را از نو راه اندازی کنیم، متغیرهای Session از بین خواهند رفت ولی متغیر های Client هم چنان باقی خواهند ماند.

· متغیرهای Session از لحاظ فضای اشغالی هیچ محدودیتی ندارند در حالی که متغیرهای Client به 32 کیلوبایت محدود هستند.

برای استفاده از متغیرهای Session، ابتدا باید SessionManagement را به صورت زیر “true” کنیم :

<cfapplication sessionManagement=”true” … >

اگر می خواهید مقدار پیش فرض مدت عمر متغیرهای Session را تغیر دهید، مقدار SessionTimeout را به روش زیر تغییر دهید :

<cfapplication sessionmanagement=”true” sessiontimeout=”#CreateTimeSpan(0,0,20,0)#” …>

مثلا مثال بالا حداکثر مدت طول عمر متغیر های از نوع Session را برابر 20 دقیقه قرار می دهد. ( در تابع CreateTimeSpan، پارامتر اول تعداد روزها، پارامتر دوم، ساعات، پارامتر سوم، دقیقه ها و پارامتر آخر ثانیه ها می باشند.)

برای حذف یک متغیر Session از تابع StructDelete به روش زیر استفاده کنید :

<cfset Result=StructDelete(Session,”MyVar”)>

برای حذف تمام متغیرهای Session، از cfapplication به روش زیر استفاده کنید :

<cfapplication sessiontimeout=”#CreateTimeSpan(0,0,0,0)#” …>

متغیرهای Session در حافظه ی سرور کلدفیوژن ذخیره می گردند و کاربرهای مختلف ممکن است خواهان دسترسی به آن ها در یک زمان خاصی باشند. برای اینکه در مدیریت حافظه اختلال به وجود نیاید، باید هنگام خواندن مقدار و یا مقدار دهی این متغیرها استفاده از حافظه را به یک کاربر خاص محدود کرد و پس از آن که این کاربر خاص کار بر روی مقادیر متغیرها را تمام کرد، نوبت به کاربر دیگر می رسد.

برای این کار، از cflock استفاده می کنیم. برای مقدار دهی به متغیرهای session، از cflock به صورت زیر استفاده می کنیم :

<CFLock name=”Session_MyVar”

type=”Exclusive”

timeout=”10”

throwOnTimeOut=”Yes”>

<CFSet Session.MyVar=”1”>

</CFLock>

برای خواندن مقدار یک متغیر session از cflock به صورت زیر استفاده می کنیم :

<CFLock name=”Session_MyVar”

type=”READONLY”

timeout=”10”

throwOnTimeOut=”Yes”>

<CFSet Variables.MyVar=Session.MyVar>

</CFLock>

امیدوارم این مقاله توانسته باشد به اکثر سوال هایتان جواب لازم را داده باشد. هرگونه پیشنهاد، سوال و یا اشکال در این مقاله را به irancoldfusion@yahoo.com ایمیل بزنید.

لينک مقاله
http://www.macromediax.com :منبع

مقالات مرتبط با اين موضوع
مقایسه Coldfusion و ASP | coldfusion
دفاع از کلدفیوژن در برابر پدرخوانده اش | coldfusion
آموزش کلد فیوژن : متغیر های Client و Session | coldfusion
آموزش ColdFusion ، ساختار Switch/Case | coldfusion
دستورهای شرطی در ColdFusion | coldfusion
درك و رفع نقص پيام هاي error در كلد فيوژن | coldfusion
آموزش ColdFusion ،انواع داده ي پيچيده : آرايه ها | coldfusion
آموزش کلد فیوژن: انواع داده پيچيده : ليست ها | coldfusion
کار با پایگاه داده ها در کلدفیوژن | coldfusion
ColdFusion مقدماتی، قسمت اول | coldfusion

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


دفاع از کلدفیوژن در برابر پدرخوانده اش

در این روزها خیلی می بینیم که بعضی ها میگن از کلدفیوژن به جاوا اسباب کشی کنید . چرا ؟ یکی از دلایل کمبود شناخت درباره کلدفیوژن و طرز کارشه . بیاید با یک رابطه بین این دو برنامه شروع کنیم :

برنامه های نوشته شده در CF اصالتا جاوا هستند یا مقدار خیلی کمی فرق دارند .CF روی یک سرورJ2EE اجرا میشود که یک برنامه تایید شده توسط شرکت سان میباشد که کدبایت جاوا را اجرا میکند . این کدبایت جاوا از کامپایل کد های CFML نوشته شده توسط شما برجود میاید. به زبان ساده تر میشه گفت که CFML یک ساختار زبان برای برنامه نویس است، نه برای سرور . در هنگام اجرا کلدفیوژن برنامه را به جاوا کامپایل کرده و بنام CF اجرا میکند . در این لحظه هیچ CFML ای وجود ندارد و کدی که اجرا میشود تماما جاوا است . نه بیشتر و نه کمتر ! بهمین سادگی .

برنامه کلدفیوژن شما یک برنامه جاوا است که با کد های ساده تر کلدفیوژن آنرا نوشته اید . در اصل کلدفیوژن یکی از ابزارهای کمکی جاوا بحساب میاید .مثلا در جاوا برای وصل شده به پایگاه داده باید 10 خط کد بنویسید ، در حالیکه این کار با یک تگ کلدفیوژن قابل انجام است . یا در جاوا برای فرستادن ایمیل SMTP با استفاده از JAVAMail API باید کلی خودتونو برای نوشتن کد خسته کنید ، در حالیکه اینکار با یک تگ تنها در کلدفیوژن انجام میشود . خوب دوباره نویسی را پس کنار بگذارید .

پس cf برنامه نویسی جاوا راگسترش داده و ساده تر میکند . وبرنامه های CF نوعی جاوا هستند و با برنامه هایی که در زبان سطح پایین تر جاوا نوشته شده اند فرقی ندارند .کلدفیوژن همچنین میتواند از API های جاوا ، class های جاوا ، تگ های JSP و JavaBeans نیز استفاده کند .چون خودش فرزند جاواست.
لينک مقاله
http://www.macromediax.com :منبع

مقالات مرتبط با اين موضوع
مقایسه Coldfusion و ASP | coldfusion
دفاع از کلدفیوژن در برابر پدرخوانده اش | coldfusion
آموزش کلد فیوژن : متغیر های Client و Session | coldfusion
آموزش ColdFusion ، ساختار Switch/Case | coldfusion
دستورهای شرطی در ColdFusion | coldfusion
درك و رفع نقص پيام هاي error در كلد فيوژن | coldfusion
آموزش ColdFusion ،انواع داده ي پيچيده : آرايه ها | coldfusion
آموزش کلد فیوژن: انواع داده پيچيده : ليست ها | coldfusion
کار با پایگاه داده ها در کلدفیوژن | coldfusion
ColdFusion مقدماتی، قسمت اول | coldfusion

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


مقایسه Coldfusion و ASP
  • ASP بر مبنای ISAPI بنا شده است . ASP یک DLL است بنام ASP.DLL که معمولا در دایرکتوری های سیستمی ویندوز یافت میشود . IIS فایل های ASP را به ASP.DLL راهنمایی میکند ، در اینجا موتور ASP فایل ها را پردازش میکند و سپس نتایج را برای کلاینت میفرستد. کلدفیوژن از پسوند CFM استفاده میکند . iis ازین پسوند برای تعیین مسیر درخواست هاو راهنمایی آنها به کلدفیوژن توسط ارتباط دهنده ISAPI استفاده میکند.
  • ASP از کد های اسکریپتی سرور ساید مانند VBSCRIPT استفاده میکند و همچنین کد های کلاینت ساید جاوا اسکریپت .کلدفیوژن هم از فایل هی CFML برای عملیات سرور ساید و از جاوا اسکریپت جهت اعمال کلاینت ساید استفاده میکند . اما کلدفیوژن با asp فرق دارد . چون کلدفیوژن فقط یک DLL نیست که توسط IIS لود شود بلکه کلدفیوژن یک سرویس است که روی ویندوز اجرا میشود وشما میتوانید آن را مانند هر سرویس دیگر (مثلا SQL ) بحالت START و STOP در آورید .
  • پس نحوه کار ASP و Coldfusion با IIS یکسان است . نحوه برنامه نویسی در هر دو یکسان است ( استفاده همزمان سرور ساید و کلاینت ساید) و تفاوت آنها در پسوند فایل ها و زبان استفاده شده در اسکریپت نویسی آنهاست.

دات نت قدم بعدی ASP :

  • ASP.NET برای کار با دات نت فریم ورک مایکروسافت طراحی شده . برخلاف ASP که یک زبان اینترپرتری (مفسری) است ،ASP.NET قبل از اجرا در همان لحظه درخواست به زبان MSIL (Microsoft Intermediate Language ) ترجمه میشود . کدهای ترجمه شده ASP.NET که معمولا کدVB.NET یا C# هستند در محیط CLR ترجمه میشود . کلدفیوژن زبان کامپایلری است که در لحظه اجرا کد هایش به بایت کد جاوا تبدیل میشوندو کد تبدیل شده در محیطی بنام Java Virtual Machine اجرا میشود.
  • ASP.NET از منابع و آبجکت ها و API های دات نت استفاده میکند که در CLR هستند . مدیریت حافظه و اجرا و همه چیز بعهده CLR میباشد . ASP.net بجای پردازش در یک فایل dll تنها، از CLR استفاده میکند -- اما کلدفیوژن بجای اینکه فقط در محیط دات نت مایکروسافت اجرا شود روی تمام محیط های J2EE اجرا میشود و از ابجکت ها و منابع و API های جاوا و J2EE که داخل java VM است استفاده میکند. و مدیریت حافظه و اجرا و بقیه بعهده VM است .
لينک مقاله
http://www.macromediax.com :منبع

مقالات مرتبط با اين موضوع
مقایسه Coldfusion و ASP | coldfusion
دفاع از کلدفیوژن در برابر پدرخوانده اش | coldfusion
آموزش کلد فیوژن : متغیر های Client و Session | coldfusion
آموزش ColdFusion ، ساختار Switch/Case | coldfusion
دستورهای شرطی در ColdFusion | coldfusion
درك و رفع نقص پيام هاي error در كلد فيوژن | coldfusion
آموزش ColdFusion ،انواع داده ي پيچيده : آرايه ها | coldfusion
آموزش کلد فیوژن: انواع داده پيچيده : ليست ها | coldfusion
کار با پایگاه داده ها در کلدفیوژن | coldfusion
ColdFusion مقدماتی، قسمت اول | coldfusion

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آشنائی با فرم‌های وب در ASP.NET

به عنوان یک برنامه نویس ویژوال بیسیک شما می توانید برنامه های تحت اینترنت نیز بنویسید. به طور معمول برنامه نویسان ویژوال بیسیک به سمت ASP که یک تکنولوژی از مایکروسافت است متمایل هستند. دلیل این امر هم شباهت میان VB و VBScript می باشد. بزرگترین ایرادی که ASP کلاسیک دارد نداشتن یک محیط ویژوال مانند فرم‌های معمولی بیسیک است. مایکروسافت با Visual InterDev سعی کرد این کمبود را جبران کند اما چندان موفق نبود. بالاخره در ویژوال بیسیک دات نت ترکیبی از InterDev و ویژوال بیسیک وجود دارد و امکانات فرم‌های ویژوال بیسیک را برای اینترنت نیز فراهم می کند.

Web Form ها یکی از اجزای تکنولوژی ASP.NET است که به برنامه نویس های اکثر زبان ها این امکان را می دهد که یک قالب ویژوال با HTML و یک محیط برنامه‌نویسی تحت سرور با کدهای پیشرفته داشته باشند.

Web From ها در عمل
بهترین راه برای فراگیری این تکنولوژی یک مثال عملی از آن است. پس از مثال معروف Hello World برای شروع استفاده می کنیم.

آماده سازی محیط
قبل از شروع ابتدا باید نرم‌افزارهای مورد نیاز را از روی لیست زیر نصب کنید. اگر ویژوال استودیو دات نت را به شکل کامل و بر روی ویندوز 2000 یا اکس پی نصب کردید احتیاج به مراحل زیر ندارید.

  • سیستم عامل شما باید حتما ً از نوع ان تی باشد، ویندوز 2000 (سرور یا Professional)، ویندوز اکس پی Professional و یا ان تی سرور 4.
  • باید NET Framework. بر روی سروری که می خواهید با آن کار انجام دهید یا برنامه شما بر روی آن اجرا خواهد شد نصب شده باشد. اگر ویژوال استودیو دات نت را نصب کرده اید مشکلی در این مرحله ندارید.
  • مایکروسافت توصیه کرده که سیستم فایل هارد دیسک سرور شما بهتر است NTFS باشد، هم به دلیل مسائل امنیتی و هم سرعت بیشتر.

Hello World
در فرم مخصوص ایجاد یک پروژه جدید ASP.NET Web Application را انتخاب کنید و نام آن را HelloWorld قرار دهید. دقت کنید که مکان ذخیره پروژه http://localhost باشد.

سپس بر روی کلید OK کلیک کنید تا یک Solution جدید ایجاد گردد. به طور قراردادی ویژوال استودیو یک Web Form با نام WebForm1.aspx ایجاد می کند. دقت کنید که پسوند فایل چه تغییری کرده است.

وقتی بر روی کلید OK کلیک می کنید چند عمل در پشت صحنه انجام می شود. به غیر از ایجاد کردن یک شاخه در دایرکتوری Visual Studio Projects، ویژوال استودیو یک Web Application نیز در سروری که انتخاب کرده اید ایجاد می کند. بر روی سرور، ویژوال استودیو دات نت:

  • یک دایرکتوری با نام پروژه در شاخه inetpub/wwwroot ایجاد می کند.
  • این دایرکتوری را به عنوان یک IIS Application معرفی کرده و اجازه اجرای Script را بر روی آن می دهد.
  • اگر FrontPage Server Extensions را نصب کرده باشید یک FrontPage Web ایجاد می کند تا با FrontPage هم بتوانید به آن دسترسی داشته باشید.

می توانید همانگونه که با فرم های معمولی ویژوال بیسیک کار می کردید از Web Formی که جلوی شما است استفاده کنید، یعنی به شما امکان استفاده از Toolbox و استفاده از کامپوننت های درون آن بر روی Web Form داده شده است. یک Label را از Toolbox برداشته و بر روی قسمت بالای فرم قرار دهید و خاصیت Text آن را به Hello World تغییر دهید.

برای این مثال تمام کاری که لازم بود انجام شود را انجام دادیم. حالا می توانیم برنامه را اجرا کنیم. قبل از اینکار از Toolbar و در قسمت Solution Configuration به جای Debug ،Release را انتخاب کنید. حالا بوسیله کلید F5 برنامه را اجرا کنید. اگر هیچ مشکلی در سیستم نباشد باید صفحه مرورگر باز شود و فایل WebForm1.aspx نمایش داده وبر روی آن Hello World نوشته شود.

بر روی صفحه مرورگر کلید سمت راست موس را بزنید و View Source را انتخاب کنید تا ببینید چه مطالبی در سورس این صفحه آمده است. همانطور که می بینید کدهایی به HTML است که بوسیله فایل aspx در زمان اجرا ایجاد شده است.

همانطور که می بینید یک HTML Form در این متن دیده می شود در حالی که ما چنین چیزی را اضافه نکرده بودیم، درباره این مساله در ادامه توضیح خواهم داد. Labelی که اضافه کرده بودیم در تگ Span قرار دارد. تگ Span مانند یک Container برای Label ما است و اطلاعات آن را در خود نگهداری می کند. به ویژوال استودیو دات نت باز می گردیم.

همانطور که دیدید Web Form ها خیلی شبیه فرم های معمولی ویندوز هستند. در Web From جدیدی که می سازیم این خاصیت را بیشتر امتحان می کنیم. در برنامه Hello World که ایجاد کردیم تنها یک Web Form داشتیم: WebForm1.aspx. یک Web Form دیگر می سازیم تا کارهای بیشتری با آن انجام دهیم.

منوی Project | Add Web Form را انتخاب کنید. در فرمی که باز می شود Web Form را انتخاب کنید و مطمئن شوید که نام آن WebForm2.aspx است. (قبل از این کار ویژوال استودیو را از حالت اجرای برنامه خارج کنید)

بر روی Open کلیک کنید تا WebForm2.aspx در Solution ایجاد شود. بر روی WebForm2.aspx در Solution Explorer دو بار کلیک کنید تا مطمئن باشید که فرمی که تازه ایجاد کرده اید فعال است. مانند مثال قبلی یک Label بر روی فرم قرار دهید، سپس یک Button در زیر آن قرار دهید و اندازه هر دو را یکسان کنید. بر روی Label کلیک کنید و از پنجره Properties خاصیت ID را انتخاب کنید و آن را به lblText تغییر دهید. سپس بر روی کلید کلیک کنید و ID آن را به btnSubmit تغییر دهید. بر روی کلید یک بار کلیک کنید، سپس کلید Enter را بزنید تا به قسمت نوشتن کد برای این کلید وارد شوید.

در ASP.NET هر کدام از کنترل ها، کدی در پشت صحنه برای خود دارند. همانطور که مشاهده می کنید یک روال با نام btnSubmit_Click وجود دارد که هنگامی که بر روی کلید کلیک می شود اجرا می شود. کدی که در این روال نوشته شده باشد در سرور اجرا می شود و نه در مرورگر کامپیوتر کاربر. کد زیر را در روال مورد بحث بنویسید:

lblText.Text = "Hello World"

همانطور که مشاهده کردید IntelliSense وارد عمل شده و وقتی بعد از lblText، نقطه را تایپ کردید لیستی از خواص و متد های مربوط به Label را به شما نمایش داد. این خاصیت در InterDev هم وجود دارد ولی در ویژوال استودیو دات نت از امکانات بیشتر و لیست پرمحتواتری برخوردار است.

پنجره کد را ببندید و به قسمت طراحی Web Form بروید، خاصیت Text کلید را به Submit تغییر دهید. حالا برنامه را امتحان می کنیم. اگر سعی کنید تا برنامه را بوسیله کلید F5 اجرا کنید دوباره WebForm1.aspx نمایش داده خواهد شد، زیرا که این فرم، فرم ابتدایی در پروژه ما است. برای اینکه WebForm2.aspx به فرم ابتدایی تبدیل شود در پنجره Solution Explorer بر روی WebForm2.aspx کلید سمت راست موس را بزنید و سپس Set As Start Page را انتخاب کنید. حالا می توانید برنامه اجرا کنید.

Web Form جدید، WebForm2.aspx در مرورگر اینترنت نمایش داده می شود در حالی که بر روی آن یک Label و یک کلید وجود دارد. بر روی کلید کلیک کنید تا متنی که تایپ کرده بودید در Label نمایش داده شود. همانطور که می بینید برنامه مانند فرم های معمولی ویندوز اجرا می شود.

لينک مقاله
http://www.idevcenter.com :منبع

مقالات مرتبط با اين موضوع
upload کردن فايل به سرور در ASP.NET | aspdotnet
Namespace چيست؟ | aspdotnet
Smart Navigation چيست؟ | aspdotnet
چرا به دات نت احتياج داريم؟ | aspdotnet
نشان دادن قابليتهای مرورگر در ASP.NET | aspdotnet
آشنائی با ASP.NET | aspdotnet
نحوه پردازش صفحات ASP.NET بر روي سرويس دهنده وب | aspdotnet
ارسال ایمیل در ASP.NET با استفاده از HTML Template | aspdotnet
اضافه کردن تصویر به پایگاه داده | aspdotnet
برسی کوکی‌ها (Cookies) و جلسات (Sessions) در ASP.NET | aspdotnet
باز کردن پنجره Popup در ASP.NET با استفاده از Code Behind | aspdotnet
آشنائی با فرم‌های وب در ASP.NET | aspdotnet

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


باز کردن پنجره Popup در ASP.NET با استفاده از Code Behind

قطعا در بسیاری از Applicationهای شما مواردی پیش آمده است که شما نیاز داشتید صفحه‌ای خاص را در یک پنجره Popup باز کنید. این کار به سادگی با استفاده از یک خط کدنویسی ساده جاوا اسکریپت امکان پذیر است. حتی در صورتی که فایلی که کد جاوا اسکریپت شما در آن قرار می گیرد یک فایل Server Side باشد نیز به علت اینکه در تمامی زبانهای Server Side پیش از ASP.NET کلیه کدها به صورت Block Script و لابلای کدهای HTML قرار می گرفت منعی در استفاده از بلاکهای جاوا اسکریپت نیز وجود نداشت. با ظهور ASP.NET و قابلیت قدرتمند آن یعنی Code Behind برنامه نویسان از کلنجار رفتن با کدهای تو در توی طولانی رها شده و کلیه کدهای Server Side خود را در Code Behind می نویسند و حاصل کار آنها یک فایل aspx. است که در آن اثری از کدنویسی غیر از تگهای HTML (و تگهای توسعه یافته ASP.NET) دیده نمی‌شود. حال اگر شما بخواهید یک Popup باز کنید چه می‌کنید؟ آیا تابع جاوا اسکریپت بازکننده Popup را لابلای کدهای HTML صفحه خود می‌نویسید؟ این روش به نظر صحیح نمی آید. چرا که ما خود را از قابلیت خوانانویسی کدهای HTML محروم کرده و باز قسمتی از برنامه نویسی خود را به درون فایل اصلی خود انتقال داده‌ایم. چه می توان کرد؟ آیا راهی برای اینکه ما با استفاده از کدنویسی در Code Behind یک Popup باز کنیم هست؟ پاسخ مثبت است. در ادامه مقاله به این موضوع می پردازیم: در این روش در واقع ما کدهای جاوا اسکریپت خود را به صورت یک attribute به کنترل مورد نظر خود Add می کنیم. اما برای اینکه برای هر کنترل کدنویسی را تکرار نکنیم این قسمت را درون یک ساب روتین قرار می دهیم:

using System.Web.UI.WebControls;

public void OpenPopUp(WebControl opener, string PagePath) {

   string clientScript;
   clientScript = "window.open('" + PagePath + "')";
   opener.Attributes.Add("OnClick", clientScript);
}

طرز کار بسیار ساده است! مقادیر ورودی یک کنترل و صفحه‌ای است که باید باز شود. کد جاوا اسکریپت در یک متغیر رشته‌ای به نام clinetString قرار داده می‌شود و با استفاده از متد Add به کنترل اضافه می‌شود. متد Add دو مقدار دریافت می‌کند: ابتدا نام property و یا event و سپس مقدار آن که پس از Generate شدن صفحه به تگ HTML تولید شده اضافه می‌شود.

حال شما می‌توانید به راحتی به صورت زیر از این روتین استفاده کنید:

OpenPopup(Button1, "http://www.google.com");

که در آن Butoon1 یک کنترل از نوع asp:button است. طرز کار بدین صورت است که پنجره بلافاصله پس از فراخوانی روتین باز نمی‌شود بلکه کنترل شما را برای رویداد مورد نظر تنظیم می‌کند و در هنگام وقوع رویداد (مثلا کلیک کردن روی دکمه) روتین اجرا می‌شود.

با کمی کدنویسی اضافه می‌توان ظاهر پنجره باز شده را نیز کنترل کرد. برای مثال شما می توانید طول و عرض پنجره، عنوان آن، اسکرول بار و... را تنظیم کنید:

public shared void OpenPopUp(WebControl opener, string PagePath,
string windowName, int width, int height) {

   string windowAttribs;
   string clientScript ;

   windowAttribs = "width=" + width + "px," + "height=" + height + "px,"
      "left='+((screen.width -" & width & ") / 2)+'," +
      "top='+ (screen.height - " & height & ") / 2+'";

   clientScript = "window.open('" + PagePath + "','" + windowName + "','" +
      windowAttribs + "'); return false;";

   opener.Attributes.Add("OnClick", clientScript);
}

مزیت استفاده از این روش این است که به علت اینکه شما این تابع را یک بار و آن هم در کلاس و یا Code Behind قرار می‌دهید می‌توانید به راحتی خطاهای برنامه نویسی خود را قبل از اینکه اجرای کد خود را آغاز نمایید، پیدا کنید.

لينک مقاله
http://www.idevcenter.com :منبع

مقالات مرتبط با اين موضوع
upload کردن فايل به سرور در ASP.NET | aspdotnet
Namespace چيست؟ | aspdotnet
Smart Navigation چيست؟ | aspdotnet
چرا به دات نت احتياج داريم؟ | aspdotnet
نشان دادن قابليتهای مرورگر در ASP.NET | aspdotnet
آشنائی با ASP.NET | aspdotnet
نحوه پردازش صفحات ASP.NET بر روي سرويس دهنده وب | aspdotnet
ارسال ایمیل در ASP.NET با استفاده از HTML Template | aspdotnet
اضافه کردن تصویر به پایگاه داده | aspdotnet
برسی کوکی‌ها (Cookies) و جلسات (Sessions) در ASP.NET | aspdotnet
باز کردن پنجره Popup در ASP.NET با استفاده از Code Behind | aspdotnet
آشنائی با فرم‌های وب در ASP.NET | aspdotnet

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


برسی کوکی‌ها (Cookies) و جلسات (Sessions) در ASP.NET

در این مقاله ابتدا به بررسی کوکی‌ها (Cookies) پرداخته و سپس جلسات (Sessions) را بررسی خواهیم کرد. به دلیل نزدیکی بسیار زیاد این دو مفهوم تصمیم گرفتم همه آنها را در یک مقاله جمع‌آوری کنم. اگر مفاهیم فوق را به درستی درک کنید و طرز استفاده از آنها را یاد بگیرید، می توانید به قدرت برنامه‌های کاربردی وب خود بیفزایید. اما استفاده نابجا از این مفاهیم در وب سایتهای مختلف می تواند به شدت روی عملکرد سایت تاثیر گذاشته و از مخاطبان و کارایی آن بکاهد. در نتیجه با مطالعه این مقاله در مورد این دو مفهوم، باید بتوانید تصمیم بگیرید که کدامیک برای وب سایت شما مناسب‌تر می باشد. در هر حال مثال‌هایی را در این مقاله خواهید دید که به طور حتم به شما کمک زیادی خواهند کرد. لازم به ذکر است که بیشتر سعی در انتقال مفاهیمی کرده‌ام که پایه کار نمی باشند و سعی کردم به بیان نکاتی بپردازم که راحت پیدا نمی‌شوند.

کوکی‌ها (Cookies)
استفان والتر در کتاب ASP.NET Unleashed در ابتدای بخش کوکی‌ها اینگونه می‌گوید: "پروتکل HTTP هیچ امکانی را در اختیار وب سرور قرار نمی‌دهد تا بتواند به کمک آن تشخیص دهد درخواست جدید از همان مرورگری صادر شده که در خواست قبلی را فرستاده یا از مرورگر دیگری آمده است. از این جهت به HTTP صفت ناپایداری (Stateless) را میدهند. از نقطه نظر وب سرور هر درخواستی که برای دریافت یک صفحه صادر شده است از طرف کاربری جدید ارسال شده است." این به طور قطع آن چیزی نیست که ما می خواهیم! وقتی می‌خواهیم اطلاعات کاربر را در هر صفحه به او نشان بدهیم (از قبیل شناسه کاربری، کلمه عبور، سبد خرید و...) باید بتوانیم وضعیت آن را حفط کنیم یکی از راههای بسیار خوب در این زمینه استفاده از کوکی‌ها می‌باشد.

اولین بار Netscape کوکی‌ها را در مرورگر خود به کار برد و به تدریج کنسرسیوم وب (W3C) نیز آن را پذیرفت و امروزه اکثر مرورگرها از کوکی‌ها پشتیبانی می کنند. بر اساس مستندات اولیه Netscape، یک کوکی نمیتواند حجمی بیشتر از 4 کیلوبایت داشته باشد و با بستن صفحه مرورگر کوکی‌ها نیز از بین می روند. البته نگران نباشید اینها کوکی‌هایی هستند که پارامتر Expires آنها تنظیم نشده است. اما اگر این پارامتر را تنظیم کنید، کوکی‌ها باقی مانده و دائمی می شوند. اما تا کی؟ تا آن تاریخی که در خاصیت Expires تنظیم کرده‌اید. مرورگرهایی که می توانند با کوکی‌ها کار کنند دارای چند فایل ویژه می‌باشند که در ویندوز به آنها فایل‌های کوکی و در مکینتاش فایل‌های جادویی می گویند. کوکی‌ها از طریق هدرهای HTTP بین مرورگر و سرور جابجا می شوند. سرور با استفاده از هدر Set Cookie یک کوکی جدید ایجاد کرده و در درخواست‌های بعدی این کوکی به سرور فرستاده می شود.

در مقاله‌ای از سایت ASPFREE در مورد خواندن و نوشتن کوکی‌ها اینگونه نوشته شده است: "برای نوشتن کوکی یک شیئ جدید HttpCookie بسازید و مقدار یک رشته را به آن اختصاص دهید (به خاصیت Value آن) و سپس متد ()Add را در Response.Cookies فرا بخوانید. شما همچنین می توانید مقدار Expires را به یک مقدار تاریخ تغییر دهید تا زمان انقضاء برای کوکی‌تان تایین کرده باشید."

باید توجه داشته باشید که کوکی‌ها فقط مقادیر رشته‌ای را ذخیره می کنند و برای نوشتن مقادیر دیگر در کوکی‌ها باید هر آنها را به یک رشته تبدیل کنید. این کد از سایت CodeToad برای یادگیری نحوه استفاده کوکی‌ها بسیار مناسب می باشد:

Using System.Web;

// نوشتن
Response.Cookies["BackgroundColor"].Value = "Red";

// خواندن
Response.Write(Request.Cookies["BackgroundColor"].Value);

به دلایل امنیتی شما می‌توانید فقط کوکی‌هایی را بخوانید که از یک دامنه آمده باشند. همچنین ممکن است شما نیاز به کوکی‌هایی داشته باشید که چند آیتم را در خود نگهداری کنند، یک مثال برای این کار در زیر می بینید:

HttpCookieCollection cookies = Request.Cookies;

for (int n = 0; n < cookies.Count; n++) {
    HttpCookie cookie = cookies[n];
    Response.Write("<hr/>Name: <b>" + cookie.Name + "</b><br />");
    Response.Write("Expiry: " + cookie.Expires + "<br />");
    Response.Write("Address1: " + cookie.Address1+ "<br />");
    Response.Write("Address2: " + cookie.Address2+ "<br />");
    Response.Write("City: " + cookie.City+ "<br />");
    Response.Write("Zip: " + cookie.Zip+ "<br />");
}

یک مثال درباره کوکی‌های تو در تو به زبان VB.NET:

If Request.Form("savecookie") = "Yes" and ValidLogin = "Yes" Then
   Response.Cookies("member")("username") = Request.Form("username")
   Response.Cookies("member")("password") = Request.Form("password")
   Response.Cookies("member").Expires = DATE + 365
End if

جدول زیر بعضی از خصوصیات پیشرفته کوکی‌ها را نمایش می‌دهد:

خاصیت | توضیحات
Domain | دامنه‌ای که محدوده کوکی را تعیین می کند.
Path | مسیر منتسب به کوکی.
Secure | مقدار بولینی که تعیین می کند آیا کوکی باید فقط روی یک اتصال رمز شده ارسال گردد یا نه؟
HasKeys | مقدار بولینی که تعیین می کند که آیا کوکی مربوط به یک کوکی دیکشنری است یا نه؟

بطور خلاصه، کوکی‌ها چه خوبیهایی دارند؟ اشغال فضا روی کلاینت که باعث کاهش ترافیک و اشغال فضا روی سرور می شود و اطمینان کار. کوکی‌ها چه بدیهایی دارند؟ بعضی از مرورگرها از کوکی‌ها پشتیبانی نمی کند، بعضی از کاربران کوکی‌ها را پاک می کنند یا نمی پذیرند و این که فقط داده نوع رشته‌ای را ذخیره می کنند.

جلسات (Sessions)
فریم ورک دات نت برای رد گیری حرکت کاربر ما را تنها نگذاشته و یک امکان خوب به نام Session State را در اختیار ما قرار داده است. به طور پیش فرض وقتی کاربر اولین بار صفحه‌ای را از یک وب سایت ساخته شده با ASP.NET درخواست می کند یک کوکی جلسه به نام ASP.NET_SessionID ساخته شده و به مرورگر او ارسال میشود. با این کار ASP.NET قادر به پیگیری کاربر شده و میتواند در درخواست‌های بعدی او را شناسایی کند.

بر این اساس در ASP.NET یک شیء به نام Session قرار داده شده است که میتوانید از آن برای نگهداری اطلاعات مربوط به هر کاربر استفاده کنید. برای مثال دستور زیر یک آیتم با نام MyItem ایجاد کرده و Hello را به آن نسبت میدهد:

Session("MyItem")="Hello!"

هنگام کار با Sessionها باید به نکات زیر توجه کنید:

1. هر Session اگر کاریر مرورگر را ببندد یا 20 دقیقه از سرور درخواست نکند از بین می رود.

2. Session هر کاربر جدا از Session بقیه کاربران است.

3. در Session بر خلاف کوکی‌ها می توان شیئ هم ذخیره کرد.

جدول زیر بعضی از خصوصیات و متدهای شیئ Session را نمایش میدهد:

خاصیت/متد | توضیحات
Remove | پاک کردن Session
RemoveAll | پاک کردن تمام Sessionها
SessionID | ID منحصر به فرد جلسه فعلی را برمیگرداند.
Abandon | Session فعلی را خاتمه میدهد. اگر کاربر پس از دستور فوق درخواست یک صفحه جدید کند به عنوان کاربر جدید در نظر گرفته می شود.
TimeOut | تغییر مهلت پیش فرض ختم جلسه. این خصوصیت هر عددی که باشد بعد از همان قدر دقیقه اگر کاربر درخواستی به سرور نفرستد Session ختم می شود.

نکته: از طریق فایل web.config نیز می‌توان مهلت ختم جلسه را تغییر داد:

<configuration>
   <system.web>
      <sessionstate timeout="60" />
   </system.web>
</configuration>

Eventها یا وقایع جلسه‌ها دو مورد هستند: Session_Start و Session_End. که Session_Start وقتی رخ می دهد که جلسه آغاز و Session_End وقتی رخ می دهد که جلسه خاتمه پیدا کند. این Eventها را باید در فایل Global.asax تعریف کرد.

در زیر یک مثال عملی از این رویدادها را خواهید دید:

<html>
   <head>
      <title>SessionCount.aspx</title>
      <Script Runat="Server">
         Sub Page_Load()
            lblSessionCount.Text = Application("SessionCount")
         End Sub
      </Script>
   </head>

   <body>

   Current Sessions:
   <asp:Label ID="lblSessionCount" Runat="Server" />

   </body>
</html>

Default.aspx

<Script Runat="Server">
   Sub Session_Start()
      If Application("SessionCount") Is Nothing Then
         Application("SessionCount") = 0
      End If

      Application("SessionCount") += 1
   End Sub

   Sub Session_End()
     Application("SessionCount") -= 1
   End Sub
</Script>

Global.asax

بطور کلی برای نگهداری مقادیر Sessionها در ASP.NET سه روش وجود دارد: درون پروسه (In Process)، ذخیره در سرویس ویندوز و ذخیره در SQL Server.

Sessionها به طور پیش فرض در داخل پروسه مدیریت می شود و تمام آیتم‌هایی که در Sessionها می‌سازیم در همان پروسه وب سرور ذخیره می شوند. مهمترین مشکل این روش این است که اگر به هر دلیل سرور از کار بیفتد و یا Web Applicationما دستکاری شود، تمام داده‌ها از بین میرود و از طرف دیگر بسط پذیری را در سایت محدود می کند و نمی توان آن را به اشتراک گذاشت.

اما با استفاده از تکنیک ذخیره در پایگاه داده SQL Server می‌توان حتی در صورت از کار افتادن سرور نیز اطلاعات را حفظ کرد. تعریف اشیای ضروری در SQL Server به منظور مدیریت داده‌های جلسه با اجرای بچ فایل InstallSqlState.sql صورت می گیرد. بعد از این کار باید فایل web.config را نیز به شکل زیر تغییر داد:

<configuration>
   <system.web>
      <sessionstate
        mode="SqlServer"
        sqlConnectionString="Server=127.0.0.1;UID=sa;Pwd=YourPassword" />
   </system.web>
</configuration>
لينک مقاله
http://www.idevcenter.com :منبع

مقالات مرتبط با اين موضوع
upload کردن فايل به سرور در ASP.NET | aspdotnet
Namespace چيست؟ | aspdotnet
Smart Navigation چيست؟ | aspdotnet
چرا به دات نت احتياج داريم؟ | aspdotnet
نشان دادن قابليتهای مرورگر در ASP.NET | aspdotnet
آشنائی با ASP.NET | aspdotnet
نحوه پردازش صفحات ASP.NET بر روي سرويس دهنده وب | aspdotnet
ارسال ایمیل در ASP.NET با استفاده از HTML Template | aspdotnet
اضافه کردن تصویر به پایگاه داده | aspdotnet
برسی کوکی‌ها (Cookies) و جلسات (Sessions) در ASP.NET | aspdotnet
باز کردن پنجره Popup در ASP.NET با استفاده از Code Behind | aspdotnet
آشنائی با فرم‌های وب در ASP.NET | aspdotnet

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


اضافه کردن تصویر به پایگاه داده

در بسیاری مواقع ما نیاز به افزودن تصویر به پایگاه داده داریم. از آنجایی که دسترسی به فایلهای موجود در سرور جهت استفاده هکرها بسیار سهل الوصول است، برخی مواقع نمی‌توانیم اطلاعات حساس را در قالب فایلهای تصویری در سرور ذخیره کنیم. به همین جهت بهتر آن است که در قالب نوع داده image در بانک اطلاعاتی ذخیره شود.

در این قسمت موارد زیر بررسی می شوند:

  • بررسی پیش نیازهای اضافه نمودن فایل تصویری
  • کار با شیء Stream
  • پیدا کردن اندازه و نوع تصویری که آپلود می شود
  • چگونگی استفاده از متد InputStream

بررسی پیش نیازهای اضافه نمودن فایل تصویری
دو مورد اصلی که قبل از شروع آپلود نیاز داریم عبارتند از:

1. - تنظیم خاصیت enctype فرم مربوطه (در برچسبForm) به enctype="multipart/form-data"
- داشتن <input type=file> که به کاربر اجازه انتخاب فایل مورد نظرش را می دهد. (فایلی که در پایگاه داده باید ذخیره شود) و یک Submit button جهت اجرای عملیات مربوط به آپلود کردن فای
- استفاده از فضانام System.IO جهت سروکار داشتن با شیء Stream

2. سه پارامتر بالا در یک صفحه aspx بکار می روند.ما همچنین به پیش نیازهای زیر در SQL Server نیازمندیم:
- داشتن حداقل یک جدول با فیلدی از نوع image
- بهتر است که فیلد دیگری از نوع varchar جهت ذخیره تایپ تصویر داشته باشیم

روند کار بدین صورت است که در ابتدا محتویات فایل تصویر خوانده می‌شود و سپس تصویر به جدول افزوده می‌شود. در زیر کد مربوط به رویداد OnClick مربوط به Submit button که تصویر را خوانده و به جدول SQL اضافه می‌کند، می‌پردازیم:

Public Sub AddPerson(sender As Object, e As EventArgs)
   Dim intImageSize As Int64
   Dim strImageType As String
   Dim ImageStream As Stream

   ' Gets the Size of the Image
   intImageSize = PersonImage.PostedFile.ContentLength

   ' Gets the Image Type
   strImageType = PersonImage.PostedFile.ContentType

   ' Reads the Image
   ImageStream = PersonImage.PostedFile.InputStream

   Dim ImageContent(intImageSize) As Byte
   Dim intStatus As Integer
   intStatus = ImageStream.Read(ImageContent, 0, intImageSize)

   ' Create Instance of Connection and Command Object
   Dim myConnection As New SqlConnection(
ConfigurationSettings.AppSettings("ConnectionString"))
   Dim myCommand As New SqlCommand("sp_person_isp", myConnection)

   ' Mark the Command as a SPROC
   myCommand.CommandType = CommandType.StoredProcedure

   ' Add Parameters to SPROC
   Dim prmPersonImage As New SqlParameter("@PersonImage", SqlDbType.Image)
   prmPersonImage.Value = ImageContent
   myCommand.Parameters.Add(prmPersonImage)

   Dim prmPersonImageType As New SqlParameter("@PersonImageType",
SqlDbType.VarChar, 255)
   prmPersonImageType.Value = strImageType
   myCommand.Parameters.Add(prmPersonImageType)

   Try
      myConnection.Open()
      myCommand.ExecuteNonQuery()
      myConnection.Close()
      Response.Write("New person successfully added!")
   Catch SQLexc As SqlException
      Response.Write("Insert Failed. Error Details are: " & SQLexc.ToString())
   End Try
End Sub

شیء PersonImage نام کنترل HTMLInputFile است. در ابتدا ما نیاز داریم که اندازه تصویری که جهت اضافه کردن انتخاب شده را بدانیم که توسط کد زیر قابل اندازه گیری است:

intImageSize = PersonImage.PostedFile.ContentLength

سپس نوع تصویر را با استفاده از خاصیت ContentType دریافت می کنیم. حال باید یک استریم از تصویر مربوطه دریافت شود:

ImageStream = PersonImage.PostedFile.InputStream

در اینجا ما یک آرایه از بایتها بنام ImageContent که آماده نگهداری محتویات تصویر است، داریم. تصویر ورودی توسط متد Read از شیء Stream خوانده می شود. متد Read سه آرگومان می گیرد:
1. موقعیت مکانی که محتویات تصویر در آن باید کپی شود
2. مکان شروع جهت خواندن
3. تعداد بایتهایی که باید خوانده شود

و دستور مربوط به خواندن هم به شکل زیر است:

intStatus = ImageStream.Read(ImageContent, 0, intImageSize)

حالا ما می خواهیم محتویات تصویر ورودی را که خوانده ایم به یک جدول SQL اضافه کنیم. به همین منظور از یک زیرروال ذخیره شده که تصویر و نوع آن را به یک جدول اضافه می کند، بهره می بریم. حالا ما می خواهیم محتویات تصویر ورودی را که خوانده ایم به یک جدول SQL اضافه کنیم. به همین منظور از یک زیرروال ذخیره شده که تصویر و نوع آن را به یک جدول اضافه می کند، بهره می بریم.

فایل aspx مربوطه:

<%@ Page Language="vb" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.IO" %>
<html>
   <head>
      <title>Inserting Image to a SqlServer</title>
      <script runat=server>
         Public Sub AddPerson(sender As Object, e As EventArgs)
            ' above code
         End Sub
      </script>
   </head>

   <body>

      <form enctype="multipart/form-data" runat="server">
         <input type="file" id="PersonImage" runat=server />
         <asp:Button Text="Add Person" OnClick="AddPerson" Runat=server />
    </form>

  </body>
</html>

جدول و زیرروال استفاده شده:

Drop Table Person
Go

Create Table Person
(
PersonID Int Identity,
PersonEmail Varchar(255),
PersonName Varchar(255),
PersonSex Char(1),
PersonDOB DateTime,
PersonImage Image,
PersonImageType Varchar(255)
)

Drop Proc sp_person_isp
Go

Create Proc sp_person_isp
@PersonEmail Varchar(255),
@PersonName Varchar(255),
@PersonSex Char(1),
@PersonDOB DateTime,
@PersonImage Image,
@PersonImageType Varchar(255)
As
Begin
   Insert into Person
      (PersonEmail, PersonName, PersonSex,
       PersonDOB, PersonImage, PersonImageType)
   Values
      (@PersonEmail, @PersonName, @PersonSex,
       @PersonDOB, @PersonImage, @PersonImageType)
End

Go

بازیابی تصاویر از SQL Server در ASP.NET:
در مقایسه با اضافه کردن تصویر، بازیابی آن بسیار ساده است. تنها چیز جدید برای این قسمت استفاده از متد BinaryWrite موجود در شیء Response است.

کدهای مورد استفاده جهت بازیابی تصاویر از SQL Server:

Public Sub Page_Load(sender As Object, e As EventArgs)

   Dim myConnection As New SqlConnection(
ConfigurationSettings.AppSettings("ConnectionString"))
   Dim myCommand As New SqlCommand("Select * from Person", myConnection)

   Try
      myConnection.Open()
      Dim myDataReader as SqlDataReader
      myDataReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection)

      Do While (myDataReader.Read())
         Response.ContentType = myDataReader.Item("PersonImageType")
         Response.BinaryWrite(myDataReader.Item("PersonImage"))
      Loop

      myConnection.Close()
      Response.Write("Person info successfully retrieved!")
   Catch SQLexc As SqlException
      Response.Write("Read Failed : " & SQLexc.ToString())
   End Try
End Sub

تمام کار این مرحله اجرای یک دستور SQL و تکرار آن برای همه ردیفهاست. قبل از نمایش تصویر، نوع آن هم مشخص می شود.
لينک مقاله
http://www.idevcenter.com :منبع

مقالات مرتبط با اين موضوع
upload کردن فايل به سرور در ASP.NET | aspdotnet
Namespace چيست؟ | aspdotnet
Smart Navigation چيست؟ | aspdotnet
چرا به دات نت احتياج داريم؟ | aspdotnet
نشان دادن قابليتهای مرورگر در ASP.NET | aspdotnet
آشنائی با ASP.NET | aspdotnet
نحوه پردازش صفحات ASP.NET بر روي سرويس دهنده وب | aspdotnet
ارسال ایمیل در ASP.NET با استفاده از HTML Template | aspdotnet
اضافه کردن تصویر به پایگاه داده | aspdotnet
برسی کوکی‌ها (Cookies) و جلسات (Sessions) در ASP.NET | aspdotnet
باز کردن پنجره Popup در ASP.NET با استفاده از Code Behind | aspdotnet
آشنائی با فرم‌های وب در ASP.NET | aspdotnet

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


ارسال ایمیل در ASP.NET با استفاده از HTML Template

آیا تاکنون سعی کرده اید برای سایت خود خبرنامه ایجاد کنید؟ آیا تاکنون وسوسه شده اید که سیستمی طراحی کنید که در صورتی که بینندگان سایت شما نظرات خود را در سایت شما وارد کنند برای آنها یک Email تشکرآمیز ارسال کنید؟ آیا می دانید ساختن یک HTML Template زیبا برای خبرنامه شما و استفاده همیشگی از آن جهت ارسال خبرنامه در ASP.NET بسیار ساده صورت می گیرد؟ چنانچه سوالات بالا شما را به دانستن بیشتر ترغیب کرده است به شما تبریک می گویم! چرا که در ادامه این مقاله شما روش بسیار ساده ارسال Emailهای HTML زیبا را بدون اینکه نگران چگونگی کدنویسی HTML متغیر رشته ای Body در MailMessage باشید را فرا خواهید گرفت.

برای شروع بیایید به روش کار نظری بیاندازیم: خوب احتمالا شما با روش ساختن یک نمونه از آبجکت MailMessage که در ASP.NET برای ارسال Email استفاده می شود آشنایی دارید (اگر این چنین نیست در ادامه مقاله به طور اجمالی توضیحاتی ارائه شده است) تنها قسمتی که باید مورد توجه قرار دهید این است که چگونه می توانیم Body نامه خود را به فرمت HTML و بدون نیاز به اینکه تمامی تگها را پشت سر هم در یک رشته طولانی و سردرگم کننده تایپ کنیم، درآوریم. یک ایده جالب این است که ما Template نامه خود را با استفاده از ادیتورهای WYSIWYG مثل FrontPage یا Dreamweaver طراحی کنیم و سپس تمامی کدهای HTML آن را درون یک متغیر رشته ای Import کرده و از آن استفاده کنیم. این کار بسیار آسان است. اما می توان این نامه را برای هر کاربر کمی سفارشی (Customize) کرد! برای مثال شما می توانید در ابتدای نامه کاربر را با نام وی مورد خطاب قرار دهید. بهتر است از این پس توضیحات را همراه با کدنویسی دنبال کنیم. (کلیه کدهای Server Side به زبان VB.NET نوشته شده است) سه گام اساسی برای این کار وجود دارد:

1- ساختن Template مورد نظر شما جهت ارسال Email:
برای این کار کافی است که Template مورد نظر خود را به فرمت HTML طراحی کنید. این به خود شما بستگی دارد که کدهای HTML را به صورت دستی بنویسید و یا از ادیتورهای WYSIWYG مانند FrontPage یا Dreamweaver یا !GoLive استفاده کنید. تنها تفاوتی که در اینجا وجود دارد این است که شما بایستی قسمتهایی از متن نامه خود را که متغیر هستند (مانند نام گیرنده Email، آدرس پست الکترونیکی وی و ...) را به گونه ای از بقیه قسمتها متمایز کنید. برای مثال اگر شما می خواهید در ابتدای نامه، دریافت کننده نامه را با نام خود مورد خطاب قرار دهید عبارت را به صورت زیر وارد کنید: "سلام "#NAME# لطفا توجه کنید که هیچ محدودیتی در تکنیک به کار رفته وجود ندارد و قرار دادن کاراکترهای ## فقط جهت متمایز ساختن این قسمت از محتوای استاتیک صفحه است و شما می توانید به صور دیگر آن را مشخص کنید مثلا ?NAME? یا هر چیز مشابه دیگر. این قسمت بعدا با نام شخص مورد نظر ما جایگزین می شود. نکته قابل ذکر دیگر اینکه چنانچه قصد دارید نامه خود را فارسی ارسال کنید تگ زیر را فراموش نکنید:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

2- خواندن فایل Template جهت قراردادن در Body نامه شما:
پس از اینکه Template را آماده نمودید بایستی این فایل را بخوانید، قسمتهای مورد نظر (متمایز شده با ##) را با عبارات مورد نظر خود (که می توانید از Database استخراج کنید) جایگزین کنید و این متن را به صورت یک متغیر رشته ای در Body نامه خود قرار دهید (گام 3). این کار به وسیله کد زیر صورت می پذیرد: (قبل از هر چیز شما بایستی Namespace مورد نیاز که در اینجا System.IO می باشد را Import کنید)

Imports System.IO

Dim reader As StreamReader
Dim strFileName As String = Server.MapPath("templatel.htm")
Dim strFileText

reader = File.OpenText(strFileName)

While reader.Peek <> -1
               strFileText += reader.ReadLine()
End While

reader.Close()
strFileText = Replace(strFileText, "#Username#", Name.Text)
strFileText = Replace(strFileText, "#MsgID#", Request("MsgID"))
strFileText = Replace(strFileText, "#AuthorID#", Request("AuthorID"))

حال بیایید نگاهی به کد فوق بیاندازیم: در سطر اول شما یک شی از نوع StreamReader که جهت خواندن فایلهای متنی به کار می رود را می سازید و در سطر بعدی مسیر فیزیکی فایل Template خود را در متغیر رشته‌ای strFileName ذخیره می کنید.

نکته: در صورتیکه بخواهید در فایل کلاس خود از کد فوق استفاده کنید بایستی مسیر فیزیکی فایل را با استفاده از System.Web.HttpContext.Current.Server.MapPath("template.htm") به دست آورید. اما در Code Behind یک WebForm همان Server.MapPath() کافی است.

سپس در سطر بعدی ما با استفاده از متد OpenText فایل مورد نظر را باز کرده و متن آن را در Reader قرار می دهیم. حال در یک حلقه While...End While سطر به سطر فایل Template را (که در اینجا کدهای HTML ما هستند) می خوانیم و در متغیر strFileText ذخیره می کنیم. Reader.Peek <> -1 بررسی می کند که آیا به انتهای فایل رسیده ایم یا خیر. پس از اینکه کل فایل را خوانده و در متغیر ذخیره کردیم. شی reader را می بندیم.

در اینجا شما باید Template نامه خود را برای کاربر خاص Customize کنید. یعنی عبارات محصور شده با ## را با اطلاعات کاربر (که از بانک اطلاعاتی استخراج می شود و یا از یک Query String دریافت می شود) جایگزین کنید. در مثال بالا مقدار اول در Template با مقدار یک Textbox و دو مورد بعدی با Query String های انتهای یک URL جایگزین می شود.

حاصل کار یک متغیر رشته ای به نام strFileText است که حاوی کد HTML مورد نیاز شما برای ارسال یک HTML Email می باشد. که مثلا عبارت ابتدای آن به صورت زیر در آمده است: "سلام مهدی"

3- استفاده از قالب Import شده فوق و ارسال Email:
حال به آسانی Email را ساخته و ارسال می کنیم. بدین ترتیب: (Imports System.Web.Mail را فراموش نکنید!)

'Creating and sending mail to user
Dim objMail As New MailMessage()
objMail.From = "You@YourDomain.com"
objMail.To = Email.Text.Trim
objMail.Subject = "YOUR SUBJECT GOES HERE..."
objMail.BodyFormat = MailFormat.Html
objMail.BodyEncoding = System.Text.Encoding.UTF8
objMail.Body = strFileText
SmtpMail.SmtpServer = "smtp.YOURSERVER.com"
SmtpMail.Send(objMail)

این قسمت نیاز به توضیخ چندانی ندارد. جز اینکه objMail.To را بایستی به صورت داینامیک (از DB و ...) تغییر دهید (در اینجا مقدار از یک Textbox دریافت شده است)، SMTP Server خود را مشخص کنید و Email را ارسال کنید! به همین سادگی. بقیه موارد بسیار واضح هستند.

لطفا به این نکته توجه کنید که برخی SMTP Serverهایی که نیاز به Authentication دارند را نمی توان برای این منظور (ارسال Email به آدرس های خارج از SMTP Server فوق) مورد استفاده قرار داد. در این خصوص لطفا به Administrator سرور خود رجوع کنید.

لينک مقاله
http://www.idevcenter.com :منبع

مقالات مرتبط با اين موضوع
upload کردن فايل به سرور در ASP.NET | aspdotnet
Namespace چيست؟ | aspdotnet
Smart Navigation چيست؟ | aspdotnet
چرا به دات نت احتياج داريم؟ | aspdotnet
نشان دادن قابليتهای مرورگر در ASP.NET | aspdotnet
آشنائی با ASP.NET | aspdotnet
نحوه پردازش صفحات ASP.NET بر روي سرويس دهنده وب | aspdotnet
ارسال ایمیل در ASP.NET با استفاده از HTML Template | aspdotnet
اضافه کردن تصویر به پایگاه داده | aspdotnet
برسی کوکی‌ها (Cookies) و جلسات (Sessions) در ASP.NET | aspdotnet
باز کردن پنجره Popup در ASP.NET با استفاده از Code Behind | aspdotnet
آشنائی با فرم‌های وب در ASP.NET | aspdotnet

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


XML چيست ؟

یکی از ابزاری است که این مدته به شدت وارد بورس شده و حیفه، که من حرفی از این مبحث مطرح نکنم.

XML یک سیستم ذخیره اطلاعات است که میتوان در زمینه های مختلف تعمیمش داد. حال من آموزش گوشه های از XML رو میخوام با یک مثال شروع کنم. شما فقط سعی کنید مکانیزم کاری و کاربرد XML رو درک کنید. درک مطالب و مباحث کمکه زیادی به شما در برنامه نویسی میکنه پس مثال زیر رو با دقت بخونید، اگه گوشه های از کد رو متوجه نشدید مهم نیست چون در درس های بعدی این Object ها و باقیه Object های مربوط به XML رو آموزش میدم.

من یک فایل در آدرس "C:\Data1.XML" دارم با محتوای زیر:

<?xml version="1.0" ?>

<Person>

<Name>AraSoft</Name>

<Age>18</Age>

<Sex>Male</Sex>

</Person>

حال لازمه که این اطلاعات که شامل اسم ، سن ، جنسیت من هست در برنامه استفاده کنیم.پس ابتدا Namespace مورد نظر " System.Xml " رو به برنامه اضافه کرده و Imports System.Xml ... استاد میکنید.

و در قسمت مورد نظر کد مربوط رو مینویسیم:

Dim Reader as XMLNodeReader

Dim DC as New XMLDocument

Dim NickName, Sex as String

Dim Age as Long

DC.load ("C:\Data1.Xml")

Reader = New XMLNodeReader (DC)

Do until Reader.EOF

Reader.Read

Select Case Reader.LocalName

Case "Name"

If Reader.IsStartElement then

Reader.MoveToElement

If Not Reader.Value.Trim = Nothing then

MSGbox (Reader.Value)

End IF

End If

Case "Age"

If Reader.IsStartElement then

Reader.MoveToElement

If Not Reader.Value.Trim = Nothing then

MSGbox (Reader.Value)

End IF

End If

Case "Sex"

If Reader.IsStartElement then

Reader.MoveToElement

If Not Reader.Value.Trim = Nothing then

MSGbox (Reader.Value)

End IF

End If

End Select

Loop

خوب ما یک XML داریم و یک کد که از این اطلاعات استفاده میکنه.شما کافیست از کد به این برسید که XML در چه حیطه ای است و کجا بدرد میخورد، به راحتی میتوانید تمام مباحث XML را به راحتی یاد بگیرید.فعلا این مثال رو داشته باشید تا من در دفعه بعد یک آموزش ساده و پایه ای از XML رو استاد کنم.فقط یادتون نره قدم به قدم پس تا بعد.
لينک مقاله
http://arasoft.partianews.com :منبع

مقالات مرتبط با اين موضوع
XML در دات نت 2 | xml
XML در دات نت | xml
آشنايي با XML قسمت چهارم | xml
آشنايي با XML قسمت سوم | xml
آشنايي با XML قسمت دوم | xml
XML چيست ؟ | xml

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آشنايي با XML قسمت دوم

اکثر افرادی که قصد یادگیری XML رو دارند، نمی تونند XML رو خوب بفهمند. شما سعی کنید XML رو یک سیستم ذخیره اطلاعات بدونید.بعدا با یادگیری قسمتهای بعدی XML با کاربردهای XML آشنا میشید و راحتتر میتونید به صورت حرفه ای از اون استفاده کنید.البته این یادآوری کنم که من فقط قصد آشنا سازی شما با XML رو دارم نه آموزش کامل XML.

XML برای خود یک دستوره نگارشی و املایی دارد. شما در حین یادگیری عبارتهای XML با اون آشنا میشید.

تگها:

شما با عبارتهای HTML یا همان TAG ها آشنا هستید <تگ> در XML از همان تگها استفاده میشود ولی نکته مهم اینجاست که XML به شدت به حروف کوچک و بزرگ حساسیت داره پس اگر شما تگ ابتدای خودتون رو به دین صورت نوشتید <TaG> باید تگ پاییانی هم بدین صورت بنویسید </TaG>.

اعلان شروع فایل XML:

فایل XML با یک اعلان شروع میشه که باید در اولین خط باشه (کاملا اختیاری):

<? xml version="1.0" ?>

حتما به بزرگی و کوچکی حروف دقت کنید. تگ اعلان XML به صورت <؟ و بعد کلمه XML و بعد از اون نوع version که تا کنون آخرین اون "1.0" بوده قرار میگیره و سپس تگ پایانی اون ؟>.

نوشتن تگها:

تگها در حقیقت همان رکوردها هستند که فیلدهای متغییری میتوانند داشته باشند(البته اگر با Database آشنا باشید). شما اطلاعات خودتون رو با استفاده از تگها ذخیره میکنید مثلا برای ذخیره اسمتون: <Name>AraSoft</Name>

برای ذخیره اطلاعات شما به دو تگ نیاز دارید یکی آغازی و دیگری پایانی این دو در حقیقت تشکیل یک تگ صحیح را میدهند. یک تگ آغازی به صورت اول > و بعد اسم مورد نظر و سپس < نوشته میشود. تگ پایانی تنها یک تفاوت کوچک دارد که آن در آولین بخش تگ است. تگ پایانی به صورت </ و اسم مورد نظر و <. میبینید که در تگ پایانی علاوه بر > یک علامت / هم وجود دارد:

Begin: <Name>

End: </Name>

برای نوشتن تگها باید به این توجه کنید که اسم تگ شروع (<Name>) و اسم تگ پایانی (</Name>) نباید از نظر کوچکی و بزرگی فرق کند. و نکته مهم اینکه شما باید XML خود رو با یک تگ اصلی بپوشانید و بقیه تگها رو داخل اون قرار دهید مثل:

<? Xml version="1.0" ?>

<Root>

<Child1></Child1>

<Child2></Child2>

<Child3/>

</Root>

تداخل تگها:

اگر شما تگی رو شروع کردید و میخواهید تگی رو داخل اون قرار دهید شروع و پایان تگ باید در داخل تگ اصلی باشد مانند زیر:

درست:

<? Xml version="1.0" ?>

<root>

<child1/>

</root>

:غلط

<? Xml version="1.0" ?>

<root>

<child1>

</root>

</child1> ß-----Error

تگ پوچ:

شاید در مرور Xml های که من نوشتم یه این تگ <Child1/> رسیده و تعجب کنید که چرا من قانون نوشتن تگها رو نقض کردم و لی در حقیقت این خود یک دستور نگارشی است مبنی بر اینکه اگر تگی هیچ مقداری رو در بر نمیگیرد بهتر است به صورت <Name/> نوشته شود "شبیه به HTML" تا به راحتی برسی XML افزوده شود.

افزوردن ویژگی به تگ:

تگ ها قدرت داشتن ویژگی رو دارند (Attribute).

1.<SectionOfSite Language="Persian">Home</SectionOfSite>

2.<SectionOfSite Language="English">Home</SectionOfSite>

شما میتوانید برای مقدار هر تگ یک خاصیت یا ویژگی تعیین کنید. مثلا من در شماره 1 گفتم قسمت سایت=خانه و با زبان فارسی و در شماره 2 گفتم که قسمت سایت=خانه و به زبان انگلیسی.
لينک مقاله
http://arasoft.partianews.com :منبع

مقالات مرتبط با اين موضوع
XML در دات نت 2 | xml
XML در دات نت | xml
آشنايي با XML قسمت چهارم | xml
آشنايي با XML قسمت سوم | xml
آشنايي با XML قسمت دوم | xml
XML چيست ؟ | xml

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آشنايي با XML قسمت سوم

یک حالت ساده از خواننده های فایلهای XML در .Net همین XMLTextReader است.

این راننده (Driver) فقط رو به جلو حرکت میکند وهرچی در سر راهش باشد در حافظه اش ذخیره میکند.و مهمترین قسمت اینکه از DTD و XMLSchema نیز پشتیبانی نمیکند.و این برای شروع کار ما که با این دو نوع آشنا نیستیم بسیار مناسب است.

Imports System.Xml

Dim Reader as XmlTextReader

Reader = New XmlTextReader("Data\Setting.Xml")'فایل مورد نظر

Do Until Reader.EOF'در صورت به اتمام رسیدن فایل حلقه متوقف میشود

Reader.Read()'خواندن تگ بعدی

MsgBox(">---")

MsgBox("Depth: " & Reader.Depth)

'مقدار فرو رفتگی یک تگ داخل تگهای بالای خودش

MsgBox("LocalName: " & Reader.LocalName)

'خواندن اسم تگ <Book> localName is Book

MsgBox("Attribute: " & Reader.ReadAttributeValue)

'مقدار خاصیت قرار داده شده

MsgBox("Value: " & Reader.Value)

'محتوای داخلی تگ

MsgBox("---<")

Loop

همینطور که میبینید بسیار ساده میشه از این Object استفاده کرد. شمامیتونید به راحتی فایل XML خود رو باز کرده و اون رو به ترتیب بخونید.

*همانطور که میبینید در قسمت خواصیت تگ اگر تگ خواصیتی رو نداشته باشه مقدار

برگشتی False میباشد.

*در قسمت Depth ؛ اگر تگی در داخل روت اصلی باشد مقدار 1 رو بر مگردونه و اگریک تگ در داخل این تگ باشه پس مقدار 2 رو بر میگردونه و اگر خود روت باشه

مسلماً مقدار صفر 0 را بر میگردونه.

*شما میتوانید با استفاده از LocalName یک فیلتر قرار دهید که هر LocalName که مقداری در بر نگیرد نمایش ندهد.

البته من فقط این Reader ها رو معرفی میکنم و اگر نکته مهمی وجود داشته باشد گفته میشود.پس اگر در این زمینه مشکلی بوجود اومد میتونید اونو مطرح کنید چون این مبحث خیلی وسیع هست و نمیشه به این راحتی با اون کنار اومد.
لينک مقاله
http://arasoft.partianews.com :منبع

مقالات مرتبط با اين موضوع
XML در دات نت 2 | xml
XML در دات نت | xml
آشنايي با XML قسمت چهارم | xml
آشنايي با XML قسمت سوم | xml
آشنايي با XML قسمت دوم | xml
XML چيست ؟ | xml

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آشنايي با XML قسمت چهارم

در این قسمت به تعریف یک نوع دیگر از خواننده های XML میپردازیم که من بیشتر از این نوع استفاده میکنم بجز موارد خواص. البته این مبحث زیاد جای بحث نداره به همین دلیل بسیار مختصر به شرح اون میپردازم.

XMLNodeReader

همین طور که از اسمش معلومه برای برسی XML بر اساس گره ها (Node) طراحی شده. این Reader از DTD و XML Schema پشتیبانی نمیکند ولی تعریف های داخل DTD رو میشناسه.

خوب طبق معمول با یک مثال این Reader رو تعریف میکنیم.که من فکر میکنم هیچ آموزشی نمیتونه مانند مثال به یک نفر کمک کنه پس ما هم... :

Imports System.Xml

Dim Reader As XMLNodeReader

Dim DOC As New XmlDocument

DOC.Load("\Data\Setting.Xml")

Reader = New XMLNodeReader(DOC)

Do Until Reader.EOF

Reader.Read()

MsgBox("---")

MsgBox("Depth: " & Reader.Depth)

MsgBox("LocalName: " & Reader.LocalName)

MsgBox("Attribute: " & Reader.ReadAttributeValue)

MsgBox("Value: " & Reader.Value)

MsgBox("---")

Loop

همینطور که میبینید این Reader هم بسیار شبیه Reader قبلی است. ولی در Open کردن فایل کمی تفاوت دارد. مهمترین قسمت این قسمت طریقه بازشدن فایل بوسیله XMLNodeReader است چون بقیه قسمتهای NodeReader و TextReader فرق چندانی با هم ندارد. ولی یک Object اضافه بر سازمان در این قسمت برای باز کردن فایل استفاده کردم. این Object بسیار قدرتمند است و در آینده حتما بر روی اون بحث خواهم کرد. من به شما سفارش میکنم اگر از XML به صورت ابتدایی استفاده میکنید از همین Reader استفاده کنید چون بسیار سریع تر و دقیقتر ( نه از نظر من حتی از نظر Microsoft) از TextReader است. من برای مطرح کردن بقیه مسایل در XML باید به آموزش کوتاهی درباره DTD بپردازم پس تا یادداشت بعد.
لينک مقاله
http://arasoft.partianews.com :منبع

مقالات مرتبط با اين موضوع
XML در دات نت 2 | xml
XML در دات نت | xml
آشنايي با XML قسمت چهارم | xml
آشنايي با XML قسمت سوم | xml
آشنايي با XML قسمت دوم | xml
XML چيست ؟ | xml

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


XML در دات نت
xml ، يکي از مهمترين دستاوردهاي بشريت در عرصه نرم افزارطي ساليان اخير است که بدون شک بيشترين تاثير را در ارتباط با طراحي و پياده سازي برنامه هاي کامپيوتري خصوصا" در اينترنت، بدنبال داشته و خواهد داشت . XML ، يکي از استانداردهاي ارائه شده توسط کنسرسيوم وب است که زمينه استفاده از آن براي تمامي توليدکنندگان نرم افزار، فراهم شده است . XML ، بهمراه خود مجموعه اي از تکنولوژي هاي ديگر را ايجاد نموده است، بطوريکه امروزه از آن بعنوان يک خانواده بزرگ ياد مي گردد (XSLT , XSD ,DOM , XPath ,...) . بديهي است توجه به استانداردهاي فوق براي توليدکنندگان نرم افزار بسيار حايز اهميت بوده و در اين راستا ،شرکت هاي عظيم نرم افزاري بدنبال ارائه بستر مناسب براي طراحي و پياده سازي نرم افزار بر اساس واقعيت هاي موجود، خصوصا" پديده شگرف اينترنت مي باشند . ماکروسافت، بعنوان يکي از شرکت هاي عظيم نرم افزاري ،پروژه دات نت را مطرح و در نهايت آن را در اختيار علاقه مندان قرار داده است . XML ، در دات نت داراي نقشي بسيار مهم و محوري بوده و لازم است با جايگاه آن بصورت اصولي آشنا شويم . در اين مقاله، به بررسي جايگاه XML در دات نت پرداخته مي گردد .

مقدمه
XML ، يک تکنولوژي استاندارد ايده آل براي برنامه هائي است که بر روي بستر اينترنت اجراء مي گردند. ماکروسافت در پروژه دات نت ،از استادنداردهاي کنسرسيوم وب پيروي و نسخه هاي اختصاصي خود را طراحي و پياده سازي نموده است. بدين ترتيب (با توجه به تبعيت ماکروسافت از استانداردهاي کنسرسيوم وب)، مي توان اين اطمينان را بدست آورد که نرم افزارهاي توليد شده در دات نت ، قابليت ارتباط با ساير برنامه هاي توليد شده مبتني بر استانداردهاي کنسرسيوم وب را بخوبي دارا مي باشند . در محيط اينترنت، داده ها مي توانند از منابع متفاوت و به اشکال گوناگون دريافت گردند . سرويس هاي وب XML و ساير برنامه هائي که با استفاده از دات نت پياده سازي مي گردند ، مسائل و مشکلات مربوط به انجام عمليات بر روي داده هائي با فرمت هاي متفاوت و از منابع گوناگون ، را برطرف مي نمايد.

سرويس هاي وب XML
ساختار و بدنه دات نت، محيطي مناسب براي ايجاد سرويس هاي وب XML است . کاربران قادر به فراخواني سرويس ها بکمک پروتکل هاي استاندارد شده اي نظير : SOAP ، UDDI و XML مي باشند. سرويس هاي وب XML ، با استفاده از کلاس ها و Namespace هائي که توسط کنسرسيوم وب استاندارد شده اند، ايجاد مي گردند. سرويس هاي وب XML ، روشي مطلوب بمنظور اشتراک ، سازماندهي و انجام عمليات متفاوت در رابطه با داده ها مي باشند .

محيط ( پلات فرم ) دات نت
محيط دات نت، شامل مجموعه اي از محصولات است که بر اساس XML و ساير استانداردهاي اينترنت،ايجاد شده اند .محيط فوق، براي هر يک از جنبه هاي مرتبط با پياده سازي، مديريت ، استفاده ، سرويس هاي وب XML ، امکانات و راهکارهاي مناسبي را ارائه داده است . سرويس هاي وب XML ، اين امکان را به برنامه ها خواهند داد تا قادر به اشتراک اطلاعات از طريق اينترنت صرفنظر از سيستم عامل و زبان برنامه نويسي مربوطه باشند. با استفاده از XML در دات نت ، مي توان اغلب مشکلات مربوط به پياده سازي نرم افزار بر روي اينترنت را که در حال حاضر با آن مواجه هستيم ، برطرف کرد. XML ، يک راه حل جامع براي تشريح و مبادله داده هاي ساختيافته را ارائه مي نمايد .

چالش هاي موجود در زمينه بکارگيري برنامه ها در اينترنت
گسترش فعاليت هاي تجاري بر روي اينترنت باعث حضور شرکت هاي متعدد بهمراه سيستم هاي گوناگون، در کنار يکديگر شده است . با اينکه ايده انجام فعاليت هاي تجاري بر روي اينترنت نسبتا" جديد است ولي اغلب شرکت ها و سازمان ها ، زمان و هزينه زيادي را صرف اين نوع فعاليت ها و تعامل اطلاعاتي مربوطه ، مي نمايند . ارتباط داده ها با سيستم هاي موجود ، يکي از بزرگترين مسائل برنامه نويسان است( خصوصا" در موارديکه داده ها از مراکز و شعب متفاوت يک شرکت دريافت و مي بايست به سيستم هاي اصلي تغذيه گردند ) .

يکپارچگي بين برنامه هاي مختلف
دستيابي به داده ها ي مشترک بين شرکت هاي متعدد ، توسط برنامه هاي متفاوت موجود بر روي سيستم هاي عامل گوناگون ، به يک ضرورت مهم تبديل شده است . بمنظور مبادله اطلاعات بين برنامه هاي متقاضي ، مي بايست در مرحله اول داده ها، ساختيافته بوده تا زمينه استفاده از آنان فراهم گردد.برخي از داده ها در سيستم هاي هاي سلسه مراتبي، شامل سندهاي XML ، برخي ديگر در بانک هاي اطلاعاتي رابطه اي، نظير SQL Server و برخي ديگر، بصورت غيرساختيافته و در فايل هائي تخت (Flat) ذخيره شده اند .

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

فرمت هاي متفاوت XML . فايل هاي XML مي توانند از گرامرهاي متفاوتي استفاده نمايند . مثلا" گرامري، صرفا" از المان ها استفاده نموده و در گرامري ديگر ، از المان ها بهمراه خصلت هاي مربوطه استفاده مي گردد . شرکت ها و موسسات تجاري براي غلبه بر اين نوع مشکل تبديل داده ،مي توانند از تمپليت هاي استاندارد شده استفاده نمايند.

توليد XML از داده هائي با فرمت ديگر . داده ها ي موجود در هر سازمان با فرمت هاي متفاوتي نظير: EDIFACT ,ANSI ,X12 , XML , فايل هاي CSV)Comma Separated value) ، فايل هاي Tab -Separated و موارد ديگر، ذخيره شده اند. در اين راستا ، مي توان ساختاري استاندارد براي داده ها ايجاد تا زمينه استفاده از آنان براي ساير برنامه ها فراهم گردد .

معتبر سازي ساختار داده ها . يکي از مزاياي مهم استفاده از XML در برنامه ها ، ارائه روشي مطلوب بمنظور اشتراک اطلاعات است . با توجه به دريافت داده ها از منابع متفاوت، مي بايست از روشي بمنظور اطمينان از صحت و اعتبار داده ها استفاده گردد .بدين منظور و جهت غلبه بر مشکل فوق، مي توان از ابزارهاي معتبر سازي نظير Schema که در بين تمام برنامه ها و نوع داده ها استاندارد است، استفاده گردد.

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

جستجو براي يک آيتم خاص در داده ها : برنامه ها از داده ها ئي با فرمت متفاوت و ساختاري گوناگون استفاده مي نمايند. برخي از داده ها در ساختارهاي سلسله مراتبي، برخي ديگر در ساختارهاي رابطه اي و برخي ديگر داراي ساختاري خاص نبوده و صرفا" بصورت متن ذخيره مي گردند. بدين منظور لازم است از روشي بمنظور حرکت در طول ساختار استفاده تا به نتايج مطلوب بمنظور بازيابي يک آيتم اطلاعاتي بدرستي و بسرعت دست پيدا کرد .

خلاصه سازي، ترکيب و همبستگي . پس از يافتن اطلاعات مورد نياز، مي خواهيم بر روي آنان عمليات متفاوتي را انجام دهيم . مثلا" ممکن است، قصد تنظيم يک گزارش خاص در رابطه با ميزان فروش ماهانه، وجود داشته باشد. در اين راستا مي توان، داده هاي دريافتي از منابع متفاوت را با يکديگر ترکيب و آنها را با يک فرمت خاص ذخيره و در ادامه پردازش هاي لازم را انجام داد . طراحي دات نت بر اساس استفاده از تکنولوژي محوري XML پايه گذاري شده است . با استفاده از XML ، مي توان عمليات فيلترسازي داده ها را بمنظور کاهش حجم اطلاعاتي انجام و بدين ترتيب صرفا" با داده هائي که به فعاليت مرتبط مي باشند، درگير خواهيم شد .

پردازش ( عمليات ) بر روي داده ها
بمنظور انجام عمليات بر روي داده ها، مي بايست يک ساختار، بافتار(Context) لازم را ارائه نمايد . پس از انجام عمليات بر روي داده ها ، مي بايست از ساختاري بمنظور نمايش نتايج استفاده گردد.در اين رابطه موارد زير مورد توجه خواهد بود :

تبديل داده از XML به فرمت ديگر .در صورتيکه المان ها و خصلت هاي برنامه اي که با آن کار مي شود متفاوت از ساختار XML مربوط به داده هائي باشد که از آن بعنوان منبع تامين اطلاعات ، استفاده مي گردد، مي بايست از روشي براي تبديل داده از يک گرامر XML به شکل ديگر، استفاده گردد. در صورتيکه با يک برنامه وب کار مي شود، مي بايست داده هاي ساختيافته در اسناد XML به اسناد Html بمنظور نمايش بر روي وب سايت ، تبديل گردند.

تغيير ساختار يک سند . در برخي موارد لازم است به يک سند XML المان و يا خصلتي ، اضافه و يا حذف گردد . بدين ترتيب در ساختار سند موجود تغييراتي بوجود مي آيد.

استانداردهاي کنسرسيوم وب در دات نت
امکان استفاده از XML در محيط ها و برنامه هاي متعددي وجود دارد . تحقق خواسته فوق، بکمک استانداردهائي است که توسط کنسرسيوم وب ايجاد شده است. XML در دات نت، استانداردهاي ارائه شده توسط کنسرسيوم وب را حمايت تا زمينه ارتباط متقابل بين برنامه هاي استاندارد شده ، فراهم گردد
لينک مقاله
http://www.srco.ir :منبع

مقالات مرتبط با اين موضوع
XML در دات نت 2 | xml
XML در دات نت | xml
آشنايي با XML قسمت چهارم | xml
آشنايي با XML قسمت سوم | xml
آشنايي با XML قسمت دوم | xml
XML چيست ؟ | xml

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


XML در دات نت 2

در بخش اول اين مقاله به بررسي مفاهيم وچالش هاي موجود در زمينه طراحي و پياده سازي برنامه هاي کامپيوتري بمنظور استفاده در محيط اينترنت اشاره و محيط دات نت ماکروسافت از اين زاويه، مورد بررسي اوليه قرار گرفت . در بخش دوم ، به بررسي استانداردهاي کنسرسيوم وب در دات نت ، کلاس هاي XML در دات نت و امکانات امنيتي در ارتباط با XML ، خواهيم پرداخت .
استانداردهاي کنسرسيوم وب در دات نت
امکان استفاده از XML در محيط ها و برنامه هاي متعددي وجود دارد . تحقق خواسته فوق، بکمک استانداردهائي است که توسط کنسرسيوم وب ايجاد شده است. XML در دات نت، استانداردهاي ارائه شده توسط کنسرسيوم وب را حمايت تا زمينه ارتباط متقابل بين برنامه هاي استاندارد شده ، فراهم گردد.

:Xml Information setکنسرسيوم وب مشخصاتي را بعنوان مجموعه اطلاعات مرتبط با XML ، استاندارد و ارائه نموده است .استاندارد فوق، شامل مجموعه اي از تعاريف بمنظور استفاده توسط ساير مشخصاتي است که بنوعي به اطلاعات موجود در يک سند XML مراجعه مي نمايند. يک سند XML ، حاوي تعدادي از مجموعه اطلاعات ارائه شده در استاندارد فوق است . مشخصات فوق ، اطلاعات لازم بمنظورتشريح ساختار يک سند XML را ارائه مي نمايد .يک سند XML شامل يک مجموعه اطلاعات است، اگر " خوش - شکل " بوده و محدوديت هاي تعريف شده در رابطه با Namespace را در مجموعه اطلاعات ومشخصات XML ، تامين نمايد . اغلب استانداردهاي XML کنسرسيوم وب، از تعاريف ارائه شده در مشخصه فوق ، اقتباس ( مشتق ) شده اند.براي اطلاعات تکميلي مي توان به آدرس http://www.w3.org/TR/xml-infoset مراجعه کرد .

XML 1.0 Namespace . استاندارد فوق ،ضوابط لازم بمنظور ايجاد يک شي داده بصورت يک سند XML ، را تعريف مي نمايد . مشخصات فوق همچنين ،ساختار فيزيکي و منطقي يک سند XML و ساير خصايص مربوطه را تعريف مي نمايد. براي اطلاعات تکميلي مي توان به آدرس http://www.w3.org/Tr/REC-xml مراجعه استفاده کرد.namespace ها درXML يک namespace را تعريف و نحوه استفاده از namespace در زمان ايجاد يک گرامر XML را که شامل المان ها و خصلت هائي است، مشخص مي نمايد . براي اطلاعات تکميلي مي توان به آدرس http://www.w3.org/TR/REC-xml-names مراجعه کرد .

XML Path Language ( XPath) 1.0 : استاندارد XPath ، گرامر و سمنتيک مورد نياز براي آدرس دهي بخش هاي متفاوت يک سند XML را مشخص مي نمايد. XPath ، همچنين شامل امکانات پايه براي انجام عمليات در رابطه با رشته ها ، اعداد و منطق است . براي مشاهده اطلاعات تکميلي مي توان به آدرس http://www.w3.org/TR/XPath مراجعه کرد .

XSL Transformation (XSLT) 1.0 : استاندارد XSLT ، گرامر و سمنتيک XSLT را تعريف و زباني براي تبديل اسناد XML به فرمت هاي ديگر است . تبديل مورد نظر( بيان شده ) در XSLT يک Style Sheet ناميده مي شود . براي مشاهده اطلاعات تکميلي مي توان به آدرس http://www.w3.org/TR/XSLT مراجعه کرد .

Document Object Model )DOM) : استاندارد DOM سطح يک و دو، اينترفيس لازم را بمنظور دستيابي و انجام عملياتي نظير: بهنگام سازي Style ،محتويات و ساختار يک سند از طريق برنامه نويسي ، فراهم مي نمايد . براي مشاهده اطلاعات تکميلي مي توان به آدرس http://www.w3.org/DOM مراجعه کرد .

XML Schema Definition Language )XSD) : استاندارد XSD ، روشي براي تشريح ساختار ، محتويات و سمنتيک يک سند XML است . Schema امکان استفاده از واژه هاي مشترک را فراهم مي نمايد . براي مشاهده اطلاعات تکميلي مي توان به آدرس http://www.w3.org/XML/Schema مراجعه کرد .

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

استاندارد کنسرسيوم وب | namespace مربوطه در دات نت
XML 1.0 and Namespaces in XML | System.Xml
XPath | System.Xml System.Xml.XPath
XSLT | System.Xml.Xsl
DOM Level 1 | System.Xml
DOM Level 2 Core | System.Xml
XML Schemas | System.Xml System.Xml.Schemas
XML Schema Object Model(SOM) | System.Xml.Schemas

دات نت با ارائه namespace و کلاس هاي پايه از استانداردهاي ارائه شده توسط کنسرسيوم وب، حمايت مي نمايد . جدول زير نسخه هاي پياده سازي شده استانداردهاي کنسرسيوم وب، در دات نت را نشان مي دهد .

W3C XML standard | .NET Framework namespace | .NET Framework class
XML 1.0 and Namespaces in XML | System.Xml | Not applicable
XPath | System.Xml System.Xml.XPath | XPath base class
XSLT | System.Xml.Xsl | XslTransform base class
DOM Level 1 | System.Xml | XmlDocument class
DOM Level 2 Core | System.Xml | XmlDocument class
XML Schemas | System.Xml System.Xml.Schemas | XmlSchema
XML Schema Object Model(SOM) | System.Xml.Schemas | XmlSchema

مروري بر کلاس هاي XML در دات نت
کلاس هاي پايه تجريدي در دات نت ، اساس مبادله اطلاعات مي باشند . جدول زير کلاس هاي پايه در فريمورک دات نت را نشان مي دهد :

Abstract base class | کلاس های مشتق شده
XmlReader | XmlTextReader XmlNodeReader XmlValidatingReader
XmlWriter | XmlTextWriter
XmlNavigator | XmlPathNavigator
XmlResolver | XmlUrlResolver

مقايسه بين MSXML 4.0 و دات نت
ماکروسافت دو روش متفاوت بمنظور کار با XML ، در اختيار برنامه نويسان قرار داده است :

MSXML، که در ابتدا پارسر XML ناميده مي شد.
کلاس هاي XML فريمورک دات نت
MSXML 4.0 ، با پارسر MSXML جايگزين شده است . عملکرد MSXML 4.0 در اغلب موارد مشابه کلاس هاي فريمورک دات نت است . تفاوت عمده در نحوه استفاده از عناصر است . در MSXML بمنظور ارائه امکانات از اشياء COM)Componenet Object Model) استفاده شده ( ازManaged code استفاده نمي گردد ) و داراي امکانات از قبل ساخته اي براي SAX)Simple API for XML) است .
MSXML 4.0 ، شامل سرويس هاي زير است :

DOM
XSD
XPath 1.0
XSLT 1.0
SAX ( يک مدل برنامه نويسي و مشابه با DOM است )
Schema Object Model)SOM) ، شامل امکانات API اضافه ، بمنظور دستيابي به سندهاي XML Schema از طريق برنامه نويسي است .
کلاس هاي XML فريمورک دات نت ، عمليات مشابهي را نظير MSXML 4.0 انجام مي دهند. طراحي کلاس هاي فوق بگونه اي است که امکان استفاده از آنان در يک محيط مديريت يافته، خصوصا" سرويس هاي وب XML ،وجود دارد .
جدول زير ويژگي هر يک را نشان مي دهد :

استاندارد کنسرسيوم وب | MSXML ( محيط مبتنی بر COM ) | کلاس های XML فريمورک دات نت ( محيط مديريت يافته دات نت )
XML 1.0 and Namespaces in XML | yes | yes
XPath | yes | yes
XSLT | yes | yes
DOM Level 1 | yes | yes
DOM Level 2 Core | no | yes
XML Schemas | yes | yes
XML Schema Object Model(SOM) | yes (فقط خواندنی) | yes
Simple API for Xml (SAX) | yes | no

XML و امنيت در دات نت
XML ،مهمترين امکان ذخيره سازي داده ها و انتقال اطلاعات د ر فريمورک دات نت محسوب مي گردد. بنابراين تمام ملاحظات امنيتي در فريمورک دات نت، به رويکردهاي امنيتي XML مربوط مي گردد . دستيابي به سرويس هاي وب XML مي تواند محدود به سرويس گيرندگان تائيد شده و مجاز باشد( مشابه دستيابي کاربران مجاز به يک وب سايت ) .

مدل مبتني بر شي XML براي رمزنگاري اشياء
کلاس SecurityElement ، مدل XML لازم بمنظور رمزکردن اشياء را ارائه مي نمايد. کلاس فوق ، بمنظور استفاده همراه يک سيستم ايمني در نظرگرفته شده است و امکان استفاده از آن بعنوان يک کلاس شي XML عمومي وجود نخواهد داشت .

XML signature . کنسرسيوم وب در حال پياده سازي مشخصه اي براي امضاء ديجيتالي مبتني بر XML است . System.Security.Cryphtography.xml ،مدلي مبتني بر XML براي استفاده از سيستم امنيتي فريمورک دات نت بوده که از امضاهاي XML حمايت مي نمايد. مدل فوق اين امکان را به اشياء XML خواهد داد که از طريق يک امضاء ديجيتالي تاييد گردند . رمزنگاري باعث حفاظت اطلاعات در مقابل نمايش و يا تغييرات شده وبدين ترتيب يک کانال ايمن ارتباطي ايجاد خواهد شد .

رمزنگاري سرويس هاي وب XML بمنظور انتقال . برنامه هاي مبتني بر دات نت از پروتکل SOAP ، بمنظور ارتباط با سرويس هاي وب XML استفاده مي نمايند( فرمت اوليه پيام ها ) . کتابخانه کلاس فريمورک دات نت ، ضمائم SOAP را بمنظور اجراء ، همراه با يک متد سرويس وب XML ، ارائه مي نمايد . namespace ، شامل کلاس هائي است که پروتکل هاي مورد نياز براي انتقال داده ها را فراهم مي نمايد .

ارسال مدارک تائيد شده .در موارديکه يک سند XML ايمن شده باشد ،بدون ارسال مدارک لازم، امکان دستيابي و استفاده از آن وجود نخواهد داشت. کلاس XmlTextReader ،امکان ارسال مدارک را از طريق استفاده از کلاس CredentialCache موجود در System.Net فراهم مي نمايد .
لينک مقاله
http://www.srco.ir :منبع

مقالات مرتبط با اين موضوع
XML در دات نت 2 | xml
XML در دات نت | xml
آشنايي با XML قسمت چهارم | xml
آشنايي با XML قسمت سوم | xml
آشنايي با XML قسمت دوم | xml
XML چيست ؟ | xml

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


ورود اطلاعات فارسی با استفاده از جاوااسکريپت

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

در ويندوز خود قابليت فارسی نويسی را فعال نماييد و پس از آن در Access يك Table با نام test وبا يك فيلد به نام test از نوع text ايجاد نماييد. سپس با استفاده از خود Access اطلاعاتی به زبان فارسی وارد نماييد. سپس از Access خارج شده و با استفاده از ASP به بانك اطلاعاتی Access متصل شده و اطلاعات وارد شده را خوانده و نمايش دهيد. مشاهده خواهيد نمود كه اطلاعات نمايش داده شده داخل مرورگر با اطلاعات وارد شده توسط شما در داخل Access متفاوت می باشد.

برای حل اين مشكل چه بايد كرد؟
برای حل اين مشكل بايد اطلاعات از خارج از Access و با استفاده از ASP و يك تابع Javascript كه صفحه كليد را در همه ويندوزها اعم از فارسی و انگليسی، فارسی نموده و امكان تايپ فارسی را فراهم ميكند، وارد شوند. روش كار به اين صورت است كه در يك فرم HTML و در داخل يك Input Box هنگام فشرده شدن هر كليدی از صفحه كليد، تابع Javascript فرا خوانده شده و معادل فارسی حرف وارد شده را نمايش ميدهد. برای نمايش حروف فارسی لازم است كه از charset=windows-1256 استفاده نماييد. فونت صفحه را نيز يكی از دو فونت Times New Roman و يا Tahoma انتخاب نماييد. اين دو فونت فونتهای استاندارد ويندوز بوده و برای ديده شدن متون فارسی نيازی به نصب فونت جديد روی سيستم کاربر نخواهد بود. Javascript استفاده شده در زير آمده است:

#$%،گ)(+و-./0123456789:ك,=.؟@ِذ}ىُىلآـ،/د؛َءٍف{ًْإ~جژچ^_پشذزيثبلاهتنمئدخحضقسفعرصطغظ<|>ّ'.charCodeAt(key-32);
else if (e)
e.which=' !"#$%،گ)(+و-./0123456789:ك,=.؟@ِذ}ىُىلآـ،/د؛َءٍف{ًْإ~جژچ^_پشذزيثبلاهتنمئدخحضقسفعرصطغظ<|>ّ'.charCodeAt(key-32);
}
return true;
}
//-->
</SCRIPT>

پس از طراحی فايل HTML نوبت به ايجاد فايل ASP می رسد. در فايل ASP بايد اطلاعات وارد شده در فرم HTML را دريافت نموده و در بانك اطلاعاتی Access توسط برنامه خود بنويسيد. نكته جالب اين است كه اگر وارد Microsoft Access شويد و اطلاعات وارد شده توسط برنامه خود را مشاهده نماييد اثری از حروف فارسی مشاهده نخواهيد کرد. حال اگر دوباره توسط برنامه ASP اوليه به بانك اطلاعاتی متصل شويد و اطلاعات دريافت شده را داخل مرورگر نمايش دهيد اطلاعات به صورت فارسی نمايش داده ميشوند. لازم به ذكر است كه بايد از charset=windows-1256 در فايل ASP كه اطلاعات فارسی را نمايش ميدهد استفاده نماييد.
لينک مقاله
http://www.iranasp.net :منبع

مقالات مرتبط با اين موضوع
ورود اطلاعات فارسی با استفاده از جاوااسکريپت | asp
يک شمارنده ساده يا کونتور | asp
ارسال ايميل در ASP ساده و کار آمد | asp
درج تاريخ شمسی | asp
فرستادن فايل يا Upload از صفحه وب | asp
ارسال ايميل با کمک ASP | asp
شي RESPONSE و استفاده از فايل هاي include | asp
برنامه کاربردي تحت وب چيست ؟ | asp
فرم ها در ASP | asp
طرز ساخت کوکي ها | asp
آبجکت Response در ASP | asp
راه اندازي ASP | asp
شروع کار با ASP | asp

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


معرفی ADO و کاربرد آن در ASP بخش 1 و2

ارتباط ASP با بانك های اطلاعاتی از طريق واسطی بنام ADO انجام می گيرد. با استفاده از رابط فوق می توان به انواع داده های ذخيره شده بسادگی، در كمترين زمان و صرفا بكمك يك مسير دستيابی پيدا كرد. به همين دليل می توان ادعا كرد كه ADO ساده ترين روشی است كه تاكنون برای ذخيره و بازيابی داده ها بوجود آمده است.ADO نسخه 5 / 2 دارای پنج شئ اساسی با نام : Connection , Command, RecordSet , Record , Stream است. دو شی Record و Stream در نسخه قبلی ADO وجود نداشتند. در اين مقاله به بررسی برخی از اشياء عمده ADO و متدهای مربوطه آنها خواهيم پرداخت.

شئ Connection
قبل از هر گونه ذخيره و بازيابی داده ها از بانك اطلاعاتی می بايست با ايجاد و مقدار دهی اوليه يك Connection زمينه لازم جهت ارتباط با بانك اطلاعاتی را بوجود آورد. در ADO با استفاده از شی Connection يك ارتباط با بانك اطلاعاتی ايجاد و پس از انجام عمليات دلخواه در رابطه با بانك اطلاعاتی و در زمانيكه به وجود آن ديگر نياز نباشد، می توان آن را حذف كرد. Open كردن يك ارتباط به بانك اطلاعاتی پروژه ای واحد با نام ( ADODB(ActiveX Data Objects Database بوده كه خود شامل تمامی اشياء ADO است. برای ايجاد يك Connection نظير ساير اشياء ASP از متد Server.CreateObject استفاده می گردد.

Dim Conn
Set Conn = Server.CreateObject("ADODB.Connection")

بصورت پيش فرض Connection فقط خواندنی می باشند، شما می توانيد وضعيت فوق را تغيير داده و در صورت نياز و بكمك صفات مربوط به شی فوق ارتباطاتی از نوع خواندنی / نوشتنی و يا فقط نوشتنی ايجاد نمائيد. در زمان استفاده از ADO می توان از مجموعه ای ثوابت كه دربردارنده مقادير متفاوتی برای آيتم های متفاوت می باشند و پيشاپيش تعريف شده اند استفاده كرد. اين ثوابت در فايلی با نام Adovbs.inc قرار دارند. بمنظور استفاده از ثوابت فوق در صفحات ASP خود، می بايست فايل فوق را بكمك دستور Include به برنامه های خود ملحق نمائيم.

<!-- #INCLUDE FILE="adovbs.inc" -->

اگر فايل adovbs.inc را توسط اديتوری نظير Notepad فعال نمائيد، ثوابت تعريف شده را بصورت مجموعه ای از گروهها مشاهده خواهيد كرد. پس از ايجاد يك Connection با بانك اطلاعاتی می توان نوع ( Mode ) ارتباط را بكمك استفاده از ثوابت تعريف شده مشخص نمود. در صورتيكه بخواهيم از بانك اطلاعاتی صرفا اطلاعاتی را بخوانيم از ثابت adModeRead ، فقط اطلاعاتی را در بانك اطلاعاتی بنويسيم از ثابت adoModeWrite و در نهايت در صورتيكه قصد داريم بطور همزمان اطلاعاتی را از بانك اطلاعاتی خوانده و در آن اطلاعات جديدی را نيز بنويسيم از ثابت adoModeReadWrite استفاده می گردد. توصيه می گردد با توجه به نوع رفتاری كه با بانك اطلاعاتی خواهيم داشت آن را باز نمائيم چراكه در صورتيكه صرفا قصد خواندن و يا نوشتن را در يك بانك اطلاعاتی داشته باشيم و نخواهيم دو عمليات را با هم انجام دهيم، باز كردن بانك اطلاعاتی بصورت هم خواندنی و هم نوشتنی ( adoModeReadWrite ) سرعت دستيابی به بانك اطلاعاتی را كاهش خواهد داد.

ConnectionString
پس از تعيين Mode، می بايست صفت Connectionstring مربوط به شی Connection را مقدار دهی مناسب نمود. صفت فوق دارای چندين بخش بوده كه می بايست مشخص گردند: نام Provider، نام سرويس دهنده بانك اطلاعاتی، نام بانك اطلاعاتی كه قصد استفاده از آن را داريد، User Id لازم جهت اتصال به بانك اطلاعاتی (UID)، رمز عبور برای كاربرخاص ( PWD ).

هر يك از بخش های فوق توسط علامت ";" از هم جدا می شوند. مثلا در ساده ترين حالت می توانيد از يك Data Source Name يا DSN يا مربوط به ODBC، يك User ID، و يك رمز عبور جهت اتصال به بانك اطلاعاتی استفاده نمائيد. يك DSN خود شامل نام Provider، نام سرويس دهنده بانك اطلاعاتی و نام بانك اطلاعاتی بوده و ديگر نيازی به مشخص نمودن مجدد آنها نخواهد بود. به مثال زير توجه فرمائيد.

Dim Conn
Set Conn = Server.Create0bject("ADODB.Connection")
Conn.Mode = adModeReadWrite
Conn.ConnectionString = "DSN=myDSN;UID=Javad;PWD=7474;"

روش فوق بهترين حالت ايجاد يك ارتباط نيست زيرا DSN بصورت پيش فرض از MSDASQL Provider استفاده می كند. اما JET OLEDB Provider بمراتب سريعتر و قابليت های بيشتری را دارا است. بنابراين می توان جهت ارتباط با بانك اطلاعاتی مطابق زير عمل نمود:

Dim Conn, ConnStr
ConnStr= "PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=" + Server.MapPath(Path2DB)
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Mode = adModeReadWrite
Conn.ConnectionString = ConnStr

ConnectionString شامل نام Provider، نام سرويس دهنده بانك اطلاعاتی و نام بانك اطلاعاتی است. در مثال فوق از تابع Server.MapPath برای ترجمه مسير مجازی به مسير واقعی استفاده شده است. مثلا يك بانك اطلاعاتی موجود درwww.Test.com/test.mdb می تواند بصورت واقعی در مسير E:\web\Mydatabase\Test.mdb قرار گرفته باشد. تابع Server.MapPath آدرس نوع اول را به آدرس نوع دوم ترجمه خواهد كرد. توجه داشته باشيم كه شی ADODB.Connection نيازمند آگاهی از مسير واقعی بانك اطلاعاتی است. فراموش نكنيم كه قبل از باز نمودن Connection، تمامی تغييرات لازم بر روی صفت های مربوطه اعمال گردد. در صورتيكه بخواهيم پس از ايجاد ارتباط با بانك اطلاعاتی يك يا چند صفت مرتبط را تغيير دهيم، می بايست در ابتدا ارتباط خود را با بانك اطلا عاتی قطع (Connection، بسته گردد) و در ادامه تغييرات لازم را از طريق صفات مربوطه اعمال و مجددا Connection را برقرار نمود.

بمنظور باز نمودن يك Connection از متد Open مربوط به شئ Connection استفاده می گردد.

متد Connection.Open
در صورتيكه متد فوق بدون خطا اجرا گردد، يك ارتباط كاری ( عملياتی) با بانك اطلاعاتی ايجاد شده است.

متد Connection.Execute
برای بازيابی داده ها از يك بانك اطلاعاتی توسط ADO سه روش عمده وجود دارد. تمامی آنها در مرحله اول نياز به ارتباط با بانك اطلاعاتی خواهند داشت. ساده ترين حالت استفاده از متد Execute مربوط به شی Connection است. متد فوق سه پارامتر را خواهد داشت:- يك دستور SQL، يا Query، Table، View يا نام يك Stored Procedure كه توسط پارامتر CommandText مشخص خواهد شد.
• يك متغير با نام RecordsAffected، كه شامل تعداد ركوردهائی خواهد بود كه با توجه به Query اجرا شده توسط متد Execute مشخص می شود.
• يك ثابت اختياری با نام CommandTypeEnum كه به بانك اطلاعاتی خواهد گفت چه نوع عبارت و يا Query را می خواهيد اجرا نمائيد و اينكه يك شی Recordset را برگرداند يا خير.

پس از اجرای متد Execute ( به هر روش ممكن )، ركوردهای برگردانده شده در شئ RecordSet برگردانده خواهند شد. در صورتيكه از دستور SELECT استفاده شود ركوردهای برگردانده شده در شی RecordSet قرار خواهند گرفت. اما زمانيكه از دستورات INSERT و يا UPDATE استفاده گردد رکوردی باز گردانده نخواهد شد.

شئ RecordSet
از شی RecordSet جهت نگهداری رکوردها يا جدول دريافتی استفاده می گردد. اين شئ نظير يك جدول بانك اطلاعاتی دارای سطرها و ستون هائی است. در حقيقت شئ فوق يك تصور مجازی از يك جدول خواهد داد و بصورت فيزيكی يك جدول نيست. چراكه مقادير مورد نظری كه در ستون های اين شئ قرار می گيرد ممكن است حاصل تركيب (Join) چندين جدول ديگر باشند.

متد RecordSet.Open
در صورتيكه در هنگام استفاده از شئ RecordSet به هر نوع Cursor ( اشاره گری به هر يك از سطرهای موجود در جدول ) نياز داشته باشيد ( صرفا نه يك Cursor كه بصورت Forward-Only و يا Read-Only باشد ) می بايست به جای استفاده از متد Execute مربوط به شی Connection، مستقيما بانك اطلاعاتی را باز کنيد. شئ RecordSet نيز دارای متدی با نام Open است كه چندين پارامتر را بعنوان پارامتر اخذ می كند.

Recordset.Open CommandText, Connection|ConnectionString, Cursor-Type, LockType, Options

CommandText شامل SQL query بوده، Connection|ConnectionString شامل يك رجوع به شئ Connection باز شده و يا يك پارامتر معتبر Connectionstring است. پارامتر CursorType مقدار خود را از ثابتی با نام adCursorTypeEnm مطابق زير اخذ خواهد كرد:

• adopenForwardOnly: يك Cursor كه فقط امكان حركت بسمت جلو را دارد، برمی گرداند. ( پيش فرض). اگر نوع Cursor را مشخص ننمائيد، ADO همواره Cursor از اين نوع را بر می گرداند. همانگونه كه از نام آن مشخص است، صرفا می توان بسمت جلو در شئ RecordSet حركت نمود.
• AdOpenKeyset: يك Cursor از نوع Keyset را برمی گرداند. در چنين حالتی می توان جهت و نوع حركت را به هر نوع دلخواه انتخاب نمود (اولين ركورد، آخرين ركورد، بسمت جلو، بسمت عقب...). سرويس دهنده برای هر يك از سطرهای موجود در شئ RecordSet پس از اجرای Query يك Bookmark، ايجاد می كند. اين Bookmark ها تا زمانيكه شئ Recordset حيات دارد تغيير نخواهند كرد بنابراين در صورتی كه يك ركورد جديد توسط كاربر ديگری در بانك اطلاعاتی در آن زمان درج گردد، آن رکورد جديد برای ما قابل رؤيت نخواهد بود.
• adOpenDynamic: يك Cursor پويا را برمی گرداند. اين نوع Cursor مشابه Keyset است با اين تفاوت كه امكان مشاهده ركوردهای جديد نيز وجود خواهد داشت. يك Cursor پويا بصورت پيوسته ركوردهای جديد و يا تغيير يافته را بررسی و حاصل را در شی RecordSet بصورت پويا منعكس خواهد كرد.
• adOpenStatic: يك Cursor ايستا بهمراه تعداد ثابتی از ركوردها را برمی گرداند. در چنين حالتی تغييرات و درج ركوردهای جديد در بانك در همان لحظه مشاهده نخواهد شد مگر اينكه مجددا درخواست بازيابی اطلاعات از بانك صادر شود.

پارامتر LockType، به ADO خواهد گفت كه چگونه با مسئله Lock در بانك اطلاعاتی رفتار نمايد. در حالت كلی می بايست برای اعمال تغييرات و يا درج ركوردهای جديد، پيش بينی های لازم را انجام داد. چراكه Lock ايجاد شده توسط يك كاربر می تواند باعث بروز مسائلی برای ساير كاربران گردد. مقدار اين پارامتر مطابق زير خواهد بود:

• adLockReadOnly: فقط خواندنی، امكان تغيير داده ها وجود نخواهد داشت.
• adLockPessimistic: قويترين نوع Lock است. ركوردهائی كه بدين صورت Lock خواهند شد توسط ساير كاربران قابل دستيابی نخواهند بود. ركوردها زمانيكه سرويس دهنده آنها را برمی گرداند Lock شده و تا زمانيكه شئ RecordSet وجود دارد، امكان استفاده از اين ركوردها برای سايرين وجود نخواهد داشت.
• adLockoptimistic: اين نوع Lock صرفا در زمان بهنگام سازی يك ركورد اعمال شده و بلافاصله ركورد از حالت Lock آزاد می گردد. بنابراين در مراحلی كه لازم است يك ركورد تغيير يابد می توان از اين نوع Lock استفاده كرد. و پس از اعمال تغييرات بصورت اتوماتيك، Lock آزاد خواهد شد.
• AdLockBatchOptimistic: اين نوع Lock مشابه Optimistic است با اين تفاوت كه آنها برای بهنگام سازی Batch مورد استفاده قرار می گيرند. در اين حالت مجموعه ای از ركوردها در يك مقطع زمانی بهنگام سازی خواهند شد ( بجای اينكه هر كورد بهنگام سازی گردد ). با توجه به نوع نرم افزار طراحی شده و ميزان محاوره ای بودن آن، می توان تصميم به استفاده از اين نوع Lock و يا Optimistic نمود.

آخرين پارامتر متد Recordset.Open، پارامتراختياری flag است. كه نوع Query را مشخص خواهد كرد ( Table,View,Stored Procedure ).

متد Move
پس از باز نمودن يك شئ RecordSet، با استفاده ازمتد Move، می توان در طول سطرهای موجود در شئ RecordSet با توجه به نوع cursor حركت كرد. شئ RecordSet دارای يك صفت با نام RecordCount بوده كه تعداد ركوردهای موجود در شئ RecordSet را مشخص می كند. تصور كنيد كه شئ RecordSet نظير يك جدول است با يك سطر خالی در ابتدا و يك سطر خالی در انتهای آن و اشاره گر ی كه در هر لحظه به يك ركورد اشاره می كند. در واقع با استفاده از متد Move، موقعيت اشاره گر فوق تغيير خواهد كرد ( اشاره گر حركت خواهد كرد) . شئ RecordSet دارای دو متد ديگر با نام EOF و BOF است كه زمان حضور اشاره گر در ابتدا و يا انتهای ركوردها را مشخص خواهند كرد. اين دو متد از نوع Boolean ( درست / نادرست ) هستند.

While NOT RecordSet.EOF در اين مقاله به بررسی برخی مثال های كاربردی از نحوه ارتباط ASP و ADO برای ايجاد وب سايت های متكی بر بانك های اطلاعاتی خواهيم پرداخت. قبل از پرداختن به مثال های مربوطه، در ابتدا لازم است كه يك بانك اطلاعاتی نمونه بهمراه يك جدول را تعريف كنيم. به كمك Access (نوع نسخه آن هر چيزی می تواند باشد) يك بانك اطلاعاتی با نام Students.mdb ايجاد و در آن صرفا يك جدول با نام Student كه شامل فيلدهای اطلاعاتی زير است، را تعريف می كنيم.

ID: شماره دانشجوئی يك دانشجو را در خود نگهداری خواهد كرد. فيلد فوق Primary Key خواهد بود.
FirstName: نام دانشجو را در خود نگهداری خواهد كرد.
LastName: نام خانوادگی دانشجو را در خود ذخيره خواهد كرد.
DateOfBirth: تاريخ تولد يك دانشجو را در خود نگهداری كرد.
Email: آدرس پست الكترونيكی دانشجو را در خود ذخيره خواهد كرد.

مثال ۱- بازيابی اطلاعات از بانك اطلاعاتی دانشجويان
در اين مثال جهت ارتباط با بانك اطلاعاتی از ODBC استفاده نشده است. برای بازيابی اطلاعات از بانك اطلاعاتی فوق از SQL SELECT استفاده می شود. متن برنامه بازيابی اطلاعات از بانك اطلاعاتی دانشجويان بصورت زير است.

<HTML>
<HEAD><TITLE>Student Records</TITLE></HEAD>
<BODY>
<%
Dim DBSet DB = Server.CreateObject ("ADODB.Connection")
DB.Open ("PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=" + "C:\MyDb\Students.mdb")
Dim RSSet RS = Server.CreateObject ("ADODB.Recordset")
RS.Open "SELECT * FROM Students", DB

If RS.EOF And RS.BOF Then
Response.Write "There are 0 records."
Else
RS.MoveFirst
While Not RS.EOF
Response.Write RS.Fields ("FirstName")
Response.Write RS.Fields ("LastName")
Response.Write RS.Fields ("Email")
Response.Write "<HR>"
RS.MoveNext
Wend
End If
%>
</BODY>
</HTML>

مثال ۲- افزودن يک رکورد جديد
در اين مثال ركوردهای جديد را در بانك اطلاعاتی دانشجويان ذخيره خواهيم كرد. برای درج ركوردهای جديد در بانك اطلاعاتی می توان از INSERT INTO استفاده كرد. يكی ديگر از روش های درج ركورد در بانك اطلاعاتی استفاده از شئ RecordSet است كه بمراتب ساده تر مورد قبلی گفته شده است. در مثال فوق برای درج ركوردها در بانك اطلاعاتی از مورد دوم استفاده شده است. متن برنامه درج ركورد جديد در بانك اطلاعاتی دانشجويان بصورت زير است.

<HTML>
<HEAD>
<TITLE>Student Records</TITLE>
</HEAD>
<BODY>
<%
Dim DBSet DB = Server.CreateObject ("ADODB.Connection")
DB.Mode = adModeReadWrite
DB.Open ("PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=" + C:\MyDb\Students.mdb")
Dim RSSet RS = Server.CreateObject ("ADODB.Recordset")
RS.Open "Students", DB, adOpenStatic, adLockPessimistic
RS.AddNew
RS ("FirstName") = "name"
RS ("LastName") = "family"
RS ("Email") = "name @domain.com"
RS ("DateOfBirth") = CDate("25 Mar, 2002")
RS.Update
%>
</BODY>
</HTML>

در مثال فوق ركورد دانشجوئی با نام "name" و نام خانوادگی "family" بهمراه آدرس پست الكترونيكی مربوطه و تاريخ تولد آن در بانك اطلاعاتی دانشجويان درج خواهد شد. اقلام اطلاعاتی مربوط به درج يك ركورد جديد را می توان با طراحی يك فرم از كاربران اخذ و پس از تكميل و ارسال فرم مربوطه، مقادير متناظر در هر يك از فيلدهای موجود در فرم اخذ اطلاعات به مقادير مربوطه در بانك اطلاعاتی نسبت داده شود (كار بسيار ساده ای است ! امتحان كنيد).

مثال ۳- بهنگام سازی ركوردهای بانك اطلاعاتی دانشجويان
در اين مثال با نحوه بهنگام سازی ركوردهای موجود در بانك اطلاعاتی دانشجويان آشنا خواهيم شد. متن برنامه بهنگام سازی ركورد دانشجوئی در بانك اطلاعاتی دانشجويان بصورت زير است.

<HTML>
<HEAD>
<TITLE>Student Records</TITLE>
</HEAD>
<BODY>
<%
Dim DBSet DB = Server.CreateObject ("ADODB.Connection")
DB.Mode = adModeReadWrite
DB.Open ("PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=" + "C:\MyDb\Students.mdb")
Dim RSSet RS = Server.CreateObject ("ADODB.Recordset")
RS.Open "SELECT * FROM Students WHERE FirstName = ''name", DB, adOpenStatic, adLockPessimistic
RS ("Email") = "name@domain.com"
RS ("DateOfBirth") = CDate("26 Mar, 2001")
RS.Update
%>
</BODY>
</HTML>

در برنامه فوق ركورد دانشجوئی با نام "name" انتخاب و فيلدهای آدرس پست الكترونيكی (Email) و تاريخ تولد (DateIfBirth) آن تغيير و حاصل مجددا در بانك اطلاعاتی دانشجويان ثبت شده است.

مثال ۴- حذف يك ركورد
در اين مثال با نحوه حذف يك ركورد در بانك اطلاعاتی دانشجويان آشنا خواهيم شد. متن برنامه حذف يك ركورد از بانك اطلاعاتی دانشجويان بصورت زير است.

<HTML>
<HEAD>
<TITLE>Student Records</TITLE>
</HEAD>
<BODY>
<%
Dim DBSet DB = Server.CreateObject ("ADODB.Connection")
DB.Mode = adModeReadWrite
DB.Open ("PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=" + "C:\MyDb\Students.mdb")
DB.Execute ("DELETE * FROM Students WHERE FirstName = 'name'")
%>
</BODY>
</HTML>

در مثال فوق ركورد دانشجوئی با نام "name" از بانك اطلاعاتی دانشجويان حذف شده است. در زمان حذف يك ركورد از بانك اطلاعاتی به دو نكته مهم می بايست توجه كرد: اولا امكان معروف Undo وجود ندارد. بنابراين ركوردی كه حذف می گردد، امكان برگرداندن آن وجود ندارد. ثانيا اگر در زمان اجرای DELETE ، عبارت WHERE حذف گردد، تمامی ركوردهای موجود در جدول حذف خواهند گرديد.

متدهای Sort و Search
با استفاده از متدهای شئ RecordSet، می توان عمليات مرتب سازی (Sort) و جستجو (Search) را انجام داد. برای مرتب سازی يك مجموعه از ركوردها نام فيلد مورد نظری را كه می خواهيم مرتب سازی بر اساس آن انجام شود را به صفت Sort نسبت خواهيم داد. مثلا اگر بخواهيم مجموعه ای از ركوردها را كه توسط اجرای SELECT * FROM PhoneBook برگردانده شده است را براساس نام خانوادگی (LastName) مرتب نمائيم، می توان دستور RecordSet.Sort = "LastName" را استفاده كرد. برای مرتب سازی ركوردها براساس بيش از يك فيلد بصورت RecordSet.Sort = "LastName, FirstName" عمل می نمائيم. برای مرتب سازی ركوردها بصورت صعودی ( پيش فرض است )، يا نزولی بصورت RecordSet.Sort = "LastName, FirstName DESC" عمل می کنيم.

برای جستجوی يك ركورد بخصوص در بين مجموعه ركوردهای برگردانده شده از متد Find شئ RecordSet استفاده می گردد. شرط جستجو را بصورتی كه در يك SQL Where است، مشخص خواهيم كرد و پس از اجرای متد Find، شئ RecordSet به اولين موردی كه پيدا كرده است اشاره خواهد كرد و در صورتيكه ركوردی پيدا نشود،EOF ارزش درست را پيدا خواهد كرد. متد Find بغير از شرطی كه نظير SQL WHERE برای آن مشخص می كنيم، می تواند دارای سه پارامتر اختياری ديگر باشد:

• SkipRecords: تعداد ركوردهائی را كه می بايست قبل از عمليات جستجو، صرفنظر (Skip) نمايد، مشخص خواهد كرد.
• SearchDirection: جهت حركت جستجو در مجموعه ركوردها را مشخص خواهد كرد. adSearchForward ( بسمت جلو) ويا adSearchBackward( از آخر بسمت اول )
• Start: تعداد ركوردهائی را كه می بايست برای جستجو شروع كرد مشخص می كند.

شئ Field
با اينكه تاكنون ما به شئ RecordSet بصورت يك جدول نگاه می كرديم، اما اين صرفا يك مدل فرضی برای راحتی تصور آن است. شئ RecordSet در حقيقت شامل يك بردار دو بعدی از شئ Field است. شئ Field شامل داده است. بنابراين هر شئ از اين نوع دارای يك اندازه، يك مقدار و يك نوع بخصوص است. شئ فوق همچنين دارای مجموعه ای از صفات است. در اكثر موارد شايد نيازی نباشد كه با صفات و متدهای شئ فوق مستقيما كار كنيم، اما مطالعه آنها برای موارد پيش بينی شده در طراحی صفحات ASP كه قصد ارتباط با بانك های اطلاعاتی از طريق ADO را دارند، توصيه می گردد.
لينک مقاله
http://www.iranasp.net :منبع

مقالات مرتبط با اين موضوع
ارتباط به منابع داده در ADO.NET | ado
ASP.NET و پايگاه داده | ado
مقايسه ADO و ADO.NET | ado
بررسی شیئ DataView در ASP.NET | ado
معرفی ADO و کاربرد آن در ASP بخش 1 و2 | ado

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آشنائی با ASP.NET
NET نسل بعدی Active Server Pages يا ASP است که توسط شرکت ميکروسافت ارائه شده است. اين محصول توسط ميکروسافت بعنوان شاخص اصلی فناوری در ساخت سايتهای وب در نظر گرفته شده است. با استفاده از ASP.NET می توان هم اينترانت کوچک يک شرکت را ساخت و هم يک سايت وب تجاری خيلی بزرگ را طراحی و پياده سازی نمود. مهمترين نکاتی که در طراحی اين محصول در نظر گرفته شده است راحتی استفاده و بالا بودن کارائی و قابليت آن می باشد. در زير برخی ويژگيهای ASP.NET را بررسی می کنيم.

• صفحات ASP.NET کامپايل می شوند.
هنگامی که يک صفحه ASP.NET برای اولين بارتوسط يک مراجعه کننده به سايت فراخوانی می شود، آن صفحه ابتدا کامپايل شده و بر روی سرور نگهداشته می شود و در فراخوانی های بعدی از آن استفاده می شود. اين بدين معنی است که صفحات ASP.NET خيلی سريع اجرا می شوند.

• صفحات ASP.NET با ابزارهای روی سرور ساخته می شوند.
با ابزارهای موجود در ASP.NET می توان صفحات پيچيده وب را براحتی طراحی نمود. بعنوان مثال با استفاده از ابزار DataGrid می توان به آسانی داده های موجود در يک بانک اطلاعاتی را تحت وب نمايش داد.

• مجموعهASP.NET عضوی از بدنه NET. است.
بدنه NET. دارای بيش از ۴۵۰۰ کلاس آماده جهت استفاده در ASP.NET است. اين کلاس ها تقريبا هر نيازی را در برنامه نويسی برآورده می کنند. بعنوان مثال از اين کلاس ها می توان جهت توليد تصاوير بر حسب تقاضا، به رمز درآوردن يک فايل و يا ارسال يک نامه استفاده کرد.

مقايسه ASP.NET و ASP کلاسيک
ASP.NET نسل بعدی ASP يا ASP کلاسيک است. اما اين يک پيشرفت تکاملی است بطوريکه اين دو فناوری تقريبا از يکديگر متفاوتند. صفحات ASP با زبان های دستورالعمل نويسی مانند VBScript يا JScript ايجاد می شوند اما در ASP.NET ما يک فرايند کامل برنامه نويسی با زبانهای Visual Basic يا #C (سي-شارپ تلفظ شود) داريم. همچنين در ASP کلاسيک تنها پنج کلاس استاندارد (Request, Response, Application Session, Server) وجود دارد حال آنکه در ASP.NET می توان از بيش از ۴۵۰۰ کلاس استاندارد موجود در بدنه NET. بهره جست.همچنين عليرغم قدرت و امکانات زياد و متعدد ASP.NET، استفاده از آن در مقايسه با ASP کلاسيک بسيار آسانتر است. بعنوان مثال با استفاده از چند ابزار در يک صفحه ASP.NET می توان يک صفحه بسيار پيچيده HTML بدست آورد که ساخت آن در ASP کلاسيک ممکن است نياز به چند روز کار داشته باشد.

زبانهای برنامه نويسی در ASP.NET
شما در ASP.NET می توانيد از هر زبان برنامه نويسی که با بدنه NET. سازگار باشد استفاده کنيد. اين زبانها عبارتند از Visual Basic.NET و #C و JScript.NET . اين بدين معنی است که شما جهت نوشتن برنامه در ASP.NET نياز به فراگيری زبان جديدی نداريد و اگر يکی از زبانهای ويژوال بيسيک يا ++C يا جاوا را می دانيد هم اکنون می توانيد در ASP.NET برنامه بنويسيد.از طرف ديگر تعدادی زبانهای ديگر توسط بعضی از شرکتهای فعال در اين زمينه به مجموعه زبانهای استاندارد ASP.NET افزوده شده است. بعنوان مثال اگر مايل باشيد حتی می توانيد از PERL و COBOL هم در ASP.NET استفاده کنيد.

ابزارهای ASP.NET
سالهاست که برنامه نويسان ويژوال بيسيک جهت ساخت فرم های خود از ابزارهای ويژوال بيسيک مانند TextBox و ListBox استفاده کرده اند. در ASP.NET هم شما می توانيد از ابزارهای فراوان موجود در آن برای ساخت فرم ها و صفحات خود استفاده نمائيد. در ASP.NET چهار دسته عمده از ابزارها موجود است:
• ابزارهای اصلی مانند TextBox، RadioButton، ListBox و Button.
• ابزارهای اعتباری برای حصول اطمينان از ورود و تائيد صحت اطلاعات ورودی فرم ها.
• ابزارهای داده ای برای ارتباط با بانک اطلاعاتی و دستکاری داده.
• ابزارهای پيشرفته جهت نمايش عناصر پيچيده در واسط کاربر مانند تقويم و آگهی های تبليغاتي.

با استفاده از Visual Studio.NET شما براحتی می توانيد با چيدن تصويری اين ابزارها بر روی فرم مورد نظر، صفحه دلخواه خود را بسازيد. در صورت تمايل حتی می توانيد در يک ويرايشگر ساده متن مانند Notepad برنامه مورد نظر را نوشته و از اين ابزارها استفاده کنيد.

دريافت ASP.NET
جهت شروع برنامه نويسی در ASP.NET تنها کافی است که مجموعه ASP.NET را بهمراه بدنه NET. از سايت ميکروسافت دريافت کنيد.

دريافت .NET Framework

ASP.NET با سيستم عامل های Windows 2000 (نسخه Server و Professional) و Windows XP کاملا سازگار است.
لينک مقاله
http://www.iranasp.net :منبع

مقالات مرتبط با اين موضوع
upload کردن فايل به سرور در ASP.NET | aspdotnet
Namespace چيست؟ | aspdotnet
Smart Navigation چيست؟ | aspdotnet
چرا به دات نت احتياج داريم؟ | aspdotnet
نشان دادن قابليتهای مرورگر در ASP.NET | aspdotnet
آشنائی با ASP.NET | aspdotnet
نحوه پردازش صفحات ASP.NET بر روي سرويس دهنده وب | aspdotnet
ارسال ایمیل در ASP.NET با استفاده از HTML Template | aspdotnet
اضافه کردن تصویر به پایگاه داده | aspdotnet
برسی کوکی‌ها (Cookies) و جلسات (Sessions) در ASP.NET | aspdotnet
باز کردن پنجره Popup در ASP.NET با استفاده از Code Behind | aspdotnet
آشنائی با فرم‌های وب در ASP.NET | aspdotnet

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


نشان دادن قابليتهای مرورگر در ASP.NET

اگرچه در حال حاضر جنگ مرورگرها تقريبا تمام شده است اما اين موضوع دليلی بر شناخته نشدن قابليتهای مرورگرها نيست. در اينجا توانايی ASP.NET در نشان دادن قابليتهای مرورگرها بحث شده است. بعنوان نمونه، مثال ۱ نوع مرورگر را به ما نشان می دهد.

<html><body>
You are using <% =Request.Browser.Type %>
</body></html>

برای نمونه اگر شما از IE 5 استفاده می کنيد نتيجه خروجی چنين بايد باشد:

You are using IE5

در مثال ۱ Request.Browser.Type يک رشته را که همان نام ونسخه‎ی مرورگر است را بر می گرداند. اما اين موضوع چگونه صورت ميگيرد ؟

شئ HTTPBrowserCapabilities
در حقيقت خاصيت Browser در شئ Request کلاسی از HTTPBrowserCapabilities است که در فضانام System.Web قراردارد. وقتی که اين کلاس روی يک صفحه ASP.NET نمونه سازی می شود خواص صفحه سرويس گيرنده ای را نشان می دهد که از آن برای اجرا شدن کد استفاده شده است. شئ Request در برگيرنده اين خاصيت مرورگر است که اين کلاس را ميتوان معادل کلاس MSWC. BrowserCapabilities در ASP کلاسيک در نظر گرفت.

در ليست زير اکثر خاصيتهای شی HTTPBrowserCapabilities تشريح شده است:

ActiveXControls: نشان می دهد که مرورگر اکتيويکس را ساپورت می کند يا نه.
AOL: چک می کند که مرورگر از نوع AOL است يا نه.
Cookies: نشان می دهد که مرورگر کوکی ها را ساپورت می کند يا نه بايد توجه داشت که اين خاصيت وضعيت فعال بودن يا غير فعال بودن کوکی ها را نشان نمی دهد.
Crawler: نشان ميدهد که مرورگر سرويس گيرنده از موتورهای جستجو تاثير می پذيرد يا نه.
Browser: نوع مرورگر را نشان می دهد.
Frames: نشان می دهد که مرورگر از قابليت Frame برخورداراست يا نه.
MajorVersion: نسخه اصلی مرورگر را نشان می دهد بعنوان مثال در IE5 عدد 5 نشانگر نسخه اصلی است.
MinorVersion: نسخه جزيی (کوچکتر) مرورگر را نشان می دهد بعنوان مثال در IE5.1 عدد .1 نشانگر نسخه جزيی است.
Type: نوع ونسخه مرورگر را بصورت يک رشته بازميگرداند..
VBScript: نشان می دهد که مرورگر VBScript را ساپورت می کند يا نه.
Version: نسخه اصلی و جزيی مرورگر را بعنوان يک رشته برمی گرداند.

در زير نمونه کامل يک مثال آورده شده است.

<%@ page language="VB" %>
<%@ Import Namespace="System.Web" %>
<html>
<body>
<head><title>HTTPBrowserCapabilities Demo</title></head>

<%
Dim browserObj As HTTPBrowserCapabilities
browserObj = Request.Browser
%>
<font face="verdana, arial" size=2>

<p>Your browser supports ActiveX controls: <%=browserObj.ActiveXControls %> </p>
<p>Your browser type: <%=browserObj.Type %> </p>
<p>Your browser version: <%=browserObj.Version%> </p>

... Add any other property that you would like to display

</font>
</body>
</html>
لينک مقاله
http://www.iranasp.net :منبع

مقالات مرتبط با اين موضوع
upload کردن فايل به سرور در ASP.NET | aspdotnet
Namespace چيست؟ | aspdotnet
Smart Navigation چيست؟ | aspdotnet
چرا به دات نت احتياج داريم؟ | aspdotnet
نشان دادن قابليتهای مرورگر در ASP.NET | aspdotnet
آشنائی با ASP.NET | aspdotnet
نحوه پردازش صفحات ASP.NET بر روي سرويس دهنده وب | aspdotnet
ارسال ایمیل در ASP.NET با استفاده از HTML Template | aspdotnet
اضافه کردن تصویر به پایگاه داده | aspdotnet
برسی کوکی‌ها (Cookies) و جلسات (Sessions) در ASP.NET | aspdotnet
باز کردن پنجره Popup در ASP.NET با استفاده از Code Behind | aspdotnet
آشنائی با فرم‌های وب در ASP.NET | aspdotnet

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


چرا به دات نت احتياج داريم؟

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

مهمترين نيازی که به عنوان آخرين تکنولوژی وجود دارد، برنامه نويسی در محيط اينترنت است. اينترنت در مدت تقريبا ۸ سال جای خود را به عنوان يکی از مهمترين وسايل ارتباطی برای کارهای روزمره و تجارت باز کرده است. سيستم های برنامه نويسی قديمی تر امکان برنامه نويسی برای اينترنت را فراهم کرده بودند اما هر کدام دارای اشکالات بزرگی هستند، برای مثال تکنولوژی COM اولين بار در ويندوز به کار گرفته شد. در سال 1970 نيز سيستم هايی برای Unix نوشته شده بودند، جاوا نيز در اصل برای ابزارهای الکترونيکی بود و نه برای اينترنت.

سپس برای اولين بار يک سيستم جامع برای برنامه نويسی تحت اينترنت ايجاد شد. اين سيستم -NET. از مراحل سطح پايين که به زبان ماشين می باشد تا بالاترين سطح که برنامه نويسی ويژوال آن می باشد برای استفاده در اينترنت طراحی شده است. البتهNET. فقط برای اينترنت نيست و با استفاده از آن می توان برنامه های کامل تحت Client نيز ايجاد کرد، اما بزرگترين مزيت آن دربرابر سيستم های ديگر امکانات اينترنت آن است.

برای اينکه مزايای استفاده ازNET. را بهتر متوجه بشويم بهتر است در ابتدا معايب سيستم های پيشين را ذکر کنيم. شرکت مايکروسافت تا قبل از سال 1995 به برنامه نويسی در محيط های Client و Server می پرداخت، اما از آن سال به بعد توجه بيشتری به مساله برنامه نويسی در اينترنت کرد. مايکروسافت COM و +COM را ايجاد کرد و آنها را در ويژوال استوديوی 6 به کار گرفت. در سال 1999 حدود ۵۰ در صد از بزرگترين سايتهای تجارت الکترونيکی از محصولات مايکروسافت استفاده می کردند. اما هنوز هم مشکلات بزرگی در سيستم های مايکروسافت وجود داشت که يکی از آنها دشواری نوشتن برنامه در اينترنت با محصولات مايکروسافت بود. شرکت مايکروسافت برای راحتی کار برنامه نويس ها ASP يا Active Server Page را ايجاد کرد. با اينکه اين يک قدم بزرگ بود و کارها را بسيار ساده کرد ولی هنوز از برنامه نويسی شی گرا پشتيبانی نمی کرد. همچنين در ويژوال استوديوی 6 قسمتی برای Internet Application ايجاد شده بود و در آنها امکان ساختن Web Class وجود داشت ولی هيچ وقت به عنوان يک ابزار کار آمد برای برنامه نويسی وب درنظر گرفته نشد.

مدل برنامه نويسی DNA
مايکروسافت يک مدل برنامه نويسی به نام Distributed interNet Application دارد که بر پايه برنامه نويسی n-tier و COM بنا نهاده شده است. مدل DNA از سه بخش اساسی تشکيل شده است.

بخش اول به نام Presentation tire معروف است. در اين بخش رابط تصويری کاربر وجود دارد و خود نيز به دو نوع Internet Browser و Win 32 GUI تقسيم می شود که هر کدام مشکلات خاص خود را دارند. در مدلی که از Win32 GUI يا همان نرم افزارهای معمولی استفاده می شود دو مشکل بزرگ وجود دارد ؛ دشواری بروز رسانی نرم افزار و ديگری DLL Hell که در ادامه توضيح داده خواهد شد. در نوع دوم مشکلاتی از قبيل نبود امکانات برنامه نويسی کافی در محيط مرورگر، نبود رابط قوی با کاربر، نبودن مرورگر های يکسان و... وجود دارد. همچنين هميشه يک اتصال به اينترنت يا اينترانت لازم است. در اين نوع از برنامه نويسی می توان از Java Applet ها يا ActiveX استفاده کرد ولی مرورگر بايد امکان استفاده از آن را داشته باشد، مخصوصا ً هنگام استفاده از ActiveX که بايد فقط از IE استفاده کرد.

بخش دوم که Middle tier نام دارد، مکانی است که اطلاعات و قوانين تجاری در آن وجود دارد. منظور از قوانين ، متد ها و اجزائی هستند که اعمال کاربران را کنترل می کنند. مهمترين و آسان ترين زبان برای نوشتن اين اجزا از DNA ويژوال بيسيک است. برنامه نويسی که بخواهد در اين رده برنامه بنويسد بايد آشنايی کاملی با COM و پروتکل های رايج داشته، همچنين بايد مهارت کافی در استفاده از ADO و ADSI داشته باشد. مشخص است که يک اشتباه در اين لايه باعث بروز خطا و نقص در کل سيستم می شود.

بخش سوم يا Data tier مکانی است که اطلاعات سازمان در آن ذخيره می شود. معمولا ً در اين قسمت از بانکهای پيشرفته رابطه ای مانند SQL Server و Oracle استفاده می کنند.

محدوديت های COM
همانطور که ديديد مهمترين قسمت در DNA همان COM است که در جای جای آن استفاده می شود. در اينجا برخی معايب COM ذکر می شود : ( در ابتدای متن ذکر شد که برای درک نياز بهNET. بايد ابتدا معايب سيستم های قديمی را بشناسيم )

DLL Hell: اگر کوچکترين تغييری در يک COM ايجاد شود، ديگر برنامه هايی که از ورژن قبلی استفاده می کردند قادر به فعال ساختن نسخه جديد نيستند. هنگامی که در ويندوز، يک COM نصب شود برايش در رجيستری يک GUID ثبت می شود که اطلاعات آن COM را در خود ذخيره می کند. اگر يک برنامه از نسخه اول يک COM استفاده کند و بعد از مدتی شما تغييراتی در نسخه اول بدهيد و بخواهيد آن را دوباره در سيستم نصب کنيد ويندوز به شما پيغام خطا می دهد چون ورژن آن تکراری است، اگر هم آن را به ورژن دوم ارتقا دهيد نرم افزار قبلی هنوز به دنبال نسخه اول می گردد. اين امر باعث می شود که شما مجبور شويد يکبار ديگر کل برنامه را کامپايل کرده و در کامپيوترتان نصب کنيد.

کمبود در وراثت: در نسخه های COM که در حال حاضرهستند چيزی به نام وراثتی که در ++C وجود دارد نمی باشد، بلکه وراثت تنها در واسط يک COM می باشد، استفاده از آن هم چندان کمکی به برنامه نويسی نمی کند.

برخی محدوديت های برنامه نويسی اينترنتی در مدل DNA

۱- وجود دو محيط برنامه نويسی برای اينترنت و Client
نقصان در نوشتن برنامه هايی با رابط گرافيکی خوب که در اينترنت کار می کردند کاملا ً مشهود است، نمونه بارز آن اختلاف در برنامه نويسی در ويژوال بيسيک و ASP است. ويژوال بيسيک با رابط گرافيکی کاملا ً سطح بالا و ASP تقريبا ً رابط گرافيکی ندارد. همين امر باعث می شد که يک برنامه نويس مجبور باشد طيف وسيعی از تکنيک ها و زبان ها را فرابگيرد تا بتواند برنامه ساده ای در اينترنت بنويسد.

۲- نبودن حالت های ذخيره اطلاعات رابط گرافيکی در صفحه های اينترنتی
نمونه اين حالت زمانی است که در يک textbox متنی وجود داشته باشد. در برنامه های Win32 GUI متن داخل textbox تا زمانی که کاربر يا برنامه آن را تغيير نداده بر جای خود وجود دارد. اما در محيط اينترنت و نوع ASP با هر بار refresh کردن صفحه کل اطلاعات ازبين می رود. البته اين مشکل با استفاده از شئ های Request و Response تقريبا ً قابل حل است ولی احتياج به برنامه نويسی برای هر تکه از صفحه ASP دارد.

۳- نداشتن Event Handler در محيط برنامه نويسی اينترنت
يکی از مهمترين ابزاری که در برنامه نويسی Win32 GUI وجود دارد استفاده از Event ها است. با تکنولوژی که در حال حاضر وجود دارد تنها راه رسيدن به اين مهم استفاده از ActiveX است که به علت مسايل امنيتی در بيش از ۹۵ در صد مواقع توسط کاربر استفاده از آن رد می شود.

معايب استفاده از API
API ها توابعی هستند که از ويندوز نسخه 1 تا امروز در برنامه نويسی کاربرد داشته و دارند. مهمترين کاری که اين توابع انجام می دهند انجام کارهای سخت و سطح پايين سيستمی است که احتياج به برنامه نويسی زيادی دارند و يا حتی امکان ايجاد آن با زبان هايی مثل ويژوال بيسيک نيست. اما هر API از هر نسخه ويندوز تا نسخه ديگر آن می تواند دچار تغييرات بشود. برای مثال برنامه ای که در ويندوز 98 نوشته شده باشد می تواند در ويندوز 95 اجرا نشود. همچنين هم اکنون ابزارهای جديدی به بازار آمده است که برای آنها نيز می توان برنامه نويسی کرد، مانند تلفن های سيار، کيوسک تلفن، دستگاه های کامپيوتری جيبی و غيره. در اين نوع دستگاه ها ديگر ويندوز به مفهومی که در حال حاضر وجود دارد قابل اجرا نيست و در نتيجه API هم وجود ندارد. لازم به ذکر است که ويندوز CE برای دستگاه های مذکور می باشد ولی قابليت های آن با ويندوزهای ديگر تفاوت زيادی دارد.

خلاصه از کتاب Professional VB.NET از Wrox
لينک مقاله
http://www.iranasp.net :منبع

مقالات مرتبط با اين موضوع
upload کردن فايل به سرور در ASP.NET | aspdotnet
Namespace چيست؟ | aspdotnet
Smart Navigation چيست؟ | aspdotnet
چرا به دات نت احتياج داريم؟ | aspdotnet
نشان دادن قابليتهای مرورگر در ASP.NET | aspdotnet
آشنائی با ASP.NET | aspdotnet
نحوه پردازش صفحات ASP.NET بر روي سرويس دهنده وب | aspdotnet
ارسال ایمیل در ASP.NET با استفاده از HTML Template | aspdotnet
اضافه کردن تصویر به پایگاه داده | aspdotnet
برسی کوکی‌ها (Cookies) و جلسات (Sessions) در ASP.NET | aspdotnet
باز کردن پنجره Popup در ASP.NET با استفاده از Code Behind | aspdotnet
آشنائی با فرم‌های وب در ASP.NET | aspdotnet

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


Smart Navigation چيست؟

مفهوم Smart Navigation و فوايد آن
Smart Navigation يكى از بهترين ابزارهاى جديدى است كه ASP.NET آنرا عرضه كرده است. اين ابزار جديد باعث شده ظاهر برنامه هاى وب و احساسى كه نسبت به آن وجود دارد شباهت بيشترى با برنامه هاى عادى و نوشته شده براى ويندوز پيدا كند.

يكى از موانع بزرگ برنامه هاى تحت وب به معمارى و ساختار HTTP برمى گردد. جاييكه مجبوريم اطلاعات جمع آورى شده در سمت مشترى را به سرور بازگردانيم. به همين دليل مجبور به رسم مجدد و كامل صفحه اى كه قبلا ديده ايم مى باشيم، كه اين نه تنها باعث مى شود يك حالت فلش مانند در اين رفت و برگشت و رسم مجدد رخ دهد، بلكه براى صفحه هاى بلند كه براى ديدن تمام صفحه نيازمند بهscrolling هستيم، باعث مى شود كه ديدمان را به اول صفحه انتقال دهد، چيزى كه هم شايد دلخواه ما نباشد و هم اينكه ممكن است باعث سردرگمى كاربر گردد. همچنين اين فرآيند باعث تغيير فوكوس كنترل ها و بسيارى از اتفاقات ديگرنيز مى شود.

در برنامه هاى عادى ويندوز ما به طور معمول فقط قسمت هايى از صفحه را به روز مى كنيم كه تغييرى در آن ايجاد شده باشد يا تحت تاثير چيزى قرار گيرند و اين بدون نياز به تغيير در كل برنامه مى باشد (مثلا فقط يك عضو به listbox ما اضافه مى شود. بدون تغيير و رسم مجدد فرم برنامه).

Smart Navigation يا به عبارتى هدايت هوشمندانه اين توانايى موجود در برنامه هاى ويندوز را براى برنامه هاى تحت وب فراهم مى كند! اما قبل از هر چيز بايد بدانيد كه اين ابزار فقط براى IE مى باشد و آن هم نسخه هاى ۵ به بالاتر آن. با اين وجود شما مى توانيد Smart Navigation را فعال يا غيرفعال سازيد، بدون آنكه تاثيرى در برنامه شما بگذارد. حتى اگر شما در پروژه تان مرورگرهاى محتلفى را مدنظر قرار داده باشيد، مى توانيد Smart Navigation را فعال سازيد. در اين صورت ASP.NET نوع مرورگر را تشخيص داده و Smart Navigation را فقط براى مرورگرهاى پشتيبانى شده فعال مى سازد.

چهار مورد برجسته اى كه Smart Navigation فراهم مى كند عبارتند از:

• صفحه در ميان درخواست ها يك نمايش ممتد را داراست و به عبارتى حالت فلش زدن به خود نمى گيرد.
• موقعيت Scroll را حفظ مى كند.
• فوكوس عضو دارنده فوكوس را نگه مى دارد.
• آخرين صفحه درون تاريخچه (History) نگهدارى مى شود.

اين ابزار در حالت واقع گرايانه براى برنامه هايى كه ارسال به عقب(!) Postback فراوانى دارند طراحى شده است ولى با توجه به اين نكته كه محتواى صفحه نبايد زياد تغيير نكند. احتمالا بنا به دلايل كارايى و نه اينكه در تغييرات زياد ايرادى بهم بزند - مترجم. شايد يك چيز شگفت آور در مورد اين ابزار اين باشد كه شما در حقيقت نياز به نوشتن هيج كد و برنامه اى نداريد.

نحوه استفاده
Smart Navigation درون هدايت كننده صفحه (Page directive : <%@ %>)، براى تنظيم يك صفحه و درون web.config براى تنظيم كل برنامه استفاده مى شود. براى تنظيم در Page Directive به صورت زير عمل كنيد:

<%@ Page SmartNavigation=true %>

و براى تنظيم در web.config از ساختار زير استفاده نماييد:

<Configuration>
<System.web>
<Pages SmartNavigation=true />
</System.web>
</Configuration>

روش كار اينگونه است كه كل صفحه بدرون يك فريم دورنى مخفى (hidden IFrame) بارگذارى (load) مى شود و سپس فقط قسمت هاى تغيير كرده دوباره رندر(render) مى شوند.

برگرفته از كتاب Professional ASP.NET 1.0 انتشارات Wrox
لينک مقاله
http://www.iranasp.net :منبع

مقالات مرتبط با اين موضوع
upload کردن فايل به سرور در ASP.NET | aspdotnet
Namespace چيست؟ | aspdotnet
Smart Navigation چيست؟ | aspdotnet
چرا به دات نت احتياج داريم؟ | aspdotnet
نشان دادن قابليتهای مرورگر در ASP.NET | aspdotnet
آشنائی با ASP.NET | aspdotnet
نحوه پردازش صفحات ASP.NET بر روي سرويس دهنده وب | aspdotnet
ارسال ایمیل در ASP.NET با استفاده از HTML Template | aspdotnet
اضافه کردن تصویر به پایگاه داده | aspdotnet
برسی کوکی‌ها (Cookies) و جلسات (Sessions) در ASP.NET | aspdotnet
باز کردن پنجره Popup در ASP.NET با استفاده از Code Behind | aspdotnet
آشنائی با فرم‌های وب در ASP.NET | aspdotnet

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


Namespace چيست؟

يک نکته مهم که در زمان استفاده از NET Framework. بايد به آن توجه داشت آن است که فضانام (namespace يا نامکده) ها در ساختمان برنامه کاربردی قرار دارند. فضانام يک طرح نامگذاری منطقی برای گروه بندی کلاس های مرتبط است. اين طرح مانع از آن می شود تا کلاس هايی که برای متدها و خصوصيات از يک شناسه يکسان استفاده می کنند تداخل داشته باشند.

مثلا NET Framework. برای گروه بندی تايپ ها به مقوله های منطقی عملکرد، از قبيل چارچوب برنامه کاربردی ASP.NET، از يک طرح نامگذاری سلسله مراتبی استفاده می کند. ابزارهای طراحی از فضانام ها با هدف تسهيل مرور و ارجاع تايپ ها در برنامه بهره برداری می کنند. مثلا فرض کنيد در حال نوشتن کد زير هستيد:

Public Class NewClass
   [Procedures and Functions]
End Class

Public Class NewClass
   [Procedures and Functions]
End Class

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

Namespace One
   Public Class NewClass
      [Procedures and Functions]
   End Class
End Namespace

Namespace Two
   Public Class NewClass
      [Procedures and Functions]
   End Class
End Namespace

در اين کد برخوردی بين دو کلاس با نام NewClass وجود ندارد چون هر کدام در يک فضانام جداگانه قرار داده شده است. کلاس اول را می توان با استفاده از ترکيب One.NewClass صدا زد، حال آنکه کلاس دوم را می توان با استفاده از ترکيب Two.NewClass صدا زد.

شما می توانيد در فضانام های خود از يک ساختار سلسله مراتبی استفاده کنيد. قرار دادن اشياء مشابه تحت زيرعنوانها در يک فضانام مشترک تشخيص هدف فضانام را آسانتر می کند، و در عين حال باعث می شود برنامه به مراتب شئ گراتر شود.

برای توضيح فضانام می توان ساختار فايل و دايرکتوری (کشو، فولدر) در يک کامپيوتر را در نظر گرفت. در اين مثال کلاس ها به مثابه فايل ها و فضانام ها مانند دايرکتوری ها هستند. بديهی است همانگونه که می توانيم دايرکتوريهای تو در تو داشته باشيم، فضانام ها هم در حاليکه کلاس ها را در خود جای داده اند می توانند بصورت تو در تو باشند.

فضانام ها در ساخت برنامه های کاربردی ASP.NET نقش مهمی ايفا می کنند. خوشبختانه لازم نيست برای همه اشيايی که می توانند به وسيله صفحات ASP.NET مورد استفاده قرار بگيرند سيستم طبقه بندی فضانام ايجاد کنيد. مايکروسافت اين مساله را برای شما حل کرده است. دو فضانام ريشه، و فضانامهای فرزند آنها را می توان وارد صفحات ASP.NET خود کرد. اولی System ناميده می شود، و دومی Microsoft نام دارد. اين فضانامها با جزئيات بيشتر در ادامه مورد بحث قرار گرفته اند.

فضانام System
فضانام System فضانام اصلی برای ساخت ASP.NET و همه برنامه های کاربردی ديگر مبتنی بر NET Framework. است. هر چيزی که در برنامه کاربردی شما قابل انجام باشد از طريق فضانام System کنترل می شود. به عنوان مثال کنترل آرايه، عمليات رياضی، و تبديل نوع داده ها از طريق فضانام System و فضانامهای فرزند آن اداره می شوند. ۹ فضانام پيش فرض (فضانام System و ۸ فرزند آن) وجود دارند که به صورت خودکار به صفحات ASP.NET اضافه می شوند:

• System
• System.ComponentModel.Design
• System.Data
• System.Drawing
• System.Web.SessionState
• System.Web
• System.Web.UI
• System.Web.UI.WebControls
• System.Web.UI.HTMLControls

هشت فضانام (بجز فضانام System) در زمان ساخت Visual Studio.NET يا VS.NET بطور خودکار به صفحات ASP.NET وارد می شوند. اين فضانام ها در زير به اختصار شرح داده شده اند.

• System.ComponentModel.Design: دربرگيرنده کلاس هايی است که می توان از آنها برای طراحی پشتيبانی سفارشی اجزا و زمان طراحی و دسترسی به سرويس های تامين شده توسط معماری NET Framework. استفاده کرد.

• System.Data: امکان دسترسی به کلاس ها و رابطهايی را فراهم می کند که معماری ADO.NET را برای دسترسی به داده های عمومی تشکيل می دهند.

• System.Drawing: دربرگيرنده کلاس ها و رابطهايی است که عملکرد گرافيکی اوليه را تامين می کنند. فضانام System.Drawing نيز از طريق فضانام System.Drawing.Drawing2D و System.Drawing.Imaging عملکرد پيشرفته تری فراهم می کند.

• System.Web: کلاس ها و رابطهايی تامين می کند که ارتباط مرورگر/سرويس دهنده را امکان پذير می کنند. اين فضانام دربرگيرنده کلاس HTTPRequest (فراهم کننده اطلاعات وسيعی درباره درخواست HTTP جاری)، کلاس HTTPResponse (فراهم آورنده امکان دسترسی به فرآيندها و يوتيليتی های سمت سرويس

دهنده) است.

• System.Web.SessionState: فراهم کننده کلاس ها و متدهايی برای مديريت وضعيت جلسات کاری می باشد.

• System.Web.UI: فراهم کننده کلاس ها و رابطهايی برای رابط واسط کاربر برنامه کاربردی ASP.NET است که موجب می شوند برنامه کاربردی با سطوح مختلف صفحه، ارتباط برقرار کند. کلاس اصلی اين فضانام، کلاس Page می باشد که دربرگيرنده همه خصوصيتها، متدها، و سازنده های صفحه است. اشياء اصلی Active Server Page زير خصوصيتهايی در کلاس Page هستند: Application ،Response ،Request ،Server و Session.

• System.Web.UI.HTMLControls: کلاس هايی برای عناصر HTML استاندارد، شامل فرم ها، کنترل های ورودی، آنکور، جداول، قسمتهای متنی، و غيره فراهم می کند. اين کنترلها همانند تگهای عادی HTML هستند با اين تفاوت که داری دو صفت runat="server" و id="controlname" می باشند.

• System.Web.UI.HTMLControls: برای کنترلهای سرويس دهنده ای که شبيه کنترلهای HTML هستند ولی انعطاف پذيری بيشتر و عملکرد پيچيده تری دارند کلاس هايی را تامين می کند.

برخی فضانام های مهم و پرکاربرد ديگر به شرح زير می باشند.

• System.IO: دربرگيرنده رابطها و کلاس هايی است که امکان خواندن و نوشتن همگام و غيرهمگام فايل ها و جريانهای داده را فراهم می کنند.

• System.Data.OleDb: امکان دسترسی به کلاس ها و رابطهای مخصوص دسترسی به يک منبع داده از طريق ADO را فراهم می کند.

• System.Data.SqlClient: امکان دسترسی به کلاس ها و رابطهای مخصوص دسترسی به داده های خاص Microsoft SQL Server از طريق ADO را فراهم می کند.

• System.Web.Security: امکان دسترسی به کلاسها و رابطهای مخصوص امنيت برنامه کاربردی ASP.NET را فراهم می کند. دستيابی به رمزنگاری، مجوزها، و تنظيمات خط مشی برنامه کاربردی در اين فضانام قرار می گيرند.

• System.XML: امکان دسترسی به کلاسها و رابطهای مخصوص پردازش اسناد XML را فراهم می کند.

فضانام Microsoft
علاوه بر فضانام System که در چارچوب NET. يافت می شود، مايکروسافت چند فضانام اضافه کرده است که برای زبان برنامه سازی ای که می خواهيد از آن در برنامه کاربردی خود استفاده کنيد عملکرد لازم را تامين می کنند. ممکن است شما بصورت مستقيم با اين فضانام کاری نداشته باشيد.

• Microsoft.VisualBasic: اين فضانام محتوی CLR يا زمان اجرای Visual Basic.NET است. از اين زمان اجرا با زبان Visual Basic.NET استفاده می شود. اين فضانام همچنين دربرگيرنده کلاس هايی است که از کامپايل و توليد کد با استفاده از زبان ويژوال بيسيک پشتيبانی می کنند.

• Microsoft.CSharp: اين فضای نام دربرگيرنده کلاس هايی است که از کامپايل و توليد کد با استفاده از زبان #C پشتيبانی می کنند.

• Microsoft.JScript: اين فضای نام دربرگيرنده کلاس هايی است که از کامپايل و توليد کد با استفاده از زبان JScript پشتيبانی می کنند.

• Microsoft.Win32: کلاسها و رابطهای مورد نياز برای کار با کليدها و hiveهای رجيستری را تامين می کند.

با وجود آنکه فضانام ها از قبل تامين می شوند، می توانيد برای استفاده از برنامه کاربردی ASP.NET فضانام های خود را ايجاد کنيد. برای هر کلاس ايجاد شده توسط سازنده يک فضانام توليد می شود.

استفاده از فضانام ها در صفحات ASP.NET
دو راه برای افزودن فضانام به برنامه کاربردی ASP.NET وجود دارد. از شبه دستور (Directive) صفحه Import@ برای صفحات ASPX و از کلمه کليدی Imports برای افزودن فضانام به برنامه codebehind مربوطه در ويژوال بيسيک استفاده می شود و برای زبان #C از دستور using استفاده می گردد. قطعه برنامه زير ترکيب نحوی برای افزودن فضانام System.Web.UI.WebControls به صفحه ASP.NET شما است.

<%@ Import namespace = "System.Web.UI.WebControls" %>

همين فضانام را در قسمت codebehind بصورت زير به برنامه اضافه می کنيم.

Imports System.Web.UI.WebControls (vb.net)

using System.Web.UI.WebControls; (C#)

( به تفاوت Import و Imports دقت کنيد )

در صورتيکه می خواهيد چند فضانام را به صفحه ASP.NET خود و يا صفحه codebehind اضافه کنيد بايد هرکدام را جداگانه اضافه کنيد. بعنوان مثال، برای افزودن فضانام System.Web.UI.HTMLControls به صفحات با فضانام های موجود، درست بعد از آخرين عبارت مهم به خط بعد برويد و Imports System.Web.UI.HTMLControls را اضافه کنيد. به محض آنکه .Imports System را تايپ کنيد، VS.NET فهرستی از فضانام ها را ظاهر می کند، و می توانيد به سادگی فضانام مورد نظر را با ماوس برگزينيد. امتياز اين فهرست آن است که مجبور نيستيد همه فضانام های NET. را از حفظ بدانيد، بلکه می توانيد به آسانی از فهرست انتخاب کنيد. اين ويژگی با عنوان Intellisense شناخته می شود. برای صفحات ASP.NET از اين ترکيب استفاده کنيد:

<%@ Import namespace = "System.Web.UI.WebControls" %>
<%@ Import namespace = "System.Web.UI.HTMLControls" %>
<%@ Import namespace = "namespace name" %>
...

برای صفحات codebehind ويژوال بيسيک از اين ترکيب استفاده کنيد:

Imports System.Web.UI.WebControls
Imports System.Web.UI.HTMLControls
Imports namespace
...

لينک مقاله
http://www.iranasp.net :منبع

مقالات مرتبط با اين موضوع
upload کردن فايل به سرور در ASP.NET | aspdotnet
Namespace چيست؟ | aspdotnet
Smart Navigation چيست؟ | aspdotnet
چرا به دات نت احتياج داريم؟ | aspdotnet
نشان دادن قابليتهای مرورگر در ASP.NET | aspdotnet
آشنائی با ASP.NET | aspdotnet
نحوه پردازش صفحات ASP.NET بر روي سرويس دهنده وب | aspdotnet
ارسال ایمیل در ASP.NET با استفاده از HTML Template | aspdotnet
اضافه کردن تصویر به پایگاه داده | aspdotnet
برسی کوکی‌ها (Cookies) و جلسات (Sessions) در ASP.NET | aspdotnet
باز کردن پنجره Popup در ASP.NET با استفاده از Code Behind | aspdotnet
آشنائی با فرم‌های وب در ASP.NET | aspdotnet

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


upload کردن فايل به سرور در ASP.NET

کدهای مربوط به Upload کردن فايل به سرور را بايد به دو قسمت تقسيم نمود. قسمت اول شامل کدهايی است که نحوه نمايش در مرورگر را شامل می شوند و اساس آن بر HTML است. و قسمت دوم مربوط به طرف سرور است که شامل کدهايی است که با ASP.NET نوشته می شوند. برنامه زير حاوی کدهای مربوطه برای انجام اين کار به صورات خيلی ساده و ابتدايی می باشد. همانطور که ملاحظه می کنيد برخلاف ASP کلاسيک، نياز به وجود component خاصی نمی باشد و اين کار در ASP.NET بصورت خيلی ساده انجام پذير است.

Upload.aspx:
<HTML>
<HEAD>
<TITLE>Uploading File...</TITLE>
<Script language="vb" runat="server">
sub page_load(s as object,e as EventArgs)
    If Not (MyInputFile.PostedFile Is Nothing) Then
        MyInputFile.PostedFile.SaveAs("c:\filename.ext")
        Response.write("Your File was saved on the server...")
    End If
end sub
</script>
</HEAD>
<BODY>
    <FORM method="post" encType="multipart/form-data">
        <input id="MyInputFile" type="file" name="MyInputFile" runat="server">
        <input type="submit" value="Submit">
    </FORM>
</BODY>
</HTML>

در زير به شرح و توضيح برنامه بالا می پردازيم:

کدهای مربوط به طرف Client
به دليل آنکه در اين قسمت، ارسال اطلاعات به سرور را داريم، بايد کدهای مربوطه درون يک فرم قرار گيرند. اما لازم است که ويژگی encType آن فرم را به صورت زير مقدار دهی کنيم، زيرا در غير اينصورت فايل انتخاب شده توسط کاربر به سرور ارسال نخواهد شد:

encType="multipart/form-data"

در HTML کنترلی وجود دارد که وظيفه دريافت نام فايل و ارسال آن به سرور را عهده دار می باشد:

<input id="MyInputFile" type="file" name="MyInputFile" runat="server">

توجه کنيد که اين کنترل را به صورت يک سرور کنترل در می آوريم تا بتوانيم در ASP.NET از توانايی های آن استفاده نماييم و به همين دليل ويژگی runat="server" را به کنترل مربوطه اضافه کرده ايم. بنابراين کد مربوط به قسمت Client به صورت زير خواهد بود:

<body>
<form method="post" encType="multipart/form-data">
<INPUT id="MyInputFile" type="file" name="MyInputFile" runat="server">
<input type="submit" value="Submit">
</form>
</body>

کدهای مربوط به طرف Server
اين قسمت کدهايی را شامل می شود که برای ذخيره کردن فايل بر روی سرويس دهنده مورد استفاده قرار می گيرند.همانطور که گفته شد شئ مربوط به دريافت نام فايل را به صورت سرور کنترل قرار داديم تا بتوانيم از خصوصيات آن در سرور استفاده کنيم (در اينجا نام آنرا MyInputFile درنظر گرفته ايم). يکی از خصوصيات اين شئ، شئ PostedFile می باشد که به فايل ارسالی توسط کاربر اشاره می کند. اين شئ نيز شامل متدی است که اقدام به ذخيره فايل می کند. بنابراين قبل از ذخيره کردن بايد مطمئن شد که آيا شئ PostedFile به چيزی اشاره می کند و يا اينکه تهی است. برای اين منظور کد مربوط به ذخيره سازی را در شرط زير قرار می دهيم:

If Not (MyInputFile.PostedFile Is Nothing) Then

و درصورت صحيح بودن شرط، اقدام به ذخيره سازی می نماييم. متد SaveAs شئ PostedFile دارای پارامتری است که محل و نام فايلی که قرار است بر روی سرور ذخيره شود را مشخص می کند. در انتها نيز پيغامی مبنی بر اينکه فايل با موقيت ذخيره شده است را به کاربر می دهيم.

Response.write("Your File was saved on the server successfuly...")

بنابراين کد طرف سرور به صورت زير خواهد بود:

<script language="vb" runat="server">
sub page_load(s as object,e as EventArgs)
If Not (MyInputFile.PostedFile Is Nothing) Then
MyInputFile.PostedFile.SaveAs("c:\filename.ext")
Response.write("Your File was saved on the server...")
End If
end sub
</script>

چند نکته
ديگر خصوصيات شئ PostedFile به صورت زير است:
• ContentLength: به اندازه فايل ارسالی اشاره ميکند.
• ContentType: MIME فايل ارسالی را مشخص می کند که در تشخيص نوع فايل دريافتی کمک می کند.
(بعضی از انواع رايج MIME عبارت اند از : text/plain ، image/gif ، image/jpeg ، audio/mpeg ، application/msword ، application/octed-stream ، video/mpeg ، audio/wav و...)
• FileName: نام فايل و مسير آن در کامپيوتر شخص کاربر را معين می کند.(مانند C:\images\personal\myface.jpg)
• InputStream: يک شئ stream که به فايل upload شده اشاره می کند و آنرا برای خواندن محتوايش آماده می سازد.

يک نکته مهم
توجه کنيد که به طور پيش فرض طول داده های ارسالی در يک request حداکثر 4096 بايت (يا همان 4 kb ) می باشد. بدين معنی که يک فايل ارسالی حداکثر می تواند 4 kb باشد. برای اينکه اين مقدار را به مقدار لازم و مورد نياز افزايش دهيد بايد در فايل web.config ويا machine.config در قسمت <system.web> در صورتيکه قسمت زير موجود نيست آنرا اضافه کنيد

<httpRuntime maxRequestLength="1000000"/>

ودر صورت وجود مقدار maxRequestLength را به مقدار دلخواه تنظيم کنيد. اين مقدار بر حسب بايت می باشد. در مثال بالا مقدار ماکزيمم فايل ارسال يک ميليون بايت (حدود 1 MGB) می باشد. به عنوان نمونه يک فايل web.config که فقط نياز فوق را برآورده سازد به صورت زير خواهد بود:

Configuration file : web.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration >
<system.web>
<httpRuntime maxRequestLength="1000000" />
</system.web>
</configuration>

لينک مقاله
http://www.iranasp.net :منبع

مقالات مرتبط با اين موضوع
upload کردن فايل به سرور در ASP.NET | aspdotnet
Namespace چيست؟ | aspdotnet
Smart Navigation چيست؟ | aspdotnet
چرا به دات نت احتياج داريم؟ | aspdotnet
نشان دادن قابليتهای مرورگر در ASP.NET | aspdotnet
آشنائی با ASP.NET | aspdotnet
نحوه پردازش صفحات ASP.NET بر روي سرويس دهنده وب | aspdotnet
ارسال ایمیل در ASP.NET با استفاده از HTML Template | aspdotnet
اضافه کردن تصویر به پایگاه داده | aspdotnet
برسی کوکی‌ها (Cookies) و جلسات (Sessions) در ASP.NET | aspdotnet
باز کردن پنجره Popup در ASP.NET با استفاده از Code Behind | aspdotnet
آشنائی با فرم‌های وب در ASP.NET | aspdotnet

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


مقده اي بر وب و زبان html
منظور از وب چيست؟
  • وب شبکه ای است متشکل از تمامی کامپيوترهای دنيا، شبکه ای از شبکه ها.
  • اينترنت، وب، WWW ، web يا W orld W ide W eb همگی يک چيزند.
  • تمامی کامپيوترهای وب ميتوانند با هم ارتباط داشته باشند.
  • کامپيوترهای موجود در وب با کمک استاندارد ارتباطی يا پروتوکل HTTP با هم ارتباط برقرار ميکنند .
نحوه کارکرد وب چگونه است؟
  • اطلاعات وب داخل فايلهائی به نام Web Pages و يا صفحات وب قرار دارند.
  • اين فايلها يا صفحات روی Web Server يا کامپيوترهای سرويس دهنده وب ذخيره شده اند.
  • برای ديدن صفحات وب از نرم افزاری به نام مرورگر و يا Web Browser استفاده ميشود.
  • دو مرورگر Internet Explorer و Netscape Navigator جزو معروفترين مرورگرها حساب ميشوند.
  • مرورگر Internet Explorer متعلق به شرکت مايکروسافت و مرورگر Netscape Navigator متعلق به شرکت نت اسکيپ ميباشد.
مرورگرها چگونه به خواندن صفحات وب ميپردازند؟
  • يک مرورگر با کمک يک Request درخواستی برای خواندن يک صفحه از وب سرور ميکند.
  • اين Request يا درخواست بر اساس استاندارد ارتباطی يا پروتوکل HTTP بوده و شامل آدرس صفحه مورد نظر ميباشد.
  • آدرس يک صفحه وب چيزی شبيه http://www.internet.com/faq.html است. بخش //:http نوع پروتوکل و يا استاندارد ارتباطی را تعيين ميکند، www.internet.com نام دومين يا Domain است و faq.html نام صفحه ای است که بايد خوانده شود.
مرورگرها چگونه صفحات وب را نمايش ميدهند؟
  • چگونگی نمايش يک صفحه وب بصورت مستتر در آن وجود دارد.
  • مرورگرها از روی دستورالعملهای داخل صفحات وب و با کمک تگ ها به نمايش صفحات ميپردازند.
  • وظيفه اصلی تگ های اچتمل ( HTML tags ) بيان چگونگی نمايش اطلاعات ميباشد.
  • يک تگ اچتمل چيزی شبيه <p> اين تگ پاراگراف است! </p> است.
چه کسانی استاندارد های وب را تعيين ميکند؟
  • تعيين استاندارد های وب ربطی به شرکتهای مايکروسافت و يا نت اسکيپ ندارد.
  • World Wide Web Consortium يا W3C متولی تعيين استانداردهای وب است.
  • HTML, CSS and XML از مهمترين استانداردهای تصويب شده وب ميباشند.
  • آخرين استاندارد HTML استاندارد XHTML 1.0 ميباشد .
لينک مقاله
http://www.aviny.com :منبع

مقالات مرتبط با اين موضوع
دریم ویور : رویاباف طراحان وب | html
سایت خود را مطابق تکنولوژی جستجوگر ها طراحی کنید | html
متاتگ چیست ؟ | html
نمايش عكسي به دنبال نشانگر ماوس | html
تگ Anchor و شناسه href | html
دو نکته بسيار مهم در مورد فارسی نويسی | html
تگ های اچتمل | html
مقده اي بر وب و زبان html | html
قرار دادن تصوير در صفحات و کد جدول | html
معرفي تگ هاي اوليه در اچ تي ام ال | html
آموزش زبان صفحات وب HTML | html

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


تگ های اچتمل

تگ های اچتمل (HTML Tags)

  • با کمک تگ های اچتمل عناصر و يا Elements ساخته ميشوند.
  • در زبان اچتمل حدود 80 عنصر تعريف شده است.
  • تگ های اچتمل بوسيله دو نويسه (char) > و < ساخته ميشوند.
  • تگ های اچتمل معمولا بصورت زوج ظاهر ميشوند، مانند <b>test</b>
  • تگ اول در يک زوج تگ مثلا <b> تگ شروع و تگ دوم مثلا <b/> تگ پايانی نام دارد.
  • متن بين تگ اول و تگ دوم در يک زوج تگ محتوای عنصر يا element content ناميده ميشود، مثلا "test"
  • تگ های اچتمل را ميتوانيد بوسيله حروف لاتين کوچک (lower case) و يا بزرگ (upper case) بنويسيد و case sensitive نيستند. برای مثال دو تگ <b> و <B> معادل هم هستند ولی شديدا توصيه ميشود که به خاطر سازگاری با XHTML از حروف کوچک استفاده شود.

عناصر اچتمل (HTML Elements)

مثال بخش مقدمه را در نظر بگيريد:

<html>
<head>
<title>Title of page</title>
</head>
<body>
This is my first html page. <b>This text is bold</b>
</body>
</html>

*** نمونه ای از يک عنصر اچتمل:

<b>This text is bold</b>

عنصر اچتمل بالا با تگ <b> شروع شده و با تگ <b/> پايان می يابد. محتوای اين عنصر عبارت "This text is bold" است. لازم به ذکر است که کاربرد تگ <b> نمايش توپر يا bold متون است.

*** مثال دوم يک عنصر اچتمل (معلوم الحال) :

<body>
This is my first homepage. <b>This text is bold</b>
</body>

عنصر اچتمل بالا با تگ <body> شروع شده و با تگ <body/> پايان می يابد. همانطور که ميبينيد گاهی يک عنصر حاوی يک يا چند تگ ديگر ميباشد.وظيفه تگ <body> تعيين بدنه اصلی يا body يک متن اچتمل است.لازم به يادآوری است که تنها اطلاعات بخش <body> يک فايل اچتمل در صفحه مرورگر نمايش داده خواهد شد.

شناسه های يک تگ (Tag Attributes)

تگ ها ميتوانند حاوی اطلاعات اضافی ديگر باشند، به اين اطلاعات شناسه يا Attribute ميگويند و وظيفه آنها بيان ديگر اطلاعات يک عنصر يا Element ميباشد. مثلا در مورد تگ <body> شناسه ای به نام bgcolor وجود دارد که رنگ زمينه متن (background) را تعيين ميکند برای نمونه اگر ميخواهيد که رنگ زمينه صفحه اچتملتان سياه باشد کافی است که به شکل زير عمل کنيد :

<body bgcolor="black">

در مثال زير تگ <body> دارای چهار شناسه مختلف با نامهای width، height ، align و border و مقادير center، 60، 100 و 0 ميباشد.

<table border="0" width="100" height="60" align="center" >
......
</table>

شناسه ها به صورت کلی "مقدار=نام" يا "name=value" نوشته ميشوند و هميشه به تگ شروع يک عنصر يا Element اضافه ميشوند و نهايتا اگر در يک عنصر يا Element شناسه ها قيد نشوند از مقادير قراردادی يا default آنها استفاده خواهد شد مثلا در تگ body اگر شناسه bgcolor نوشته نشود از رنگ سفيد برای زمينه صفحه استفاده خواهد شد.
مقدار يک شناسه را ميتوانيد داخل نويسه های " و يا ' بنويسيد و اختيار دست شما است فقط در مواردی که مقدار يک شناسه شامل نويسه " هم ميشود بايد از نويسه ' استفاده شود.
لينک مقاله
http://www.aviny.com :منبع

مقالات مرتبط با اين موضوع
دریم ویور : رویاباف طراحان وب | html
سایت خود را مطابق تکنولوژی جستجوگر ها طراحی کنید | html
متاتگ چیست ؟ | html
نمايش عكسي به دنبال نشانگر ماوس | html
تگ Anchor و شناسه href | html
دو نکته بسيار مهم در مورد فارسی نويسی | html
تگ های اچتمل | html
مقده اي بر وب و زبان html | html
قرار دادن تصوير در صفحات و کد جدول | html
معرفي تگ هاي اوليه در اچ تي ام ال | html
آموزش زبان صفحات وب HTML | html

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


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

روش کدگزاری UTF-8
اکيدا توصيه ميشود که برای تايپ و تمايش متون فارسی از استاندارد يونيکد و روش کدگزاری UTF-8 اسنفاده شود و اين روشی است که مطالب اين سايت و اديتور آنلاينش از آن استفاده ميکند.نکته مهم در نمايش صحيح متون فارسی تعيين نوع کدگزاری يا encoing صفحات فارسی است که برای اينکار بايد از متاتگ خاصی به نام http-equiv در بخش head صفحات اچتمل به شکل زير استفاده شود:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

در اينصورت مرورگر يا Browser قبل از نمايش صفحه از روی متاتگ فوق نوع کدگزاری (Encoding) را تشخيص داده و ديگر مثلا نيازی به تعيين دستی (دراکسپلورور 5 : View/Encoing/Unicode / UTF-8 ) نوع Encoing توسط بازديدکننده سايت نخواهد بود.

 شناسه يا attribute ی به نام dir
جهت نمايش متون لاتين به صورت پيش فرض و default از چپ به راست (ltr) ميباشد.در مورد متون و جملات فارسی بايد با کمک روشی جهت نمايش پيش فرض را به "راست به چپ" تغيير دهيد. شناسه يا attribute ی به نام dir يا همان direction اين کار را برای شما انجام ميدهد. اين شناسه دارای دو مقدار ممکن ميباشد :

dir="ltr" , Left-to-right text. - چپ به راست
dir="rtl" , Right-to-left text. - راست به چپ

مثلا برای نمايش جمله فارسی "سلام بر دنيای وب!" با کمک عناصر p يا div کافی است که به يکی از شکلهای زير عمل شود:

<p dir="rtl"> سلام بر دنيای وب </p>
<div dir="rtl"> سلام بر دنيای وب </div>

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

<p> , <div> , <html> , <body> , <table> , <tr> , <td> , <h1 ... h6> , <input> , <pre> , <select> , <span> , ...

لينک مقاله
http://www.khaterat.com/www/ :منبع

مقالات مرتبط با اين موضوع
دریم ویور : رویاباف طراحان وب | html
سایت خود را مطابق تکنولوژی جستجوگر ها طراحی کنید | html
متاتگ چیست ؟ | html
نمايش عكسي به دنبال نشانگر ماوس | html
تگ Anchor و شناسه href | html
دو نکته بسيار مهم در مورد فارسی نويسی | html
تگ های اچتمل | html
مقده اي بر وب و زبان html | html
قرار دادن تصوير در صفحات و کد جدول | html
معرفي تگ هاي اوليه در اچ تي ام ال | html
آموزش زبان صفحات وب HTML | html

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


تگ Anchor و شناسه href

برای ايجاد پيوند به صفحات ديگر از تگ <a> استفاده ميشود. پيوندها ميتوانند به بخش ديگری از همان صفحه، صفحات ديگر وب، تصاوير، فايلهای صوتی يا حتی فيلم ها و ... اشاره کنند.
فرم کلی يک پيوند به قرار زير است:

<a href="url">Some Text</a>

در مثال بالا تگ <a> برای ايجاد پيوندی به صفحه ای ديگر که آدرس اينترنتی آن url ميباشد بکار رفته است. برای تعيين مقصد و يا آدرس صفحه جديد از شناسه ای به نام href که همان h yerlink ref erence ميباشد، استفاده ميشود و مقدار اين شناسه در واقع همان آدرس اينترنتی صفحه مقصد است. بخش قابل رويت پيوند و در واقع متــنــی (و يا تصويری ) که توسط مرورگر نمايش داده خواهد شد و بازديدکننده روی آن کليک خواهد کرد ميان تگهای <a> و </a> قرار داده ميشود و هر چند که در مثال بالا اين بخش متن "Some Text" است ولی ميتواند حتی يک تصوير باشد.

برای نمونه کد اچتمل زير پيوندی به سايت google.com ايجاد خواهد کرد:

<a href="http://www.google.com/">Visit Google Site</a>

و مرورگر پيوند بالا را به شکل زير نمايش داده و در اثر کليک روی پيوند توسط بازديدکننده، مرورگر به سايت Google خواهد رفت.

لينک مقاله
http://www.khaterat.com/www/ :منبع

مقالات مرتبط با اين موضوع
دریم ویور : رویاباف طراحان وب | html
سایت خود را مطابق تکنولوژی جستجوگر ها طراحی کنید | html
متاتگ چیست ؟ | html
نمايش عكسي به دنبال نشانگر ماوس | html
تگ Anchor و شناسه href | html
دو نکته بسيار مهم در مورد فارسی نويسی | html
تگ های اچتمل | html
مقده اي بر وب و زبان html | html
قرار دادن تصوير در صفحات و کد جدول | html
معرفي تگ هاي اوليه در اچ تي ام ال | html
آموزش زبان صفحات وب HTML | html

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


CSS و كاربرد آن در طرح هاي امروزي

CSS جايگزيني براي نمايش مبتني بر HTML پيشنهاد مي كند و اكنون به وسيله ي انجمن طراحي وب پذيرفته شده است . سازگاري css نيازمند برخي تغييرات از سوي توليد كنندگان وب است . css بسيار حساس به نحو دستوري است ، و اشتباهات كوچك مي توند باعث شكست كامل يك قانون css شود . بنابراين ، طراحان بايد از مشخصات آن آگاه باشند .

متاسفانه ، حتي اگر از قوانين پيروي كنيد ، خطاهاي آشكاري در پياده سازي مرورگرهاي پيشرفته وجود دارد . چيزهاي زيادي وجود دارد كه بايد درباره ي CSS بدانيد ، و امكانات جديد هر لحظه اضافه مي شود . CSS1 تعيين اولين شيوه نامه ، بيش از 50 خاصيت را تعريف مي كند ، و CSS2 بيش از 50 خاصيت ديگر را . CSS2 تسهيلات تغيير مكان كه CSS-P ناميده مي شود را به وجود آورده است . نگارش جديد كه CSS3 نام دارد قصد دارد امكانات ارائه بيشتري را به وجود آورد ، و با فناوري هاي ديگر ، نطير اسكريپت و گرافيك هاي برداري ، بيشتر يكپارچه شود .

مهم است به خاطر داشته باشيد كه HTML اساس و پايه ي يك صفحه وب است . CSS در واقع ، به طور مستقيم به استفاده صحيح از عناصر HTML يا XHTML استناد مي كند . ولي ، اگر به كد ناهنجاري محدود شده باشند لزوما به طور قابل پيش بيني اي كار نمي كنند .

هر چند واضح است كه مي خواهيم به برچسب هاي منطقي معني بدهيم ، ولي مواظب باشيد كه اين به شما مجوز نمي دهد از CSS به جاي كد HTML استفاده كنيد . قوانيني كه ارائه محدود برخي برچسب ها را تغيير مي دهند نبايد به كار روند . براي مثال در اينجا باعث مي شويم كه برچسب هاي <b> به طور غير معمولي عمل كنند و تمام اشكال تزئيني پيوندها را حذف نمايند :

b {font-style:italic; font-weight:normal;}
a {text-decoration:none; color: black; }

( اگر به دليل خاصي اين قوانين را بازنويسي كرده ايد ، حتما بايد آن ها را توضيح گذاري كنيد ) به خاطر مشكل معناي پيش فرض در HTML ، شايد برچسب هاي <div> و <span> فوق العاده مفيد باشند . هم چنين برچسب <div> يك برچسب بلوكي است كه هيچ نمايش پيش فرضي ندارد ، بنابراين در حالت دهي به بخش هاي بزرگ يك سند مفيد است . براي مثال :

<div style="background: lightblue; font-weight: bold; color: black;">
<p>This Paragraph is highlighted in blue.</p>
</div>

به طور مشابه برچسپ <span> هيچ معني يا نمايش از پيش تعريف شده ايي ندارد ، ولي وقتي يك برچسب هيچ كاراكتر بازگشت به ابتداي خط ( carriage return ) را نداشته باشد ، هنگام الصاق اطلاعات سبك به چند كلمه يا حرف ، مفيد به نظر مي آيد ، مانند مثال زير :

<p>Calling out<span style="background-color:#99CC00; font-weight:bold; color:#000000"></span>isn't hard with SPAN</p>

روش هاي متفاوتي براي اضافه كردن CSS به سند HTML وجود دارد ، و همه آن ها داري مزايا و معايبي است كه قبل از اينكه روشي در نظر گرفته شود بايد به دقت سبك و سنگين شود . ابتدا مي توانيد در بخش سر صفحه ي يك سند HTML با مشخص ساختن رابطه پيوندي به يك شيوه نامه ي خارجي ، به آن متصل شويد . براي مثال :

<link rel="stylesheet" href="styles/global.css" media="screen" />

روش دوم براي اضافه كردن CSS ، نهفته كردن آن است . وقتي يك شيوه نامه نهفته مي شود ، قوانين شيوه نامه را به طور مستقيم درون سند HTML بنويسيد . شيوه نامه ي گسترده شدن درون سند ( document-wide style ) يك راه بسيار ساده براي شروع استفاده از CSS است . يك برچسب <style> درون سر صفحه ي سند HTML قرار دهيد . به دليل اينكه چند شكل از شيوه نامه ها ممكن است اضافه شود ( فراتر از شكل استاندارد CSS ) بايد هنوز هم صفت type را اضافه كنيد تا نشان دهيد كه كدام شكل از شيوه نامه را به كار مي بريد ، البته صرفنظر از پشتيباني پيش فرض مرورگر از فناوري هاي شيوه نامه ها . به مثال هاي زير توجه كنيد :

شيوه نامه گسترده درون برجسب استايل

<style type="text/css">
body {background-color:#666666; font-size:9px; }
h1 {color:#990000;}
</style>

شيوه نامه پيوندي درون برجسب استايل

<style type="text/css">
@import url( wp-layout.css );
</style>

يك نگراني در مورد شيوه نامه ها ي گنجانده شده اين است كه همه ي مرورگرها اطلاعات شيوه نامه را به درستي درك نمي كنند . براي اجتناب از مشكلات ، اطلاعات شيوه نامه ها را با استفاده از روش توضيح گذاري HTML ، تبديل به توضيحات كنيد . به طوري كه اين توضيحات روي صفحه نمايش نشان داده نمي شوند يا توسط مرورگرهاي قديمي تر ، به طور نادرستي تفسير نمي گردند . ( نمي دانم نويسنده اين مطلب را براي چه عصري از مرورگرها نوشته ! اما احتياط شرط عقل است ! مهم تر از اون اين يك استاندارد است ! پس طراحان موظف به انجام آن هستند )

CSS گسترده شده درون سند در مقايسه با CSS پيوندشده داراي معايب قابل ملاحظه اي است زيرا بايد در هر صفحه كه استقاده مي شود يك نسخه از آن كپي شود . اين كار باعث سخت تر شدن اين گونه سايت ها مي شود و از حافظه نهائي محلي مرورگر نيز به شكل بهينه استفاده نمي شود .

آخرين روش به كار بردن CSS اعمال آن درون مولفه هاي ويژه با استفاده از صفت رايج style است . نيازي نيست كه اين گونه اطلاعات مربوط به شيوه نامه ها از مرورگرهايي كه نسبت به شيوه نامه ها اطلاعي ندارند مخفي شود ، زيرا مرورگرها صفاتي كه نمي فهمند را در نظر نمي گيرند . به مثال زير توجه كنيد :

<p style="color:#3366FF; font-size:12px;">This is red blue text!</p>

ولي بسياري از مزاياي اصلي استفاده از CSS به اين روش به دست نمي آيد . زيرا CSS خيلي به برچسب وابسته هستند . در واقع ، همه توافق دارند كه اين شيوه خيلي بهتر از به كاربردن برچسب هاي جديد جهت تشريح ظاهر صفحه نمي باشد . ولي برخي از طراحان از CSS به اين روش استفاده مي كنند تا از كد HTML قديمي به CSS پلي بزنند .

لينک مقاله
http://weblog.alvanweb.com :منبع

مقالات مرتبط با اين موضوع
انواع استایل ها | css
ده نکته برای افزایش سرعت بارگزاری صفحات وب | css
استايل (CSS) چيست؟ | css
صفحات دو ستونی در CSS | css
رنگ ScrollBar صفحه سايت خود را عوض كنيد | css
CSS و كاربرد آن در طرح هاي امروزي | css

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


رنگ ScrollBar صفحه سايت خود را عوض كنيد

براي اينكه رنگ ScrollBar صفحه سايت خود را عوض كنيد كافي است كد زير را در ابتداي برنامه خود اضافه كنيد. (تقريبا بعد از تگ )

<STYLE type=text/css>
BODY {
SCROLLBAR-FACE-COLOR: #739cbd;
SCROLLBAR-HIGHLIGHT-COLOR: #ffffff;
SCROLLBAR-SHADOW-COLOR: #1f1f1f;
SCROLLBAR-3DLIGHT-COLOR: #739cbd;
SCROLLBAR-ARROW-COLOR: #ffffff;
SCROLLBAR-TRACK-COLOR: #cee6f2;
SCROLLBAR-DARKSHADOW-COLOR: #ffffff
}
</STYLE>

خب يك توضيحي در مورد اين سورس بدم...

اول اينكه اين چند خط كد از دستورات CSS‌پيروي ميكنه كه در تگ Style قرار گرفته است.

Scrollbar-face-color: در اين قسمت رنگ اصلي اسكرول را تعيين مي كنيد.

Scrollbar-shadow-color: در اين قسمت رنگ سايه اسكرول را مشخص مي كنيد (خط موجود در سمت راست و پايين اسكرول)

Scrollbar-highlight-color: در اين قسمت رنگ قسمت روشن اسكرول را مشخص مي كنيد (خط موجود در سمت چپ و بالاي اسكرول)

Scrollbar-3dhigh-color: اين پارامتر رنگ بوردر (خط) دور اسكرول را مشخص مي كند. (خط كلي در دور تا دور اسكرول)

Scrollbar-darkshadow-color: خط دوم سايه اسكرول را مشخص مي كند . (اين خط بر روي خط سايه كه در سمت راست و بالاي اسكرول است قرار ميگيرد)

Scrollbar-track-color: اين قسمت رنگ زمينه اسكرول را مشخص مي كند.

Scrollbar-arrow-color: رنگ فلش هاي موجود در كليدهاي بالا و پايين اسكرول را تغيير مي دهد.
لينک مقاله
http://www.majidonline.com :منبع

مقالات مرتبط با اين موضوع
انواع استایل ها | css
ده نکته برای افزایش سرعت بارگزاری صفحات وب | css
استايل (CSS) چيست؟ | css
صفحات دو ستونی در CSS | css
رنگ ScrollBar صفحه سايت خود را عوض كنيد | css
CSS و كاربرد آن در طرح هاي امروزي | css

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


Preload براي صفحات وب

طراحي سنگين در بعضي از صفحات باعث زياد شدن حجم آن صفحات ميشود. حجم زياد صفحات مخصوصا براي ما ايرانيان يك مشكل هميشگي و سدي براي طراحان بوده و خواهد بود! همين موضوع باعث خستگي و دلسرد شدن كاربر و بازديد كننده از صفحات ميشود و باعث ميشود بازديد كنندگان سايت روز به روز كمتر شوند. اما بايد براي اين كار چاره‌اي انديشيد. معقولانه ترين راه طراحي منطقي و كم حجم در عين حال زيبا و كاربر پسند است. اما گاهي اوقات نميتوان به هر دليلي صفحات را در حجم كم طراحي نمود مخصوصا صفحاتي كه داراي عكسهاي زيادي هستند. پس براي مشكل دوم هم بايد يك راهي را در نظر گرفت تا بتوان طراحي خوبي ارائه داد. در اين آموزش شما ياد خواهيد گرفت كه با يك سري دستورات جاوا اسكريپت چگونه براي صفحه خود Preloader قرار دهيد. اينكار سبب ميشود كه كاربر كمي آرامتر شده و تحمل آن هم براي ديدن صفحات بيشتر خواهد شد. اين كار را ميتوانيد در تمام سايتها و يا وبلاگها عملي كنيد.

براي شروع كار ابتدا كد جاوا اسكريپت زير را در تگ <head> صفحه مورد نظرخود قرار دهيد.

<SCRIPT>

var DHTML = (document.getElementById || document.all || document.layers);

function ap_getObj(name)

{

if (document.getElementById)

{

return document.getElementById(name).style;

}

else if (document.all)

{

return document.all[name].style;

}

else if (document.layers)

{

return document.layers[name];

}

}

function ap_showWaitMessage(div,flag)

{

if (!DHTML) return;

var x = ap_getObj(div);

x.visibility = (flag) ? 'visible':'hidden'

if(! document.getElementById)

if(document.layers)

x.left=280/2;

return true;

}

</SCRIPT>

و سپس كد زير را بعد از <body> قرار دهيد:

<DIV id=waitDiv style="LEFT: 40%; VISIBILITY: hidden; POSITION: absolute; TOP: 50%; TEXT-ALIGN:center">

<TABLE cellPadding=6 border=0>

<TBODY>

<TR>

<TD align=middle>

<IMG alt="Please wait" src="loading.gif">

</TD>

</TR>

</TBODY>

</TABLE>

</DIV>

<SCRIPT>

ap_showWaitMessage('waitDiv', 1);

</SCRIPT>

در كدي كه بالا ذكر شد شما ميتوانيد طراحي مورد نظر خود را داخل تگ <DIV> قرار دهيد. توجه داشته باشيد تگ <DIV> حتما بايد وجود داشته باشد ولي محتواي درون آن (در اين كد مثلا <Table> ) ميتواند با توجه به نياز شما تغيير كند.

سپس كد زير را دقيقا بالاي (قبل از) </body> قرار دهيد. (اين تگ در يك خط مانده به آخرين خط صفحه شما قرار دارد)

<SCRIPT>

ap_showWaitMessage('waitDiv', 0);

</SCRIPT>

حالا ديگر كدهاي نوشته شده توسط شما كار خواهد كرد. كافي است صفحه مورد نظر را درون سايت خود قرار دهيد و سپس آنرا مشاهده نمايد .

توجه داشته باشيد اين preload بر حسب load شدن صفحه شما ميباشد.
لينک مقاله
http://www.majidonline.com :منبع

مقالات مرتبط با اين موضوع
JavaScript چيست؟ | javascript
افکت قلب و لب همراه باموس. | javascript
لرزش صفحه وب سايت هنگام باز شدن | javascript
کد بارش بارون و بارش برف در صفحه وبلاگ | javascript
خاموش کردن قابليت کليک راست | javascript
نمايش پيغامهاي تصادفي در نوار وضعيت | javascript
طريقه Fade كردن عكسها با استفاده از جاوا اسكريپت | javascript
Preload براي صفحات وب | javascript

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


طريقه Fade كردن عكسها با استفاده از جاوا اسكريپت

مطمئنا خيلي دوست داريد كه صفحات پويا و جذابي را خلق كنيد. من هم سعي خواهم كرد كه ترفندهايي كه براي اين كار وجود دارند را تا جايي كه بدانم و بدستم برسد را در سايت قرار دهم تا شما دوستان هم از آن استفاده كنيد. يكي از كارهاي جالي كه شما براي زيباتر شدن سايتتان ميتوانيد انجام دهيد Fade‌ كردن عكسها است. اين كار باعث ميشود كه در بازديد كنند حس لطافت و نرمي تداعي شود كه باعث راضي بودن بازديد كننده از سايت شما ميشود. در زير يك نمونه از همين كار را مشاهده ميكنيد.

◊ حداقل نيازها ◊

امكان Transparent كردن عكسها از Internet Explorer 5‌ به بعد به آن اضافه شد . بنابراين بازديد كننده شما بايد حتما از مرورگر Internet Explorer و با نسخه 5 به بالا به سايت شما متصل شود در غير اين صورت عكس به حالت عادي خود نمايش داده ميشود.

◊ آموزش ◊

براي اجراي اين آموزش شما دو روش را ميتوانيد در پيش بگيريد . اول آنكه كد جاوا اسكريپت آنرا در خود فايل قرار دهيد و دوم آنكه آنرا در يك فايل جاوا اسكريپت خارجي قرار دهيد. حالا من هر دو راه را توضيح ميدهم.

در ابتدا كد جاوا اسكريپ زير را كپي برداشته و در يك فايل Text قرار دهيد.

انتخاب كد

حالا چنانچه ميخواهيد آنرا در يك فايل جداگانه ذخيره نماييد و در صفحه خود آنرا فراخواني نماييد، آنرا به نام picfader.js ذخيره كنيد و سپس در صفحه خود قبل از تگ </head> كد زير را قرار دهيد:

<SCRIPT LANGUAGE="javascript" TYPE="text/javascript" SRC="picfader.js"></SCRIPT>

و اگر مايليد كه كد جاوا اسكريپت را مستقيما در صفحه خود قرار دهيد كافي است همان كدي را كه كپي برداشتيد و در يك فايل متني چسبانده ايد را دوباره كپي برداريد و قبل از تگ </head> درون دو تا تگ <script> و </script> قرار دهيد.

حالا برايfade كردن عكس هم دو حالت وجود دارد يك حالت زماني كه ماوس بر روي عكس رفت و عكس به تنهايي محو شود يا اينكه زماني كه عكس بر روي يك لينك رفت آنگاه عكس محو شود. در هر دو راه روش كار يكي است اما فقط يك تغيير كوچو بايد بدهيد.

اگر ميخواهيد كه زماني كه ماوس بر روي عكس رفت آن محو كد زير را در تگ <img> خود قرار دهيد:

style="filter:alpha(opacity=30)" onMouseOver="nereidFade(this,100,50,20)" onMouseOut="nereidFade(this,30,50,5)"

در اين كد در قسمت اول يعني style مقدار محو شدن عكس يا همان opacity را مشخص ميكنيد در قسمت دوم كه با onMouseOver‌شناخته شده است مقداري كه ماوس بر روي عكس رفت را مشخص ميكنيد و در قسمت onMouseOut مقداري كه ماوس از روي عكس خارج شد.

حالا چنانچه بخواهيد اين حالت را زماني كه ماوس بر روي يك لينك رفت اتفاق بيفتيد كافيست كه براي عكس خود فقط قسمت اول كد بالا را يعني همان style‌را در تگ <img> خود قرار دهيد و حتما يادتان باشد كه براي عكس خود يك نامي هم در نظر بگيريد. حالا در داخل تگ <a> كه مربوط ميشود به لينك شما بقيه كد را قرار دهيد. حالا براي اينكه مطلب روشن تر شود من براي هر كدام از حالات بالا يك مثال آورده ام:

براي زماني كه ماوس بر روي عكس ميرود:

<img src="majidbanner.gif" width="468" height="60" style="filter:alpha(opacity=30)" onMouseOver="nereidFade(this,100,50,20)" onMouseOut="nereidFade(this,30,50,5)">

براي زماني كه ماوس بر روي يك لينك ميرود:

<img src="majidbanner.gif" width="468" height="60" style="filter:alpha(opacity=30)" name="majidbanner">

<a href="www.majidonline.com" onMouseOver="nereidFade(majidbanner,100,50,20)" onMouseOut="nereidFade(majidbanner,30,50,5)">The Iranian Graphic and Web Reference</a>

خب حالا كار تمام شد و ميتوانيد از آن لذت ببريد. فقط يك توضيح كوچك براي متغيرهاي اين كد بدهم.

onMouseOver="nereidFade(majidbanner,100,50,20)"

مقدار majidbanner كه در كد بالا مشخص شده است همان نام عكس ما است كه چنانچه از يك لينك براي محو شدن عكس استفاده ميكنيد بايد حتما نام عكس را در اينجا ذكر كنيد ولي در صورتي كه اين كار را ميخواهيد بر روي عكس اعمال نماييد ديگر نيازي به نام عكس نيست و مقدار آن ميتواند this‌باشيد.

مقدار 100 كه در كد بالا مشخص شده است درصد محو شدگي عكس است مثلا اگر مقدار آن 100 باشد يعني آنكه در آن لحظه مقدار محوي عكس هيچ است يعني كامل عكس نمايش داده ميشود يا چنانچه مقدار آن 50 باشد يعني آنكه 50 درصد عكس نمايش داده ميشود.

مقدار 50 كه در كد بالا مشخص شده است در اصطلاع تعداد فريمهاي ما هستند (fps) كه هرچه مقدار آن بيشتر باشد تعداد فريمهاي هنگام نمايش بيشتر خواهد بود ولي تا حدي سرعت fade‌ شدن كم ميشود.

مقدار 20 كه در كد بالا مشخص شده است مقدار زمان نمايش هر فريم است كه با زياد كردن آن سرعت بيشتر و با كم كردن آن سرعت آهسته تر ميشود.
لينک مقاله
http://www.majidonline.com :منبع

مقالات مرتبط با اين موضوع
JavaScript چيست؟ | javascript
افکت قلب و لب همراه باموس. | javascript
لرزش صفحه وب سايت هنگام باز شدن | javascript
کد بارش بارون و بارش برف در صفحه وبلاگ | javascript
خاموش کردن قابليت کليک راست | javascript
نمايش پيغامهاي تصادفي در نوار وضعيت | javascript
طريقه Fade كردن عكسها با استفاده از جاوا اسكريپت | javascript
Preload براي صفحات وب | javascript

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


نمايش عكسي به دنبال نشانگر ماوس

اين يكي ديگه از آموزش هايي است كه با استفاده از اون مي تونيد مثل مقاله قبلي يه چيزي رو به دنبال موس به حركت در بيارين , اما با اين تفاوت كه به جاي متن شما مي تونيد عكس يا عكس هايي رو به دنبال موس به حركت در بياريد.

شما براي اين كار بايد دقيقا" بعد از <Body> اين سورس را به فرم خود اضافه كنيد :

خوب حالا توضيحات :

احتمالا" اگرحالا شما صفحه را Refresh كنيد مي بينيد كه چيزهايي شبيه عكس به دنبال موس در حركت مي باشد .

براي اينكه شما عكس هاي خودتان را جاي گزين كنيد بايد در اون پوشه اي كه اي page را قرار داديد 4 فايل عكس به انشعاب gif به نام هاي pic1.gif , pic2.gif , pic3.gif , pic4.gif را در اون پوشه قرار بديد.

البته در خود سورس هم توضوحاتي نوشتم كه اگه كسي خواست اين كار رو سفارشي تر انجام بده مي تونه اون ها رو هم تغييير بده به عنوان مثال در اول سورس يه چيزي مثل اين هست var imgwidth=40; // Image width كه با تغيير اون 40 به عددي ايگه مي تونيد ارتفاع عكس هايي رو كه به دنبال موس هستند رو عوض كنيد.

لينک مقاله
http://www.majidonline.com :منبع

مقالات مرتبط با اين موضوع
دریم ویور : رویاباف طراحان وب | html
سایت خود را مطابق تکنولوژی جستجوگر ها طراحی کنید | html
متاتگ چیست ؟ | html
نمايش عكسي به دنبال نشانگر ماوس | html
تگ Anchor و شناسه href | html
دو نکته بسيار مهم در مورد فارسی نويسی | html
تگ های اچتمل | html
مقده اي بر وب و زبان html | html
قرار دادن تصوير در صفحات و کد جدول | html
معرفي تگ هاي اوليه در اچ تي ام ال | html
آموزش زبان صفحات وب HTML | html

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


نمايش پيغامهاي تصادفي در نوار وضعيت

شما براي اين كار بعد از <Body> اين سورس را به فرم خود اضافه كنيد :

خوب حالا توضيحات :

براي تغيير آن پيغام ها بايد به قسمت اول سورس برويد تا به جايي برسيد كه يه چيزي شبيه اين رو ببينين messages[1] = "Message A" با تغيير اين پيغام ها پيغام خودتون را به نمايش در بيارين.

و يه كم پايين تر مي بينيد كه نوشته شده var delay = 50 با تغيير عدد 50 مي تونيد سرعت حركت رو هم تغيير بديد.

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

لينک مقاله
http://www.majidonline.com :منبع

مقالات مرتبط با اين موضوع
JavaScript چيست؟ | javascript
افکت قلب و لب همراه باموس. | javascript
لرزش صفحه وب سايت هنگام باز شدن | javascript
کد بارش بارون و بارش برف در صفحه وبلاگ | javascript
خاموش کردن قابليت کليک راست | javascript
نمايش پيغامهاي تصادفي در نوار وضعيت | javascript
طريقه Fade كردن عكسها با استفاده از جاوا اسكريپت | javascript
Preload براي صفحات وب | javascript

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


خاموش کردن قابليت کليک راست

اين آموزش به شما ياد مي دهد كه اگر خواستيد گاهي از اوقات در Page شما كسي نتواند از Rclick Mouse استفاده كند مانع او شويد.

شما براي اين كار بعد از <Body> اين سورس را به فرم خود اضافه كنيد :

خوب حالا توضيحات :

حالا ديگه كسي نمي تونه در صفحه شما Rclick كند.

وقتي بر روي Page Rclick كنيد اين پيغام ظاهر مي شود : You can not R.click

براي تغيير آن پيغام ها بايد به قسمت اول سورس برويد تا به جايي برسيد كه اين رو ببينين var message="You can not R.click"; با تغيير اين پيغام پيغام خودتون را به نمايش در بيارين
لينک مقاله
http://www.majidonline.com :منبع

مقالات مرتبط با اين موضوع
JavaScript چيست؟ | javascript
افکت قلب و لب همراه باموس. | javascript
لرزش صفحه وب سايت هنگام باز شدن | javascript
کد بارش بارون و بارش برف در صفحه وبلاگ | javascript
خاموش کردن قابليت کليک راست | javascript
نمايش پيغامهاي تصادفي در نوار وضعيت | javascript
طريقه Fade كردن عكسها با استفاده از جاوا اسكريپت | javascript
Preload براي صفحات وب | javascript

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


صفحات دو ستونی در CSS

در هنگام طراحي صفحات با استفاده از CSS بعضي مرتكب اين اشتباه ميشود كه بخش كناري صفحه را در اول صفحه قرار ميدهند و بخش اصلي را در زير آن; به همين علت بازديدكنندگان تا پايان كار لود شدن بخش كناري بايد صبر كنند.

در قسمت كناري صفحه اغلب كدهاي javascript براي استفاده از سرويسهاي سايتهاي مختلف (مثل سايتهاي اندازه گيري بازديدكنندگان يا سايت blogrolling براي لينكهاي سايت) وجود دارد به همين خاطر كار لود شدن آن قسمت مدت به نسبت زيادي را به خود اختصاص ميدهد. به همين دليل در صورت قرار گيري اين بخش در قسمت بالاتر صفحه كار لود شدن نوشته هاي اصلي صفحه به تعويق خواهد افتاد.

اين كار بر خلاف فلسفه طراحي با استفاده از CSS است. ما با استفاده از CSS سعي ميكنيم كاري كنيم كه مطالب مهمتر زودتر از بقيه موارد ظاهر شوند.

براي قرار دادن بخش اصلي در ابتداي صفحه تگ DIV مربوط به بخش اصلي را در ابتدا و تگ DIV مربوط به بخش كناري را بعد از آن قرار دهيد. سپس خصوصيت float مربوط به style بخش اصلي را تايين كنيد. مثال:

<html>
<head>
<style>
.Page_body { background-color: #FF0000;float:left }
.Page_side { background-color: #0000FF; }
</style>
</head>
<body>
<div class="Page_body">Page contents here</div>
<div class="Page_side">Page Side Contents</div>
</body>
</html>
لينک مقاله
http://weblog.mojde.com :منبع

مقالات مرتبط با اين موضوع
انواع استایل ها | css
ده نکته برای افزایش سرعت بارگزاری صفحات وب | css
استايل (CSS) چيست؟ | css
صفحات دو ستونی در CSS | css
رنگ ScrollBar صفحه سايت خود را عوض كنيد | css
CSS و كاربرد آن در طرح هاي امروزي | css

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


درج تاريخ شمسی، ميلادی و ساعت جاری در صفحات HTML

من 3 تا فايل خيلي كوچيك php درست كرده بودم براي درج تاريخ و زمان فعلي در صفحات HTML. بهتر ديدم اين فايلها رو در اختيار شما هم قرار بدم.

اين فايلها رو از اينجا داونلود كنيد. فايل شامل سه فايل: currenttime.php، currentdate.php و currentjdate.php به صورت زيپ شده است. فايلها را در يك سرور لينوكس آپ لود كنيد و به وسيله قرار دادن دستورهاي زير در صفحات HTML اونها رو صدا بزنيد:

براي ساعت جاري:

<script language="javascript" src="http://yoursite.com/currenttime.php">

براي تاريخ جاري به صورت ميلادي:

<script language="javascript" src="http://yoursite.com/currentdate.php">

براي تاريخ جاري به صورت شمسي:

<script language="javascript" src="http://yoursite.com/currentjdate.php">

تاريخ به صورت يوني كد است بنابراين بايد صفحه شما هم يوني كد باشد. در ضمن اين كد شامل تگهاي تبديل دايركشن به راست به چپ هم هست.

به جاي yoursite.com آدرس مكاني كه فايلها در آنجا آپلود شده است را وارد كنيد. البته لازم نيست اين فايلها حتما روي سايت خودتان باشد. ميتوانيد فايلها را روي سايتهايي كه فضاي مجاني با پشتيباني از php ميدهند قرار دهيد.
لينک مقاله
http://weblog.mojde.com :منبع

مقالات مرتبط با اين موضوع
انواع متغييرها در PHP | php
درج تاريخ شمسی، ميلادی و ساعت جاری در صفحات HTML | php
Hot Linking(نقره داغ وب مسترها) | php
يا بافر کردن خروجی | php
چگونه IP در PHP لاگ می شود | php
PHP و برنامه نويسی شی گرا | php
کوتيشن يا دابل کوتيشن؛ کی و کجا استفاده کنيم؟! | php
نصب فارسي نوك FarsiNuke در كلاينت XP,2000 | php
نمايش متن بصورت تصويري در اينترنت | php
كارتهاي الكترونيكي با php وmysql | php
چگونه يك برنامه لاگين امن و حرفه اي طراحي كنيد ? | php
مديريت فايل هاي ارسالي توسط كاربران | php
۷ دلیل برای اینكه استفاده از PHP بهتر از ASP می باشد | php
نکاتی مفید در مورد تنظیم php.ini | php
استفاده از تابع تبدیل تاریخ شمسی به میلادی و برعکس | php
راهنمای کامل نصب PHP بر روی windows | php
روش نصب PHP بروى Windows ها | php

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


استايل (CSS) چيست؟

استايل (CSS) چيست؟
- CSS مخفف کلمه Cascading Style Sheets ميباشند.
- اولين ورژن استايلها در سال ۱۹۹۶ ساخته شد. که اولين ورژن آن CSS1 بود.
- ديگر وژن آن CSS2 مي باشد که در سال ۱۹۹۸ ساخته شد که بيشتر براي ويرايش صفحات، نحوه نمايشها تگها و ... کاربرد دارد.
- فايل استايلها با فرمت CSS ذخيره ميشوند.

انواع استايلها:
 همانطوري که قبلا نوشتم استايلها بر سه نوع ميباشند:
۱. Inline Style: اين نوع استايل در داخل تگهاي HTML به كار گرفته ميشوند، و اين استايل فقط بروي همان تگ به خصوص تاثير خواهد گذاشت و به صورت زير نوشته خواهد شد.

<tag style="Style Declarations">

Example:
<p style="font-family: Tahoma">This is a paragraph</p>

در مثال بالا با استفاده از حالتهاي مختلف در استايلها نوع فونت آنرا تغيير داديم و همانطوري که در تعريف اين نوع استايل نوشتم اين استايل فقط و فقط تغييرات را بروي همين پاراگراف اعمال خواهد کرد.

۲. Embedded or Global Style: در اين نوع، استايل نوشته شده در تمامي صفحه تاثير خواهد گذاشت، اينرا بين دو تگ (<head></head>) به صورت زير نوشته خواهد شد.

<style>
<!--
Style Declaration
-->
</style>

Example:
<head>
<style type="text/css">
<!--
p { color: red; text-align: left; font-size: 8pt }
-->
</style>
</head>

اين نوع حالت از تغييرات تعريف شده بروي تمامي تگها پاراگراف اعمال خواهد شد که رنگ متن: قرمز، جهت متن: چپ، و اندازه فونت ۸ پوينت خواهد بود. توجه داشته باشيد در اين مثال سه حالت مختلف يک استايل را براي تگ پاراگراف تعريف کرديم که با استفاده از (;) حالتهاي مختلف آن از هم جدا شدند.
اگر بخواهيد اين حالت نوشته شده را براي چند تگ ديگر اعمال کنيد مي توانيد تگها را بااستفاده از کاما (,) از هم جدا کنيد براي مثال:

h1, h2, h3, h4 { color: gold; font-family: sans-serif }

۳. Linked or External style sheet: نوع آخر هم معروف به استايلهاي خارجي هستند كه به صورت لينك فايل استايل را به صفحات خود لينك ميدهيد. فايلهاي استايل با فرمت CSS ذخيره ميشوند و به صورت زير به صفحات لينك داده ميشود.

<link href="url" rel="relation type" type="link type">

Example:
<head>
<link rel="stylesheet" type="text/css" href="mystyle.css">
</head>

در اين نوع از استايلها بعد از اينکه فايل استايل خود را آماده کرديد آنرا با فرمت CSS ذخيره کرده و آنرا همانند بالا فايل استايل را به قالب لينک مي کنيم. براي راحت بود در کار مي توانيد ابتدا استايلها را به صورت Internal استفاده کرده و بعد از اينکه کارتان تمام شد کدهاي نوشته شده بين دو تگ (<style></style>) را در نت پد کپي کرده و آنرا با فرمت CSS دخيره کرده و سپس با استفاده از فرمول بالا آن فايل را به قالب لينک دهيد.
يکي از مزيتهاي اين نوع استايل اين ميباشد که مي توانيد با داشتن يک فايل استايل براي چندين صفحه استفاده کنيد و از ديگر مزيت هاي آن با اين کار کدهاي قالب را به چند فايل تقسيم کرده و قالب را منظم تر ميشود.
لينک مقاله
http://tools.bolghan.com :منبع

مقالات مرتبط با اين موضوع
انواع استایل ها | css
ده نکته برای افزایش سرعت بارگزاری صفحات وب | css
استايل (CSS) چيست؟ | css
صفحات دو ستونی در CSS | css
رنگ ScrollBar صفحه سايت خود را عوض كنيد | css
CSS و كاربرد آن در طرح هاي امروزي | css

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


ده نکته برای افزایش سرعت بارگزاری صفحات وب

افزایش سرعت بارگزاری صفحات یکی از مسائل مهم در طراحی صفحات وب می‌باشد. در صورتی که زمان بارگزاری یک صفحه وب طولانی باشد، معمولا" کاربران از مشاهده آن صفحه صرف نظر می‌کنند و دیگر به آن باز نمی‌گردند این به معنی از دست دادن کاربران سایت می‌باشد که برای مدیران یک سایت اصلا" خوشایند نیست. در ادامه ده روش موثر برای افزایش سرعت بارگزاری صفحات وب بیان می‌شود.

1. استفاده از CSS برای ایجاد قالب و طرح صفحه به جای Table
CSS یا Cascading Style Sheetsها به دلایل زیر از Tableها سریعتر بارگذاری می‌شوند:

  • مرورگرها قبل از نمایش محتویات یک جدول دو بار آن را مرور می‌کنند. یک بار برای مشخص شدن ساختار آن و یک بار هم برای تعیین محتویات آن.
  • جداول (Tables) در یک مرحله بر روی صفحه به نمایش در می‌آیند. هیچ قسمتی از یک جدول بر روی صفحه ظاهر نمی‌شوند تا اینکه تمام جدول همراه با محتویات آن به طور کامل بارگذاری و پردازش شود.
  • عمل موقعیت دهی و یا ایجاد یک فضای خاص در جداول معمولا" با استفاده از تصاویر کوچک خاصی (Spacer Images) صورت می‌پذیرد.
  • بطور کلی CSS ها کد کمتری نسبت به جداول نیاز دارند.
  • تمام کدهای مورد نیاز برای ایجاد طرح و نمای صفحه قابلیت جایگزین شدن با یک فایل CSS خارجی را دارند. که این فایل پس از یک بار فراخوانی در کامپیوتر کاربر ذخیره (cache) می‌شود. اما قالب‌های ایجاد شده با استفاده از جداول در هر صفحه HTML تکرار می‌شوند و با درخواست هر صفحه جدید دوباره باید بارگذاری (Download) شوند.
  • با استفاده از CSS ها امکان تعیین ترتیب بارگذاری صفحه وجود دارد. یعنی می‌توان محتویات اصلی صفحه را قبل از بارگذاری تصاویر با حجم بالا به نمایش درآورد. این کار قطعا" کاربران سایت شما را خوشحال خواهد کرد.

برای آشنایی بیشتر با CSS و کارهای جالبی که می توان با آن در یک سایت انجام داد می توانید از آموزشهای خوب و مفید سایت HTML Dog استفاده کنید.

2. از تصاویر برای نمایش متن استفاده نکنید
در اینجا نیز CSS به ما کمک خواهد کرد. در مواردی که کار را می توان با CSS بطور کامل انجام داد از تصاویر استفاده نکنید. به کد زیر دقت کنید:

a:link, a:visited, a:active {
  width: 7em;
  font: bold 0.8em Georgia;
  text-decoration: none;
  display: block;
  margin-left: 0;
  margin-bottom: 0.5em;
  margin-top: 0.5em;
  color: white;
  background: #39c;
  border-left: 1px solid #6cf;
  border-bottom: 1px solid #068;
  border-right: 1px solid #068;
  padding: 0.25em 0.5em 0.4em 0.75em;
  border-top: 1px solid #6cf;
}

a:hover {
  background: #28b;
  padding: 0.35em 0.35em 0.25em 0.9em;
  border-top: #069;
  border-right: #6cf;
  border-bottom: #6cf;
  border-left: #069;
}

نتایج استفاده از کدهای بالا را در این صفحه مشاهده کنید. با استفاده از این کد می‌توانید یک کلید جذاب ایجاد کنید که با رفتن موس بر روی آن پایین می‌رود. اگر به نحوه ایجاد این گونه کلیدها علاقمند هستید می‌توانید مقالات بخش CSS سایت A List Apart را مطالعه کنید.

3. فراخوانی تصاویر تزیینی بوسیله CSS
با CSS می‌توان تصاویر را بصورت قسمتی از یک زمینه (background) نمایش داد. بطور مثال یک تصویر 200x200 را می‌توان بصورت زیر نمایش داد:

<div class="pretty-image"></div>

کد HTML

.pretty-image {
  background: url(filename.gif);
  width: 200px;
  height: 200px
}

کد CSS

در ابتدا شاید این کار بی معنی به نظر برسد اما این کار سرعت بارگذاری و نمایش صفحات را افزایش می‌دهد. بطور کلی مرورگرها تصاویر زمینه را بعد از بقیه اجزا بارگذاری می‌کنند. با استفاده از این تکنیک متن درون صفحه فورا" به نمایش درآمده و کاربر می‌تواند آن را مشاهده و در بین آن گردش کند و در همین هنگام تصاویر با حجم زیاد بارگذاری می‌شوند.

در این روش نمی‌توان از خصوصیت ALT استفاده نمود اگر واقعا" می‌خواهید که از این خصوصیت استفاده کنید، کد HTML بالا را بصورت زیر تغییر دهید.

<image src="spacer.gif" class="pretty-image" alt="description" />

در اینجا spacer.gif یک تصویر 1x1 پیکسل شفاف (transparent) است که 50 بایت حجم دارد. در این حالت ابتدا محتوای اصلی بارگذاری می‌شود و بعد از آن تصویر بزرگ و حجیم همراه با خصوصیت ALT بطور کامل بارگذاری می‌شود. دقت داشته باشید که این روش برای نمایش تصاویر تزئینی مناسب می‌باشد نه برای تصاویر حاوی اطلاعات. همچنین کاربرانی که CSS آنها غیر فعال است قادر به مشاهده تصویر (یا متن مربوط به ALT) نمی‌باشند.

4. استفاده از انتخاب کننده‌های (selectors) مناسب
به کد نامناسب زیر توجه کنید:

<p class="text">This is a sentence</p>
<p class="text">This is another sentence</p>
<p class="text">This is yet another sentence</p>
<p class="text">This is one more sentence</p>

.text {
  color: #03c;
  font-size: 2em
}

به جای اختصاص دادن مقدار به هر پاراگراف، می‌توان همه را در یک تگ <div> قرار داده و مقدار را به آن اختصاص دهیم:

<div class="text">
<p>This is a sentence</p>

<p>This is another sentence</p>
<p>This is yet another sentence</p>
<p>This is one more sentence</p>
</div>

.text p {
  color: #03c;
  font-size: 2em
}

در ابتدا شاید این موضوع زیاد با اهمیت به نظر نرسد اما اگر شما بتوانید از آن بطور صحیح در تمام صفحه استفاده کنید به راحتی 20% از حجم فایل شما کم خواهد شد. همچنین شاید توجه کرده باشید که مقادیر مربوط به رنگها کوتاه‌تر از حالت عادی است. 03c# کوتاه شده مقدار 0033cc# است شما می‌توانید از این روش خلاصه کردن در هر جایی که مقادیر با این فرم قرار دارند استفاده کنید.

5. استفاده از خلاصه نویسی خصوصیات در CSS
در زیر روش خلاصه نویسی بعضی المانهای CSS را مشاهده می‌کنید:

font: 1em/1.5em bold italic serif

font-size: 1em;
line-height: 1.5em;
font-weight: bold;
font-style: italic;
font-family: serif

Font

border: 1px black solid

border-width: 1px;

border-color: black;

border-style: solid

Border

background: #fff url(image.gif) no-repeat top left

background-color: #fff;
background-image: url(image.gif);
background-repeat: no-repeat;
background-position: top left;

Background

margin: 2px 1px 3px 4px (top, right, bottom, left)

margin-top: 2px;
margin-right: 1px;
margin-bottom: 3px;
margin-right: 4px

Margin

margin: 5em 1em 3em (top, left and right, bottom)

margin-top: 5em;
margin-bottom: 1em;
margin-right: 1em;
margin-right: 4em

Margin

margin: 5% 1% (top and bottom, left and right)

margin-top: 5%;
margin-bottom: 5%;
margin-right: 1%;
margin-right: 1%

Margin

این قوانین بطور عملی برای border و padding نیز قابل استفاده است.

6. استفاده از فراخوانی نسبی
سعی کنید از آدرس دهی مطلق پرهیز کنید زیرا فضای بیشتری را اشغال می‌کند و تغییر دادن آنها در آینده مشکل است. یک مثال از فراخوانی مطلق بصورت زیر است: <a href="http://www.URL.com/filename.htm"> که بهتر است به این صورت باشد: <a href="filename.htm">. اما اگر فایل‌ها در فهرست‌های مختلف باشند از خلاصه نویسی‌های زیر استفاده کنید:

  • <a href="/filename.html">: فراخوانی http://www.URL.com/filename.html
  • <a href="/directory/filename.html">: فراخوانی http://www.URL.com/directory/filename.html
  • <a href="./">: فراخوانی index.html در فهرست جاری
  • <a href="../">: فراخوانی index.html از یک فهرست بالاتر
  • <a href="../filename.html">: فراخوانی filename.html از یک فهرست بالاتر
  • <a href="../../">: فراخوانی index.html از دو فهرست بالاتر

8. حذف تگ‌های غیر ضروری META و مقادیر درون آن
بسیاری از تگهای META غیر ضروری هستند و کار زیادی انجام نمی‌دهند. در صورت علاقه می‌توانید لیست تگهای META را در این آدرس مشاهده کنید. تگ‌های METAی با اهمیت برای موتورهای جستجو تگ‌های keywords و description هستند. البته استفاده نادرست و بیش از اندازه از آنها به تازگی باعث کاهش اهمیت آنها شده است. در هنگام استفاده از هرکدام از این تگ‌ها سعی کنید حجم محتوای آنها برای هر یک کمتر از 200 کاراکتر (حرف) باشد. هر مقداری بیش از این باعث افزایش حجم صفحه شما خواهد شد. متا تگ‌های طولانی برای موتورهای جستجو مناسب نیستند زیرا کلمات کلیدی شما را کم رنگ می‌کنند.

9. انتقال JavaScript و CSS درون صفحه به فایلهای مستقل
برای استفاده از CSS که در فایل خارجی قرار دارد از کد زیر استفاده کنید:

<link type="text/css" rel="stylesheet" href="filename.css" />

و برای استفاده از JavaScript که در فایل خارجی قرار دارد از کد زیر استفاده کنید:

<script language="JavaScript" src="filename.js" type="text/javascript"></script>

هر فایل خارجی یک بار فراخوانی شده و بعد از آن در کامپیوتر کاربر (برای استفاده‌های بعدی) ذخیره می‌شود. بجای قرار دادن JavaScript و CSS در تک تک صفحات HTML آنها را برای یک بار در یک فایل خارجی قرار دهید و از آن درون صفحات استفاده کنید. فراموش نکنید که هیچ محدودیتی برای استفاده از این فایل‌های خارجی وجود ندارد. برای مثال بجای ساختن یک فایل CSS بزرگ، یک فایل برای قسمتهای یکسان در تمام صفحات و چند فایل هم برای قسمت‌هایی که در صفحات خاص استفاده می‌شوند بسازید.

10. استفاده از / در انتهای آدرس فهرست‌ها:
بجای استفاده از این کد:

<a href="http://www.URL.com/directoryname" >

از کد زیر استفاده کنید:

<a href="http://www.URL.com/directoryname/" >

زیرا اگر از / در انتهای آدرس استفاده نکنید سرور متوجه نخواهد شد که اشاره به فایل شده یا فهرست. اما با اضافه کردن / سرور فورا" متوجه می‌شود که به یک فهرست اشاره شده و آنرا نمایش می‌دهد.
لينک مقاله
http://www.idevcenter.com :منبع

مقالات مرتبط با اين موضوع
انواع استایل ها | css
ده نکته برای افزایش سرعت بارگزاری صفحات وب | css
استايل (CSS) چيست؟ | css
صفحات دو ستونی در CSS | css
رنگ ScrollBar صفحه سايت خود را عوض كنيد | css
CSS و كاربرد آن در طرح هاي امروزي | css

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


متاتگ چیست ؟

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

دو نوع اصلی متاتگ وجود دارد :

این متاتگ باعث میشود که اطلاعات اضافی ای همراه صفحه وب درخواستی شما در http header به مرورگر ارسال شود . مثلا میتوانید تاریخ انقضای اطلاعات را تعیین کنید یا میتوانید صفحه وب را با یک متا تگ خاص پس از چند ثانیه به صفحه دیگری بفرستید بدون دخالت کاربر ! | HTTP-EQUIV
این نوع از متاتگ برای تعیین اطلاعات داخل صفحه وب استفاده میشود که باعث میشود صفحه وب شما با راحتی بیشتری برای موتورهای جستجوگر شناخته شود ... مثلا زبان این صفحه ، نام طراح ، کلمات کلیدی این صفحه و ... | NAME

متاتگ ها کجای صفحه وب نوشته میشوند ؟

متاتگ ها را باید داخل تگ head نوشت . در صفحه هایی که از چند فریم درست شده باید در تمام صفحات متاتگ را نوشت.

به مثال های زیر دقت کنید : content در متاتگ کارش معرفی مقداری هست که متاتگ با یکی از دو صفت name و HTTP-EQUIV در خود دارد .

مثال : NAME="keywords" CONTENT=" persian macromediax dreamweaver">

تگ بالا را یه نگاه کنید . از نوع name است . مقدار name مساوی با keywords است . یعنی این متاتگ کارش شناساندن کلمات کلیدی سایت به موتور های جستجوگر است ... اگر میخواهید موتور های جستجو مانند گوگل سایت شما را بهتر بشناسند این تگ را به قالب سایت یا وبلاگ خود بیفزایید و در جلوی content کلمات کلیدی سایت خود را بنویسید .

مثال : NAME="description" CONTENT=" persian web design center">

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

مثال :<META HTTP-EQUIV="Expires" CONTENT="Tue, 04 Dec 1993 21:29:02 GMT">

تگ بالا تاریخ انقضای این صفحه وب را تعیین میکند . یعنی اگر کسی این صفحه وب را یکبار دیده باشد وقتی این زمان فرا برسد و او دوباره آدرس این سایت را در مرورگرش بزند این صفحه از داخل cache لود نمیشود بلکه از سرور دانلود میشود .

ترجمه macromediax از : htmlhelp.com و html-reference.com

لينک مقاله
http://www.macromediax.com :منبع

مقالات مرتبط با اين موضوع
دریم ویور : رویاباف طراحان وب | html
سایت خود را مطابق تکنولوژی جستجوگر ها طراحی کنید | html
متاتگ چیست ؟ | html
نمايش عكسي به دنبال نشانگر ماوس | html
تگ Anchor و شناسه href | html
دو نکته بسيار مهم در مورد فارسی نويسی | html
تگ های اچتمل | html
مقده اي بر وب و زبان html | html
قرار دادن تصوير در صفحات و کد جدول | html
معرفي تگ هاي اوليه در اچ تي ام ال | html
آموزش زبان صفحات وب HTML | html

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


سایت خود را مطابق تکنولوژی جستجوگر ها طراحی کنید

بسياري از وب سايت ها هستند كه نميتوانند ترافيك كافي را براي سايت خود بدست آورند ، يكي از اين علت ها يك نكته ساده است : ” وب سايت براي موتور هاي جستجوگر بهينه نشده “ . در اين مقاله اعمالي كه براي بهينه سازي وب سايت در برخورد با موتور هاي جستجو بايد صورت گيرد شرح داده ميشود :

1. صفحات را مطابق ميل جستجوگر ها طراحي كنيد :

براي يك موتور جستجو گرافيك سايت شما يا فلش ها و كد هاي جاوا اسكريپت جذابي كه ساخته ايد اهميتي ندارد . بلكه چيزي كه يك موتور جستجو نياز دارد روان بودن كد نوشته شده در صفحات است . منظور من نوشتن كامنت در بين تگ ها يا رعايت كردن فاصله ها نيست بلكه استفاده از تگ هايي است كه جستجوگر ها از آنها استفاده ميكنند . تگ هاي مهم در يك صفحه وب عبارتند از : تگ title و description و Keywordsو Alt . ( اين روزها بعضي از موتور هاي جستجو فقط از تگ Keywords براي ارائه نتايج استفاده ميكنند ).

چند نكته :

· اگر از جدول ها براي ساخت صفحات سايتتان بهره گرفته ايد ، سعي كنيد از كد هاي ساده استفاده كنيد نه از تگ هاي تو در توي پيچيده .

· استفاده از فريم ها باعث سر گيجه موتور هاي جستجو ميشود كه به ضرر شماست . در ضمن استفاده از فريم ها ديگر در طراحي سايت ها متداول نيست .

· اگر از كد هاي جاوا اسكريپت استفاده كرده ايد براي فراخواني فايل هاي جاوا اسكريپت خارجي از كد هاي كوتاه استفاده كنيد .

· استفاده از تگ Alt در تگ تصاوير موتور هاي جستجو را در يافتن موضوع تصاوير كمك ميكند . حتما از اين تگ براي عكس ها استفاده كنيد .

· متن اصلي را قبل از عكس ها در صفحاتتان قرار دهيد و يا حداقل عكس ها را در ميان متن قرار دهيد .

2. كلمات كليدي Keywords :

استفاده از اين تگ بسيار اهميت داره و نوع كلمات استفاده شده در اون هم مهمه . سايت wordtracker كلمات كليدي خوبي را براي هر نوع سايتي پيشنهاد ميدهد كه ميتوانيد از آن بهره بگيريد . تعداد كلماتي كه ميتوان در اين تگ استفاده كرد محدوديت خاصي ندارد ، اما براي حصول نتيجه بهتر از 10 الي 15 كلمه برتر استفاده كنيد .

3. محتواي سايت :

بسياري از موتور هاي جستجو از متن اصلي صفحات براي يافتن كلمات كليدي استفاده شده در تگ keywords استفاده ميكنند . پس استفاده درست از كلمات كليدي و مطابقت آن كلمات با متن شما بسيار اهميت دارد. كلمات اصلي متن را در تگ heading و يا bold بگذاريد و يا آن را لينك كنيد تا جستجوگر ها به آن لغات اهيت ويژه اي دهند .

4. عنوان سايت :

تگ title يكي از مهم ترين بخش ها از ديد جستجوگر هاست . عنوان صفحات نيز بايد مانند كلمات كليدي درست و مطابق متن انتخاب شود . چون گاهي موتور هاي جستجوگر به عناوين صفحات بيش از كلمات كليدي اهميت ميدهند . تعداد كلماتي كه در عنوان صفحات استفاده ميكنيد نيز براي اينكه از حد استاندارد جستجوگر ها خارج نباشد بايد حداكثر 9 كلمه باشد .

5. تگ توضيحات :

موتور هاي جستجو هنگام نشان دادن نتايج جستجوي خود ، اطلاعات تگ متاي توضيحات هر صفحه را براي نمايش توضيحات آن سايت نمايش ميدهند .بنابراين نوشتن توضيحات جذاب و درست بيننده را به سوي سايت شما جذب ميكند . استاندارد تعداد كلمات اين تگ 20 الي 25 كلمه ميباشد .

6. گرافيك :

استفاده از عكس اگر چه زيبايي خاصي به سايت شما ميدهد اما حتي با تگ ALT نيز يك عكس به اندازه چند كلمه قدرت ندارد . چون موتور هاي جستجو فقط كلمات را ميشناسند و عكس ها را هم با تگ Alt آنها شناسايي ميكنند . بنا براين استفاده از عكس به جاي لينك و يا بجاي متن از خوانايي سايت شما براي چشم هاي يك موتور جستجوگر مي كاهد .

7. نقشه سايت :

نقشه سايت كمك بسياري به جستكوگر ها ميكند تا تمام صفحات سايت شما را شناسايي كنند . ابزار هاي زيادي بر روي وب هست كه نقشه سايت شما را در چند كليك ميسازد .

8. لينك هاي هدايتگر :

لينك هايي كه به ديگر صفحات سايت ميدهيد بايد ساده باشد . استفاده از منوهاي pop up‌ و فلش و مانند آن از خوانايي لينك هاي شما مي كاهد .اگر مجبور به استفاده از لينك هاي پيچيده در طراحي سايت هستيد ميتوانيد از لينك هاي ساده در انتهاي صفحات استفاده كنيد تا موتور هاي جستجوگر نيز بتوانند لينك هاي شما را شناسايي كنند .

رعايت اصول فوق باعث ميشود تا سايت شما در نتيجه جستجوي جستجوگر هاي معروف رتبه بالاتري را بدست آورد .
لينک مقاله
http://www.macromediax.com :منبع

مقالات مرتبط با اين موضوع
دریم ویور : رویاباف طراحان وب | html
سایت خود را مطابق تکنولوژی جستجوگر ها طراحی کنید | html
متاتگ چیست ؟ | html
نمايش عكسي به دنبال نشانگر ماوس | html
تگ Anchor و شناسه href | html
دو نکته بسيار مهم در مورد فارسی نويسی | html
تگ های اچتمل | html
مقده اي بر وب و زبان html | html
قرار دادن تصوير در صفحات و کد جدول | html
معرفي تگ هاي اوليه در اچ تي ام ال | html
آموزش زبان صفحات وب HTML | html

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


کد بارش بارون و بارش برف در صفحه وبلاگ

بارش بارون

بارش برف
لينک مقاله
http://javascripts.persianblog.com :منبع

مقالات مرتبط با اين موضوع
JavaScript چيست؟ | javascript
افکت قلب و لب همراه باموس. | javascript
لرزش صفحه وب سايت هنگام باز شدن | javascript
کد بارش بارون و بارش برف در صفحه وبلاگ | javascript
خاموش کردن قابليت کليک راست | javascript
نمايش پيغامهاي تصادفي در نوار وضعيت | javascript
طريقه Fade كردن عكسها با استفاده از جاوا اسكريپت | javascript
Preload براي صفحات وب | javascript

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


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

صفحه در هنگام باز شدن
لينک مقاله
http://javascripts.persianblog.com :منبع

مقالات مرتبط با اين موضوع
JavaScript چيست؟ | javascript
افکت قلب و لب همراه باموس. | javascript
لرزش صفحه وب سايت هنگام باز شدن | javascript
کد بارش بارون و بارش برف در صفحه وبلاگ | javascript
خاموش کردن قابليت کليک راست | javascript
نمايش پيغامهاي تصادفي در نوار وضعيت | javascript
طريقه Fade كردن عكسها با استفاده از جاوا اسكريپت | javascript
Preload براي صفحات وب | javascript

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


افکت قلب و لب همراه باموس.
افکت قلب و لب همراه باموس.با قرار دادن اين کد در وبلاگ يه قلب و يه لب همراه با موس حرکت ميکنن

خيلی باحاله. (حلوای تنتنايی تا نخوری ندانی)
لينک مقاله
http://javascripts.persianblog.com :منبع

مقالات مرتبط با اين موضوع
JavaScript چيست؟ | javascript
افکت قلب و لب همراه باموس. | javascript
لرزش صفحه وب سايت هنگام باز شدن | javascript
کد بارش بارون و بارش برف در صفحه وبلاگ | javascript
خاموش کردن قابليت کليک راست | javascript
نمايش پيغامهاي تصادفي در نوار وضعيت | javascript
طريقه Fade كردن عكسها با استفاده از جاوا اسكريپت | javascript
Preload براي صفحات وب | javascript

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


قالب دستوري اكشن اسكريپت

نقطه :

در اكشن اسكريپت نقطه براي نشان دادن خواص يا متدهاي وابسته به يك شيي يا سمبل مووي كليپ استفاده ميشود . همچنين براي تعيين target path در يك مووي كليپ يا متغير ، فانكشن يا آبجكت ها استفاده ميشود . عبارت نقطه دار با نام شيئ يا كليپ موردنظر آغاز شده ، نقطه ميگذاريم و در آخر با يك المان كه توسط شما تعيين ميشود پايان مي يابد .

بطور مثال خاصيت x كه براي مووي ها ميباشد مكان افقي مووي را روي صحنه مشخص ميكند . مثلا عبارت ball.x نشان دهنده مشخصه x از كليپ ball ميباشد .

مثال ديگر : submit يك متغير در كليپ Form است كه در كليپ shop قرار دارد . عبارت shop.form.submit=True مقدار متغير submit از form را True ميكند .

مثال ديگر : عبارت ball.play(); را داريم . play يك متد از كليپ ball است كه باعت اجراي اين كليپ ميشود .

نقطه همچنين با شيي مجازي _root و _parent كار ميكند . شيي مستعار _root به Timeline اصلي بر ميگردد. شما از اين شيي ميتوانيد براي خلق Target path هاي مطلق استفاده كنيد . بطور مثال عبارت زير باعث فراخواني فانكشن Buildgameboard در مووي كليپ functions در Timeline اصلي ميشود .

_root.functions.buildgameboard();

از شيي مجازي _parent براي مراجعه يه يك كليپ كه كليپ كنوني در آن قرار دارد استفاده ميشود . همچنين ميتوانيد براي ساخت target path وابسته استفاده اش كنيد .

آكولاد:

عبارات اكشن اسكريپت توسط آكولاد ها گروه ميشوند .به مثال زير توجه كنيد .

on(release) {

myDate = new Date();

currentMonth = myDate.getMonth();

{

سمي كالن :

عبارات زبان اكشن اسكريپت با سمي كالن پايان ميابد . مثال:

column = passedDate.getDay();

row = 0;

اگر شما سمي كالن پاياني را فراموش كنيد هيچ مشكلي براي اسكريپت شمل پيش نمي آيد اما بهتر است براي شيوايي اسكريپت خود آنرا هميشه بگذاريد .

پرانتز ها :

وقتي شما يك فانكشن تعريف ميكنيد ، بايد پارامتر هاي فرستاده شده در فانكشن را در پرانتز قرار دهيد . مثال :

function myFunction (name, age, reader){

...

}

همچنين براي آسانتر شدن عبارات رياضي در اسكريپت نيز از پرانتز ها بصورت ذيل استفاده ميشود .

(در زبان هاي برنامه نويسي اعمال رياضي بترتيب خاصي در پراسيجر تفسير ميشوند . وقتي يك عبارت رياضي داخل پرانتز باشد محاسبه آن قبل از بقيه عبارت صورت ميگيرد . به مثال زير دقت كنيد :

Total =2+3*5 ;

Total =(2+3)*5 ;

در عبارت اولي ابتدا عمل ضرب و سپس جمع صورت ميگيرد و پاسخ عدد 17 است

در عبارت دوم بعلت وجود پرانتز ابتدا پرانتز محاسه و سپس ضرب صورت ميگيرد و جواب 25 است .

از پرانتز همچنين براي مقدار دهي عبارات استفاده ميشود . قالب كلي آن مانند مثال زير است :

(new Color(this)).setRGB(0xffffff);

اگر بخواهيد از پرانتز استفاده نكنيد بايد از 2 عبارت استفاده كنيد :

myColor = new Color(this);

myColor.setRGB(0xffffff);

حساسيت به حروف كوچك و بزرگ :

فقط كلمات كليدي اكشن اسكريپت به حروف حساسند و در بقيه موارد ميتوانيد از هر دو حالت استفاده كنيد .

شما نميتوانيد از اسم هاي رزرو شده اكشن اسكريپت بجاي نام اشياي خود استفاده كنيد .

اگر كلمات كليدي اسكريپت را از لحاظ كوچكي و بزرگي اشتباه بنويسيد اسكريپت حاصل دچار مشكل خواهد شد . keyword ها در حالت پيش فرض در پنجره اكشن به رنگ آبي هستند

كامنت نويسي :

كامنت ها كد نيستند بلكه جملاتي اند كه طراح در ميان كد ها براي توضيح درباره كد مينويسد تا در رجوع بعدي خود كاري كه انجام داده را بياد آورد . در اكشن اسكريپت از دو بك اسلش پشت سر هم ، براي نوشتن كامنت استفاده ميشود . خطي كه با // شروع شود جزو كد ها به حساب نمي آيد و در كامپايل فايل فلش ناديده گرفته ميشود . در نوشتن كامنت محدوديت لغتي وجود ندارد .

كلمات كليدي :

اكشن اسكريپت تعدادي از لغات خاص را براي استفاده هاي خاص زبان اسكريپت براي خود رزرو كرده كه شما نميتوانيد اين لغات را بعنوان اسم متغير ، فانكشن يا اسامي ليبل استفاده كنيد .

اين كلمات عبارتند از :

break | else | instanceof | typeof
case | for | new | var
continue | function | return | void
default | if | switch | while
delete | in | this | with

ثابت ها :

ثابت ها چيز هايي مانند متغير ها هستند با اين تفاوت كه مقدارشان هرگز تغيير نميكند . بطور مثال ثابت هاي BACKSPACE, ENTER, QUOTE, RETURN از ثابت هاي شيي key هستند كه به كليد هاي كيبورد مربوطند . مثلا براي اينكه بفهميد كاربر كدام كليد را فشار داده از كد زير استفاده ميكنيم .

if(Key.getCode() == Key.ENTER) {

alert = "Are you ready to play?";

controlMC.gotoAndStop(5);

}
لينک مقاله
http://www.macromediax.com :منبع

مقالات مرتبط با اين موضوع
آموزش فلش : لود کردن صدا بصورت داینامیک | actionscript
آموزش فلش : لود کردن عکس بصورت داینامیک | actionscript
اکشن اسکریپت : اولويت عملگر هاي فلش | actionscript
اكشن اسكريپت : استفاده از عملگرها براي دستكاري مقادير عبارت ها (بخش اول) | actionscript
اكشن اسكريپت - متغير ها در فلش | actionscript
اكشن اسكريپت : كنترل در زمان اجرا | actionscript
اكشن اسكريپت : متغير هاي رشته اي ، عددي و بولين و نال | actionscript
اکشن اسکریپت ، یک زبان شیئ گرا | actionscript
Action Script - FScommand | actionscript
آشنایی با سمبل ها در فلش | actionscript
قالب دستوري اكشن اسكريپت | actionscript

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آشنایی با سمبل ها در فلش

تفاوت سمبل های Graphic و Movie در فلش :

سمبل های گرافیک معمولا برای ساخت سمبل های ثابت استفاده میشوند و سمبل های movie برای ساخت سمبل های متحرک . ولی اگر به پنجره ویرایش یک سمبل گرافیک بروید میبینید که دارای Timeline است .ولی کاربرد آن در سمبل گرافیک کمی با سمبل Movie فرق دارد. اگر شما یک سمبل Movie متحرک درست کنید میتوانید از آن در یک فریمی که فیلم stop میشود استفاده کنید و این کلیپ در آن فریم حرکت خود را خواهد داشت ، با اینکه فیلم فلش شما ایستاده است. اما اگر در یک سمبل گرافیک ، یک قطعه متحرک بوجود آورید سمبل شما تا وقتی متحرک است که فیلم فلش شما در حال اجراست و به محض ایستادن فیلم در هر فریمی ، آن سمبل نیز از حرکت می ایستد و بصورت ثابت دیده میشود.

استفاده از یک سمبل در سمبل دیگر :

در هنگام import کردن یک عکس در فیلم فلش چند نکته مهم هست .

1- عکس را در کوچکترین سایز ممکن وارد فلش کنید . چون اگر عکس بزرگی را وارد کنید و در فلش با ابزار های transform آن را کوچک کنید علاوه بر افزایش حجم فایل شما ، آن عکس نیز با شفافیت کامل دیده نمی شود.

2- شما میتوانید از عکس هایی که وارد فلش کردید ، سمبل بسازید و سمبل آن را در فیلم فلش نمایش دهید . اینکار باعث میشود ابزار های بیشتری برای کار روی عکس داشته باشید . مثلا از روی عکستان سمبل گرافیک بسازید و آن را وارد صفحه فلش کنید . حالا یک Motion Tween بسازید از این سمبل گرافیک . در فریم کلیدی آخر آن کلیک کنید و سپس روی سمبل گرافیک کلیک کنید . حالا در پنجره properties از منوی بازشوی color گزینه alpha را برگزینید و مقدارش را صفر کنید . خوب ، فیلم فلشتان را اجرا کنید ، میبینید که سمبل شما آرام آرام در صفحه محو میشود .

3- توجه داشته باشید که فلش هنگام ساختن سمبلی از روی سمبل دیگر ، عکس یا شکل های سمبل اولی را در سمبل ساخته شده کپی نمی کند . بلکه سمبل اولی را در سمبل ساخته شده نشان میدهد . بنا بر این پاک کردن سمبل اولی باعث خراب شدن سمبل هایی میشود که سمبل اولی در آنها بکار رفته است.

تغییر خواص سمبل ها با اسکریپت

ما سه نوع سمبل داریم –graphic , movie , botton - از بین این سمبل ها میتوان خواص دو سمبل دکمه و مووی(متحرک ) را براحتی کنترل کرد . برای کنترل هر شیی ابتدا باید نامی به آن بدهیم تا در کد نویسی با آن نام شیئ را خطاب کنیم . روی سمبل مورد نظرتان کلیک کنید و در پنجره properties در سمت چپ یک کادر متنی کوچک میبینید که داخل آن با حروف کمرنگ نوشته شده : instance name روی آن کلیک کنید و نامی برای شیی خود بگذارید . حالا یک دکمه روی فرم بگذارید و کد زیر را برای آن بنویسید ( کد زیر را در حالت expert وارد کنید)

On (release) {

Setproprty(“object”,_alpha,33);

}

درکد فوق object نام شیی مورد نظر و alpha نام خاصیت مورد نظر و 33 مقدار داده شده به خاصیت آلفا میباشد . خاصیت آلفا همانطور که میدانید میزان پدیدار بودن شیئ را تعیین میکند و کم کردن آن باعث محو شدن شیی میشود .

خواص دیگری که میتوانید مقدارشان را تعیین کنید عبارتند از :

_rotate میزان چرخش شیی

_height ارتفاع سمبل

_width طول سمبل

_x,_y نیز محل قرار گیری سمبل در صفحه هستند .

_visible نیز قابل دید بودن یا نبودن شیئ را معلوم میکند که باید مقدار آنرا بجای عدد ، True یا False بگذارید .
لينک مقاله
http://www.macromediax.com :منبع

مقالات مرتبط با اين موضوع
آموزش فلش : لود کردن صدا بصورت داینامیک | actionscript
آموزش فلش : لود کردن عکس بصورت داینامیک | actionscript
اکشن اسکریپت : اولويت عملگر هاي فلش | actionscript
اكشن اسكريپت : استفاده از عملگرها براي دستكاري مقادير عبارت ها (بخش اول) | actionscript
اكشن اسكريپت - متغير ها در فلش | actionscript
اكشن اسكريپت : كنترل در زمان اجرا | actionscript
اكشن اسكريپت : متغير هاي رشته اي ، عددي و بولين و نال | actionscript
اکشن اسکریپت ، یک زبان شیئ گرا | actionscript
Action Script - FScommand | actionscript
آشنایی با سمبل ها در فلش | actionscript
قالب دستوري اكشن اسكريپت | actionscript

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


Action Script - FScommand

چگونه در فلش فایل exe بسازیم ؟

همانطور که اکثرا میدانید برای ساخت فایل های اجرایی با فلش بعد از ساخت فایل swf به منوی فایل رفته و سپس روی گزینه publish setting کلیک میکنیم . در پنجره ای که باز میشود گزینه windows projector را تیک میزنیم . حالا برای ساخت فایل exe دکمه publish را میزنیم . فایل exe ما آماده است . اما این فایل یک فیلم فلش است که همیشه در پنجره flash player اجرا میشود . با این فرق که اجراگر فلش همراه فایل ، ضمیمه شده است و در دستگاه هایی که این player را ندارند اجرا میشود . در ضمن برای اینکه کاربر فلش شما را ببندد باید flash player آن را ببندد . حال برای اینکه یک دکمه خروج در برنامه بگذاریم چه میکنیم ؟

اکشن اسکریپت fscommand

یک دکمه روی فیلم خود بگذارید . حال آنرا انتخاب کنید و با زدن دکمه F9 پنجره Actions را باز کنید . کتاب Actions و سپس کتاب Browser/network را باز کنید و روی fscommand را دوبل کلیک کنید . حالا از منوی بازشوی سمت راست ، گزینهquit را انتخاب کنید . حال زدن این دکمه توسط کاربر در برنامه باعث بسته شدن فیلم فلش میشود ! .

اکشن اسکریپت برای full screen شدن

یک دکمه روی فیلم خود بگذارید . باز هم fscommand را دوبل کلیک کنید و اینبار از منوی سمت راست آن fullscreen را برگزینید. میبینید که در جعبه متنی بالای آن نام fullscreen و در قسمت پارامتر true نوشته شده است .این هم کد کامل آن که فلش برای شما ساخته است .

on (release) {

fscommand("fullscreen", "true");

}

اگر خواستید فیلم با زدن دکمه از حالت فوق خارج شود خودتان پارامتر true را به false تغییر دهید .

تغییر سایز فلش با سایز صفحه شما

اگر بخواهید فیلم فلش شما هنگامی که کاربر سایز FLASH PLAYER را عوض میکند ثابت بماند باید در منوی بازشوی fscommand گزینه allowscale را مساوی false قرار دهید . این هم کد کامل آن :

on (release) {

fscommand("allowscale", "false");

}
لينک مقاله
http://www.macromediax.com :منبع

مقالات مرتبط با اين موضوع
آموزش فلش : لود کردن صدا بصورت داینامیک | actionscript
آموزش فلش : لود کردن عکس بصورت داینامیک | actionscript
اکشن اسکریپت : اولويت عملگر هاي فلش | actionscript
اكشن اسكريپت : استفاده از عملگرها براي دستكاري مقادير عبارت ها (بخش اول) | actionscript
اكشن اسكريپت - متغير ها در فلش | actionscript
اكشن اسكريپت : كنترل در زمان اجرا | actionscript
اكشن اسكريپت : متغير هاي رشته اي ، عددي و بولين و نال | actionscript
اکشن اسکریپت ، یک زبان شیئ گرا | actionscript
Action Script - FScommand | actionscript
آشنایی با سمبل ها در فلش | actionscript
قالب دستوري اكشن اسكريپت | actionscript

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


اکشن اسکریپت ، یک زبان شیئ گرا

به چه چيز هايي ميتوان Action Script داد ؟

دكمه ها ، فريم ها و مووي كليپ ها ميتوانند اكشن اسكريپت بگيرند .

  • براي ربط دادن يك كد اسكريپت به فريم بايد ابتدا روي فريم موردنظر كليك كنيد و سپس وارد پنل اكشنز شويد و كد هاي خود را وارد كنيد . (توجه كنيد كه فقط فريم هايي كه فريم كليدي باشند اكشن ميپذيرند و اگر روي يه فريم معمولي كليك كنيد كه فريم كليدي نباشد اكشني كه در آن فريم وارد كنيد به اولين فريم كليدي قبل از آن فريم تعلق ميگيرد) .
  • براي كد دادن به يك دكمه ، ابتدا روي دكمه كليك كنيد و سپس وارد پنل اكشنز شده و كد موردنظرتان را به آن اضافه كنيد .
  • براي كد دادن به مووي كليپ ها شما در اصل به يك كپي از مووي كليپ كتابخانه كه روي صفحه فلشتان است اسكريپت ميدهيد و بقيه كپي هايي كه از سمبل روي آن كليپ كتابخانه در صفحه مي آوريد از آن اسكريپت بهره نمي گيرند.(در صورتي كه هنگام ويرايش مووي كليپ اصلي ، كدي را به يكي از فريم ها يا دكمه هاي موجود در مووي كليپ بدهيد آن اسكريپت براي سمبل است و تمام كپي هايي كه از روي آن ميسازيد آن كد را دارا هستند). وقتي شما يك اكشن به يك مووي كليپ ميدهيد بايد اكشن را در يك Event Handler قرار دهيد تا در صورت رخ دادن آن Event اكشني كه داده ايد اجرا شود .(Event به معناي رويداد است كه در تمامي زبان هاي برنامه نويسي نيز به همين نام مرسوم است . رويداد يعني رخ دادن يك اتفاق بر روي شيئ مورد نظر . مثلا رد شدن موس از روي مووي كليپ يك رويداد است و يا كليك روي آن يا خاتمه يافتن صدايي كه به يك فريم اختصاص داده ايد.).

اسكريپت نويسي شيئ گرا :

در اسكريپت نويسي شي گرا ، اطلاعات در گروه هاي خاصي دسته بندي ميشوند كه به آنها Class ميگويند . شما ميتوانيد چندين كپي از يك كلاس را در اسكريپت خود بسازيد كه به هر يك از آنها يك شي (Object) ميگوييم . شما ميتوانيد كلاس هاي مربوطه را خودتان بسازيد و يا از كلاس هاي آماده فلش در پوشه Objects در پنل اكشنز استفاده كنيد.

وقتي شما يك كلاس ميسازيد ، بايد تمامي دارايي ها ( property ) و متد Method هاي مربوط به هر شي اي را كه ساخته ايد تعريف كنيد. مثلا يك آدم داراي چه دارايي هايي است ؟ چشم ، دست ، مو ، و مانند آن . و داراي چه متد هايي ؟ متد راه رفتن ، خنديدن ، حرف زدن و غيره . در مثال فوق كاراكتر آدم يك كلاس است و هر كپي از روي آن يك شي خواهد بود . اشياء در اكشن اسكريپت ميتوانند اطلاعات يا گرافيك ها را حمل كنند. بطور مثال يك مووي كليپ در فيلم فلش ما در اصل يك شي از كلاس مووي كليپي است كه در كتابخانه آن فيلم فلش قرار دارد و شامل تمام دارايي ها و متد هاي شي اصلي است.

براي تعريف كردن يك كلاس شما بايد يك فانكشن constructorتعريف كنيد بطور مثال اگر شما اطلاعاتي درباره يك دوچرخه سوار در فيلم فلش خود داريد شما ميتوانيد يك فانكشن از نوع constructor بنام Biker بسازيد و براي آن دو پراپرتي زمان و فاصله تعريف كنيد و يك متد Getspeed كه اين متد سرعت دوچرخه سوار را در هر لحظه كه فراخواني شود ميدهد .

function Biker(t, d) {

this.time = t;

this.distance = d;

this.getSpeed = function() {return this.time / this.distance;};

}

در مثال بالا يك فانكشن ساختيم كه دو متغير براي دريافت اطلاعات بنام هاي t , d دارد .وقتي شما اين فانكشن را براي ساخت يك كپي از شي آن فراخواني ميكنيد بايد پارامتر هاي تعريف شده را نيز بهمراه نام فانكشن وارد كنيد . به مثال زير توجه كنيد:

emma = new Biker(30, 5);
hamish = new Biker(40, 5);

در كد هاي بالا دو شيئ biker با نام هاي emma و hamish ساختيم . همانطور كه ميبينيد بعد از نوشتن نام فانكشن داخل پرانتز پارامتر هاي تعريف شده را هم نوشته ايم.

وراثت در اسكريپت نويسي شيئ گرا :

در اسكريپت نويسي شيئ گرا Class ها ميتوانند متد ها و پراپرتي ها را به روش وراثت inheritance از همديگر دريافت كنند . شما ميتوانيد وراثت را براي گسترش يا دوباره سازي متد ها و پراپرتي هاي يك كلاس بكار گيريد . كلاسي كه ار كلاس ديگر ارث ميبرد Subclass ناميده ميشود .(sub به معناي زير مجموعه است) و كلاسي كه متد ها و پراپرتي هايش را به كلاس ديگر پاس ميدهد superClass ناميده ميشود . يك كلاس ميتواند هم Subclass و هم SuperClass باشد .

لينک مقاله
http://www.macromediax.com :منبع

مقالات مرتبط با اين موضوع
آموزش فلش : لود کردن صدا بصورت داینامیک | actionscript
آموزش فلش : لود کردن عکس بصورت داینامیک | actionscript
اکشن اسکریپت : اولويت عملگر هاي فلش | actionscript
اكشن اسكريپت : استفاده از عملگرها براي دستكاري مقادير عبارت ها (بخش اول) | actionscript
اكشن اسكريپت - متغير ها در فلش | actionscript
اكشن اسكريپت : كنترل در زمان اجرا | actionscript
اكشن اسكريپت : متغير هاي رشته اي ، عددي و بولين و نال | actionscript
اکشن اسکریپت ، یک زبان شیئ گرا | actionscript
Action Script - FScommand | actionscript
آشنایی با سمبل ها در فلش | actionscript
قالب دستوري اكشن اسكريپت | actionscript

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


اكشن اسكريپت : متغير هاي رشته اي ، عددي و بولين و نال

رشته چيست ؟

رشته مجموعه اي از كاراكتر هاست كه در كنار هم قرار گرفته اند و ميتواند شامل حروف و اعداد و كاراكتر هاي نقطه گذاري باشند . براي نوشتن رشته ها بايد آنها را در ميان كوتيشن قرار داد. مثلا : “Mediax”

شما ميتوانيد از عملگر + جهت متصل كردن دو رشته به هم استفاده كنيد . اكشن اسكريپت فاصله ها را در ابتدا يا انتهاي رشته ها جزو رشته به حساب مي آورد . يعني هر فاصله دقيقا مانند يك كاراكتر از رشته است . گر چه در اكشن اسكريپت متغير ها ، نام اشياء و ليبل فريم ها حساس به بزرگي يا كوچي حروف نيستند ، اما در مورد رشته ها اين خاصيت برقرار است .در مثال زير جملات نوشته شده خروجي هاي گوناگوني را نشان ميدهند . چون دو لغت “macro”و “MACRO” دو رشته واقعي هستند :

invoice.display = "macro";

invoice.display = "MACRO";

براي نشان دادن كوتيشن در يك رشته ، بايد قبل از آن يك كاراكتر بك اسلش بگذاريد . به اينكار ميگويند فرار (Escaping) كاراكتر . كاراكترهاي ديگري هم هستند كه در اكشن اسكريپت نشان داده نميشوند مگر اينكه از روش هاي فرار كاراكتر خاص آنها استفاده كنيد . جدول زير تمامي كاراكتر هاي استفاده براي فرار يك كاراكتر را نشان ميدهد :

Escape sequence | Character
\b | Backspace character (ASCII 8)
\f | Form-feed character (ASCII 12)
\n | Line-feed character (ASCII 10)
\r | Carriage return character (ASCII 13)
\t | Tab character (ASCII 9)
\" | Double quotation mark
\' | Single quotation mark
\\ | Backslash
\000 - \377 | A byte specified in octal
\x00 - \xFF | A byte specified in hexadecimal
\u0000 - \uFFFF | A 16-bit Unicode character specified in hexadecimal

اعداد :

نوع داده اي عدد از نوع داده اي بسيار دقيق شناور ميباشد . شما ميتوانيد از عملگر هاي حسابي زير جهت عمليات رياضي استفاده كنيد :

+ جمع

- تفريق

* ضرب

/ تقسيم

% به پيمانه

++ افزايش

ـ ـ كاهش

  • توجه : ++ جهت افزودن يك واحد به يك متغير عددي كاربرد دارد . بيشترين استفاده از آن نوشتن i++ بجاي i=i+1 ميباشد . اين عملگر هم قبل و هم بعد از نام متغير عددي استفاده ميشود . در مثال زير متغير age ابتدا يك واحد اضافه شده و سپس با عدد 30 چك ميشود .

if (++age >= 30)

اما در مثال زير age بعد از انجام عمل مقايسه اضافه ميشود .

if (age++ >= 30)

همچنين ميتوانيد از متد هاي آماده آبجكت رياضي اكشن اسكريپت براي دستكاري اعداد استفاده كنيد . در مثال زير ازمتد sqrt جهت جذر گرفتن از عدد داده شده استفاده كرده ايم :

Math.sqrt(100);

نوع داده بولين :

يك مقدار بولين مقداريست كه دو حالت بيشتر نداره ، يا true يا false . اكشن اسكريپت اين دو مقدار را به دو مقدار 1 و 0 نيز تبديل ميكند . مقادير بولين معمولا با عملگر هاي منطقي در جملات اكشن اسكريپت استفاده ميشوند كه باعث انجام مقايسه اي براي اجراي كد بعدي ميشود . بطور مثال در كد زير فيلم در صورتي اجرا ميشود كه متغير Password مقدارش true باشد

onClipEvent(enterFrame) {

if (userName == true && password == true){

play();

}

}

نوع داده تهيNULL) ) :

اين نوع داده فقط يك مقدار دارد و آنهم NULL است به معناي پوچ ، يعني هيچ داده اي وجود ندارد. اين نوع داده براي تفاوت قائل شدن بين وضعيت هاي گوناگون كاربرد دارد . چند مثال :

  • براي اينكه نشون بده هنوز يك متغير مقدار دهي نشده يا اينكه در اين لحظه هيچ مقداري نداره .
  • براي هنگامي كه ميخواهيد در يك فانكشن مقدارش را چك كنيد تا در صورت وجود ارسال شود .
  • و ...

نوع داده اي تعريف نشده ( Undefined) :

اين نوع داده نيز فقط يك مقدار دارد كه Undefined است و براي متغير ها استفاده ميشود كه هنوز مقداري نگرفته اند .

لينک مقاله
http://www.macromediax.com :منبع

مقالات مرتبط با اين موضوع
آموزش فلش : لود کردن صدا بصورت داینامیک | actionscript
آموزش فلش : لود کردن عکس بصورت داینامیک | actionscript
اکشن اسکریپت : اولويت عملگر هاي فلش | actionscript
اكشن اسكريپت : استفاده از عملگرها براي دستكاري مقادير عبارت ها (بخش اول) | actionscript
اكشن اسكريپت - متغير ها در فلش | actionscript
اكشن اسكريپت : كنترل در زمان اجرا | actionscript
اكشن اسكريپت : متغير هاي رشته اي ، عددي و بولين و نال | actionscript
اکشن اسکریپت ، یک زبان شیئ گرا | actionscript
Action Script - FScommand | actionscript
آشنایی با سمبل ها در فلش | actionscript
قالب دستوري اكشن اسكريپت | actionscript

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


اكشن اسكريپت : كنترل در زمان اجرا

وقتي شما يك اكشن اسكريپت مينويسد ،از پنل Actions براي ضميمه كردن كد ها به فريم يا دكمه يا مووي كليپ ها استفاده ميكنيد . اسكريپت هايي كه به فريم ها ضميمه ميكنيد زماني اجرا ميشوند كه هد اجرايي فلش وارد آن فريم شود . اما فريم اول فيلم فلش بگونه اي متفاوت از ساير فريم ها عمل ميكند . چون اولين فريم فيلم فلش كم كم لود ميشود و اشياء در آن همينطور كه دانلود ميشوند نمايش داده ميشوند و اين موضوع بر روي اجراي اسكريپت ها اثر ميگذارد . اما فريم هاي بعد از فريم اول تا وقتي تمام اشياء داخل آن فريم لود نشوند نمايش داده نميشوند .

اسكريپت هايي كه به مووي كليپ يا دكمه ها نسبت داده شده اند زماني اجرا ميشوند كه رويداد (event) خواسته شده اتفاق افتد . يك رويداد يك اتفاقي است كه توسط كاربر يا گاهي توسط فيلم فلش شما اتفاق مي افتد ، مانند كليك كردن موس ، فشردن يك دكمه از كيبورد ، و يا لود شدن يك مووي كليپ ( اين آخري توسط فيلم اتفاق افتاده) . شما ميتوانيد بر اساس رويداد هايي كه رخ ميدهد كد هاي متفاوتي بنويسيد تا در هنگام رخ دادن هر رويداد يك كد خاص اجرا گردد .

اكشن هايي كه به دكمه ها يا مووي كليپ ها نسبت ميدهيد در اكشن هاي خاصي بنام Handler حبث ميشوند .on و onClipEvent دوHandler هستند . شما ميتوانيد يك يا بيش از يك Event را در يك Handler قرار دهيد و همچنين ميتوانيد بيش از يك Handler براي هر شيئ قرار دهيد . هندلر onClipEvent براي مووي كليپ و هندلر on براي دكمه هاست . همچنين شما ميتوانيد از on براي خلق مووي كليپ دكمه اي استفاده كنيد كه رويداد هاي دكمه را دريافت ميكند .

رويداد هاي مووي كليپ و دكمه ها ميتوانند توسط متد هاي خود شيئ نيز بكار گرفته شوند . شما بايد يك فانكشن تعريف كنيد و آن را به متد Event Hadler ارجاع دهيد . اين فانكشن وقتي كه رويداد اتفاق بيافتد اجرا ميشود .

جدول زير متد ها و Event Handler هاي دكمه ها را نشان ميدهد :

Event handler actions | Event handler methods
on (press) | onPress
on (release) | onRelease
on (releaseOutside) | onReleaseOutside
on (rollOver) | onRollOver
on (rollOut) | onRollOut
on (dragOver) | onDragOver
on (dragOut) | onDragOuot
on (keyPress"...") | onKeyDown, onKeyUp

جدول زير متد ها و Event Handler هاي مووي كليپ ها را نشان ميدهد :

Event handler actions | Event handler methods
onClipEvent (load) | onLoad
onClipEvent (unload) | onUnload
onClipEvent (enterFrame) | onEnterFrame
onClipEvent (mouseDown) | onMouseDown
onClipEvent (mouseUp) | onMouseUp
onClipEvent (mouseMove) | onMouseMove
onClipEvent (keyDown) | onKeyDown
onClipEvent (keyUp) | onKeyUp
onClipEvent (data) | onData

با اكشن اسكريپت همچنين ميتوانيد رويداد هاي TEXTbox و ديگر اشياء اكشن اسكريپت را كنترل كنيد .
لينک مقاله
http://www.macromediax.com :منبع

مقالات مرتبط با اين موضوع
آموزش فلش : لود کردن صدا بصورت داینامیک | actionscript
آموزش فلش : لود کردن عکس بصورت داینامیک | actionscript
اکشن اسکریپت : اولويت عملگر هاي فلش | actionscript
اكشن اسكريپت : استفاده از عملگرها براي دستكاري مقادير عبارت ها (بخش اول) | actionscript
اكشن اسكريپت - متغير ها در فلش | actionscript
اكشن اسكريپت : كنترل در زمان اجرا | actionscript
اكشن اسكريپت : متغير هاي رشته اي ، عددي و بولين و نال | actionscript
اکشن اسکریپت ، یک زبان شیئ گرا | actionscript
Action Script - FScommand | actionscript
آشنایی با سمبل ها در فلش | actionscript
قالب دستوري اكشن اسكريپت | actionscript

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


اكشن اسكريپت - متغير ها در فلش

اكشن اسكريپت - متغير ها در فلش :

متغير چيست ؟

يك متغير يك نگه دارنده اطلاعات است كه بخشي از حافظه را بنام خود ميكند تا شما بتوانيد داخلش مقدار هاي متفاوتي را بنويسيد و پاك كنيد . متغير خودش ثابت ميماند اما مقدار داخلش تغيير ميكند .براي نگه داشتن مقادير انجام شدن يك كار خاص يا گرفتن اطلاعات از كاربر ، اول اطلاعات به حافظه رم كامپيوتر منتقل ميشود كه اينجا متغير ها هستند كه نقش نگه داري اطلاعات را انجام ميدهند .

يك ايده خوب در بكار گيري متغير ها اينه كه همون اول كه متغير را تعريف ميكنيم يه مقدار اوليه بهش بديم . به اينكار ميگويند initialize كردن . اينكار را معمولا در فريم اول انجام ميدن .

متغير ها ميتوانند انواع مختلفي از اطلاعات را در خود نگه دارند مانند اعداد ، رشته ها ، مقادير بولين ، آبجكت ها يا مووي كليپ ها .

نام گذاري متغير ها :

نام يك متغير از قوانين زير پيروي ميكند :

  • بايد اسم آن نشان دهنده نوع آن باشد .
  • نام متغير نميتواند از بين keyword هاي اكشن اسكريپت باشد . همچنين نميتواند از كلمات تعيين كننده مانند true , false , null و undefiend باشد.
  • نام متغير بايد در محيط خودش يكتا باشد .

مقدار دهي متغير :

در فلش نيازي نيست كه نوع متغير را در ابتداي كار تعيين كنيد . فلش هنگامي كه شما به آن مقدار ميدهيد نوع متغيرش را تعيين ميكند.

X = 3 ;

در عبارت فوق ، فلش داده سمت راست مساوي را تعيين هويت ميكند و ميفهمد كه نوع آن عدد است . يك مقدار دهي ديگر ميتواند نوع x را عوض كند . مثلا x = “hello”; مقدار x را به نوع رشته اي تغيير ميدهد . متغيري كه هنوز هيچ داده اي به آن نداده ايم نوع undefiend دارد .

وقتي يك عبارت اكشن اسكريپت يك متغير را با نوع داده اي خاصي طلب ميكند ، اكشن اسكريپت بصورت اتوماتيك نوع آن را تغيير ميدهد تا نوع داده اي مطلوب حاصل شود . بطور مثال وقتي شما مقداري را به دستور trace ميدهيد مقدارش به نوع داده رشته اي تغيير ميكند و سپس آن را نمايش ميدهد . در عبارت هايي كه عملگر هاي رياضي و مانند آن قرار دارند اكشن اسكريپت متغير ها را به نوع داده اي مورد نياز تبديل ميكند . مثلا در عبارت زير 7 يك عدد است كه براي جمع با رشته تبذيل به رشته ميشود .

"Next in line, number " + 7

پس از تبديل جواب جمع رشته بصورت زير در ميايد :

"Next in line, number 7"
 وقتی شما اسکریپت هایتان را اشکال زدایی میکنید نگاهی به نوع متغیرها بیندازید.
کد زیر نوع متغیر را اعلام میکند
trace(typeof(نام متغير));

قلمرو يك متغير :

قلمرو يك متغير به محدوده اي ميگويند كه آن متغير در آن شناسايي ميشود و ميتوان به آن دسترسي داشت . سه نوع قلمرو براي متغير ها در اكشن اسكريپت موجود است .

  • متغير هاي local (محلي) : اين متغيرهادر بلوك كد خودشان قابل دسترسي هستند (كه بلوك كد آنها با آكولاد محصور ميشود) .
  • متغير هاي Timeline : كه در هر تايم لايني كه از Target path استفاده كنيد قابل دسترسي هستند .
  • متغير هاي عمومي (global) : كه در هر تايم لايني قابل دسترسي است . حتي اگر از target path استفاده نكرده باشيد .

براي اعلام كردن يك متغير(declare) ميتوانيد از عبارت var استفاده كنيد . بطور مثال متغير هاي j و i معمولا براي استفالده در حلقه ها استفاده ميشوند (البته هر اسمي ميشه گذاشت ، فكر نكني اسمش چيز خاصي داره ها .. اما خوب برنامه نويسا به يه سري اسامي عادت كردن ديگه) .

در كد زير i به عنوان يك متغير محليبگار رفته كه فقط در فانكشن makedays وجود دارد .

function makeDays() {
               var i;
               for( i = 0; i < monthArray[month]; i++ ) {
                               _root.Days.attachMovie( "DayDisplay", i, i + 2000 );
                               _root.Days[i].num = i + 1;
                               _root.Days[i]._x = column * _root.Days[i]._width;
                               _root.Days[i]._y = row * _root.Days[i]._height;
                               column = column + 1;
                               if (column == 7 ) {
                                              column = 0;
                                              row = row + 1;
                               }
               }
}

اعلام كردن يا مقدار دهي متغير (declaration):

  • براي ديكلر كردن متغير هاي تايم لاين ، از اكشن set variable استفاده ميشود و يا از عملگر مساوي . هر دو متد يك كار را انجام ميدهند .
  • براي ديكلر كردن متغير هاي محلي از عبارت var در داخل فانكشن ها استفاده ميشود . يك متغير محلي در بلوك فانكشن محصور است و با رسيدن كد به خط پاياني فانكشن ، متغير محلي (اصطلاحا) ميميرد . متغير محلي اي كه در داخل بلوك نباشد با رسيدن به پايان اسكريپتش مي ميرد .
  • براي دكلر كردن متغير هاي عمومي (global ) از عبارت _global قبل از اسم متغير استفاده ميشود. كدي كه مشاهده ميكنيد يك متغير عمومي بنام myname ميسازد :

_global.myName = "SHARAFI";

استفاده از يك متغير :

به مثال زير توجه كنيد :

getURL(myWebSite);
myWebSite = "http://www.macromediax.net";

اين كد دچار مشكل است و باعث ايجاد خطا در اسكريپت ميشود . چون در اين كد ابتدا از يك متغير استفاده كرده ايم و بعد آن را مقدار داده ايم . پس مقدار دهي بايد قبل از استفاده صورت گيرد .

يك مثال ديگر : در مثال زير x مقدار 15 گرفته و سپس مقدارش در Y كپي شده . در خط سوم مقدار x مساوي با 30 شده است . اما مقدار Y همان 15 ميماند . چون Y مقدارش را از X كپي گرفته و ديگر كاري به كار هم ندارند .

var x = 15;
var y = x;
var x = 30;
لينک مقاله
http://www.macromediax.com :منبع

مقالات مرتبط با اين موضوع
آموزش فلش : لود کردن صدا بصورت داینامیک | actionscript
آموزش فلش : لود کردن عکس بصورت داینامیک | actionscript
اکشن اسکریپت : اولويت عملگر هاي فلش | actionscript
اكشن اسكريپت : استفاده از عملگرها براي دستكاري مقادير عبارت ها (بخش اول) | actionscript
اكشن اسكريپت - متغير ها در فلش | actionscript
اكشن اسكريپت : كنترل در زمان اجرا | actionscript
اكشن اسكريپت : متغير هاي رشته اي ، عددي و بولين و نال | actionscript
اکشن اسکریپت ، یک زبان شیئ گرا | actionscript
Action Script - FScommand | actionscript
آشنایی با سمبل ها در فلش | actionscript
قالب دستوري اكشن اسكريپت | actionscript

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


اكشن اسكريپت : استفاده از عملگرها براي دستكاري مقادير عبارت ها (بخش اول)

يك عبارت (معمولا عبارت رياضي)جمله ايست كه فلش ميتواند مقدارش را محاسبه كند و يك مقدار برگرداند .شما ميتوانيد با تركيب فانكشن ها ، عملگر ها و استفاده از و مقدار هاي داده شده يك عبارت بسازيد . وقتي در پنل اكشن در حالت نرمال يك عبارت بنويسيد بايد گزينه Expression را در كنار جعبه متني اي كه عبارت را در داخل آن مينويسيد تيك بزنيد تا فلش آن را بعنوان يك عبارت در نظر بگيرد و هنگام استفاده از آن ، آن را محاسبه كند ، نه اينكه آن را مستقيم استفاده كنيد . در صورت تيك نزدن گزينه Expression فلش آن را بعنوان يك رشته در نظر ميگيرد .

انواع عملگر ها در فلش :

1- عملگر هاي عددي

2- عملگر هاي مقايسه اي

3- عملگر هاي رشته اي

4- عملگر هاي منطقي

5- عملگر هاي Bitwise براي اعداد شناور

6- عملگر هاي تساوي

7- عملگر هاي انتقالي

8- عملگر هاي دسترسي آرايه و نقطه

1 - عملگر هاي عددي :

كارشان جمع و تفريق و ضرب و تقسيم است ، بيشترين كاربرد عملگر افزايشگر ، استفاده i++ بجاي i = i+1 است . عملگر افزايشگر هم قبل و هم بعد از متغير ها ميتواند بيايد . با يك مثال فرق آنها را متوجه ميشويد :

if (++age >= 30)

در مثال فوق ابتدا Age افزايش يافته و سپس مقايسه صورت ميگيرد .

if (age++ >= 30)

در مثال دوم ابتدا مقايسه صورت ميگيرد و سپس Age افزايش ميابد .

عملگر | كار عملگر
+ | جمع
* | ضرب
/ | تقسيم
% | Mod (باقيمانده تقسيم)
- | تفريق
++ | افزايش
-- | كاهش

2 - عملگر هاي مقايسه اي :

اين عملگر ها مقادير عبارات را بررسي کرده و يک مقدار بولين بر ميگردانند . و اکثرا در اکشن هاي if دار و در حلقه ها استفاده ميشوند .

عملگر | كار عملگر
< | کوچک تر از
> | بزرگتر از
<= | کوچکتر مساوي
>= | بزرگتر مساوي

3 - عملگر هاي رشته اي :

عملگر + يك حالت خاص را روي رشته ها انجام ميدهد و آن متصل كردن رشته ها به يكديگر ميباشد . مثالي براي جمع دو رشته :

"Congratulations, " + "Donna!"
نتيجه بصورت زير در مي آيد :
"Congratulations, Donna!"

3 - عملگر ها ي منطقي:

اين عملگر ها مقادير بولين را با هم مقايسه ميكنند و يك مقدار بولين بعنوان جواب پس ميدهند .

بطور مثال اگر هر دو مقدار داده شده به عملگر and مقدار true باشد جواب نهايي and مقدار true خواهد بود ،عملگر OR زماني مقدارش true ميشود كه حداقل يكي از مقادير داده شده به آن true باشد . عملگر not يك مقدار را ميگيرد و اگر آن مقدار درست نباشد (يعني false باشد ) آنگاه مقدار not برابر با true ميشود . به مثال زير توجه كنيد :

if (i > 10 && _framesloaded > 50){
         play();
}

جدول زير نمونه هاي عملگر منطقي را نشان ميدهد .

Operator | Operation performed
&& | Logical AND
|| | Logical OR
! | Logical NOT
لينک مقاله
http://www.macromediax.com :منبع

مقالات مرتبط با اين موضوع
آموزش فلش : لود کردن صدا بصورت داینامیک | actionscript
آموزش فلش : لود کردن عکس بصورت داینامیک | actionscript
اکشن اسکریپت : اولويت عملگر هاي فلش | actionscript
اكشن اسكريپت : استفاده از عملگرها براي دستكاري مقادير عبارت ها (بخش اول) | actionscript
اكشن اسكريپت - متغير ها در فلش | actionscript
اكشن اسكريپت : كنترل در زمان اجرا | actionscript
اكشن اسكريپت : متغير هاي رشته اي ، عددي و بولين و نال | actionscript
اکشن اسکریپت ، یک زبان شیئ گرا | actionscript
Action Script - FScommand | actionscript
آشنایی با سمبل ها در فلش | actionscript
قالب دستوري اكشن اسكريپت | actionscript

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


اکشن اسکریپت : اولويت عملگر هاي فلش

وقتي در يك عبارت رياضي اكشن اسكريپت چند عملگر گوناگون را در كنار هم بكار ميبريد فلش براي بعضي عملگر ها نسبت به بقيه حق تقدم قائل ميشود . بطور مثال ضرب هميشه قبل از جمع انجام ميشود .گرچه پرانتز ها هميشه بر همه چيز تقدم دارند .

مثال زير را مشاهده كنيد :

Total = 2 + 4 * 3 ;

مقدار توتال در مثال فوق 14 است (اول ضرب و بعد جمع)

Total = (2 + 4) * 3 ;

در مثال دوم جواب 18 است . (اول پرانتز محاسبه شده و بعد ضرب)

جدول زير ليست عملگر هاي اكشن اسكريپت و موقعيت آنها و اولويت آنها را از بالا به پايين ليست كرده است .

عملگر | توضيحات | پشت هم آمدن
بالاترين اولويت
+ | Unary plus | راست به چپ
- | Unary minus | راست به چپ
~ | Bitwise one's complement | راست به چپ
! | Logical NOT | راست به چپ
not | Logical NOT (Flash 4 style) | راست به چپ
++ | Post-increment | چپ به راست
-- | Post-decrement | چپ به راست
( ) | Function call | چپ به راست
[ ] | Array element | چپ به راست
. | Structure member | چپ به راست
++ | Pre-increment | راست به چپ
-- | Pre-decrement | راست به چپ
new | Allocate object | راست به چپ
delete | Deallocate object | راست به چپ
typeof | Type of object | راست به چپ
void | Returns undefined value | راست به چپ
* | Multiply | چپ به راست
/ | Divide | چپ به راست
% | Modulo | چپ به راست
+ | Add | چپ به راست
add | String concatenation (formerly &) | چپ به راست
- | Subtract | چپ به راست
<< | Bitwise left shift | چپ به راست
>> | Bitwise right shift | چپ به راست
>>> | Bitwise right shift (unsigned) | چپ به راست
< | Less than | چپ به راست
<= | Less than or equal to | چپ به راست
> | Greater than | چپ به راست
>= | Greater than or equal to | چپ به راست
lt | Less than (string version) | چپ به راست
le | Less than or equal to (string version) | چپ به راست
gt | Greater than (string version) | چپ به راست
ge | Greater than or equal to (string version) | چپ به راست
== | Equal | چپ به راست
!= | Not equal | چپ به راست
eq | Equal (string version) | چپ به راست
ne | Not equal (string version) | چپ به راست
& | Bitwise AND | چپ به راست
^ | Bitwise XOR | چپ به راست
| | Bitwise OR | چپ به راست
&& | Logical AND | چپ به راست
and | Logical AND (Flash 4) | چپ به راست
|| | Logical OR | چپ به راست
or | Logical OR (Flash 4) | چپ به راست
?: | Conditional | راست به چپ
= | Assignment | راست به چپ
*=, /=, %=, +=, -=, &=, |=, ^=, <<=, >>=, >>>= | Compound assignment | راست به چپ
, | Multiple evaluation | چپ به راست
پايين ترين اولويت
لينک مقاله
http://www.macromediax.com :منبع

مقالات مرتبط با اين موضوع
آموزش فلش : لود کردن صدا بصورت داینامیک | actionscript
آموزش فلش : لود کردن عکس بصورت داینامیک | actionscript
اکشن اسکریپت : اولويت عملگر هاي فلش | actionscript
اكشن اسكريپت : استفاده از عملگرها براي دستكاري مقادير عبارت ها (بخش اول) | actionscript
اكشن اسكريپت - متغير ها در فلش | actionscript
اكشن اسكريپت : كنترل در زمان اجرا | actionscript
اكشن اسكريپت : متغير هاي رشته اي ، عددي و بولين و نال | actionscript
اکشن اسکریپت ، یک زبان شیئ گرا | actionscript
Action Script - FScommand | actionscript
آشنایی با سمبل ها در فلش | actionscript
قالب دستوري اكشن اسكريپت | actionscript

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


دریم ویور : رویاباف طراحان وب

نام این نرم افزار به معنای رویاباف میباشد ، البته از نظر من ماکرومدیا در این مورد اصلا اقراق نکرده است . چون کار این نرم افزار آنچنان ظریف و استثنایی است که جز در رویای شما قابل تصور نیست . در این مقاله در مورد قابلیتهای نرم افزار Dreamweaver صحبت خواهد شد .

Dreamweaver MX 2004—Just Updated

کار دریم ویور چیست ؟

نرم افزار Dreamweaver از شرکت Macromedia در نگاه اول نرم افزار ساده ای جهت ساخت صفحات HTML (Hyper Text Markup Language) است . که به ما کمک میکند تا مجبور نشویم کدهای زبان HTML را حفظ کنیم و با چند حرکت و کلیک دستورات به زبان HTML انجام میشوند و در واقع باید بگوییم این نرم افزار Dreamweaver است که Tag های زبان HTML را کاملا حفظ کرده و برای ما انجام میدهد .

شاید اولین سوالی که برای شما پیش بیاید این است که چه اشخاصی به سوی نرم افزار Dreamweaver میروند و چرا از نرم افزار های رقیب Dreamweaver یعنی GoLive از شرکت Adobe و FrontPage از شرکت Microsoft استفاده نکنیم . جواب این است که نرم افزار Dreamweaver از شرکت Macromedia و همچنین نرم افزار GoLive از شرکت Adobe برای طراحان وبی است که کارهای گرافیکی میتوانند بکنند یا بهتر بگویم طراح گرافیکی هستند اما نرم افزار FrontPage از شرکت Microsoft برای کسانی بیشتر به درد میخورد که کار آنها اتوماسیون اداری است یعنی با مجموعه برنامه Office از شرکت Microsoft کار میکنند بهتر است . و ما چون زمینه کارمان گرافیک است از بین نرم افزارهای Macromedia Dreamweaver MX 2004 و Adobe GoLive CS نرم افزار Dreamweaver را انتخاب کردیم ، زیرا نرم افزار Dreamweaver با نرم افزار Fireworkes از همین شرکت Macromedia است به خوبی مکالمه میکند و نرم افزار GoLive با نرم افزار Adobe ImageReady به خوبی مکالمه میکند و ما نیز چون Target کارمان شرکت Macromedia است نرم افزار Dreamweaver MX 2004 را انتخاب کردیم .

Dreamweaver MX 2004 به جز ساخت صفحات HTML از نوع Static و Dynamic میتواند به ساخت صفحات با PHP و ASP و ASP.NET و JSP و ColdFusion نیز به ما کمک کند ، همچنین این برنامه فلش را بخوبی پشتیبانی میکند و همین امر در طراحی سرعت ما را افزایش و خطاهای ایجاد شده در فرانت پیج را در هنگام کار با فلش ها کاهش میدهد . این برنامه ساخت behavior ها را نيز بخوبي پشتيباني ميکنيد . امکانات ديگر آن در هنگام کار با برنامه چندان زياد است که گاهي از اينهمه ابزار به هيجان مي آييد . پس از اين پس براي بافتن روياهاي خود در وب يک روياباف داريد !
لينک مقاله
http://www.macromediax.com :منبع

مقالات مرتبط با اين موضوع
دریم ویور : رویاباف طراحان وب | html
سایت خود را مطابق تکنولوژی جستجوگر ها طراحی کنید | html
متاتگ چیست ؟ | html
نمايش عكسي به دنبال نشانگر ماوس | html
تگ Anchor و شناسه href | html
دو نکته بسيار مهم در مورد فارسی نويسی | html
تگ های اچتمل | html
مقده اي بر وب و زبان html | html
قرار دادن تصوير در صفحات و کد جدول | html
معرفي تگ هاي اوليه در اچ تي ام ال | html
آموزش زبان صفحات وب HTML | html

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آموزش فلش : لود کردن عکس بصورت داینامیک

هنگامی که شما یک عکس را در فلش هنگام طراحی قرار میدهید ،این فایل بهمراه بقیه جزئیات در فایل SWF نهایی شما کامپایل میشود . این کار حجم فایل شما را بالا میبرد . اما میتوانید اینکار را توسط کد های اکشن اسکریپت انجام دهید تا فایل عکس شما در فایل فلش جاسازی نشود .بلکه در زمان اجرا از یک آدرس لود شود .

  • برای لود کردن تصاویر jpeg در زمان اجرا در یک LEVEL ، باید از متد LoadmovieNum و برای لود کردن عکس در یک Movieclip باید از متد loadmovie متعلق به شیئ Movieclip استفاده کنید . هنگامی که عکسی را در Movieclip لود میکنید این عکس جایگزین تمام محتویات Movieclip میشود.
  • برای بدست آوردن مقدار بایت های دانلود شده از متد getbytesLoaded متعلق به شیئ Movieclip استفاده میکنیم.
  • فلش برای فایل های عکس فلش فقط فرمت Standard Jpeg را ساپورت میکند و حالت Progressive jpeg را قبول نمیکند .
  • مثال : کد زیر یک عکس را در Movieclip لود میکند . جای آن روی timeline جاییست که Movieclip مربوطه قرار دارد :

myMC.loadmovie(http://www.Persianyahoo.com/index/logo.jpg)
لينک مقاله
http://www.macromediax.com :منبع

مقالات مرتبط با اين موضوع
آموزش فلش : لود کردن صدا بصورت داینامیک | actionscript
آموزش فلش : لود کردن عکس بصورت داینامیک | actionscript
اکشن اسکریپت : اولويت عملگر هاي فلش | actionscript
اكشن اسكريپت : استفاده از عملگرها براي دستكاري مقادير عبارت ها (بخش اول) | actionscript
اكشن اسكريپت - متغير ها در فلش | actionscript
اكشن اسكريپت : كنترل در زمان اجرا | actionscript
اكشن اسكريپت : متغير هاي رشته اي ، عددي و بولين و نال | actionscript
اکشن اسکریپت ، یک زبان شیئ گرا | actionscript
Action Script - FScommand | actionscript
آشنایی با سمبل ها در فلش | actionscript
قالب دستوري اكشن اسكريپت | actionscript

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آموزش فلش : لود کردن صدا بصورت داینامیک
  • برای لود کردن MP3 در فلش در زمان اجرا از متد Loadsound متعلق به شی Sound استفاده کنید . برای اینکار شما باید یک نمونه از روی شیی sound بسازید تا بتوانید از متد آن برای لود کردن صدا در event یا در حالت streaming استفاده کنید.
  • صداهای event اول کامل لود شده و بعد اجرا میشوند . صداهای حالت streaming در حین دانلود شدن اجرا میشوند. شما میتوانید از پارامتر IsStreaming در متد Loadsound برای تعیین کردن نوع لود شدن صدا استفاده کنید. وقتی یک صدای event را بارگذاری میکنید ، برای اجرایش باید متد START مربوط به شیی Sound را اجرا کنید . برای اجرای صداهای نوع streaming نیاز به کد START نیست ، چون وقتی به مقدار کافی از آن دانلود شود شروع به اجرا میکند .
  • برای بدست آوردن مقدار بایت های دانلود شده از متد  GetbytesTotalمتعلق به شیء Sound استفاده میکنیم.
  • فلش فقط فایل های MP3 را ساپورت میکند .

برای لود کردن یک صدا بصورت داینامیک :

یک شیئ یا فریم را برای صدا دادن به آن انتخاب کنید و کد زیر را به آن اضافه کنید . mysound نام شیئ ساخته شده توسط ما از روی شیئ sound است. true در آخر خط دوم نشان دهنده streaming نبودن صداست و تا لود نشود نمیتوان اجرایش کرد (برای حالت streaming باید TRUE بنویسید ) .در نهایت در خط سوم آهنگ شروع به اجرا میکند .

mysound = new sound();

mysound.loadsound("http://www.music.com/s2.mp3", false);

mysound.start();
لينک مقاله
http://www.macromediax.com :منبع

مقالات مرتبط با اين موضوع
آموزش فلش : لود کردن صدا بصورت داینامیک | actionscript
آموزش فلش : لود کردن عکس بصورت داینامیک | actionscript
اکشن اسکریپت : اولويت عملگر هاي فلش | actionscript
اكشن اسكريپت : استفاده از عملگرها براي دستكاري مقادير عبارت ها (بخش اول) | actionscript
اكشن اسكريپت - متغير ها در فلش | actionscript
اكشن اسكريپت : كنترل در زمان اجرا | actionscript
اكشن اسكريپت : متغير هاي رشته اي ، عددي و بولين و نال | actionscript
اکشن اسکریپت ، یک زبان شیئ گرا | actionscript
Action Script - FScommand | actionscript
آشنایی با سمبل ها در فلش | actionscript
قالب دستوري اكشن اسكريپت | actionscript

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


JavaScript چيست؟
در اولين روزهاي تاسيس وب دستورات HTML بسيار ساده بود، ولي هنگامي که Web، شروع به پيشرفت نمود، طراحان خواستار کنترل بيشتري شده و در نتيجه مجموعه دستورات مورد نياز تهيه گرديد.سپس از آنجاييکه صفحات وب، بهتر است به صورت ديناميک و متحرک باشند، طراحان نيز خواستار ارتباط بين بينندگان سايت و صاحبان آن شدند، در نتيجه استفاده از دستورات HTML به تنهايي نياز آنها را برطرف نکرد و سپس شرکت Netscape براي ايجاد و کنترل ارتباط بين صاحبان سايت و بينندگان آن در صفحات Web از JavaScript کمک گرفت.

JavaScript يک زبان برنامه نويسي است که به وسيله آن ميتوان بين کاربر و سايت ارتباط برقرار نمود . زبان JavaScript به حروف بزرگ و کوچک حساس ميباشد. برخلاف شباهت اسمي موجود برنامه Java و JavaScript، هيچگونه شباهتي بين اين دو برنامه وجود ندارد. Java يک زبان برنامه نويسي بسيار کامل پيشرفته اي است که توسط شرکت sun microsystem تهيه شده و جاوا اسکریپت توسط شرکت netscape.( اساس Java در برنامه هاي client-side براي ايجاد appletها ميباشد، اين برنامه هاي کوچک توسط شبکه اينترنت دريافت شده و درون خود browserها اجرا ميشوند بطوريکه بعلت وجود قابليت همه گير Java، اين برنامه در تمامي browserهايي که قابليت اجراي Java را دارند، کار ميکنند). زبان JavaScript يک زبان برنامه نويسي "شي گرا" ميباشد. از آنجا که JavaScript يک متن ساده ميباشد، در نتيجه ميتوان از هر ويرايشگر متن کمک گرفت، در سيستم ويندوز اغلب کاربران از برنامه notepad استفاده ميکنند.امروزه کدهاي جاوا در صفحات وب براي زيبا نمايي يا افزايش پويايي صفحات کاربرد زيادي دارد.

منابع جاوا اسکريپت جاوا اسکريپت دات آي آر javascript.internet.com javascriptkit.com
لينک مقاله
http://www.macromediax.com :منبع

مقالات مرتبط با اين موضوع
JavaScript چيست؟ | javascript
افکت قلب و لب همراه باموس. | javascript
لرزش صفحه وب سايت هنگام باز شدن | javascript
کد بارش بارون و بارش برف در صفحه وبلاگ | javascript
خاموش کردن قابليت کليک راست | javascript
نمايش پيغامهاي تصادفي در نوار وضعيت | javascript
طريقه Fade كردن عكسها با استفاده از جاوا اسكريپت | javascript
Preload براي صفحات وب | javascript

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


انواع متغييرها در PHP

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

من در اينجا سه دسته مختلف از انواع متغيير ها را توضيح مي دهم.

1) اعداد (numbers)
2) رشته ها (String)
3) آرايه ها (arrays)

دسته اول شامل دو نوع متغيير است:

1)اعداد صحيح (integers)
2)اعداد اعشاري (floating - point) ( همچنين اعداد اعشاري با دقت مضاعف double)

اما از آنجايي که تفاوت چنداني در چگونگي به کار بردن اين دونوع متغيير وجود ندارد . اين دو را در يک دسته قرار مي دهيم.

PHP همچنين داراي يک نوع متغيير به نام شيء (object) مي باشد.

اعداد
نکته:اعداد به صورت اعشاري ( همراه با مميز ) و يا اعدا کسري از نوع متغييرهاي اعشاري محسوب مي شوند. براي مثال (1.0) در PHP يک عدد اعشاري به حساب مي آيد. توجه کنيد که در PHP اعداد به صورت کسري ذخيره نمي شوند بلکه معادل اعشاري خود تبديل شده و سپس ذخيره مي شوند.

مثالهايي از اعداد صحيح معتبر:

آ 1آ و 1972آ و 1-

مثالهاي از اعداد اعشاري :

1.0آ و 19.72 و 1.0-

همچنين مثالهاي که در دسته اعداد قرار نمي گيرند:

4/11 a1972 آ 02.23.72

رشته ها
يک متغيير از نوع رشته اي (String) از ترکيب هر نوع کارکتري ( حروف - اعداد - علائم و جاي خالي ) مي تواند ساخته شود.اما اين کارکترها بايد در داخل يکي از علامتهاي Single(' ') Quotation و يا (" " ) Double Quotation قرار گيرند.

مثال:
HELLO , WORLD !""

"hello frist name ! "

"1 1/4"

"how are you?"

"02.23.72"

"1972"
نکته : اگر عدد نيز در داخل Quotation قرار گيرد يه عنوان يک داده رشته اي در نظر گرفته مي شود.

مثالهاي از داده هاي رشته اي غير مجاز:

hello world!

how are you" " "I Said," "

توجه!!!

شايد اين سئوال در ذهن شما به وجود بياد که چطوري مي تونيم يک علامت " را به مرور گر ارسال کنيم؟

ما مي تونيم اين مشکل رو در PHP به اين صورت رفع کنيم که قبل از علامت quitation از علامت () استفاده کنيم!!!

پس وقتي ما در دستور print() اين عبارت (I Said, "How are You?" "") رو تايپ کنيم خروجي اين دستور به صورت ( I Said, "How are You?" ) خواهيد ديد.

بنابراين هر چند که گفته شد در داده رشته اي هر ترکيبي از کاراکترها به کار مي رود. بايد توجه داشته باشيد که در مورد کاراکترهاي ويژه بايد دقت خاصي اعمال شود. کاراکترهاي ويژه ديگري نيز وجود دارند که هنگام استفاده از آنها در يک داده رشته اي بايد علامت backslash () قبل از آنها قرار دهيم.

اين کاراکتر ها عبارت است از:

single quotation ( ' )

apostrophe

backslash

و علامت dollar

نکات:
-مزيت استفاده از double quotes به جاي single quotes در اين است که در حالت دوم اگر متغييري داخل داده رشته اي خود به کار ببريد نام متغيير به عنوان جزئي از داده در نظر گرفته مي شود و نه مقدار آن متغيير جايگزين نام آن نمي شود.

- در درسهاي قبلي اشاره شد که در ترکيب براي مثال در تابع print() باعث ايجاد خط جديد مي شود. بنابراين مشاهده مي کنيد که در اين حالت خاص علامت backslash باعث در نظر گرفتن n به صورت يک کاراکتر معمولي نشد.از موارد خاص ديگر مي توان به ترکيب ( بازگشت خطي ( carriage return)) و ( براي قرار دادن يک tab) اشاره کرد.

آرايه ها:
از آنجايي که آرايه ها کمي پيچيده تر از داده هاي عددي و رشته اي به حساب مي آيند.در اين قسمت تنها مختصري در مورد آنها توضيح داده مي شود و در درسهاي آينده با کاربرد هاي آن بيشتر آشنا خواهيد شد.

بر خلاف داده هاي عددي و رشته اي که تنها مي توانند داراي يک ارزش و يا مقدار باشند. آرايه ها مي توانند حاوي ليستي از مقادير باشند.بنابراين شما مي توانيد مقادير مختلف عددي و يا رشته اي را داخل يک آرايه قرار دهيد. همچنين آرايه ها خود مي توانند شامل ليستي از آرايه ها باشند.

نکته:
- آرايه هاي استاندارد در PHP از مقادير دادهاي و يا عددي تشکيل مي شوند ( اين آرايه ها به آرايه هاي شماره گذاري شده ( indexed ) و يا برداري ( vector ) نيز معروف هستند.)

و اين همانآ نامي است که Perl به اين دسته از آرايه ها نسبت مي دهد. در Perl آرايه هايي که خود از آرايه هايي که خود از آرايه تشکيل شده باشد. به نامهاي آرايه هاي hash و associative و multi_dimensional شناخته مي شوند. در PHP به هر دو دسته ( يک يا چند بعدي ) لفظ آ« آرايه آ» اطلاق مي شود.

نسبت دادن مقادير به متغييرها
در PHP شما به اعلان ( declare ) متغييرها احتياج نداريد. همچنين نوع يک متغيير در هنگام عمل انتساب مشخص مي شود.

در PHP براي نسبت دادن يک مقدار به يک متغيير و ذخيره آن مقدار از علامت مساوي ( = ) استفاده مي کنيد.در اين هنگام اين علامت با نام عملگر انتساب ( assignment Operater ) خوانده مي شود.

مثال:

$number = 1;

$floating-number = 1.2;

$string = "Hello,World!";

نکته:در PHP نيز همانند Java Script نوع متغيير در طول برنامه مي تواند تغيير کند.

متغييرهاي از پيش تعريف شده
متغييرهاي از پيش تعريف شده ( Predefined Variables ) انواع خاصي از متغيير ها هستند که در يکي از برنامه ها به کار گرفته مي شوند:

برنامه هاي کاربردي سرويس دهنده وب ( web server applivations (مانند Apache )

سيستم عاملهاي سرويس دهنده وب ( web server operationg system ( مانند windows nt و يا Solaris)

و يا در خود مدل PHP .

در دو دسته اول اين متغيير ها به متغييرهاي محيطي ( variables enviromental ) معروفند .

متغييرهاي از پيش تعريف شده در سرويس دهنده هاي مختلف ممکن است داراي تفاوتهايي باشند . بنابراين براي مشاهده اين متغييرها بهتر است از تابع phpinfo() که در درسهاي قبلي توضيح داده ام استفاده کنيد.

دو دليل براي آشنايي شما با مفهوم متغييرهاي از پيش تعريف شده وجود دارد.

دليل اول اينست که اين متغييرها در برنامه نويسي شما کاربرد خواهند داشت و دليل ديگر آنکه با شناخت اين متغييرها شما ديگر به صورت تصادفي نام يک متغيير را هم نام با اين متغييرها انتخاب نمي کنيد.

نمونه هايي از متغييرهاي محيطي سرويس دهنده عبارتند از: Hostname ( نامي که سرويس دهنده به خود نسبت داده است) و Ostype ( سيستم عاملي که بر روي سرويس دهنده در حال اجراء مي باشد.)

نمونه هاي از متغيير هاي محيطي Apache عبارتند از: Document_Root ( مکان ذخيره فايل ها بر روي سرويس دهنده) و HTTP_USER_AGENT ( جزئياتي در مورد مرورگر و Platfrom کاربر را ارائه مي دهد).

متغيير PHP-SELF پر کاربردترين متغيير PHP مي باشد که نام صفحه جاري را در خود ذخيره کرده است .

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

لينک مقاله
http://www.ashyaneeh.com :منبع

مقالات مرتبط با اين موضوع
انواع متغييرها در PHP | php
درج تاريخ شمسی، ميلادی و ساعت جاری در صفحات HTML | php
Hot Linking(نقره داغ وب مسترها) | php
يا بافر کردن خروجی | php
چگونه IP در PHP لاگ می شود | php
PHP و برنامه نويسی شی گرا | php
کوتيشن يا دابل کوتيشن؛ کی و کجا استفاده کنيم؟! | php
نصب فارسي نوك FarsiNuke در كلاينت XP,2000 | php
نمايش متن بصورت تصويري در اينترنت | php
كارتهاي الكترونيكي با php وmysql | php
چگونه يك برنامه لاگين امن و حرفه اي طراحي كنيد ? | php
مديريت فايل هاي ارسالي توسط كاربران | php
۷ دلیل برای اینكه استفاده از PHP بهتر از ASP می باشد | php
نکاتی مفید در مورد تنظیم php.ini | php
استفاده از تابع تبدیل تاریخ شمسی به میلادی و برعکس | php
راهنمای کامل نصب PHP بر روی windows | php
روش نصب PHP بروى Windows ها | php

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آموزش DirectX-Graphic قسمت اول

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

Dim Dx as DirectX8

شي Direct3D8 براي کنترل اشيا‌‌ سه بعدي بکار مي رود :

Dim D3D as Direct3D8

شي Direct3DDevice8 ، سخت افزار مربوط به رندر تصاوير را مشخص مي کند :

Dim D3DDevice as Direct3DDevice8

حال براي شروع کار با Direct3D ، تابع ( ) initialise را تعريف مي کنيم . اگر اينکار درست انجام شود تابع ، مقدار true را برمي گرداند :

public function initialise () as boolean
Dim DispMode as D3DISPLAYMODE

شي D3DISPLAYMODE حالت نمايش را مشخص مي نمايد .

Dim D3Dwindow as D3DPRESENT_PARAMETERS

شي فوق مشخص مي کند که viewport شما چگونه باشد .
حال شي اصلي DirectX8 را مي سازيم :

Set Dx=New DirectX8

سپس شي اصلي ساخت واسط سه بعدي را مي سازيم :

()set D3D.Dx.Direct3Dcreate

سپس حالت فعلي نمايش را با دستور زير استخراج مي کنيم :

D3D.getadapterdisplaymode D3DADAPTER_DEFAULT,dispmode

حال دو حالت براي کار با DirectX داريم :
1 - windowed mode
2 - fullscrean mode
1 - براي کار با حالت پنجره اي ابتدا اين موضوع را به DirectX اطلاع مي دهيم :

D3Dwindow.windowed=1

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

D3Dwindow.swapeffect=D3DSWAPEFFECT_COPY_VSYNC

سپس بايستي فرمت بافر نگهدارنده تصاوير را مشخص کنيم :

D3Dwindow.backbufferformat=dispmode.format

2 - براي کار با حالت تمام صفحه ، ابتدا نوع refresh را مشخص کرده سپس تعداد بافر هاي تصوير و سرانجام نوع و سايز بافر را مشخص مي نمائيم :

D3Dwindow.swapeffect=D3DSWAPEFFECT_DISCARD
D3Dwindow.backbuffercount=1
D3Dwindow.backbufferformat=dispmode.format
D3Dwindow.backbufferheight=dispmode.height
D3Dwindow.backbufferwidth=dispmode.width

سپس پنجره نمايش مشخص مي گردد :

D3Dwindow.hdevicewindow=frmMain.hwnd

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

Set D3DDevice=D3Dcreatedevice(D3DADAPTER_DEFAULT
,D3DDEVTYPE_HAL,
frmMain.hwnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,
D3Dwindow)x,
end sub

درصورتي که کارت گرافيک شما امکانات رندر سخت افزاري تصاوير را ندارد از D3DDEVTYPE_REF بجاي D3DDEVTYPE_HAL استفاده کنيد .
حال بايستي روتين render را بنويسيم . البته در اين درس تصويري براي رندر نداريم و تنها چگونگي نوشتن اين روتين را بيان خواهم کرد :
۱ - ابتدا بايستي device مربوط به رندر ، قبل از کشيدن تصوير در آن پاک شود :

D3DDevice.clear 0,byval 0,D3DCLEAR_TARGET,&H0,1#,0

عدد hex اي که در دستور فوق آمده رنگ زمينه صفحه را مشخص مي کند
۲ - سپس بايستي تصاوير مورد نظر را رندر کنيم . اينکار توسط دستورات زير انجام مي شود :

D3DDevice.beginscence
all rendering calls go between these two lines '
D3DDEvice.endscence

3 - در پايان بايستي صفحه را update کنيد :

D3DDevice.present byval 0,byval 0,0,byval 0
لينک مقاله
http://sheidaian.persianblog.com :منبع

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آموزش DirectX-Graphic قسمت دوم
موضوع : بدست آوردن مشخصات و تواناييهاي گرافيکي يک سيستم توسط DirectX-Graphic

1 - شمارش تعداد آداپتورهاي گرافيکي يک سيستم : فرض کنيد متغير nAdapters متغيري از نوع long باشد . همچنين شي D3DADAPTER_IDENTIFIER8 يک ساختار است که اطلاعات مربوط به آداپتور را نگه مي دارد . در اينصورت روتين enumerateAdapters بصورت زير خواهد بود :

Dim adapterinfo as D3DADAPTER_IDENTIFIER8
Private Sub EnumerateAdapters
Dim i as integer
nadapters=D3D.Getadaptercount

براي بدست آوردن جزئيات آداپبورها بصورت زير عمل مي کنيم :

for i=0 to nadapters-1
D3D.GetadapterIdentifier i ,0,adapterinfo

نام اين آداپتور بصورت ليستي از کدهاي اسکي است که بايستي آنها را درون يک string قرار دهيم :

for j=0 to 511
name=name & chr$(adapterinfo.description(j)) x
next j
name=replace(name,chr$(0)," ") x
end sub

بنابراين در متغير name نام آداپتور قرار خواهد گرفت .

۲ - مشخص کردن نوع Rendering : فرض کنيد شي D3DCAPS8 توانايي rendering آداپتور را نشان دهد . در اينصورت روتين EnumerateDevices بصورت زير خواهد بود :

Private EnumerateDevices
On Local Error resume next
Dim Caps as D3DCAPS8
deviceindex=0 'For Example
D3D.Getdevicecaps deviceindex,D3DDEVTYPE_HAL,caps
if err.number=D3DERR_NOTAVAILABLE then

اگر آداپتور امکان رندر سخت افزاري نداشته باشد در اينصورت :

MsgBox("Reference Rasterizer(REF)") x
else
MsgBox("Hardware Acceleration(HAL)+Reference Rasterizer(REF)") x
end if
end sub

3 - شمارش تعداد Mode نمايشي آداپتور :
فرض کنيد در صورت REF بودن امکان رندر ، متغير r=2 و در غيراينصورت r=1
باشد . همچنين شي D3DDISPLAYMODE اطلاعات مدهاي نمايشي را در خود
دارد . همچنين فرض کنيد متغير nModes از نوع longباشد . در اينصورت روتين enumeratedispmodes بصورت زير خواهد بود :

Private Sub EnumerateDispModes(r as Long,n as Long) x
Dim i as integer
Dim mode_tmp as D3DDISPLAYMODE
deviceindex=0 'For Example
nModes=D3D.Getadaptermodecount(deviceindex) x
for i=0 to nModes-1
D3D.EnumAdapterModes(deviceindex,i,mode_tmp) x

ابتدا Mode ها را به دو گروه ۱۶ بيتي و ۳۲ بيتي تقسيم مي کنيم :

if mode_tmp.format=D3DFMT_R8G8B8 or mode_tmp=D3DFMT_X8R8G8B8 or mode_tmp=D3DFMT_A8R8G8B8 then

حال چک مي کنيم که device قابل پذيرش و معتبر است يا نه :

if D3D.checkdevicetype(deviceindex,r,mode_tmp.format,mode_tmp.format,Flase)>=0 then
MsgBox(mode_tmp.width & "X" & mode_tmp.height & "32 Bit
FMT:" & mode_tmp.format ) x & "
end if
else
if D3D.checkdevicetype(deviceindex,r,mode_tmp.format,mode_tmp.format,Flase)>=0 then
MsgBox(mode_tmp.width & "X" & mode_tmp.height & "16 Bit
FMT:" & mode_tmp.format ) x & "
end if
end if
next i

4 - مشخص کردن توانايي هاي آداپتور گرافيکي : فرض کنيد در صورت REF بودن امکان رندر ، متغير r=2 و در غيراينصورت r=1 باشد :

Private Sub EnumerateHardware(r as long) x
Dim caps as D3DCAPS8
D3D.Getdevicecaps deviceindex,r,caps
If Caps.MaxActiveLights = -1 Then
MsgBox "Maximum Active Lights: Unlimited" x
Else
MsgBox "Maximum Active Lights: " & Caps.MaxActiveLights
End If
MsgBox "Maximum Point Vertex size: " & Caps.MaxPointSize
MsgBox "Maximum Texture Size: " & Caps.MaxTextureWidth & "X" & Caps.MaxTextureHeight
MsgBox "Maximum Primatives in one call: " & Caps.MaxPrimitiveCount
If Caps.TextureCaps And D3DPTEXTURECAPS_SQUAREONLY Then
MsgBox "Textures must always be square" x
End If
If Caps.TextureCaps And D3DPTEXTURECAPS_CUBEMAP Then
MsgBox "Device Supports Cube Mapping" x
End If
If Caps.TextureCaps And D3DPTEXTURECAPS_VOLUMEMAP Then
MsgBox "Device Supports Volume Mapping" x
End If
If Caps.DevCaps And D3DDEVCAPS_PUREDEVICE Then
MsgBox "Device supports the Pure Device Option" x
End If
If Caps.DevCaps And D3DDEVCAPS_HWTRANSFORMANDLIGHT Then
MsgBox "Device supports hardware transform and lighting" x
End If
If Caps.DevCaps And D3DDEVCAPS_HWRASTERIZATION Then
MsgBox "Device can use Hardware Rasterization" x
End If
If Caps.Caps2 And D3DCAPS2_CANCALIBRATEGAMMA Then
MsgBox "Device can Calibrate Gamma" x
End If
If Caps.Caps2 And D3DCAPS2_CANRENDERWINDOWED Then
MsgBox "Device can Render in Windowed Mode" x
End If
If Caps.Caps2 And D3DCAPS2_FULLSCREENGAMMA Then
MsgBox "Device can calibrate gamma in fullscreen mode" x
End If
If Caps.RasterCaps And D3DPRASTERCAPS_FOGRANGE Then
MsgBox "Device supports range based fog calculations" x
End If
If Caps.RasterCaps And D3DPRASTERCAPS_ANISOTROPY Then
MsgBox "Device supports Anisotropic Filtering" x
End If
If Caps.RasterCaps And D3DPRASTERCAPS_ZBUFFERLESSHSR Then
MsgBox "Device does not require a Z-Buffer/Depth Buffer" x
End If

لينک مقاله
http://sheidaian.persianblog.com :منبع

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آموزش DirectX-Graphic قسمت سوم
موضوع : رسم اشکال دو بعدي

مروري بر object هاي DirectX8
1 - DirectX8 : اين شي ، شي مرکزي براي directX است و به شما امکان دسترسي به توابع و اشيا DirectX را مي دهد .
۲ - Direct3D8 : شي اصلي براي کار با محيط سه بعدي مي باشد . هدف از آن ، ساخت Direct3DDevice8 است و همچنين شامل توابعي براي مشخص کردن توانايي هاي کارت گرافيک است .
۳ - Direct3DDevice8 : اين شي مسئول ساخت بافتها textures ، مديريت نورها در يک صحنه ، مديريت مواد materials و همچنين render صحنه است . در واقع اين شي ، قلب نمايشي کار شماست .
4 - D3DX8 : گر چه هميشه نيازي به استفاده از اين شي نيست ، اما اين شي شامل توابعي براي ساخت برنامه هاي userfriendly تر توسط DirectX است . مثلاً ساخت اشيا سه بعدي ( مثل کره ، مکعب و ... ) ، ساخت بافتها ، ساخت سطوح و غيره
شروع کار براي رسم اشيا دوبعدي
ابتدا ثابت FVF را تعريف مي کنيم . اين ثابت توصيف " فرمت قابل انعطاف نقطه flexible-vertex-format " براي يک vertex دو بعدي انتقال يافته و ساده شده مي باشد .
سپس بايستي يک ساختار براي توصيف اين vertex معرفي کنيم :

Const FVF = D3DFVF_XYZRHW Or D3DFVF_TEX1 Or D3DFVF_DIFFUSE Or D3DFVF_SPECULAR
Private Type TLVERTEX
X As Single
Y As Single
Z As Single
rhw As Single
color As Long
specular As Long
tu As Single
tv As Single
End Type

فرض کنيد بخواهيم يک مربع را در صفحه رسم کنيم . براي رسم آن نياز به 4 عدد vertex داريم . بنابراين آرايه TriStrip را از نوع TLVERTEX تعريف ميکنيم :

Dim TriStrip (0 To 3) As TLVERTEX

حال به سراغ تابع initialize که در درس ۱ با آن آشنا شديد مي رويم و دستورات زير را به آن اضافه مي کنيم :

Private Function Initialize as boolean
.
.
.

ابتدا سيستم سايه زني vertex را طوري تنظيم مي کنيم که از FVF استفاده کند .

D3DDevice.SetVertexShader FVF

حال سيستم lighting را براي vertex هاي دو بعدي غير فعال مي کنيم زيرا نيازي به آن نداريم :

D3DDevice.SetRenderState D3DRS_LIGHTING,false

حال بايستي تابع initializeGeometry را اجرا کنيم . اين تابع را در ادامه توضيح خواهم داد . اگر نتيجه اين تابع true باشد دراينصورت initialize به درستي انجام شده است :

if initializeGeometry()=true then initialize=true
end function

تابع initializeGeometry در اين درس ، تابعي ساده است که تنها آرايه Vertex ها را مقدار دهي مي کند . براي رسم يک مربع نياز به مقداردهي ۴ vertex در جهت عقربه هاي ساعت داريم ( اين مربع شامل ۲ مثلث است )

Private Function InitialiseGeometry() As Boolean
On Error GoTo BOut:
color = RGB(200, 100, 0)
TriStrip(0) = CreateTLVertex(100, 100, 0, 1, color, 0, 0, 0)
TriStrip(1) = CreateTLVertex(300, 100, 0, 1, color, 0, 0, 0)
TriStrip(2) = CreateTLVertex(100, 300, 0, 1, color, 0, 0, 0)
TriStrip(3) = CreateTLVertex(300, 300, 0, 1, color, 0, 0, 0)
InitialiseGeometry = True
Exit Function
BOut:
InitialiseGeometry = False
End Function

همانطور که مشاهده مي کنيد براي تعريف vertex از تابع CreateTLVERTEX استفاده شده است . اين تابع صرفاً مقادير ساختار TLVERTEX را مقداردهي مي کند :

Private Function CreateTLVertex(X As Single, Y As Single, Z As Single, rhw As Single, color As Long, specular As Long, tu As Single, tv As Single) As TLVERTEX

نکته : ضمن اينکه شما مي توانيد مقادير اعشاري floating point را براي مختصاتهاي x و y و z بکار ببريد ، Direct3D مختصاتها را با گردکردن آنها تخمين مي زند و بنابراين ممکنست باعث ايجاد نتايج ناخواسته شود .

CreateTLVertex.X = X
CreateTLVertex.Y = Y
CreateTLVertex.Z = Z
CreateTLVertex.rhw = rhw
CreateTLVertex.color = color
CreateTLVertex.specular = specular
CreateTLVertex.tu = tu
CreateTLVertex.tv = tv
End Function
حال بايستي تابع Render را بنويسيم :
Public Sub Render()
D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET, 0, 1#, 0
D3DDevice.BeginScene
D3DDevice.DrawPrimitiveUP D3DPT_TRIANGLESTRIP, 2, TriStrip(0), Len(TriStrip(0))x
D3DDevice.EndScene
D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal 0
End Sub

ساختار اصلي براي اجراي توابع فوق بصورت زير است :

--Main part--
Initialize
Do While yourevent=true
Render
DoEvents
Loop
لينک مقاله
http://sheidaian.persianblog.com :منبع

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آموزشDirectX-Graphic قسمت چهارم
موضوع : آشنايي با برخي اصطلاحات

1- Mesh : مش ، مجموعه اي از face ها است که يک شي سه بعدي را روي صفحه تشکيل مي دهند .

۲ - Face : يک چند ضلعی است که توسط مجموعه ای از نقاط به نام vertex ساخته مي شود .

۳ - Vertex : يک نقطه در فضاي سه بعدي است که براي دادن موقعيت ، scale و زاويه يک face استفاده مي شود .

۴ - Direct3D از شيي بنام D3DVERTEX براي نمايش يک Vertex استفاده مي کند . براي ساخت face نيز از آرايه اي از vertex ها استفاده مي شود . آرايه هميشه بايستي قابل تقسيم به سه باشد زيرا اشکال از face هاي مثلثي ساخته مي شوند . هنگاميکه اين مثلثها کنار هم گذاشته شوند ، شي سه بعدي را مي سازند . Direct3D از بافري با نام Index Buffer استفاده مي کند که با direct3D مي گويد که با چه ترتيبي vertex ها را رسم نمايد . index ها بايستي هميشه در جهت عقربه هاي ساعت مشخص شوند .
لينک مقاله
http://sheidaian.persianblog.com :منبع

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آموزشDirectX-Graphic قسمت پنجم
موضوع : اختصاص بافت Texture به اشکال دو بعدي

در اين درس مي خواهيم يک مربع که داراي بافت مي باشد را رسم کنيم . براي اينکار از کتابخانه کمکي D3DX8 استفاده مي کنيم . همچنين شي Direct3DTexture8 را نيز استفاده مي نمائيم .

Dim D3DX as D3DX8
Dim Texture as Direct3DTexture8

حال بايستي در تابع Initialize بافت مربوطه را از روي يک فايل تصويري load کنيم :

Private Function Initialize as boolean
.
.
.
Set Texture=D3DX8.CreateTextureFromFile(D3DDevice,app.path & yourfilename) x
end function

تابع Render نيز بصورت زير خواهد بود :

Private Sub Render
D3DDevice.clear 0,byval 0,D3DCLEAR_TARGET,0,1#,0
D3DDevice.beginscence
D3DDevice.SetTexture 0,Texture
D3DDevice.DrawprimitiveUP D3DPT_TRIANGLESTRIP,2,Tripstrip(0),len(Tristrip(0))x
.
.
.
end function
لينک مقاله
http://sheidaian.persianblog.com :منبع

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آموزشDirectX-Graphic قسمت ششم
موضوع : مفاهيم اوليه رسم اشکال سه بعدي در DirectX 8

در اين درس با استفاده از Direct3D يک مکعب را رسم مي کنيم . براي اين منظور ابتدا نياز به يک بافر داريم که بتوانيم شکل مورد نظر خود را در آن ذخيره کنيم :

Dim VBuffer as Direct3DVertexBuffer8

براي رسم مکعب از vertex هاي سه بعدي استفاده مي کنيم . براي اينکار نياز به تعريف يک تايپ جديد داريم :

Private Type LITVERTEX
x as single
y as single
z as single
color as long
specular as long
tu as single
tv as single
end type

توصيف گر اين فرمت ، بصورت زير است :

Const Lit_FVF = (D3DFVF_XYZ Or D3DFVF_DIFFUSE Or D3DFVF_SPECULAR Or D3DFVF_TEX1)x

براي توصيف مکعب در اين درس از روشي غيرکارامد استفاده شده است . به اين ترتيب که از ۳۶ عدد vertex استفاده شده ( در درسهاي بعدي متدهايي معرفي خواهند شد که اجازه مي دهند از ۸ عدد vertex باري توصيف مکعب استفاده کنيد ) .

Dim cube(35) as LITVERTEX

سپس بايد يکسري ماتريس سه بعدي تعريف کنيم :
اولين ماتريس ، matworld است که نشان مي دهد چگونه vertex ها در فضاي سه بعدي قرار گرفته اند . دومين ماتريس ، matview است که نشان مي دهد دوربين ( نقطه ديد ) در کجا قرار گرفته و سومين ماتريس ، matproj است که نشان مي دهد دوربين چگونه دنياي سه بعدي را روي صفحه دو بعدي نشان مي دهد :

Dim matworld as D3DMATRIX
Dim matview as D3DMATRIX
Dim matproj as D3DMATRIX

در تابع Initialize قبل از ساخت device بايستي چک کنيم که آيا مي توانيم از يک بافر Z شانزده بيتي استفاده کنيم يا نه ؟

If D3D.CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, DispMode.Format, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D16) = D3D_OK Then
D3DWindow.AutoDepthStencilFormat = D3DFMT_D16 '16 bit Z-Buffer

حال بايستي متد D3DCreateDevice را اجرا کنيد . سپس بايد سيستم سايه زني vertex را با فرمت vertex مان تنظيم کنيم :

D3DDevice.SetVertexShader Lit_FVF

همچنين سيستم نورپردازي را غير فعال مي کنيم :

D3DDevice.SetRenderState D3DRS_LIGHTING, False

Direct3D هيچ مثلثي را که در ديد شما نباشد رسم نخواهد کرد . براي متوقف کردن اين امر بايستي حالت culling آنرا متوقف کنيد همچنين vertex ها را بترتيب عقربه هاي ساعت معرفي کنيد :

D3DDevice.SetRenderState D3DRS_CULLMODE, D3DCULL_NONE

سپس بايد فرمت بافر Z را فعال سازيد :

D3DDevice.SetRenderState D3DRS_ZENABLE, 1

لينک مقاله
http://sheidaian.persianblog.com :منبع

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آموزشDirectX-Graphic قسمت هفتم
تعريف ماترسها

1 - World Matrix : اين ماتريس براي نگهداري تمام vertex هايي که براي رندر فرستاده مي شوند بکار مي رود . مقادير موجود در اين ماتريس ، موقعيت يک vertex را مي تواند تغيير دهد . يکي از کاربردهاي آن انجام دورانrotation ، انتقال transmittion و تغییر اندازه scaling است .
برای ساخت اين ماتريس از دستور زير استفاده می کنيم :

D3DXMatrixIdentify matworld

حال اين ماتريس را براي device مربوطه تاييد مي کنيم :

D3DDevice.SetTransform D3DTS_WORLD,matworld

۲ - View Matrix : اين ماتريس را بعنوان يک دوربين در نظر بگيريد که بوسيله يک نقطه شروع و يک نقطه پاياني مشخص مي شود ( مشابه يک up vector که معمولاً در طول محور y رو به بالاست ) :

D3DXMatrixLookAtLH matView, MakeV(0, 5, 9), MakeV(0, 0, 0),MakeV(0, 1, 0) x
D3DDevice.SetTransform D3DTS_VIEW, matView

تابع MakeV که در اينجا استفاده شده بصورت زير است :

Private Function MakeV(x As Single, y As Single, z As Single) As D3DVECTOR
MakeV.x = x
MakeV.y = y
MakeV.z = z
End Function

۳ - Projection Matrix : اين ماتريس مشخص مي کند چه منطقه اي از فضاي جهاني براي رندر کردن visible باشد . همچنين مشخص مي کند چه مقدار مي توانيم بطور افقي ببينيم ( زاويه ديد بزرگتر منجر به ديد بزرگتر مي شود ) :

D3DXMatrixPerspectiveFovLH matProj, pi / 4, 1, 0.1, 500

در دستور فوق از زاويه ديد pi/4 راديان استفاده شده همچنين نسبت 1:1 استفاده شده است . قسمتهاي سوم و چهارم مشخص مي کنند فقط مثلثهايي کشيده شوند که با ابعاد بزرگتر از يکدهم دوربين و کوچکتر از ۵۰۰ برابر دوربين هستند .
حال دستور اختصاص به device را خواهيم داشت :

D3DDevice.SetTransform D3DTS_PROJECTION, matProj

بعد از تعريف ماتريسها بايستي تابع InitializeGeometry را صدا کنيم . در اين تابع از يک ثابت با نام DFC استفاده شده است . اگر DFC=1 باشد مکعب بطور کامل کشيده مي شود و اگر بزرگتر از يک باشد ، face هاي آن جدا از هم ديده خواهند شد . همچنين توجه کنيد که از بافرهاي vertex براي ذخيره داده vertex ها استفاده شده است . ساختار اين تابع بصورت زير خواهد بود :
۱ - پر کردن ساختارهاي vertex

'Front
Cube(0) = CreateLitVertex(-1, 1, DFC, color, 0, 0, 0)x
Cube(1) = CreateLitVertex(1, 1, DFC, color, 0, 0, 0)x
Cube(2) = CreateLitVertex(-1, -1, DFCcolor, 0, 0, 0)x
Cube(4) = CreateLitVertex(-1, -1, DFC, color, 0, 0, 0)x
Cube(5) = CreateLitVertex(1, -1, DFC, color, 0, 0, 0)x
'Back
Cube(6) = CreateLitVertex(-1, 1, -DFC, color, 0, 0, 0)x
Cube(7) = CreateLitVertex(1, 1, -DFC, color, 0, 0, 0)x
Cube(8) = CreateLitVertex(-1, -1, -DFC, color, 0, 0, 0)x
Cube(9) = CreateLitVertex(1, 1, -DFC, color, 0, 0, 0)x
Cube(10) = CreateLitVertex(-1, -1, -DFC, color, 0, 0, 0)x
Cube(11) = CreateLitVertex(1, -1, -DFC, color, 0, 0, 0)x
'Right
Cube(12) = CreateLitVertex(-DFC, 1, -1, color, 0, 0, 0)x
Cube(13) = CreateLitVertex(-DFC, 1, 1, color, 0, 0, 0)x
Cube(14) = CreateLitVertex(-DFC, -1, -1, color, 0, 0, 0)x
Cube(15) = CreateLitVertex(-DFC, 1, 1, color, 0, 0, 0)x
Cube(16) = CreateLitVertex(-DFC, -1, -1, color, 0, 0, 0)x
Cube(17) = CreateLitVertex(-DFC, -1, 1, color, 0, 0, 0)x
'Left
Cube(18) = CreateLitVertex(DFC, 1, -1, color, 0, 0, 0)x
Cube(20) = CreateLitVertex(DFC, -1, -1, color, 0, 0, 0)x
Cube(21) = CreateLitVertex(DFC, 1, 1, color, 0, 0, 0)x
Cube(22) = CreateLitVertex(DFC, -1, -1, color, 0, 0, 0)x
Cube(23) = CreateLitVertex(DFC, -1, 1, color, 0, 0, 0)x
'Top
Cube(24) = CreateLitVertex(-1, DFC, 1, color, 0, 0, 0)x
Cube(25) = CreateLitVertex(1, DFC, 1, color, 0, 0, 0)x
Cube(26) = CreateLitVertex(-1, DFC, -1, color, 0, 0, 0)x
Cube(27) = CreateLitVertex(1, DFC, 1, cocolor, 0, 0, 0)x
Cube(29) = CreateLitVertex(1, DFC, -1, color, 0, 0, 0)x
'Bottom
Cube(30) = CreateLitVertex(-1, -DFC, 1, color, 0, 0, 0)x
Cube(31) = CreateLitVertex(1, -DFC, 1, color, 0, 0, 0)x
Cube(32) = CreateLitVertex(-1, -DFC, -1, color, 0, 0, 0)x
Cube(33) = CreateLitVertex(1, -DFC, 1, color, 0, 0, 0)x
Cube(34) = CreateLitVertex(-1, -DFC, -1, color, 0, 0, 0)x
Cube(35) = CreateLitVertex(1, -DFC, -1, color, 0, 0, 0)x

2 - ساخت يک بافر vertex خالي با سايز مورد نظر :

Set VBuffer = D3DDevice.CreateVertexBuffer(Len(Cube(0)) * 36, 0, Lit_FVF, D3DPOOL_DEFAULT)x

3 - پر کردن بافر مربوطه با داده ها :

D3DVertexBuffer8SetData VBuffer, 0, Len(Cube(0)) * 36, 0, Cube(0)x

حال به سراغ روتين Render مي رويم :

Public Sub Render
D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, 0, 1#, 0 '//Clear the screen black
D3DDevice.BeginScene
D3DDevice.SetStreamSource 0, VBuffer, Len(Cube(0))x
D3DDevice.DrawPrimitive D3DPT_TRIANGLELIST, 0, 12
D3DDevice.EndScene
D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal 0
End Sub

ساختار اصلي برنامه بصورت زير خواهد بود :

Dim RotateAngle As Single
Dim matTemp As D3DMATRIX '//To hold temporary
call Initialize
Do While bRunning
RotateAngle = RotateAngle + 0.1
If RotateAngle >= 360 Then RotateAngle = RotateAngle - 360
D3DXMatrixIdentity matWorld '//Reset our world matrix
D3DXMatrixIdentity matTemp
D3DXMatrixRotationX matTemp, RotateAngle * (pi / 180) x
D3DXMatrixMultiply matWorld, matWorld, matTemp
D3DXMatrixIdentity matTemp
D3DXMatrixRotationZ matTemp, RotateAngle * (pi / 180) x
D3DXMatrixMultiply matWorld, matWorld, matTemp
D3DDevice.SetTransform D3DTS_WORLD, matWorld
Render
DoEvents
Loop
لينک مقاله
http://sheidaian.persianblog.com :منبع

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آموزشDirectX-Graphic قسمت هشتم
موضوع : نورپردازي و اختصاص بافت به اشيا سه بعدي
در اين درس مي خواهيم به مکعب درس قبل بافت اختصاص داده و نيز آنرا با يک منبع نور ، نورپردازي کنيم .
ابتدا تايپ vertex ها را بصورت زير تعريف مي کنيم :

Private Type UnlitVertex
X As Single
Y As Single
Z As Single
nx As Single
ny As Single
nz As Single
tu As Single
tv As Single
End Type

توصيفگر اين فرمت بصورت زير خواهد بود :

Const Unlit_FVF = (D3DFVF_XYZ Or D3DFVF_NORMAL Or D3DFVF_TEX1)

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

Dim Cube2(35) As UnlitVertex

دو ثابت pi و rad را نيز بصورت زير تعريف مي کنيم :

Const pi As Single = 3.141592
Const Rad = pi / 180

براي اختصاص بافت به مکعب ، از شي Direct3DTexture8 استفاده مي شود :

Dim CubeTexture As Direct3DTexture8

براي نورپردازي ، از شي D3DLIGHT8 استفاده مي شود :

Dim Lights As D3DLIGHT8

تغييرات مورد نياز در تابع Initialize
بعد از ساخت شي D3DDevice در اين تابع ، پارامترهاي آنرا بصورت زير تنظيم مي کنيم :

D3DDevice.SetVertexShader Unlit_FVF
D3DDevice.SetRenderState D3DRS_LIGHTING, 1
D3DDevice.SetRenderState D3DRS_ZENABLE, 1
D3DDevice.SetRenderState D3DRS_AMBIENT, &H202020

مقدار ambient يک کد هگزا RRGGBB است .
بعد از دستورات فوق ماتريسهاي matworld ، matview و matproj مطابق مطابل درس قبل تعريف مي شوند . پس از آن بايستي بافت مکعب را از درون فايل تصويري مورد نظرتان load کنيد :

Set CubeTexture = D3DX.CreateTextureFromFileEx(D3DDevice, yourfilename, 128, 128, D3DX_DEFAULT, 0, DispMode.Format, D3DPOOL_MANAGED, D3DX_FILTER_LINEAR, D3DX_FILTER_LINEAR, 0, ByVal 0, ByVal 0)x

حال بايستي تابع InitializeGeometry صدا زده شود و سپس تابع SetupLights فراخواني شوند . ابتدا به توضيح تابع InitializeGeometry مي پردازيم :

Private Function InitialiseGeometry() As Boolean

ابتدا يک بردار نرمال تعريف مي کنيم :

Dim vN As D3DVECTOR

سپس آرايه cube2 را با مقادير عددي پر مي کنيم . نرمالهاي تمام vertex ها را ابتدا با بردار
[0,0,0 ] تعريف مي کنيم . اين مقدا بعداً تغيير خواهد کرد :

Cube2(0) = CreateVertex(-1, -1, 1, 0, 0, 0, 0, 0)
Cube2(1) = CreateVertex(1, 1, 1, 0, 0, 0, 1, 1)
Cube2(2) = CreateVertex(-1, 1, 1, 0, 0, 0, 0, 1)
vN = GenerateTriangleNormals(Cube2(0), Cube2(1), Cube2(2))
Cube2(0).nx = vN.X: Cube2(0).ny = vN.Y: Cube2(0).nz = vN.Z
Cube2(1).nx = vN.X: Cube2(1).ny = vN.Y: Cube2(1).nz = vN.Z
Cube2(2).nx = vN.X: Cube2(2).ny = vN.Y: Cube2(2).nz = vN.Z

Cube2(3) = CreateVertex(1, 1, 1, 0, 0, 0, 1, 1)
Cube2(4) = CreateVertex(-1, -1, 1, 0, 0, 0, 0, 0)
Cube2(5) = CreateVertex(1, -1, 1, 0, 0, 0, 1, 0)
vN = GenerateTriangleNormals(Cube2(3), Cube2(4), Cube2(5))
Cube2(3).nx = vN.X: Cube2(3).ny = vN.Y: Cube2(3).nz = vN.Z
Cube2(4).nx = vN.X: Cube2(4).ny = vN.Y: Cube2(4).nz = vN.Z
Cube2(5).nx = vN.X: Cube2(5).ny = vN.Y: Cube2(5).nz = vN.Z

'Back
Cube2(6) = CreateVertex(-1, 1, -1, 0, 0, 0, 0, 1)
Cube2(7) = CreateVertex(1, 1, -1, 0, 0, 0, 1, 1)
Cube2(8) = CreateVertex(-1, -1, -1, 0, 0, 0, 0, 0)
vN = GenerateTriangleNormals(Cube2(6), Cube2(7), Cube2(8))
Cube2(6).nx = vN.X: Cube2(6).ny = vN.Y: Cube2(6).nz = vN.Z
Cube2(7).nx = vN.X: Cube2(7).ny = vN.Y: Cube2(7).nz = vN.Z
Cube2(8).nx = vN.X: Cube2(8).ny = vN.Y: Cube2(8).nz = vN.Z

Cube2(9) = CreateVertex(1, -1, -1, 0, 0, 0, 1, 0)
Cube2(10) = CreateVertex(-1, -1, -1, 0, 0, 0, 0, 0)
Cube2(11) = CreateVertex(1, 1, -1, 0, 0, 0, 1, 1)
vN = GenerateTriangleNormals(Cube2(9), Cube2(10), Cube2(11))
Cube2(9).nx = vN.X: Cube2(9).ny = vN.Y: Cube2(9).nz = vN.Z
Cube2(10).nx = vN.X: Cube2(10).ny = vN.Y: Cube2(10).nz = vN.Z
Cube2(11).nx = vN.X: Cube2(11).ny = vN.Y: Cube2(11).nz = vN.Z

'Right
Cube2(12) = CreateVertex(-1, -1, -1, 0, 0, 0, 0, 0)
Cube2(13) = CreateVertex(-1, 1, 1, 0, 0, 0, 1, 1)
Cube2(14) = CreateVertex(-1, 1, -1, 0, 0, 0, 1, 0)
vN = GenerateTriangleNormals(Cube2(12), Cube2(13), Cube2(14))
Cube2(12).nx = vN.X: Cube2(12).ny = vN.Y: Cube2(12).nz = vN.Z
Cube2(13).nx = vN.X: Cube2(13).ny = vN.Y: Cube2(13).nz = vN.Z
Cube2(14).nx = vN.X: Cube2(14).ny = vN.Y: Cube2(14).nz = vN.Z

Cube2(15) = CreateVertex(-1, 1, 1, 0, 0, 0, 1, 1)
Cube2(16) = CreateVertex(-1, -1, -1, 0, 0, 0, 0, 0)
Cube2(17) = CreateVertex(-1, -1, 1, 0, 0, 0, 0, 1)
vN = GenerateTriangleNormals(Cube2(15), Cube2(16), Cube2(17))
Cube2(15).nx = vN.X: Cube2(15).ny = vN.Y: Cube2(15).nz = vN.Z
Cube2(16).nx = vN.X: Cube2(16).ny = vN.Y: Cube2(16).nz = vN.Z
Cube2(17).nx = vN.X: Cube2(17).ny = vN.Y: Cube2(17).nz = vN.Z

'Left
Cube2(18) = CreateVertex(1, 1, -1, 0, 0, 0, 1, 0)
Cube2(19) = CreateVertex(1, 1, 1, 0, 0, 0, 1, 1)
Cube2(20) = CreateVertex(1, -1, -1, 0, 0, 0, 0, 0)
vN = GenerateTriangleNormals(Cube2(18), Cube2(19), Cube2(20))
Cube2(18).nx = vN.X: Cube2(18).ny = vN.Y: Cube2(18).nz = vN.Z
Cube2(19).nx = vN.X: Cube2(19).ny = vN.Y: Cube2(19).nz = vN.Z
Cube2(20).nx = vN.X: Cube2(20).ny = vN.Y: Cube2(20).nz = vN.Z

Cube2(21) = CreateVertex(1, -1, 1, 0, 0, 0, 0, 1)
Cube2(22) = CreateVertex(1, -1, -1, 0, 0, 0, 0, 0)
Cube2(23) = CreateVertex(1, 1, 1, 0, 0, 0, 1, 1)
vN = GenerateTriangleNormals(Cube2(21), Cube2(22), Cube2(23))
Cube2(21).nx = vN.X: Cube2(21).ny = vN.Y: Cube2(21).nz = vN.Z
Cube2(22).nx = vN.X: Cube2(22).ny = vN.Y: Cube2(22).nz = vN.Z
Cube2(23).nx = vN.X: Cube2(23).ny = vN.Y: Cube2(23).nz = vN.Z

'Top
Cube2(24) = CreateVertex(-1, 1, 1, 0, 0, 0, 0, 1)
Cube2(25) = CreateVertex(1, 1, 1, 0, 0, 0, 1, 1)
Cube2(26) = CreateVertex(-1, 1, -1, 0, 0, 0, 0, 0)
vN = GenerateTriangleNormals(Cube2(24), Cube2(25), Cube2(26))
Cube2(24).nx = vN.X: Cube2(24).ny = vN.Y: Cube2(24).nz = vN.Z
Cube2(25).nx = vN.X: Cube2(25).ny = vN.Y: Cube2(25).nz = vN.Z
Cube2(26).nx = vN.X: Cube2(26).ny = vN.Y: Cube2(26).nz = vN.Z

Cube2(27) = CreateVertex(1, 1, -1, 0, 0, 0, 1, 0)
Cube2(28) = CreateVertex(-1, 1, -1, 0, 0, 0, 0, 0)
Cube2(29) = CreateVertex(1, 1, 1, 0, 0, 0, 1, 1)
vN = GenerateTriangleNormals(Cube2(27), Cube2(28), Cube2(29))
Cube2(27).nx = vN.X: Cube2(27).ny = vN.Y: Cube2(27).nz = vN.Z
Cube2(28).nx = vN.X: Cube2(28).ny = vN.Y: Cube2(28).nz = vN.Z
Cube2(29).nx = vN.X: Cube2(29).ny = vN.Y: Cube2(29).nz = vN.Z

'Top
Cube2(30) = CreateVertex(-1, -1, -1, 0, 0, 0, 0, 0)
Cube2(31) = CreateVertex(1, -1, 1, 0, 0, 0, 1, 1)
Cube2(32) = CreateVertex(-1, -1, 1, 0, 0, 0, 0, 1)
vN = GenerateTriangleNormals(Cube2(30), Cube2(31), Cube2(32))
Cube2(30).nx = vN.X: Cube2(30).ny = vN.Y: Cube2(30).nz = vN.Z
Cube2(31).nx = vN.X: Cube2(31).ny = vN.Y: Cube2(31).nz = vN.Z
Cube2(32).nx = vN.X: Cube2(32).ny = vN.Y: Cube2(32).nz = vN.Z

Cube2(33) = CreateVertex(1, -1, 1, 0, 0, 0, 1, 1)
Cube2(34) = CreateVertex(-1, -1, -1, 0, 0, 0, 0, 0)
Cube2(35) = CreateVertex(1, -1, -1, 0, 0, 0, 1, 0)
vN = GenerateTriangleNormals(Cube2(33), Cube2(34), Cube2(35))
Cube2(33).nx = vN.X: Cube2(33).ny = vN.Y: Cube2(33).nz = vN.Z
Cube2(34).nx = vN.X: Cube2(34).ny = vN.Y: Cube2(34).nz = vN.Z
Cube2(35).nx = vN.X: Cube2(35).ny = vN.Y: Cube2(35).nz = vN.Z

سپس يک بافر vertex خالي با ساير موردنظر مي سازيم :

Set VBuffer = D3DDevice.CreateVertexBuffer(Len(Cube2(0)) * 36, 0, Unlit_FVF, D3DPOOL_DEFAULT)x

سپس اين بافر vertex ساخته شده را با داده هاي cube2 پر مي کنيم :

D3DVertexBuffer8SetData VBuffer, 0, Len(Cube2(0)) * 36, 0, Cube2(0)x

در دستورات فوق تابعي با نام GenerateTraingleNormals استفاده شده است . اين تابع دو بردار را از روي سه vertex داده شده با آن مي سازد و سپس ضرب برداري ايندو را حساب مي کند و سپس بردار حاصله را نرمال مي نمايد :

Private Function GenerateTriangleNormals(p0 As UnlitVertex, p1 As UnlitVertex, p2 As UnlitVertex) As D3DVECTOR
Dim v01 As D3DVECTOR 'Vector from points 0 to 1
Dim v02 As D3DVECTOR 'Vector from points 0 to 2
Dim vNorm As D3DVECTOR 'The final vector

'Create the vectors from points 0 to 1 and 0 to 2
D3DXVec3Subtract v01, MakeVector(p1.X, p1.Y, p1.Z), MakeVector(p0.X, p0.Y, p0.Z)
D3DXVec3Subtract v02, MakeVector(p2.X, p2.Y, p2.Z), MakeVector(p0.X, p0.Y, p0.Z)

'Get the cross product
D3DXVec3Cross vNorm, v01, v02

'Normalize this vector
D3DXVec3Normalize vNorm, vNorm

'Return the value
GenerateTriangleNormals.X = vNorm.X
GenerateTriangleNormals.Y = vNorm.Y
GenerateTriangleNormals.Z = vNorm.Z
End Function

حال به توضيح تابع SetupLights مي پردازيم . در اين تابع دو شي D3DMATERIAL8 و D3DCOLORVALUE استفاده شده است :

Private Function SetupLights() As Boolean
Dim Mtrl As D3DMATERIAL8, Col As D3DCOLORVALUE
Col.a = 1: Col.r = 1: Col.g = 1: Col.b = 1
Mtrl.Ambient = Col
Mtrl.diffuse = Col
D3DDevice.SetMaterial Mtrl

Lights.Type = D3DLIGHT_DIRECTIONAL
Lights.diffuse.r = 1
Lights.diffuse.g = 1
Lights.diffuse.b = 1
Lights.Direction = MakeVector(1, -1, 0)

D3DDevice.SetLight 0, Lights

SetupLights = True
End Function

تابع Render بصورت زير است :

Public Sub Render()
D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, 0, 1#, 0 '//Clear the screen black
D3DDevice.BeginScene
'Draw the cube
D3DDevice.SetTexture 0, CubeTexture
D3DDevice.SetStreamSource 0, VBuffer, Len(Cube2(0))
D3DDevice.DrawPrimitive D3DPT_TRIANGLELIST, 0, 12
D3DDevice.EndScene
D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal 0
End Sub

ساختار اصلي برنامه بصورت زير است :

Call Initialise
Do While bRunning
RotateAngle = RotateAngle + 0.1
If RotateAngle >= 360 Then RotateAngle = RotateAngle - 360

D3DXMatrixIdentity matWorld

D3DXMatrixIdentity matTemp
D3DXMatrixRotationX matTemp, RotateAngle * (pi / 180)
D3DXMatrixMultiply matWorld, matWorld, matTemp

D3DXMatrixIdentity matTemp
D3DXMatrixRotationY matTemp, RotateAngle * (pi / 180)
D3DXMatrixMultiply matWorld, matWorld, matTemp

D3DXMatrixIdentity matTemp
D3DXMatrixRotationZ matTemp, RotateAngle * (pi / 180)
D3DXMatrixMultiply matWorld, matWorld, matTemp

D3DDevice.SetTransform D3DTS_WORLD, matWorld

D3DDevice.LightEnable 0, 0 خاموش کردن light

D3DDevice.LightEnable 0, 1 روشن کردن light

Render
DoEvents
Loop

در متد D3DDevice.LightEnable پارامتر اول شماره منبع نور و پارمتر دوم enable بودن آنرا نشان مي دهد .
لينک مقاله
http://sheidaian.persianblog.com :منبع

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آموزش DirectX-Graphic قسمت نهم
موضوع :‌ترسيم متن دو بعدي در DirectX

در اين درس روش ترسيم متن با دو نوع فونت را نشان خواهم داد :
براي رسم يک متن با فونت تعريف شده در سيستم از شي D3DXFont استفاده مي کنيم :

Dim MainFont as D3DXFont
Dim MainFontDesc as IFont
Dim TextRect as RECT
Dim fnt as new stdFont

در حاليکه براي ايجاد يک متن با فونت custom ابتدا يک texture تعريف مي کنيم :

Dim fntTex as Direct3DTexture8

همچنين براي ترسيم هر کاراکتر يک آرايه vertex اي را از نوع TLVERTEX تعريف مي نمائيم :

Dim vertchar(3) as TLVERTEX

حال به سراغ تابع Initialize مي رويم . در اين تابع ابتدا دستورات مربوط به ايجاد اشيا D3D و D3Dx را قرا دهيد سپس دستورات مربوط به اختصاص آداپتور و نيز ايجاد شي D3DDevice را انجام مي دهيم . حال دستورات تنظيم shader و rendering را مي آوريم :

D3DDevice.SetVertexShader TL_FVF
D3DDevice.SetRenderState D3DRS_LIGHTING, False

سپس تنظيمات پارامترهاي transparency براي rendering را انجام مي دهيم :

D3DDevice.SetRenderState D3DRS_SRCBLEND, D3DBLEND_SRCALPHA
D3DDevice.SetRenderState D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA
D3DDevice.SetRenderState D3DRS_ALPHABLENDENABLE, True

حال بايستي textureرا طوري فيلتر کنيم که در زمان stretch شدن يا squash شدن بهتر بنظر برسد :

D3DDevice.SetTextureStageState 0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR
D3DDevice.SetTextureStageState 0, D3DTSS_MINFILTER, D3DTEXF_LINEAR

حال فيلتر Z را فعال مي کنيم :

D3DDevice.SetRenderState D3DRS_ZENABLE, 1

سپس ماتريسهاي world ، view و projection را تنظيم مي کنيم :

D3DXMatrixIdentity matWorld
D3DDevice.SetTransform D3DTS_WORLD, matWorld
D3DXMatrixLookAtLH matView, MakeVector(0, 9, -9), MakeVector(0, 0, 0), MakeVector(0, 1, 0)
D3DDevice.SetTransform D3DTS_VIEW, matView
D3DXMatrixPerspectiveFovLH matProj, pi / 4, 1, 0.1, 500
D3DDevice.SetTransform D3DTS_PROJECTION, matProj

حال به بخش تنظيم پارامترهاي فونت مي رسيم . در مورد فونت دو بعدي عادي :

fnt.Name = "Verdana"x
fnt.Size = 18
fnt.Bold = True
Set MainFontDesc = fnt
Set MainFont = D3DX.CreateFont(D3DDevice, MainFontDesc.hFont)x

و در مورد فونت custom :

Set fntTex = D3DX.CreateTextureFromFileEx(D3DDevice, yourfilename, 256, 128, D3DX_DEFAULT, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_FILTER_POINT, D3DX_FILTER_POINT, &HFF00FF00, ByVal 0, ByVal 0)x
end function

روتين Render بصورت زير خواهد بود :

Public Sub Render()x
D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, 0, 1#, 0
D3DDevice.BeginScene

براي رندر متن با فونت عادي بصورت زير عمل مي کنيم :

TextRect.Top = 440
TextRect.Left = 1
TextRect.bottom = 480
TextRect.Right = 640
D3DX.DrawText MainFont, &HFFCCCCFF, "Current Frame Rate: " & FPS_Current, TextRect, DT_TOP Or DT_CENTER

براي رندر متن با فونت custom بصورت زير عمل مي کنيم :

RenderStringFromCustomFont_2D "Hamed Sheidaian", 1, 1, 16, 16
D3DDevice.EndScene
D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal 0
End Sub

همانطور که مشاهده مي کنيد از روتيني با نام RenderStringFromCustomFont_2D استفاده شده است :

Private Sub RenderStringFromCustomFont_2D(strText As String, startX As Single, StartY As Single, Height As Integer, Width As Integer)x
Dim I As Integer
Dim CharX As Integer, CharY As Integer
Dim Char As String
Dim LinearEntry As Integer
If Len(strText) = 0 Then Exit Sub
For I = 1 To Len(strText)x

1 - ابتدا بايستي مختصات texture را انتخاب کنيم . براي اينکار بايستي هر entry را در texture جدا کنيم :

Char = Mid$(strText, I, 1)x
If Asc(Char) >= 65 And Asc(Char) <= 90 Then
LinearEntry = Asc(Char) - 65
ElseIf Asc(Char) >= 97 And Asc(Char) <= 122 Then
LinearEntry = Asc(Char) - 71
ElseIf Asc(Char) >= 48 And Asc(Char) <= 57 Then
LinearEntry = Asc(Char) + 4
ElseIf Char = " " Then
LinearEntry = 63
ElseIf Char = "." Then
LinearEntry = 62
ElseIf Char = ";" Then
LinearEntry = 66
ElseIf Char = "/" Then
LinearEntry = 64
ElseIf Char = "," Then
LinearEntry = 65
End If

بعد از مقداردهي LinearEntry بايستي مختصات grid کاراکتر را پردازش کنيم :

If LinearEntry <= 15 Then
CharY = 0
CharX = LinearEntry
End If
If LinearEntry >= 16 And LinearEntry <= 31 Then
CharY = 1
CharX = LinearEntry - 16
End If
If LinearEntry >= 32 And LinearEntry <= 47 Then
CharY = 2
CharX = LinearEntry - 32
End If
If LinearEntry >= 48 And LinearEntry <= 63 Then
CharY = 3
CharX = LinearEntry - 48
End If
If LinearEntry >= 64 And LinearEntry <= 79 Then
CharY = 4
CharX = LinearEntry - 64
End If

۲ - حال بايستي vertex هاي مورد نياز براي رسم کاراکتر را توليد کنيم :

vertChar(0) = CreateTLVertex(startX + (Width * I), StartY, 0, 1, &HFFFFF
(F,0,(1/16)*CharX,(1/8)*CharY
vertChar(1) = CreateTLVertex(startX + (Width * I) + Width, StartY, 0, 1, &HFFFFF
(F, 0,((1 / 16) * CharX) + (1 / 16), (1 / 8) * CharY
vertChar(2) = CreateTLVertex(startX + (Width * I), StartY + Height, 0, 1, &HFFFFF
((F, 0, (1 / 16) * CharX, ((1 / 8) * CharY) + (1 / 8
vertChar(3) = CreateTLVertex(startX + (Width * I) + Width, StartY + Height, 0, 1, HFFFFFF, 0, ((1 / 16) * CharX) + (1 / 16), ((1 / 8) * CharY) + (1 / 8))x

۳ - رندر vertex ها :

D3DDevice.SetTexture 0, fntTex
D3DDevice.DrawPrimitiveUP D3DPT_TRIANGLESTRIP, 2, vertChar(0), Len(vertChar(0))x
Next I
End Sub
لينک مقاله
http://sheidaian.persianblog.com :منبع

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آموزشDirectX-Graphic قسمت دهم
موضوع : ترسيم اشيا سه بعدي با استفاده از شي Mesh
شي Mesh که جزو اشيا D3DX مي باشد امکان ترسيم اشيا سه بعدي پايه و همچنين ترسيم مش هاي custom دلخواه را به شما مي دهد . در اين درس از شي Mesh براي ترسيم يک کره ( sphere ) استفاده مي کنيم . ابتدا متغير sphere را بصورت زير تعريف کنيد :

Dim sphere as D3DXMesh

همچنين براي نورپردازي و اختصاص material به کره به متغيرهاي زير نياز داريم :

Dim d3dLight As D3DLIGHT8
Dim material As D3DMATERIAL8
Dim Col As D3DCOLORVALUE

در تابع Initial پس از ساخت اشيا D3D و D3DX و D3DDevice بايستي پارامترهاي رنگ ، نورپردازي و اختصاص ماده ( material ) به کره را بصورت زير تنظيم کنيد :

Col.a = 1
Col.b = 1
Col.g = 1
Col.r = 1
d3dLight.Type = D3DLIGHT_DIRECTIONAL
d3dLight.diffuse = Col
d3dLight.Direction = vec(-1, -1, -1)x

نورپردازي از نوع جهت دار با رنگ col و بردار جهت (1-,1-,1-) است .
نکته :
رنگ ambient رنگي است که هنگاميکه جسم در سايه باشد به خود مي گيرد . بعبارت ديگر اين رنگ را جسم وقتي که در معرض يک نور ambient باشد از خود منعکس مي کند .
رنگ diffuse رنگي است که هنگاميکه جسم در معرض نور مستقيم قرار بگيرد از خود منعکس مي کند .

material.Ambient = Col
material.diffuse = Col
d3dDevice.SetMaterial material
d3dDevice.SetLight 0, d3dLight
d3dDevice.LightEnable 0, 1

سپس بايستي پارامترهاي rendering را تنظيم کنيد :

d3dDevice.SetRenderState D3DRS_LIGHTING, 1
d3dDevice.SetRenderState D3DRS_ZENABLE, 1
d3dDevice.SetRenderState D3DRS_LIGHTING, 1
d3dDevice.SetRenderState D3DRS_ZENABLE, 1
d3dDevice.SetRenderState D3DRS_SHADEMODE, D3DSHADE_GOURAUD
d3dDevice.SetRenderState D3DRS_AMBIENT, &H202020
d3dDevice.SetTextureStageState 0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR
d3dDevice.SetTextureStageState 0, D3DTSS_MINFILTER, D3DTEXF_LINEAR

حال بايستي شي sphere را بسازيم :

Set Sphere = d3dx.CreateSphere(d3dDevice, 2, 1000, 20, Nothing)x

که ۲ شعاع کره و ۱۰۰۰ تعداد slice هايي است که کره با آن ساخته مي شود .
سپس بردارهاي نقطه ديد و مکان دوربين و رنگ زمينه را تنظيم کنيد ( viewpoint و camerapoint از نوع D3DVECTOR هستند ) .

ViewPoint = vec(0, 0, 0)
CameraPoint = vec(4, 4, 4)
BackColor = &H404040

در روتين Render ابتدا ماتريسها و بردارهاي صحنه را تنظيم مي کنيم :

D3DXMatrixIdentity matWorld
d3dDevice.SetTransform D3DTS_WORLD, matWorld
D3DXMatrixRotationY matView, Rotation
D3DXMatrixLookAtLH matTemp, CameraPoint, ViewPoint, vec(0, 1, 0)
D3DXMatrixMultiply matView, matView, matTemp
d3dDevice.SetTransform D3DTS_VIEW, matView
D3DXMatrixPerspectiveFovLH matProj, pi / 4, 1, 0.1, 500
d3dDevice.SetTransform D3DTS_PROJECTION, matProj

در پايان نيز شروع به رندر صحنه مي کنيم :

d3dDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, BackColor, 1, 0
d3dDevice.BeginScene
Sphere.DrawSubset 0
d3dDevice.EndScene
d3dDevice.Present ByVal 0, ByVal 0, 0, ByVal 0
لينک مقاله
http://sheidaian.persianblog.com :منبع

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


کنترل 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
لينک مقاله
http://sheidaian.persianblog.com :منبع

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آشنايي با 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
لينک مقاله
http://sheidaian.persianblog.com :منبع

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


کنترل 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 را نيز شروع کرده ام ؟ علت اش اينست که تصميم دارم پس از پايان يافتن اين دو مبحث ، روش ساخت يک بازي دوبعدي چند نفره تحت شبکه را برايتان آموزش دهم .
لينک مقاله
http://sheidaian.persianblog.com :منبع

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


کنترل 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
لينک مقاله
http://sheidaian.persianblog.com :منبع

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


مباحث پيشرفته Direct3D - مقدمه
موضوع : مروري بر مباحث قبلي - ساخت يک موتور گرافيکي سه بعدي

قبل از شروع مباحث جديد برنامه نويسي Direct3D ، با هم مروري بر مباحث قبلي خواهيم داشت . ( مباحث قبلي در آرشيو موجود مي باشند ) .
در اين درس با استفاده از مطالب قبلي يک Engine سه بعدي ساخته و از امکانات آن در يک برنامه نمونه استفاده خواهيم کرد .
اين engine داراي دو کلاس است :
1 – کلاس MainD3D
2 – کلاس D3Dobject
در کلاس MainD3D متغيرها و توابع لازم براي ساخت يک device سه بعدي ، تنظيمات ماتريسي ، تابع رندر و غيره موجود مي باشد .
متغيرهاي عمومي اين کلاس عبارتند از :
Public g_DX As New DirectX8
Public g_D3D As Direct3D8
Public g_D3DX As New D3DX8
Public g_D3DDevice As Direct3DDevice8
Public NTextures As Long
روتين ها و توابع اين کلاس عبارتند از :
1 - InitD3D : اين روتين ، اشيا D3D و D3Ddevice را مي سازد و پارامترهاي آنها را تنظيم مي کند .
2 – ApplyCameraChanges : روتين ايجاد ماتريس View
3 – SetupMatrices : روتين ايجاد ماتريس Projection
4 – StartRender : در اين روتين عمليات لازم براي شروع عمل رندر صورت مي گيرد .
5 – RenderObject : اين تابع ، يک شي سه بعدي از نوع کلاس D3Dobject را مي گيرد و بردارهاي مورد نياز و نيز بافت شي را تنظيم مي کند و در پايان شي را ترسيم مي کند .
6 – FinishRender : در اين روتين به عمليات رندر پايان داده مي شود .
7 – Cleanup: روتين از بين بردن اشيا Direct3D
8 – CreateVector : تابع ساخت يک بردار سه بعدي
9 – CreateTextures : روتين ساخت يک بافت جديد
10 – InitTexture: تابع مقداردهي به يک بافت
در کلاس D3Dobject متغيرها و توابع لازم براي ايجاد يک شي سه بعدي و اختصاص بافت به آن موجود مي باشد .
در اين کلاس دو type عمومي تعريف شده است :
1 - NormalVERTEX
2 - TeturedVERTEX
همچنين روتين ها و توابع اين کلاس عبارتند از :
1 – InitObject : تابعي که تنظيمات اوليه vertex ها و بافت شي را انجام مي دهد .
2 – Vertex : روتين ايجاد vertex هاي مورد نياز
3 – GetRenderingMode: تابعي که مد رندر را مشخص مي کند .
و نيز يکسري تابع ساخت vertex نرمال و ساخت vertex داراي بافت و غيره

اين دو کلاس در يک پروژه ويژوال بيسيک قرارداده شده و پروژه با نام D3Dengine.dll کامپايل شده است .
حال با استفاده از اين engine مي خواهيم يک منظره سه بعدي را ايجاد کنيم :
اين منظره شامل سه object است : ديوار ، آسمان و زمين.

ابتدا بايد يک شي از کلاس MainD3D تعريف کنيم :

Dim D3D8Main As MainD3D8

در متد Form Load نيز سه شي Floor ، Sky و Wall را بصورت زير تعريف مي کنيم :

Dim Floor As D3DObject
Dim Sky As D3DObject
Dim Walls As D3Dobject

سپس اين سه شي را به اضافه شي D3D8Main ، ايجاد مي کنيم :

Set D3D8Main = New D3DEngine.MainD3D8
Set Floor = New D3DEngine.D3DObject
Set Sky = New D3DEngine.D3DObject
Set Walls = New D3DEngine.D3Dobject

در ابتدا شي MainD3D را Initial مي کنيم و سپس بافتهاي مورد نيز خود را مي سازيم :

D3D8Main.InitD3D True, Me.hWnd
D3D8Main.CreateTextures 3
D3D8Main.InitTexture 1, App.Path + "\floor.jpg"
D3D8Main.InitTexture 2, App.Path + "\sky.bmp"
D3D8Main.InitTexture 3, App.Path + "\wall.bmp"

حال به سراغ ايجاد و مقداردهي vertex هاي floor مي رويم . floor شامل شش vertex مي باشد و بنابراين دو face مثلثي دارد :

Floor.InitObject 6, 2, TriangleList, True, 1

Floor.Vertex 0, -55, -2, -55, vbWhite, 0, 10
Floor.Vertex 1, 55, -2, -55, vbWhite, 10, 10
Floor.Vertex 2, 55, -2, 55, vbWhite, 10, 0
Floor.Vertex 3, -55, -2, -55, vbWhite, 0, 10
Floor.Vertex 4, 55, -2, 55, vbWhite, 10, 0
Floor.Vertex 5, -55, -2, 55, vbWhite, 0, 0

سپس به سراغ ايجاد و مقداردهي vertex هاي wall مي رويم . wall شامل بيست و چهار vertex مي باشد و بنابراين هشت face مثلثي دارد :

Walls.InitObject 24, 8, TriangleList, True, 3

Walls.Vertex 0, -55, -2, -55, &HBCE8FC, 0, 1
Walls.Vertex 1, 55, -2, -55, &HBCE8FC, 5, 1
Walls.Vertex 2, 55, 8, -55, &HBCE8FC, 5, 0
Walls.Vertex 3, -55, -2, -55, &HBCE8FC, 0, 1
Walls.Vertex 4, 55, 8, -55, &HBCE8FC, 5, 0
Walls.Vertex 5, -55, 8, -55, &HBCE8FC, 0, 0

Walls.Vertex 6, -55, -2, 55, &HBCE8FC, 0, 1
Walls.Vertex 7, 55, -2, 55, &HBCE8FC, 5, 1
Walls.Vertex 8, 55, 8, 55, &HBCE8FC, 5, 0
Walls.Vertex 9, -55, -2, 55, &HBCE8FC, 0, 1
Walls.Vertex 10, 55, 8, 55, &HBCE8FC, 5, 0
Walls.Vertex 11, -55, 8, 55, &HBCE8FC, 0, 0

Walls.Vertex 12, -55, -2, 55, &HBCE8FC, 0, 1
Walls.Vertex 13, -55, -2, -55, &HBCE8FC, 5, 1
Walls.Vertex 14, -55, 8, -55, &HBCE8FC, 5, 0
Walls.Vertex 15, -55, -2, 55, &HBCE8FC, 0, 1
Walls.Vertex 16, -55, 8, -55, &HBCE8FC, 5, 0
Walls.Vertex 17, -55, 8, 55, &HBCE8FC, 0, 0

Walls.Vertex 18, 55, -2, 55, &HBCE8FC, 0, 1
Walls.Vertex 19, 55, -2, -55, &HBCE8FC, 5, 1
Walls.Vertex 20, 55, 8, -55, &HBCE8FC, 5, 0
Walls.Vertex 21, 55, -2, 55, &HBCE8FC, 0, 1
Walls.Vertex 22, 55, 8, -55, &HBCE8FC, 5, 0
Walls.Vertex 23, 55, 8, 55, &HBCE8FC, 0, 0

حال به سراغ ايجاد و مقداردهي vertex هاي sky مي رويم . sky شامل شش vertex مي باشد و بنابراين دو face مثلثي دارد :

Sky.InitObject 6, 2, TriangleList, True, 2

Sky.Vertex 0, -55, 8, -55, &HBCE8FC, 0, 1
Sky.Vertex 1, 55, 8, -55, &HBCE8FC, 0, 1
Sky.Vertex 2, 55, 8, 55, &HBCE8FC, 0, 1
Sky.Vertex 3, -55, 8, -55, &HBCE8FC, 0, 1
Sky.Vertex 4, 55, 8, 55, &HBCE8FC, 0, 1
Sky.Vertex 5, -55, 8, 55, &HBCE8FC, 0, 1

در پايان تابع رندر را صدا مي کنيم . البته در هر بار عمل رندر کردن ، دوربين يک درجه در صفحه X-Z دوران مي کند تا کل ديوار قابل مشاهده باشد :

Dim Angle As Double
PI = 3.1415
Angle = 0
Do
DoEvents
D3D8Main.StartRender vbBlack
D3D8Main.RenderObject Sky
D3D8Main.RenderObject Floor
D3D8Main.RenderObject Walls
D3D8Main.FinishRender
If Sqr(Angle ^ 2) = 360 Then Angle = 0
Angle = Angle + 1
D3D8Main.CamLookAtX = Sin((Angle * 2 * PI) / 360)
D3D8Main.CamLookAtZ = Cos((Angle * 2 * PI) / 360)
D3D8Main.ApplyCameraChanges
Loop
لينک مقاله
http://sheidaian.persianblog.com :منبع

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


API هاي ويندوز
امروز قصد دارم در مورد API هاي ويندوز و چگونگي استفاده از آنها در ويژوال بيسيک بطور خلاصه توضيح دهم و همچنين دو مثال پراستفاده را نيز در اين زمينه بيان کنم که عبارتند از چگونگي پخش فايلهاي Wav و ساخت يک تايمر با دقت بالا :

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

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

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

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

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

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

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

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

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

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

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

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

همچنين از تابع GetTickCount مي توان براي benchmark برنامه ها استفاده کرد . بعبارت ديگر مي توان زمان اجراي يکسري دستورات خاص را بدست آورد .
لينک مقاله
http://sheidaian.persianblog.com :منبع

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


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

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

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


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

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

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


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

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


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

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


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

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


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

برای ايجاد درختهای جستجوی باينری در ويژوال بيسيک نياز به ايجاد دو کلاس داريم :
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
لينک مقاله
http://sheidaian.persianblog.com :منبع

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 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 مي باشد .
لينک مقاله
http://sheidaian.persianblog.com :منبع

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


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

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

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


ايجاد کلاسی برای کار با فايلهای 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 را ذخيره کنيد .
لينک مقاله
http://sheidaian.persianblog.com :منبع

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


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 زير را در نظر بگيريد :

<%
MyTempVar=Request.Form(“username”)x
Response.Write(“You Entered : “ & MyTempVar)x
%>

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

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 ابتدا بايستی يک شی از آن کلاس ايجاد کنيم :

<%
Set ObjRefrence = Server.CreateObject(“ProjectName.ClassName”)x
%>

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

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

+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=yourpassowrd;Persist Security Info=True;User ID=yourusername; Initial Catalog=yourDatabaseName;Data Source=yourServerName”

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

ConnString=”Provider=MSDASQL.1;Password=yourpassowrd;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,password)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

+ برای اطلاعات بيشتر در اين زمينه به اين صفحه مراجعه کنيد .

+ بزودی به همه سوالات دوستان عزيز در همين وبلاگ پاسخ می دم ( البته اگر جواب اونا رو بدونم و گرنه که شرمنده دوستان عزيز خواهم شد ) .

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

با تشکر از وبلاگ مهندس حامد شيداييان
لينک مقاله
http://sheidaian.persianblog.com :منبع

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


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

تابع 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

مثال :

StrConv("hello my friend",3)="Hello My Freind"
لينک مقاله
http://sheidaian.persianblog.com :منبع

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


توابع رياضی و ويژوال بيسيک

مقدمه

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

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

- تابع 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 ( تابع توان )
لينک مقاله
http://sheidaian.persianblog.com :منبع

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آشنايي با شی پرينتر در ويژوال بيسيک ۶
مقدمه

شی پرينتر ، شیي است که پرينتر پيش فرض سيستم را کنترل می کند . استفاده از شی پرينتر در ويژوال بيسيک 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 را تعيين می کند

لينک مقاله
http://sheidaian.persianblog.com :منبع

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


معرفی اوليه VB.NET

يک برنامه کامپيوتری ، از مجموعه ای دستورالعمل که نوع و نحوه انجام يک فعاليت را برای کامپيوتر مشخص می نمايند ، تشکيل می گردد. دستورالعمل های نوشته شده بعنوان نمونه ممکن است به کامپيوتر اعلام نمايند که تعدادی از اعداد را با يکديگر جمع و يا دو عدد را بايکديگر مقايسه و بر اساس نتيجه بدست آمده ، اتخاذ تصميم نمايد. دستورالعمل های نوشته شده ، صرفا" برای کامپيوتر قابل فهم و اجراء خواهند بود.کامپيوتر دستورالعمل های نوشته شده را اجراء و ماحصل آن رسيدن به اهدافی خواهد بود که بر اساس آن برنامه طراحی و پياده سازی شده است . دستورالعمل ها ، می بايست با استفاده از يکی از زبانها ی برنامه نويسی نوشته شده ( کد ينگ ) و در ادامه در اختيار کامپيوتر قرار داده شوند. زبانهای برنامه نويسی متعددی نظير : فرترن ، بيسيک ، کوبال ، پاسکال، ،C ، جاوا ، ويژوال بيسيک و ... وجود دارد.
برنامه نويسی کامپيوتر ، مشابه آموزش گره زدن کفش به کودکان است . برای نيل به هدف فوق ، می بايست تمامی مراحل لازم بصورت شفاف به کودکان آموزش داده شود . کودکان با دنبال نمودن دستورالعمل های ارائه شده ، قادر به گره زدن کفش خود خواهند بود ( روش انجام اين کار برای آنان مشخص شده و بر اساس آن ، امکان نيل به هدف مورد نظر توسط کودکان فراهم می گردد ) . VB.NET ، زبانی است که می توا ن نحوه نيل به يک خواسته را بکمک آن بصورت شفاف ( نظير آموزش گره زدن کفش به کودکان ) مشخص و کامپيوتر با دنبال نمودن مراحل مشخص شده ، خواسته مورد نظر را محقق نمايد. با استفاده از VB.NET ، می توان محصولاتی راايجاد که زمينه استفاده از آنان در محيط ويندوز و اينترنت ، وجود خواهد داشت . فراموش نکنيم در زمان فراگيری يک تکنولوژی در ابتدا می بايست شيوه راه رفتن را بياموزيم و در ادامه اقدام به دويدن نمود .
VB.NET يکی از زبان های حمايت شده در دات نت می باشد . با استفاده از زبان فوق علاوه بر اينکه می توان برنامه های مبتنی بر ويندوز را پياده سازی نمود ، امکان استفاده از آن بعنوان زبان مورد نظر در زمان ايجاد برنامه های مبتنی بر وب که از تکنولوژی ASP.NET استفاده می نمايند ، نيز وجود خواهد داشت . با توجه به اهميت و جايگاه خاص اين زبان در دات نت ، مجموعه مقالاتی در رابطه با آموزش اصولی اين زبان آماده شده که بتدريج بر روی سايت قرار خواهند گرفت . در اولين مقاله از اين مجموعه به معرفی اوليه VB.NET خواهيم پرداخت . در ابتدا لازم است با ويژگی های منحصر بفرد برنامه های مبتنی بر ويندوز در قياس با برنامه های مبتنی بر DOS ، آشنا شده و پس از مروری مختصر به روند شکل گيری نسخه های متعدد ويژوال بيسيک ، با نحوه نصب آن نيز آشنا شويم .

برنامه نويسی مبتنی بر DOS در مقابل ويندوز
برنامه نويسی مبتنی بر ويندوز دارای تفاوت های عمده ای نسبت به برنامه نويسی سنتی در محيط DOS است.برنامه های DOS ، مسيری دقيق و مشخص را ازابتدا تا پايان دنبال می نمايند . رويکرد فوق ، باعث بروز محدوديت هائی در رابطه با عملکرد برنامه ها از يکطرف و تحميل محدوديت هائی به کاربران در طی نمودن مسير مشخص شده ، می گردد. از زاويه ای خاص می توان عملکرد يک برنامه مبتنی بر DOS را مشابه قدم زدن در يک راهرو ( سالن )، در نظر گرفت . بمنظور رسيدن به نقطه انتهائی سالن ، می بايست طول سالن طی تا به انتهای آن رسيد . در اين راستا از موانع متعدد موجود در مسير ، می بايست عبور تا سرانجام به مقصد مورد نظر رسيد . در زمان پيمودن مسير ، صرفا" امکان بازنمودن درب های خاصی ، وجود خواهد داشت . ويندوز ، دنيای جديدی از برنامه نويسی مبتنی بر "رويداد" را ايجاد نموده است . کليک نمودن موس ، تغيير اندازه پنجره ، تغيير محتويات يک Textbox ، نمونه هائی از يک "رويداد" می باشند. کدهای نوشته شده ، نحوه برخورد با يک رويداد را مشخص می نمايد. برای رسيدن به انتهای يک سالن کافی است بر روی "انتهای سالن " ، کليک نمود و ديگر ضرورتی به پيمودن تمامی مسير تا رسيدن به انتهای سالن نخواهد بود . درصورتيکه به انتهای سالن رسيده باشيم و متوجه گرديم که اين مکان ، محلی نيست که انتظار آن را داشته ايم ، بسادگی می توان مقصد جديدی را برای خود انتخاب ، بدون اينکه ضرورتی به برگشت در نقطه آغازين مسير وجود داشته باشد. برنامه نوشته شده عکس العمل های لازم در ارتباط با حرکت شما را بهمراه عمليات مربوطه بمنظور تکميل فعاليت ها ی مورد نظر انجام خواهد داد . با استفاده از VB.NET ، می توان کدهای لازم بمنظور ارائه عکس العمل لازم در زمان تحقق يک رويداد را نوشت .در اين راستا ، برنامه نويسان می توانند کدهای لازم در رابطه با رويدادهائی که امکان تحقق آنها وجود دارد را نوشته تا در زمان بروز رويداد مورد نظر ، عکس العمل لازم از طرف برنامه صورت پذيرد.در اين زمينه می توان از نوشتن کدهای ديگر بمنظور برخورد با رويدادهای غيرضروری ، صرفنظر کرد. مثلا" ويندوز قادر به تشخيص رويداد"کليک " از "کليک مضاعف " است . اين بدان معنی است که اگر می خواهيد برنامه مورد نظر شما ،عکس العمل لازم در ارتباط با رويداد "کليک" را داشته باشد ، می بايست صرفا" کد مربوط به رويداد " کليک"، نوشته گردد و الزامی به نوشتن کدهای لازم بمنظور برخورد با رويداد "کليک مضاعف" ، وجود نخواهد داشت . در دنيای برنامه نويسی DOS ، کاربر عکس العمل لازم را نسبت به برنامه انجام می دهد در صورتيکه در ويندوز ، برنامه ها عکس العمل لازم را با توجه به رفتار کاربران ، انجام خواهند داد .
يکی ديگر از مزايای مهم برنامه های ويندوز ، عدم وابستگی برنامه ها به يک سخت افزار خاص است . ويندوز تمهيدات لازم در خصوص ارتباط با سخت افزار را پيش بينی و برنامه نويسان نياز به آگاهی از نحوه عملکرد يک دستگاه سخت افزاری خاص بمنظور استفاده از آن ، نخواهند داشت . مثلا" برنامه نويسان ضرورتی به آگاهی از نحوه عملکرد هر نوع چاپگر ليزری، بمنظور ايجاد خروجی مورد نظر خود در برنامه ها ، نخواهند داشت. ويندوز، امکانات لازم در اين خصوص را از طريق ارائه روتين های عمومی که با درايورهای مورد نظر مرتبط می گردند ، فراهم می نمايد. شايد همين موضوع دليل موفقيت ويندوز باشد .
روتين های عمومی اصطلاحا" Windows (API ) Application Programming Interface ناميده می شوند .

تاريخچه ويژوال بيسيک
قبل از معرفی ويژوال بيسيک در سال 1991 ، پياده کنندگان نرم افزار مجبور به تسلط و مهارت در زمينه استفاده از ++C بهمراه موارد پيچيده ای در اين خصوص بودند . بدين ترتيب ، صرفا" افراد خاص آموزش ديده، قادر به خلق نرم افزارهای قدرتمند بمنظور اجراء در محيط ويندوز بودند. ويژوال بيسيک ، محدوديت فوق را تغيير و می توان اين ادعا را داشت که امروزه خطوط زيادی از برنامه های نوشته شده با استفاده از ويژوال بيسيک کد شده است . ويژوال بيسيک ، ظاهر برنامه نويسی تحت ويندوز را با حذف عمليات اضافی برای نوشتن کدهای لازم جهت طراحی بخش رابط کاربر (UI) ، تغيير داده است . در اين راستا ، زمانيکه بخش رابط کاربر ، ترسيم می گردد ، برنامه نويس می تواند کدهای لازم بمنظور انجام عکس العمل مناسب در رابطه با رويداد ها را به آن اضافه نمايد . زمانيکه ماکروسافت نسخه شماره سه ويژوال بيسيک را ارائه نمود ، مجددا" دنيای برنامه نويسی با تغيير مهمی مواجه گرديد. در اين راستا امکانات مناسبی برای نوشتن برنامه های مبتنی بر بانک های اطلاعاتی ، در اختيار برنامه نويسان قرار گرفت. ماکروسافت بدين منظور محصول جديدی با نام DAO)Data Access Objects) را ارائه نمود . برنامه نويسان با استفاده از DAO ، امکان انجام عمليات متفاوت در رابطه با داده ها را ، بدست آوردند . نسخه های شماره چهار و پنج ، قابليت های نسخه سه را افزايش و اين امکان را برای پياده کنندگان نرم افزار فراهم نمود تا برنامه های خود را جهت اجراء در محيط ويندوز 95 ، طراحی و پياده سازی نمايند . در اين زمينه ، برنامه نويسان قادر به نوشتن کدهائی گرديدند که امکان استفاده از آنان توسط ساير پياده کنندگان نرم افزار که از زبانی ديگر استفاده می کردند، فراهم گرديد. نسخه شماره شش ويژوال بيسيک ، روش جديدی بمنظور دستيابی به بانک های اطلاعاتی را ارائه نمود: ADO)ActiveX Data Objects ) . يکی از اهداف اوليه طراحی ADO ، امکان دستيابی به بانک های اطلاعاتی برای پياده کنندگان برنامه های مبتنی بر وب است که از تکنولوژی ASP ، استفاده می نمايند.
همزمان با ارائه جديدترين نسخه ويژوال بيسيک که VB.NET ناميده می شود ، بسياری از محدوديت های مرتبط با ويژوال بيسيک برطرف گرديد . در گذشته ويژوال بيسيک با انتفادات فراوان مواجه ( عدم وجود امکانات مناسب در مقايسه با جاوا و يا ++C ) و بسياری آن را نظير يک اسباب بازی در دنيای وسيع زبان های برنامه نويسی می پنداشتند. VB.NET با غلبه بر مشکلات نسخه های پيشين ، توانسته است در مدت زمان کوتاهی ، بعنوان يک ابزار پياده سازی بسيار قدرتمند مطرح و گزينه ای مناسب برای برنامه نويسان در تمامی سطوح باشد .

نصب VB.NET
برای نصب VB.NET ، از دو رويکرد متفاوت می توان استفاده کرد :

· نصب بهمراه ويژوال استوديو دات نت

· نصب نسخه استاندارد

هر يک از گزينه های فوق ، امکان ايجاد برنامه های مبتنی بر ويندوز را فراهم می نمايند . مراحلی که در ادامه ذکر می گردد ، نحوه نصب ويژوال استوديو را تشريح می نمايد .

· مرحله اول : برنامه Setup.exe را از روی CD مربوطه فعال نمائيد.

· مرحله دوم : جعبه محاوره ای ، مراحل و اولويت های عمليات نصب را نشان خواهد داد. بمنظور صحت عملکرد VB.NET ، چندين Component نصب و يا بهنگام خواهند شد . اولين مرحله نصب، بهنگام سازی عناصر (Components) است . بر روی گزينه Windows Component Update ، کليک نمائيد.

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

· مرحله چهارم : با توجه به اينکه ممکن است در زمان بهنگام سازی لازم باشد چندين مرتبه سيستم راه اندازی گردد ، از شما درخواست نام و رمز عبور شده تا ضرورتی به نشستن و نگاه کردن به کامپيوتر و واکنش لازم ( درج نام و رمز عبور به سيستم ) پس از هر مرتبه راه اندازی سيستم نباشد . بدين ترتيب در زمان راه انداری سيستم ، عمليات مربوطه بصورت اتوماتيک و بدون نياز به تايپ نام و رمز عبور ، انجام خواهد شد . عمليات فوق ، اختياری است و در صورتيکه گزينه فوق انتخاب نگردد ، با هر مرتبه راه اندازی سيستم، پيام مناسب ارائه و می بايست واکنش لازم ( تايپ نام و رمز عبور) را انجام داد .

· مرحله پنجم : در اين مرحله با فشردن دکمه ! Install Now ، بهنگام سازی عناصر (Components) آغاز می گردد . با اتمام هر يک از آيتم ها يک Check mark بمنزله اتمام مرحله مربوطه نشان داده می شود . در مقابل عنصر جاری برای بهنگام سازی نيز يک فلش قرمز رنگ نسان داده می شود.

· مرحله ششم : پس از بهنگام سازی عناصر ، مجددا" به صفحه اصلی Setup مراجعت و امکان نصب ويژوال استوديو دات نت فراهم می گردد.( کليک نمودن برروی گزينه Visiual Studio.NET )
نکته : در صورتيکه قصد داريد که از طريق ماشين فوق ، يک برنامه تحت وب پياده سازی نمائيد ، لازم است IIS و FrontPage Extensions قبلا" نصب شده باشد( بصورت پيش فرض در زمان نصب ويندوز 2000 نصب خواهد شد ) در صورتيکه ويژوال استوديو دات نت ، بر روی کامپيوتری نصب می گردد که دارای سيستم عامل ويندوز 2000 نسخه Professional است ، با يک پيام خطاء مواجه خواهيم شد( عدم وجود عناصر لازم ) با فشردن دکمه Install Component ، عمليات نصب IIS و Frontpage Extensions انجام خواهد شد . در صورتيکه دکمه Continue ، انتخاب گردد ، در آينده نمی توانيد برنامه های تحت وب را بصورت محلی بر روی کامپيوتر خود پياده سازی نمائيد .

· مرحله هفتم : نظير اکثر برنامه های نصب ، ليستی از گزينه های موجود ( شامل عناصر ) برای نصب در اختيار شما قرار می گيرد . شما می توانيد ، صرفا" آنچيزی را که بدان نياز داريد ، نصب نمائيد . مثلا" در صورتيکه ظرفيت درايو شما پايين و يا ضرورتی به استفاده از ويژوال ++C دات نت را نداريد ، می توان در اين مرحله از نصب آن صرفنظر کرد. هر گزينه ای که در اين مرحله انتخاب نمی گردد ، می توان در صورت ضرورت آن را در آينده نصب کرد. برای هر يک از امکاناتی که قرار است نصب گردند ، سه بخش اطلاعاتی متفاوت نمايش داده می شود :
بخش Feature Properties . فايل ها ی مورد نظر برای نصب و ميزان فضای مورد نياز را نشان می دهد .
بخش Feature description . هر Feature چيست و چه عملياتی را انجام می دهد .
بخش Space Allocation ، وضعيت فضای ذخيره سازی هارد را با توجه به گزينه های انتخاب شده ، نشان خواهد داد .
نکته : زمانيکه ويژوال استوديو دات نت ، اجراء می گردد مجموعه ای از اطلاعات بين ديسک و حافظه مبادله می گردد . بنابراين لازم است به ميزان کافی ظرفيت آزاد بر روی هارد ديسک وجود داشته باشد ، در اين راستا نمی توان دقيقا" مشخص نمود که به چه ميزان فضای آزاد نياز خواهد بود ولی حداقل يکصد مگابايت توصيه می گردد .

· مرحله هشتم : ويژوال استوديو دات نت ، شامل مجموعه ای گسترده از فايل های مستندات ( راهنما ) است . در اين مرحله می توان تنظيمات لازم در خصوص اجرای مستندات از طريق CD و يا دايرکتوری نصب شده بر روی هارد را انجام داد . در اين زمينه می توان يک مسير بر روی هارد را مشخص تا مستندات نصب و يا گزينه Run From Source را انتخاب تا بر اساس آن مستندات همچنان بر روی CD باقی بمانند .

· مرحله نهم : پس از انتخاب عناصر مورد نظر برای نصب ، با فشردن دکمه ! Install Now ، عمليات نصب آغاز می گردد . مدت زمان نصب ، بستگی به موارد انتخابی و نوع سيستم دارد . مثلا" نصب تمام ويژوال استوديو دات نت بهمراه تمامی مستندات بر روی يک ماشين با دارا بودن 256 مگابايت حافظه اصلی، سرعت 650 مگاهرتز و دوازده گيگابايـت هارد ديسک ، حدود يک ساعت طول خواهد کشيد .

· مرحله دهم : پس از اتمام مرحله قبل ، با انتخاب گزينه Service Release ، بررسی لازم در خصوص بهنگام سازی انجام می گيرد . اين عمليات از طريق اينترنت انجام خواهد شد . در اين زمينه به يک خط پرسرعت و مطمئن نياز خواهد بود .

لينک مقاله
http://www.srco.ir :منبع

مقالات مرتبط با اين موضوع
انواع داده ای در Visual Basic.NET | vbdotnet
ساختارهای شرطی در Visual Basic.NET | vbdotnet
متغيرهای ايستا در ASP.NET | vbdotnet
آشنايی با Visual Basic.NET- متغيرها | vbdotnet
بررسی اعتبار داده ها توسط VB.NET در فرم های وب | vbdotnet
دستيابی به بانک اطلاعاتی Access با استفاده از VB.NET | vbdotnet
معرفی اوليه VB.NET | vbdotnet

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


دستيابی به بانک اطلاعاتی Access با استفاده از VB.NET

دستيابی به بانک اطلاعاتی Access با استفاده از VB.NET
در اين مقاله قصد داريم به نحوه بازيابی و نمايش اطلاعات موجود در يک بانک اطلاعاتی Access اشاره نمائيم . هدف از مقاله فوق ، پرداختن به تمامی رويکردهای موجود در اين زمينه نبوده و صرفا" به معرفی يکی از گزينه های موجود در اين زمينه اشاره خواهد شد. در اين راستا از تکنولوژی های ASP.NET ، ADO.NET و VB.NET استفاده خواهد شد . از کلاس های OleDbConnection ، OleDbCommand و OleDbDataReader مربوط به ADO.NET بمنظور انجام عمليات لازم در ارتباط با بانک اطلاعاتی ، از ASP.NET بمنظور ايجاد فرم وب و ارائه داده با استفاده از کنترل سرويس دهنده Table و از زبان VB.NET بمنظور نوشتن دستورالعمل های مورد نظر استفاده می گردد .
در ابتدا لازم است با سه کلاس ADO.NET که در ادامه از آنان استفاده خواهد شد ، بيشتر آشنا شويم :

· کلاس OleDbConnection . شی فوق ، يک اتصال منحصر بفرد با يک منبع داده را ايجاد می نمايد. در رابطه با يک بانک اطلاعاتی سرويس گيرنده / سرويس دهنده ، اين امر معادل يک اتصال شبکه به سرويس دهنده است . با توجه به قابليت های حمايت شده توسط native OLE DB Provider ، برخی از متدها و يا خصلت ها مربوط به شی OleDbConnection ممکن است در دسترس و قابل استفاده نباشد . زمانيکه نمونه ای از OleDbConnection ايجاد می گردد ، تمامی خصلت های مربوطه ، مقدار اوليه خود را دارا خواهند بود . پس از اتمام عمليات موردنظر در ارتباط با بانک اطلاعاتی ، می بايست با فراخوانی Close و يا Dispose اقدام به غير فعال نمودن اتصال ايجاد شده با بانک اطلاعاتی مربوطه نمود.

· کلاس OleDbCommand . يک عبارت SQL و يا Stored procedure را بمنظور اجراء در رابطه با يک منبع داده ارائه می نمايد. کلاس فوق از متدهای زير بمنظور اجرای دستورات در رابطه با يک منبع داده استفاده می نمايد.
ExecuteReader . متد فوق ، دستوراتی را اجراء می نمايد که خروجی آنان شامل سطرهائی خواهد بود.
ExecuteNonQuery . باعث اجرای دستوراتی نظير SQL INSERT,DELETE,UPDATE و SET خواهد شد .
ExecuteScalar . بازيابی صرفا" يک مقدار از يک بانک اطلاعاتی

· کلاس OleDbDataReader . متد فوق ، امکان خواندن سطرهائی از داده موجود در يک منبع داده را فراهم می نمايد( فقط بسمت جلو) . بمنظور ايجاد يک OleDbDataReader ، می بايست متد ExecuteReader مربوط به شی OleDbCommand فراخوانده شود. ماداميکه OleDbDataReader در حال استفاده است (اتصال مرتبط OleDbConnection ) ، عمليات ديگری را در ارتباط با OleDbConnection نمی توان انجام داد .

امکانات مورد نياز
برای دنبال نمودن اين مقاله و اجرای نمونه مثالی که در ادامه بررسی می گردد ، به امکانات زير نياز خواهد بود :

  • نصب يکی از نسخه های ويندوز 2000 و يا نسخه ويندوز 2003
  • نصب IIS
  • نصب فريمورک دات نت نسخه 1.0 ,يا نسخه 1.1
  • يک بانک اطلاعاتی نمونه اکسس نظير Northwind

ايجاد يک برنامه وب ASP.NET با استفاده از VB.NET
بمنظور ايجاد يک برنامه وب ASP.NET با استفاده از VB.NET مراحل زير را دنبال می نمائيم :

  • اجرای برنامه ويژوال استوديو دات نت
  • از طريق منوی File ، گزينه New و در ادامه Project را انتخاب نمائيد .
  • در جعبه محاوره ای New Project ، در بخش Project Types گزينه Visual Bacic Projects را انتخاب ( کليک ) و در ادامه ASP.NET Web Application را انتخاب نمائيد .
  • در فيلد Location ، بجای نام پيش فرض #WebApplication ، نام TestAccessDB را انتخاب نمائيد . در صورتيکه از يک سرويس دهنده محلی استفاده میگردد ، می توان نام سرويس دهنده را http://localhost در نظر گرفت . بدين ترتيب در فيلد Location ، آدرس مربوطه بصورت زير نشان داده خواهد شد : http://localhost/TestAccessDB

ايجاد يک فرم وب نمونه
در نمونه کد نوشته شده از کنترل سرويس دهنده Table مربوط به ASP.NET استفاده شده که بصورت پويا يک نمايش ساده از داده بازيابی شده را نشان خواهد داد. ASP.NET ، مجموعه متنوعی از کنترل های انعطاف پذير را ارائه که می توان از آنان با توجه به رويکردهای متفاوت در رابطه با نمايش داده استفاده نمود. بمنظور ايجاد يک فرم وب در پروژه ايجاد شده در مرحله قبل ، مراحل زير را دنبال می نمائيم :

· اضافه نمودن يک فرم جديد با نام DataSample.aspx به برنامه وب ASP.NET در ويژوال استوديو دات نت . بمنظور انجام خواسته فوق ، دو مرحله زير را دنبال می نمائيم :
مرحله يک : در Solution Explorer ، بر روی گره Project کليک سمت راست نموده و گزينه Add و در ادامه گزينه Add Web Form انتخاب گردد.
مرحله دو : درفيلد Name ، نام DataSample.aspx را درج و در ادامه گزينه Open انتخاب گردد .

· از طريق Toolbox مربوط به Web Forms Tab ، يک Table ASP.NET Server Control را انتخاب ( Drag ) و بر روی صفحه aspx . مستقر نمائيد ( در حالت Desgin view ) .

· در Properties نام ID را به DisplayTable تغيير دهيد .

· در Solution Explorer ، بر روی صفحه aspx . ، کليک سمت راست نموده و گزينه View Code را انتخاب نمائيد .

· مرجع namespace زير را در بالاترين قسمت فايل کلاس code-behind وارد نمائيد .

Imports System.Data.OleDb

· کد زير را در ارتباط با رويداد Page_load در نظر می گيريم :

Page_Load Event handler

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

استفاده از يک متغير رشته ای بمنظور ذخيره سازی Connectionstring'

Dim connectString As String = "Provider=Microsoft.Jet.OLEDB.4.0;" &_
"Data Source=C:\MyDB\NWIND.MDB"

ايجاد يک شی OleDbConnection و ارسال مقدار متغير ConnectionString '

Dim cn As OleDbConnection = New OleDbConnection(connectString)

فعال نمودن Connection'

cn.Open()

استفاده از يک متغير بمنظور ذخيره عبارت SQL'

Dim selectString As String = "SELECT CustomerID, ContactName, Phone FROM Customers"

ايجاد يک شی OledbCommand'
در اين خط متغير عبارت SQL و شی OleDbConnection ، ارسال می گردد '

Dim cmd As OleDbCommand = New OleDbCommand(selectString, cn)

ارسال CommandText به Connection و ايجاد يک OleDbDataReader '
OleDbDataReader از نوع " فقط بسمت جلو " خواهد بود'

Dim reader As OleDbDataReader = cmd.ExecuteReader()

تنظيم عرض جدول '

DisplayTable.Width = Unit.Percentage(90.0)

ايجاد يک سطر جديد برای اضافه نمودن عنوان جدول'

Dim tableHeading As TableRow = New TableRow()

ايجاد و اضافه نمودن سلول های شامل ستون Customer ID '

Dim customerIDHeading As TableHeaderCell = New TableHeaderCell()
customerIDHeading.Text = "Customer ID"
customerIDHeading.HorizontalAlign = HorizontalAlign.Left
tableHeading.Cells.Add(customerIDHeading)

ايجاد و اضافه نمودن سلول های شامل ستون Contact Name '

Dim contactNameHeading As TableHeaderCell = New TableHeaderCell()
contactNameHeading.Text = "Contact Name"
contactNameHeading.HorizontalAlign = HorizontalAlign.Left
tableHeading.Cells.Add(contactNameHeading)

ايجاد و اضافه نمودن سلول های شامل ستون Phone '

Dim phoneHeading As TableHeaderCell = New TableHeaderCell()
phoneHeading.Text = "Phone"
phoneHeading.HorizontalAlign = HorizontalAlign.Left
tableHeading.Cells.Add(phoneHeading)

DisplayTable.Rows.Add(tableHeading)

تکرار در بين داده انتخابی نتايج و افزودن داده برای هر يک از ستون های مورد نظر در جدول '

While(reader.Read())
Dim detailsRow As TableRow = New TableRow()
Dim customerIDCell As TableCell = New TableCell()
customerIDCell.Text = reader("CustomerID").ToString()
detailsRow.Cells.Add(customerIDCell)
Dim contactNameCell As TableCell = New TableCell()
contactNameCell.Text = reader("ContactName").ToString()
detailsRow.Cells.Add(contactNameCell)
Dim phoneCell As TableCell = New TableCell()
phoneCell.Text = reader("Phone").ToString()
detailsRow.Cells.Add(phoneCell)
DisplayTable.Rows.Add(detailsRow)
End While

بستن Connection'

reader.Close()
cn.Close()
End Sub

· مقدار متغير ConnectString در ابتدای کد نوشته شده فوق را تغيير و آن را به محلی که بانک اطلاعاتی موجود است ، اشاره دهيد .

· از طريق منوی File ، گزينه Save All را انتخاب تا فرم وب و ساير فايل های مرتبط با پروژه ، ذخيره گردد .

· از طريق منوی Build ، گزينه Build Solution را بمنظور ايجاد پروژه ، فعال نمائيد.

· در Solution Explorer ، بر روی DataSample.aspx کليک سمت راست و در ادامه گزينه View in Browser را انتخاب نمائيد . در ادامه صفحه در مرورگر نمايش و شامل داده موجود در بانک اطلاعاتی مربوطه است .

اشکالات و خطاهای احتمالی
درزمان اجراء ، ممکن است با خطائی مانند زير مواجه شويم :

The Microsoft Jet database engine cannot open the file 'C:\MyDB\NWIND.MDB'.
It is already opened exclusively by another user, or you need permission to view its data.

· خطای فوق ، اغلب بدليل عدم داشتن مجوز لازم بمنظور دستيابی به فايل ( فايل بانک اطلاعاتی با انشعاب mdb . ) می باشد . بصورت پيش فرض ، ASP.NET تحت ASPNET account در فريمورک دات نت نسخه يک و يا NetworkService در فريمورک دات نت نسخه 1،1 اجراء می گردد.در اين رابطه لازم است تغييرات لازم در رابطه با مجوز دستيابی به فايل mdb . و فولدری که شامل فايل است ، اعمال گردد .

· از نصب عناصر مورد نياز Microsoft Jet database بر روی سيستم ، مطمئن گرديد. در صورتيکه MDAC 2.6 نصب شده باشد ( Microsoft Data Access Components 2.6) ، عناصر Jet را شامل نمی گردد . در چنين مواردی می بايست آخرين نسخه Jet 4.0 Service Pack ، بر روی سيستم نصب گردد.
لينک مقاله
http://www.srco.ir :منبع

مقالات مرتبط با اين موضوع
انواع داده ای در Visual Basic.NET | vbdotnet
ساختارهای شرطی در Visual Basic.NET | vbdotnet
متغيرهای ايستا در ASP.NET | vbdotnet
آشنايی با Visual Basic.NET- متغيرها | vbdotnet
بررسی اعتبار داده ها توسط VB.NET در فرم های وب | vbdotnet
دستيابی به بانک اطلاعاتی Access با استفاده از VB.NET | vbdotnet
معرفی اوليه VB.NET | vbdotnet

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


بررسی اعتبار داده ها توسط VB.NET در فرم های وب

فريم ورک دات نت ، شامل مجموعه ای از کنترل های لازم بمنظور بررسی اعتبار و صحت داده های ورودی است که با استفاده از آنان در فرم های وب و ASP.NET ، می توان داده ورودی توسط کاربر در هر يک از فيلدهای موجود بر روی يک فرم وب را بررسی و در صورت عدم رعايت شرايط لازم ، پيام خطاء مناسبی را ارائه نمود. در اين مقاله به تشريح نحوه استفاده از کنترل های صحت داده ، خواهيم پرداخت .

کنترل های سرويس دهنده اعتبار داده
کنترل های سرويس دهنده اعتبار داده ، امکان بررسی صحت داده مرتبط با يک کنترل سرويس دهنده ورودی نظير يک TextBox را فراهم و در صورتيکه ماحصل بررسی بعمل آمده ، مثبت نباشد ، يک پيام خطاء نمايش داده خواهد شد. هر يک از کنترل های اعتبار داده ، عمليات خاصی را در ارتباط با بررسی صحت داده ها انجام خواهند داد . مثلا" می توان با استفاده از CompareValidator ، عمليات بررسی صحت داده ها را در ارتباط با يک مقدار خاص انجام و يا با استفاده از کنترل RangeValidator يک محدوده قابل قبول از مقادير مورد نظر در ارتباط با يک فيلد ورود اطلاعات را انجام داد. در چنين مواردی ، حتی می توان با استفادده از کنترل CustomValidator ، شرايط خاص مورد نظر خود برای بررسی صحت داده ، تعريف و ايجاد نمود. با توجه به اينکه ، پيام خطاء در کنترل اعتبار داده نمايش داده می شود، می توان مکان مورد نظر برای نمايش پيام خطاء را نيز مشخص کرد . در اين راستا ، همچنين می توان با استفاده از کنترل ValidationSummery ، خلاصه ای از نتايج تمامی کنترل های بررسی صحت داده ها را نمايش داد .
عمليات بررسی صحت داده در يک صفحه زمانی محقق خواهد شد که يک کنترل Button نظير Button,ImageButton و يا LinkButton کليک گردد . در اين رابطه می توان با مقدار دهی False به خصلت CausesValidation ، باعث ممانعت در رابطه با بررسی صحت داده گرديد . روش فوق ، در مواردی نظير فشردن يک دکمه Cancel و يا Clear استفاده می گردد ( در چنين مواردی عملا" ما قصد بررسی صحت داده را نخواهيم داشت ) . مقدار خصلت فوق ، بصورت پيش فرض در ارتباط با يک Button از نوع Cancel و يا Clear مقدار False در نظر گرفته خواهد شد .
در نمونه مثالی که در ادامه تشريح و به بررسی آن خواهيم پرداخت از چهار کنترل اعتبار داده استفاده شده است که لازم است در ابتدا مختصرا" با عملکرد هر يک از آنان آشنا شويم .

· RequiredFieldValidator . کنترل فوق ، مقدار يک کنترل ورودی را بمنظور حصول اطمينان از درج داده در فيلد مورد نظر توسط کاربر ، بررسی می نمايد . در صورتيکه مقدار مشخص شده در فيلد مورد نظر نسبت به مقدار اوليه خود تغيير نکرده باشد ،بمنزله عدم صحت و اعتبار داده بوده و نشان دهنده اين موضوع است که کاربر در فيلد مربوطه داده مورد نظر را وارد ننموده است . در حقيقت در چنين شرايطی الزامی برای درج داده در ارتباط با يک کنترل ورودی بوجود آمده و کاربر نمی تواند فيلد مربوطه را بدون اعمال تغييرات ( درج داده ) رها نموده و نسبت به آن بی تفاوت باشد . مقدار پيش فرض، يک رشته خالی ( "" ) بوده و نشاندهنده اين واقعيت است که می بايست مقداری در آن درج تا در آزمون بررسی صحت داده موفقيت حاصل گردد . در اين رابطه فضاء خالی اضافه شده در ابتدا و انتهای کنترل ورودی حذف و در ادامه عمليات بررسی صحت داده انجام خواهد شد . بدين ترتيب از درج فضای خالی در کنترل ورودی برای بررسی صحت داده ممانعت بعمل می آيد . در برخی موارد لازم است که در مقابل مقدار پيش فرض (رشته خالی) برای يک کنترل ورودی از مقدار اوليه مورد نظر خود استفاده نمائيم ( با توجه به سياست های طراحی بخش رابط کاربر ) . استفاده از روش فوق ، در مواردیکه دارای يک مقدار پيش فرض در ارتباط با يک کنترل ورودی بوده و قصد داريم که کاربر را ملزم به انتخاب يک مقدار ديگر نمائيم ، توصيه می گردد . مثلا" می توان از يک کنترل ListBox بهمراه يک Entry انتخاب شده بصورت پيش فرض که شامل دستورالعمل هائی برای کاربر بمنظور انتخاب يک آيتم از ليست است ، استفاده نمود . در چنين مواردی لازم است که کاربر يک آيتم ديگر موجود در ليست را از طريق کنترل انتخاب و در اين رابطه نمی بايست کاربر آيتمی را انتخاب نمايد که شامل دستورالعمل است . بدين ترتيب در صورتيکه کاربر همان مقدار اوليه پيش فرض را انتخاب نمايد ، کنترل RequiredFieldValidator ، پيام خطاء مورد نظر خود را نمايش خواهد داد . بمنظور مشخص نمودن مقدار اوليه يک کنترل ورودی، می توان از خصلت InitialValue استفاده کرد.
با توجه به سياست های طراحی رابط کاربر ، می توان از چندين Validator در ارتباط با يک کنترل ورودی مشابه و يکسان استفاده نمود. مثلا" می توان از يک کنترل RequiredFieldValidator ، بمنظور حصول اطمينان از درج داده در کنترل مورد نظر استفاده و در همان حال از کنترل ديگری نظير RangeValidator نيز استفاده تا اين اطمينان ايجاد گردد که ورودی درج شده در کنترل مورد نظر در محدوده قابل قبول و مجاز می باشد .

· کنترل ValidationSummary . کنترل فوق ، امکان ارائه اطلاعات مختصر در رابطه با تمامی کنترل های بررسی صحت داده موجود در يک صفحه وب و در يک موفقعيت ( مکان ) را فراهم می نمايد. خلاصه اطلاعات موردنظر را می توان با استفاده از روش های متفاوتی نظير : يک پاراگراف ، يک ليست و يا يک Bulleted list . ارائه نمود. نحوه نمايش اطلاعات با استفاده از خصلت DisplayMode مشخص خواهد شد .پيام خطاء نمايش داده شده در کنترل ValidationSummary برای هر يک از کنترل های بررسی صحت داده موجود در صفحه ، توسط خصلت ErrorMessage مربوط به هر يک از کنترل ها ، مشخص می گردد . در صورتيکه خصلت ErrorMessage مربوط به کنترل بررسی صحت داده ، مقداردهی نگردد، هيچگونه پيام خطائی در ارتباط با آن کنترل خاص توسط کنترل ValidationSummary نمايش داده نخواهد شد. برای مشخص نمودن عنوان گزارش خطاء، می توان از خصلت HeaderText استفاده کرد. بمنظور کنترل نمايش اطلاعات کنترل ValidationSummary ، می توان از خصلت ShowSummary استفاده نمود . برای نمايش خلاصه اطلاعات مورد نظر در يک Message Box می توان مقدار خصلت ShowMessageBox را True در نظر گرفت .

· کنترل RegularExpressinoValidator . کنترل فوق ، بمنظور تطبيق داده ورودی در يک کنترل ورودی با يک الگوی تعريف شده توسط يک عبارت ، استفاده می گردد . کنترل فوق ، امکان بررسی لازم در خصوص دنباله کاراکترهای مورد انتظار نظير آدرس های پست الکترونيکی ، شماره های تلفن و يا کد پستی را فراهم می نمايد . با استفاده از خصلت ValidationExpression ، عبارت مورد نظر بمنظور بررسی صحت داده کنترل ورودی، تعريف و مشخص می گردد . گرامر عبارت بررسی صحت داده بر روی سرويس گيرنده و سرويس دهنده با يکديگر متفاوت است . در سرويس گيرنده ، بمنظور مشخص نمودن عبارت مورد نظر از گرامر Jscript و بر روی سرويس دهنده از گرامر Regex استفاده می گردد . با توجه به اينکه، گرامرعبارات Jscript زير مجموعه ای از گرامر Regex می باشد ، توصيه می گردد از گرامر Jscript برای تعريف عبارت مورد نظر خود استفاده تا شاهد نتايج يکسانی بر روی سرويس گيرنده و سرويس دهنده باشيم .

· کنترل CompareValidator . کنترل فوق، مقدار ورودی در يک کنترل ورودی را با مقدار ديگر مقايسه می نمايد . از خصلت ControlToValidate برای مشخص نمودن کنترل ورودی اول و از خصلت ControlToCompare برای مشخص نمودن کنترل ورودی دوم که می بايست با يکديگر مقايسه گردند ، استفاده می شود .درصورتيکه ماحصل مقايسه يکسان باشد، از مقدار مشخص شده توسط خصلت ControlToCompare ، استفاده می گردد .

استفاده از کنترل های اعتبار داده ASP.NET توسط ويژوال استوديو دات نت
بررسی صحت داده ورودی توسط کاربر در بخش رابط کاربر هر نرم افزار ، از جمله عملياتی است که اولا" وقت زيادی را بخود اختصاص و ثانيا" در برخی موارد چالش های خاص خود را بدنبال خواهد داشت . فريمورک دات نت در اين رابطه مجموعه ای از کنترل های بررسی صحت داده را ارائه که با استفاده از آنان می توان اقدام به بررسی داده در کنترل های ورودی موجود بر روی يک فرم وب و ارائه پيام خطاء مورد نظر در صورت عدم رعايت ضوابط و شرايط موجود توسط کاربر بمنظور ورود اطلاعات نمود.
در ادامه به بررسی مثالی خواهيم پرداخت که با ارائه يک فرم از کاربر درخواست تکميل و ارسال اطلاعات خواهد شد. در اين رابطه از کاربر درخواست نام ، آدرس پست الکترونيکی و رمز عبور می گردد . پس از ارسال اطلاعات توسط کاربر ، کنترل های بررسی صحت و اعتبار داده موجود بر روی فرم ، عمليات تائيد داده ورودی توسط کاربر را انجام و درصورت عدم رعايت ضوابط تعريف شده در ارتباط با هر يک از کنترل های ورودی ، پيام خطائی ،بصورت مختصر و در قسمت انتهائی صفحه نمايش داده خواهد شد.

ايجاد يک برنامه وب ASP.NET با استفاده از VB.NET
بمنظور ايجاد يک برنامه وب ASP.NET با استفاده از VB.NET مراحل زير را دنبال می نمائيم :

  • اجرای برنامه ويژوال استوديو دات نت
  • از طريق منوی File ، گزينه New و در ادامه Project را انتخاب نمائيد .
  • در جعبه محاوره ای New Project ، در بخش Project Types گزينه Visual Bacic Projects را انتخاب ( کليک ) و در ادامه ASP.NET Web Application را انتخاب نمائيد .

· در فيلد Location ، بجای نام پيش فرض #WebApplication ، نام ValidationData را در نظر می گيريم . در صورتيکه از يک سرويس دهنده محلی استفاده می گردد ، می توان نام سرويس دهنده را http://localhost در نظر گرفت . بدين ترتيب در فيلد Location ، آدرس مربوطه بصورت زير نشان داده خواهد شد : http://localhost/ValidationData

ايجاد يک فرم وب نمونه
بمنظور ايجاد يک فرم وب در پروژه ايجاد شده در مرحله قبل ، مراحل زير را دنبال می نمائيم :

· اضافه نمودن يک فرم جديد با نام ValidUser.aspx به برنامه وب ASP.NET در ويژوال استوديو دات نت . بمنظور انجام خواسته فوق ، دو مرحله زير را دنبال می نمائيم :
مرحله يک : در Solution Explorer ، بر روی گره Project کليک سمت راست نموده و گزينه Add و در ادامه گزينه Add Web Form انتخاب گردد.
مرحله دو : درفيلد Name ، نام ValidUser.aspx را درج و در ادامه گزينه Open انتخاب گردد .

· در ادامه، کدهای زير را پس از استقرار در پنجره نمايش HTML مربوط به ValidUser.aspx ، بين تگ های شروع و پايان مستقر می نمائيم .

تگ های HTML درج شده در ValidUser.aspx

<table>
<tr width="100">
<td>نام</td>
<td><input id="txtUserName" type="text" size="20" maxlength="15" runat="server" NAME="txtUserName">*
</td>
</tr>
<tr width="100">
<td>
آدرس پست الکترونيکی
<td><input id="txtEmail" type="text" size="35" maxlength="30" runat="server" NAME="txtEmail">
(<A>Ino@Srco.ir</A>)
</td>
</tr>
<tr width="100">
<td>رمز عبور</td>
<td><input id="txtPassword" type="password" size="15" maxlength="10" runat="server" NAME="txtPassword">*
</td>
</tr>
<tr width="100">
<td>تايپ مجدد رمز عبور</td>
<td><input id="txtConfirmPassword" type="password" size="15" maxlength="10" runat="server" NAME="txtConfirmPassword">*
</td>
</tr>
</table>

· کنترل های RequiredFieldValidator ، بررسی لازم در خصوص داده ورودی برای هر يک از فيلدهای موردنظر در ارتباط با کنترل های مشخص شده را انجام خواهد داد . در اين رابطه کنترل های RequiredFieldValidator را در ارتباط با فيلدهای UserName و Password به فرم اضافه می نمائيم . در ValidUser.aspx ، و پنجره HTML مستقر و کد زير را بعد از تگ <Table/> اضافه می نمائيم .

<asp:RequiredFieldValidator id=valUserNameRequired
ControlToValidate=txtUserName ErrorMessage="نام کاربر می بايست وارد شود" EnableClientScript=true Display=None Runat=server/>
<asp:RequiredFieldValidator id=valPasswordRequired
ControlToValidate=txtPassword ErrorMessage="رمز عبور می بايست وارد شود" EnableClientScript=true Display=None Runat=server/>
<asp:RequiredFieldValidator id=valConfirmPasswordRequired
ControlToValidate=txtConfirmPassword ErrorMessage="تائيد مجدد رمز عبور می بايست وارد شود"
EnableClientScript=true Display=None Runat=server/>

· فيلدهای رمز عبور تاکيد مضاعفی است که کاربر دومرتبه و بدرستی رمز عبور خود را وارد نمايد. کنترل CompareValidator محتويات دو فيلد را با يکديگر مقايسه و در صورت عدم يکسان بودن آنان ، پيام خطائی نمايش داده خواهد شد . در اين رابطه از يک کنترل CompareValidator بمنظور بررسی صحت ( يکسان بودن ) فيلدهای رمز عبور استفاده شده است . بدين منظور پس از استقرار در پنجره HTML مربوط به فرم وب ValidUser.aspx ، کد زير را پس از کنترل های اضافه شده در مرحله قبل ، به فرم مورد نظر اضافه می نمائيم .

<asp:CompareValidator id=valComparePassword
ControlToValidate=txtConfirmPassword ErrorMessage="فيلدهای رمز عبور می بايست يکسان باشند" ControlToCompare=txtPassword Display=None
EnableClientScript=true Runat=server/>

· در برخی موارد لازم است از نوع خاصی بررسی صحت و اعتبار داده استفاده گردد . فيلد آدرس پست الکترونيکی در مثال فوق ، نمونه ای در اين زمينه است . در اين رابطه از کنترل RegularExpressionValidator استفاده تا اين اطمينان حاصل گردد که کاربران فرمت اوليه برای درج يک آدرس پست الکترونيکی را رعايت نموده اند . محتويات فيلد فوق مجددا" بر اساس يک عبارت ( تعريف يک الگو ) بررسی شده و در صورتيکه محتويات مورد نظر با عبارت تعريف شده مطابقت نداشته باشد ، يک پيام خطاء نمايش داده خواهد شد. در اين رابطه لازم است که يک کنترل RegularExpressionValidator بر روی فرم اضافه تا فرمت داده آدرس پست الکترونيکی ورودی توسط کاربر را بررسی و از صحت و رعايت فرمت مورد نظر اطمينان حاصل گردد . بدين منظور پس از استقرار در پنجره HTML مربوط به فرم وب ValidUser.aspx ، کد زير را پس از کنترل های اضافه شده در مرحله قبل ، به فرم مورد نظر اضافه می نمائيم .

<asp:RegularExpressionValidator ID=valEmailAddress
ControlToValidate=txtEmail ValidationExpression=".*@.*\..*" ErrorMessage="آدرس پست الکترونيکی درست نمی باشد"
Display=None EnableClientScript=true Runat=server/>

· در ادامه ، بر روی فرم ValidUser.aspx ، يک دکمه "ارسال" را اضافه می نمائيم .بدين ترتيب به کاربر اجازه داده خواهد شد تا صفحه مورد نظر را برای سرويس دهنده ارسال و عمليات بررسی صحت و اعتبار داده درج شده در هر يک از فيلدهای موجود بر روی فرم ، انجام شود. بدين منظور پس از استقرار در پنجره HTML مربوط به فرم وب ValidUser.aspx ، کد زير را پس از کنترل های اضافه شده در مرحله قبل ، به فرم مورد نظر اضافه می نمائيم .

<br>
<input type=submit id=cmdSumbit value=submit runat=server/>

· در نهايت ، از يک کنترل ValidationSummary بمنظور نمايش تمامی خطاهای بوجود آمده در يک ناحيه خاص بر روی فرم استفاده می شود. بدين منظور پس از استقرار در پنجره HTML مربوط به فرم وب ValidUser.aspx ، کد زير را پس از دکمه "ارسال" اضافه شده در مرحله قبل ، به فرم مورد نظر اضافه می نمائيم .

<br><br>
<asp:ValidationSummary id=ValSummary HeaderText="The following
errors were found:" ShowSummary=True DisplayMode=List Runat=server/>

· پس از اتمام مراحل فوق ، با اتتخاب گزينه Save ، فرم وب ايجاد شده ذخيره و در ادامه می توان با استفاده از منوی Debug و گزينه Start ، امکان ايجاد و اجرای برنامه وب را فراهم نمود.

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

در صورتيکه کاربر، دو رمز عبور را وارد که با يکديگر يکسان نمی باشند ، پيام خطاء زير ارائه خواهد شد .

در صورتيکه کاربر يک آدرس پست الکترونيکی را وارد که دارای فرمت مناسب نباشد ، ، پيام خطاء زير نمايش داده خواهد شد .
لينک مقاله
http://www.srco.ir :منبع

مقالات مرتبط با اين موضوع
انواع داده ای در Visual Basic.NET | vbdotnet
ساختارهای شرطی در Visual Basic.NET | vbdotnet
متغيرهای ايستا در ASP.NET | vbdotnet
آشنايی با Visual Basic.NET- متغيرها | vbdotnet
بررسی اعتبار داده ها توسط VB.NET در فرم های وب | vbdotnet
دستيابی به بانک اطلاعاتی Access با استفاده از VB.NET | vbdotnet
معرفی اوليه VB.NET | vbdotnet

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آشنايی با Visual Basic.NET- متغيرها

متغيرها حاملهای دربرگيرنده مقاديری هستند که در جريان يک برنامه کاربردی می توانند تغيير کنند. برنامه نويسی بدون آنها، اگر نگوئيم غيرممکن، اما به سختی امکان پذير است. در ASP.NET، متغيرها در چند لايه وجود دارند.

لايه اول، لايه Application است. در اينجا در هر صفحه برنامه کاربردی، همه متغيرها در دسترس همه کاربران قرار دارد. معمولا يک قطعه داده نسبتا کوچک که در معرض استفاده مکرر است، همانند اطلاعات مربوط به ارتباط با بانک اطلاعاتی، در اين لايه ذخيره می شود.

لايه دوم، لايه Session است. در اين لايه، همه متغيرها در سرتاسر برنامه کاربردی يا تا برقرار بودن جلسه کاربر، در دسترس يک کاربر بخصوص هستند.

لايه سوم و آخر، لايه Page است. در اينجا همه متغيرهای تعريف شده در صفحه در سرتاسر آن صفحه در دسترس هستند. متغيرهای تعريف شده در يک صفحه ASP.NET از صفحه ديگر قابل دستيابی نيستند.

به علاوه در زمان استفاده از code-behindها در صفحات ASP.NET، در پيمانه های کلاس خود به متغيرهای سطح Procedure ،Private ،Public و Block دسترسی داريد. متغيرهای عمومی در کلاس هايی که در آنها ايجاد شده اند و نيز پيمانه های کلاس ديگر قابل دسترسی هستند. جلوی اين متغيرها کلمه کليدی Public قرار می گيرد. متغيرهای خصوصی تنها در دسترس توابع و روال های کلاس هايی هستند که در آنها تعريف شده اند.

قبل از متغيرهای خصوصی کلمه کليدی Private قرار می گيرد. متغيرهای سطح Block تنها در بلوک های برنامه ايجاد کننده خود در دسترس می باشند. قبل از متغيرهای سطح Procedure و Block کلمه کليدی Dim قرار می گيرد.

نکته حائز اهميت اين است که بايد به خاطر بسپاريم که هميشه بايد نوع داده های متغير خود را تعريف کنيم. در زير ليستی از انواع داده های پشتيبانی شده در VB.NET آورده شده است.

Boolean: درست يا نادرست
Byte: برای داده های عددی 0 تا 255
Char: برای يک کاراکتر يونيکد
Date: اطلاعات تاريخ و زمان
Decimal: اطلاعات عددی صحيح
Double: داده های عددی اعشاری
Integer, Long, Short, Single: داده های عددی صحيح
Object: متغير حامل پيش فرض جهت نگهداری هر نوع شئ
String: رشته های حرفي

در نگارشهای قبلی ويژوال بيسيک و در VBScript همه متغيرها بطور پيش فرض از نوع داده variant بودند. Variant در VB.NET وجود ندارد و با نوع داده Object جايگزين شده است.
لينک مقاله
http://www.iranasp.net :منبع

مقالات مرتبط با اين موضوع
انواع داده ای در Visual Basic.NET | vbdotnet
ساختارهای شرطی در Visual Basic.NET | vbdotnet
متغيرهای ايستا در ASP.NET | vbdotnet
آشنايی با Visual Basic.NET- متغيرها | vbdotnet
بررسی اعتبار داده ها توسط VB.NET در فرم های وب | vbdotnet
دستيابی به بانک اطلاعاتی Access با استفاده از VB.NET | vbdotnet
معرفی اوليه VB.NET | vbdotnet

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


متغيرهای ايستا در ASP.NET

در ASP همواره از شئ Application برای ذخيره متغيرهای سراسری استفاده می شد. اين عمل از لحاظ اختصاص فضای حافظه چندان مناسب نبود. در دات نت می توانيم با سود بردن از خواص متغيرهای ايستا در اکثر موارد نتيجه بهتری بدست آوريم. اين روش در اکثر موارد سريعتر از استفاده از شئ Application خواهد بود.

در دات نت اکثر اشياء به صورت کلاس در نظر گرفته می شوند که فايل global.asax نيز از اين قائده پيروی می کند. برای استفاده از اين روش در ابتدا بايد به اين فايل نام يک کلا س را اختصاص دهيم. دقت کنيد که هميشه سعی می کنيم در نامگذاری از اسامی که راهنمای ما باشند استفاده کنيم. برای مثال در اينجا از نام myglobal استفاده می کنيم. به منظور انجام اين کار از کد زير استفاده می شود.

<%@ Application Classname="MyGlobals" %>

سپس با استفاده از تگ Script متغيرهای خود را تعريف می نماييم. دقت کنيد که بايد از کلمات کليدی Public و Shared هم استفاده نما ييد.

<Script language="vb" runat="server">
Public Shared sAli as String = "This is just a test"
</Script>

با کد بالا ما متغير خود را به نام sAli تعريف نموديم. حال با استفاده از نام کلاس و اين نام می توا نيم آن را در تمام صفحات خود به صورت مستقيم صدا کنيم.

x = MyGlobals.sAli

کدهای نمونه را می توانيد مشاهده کنيد.

<%@ Application Classname="MyGlobals" %>

<Script language="vb" runat="server">

Public Shared sGreeting as String = "This is just a test"

</Script>
<% @Page Language="VB" %>
<HTML>
<HEAD>
<script Language='vb' runat=server>
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Label1.Text = MyGlobals.sGreeting
End Sub
</script>
</HEAD>
<body>
<asp:label runat=server id=Label1></asp:label>
</body>
</HTML>
لينک مقاله
http://www.iranasp.net :منبع

مقالات مرتبط با اين موضوع
انواع داده ای در Visual Basic.NET | vbdotnet
ساختارهای شرطی در Visual Basic.NET | vbdotnet
متغيرهای ايستا در ASP.NET | vbdotnet
آشنايی با Visual Basic.NET- متغيرها | vbdotnet
بررسی اعتبار داده ها توسط VB.NET در فرم های وب | vbdotnet
دستيابی به بانک اطلاعاتی Access با استفاده از VB.NET | vbdotnet
معرفی اوليه VB.NET | vbdotnet

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


ساختارهای شرطی در Visual Basic.NET

اين گفتار برآنيم تا ساختارهای شرطی در ويژوال بيسيک دات نت را بررسی کنيم. اين ساختارها If..Then و Select..Case می باشند.

ساختار If..Then
ابتدائی ترين ساختار شرطی در ويژوال بيسيک دات نت ساختار If..Then می باشد. با استفاده از اين ساختار هنگامی که شرط مورد نظر برقرار باشد، می توان دستور يا دستورات متعددی را اجرا نمود.

بعنوان مثال در برنامه زير اگر زمان سيستم بعد از ظهر را نشان دهد، جمله "Good Evening IranASP.NET" بر روی صفحه نمايش داده می شود.

<%
Dim myTime As DateTime
myTime = Now

if Hour(myTime) >= 12 then
Response.write ("Good Evening IranASP.NET !")
end if
%>

همچنين ساختار If..Then عبارت Else را هم پشتيبانی می کند. اگر شرط مربوط به If برقرار نباشد، دستورات موجود در قسمت Else اجرا می شوند. به مثال زير توجه فرمائيد.

<%
Dim myTime As DateTime
myTime = Now

if Hour(myTime) >= 12 then
Response.write ("Good Evening IranASP.NET !")
else
Response.write ("Good Morning IranASP.NET !")
end if

%>

ساختار Select..Case
در ساختار Select..Case می توان مقداری را با مقادير مختلفی مقايسه کرده و دستورات مربوط به مقدار يافت شده را اجرا نمود. بعنوان مثال قطعه برنامه زير پيامهای مختلفی را برحسب نوع مرورگر نمايش می دهد.

<%
Dim strBrowser As String

strBrowser = Request.Browser.Browser
Select Case strBrowser
Case "IE"
Response.Write( "You are using Internet Explorer!" )
Case "Netscape"
Response.WRite( "You are using Netscape!" )
Case Else
Response.Write( "What browser are you using?" )
End Select
%>

دقت داشته باشيد که ساختار Select..Case در برنامه فوق دارای يک قسمت Case Else می باشد. هرگاه هيچ يک از حالات مقايسه ای برقرار نبود، دستورات موجود در قسمت Case Else اجرا می گردند. استفاده از Case Else اختياری است.
لينک مقاله
http://www.iranasp.net :منبع

مقالات مرتبط با اين موضوع
انواع داده ای در Visual Basic.NET | vbdotnet
ساختارهای شرطی در Visual Basic.NET | vbdotnet
متغيرهای ايستا در ASP.NET | vbdotnet
آشنايی با Visual Basic.NET- متغيرها | vbdotnet
بررسی اعتبار داده ها توسط VB.NET در فرم های وب | vbdotnet
دستيابی به بانک اطلاعاتی Access با استفاده از VB.NET | vbdotnet
معرفی اوليه VB.NET | vbdotnet

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


انواع داده ای در Visual Basic.NET

برای تعريف يک متغير در ويژوال بيسيک دات نت از عبارت Dim استفاده می شود. برای مثال چمله زير يک متغير جديد به نام myVar تعريف می کند:

Dim myVar

هنگامی که يک متغير مانند فوق بدون در نظر گرفتن نوع آن تعريف شود، آن متغير بعنوان يک شئ (Object) در نظر گرفته می شود. يک متغير از نوع شئ در دات نت می تواند شامل انواع داده از قبيل رشته، عدد يا انواع پيچيده تر مانند کلاس باشد.

اغلب نيازی نيست که از متغيرهای از نوع شئ در برنامه استفاده شود چرا که اين متغيرها باعث کاهش کارآيی و سرعت برنامه می شود. هنگامی که از يک متغير از نوع شئ استفاده شود، نوع مناسب آن متغير در زمان اجرا تشخيص داده می شود و اين باعث کندی می شود. بنابراين بهتر است که نوع داده را از ابتدا مشخص کنيم.

جهت مشخص نمودن نوع داده از کلمه کليدی As استفاده می کنيم. بعنوان مثال يک متغير از نوع رشته بصورت زير تعريف می شود:

Dim myVar As String

مجموعه دات نت انواع داده ای زير را پشتيبانی می کند:

• Boolean: جهت مقادير درست يا نادرست
• Byte: جهت مقادير صحيح صفر تا ۲۵۵ (تنها مقادير مثبت)
• Char: جهت مقادير نويسه ها يا حروف يونيکد
• Date: جهت مقادير تاريخ و زمان بين اول ژانويه ۰۰۰۱ و ۳۱ دسامبر ۹۹۹۹
• Decimal: جهت مقادير صحيح بين صفر و مثبت و منفی ۷۹,۲۲۸,۱۶۲,۵۱۴,۲۶۴,۳۳۷,۵۹۳,۵۴۳,۹۵۰,۳۳۵ (۱۶ بايت)
• Double: جهت مقادير اعشاری با دقت مضاعف
• Integre: جهت مقادير صحيح بين +۲,۱۴۷,۴۸۳,۶۴۷ و -۲,۱۴۷,۴۸۳,۶۴۸ (۴ بايت)
• Long: جهت مقادير صحيح بين -۹,۲۲۳,۳۷۲,۰۳۶,۸۵۴,۷۷۵,۸۰۸ و +۹,۲۲۳,۳۷۲,۰۳۶,۸۵۴,۷۷۵,۸۰۷ (۸ بايت)
• Short: جهت مقادير صحيح بين -۳۲,۷۶۸ و +۳۲,۷۶۷ (۲ بايت)
• Single: جهت مقادير اعشاری با دقت واحد
• String: جهت مقادير رشته ای با تعداد حروف صفر تا دو ميليارد حرف

پر کاربردترين انواع داده ای عبارتند از Integer، Decimal، Date، Boolean و String.

دقت کنيد که نوع داده ای Currency يا Money برای مقادير پولی در نظر گرفته نشده است و شما می توانيد برای مقادير پولی از نوع Decimal استفاده کنيد.
لينک مقاله
http://www.iranasp.net :منبع

مقالات مرتبط با اين موضوع
انواع داده ای در Visual Basic.NET | vbdotnet
ساختارهای شرطی در Visual Basic.NET | vbdotnet
متغيرهای ايستا در ASP.NET | vbdotnet
آشنايی با Visual Basic.NET- متغيرها | vbdotnet
بررسی اعتبار داده ها توسط VB.NET در فرم های وب | vbdotnet
دستيابی به بانک اطلاعاتی Access با استفاده از VB.NET | vbdotnet
معرفی اوليه VB.NET | vbdotnet

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


کلاس چیست ؟include
۱- کلاسها به صورت فايلهايی با پسوند" h " به طور مثال "cat.h " ذخيره ميشوند و برای استفاده از آن در برنامه نياز است که آنرا به برنامه ضميمه کنيد به طورمثال :("include " cat.h#)
۲- اما در داخل فايل کلاس چه چيزهايی نوشته می شود :
در کلاس دو مسئاله تعيين می شود :
الف ) متغييرهای لازم
ب ) توابع مورد نياز
در مورد تعريف متعييرها بايد گفت که همانند تعريف متغيير در بر نامه نويسی غير شئ گرا می باشد اما يک نکته مهم را بايد مد نظر داشت و آن اين است که در برنامه نويسی شئ گرا در کلاس شما حق مقدار دهی به يک متغيير در حين تعريف آن را نداريد . به مثال زير توجه کنيد :
;int a=10 اين در برنامه نويسی عادی مشکلی ندارد اما در يک کلاس حق چنين کاری نداريم و بايد به شکل زير بنويسيم :
;int a
چگونگی مقدار دهی به این متغییر در بحث شئ مورد بررسی قرار می گيرد .
و اما توابع مورد نياز نيز روش خاص خود را داراست .
در يک کلاس شما فقط بايد تابع را تعريف کنيد و کد نويسی بدنه تابع در داخل کلاس انجام نمی شود . در ادامه يک نمونه از يک کلاس ساده آورده شده است :

}class cat

;int age
;int weight,length

;(void setage(int x
;( int getage(void
;(void Meow(void

{

همانطور که مشاهده کرديد در يک کلاس تنها تعريف متغييرها و توابع صورت می گيرد .
اين نوشته به صورت فايلی با پسوند "h " ذخيره می شود بطور مثال : cat.h

حالا باید بتونیم توابع تعریف شده رو بصورت کامل بنویسیم .
برای این کار یک فایل هم نام با نام کلاس می سازند با پسوند cpp مثلا cat.cpp
در این فایل جدید ابتدا نوشته می شود " i #include "cat.hدیگر هدر فایلهای مورد نیاز نیز که جزء ملزومات برناه نویسی است نیز باید نوشته شود
بعد از آن نوشتن بدنه فایلها شروع می شود که همانند سی معمولی است اما با کمی تفاوت جزئی :
بعد از تعیین نوع تابع باید نام کلاس نوشته شده بعد ۲ تا علامت :: گذاشته و اسم تابع و بقیه مجرا نوشته شود . مثلا :

(void cat::setage (int a
}
;age=a
}
لينک مقاله
http://visualc6.persianblog.com :منبع

مقالات مرتبط با اين موضوع
نمايش Menu روی Tray Icon | c
Modless Dialog | c
Tray Icon | c
DialUp | c
مقدمه ای بر پردازش تصوير | c
تغيير رنگ پس زمينه ديالوگ | c
Socket - Socket Programming چيست ؟ | c
توابع مجازی | c
ارث بری کلاسها ( مشتق کردن کلاسی از کلاس دیگر ) | c
چند ريختی Polymorphism | c
سازنده ها و مخربها در يک کلاس | c
سطح دسترسی در کلاسها | c
کلاس چیست ؟include | c

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


سطح دسترسی در کلاسها
در مورد سطح دسترسی به متغييرها و توابع در يک کلاس بحث خواهيم کرد
سطح دسترسی يعنی چی؟
يعنی يک کلاس برای محتويات خود يکسری دسته بندی را رعايت می کند که هر کسی به هر چيزی نتواند دسرسی داشته باشد که در بعضی موارد اگر رعايت نشود می تواند باعث بسياری مشکلات شود.
در يک کلاس ۳ نوع دسترسی وجود دارد :
۱- Public:در اين نوع دسترسی هيچ محدوديتی اعمال نمی شود و هر چيزی چه داخلی و چه خارجی می تواند از ان استفاده کند (فعلا قصد بنده معرفی دسترسی ها می باشد و برای توضيحات عميق تر لازم به دانستن يک سری مطالب ديگر است که در روزهای آينده ذکر خواهد شد )
۲- Private: اين نوع دسترسی بر عکس نوع قبل عمل می کند . يعنی غير از توابع عضو اين کلاس هيچ چيز ديگری نمی تواند به آنها دسترسی داشته باشد . مثلا وقتی يک شئ از اين کلاس تعريف می کنيم از طريق شئ نمی توانيم مستقيما به ايم نوع متغييرها يا توابع دسترسی داشته باشيم اما خود توابع عضو اين کلاس ميتوانند در کد نويسی خود از اين نوع استفاده کنند که در آينده بيشتر آشنا خواهيم شد .
۳- Protected:در این نوع نیز شئی که از کلاس تعریف می شود نمی تواند به این نوع دسترسی داشته باشد . اين نوع تعريف خاص خود را دارد که بعد از بحث ارث بری قابل ذکر است و در اينجا تنها نامی از آن برای تکميل بحث آورده شده است .
*نکته قابل ذکر اين است که غالبا از دو نوع ۱و۲ استفاده می شود و از نوع ۳ خيلی کم استفاده خواهيد کرد .
در کلاس این انواع دسترسی با ۳ کلمه کلیدی ذکر شده تعیین می شوند :
اگر در ابتدای کلاس باشیو و هیچ کدام را ننویسیم متغییرها و توابع تعریفی تا کلمه کلیدی دیگر همه private محسوب می شوند تا زمانی که از یکی از دو کلمه دیگر استفاده شود . بعد از آن نیز بقیه از این کلمه استفاده شده تبعیت می کنند تا کلمه کلیدی بعدی .
------------------------------------------------------------------------------------------
در ادامه يک نمونه مثال از سطح دسترسی آورده شده و در ادامه آن مثالهای اشتباه و درست نيز آورده شده است :

class Cat
}
;int a,b
;(void setage(int age
:public
;int c,d
;(void setlength(int length
:protected
;int e
;(void setwidth(int width
}

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

در بالا يک نمونه کلاس آورده شده حالا يک شئ از آن تعريف کرده و مثالهای درست و غلط را ذکر ميکنم :

;Cat m

مثالهای درست :

;m.a=10
;m.b=80
;()m.setage

مثالهای غلط :

;m.b=20
;m.c=13
;()m.setlength
;m.e=90
;()m.setwidth

لينک مقاله
http://visualc6.persianblog.com :منبع

مقالات مرتبط با اين موضوع
نمايش Menu روی Tray Icon | c
Modless Dialog | c
Tray Icon | c
DialUp | c
مقدمه ای بر پردازش تصوير | c
تغيير رنگ پس زمينه ديالوگ | c
Socket - Socket Programming چيست ؟ | c
توابع مجازی | c
ارث بری کلاسها ( مشتق کردن کلاسی از کلاس دیگر ) | c
چند ريختی Polymorphism | c
سازنده ها و مخربها در يک کلاس | c
سطح دسترسی در کلاسها | c
کلاس چیست ؟include | c

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


سازنده ها و مخربها در يک کلاس
در يک کلاس توابعی تعريف ميشه که یه دسته درست در هنگام ايجاد يک شئ از آن کلاس و
دسته ديگر درست قبل از از بين بردن يک شئ از يک کلاس اجرا می شوند .
دسته اول را سازنده یا Constractor و دسته دوم را مخرب يا Destractor گويند .

==============
اگر توابعی به عنوان سازنده و مخرب تعريف نشود . کامپايلر توابع پيش فرضی را ايجاد می کند که تنها وجود دارند و هيچ کار خاصی انجام نمی دهند اما شما می توانيد سازنده يا مخرب دلخواه خود را بنويسيد که درست قبل ايجاد شئ اجرا شوند يا درست قبل از تخريب شئ اجرا شوند .
=============
برای روشن شدن مطلب یه مثال می زنم :
شاید شما بخواهید وقتی یک شئ ایجاد می کنید به یه تعداد معلوم یا نا معلومی متغییر به صورت دینامیکی از سیستم بگیرید . برای این کار آن را داخل تابع سازنده خود قرار می دهید .
حال وقتی این برنامه به اتمام می رسد یا این شئ از بین برده می شود باید این حافظه دینامیک به سیستم برگشت داده شود . پس تابعی به نام مخرب می نویسیم که قبل از اینکه شئ از بین برود حافظه را آزاد کند و به سیستم تحویل دهد .
=============
اما چگونه بنویسیم ؟؟؟
در یک کلاس اگر تابعی با نام آن کلاس بنویسید به عنوان سازنده محسوب می شود و قبل ایجاد شئ حتما یک بار اجرا می شود .
مثلا نام کلاس شما Cat.h باشد :
سازنده شما باید تابعی به نام Cat باشد که ممکن است ورودی و یا خروجی داشته ویا نداشته باشد که به اختیار شما است .
مخرب نیز مشابه به سازنده است با یک تفاوت در نام آن که در ابتدای نام تابع حرف(~) و سپس نام کلاس نوشته می شود و بقیه ماجرا ...

++++++++++++++++++++++
اگر به یاد داشته باشید دردرسهای قبل گفته شد که در یک کلاس فقط تعریف تابع آورده می شود و خود تابع در یک فایل با پسوند cpp نوشته می شود . اما یک استثنا وجود دارد به نام توابع In Line یا یک خطی ::
می توان توابع کوتاه در حد یکی دو خط را همانجا در کنار تعریف تابع در کلاس مورد نظر نوشت .
***این معمولا برای سازنده ها و مخربهای کوتاه کاربرد دارد و لطفا از این سوء استفاده نکنید

***
مثال :

} class Cat
:public
{void Cat(void){int a=10
{void ~Cat(void){a=20
}

البته اين تنها يک مثال است و هر کار ديگری نيز می توانيد در سازنده و مخرب به عنوان يک تابع انجام دهيد .
لينک مقاله
http://visualc6.persianblog.com :منبع

مقالات مرتبط با اين موضوع
نمايش Menu روی Tray Icon | c
Modless Dialog | c
Tray Icon | c
DialUp | c
مقدمه ای بر پردازش تصوير | c
تغيير رنگ پس زمينه ديالوگ | c
Socket - Socket Programming چيست ؟ | c
توابع مجازی | c
ارث بری کلاسها ( مشتق کردن کلاسی از کلاس دیگر ) | c
چند ريختی Polymorphism | c
سازنده ها و مخربها در يک کلاس | c
سطح دسترسی در کلاسها | c
کلاس چیست ؟include | c

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


چند ريختی Polymorphism
چند ريختی يا Polymorphism يکی از خواص جالب در ++C محسوب ميشه .
شما نمی تونيد توابعی با اسامی يکسان داشته باشيد مگر در يک حالت استثناء
اون هم مسئله چند ريختی هستش .
يعنی چند تابع مختلف با يک اسم يکسان تعريف می کنيد اما بايد دقت داشته باشيد که در مقادير ورودی توابع متفاوت باشند .
مثال :

}(void set(int a
; int b
;b=a
}
*************
}(void set(float s
; float m
;m=s
}
*************
}(int set(int f,int g
; int j,k
;j=f
;k=g
; return k+j
}
*************

در مثالهای بالا دقت کنيد که اسم توابع يکسان است و تنها در موقع صدا زدن آنها با توجه به نوع ورودی تابع , تابع مورد نظر اجرا می شود .
مثال :
اگر بنويسيم ;(set (1 تابع اولی اجرا ميشود

اگر بنويسيم ;(set (5.1 تابع دومی اجرا ميشود

اگر بنويسيم ;(set (90, 8 تابع سومی اجرا ميشود و مقدار ۹۸ را بر می گرداند.
لينک مقاله
http://visualc6.persianblog.com :منبع

مقالات مرتبط با اين موضوع
نمايش Menu روی Tray Icon | c
Modless Dialog | c
Tray Icon | c
DialUp | c
مقدمه ای بر پردازش تصوير | c
تغيير رنگ پس زمينه ديالوگ | c
Socket - Socket Programming چيست ؟ | c
توابع مجازی | c
ارث بری کلاسها ( مشتق کردن کلاسی از کلاس دیگر ) | c
چند ريختی Polymorphism | c
سازنده ها و مخربها در يک کلاس | c
سطح دسترسی در کلاسها | c
کلاس چیست ؟include | c

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


ارث بری کلاسها ( مشتق کردن کلاسی از کلاس دیگر )
ارث بری همونطور که از اسمش کاملا پيداست همانند قانون ارث بردن در موجودات زنده عمل می کند , يعنی همانند طبيعت يک کلاس به عنوان کلاس پدر (مادر) فرض می شود و يک کلاس به عنوان فرزند از اين کلاس يک سری خصوصيات و قابليتها را به ارث می برد (فرزند نیز دارای بعضی امکانات پدر می شود . البته میزان آن بستگی به خواست ما دارد که توضیح خواهم داد )
کلاس پدر را کلاس پایه گویند Base Class .
ارث بری را مشتق کردن نیز می گویند .

+++++++++++++++++++++++++++++++++
نحوه مشتق کردن یک کلاس از کلاس دیگر :
فرض می کنیم کلاسی با نام A وجود دارد :

} class B :(type) A
; int a,d
:public
;(void Rotate (void
}

نوشته بالا يعنی کلاس B از کلاس A با دسترسی نوع (type) که توضيح خواهم داد که نوع دسترسی ۳ دسته است مشتق شده یا خصوصیات و قابلیتهای آن را به ارث برده است .
۳ نوع دسترسی برای مشتق کردن وجود دارد که عبارتند از :
۱- public
۲- protected
۳- private
يعنی يکی از سه کلمه بالا به جای (type ) نوشته خواهد شد.

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

۱- public :
يعنی تمام خواص عمومی و خصوصی کلاس پايه را به همان شکل به ارث می برد . بدين شکل که موارد public در کلاس مبنا (پايه) برای اين کلاس جديد نيز وجود دارد و برای اين نيز public خواهد بود . و تمام خواص protetted و private نيز به همين شکل می باشد که در کلاس جديد نیز هر کدام protected و private خواهند بود .
نکته مهم : در این نوع دسترسی توابع عضو کلاس جدید اجازه دسترسی به خواص protected کلاس مبنا را دارند اما به خواص private خیر !! دسترسی ندارند .

۲- protected :
در این نوع دسترسی , کلاس جدید خواص کلاس مبنا را به این شکل به ارث می برد که تنها توابع عضو کلاس جدید به فقط خواص public و protected کلاس مبنا دسترسی دارند و به خواص private دسترسی ندارند .

۳- private :
این نوع دسترسی یعنی نه شئی از کلاس جدید و نه تابع عضو کلاس جدید به هیچ چیز از کلاس مبنا دسترسی ندارند !! ( عملا یعنی این نوع دسترسی یعنی اصلا مشتق نکنیم سنگین تریم!!! )

نکته بسیار مهم :
ارث بری میتواند به گونه ای باشد که یک کلاس از تعداد بیش از ۱ کلاس ارث ببرد ( مشتق شود ) . مثلا :

}class B: public A , public C , protected D , public E , private F
.
.
.
.
}

+++++++++++++++++++++++++++++++++++++++++++++
تا اينجا ارث بری تقريبا مطرح شد و موارد بعدی که بايد توضيح بدم شديدا با ارث بری رابطه مستقيم دارند . مثل توابع مجازی virtual که در جلسات بعدی مطرح خواهم کرد .
لينک مقاله
http://visualc6.persianblog.com :منبع

مقالات مرتبط با اين موضوع
نمايش Menu روی Tray Icon | c
Modless Dialog | c
Tray Icon | c
DialUp | c
مقدمه ای بر پردازش تصوير | c
تغيير رنگ پس زمينه ديالوگ | c
Socket - Socket Programming چيست ؟ | c
توابع مجازی | c
ارث بری کلاسها ( مشتق کردن کلاسی از کلاس دیگر ) | c
چند ريختی Polymorphism | c
سازنده ها و مخربها در يک کلاس | c
سطح دسترسی در کلاسها | c
کلاس چیست ؟include | c

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


توابع مجازی
توابع مجازی يا Virtual Functions در ارث بری توابع کاربرد دارند که توضيح خواهم داد .
در هنگام تعريف يک تابع در يک کلاس شما می توانيد در ابتدای تعريف تابع کلمه کليدی
virtual رو برای مجازی کردن تابع استفاده کنيد . مثال :

}class A
.
.
.
:public
;(virtual void setage(int age
.
.
.
}

نکته : کاربرد توابع مجازی مانند توابع حقيقی است و هيچ فرقی ندارد ( در حالت عادی)

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

اگر شئی از کلاس مشتق شده تعريف شود و تابع مشترک اين دو کلاس که در اولين کلاس مجازی است فراخوانی شود : تابع متعلق به کلاس مشتق شده اجرا خواهد شد .
این نوع توابع در مواردی کاربد دارد که شما تشخیص می دهید که ممکن است در بعضی شرایط نیاز باشد که تابعی که در کلاس پایه تعریف میکنید تغییر ساختار موقتی داشته باشد برای یک کاربرد خاص.
لينک مقاله
http://visualc6.persianblog.com :منبع

مقالات مرتبط با اين موضوع
نمايش Menu روی Tray Icon | c
Modless Dialog | c
Tray Icon | c
DialUp | c
مقدمه ای بر پردازش تصوير | c
تغيير رنگ پس زمينه ديالوگ | c
Socket - Socket Programming چيست ؟ | c
توابع مجازی | c
ارث بری کلاسها ( مشتق کردن کلاسی از کلاس دیگر ) | c
چند ريختی Polymorphism | c
سازنده ها و مخربها در يک کلاس | c
سطح دسترسی در کلاسها | c
کلاس چیست ؟include | c

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


Socket - Socket Programming چيست ؟

در ارتباطات شبکه قراردادهايی استفاده می شود تحت عنوان Protocol ,
پروتکولهای مختلفی ايجاد شده اما در ارتباطات اينترنتی و شبکه هايی که ارتباط ۲ طرفه است
بيشتر از نوع( TCP/IP ) استفاده ميشه که اساس اون به صورت خيلی مختصر اينه که برای هر
کامپيوتر که به شبکه (که اینترنت هم یه شبکه هستش !!) وصله يه IP مخصوص به خودش رو داره و به نوعی آدرس اون کامپيوتر محسوب ميشه که تمام خصوصيات يه آدرس رو که ميشه متصور شد داراست .
اما چرا گفتم در شبکه هايی که ارتباط ۲ طرفه نيازه از ( TCP/IP ) استفاده ميشه ؟
چون انواع ديگری هم از جمله UDP هستند که تقريبا ارتباط يکطرفه ميباشد مثلا برای پخش برنامه های راديويی .
-----------------------------------------------------------------------------------
اصلی ترين عامل در يک ارتباط شبکه ای Socket ميباشد که اعمال شبکه را بصورت خواندن و
نوشتن در يک فايل شبيه سازی نموده است . سوکت در اصل مانند يک کانال ارتباطی است
که ميان دو نقطه ايجاد شده و پيغامها رد و بدل ميشود.
برای داشتن يک ارتباط شبکه ای بايد يک سوکت ايجاد کنيم ( منظور نرم افزاری هستشا !! )
که لازمه اين کار اينه که بدانيم برای گوش دادن داريم ايجاد ميکنيم يا برای فرستادن پيام .
اگه برای فرستادن پيام باشه که پر واضحه که نياز به آدرس مقصد داريم . اما اين کافی نيست !!!
امروزه آپارتمان نشينی رونق گرفته و تو کامپيوتر هم نفوذ کرده !!!!
برای فرستادن نامه امروزه تنها آدرس ساختمون طرف کافی نيست و نياز به شماره واحد اون هو هست .
اين فقط يه تمثيل بود ! درسته تو کامپيوتر هم فقط IP کافی نيست و شماره واحد برنامه ای که گوش به زنگه هم نيازه که به اون Port ميگن . يعنی شماره پورت هم نيازه .
اما يه چيز يادم رفت بگم که IP از ۴ عدد ۰تا۲۵۵ تشکيل شده که با نقطه از هم جدا ميشن مثلا : ۱۶۸.۲۳.۵۶.۹۸ يه IP هستش . اما پورت اعدادی بين ۱ تا (بصورت رایج) ۶۵۰۰۰ را ميتونه شامل بشه .(بله بزرگتر از این عدد هم میتونه شماره پورت بشه اما چه کاریه !!!)

اينجا ممکنه يه سوال پيش بياد که مگه نه اينکه هر کامپيوتر فقط يه IP داره پس يعنی در يه لحظه آيا فقط به يه کامپيوتر ميتونه وصل شه ؟؟
جواب منفی است
درسته که IP يکی بيشتر نيست اما تعداد معتنابهی پورت داريم
يعنی با هر پورت به يه کامپيوتر متصل ميشيم و ميتونيم تا ۶۵۰۰۰ (می دونم بیشتره ;-) ) ارتباط از صدقه سری پورتها داشته باشيم .

اما اگه سوکت برای گوش دادن باشه تنها کافیه که برای ایجاد سوکت بگیم با چه شماره پورتی می خوایم ایجادش کنیم .
-----------

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

در برنامه نويسی سوکت ۲ نوع ارتباط خواهيم داشت :

الف ) در هنگام دريافت يا ارسال پيغام تمام برنامه متوقف می شود که در بسیاری از موارد اصلا مطلوب نيست

ب) بر اساس Event پايه گذاری می شود که هر موقع پيغامی منتظر دريافت شدن بود آنرا دريافت کند و هر موقع پيغام آماده فرستادن بود آنرا بفرستد و کل برنامه از کار نيافتد که در اکثر موارد اين روش استفاده می شود .

-----------------------------------------------
تمام نيازهای مارا يک کلاس به نام CAsyncSocket تامين می کند . که با ساختن شئ از آن می توانيم به امکاناتی نظير send , Receive ,... دسترسی داشته باشيم که مفصلترش رو توضيح خواهم داد . که هرچی بعد از این از توابع اسم میبرم مربوط به این کلاس هستش

برای اين نوع ارتباط که داريم بحث می کنيم ۲ جور سوکت بايد بسازيم :

۱- برای فرستادن
۲- برای گوش دادن یا همون دریافت

برای ايجاد سوکت از متد;( ) Create استفاده میشه که ۲ نوع آن به این شکل است که :
۱
- برای نوع فرستادن تنها کافیست که این متد بدون پارامتر صدا زده شود : ;( ) Create
۲- برای نوع دریافت کردن ۱ پارامتر نیاز دارد و آن شماره پورت برای دریافت کردن میباشد که به طور مثال :;( ۱۷۵۳) Create

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

بعد از ایجاد سوکت کار بعدی وصل شدن به برنامه مقصد هستش که منتظر دریافت پیغام هستش .
این کار از جانب فرستنده پیغام شروع میشه که باید متد;( ) Connect صدا زده بشه .
این متد ۲ پارامتر نیاز دارد :

۱- IP کامپیوتر مقصد یا آدرس تحت وب آن مثلا :" www.taraf.com" ( اگر در یک شبکه محلی میخواید وصل بشید اسم کامپیوتر هم میتونه جای IP به کار بره ) که بصورت یه رشته خواهد بود
۲- شماره پورت کامپيوتر مقصد که گوش به زنگ هستش

مثلا : ;(۱۳۶۵,"192.۱68. 12 .39")Connect

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

اما قبل وصل شدن نيازه که گوش به زنگ بشيم تا بتونيم درخواستهای اتصال رو جواب بديم برای اين کار از متد;( ) Listen بدون هيچ پارامتری استفاده ميکنيم تا سوکت دريافت آماده بشه .

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

حالا که به اينجا رسيديم وقتی تقاضای وصل شدن از سمت يه کامپيوتر ديگه به ما ميرسه رو بايد قبول کنيم :
گوش به زنگ هستيم که اگه تقاضايی رسيد با متد ;( ) Accept قبولش کنيم
اين متد يه پارامتر ميگيره و اون يه شئ از کلاس CAsyncSocket هستش که وظيفه دريافت متن پيغامهای بعد از متصل شدن رو به عهده ميگيره .

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

برای فرستادن پيغام از متد ;( ) Send استفاده ميکنيم که ۲ پارامتر ميگيرد :

۱- اشاره گر به بافر داده مورد نظر برای فرستادن است که با استفاده از تابع;(‌ ) LPCTSTR استفاده ميکنيم که يک پارامتر ورودی دارد و آن متغييری است که پيغام ما در آن است .
۲- طول بافر که همان طول پيغام می باشد

مثلا اگه پيغام در متغييری به نام str باشه به شکل زير ميفرستيم :
; (()str.GetLengthو(Send(LPCTSTR(str

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

وقتی پیغام به گوش دهنده برسه یه Eventبه نام;( ) OnReceive فعال میشه که با متد ;( )Receive پيغام را دريافت می کند که ۲ پارامتر می گيرد :

۱- اشاره گر به يک بافر که ميتواند يک رشته کاراکتری باشد
۲- طول بافر مورد نظر که به چه طولی از پيغام را مي خاهيم دريافت کنيم

بعد از اتمام کار با سوکت باید انرا ببندیم که این کار با متد ;( ) Close صورت میگیرد.
لينک مقاله
http://visualc6.persianblog.com :منبع

مقالات مرتبط با اين موضوع
نمايش Menu روی Tray Icon | c
Modless Dialog | c
Tray Icon | c
DialUp | c
مقدمه ای بر پردازش تصوير | c
تغيير رنگ پس زمينه ديالوگ | c
Socket - Socket Programming چيست ؟ | c
توابع مجازی | c
ارث بری کلاسها ( مشتق کردن کلاسی از کلاس دیگر ) | c
چند ريختی Polymorphism | c
سازنده ها و مخربها در يک کلاس | c
سطح دسترسی در کلاسها | c
کلاس چیست ؟include | c

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


تغيير رنگ پس زمينه ديالوگ

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

اين کار مستقيما توی ويزارد نيست اما با يک خط کد نويسی قابل انجام هستش !

پوزه شما ۲ تا فايل cpp اصلی داره که عبارتند از projectname.cpp و projectnameDlg.cpp که منظور از projectname نام پروژه ای هستش که انتخاب کرديد.

توی فايل projectname.cpp قبل ار دستور;() int nResponse = dlg.DoModal کافيه اين يک خط رو بنويسيد :

;(( SetDialogBkColor(RGB(255,0,123),RGB(12,56,212

RGB اول رنگ پس زمينه را مشخص ميکنه و RGB دوم رنگ متن ديالوگ رو تعيين می کنه .
لينک مقاله
http://visualc6.persianblog.com :منبع

مقالات مرتبط با اين موضوع
نمايش Menu روی Tray Icon | c
Modless Dialog | c
Tray Icon | c
DialUp | c
مقدمه ای بر پردازش تصوير | c
تغيير رنگ پس زمينه ديالوگ | c
Socket - Socket Programming چيست ؟ | c
توابع مجازی | c
ارث بری کلاسها ( مشتق کردن کلاسی از کلاس دیگر ) | c
چند ريختی Polymorphism | c
سازنده ها و مخربها در يک کلاس | c
سطح دسترسی در کلاسها | c
کلاس چیست ؟include | c

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


مقدمه ای بر پردازش تصوير

اولين گام پردازش تصوير کار با رنگ نقاط (pixel) هستش. اما بايد بگم توی حالت عادی شما ۳ درجه رنگی از ۳ رنگ اصلی آبی و سبز و قرمز برای هر نقطه داريد که با کم و زياد شدن شدت هر مولفه اصلی رنگ حاصل تغيير ميکنه . اما تو پردازش تصوير اين فرمت اصلا به درد نمی خوره ! دليلش اينه که شما معمولا نياز به تشخيص يه محدوده رنگی خاص داريد مثلا رنگ حول و حوش صورتي, حالا با ۳ رنگ اصلی چطور می خوايد اين محدوده رو تعيين کنيد ؟! ميشه گفت محاله ممکنه يا بهتر بگم اصلا عقلانی نيست دنبالش بريد.!!!

پس بايد دنبال شيوه ای برای اون باشيم!

برای هر رنگ ما ۳ مشخصه می تونيم نام ببريم :

۱- نام رنگ (چيز بهتری گير نيووردم بهش بگم -> Hue ) :

اين يعنی اينکه رنگ چيه ! مثلا ميگی آبی يا آبی يکم متمايل به سبز يا ....

۲- شدت رنگ :

اگه دقت کرده باشيد هر رنگ ميتونه پر رنگ يا کم رنگ باشه اما ماهيت ذاتی اون يه چيزه و فقط کم رنگ تر يا پررنگ تر شده به اين ميگن -> Saturation

۳- روشنايی يا تيرگی رنگ :

يه رنگ رو می تونيد بهش نور بتابونيد که روشناييش زياد بشه يا نور رو کم کنيد که روشناييش کم بشه که ميتونه انقدر کم بشه که سياه بشه !! به اين ميگن->Intensity

اميدوارم تونسته باشن خوب برسونم منظورم چيه !

پس يه حوضه جديد که الهام گرفته از چشم هستش رو باهاش آشنا شديم که کار روی رنگها برای تصميم گيری روی مشخصات اون رو راحت ميکنه. به اين حوضه رنگی اصطلاحا HSI ميگن که مخفف اون ۳کلمه بالاست. شکل زير نمودار تغييرات رنگ رو با توجه به اين ۳ مولفه نشون ميده:

H بين ۰ تا ۳۶۰ هستش يعنی از قرمز تا سبز ۱۲۰ درجه و از سبز تا آبی ۱۲۰درجه و از آبی تا قرمز ۱۲۰ درجه در جهت خلاف جهت حرکت عقربه های ساعت.

S بين ۰ تا ۱۰۰ هستش که از کم رنگ (۰) تا پر رنگ (۱۰۰)

I از ۰ تا ۱۰۰ هستش يعنی از تاريک(۰) تا روشن(۱۰۰)

چند نمونه از رنگها در ۲ حوضه مذکور :

رنگ | RGB مقادیر | HSI مقادير
سياه | (255,255,255) | (0,0,0)
سفيد | (255,255,255) | (0,0,100)
قرمز | (255,0,0) | (0,100,100)
سبز | (0,255,0) | (120,100,100)
آبی | (0,0,255) | (240,100,100)
! قهوه ای | (64,128,128) | (180,50,50)

حالا نياز به اين داريم که RGB مربوط به هر نقطه را به HSI تبديل کنيم که رابطش رو به صورت سی نوشتم که r,g,b همون ۳ رنگ آبی و سبز و قرمز هر نقطه هستش:

int min,max;

/////////////////////

if(r>g)

{

max=r;

min=g;

}

else

{

max=g;

min=r;

}

if(b>max)

max=b;

if(b<min )

min=b;

////////////////////

if(max==0)

{

i=0;

s=0;

h=0;

}

else

{

i=max*100/255;

s=(max-min)*100/max;

h=180*acos((((r-g)+(r-b))/2)/sqrt(pow(r-g,2)+(r-b)*(g-b)))/3.1415;

if(b>g)

h=360-h;

}
لينک مقاله
http://visualc6.persianblog.com :منبع

مقالات مرتبط با اين موضوع
نمايش Menu روی Tray Icon | c
Modless Dialog | c
Tray Icon | c
DialUp | c
مقدمه ای بر پردازش تصوير | c
تغيير رنگ پس زمينه ديالوگ | c
Socket - Socket Programming چيست ؟ | c
توابع مجازی | c
ارث بری کلاسها ( مشتق کردن کلاسی از کلاس دیگر ) | c
چند ريختی Polymorphism | c
سازنده ها و مخربها در يک کلاس | c
سطح دسترسی در کلاسها | c
کلاس چیست ؟include | c

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


DialUp

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

اول که بايد يه پروژه جديد بسازيد و ۳ تا edit box برای اطلاعات يوزر و پسورد و شماره تلفن.

اولين کاری که بايد کنيد اينه که ۱-۲ کلاس رو به پروژه اضافه کنيد که با ۲خط زير انجام ميديد:

#include "ras.h"
#include "raserror.h"

حالا ۲ تا دکمه بگذاريد برای وصل شدن و قطع ارتباط.

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

RASDIALPARAMS rdParams;// متغييری(شئی) است برای دادن اطلاعات مورد نياز برای کانکت به اينترنت
rdParams.dwSize = sizeof(RASDIALPARAMS);
rdParams.szEntryName[0] = '\0';
lstrcpy( rdParams.szPhoneNumber, m_strPhoneNumber );//در اين قسمت شماره تلفن را مقدار دهی ميکنيم
rdParams.szCallbackNumber[0] = '\0';
lstrcpy( rdParams.szUserName, m_strUserName );//در اين قسمت يوزررا مقدار دهی ميکنيم
lstrcpy( rdParams.szPassword, m_strPassword );//در اين قسمت پسورد را مقدار دهی ميکنيم
rdParams.szDomain[0] = '\0';

HRASCONN hRasConn = NULL;//اين متغيير برای نسبت دادن يک هندل به اين کانکشن در صورت موفقيت خوهد بود که بتوان در آينده از آن استفاده کرد مثلا آنرا قطع کرد
DWORD dwRet = RasDial( NULL, NULL, &rdParams, 0L, NULL, &hRasConn );//در اين قسمت شروع به شماره گيری ميکند و نتيجه شماره گيری بازگردانده می شود که در صورت موفقيت صفر و در غير اين صورت شماره خطلا خواهد بود
if ( dwRet == 0 ) return true;
char szBuf[256];
if ( RasGetErrorString( (UINT)dwRet, (LPSTR)szBuf, 256 ) != 0 )//اگر منجر به خطا شد با استفاده از شماره خطا متن خطا را بدست آمرده نمايش می دهيم و کانکشن را می بنديم
wsprintf( (LPSTR)szBuf, "Undefined RAS Dial Error (%ld).", dwRet );
RasHangUp( hRasConn );
MessageBox( (LPSTR)szBuf, "Error", MB_OK | MB_ICONSTOP );
return false;

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

RASCONN ras[20];
DWORD dSize, dNumber;
char szBuf[256];

connected=false;
ras[0].dwSize = sizeof( RASCONN );
dSize = sizeof( ras ); // Get active RAS - Connection
DWORD dwRet = RasEnumConnections( ras, &dSize, &dNumber );
if ( dwRet != 0 )
{
if ( RasGetErrorString( (UINT)dwRet, (LPSTR)szBuf, 256 ) != 0 )
wsprintf( (LPSTR)szBuf, "Undefined RAS Enum Connections error (%ld).", dwRet );
MessageBox( (LPSTR)szBuf, "RasHangUp", MB_OK | MB_ICONSTOP );
return false;
}
bool bOK = true;
for( DWORD dCount = 0; dCount < dNumber; dCount++ )
{ // Hang up that connection
HRASCONN hRasConn = ras[dCount].hrasconn;
DWORD dwRet = RasHangUp( hRasConn );
if ( dwRet != 0 )
{
char szBuf[256];
if ( RasGetErrorString( (UINT)dwRet, (LPSTR)szBuf, 256 ) != 0 )
wsprintf( (LPSTR)szBuf, "Undefined RAS HangUp Error (%ld).", dwRet );
MessageBox( (LPSTR)szBuf, "RasHangUp", MB_OK | MB_ICONSTOP );
bOK = false;
}
}
return bOK;

با اين ۲ تابع ساده ميتونيد به اينترنت متصل شيد. اما نکاتی که هست اينه که :

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

دوماً اينکه ايکون اتصال هم نمايش داده نميشه و دست شمارو باز ميگذاره که هرجور دوست داريد اعمال سليقه کنيد.
لينک مقاله
http://visualc6.persianblog.com :منبع

مقالات مرتبط با اين موضوع
نمايش Menu روی Tray Icon | c
Modless Dialog | c
Tray Icon | c
DialUp | c
مقدمه ای بر پردازش تصوير | c
تغيير رنگ پس زمينه ديالوگ | c
Socket - Socket Programming چيست ؟ | c
توابع مجازی | c
ارث بری کلاسها ( مشتق کردن کلاسی از کلاس دیگر ) | c
چند ريختی Polymorphism | c
سازنده ها و مخربها در يک کلاس | c
سطح دسترسی در کلاسها | c
کلاس چیست ؟include | c

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


Tray Icon

کنار ساعت ويندوز رو نگاه کن چند تا ازشون ميبينی . آره همون آيکون ها رو می گم.

خيلی کار راحتيه!

اول خط زير يادتون نره :

#include <SHELLAPI.H>

برا اينکار يه آيکون درست کنيد يا از همون آيکون استاندارد فعلا استفاده کنيد و ID اونو از قسمت resource و در پوشه Icon پيدا کنيد. بصورت استاندارد يه آيکون با ID

(IDR_MAINFRAME) ايجاد ميکنه که آيکون MFC هستش.

حالا بايد در اين ۳ خط زير هر جا IDI_ICON1 که آی دی انتخابی من برا آيکون مورد نظرم بوده, آی دی آيکون خودتون رو بگذاريد:

HICON hIcon;

HINSTANCE hInst = AfxFindResourceHandle(MAKEINTRESOURCE(IDI_ICON1),RT_GROUP_ICON);

hIcon = (HICON)LoadImage(hInst,MAKEINTRESOURCE(IDI_ICON1),IMAGE_ICON,16,16,LR_DEFAULTCOLOR);

hIcon رو قراره به يه تابع بديم که بدونه کدوم آيکون رو ميخواهيم برامون بگذاره.

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

NOTIFYICONDATA myicon;

با اين متغيير يکسری اطلاعات به تابع مربوط به کار مورد نظر ما پاس ميشه.

حالا مقاديری که بايد مقدار دهی کنيد رو دونه دونه جلوی هر خط مثال زير توضيح ميدم :

myicon.hWnd=this->GetSafeHwnd();//هندلی به ديالوگی می خوايد پيغامهای ويندوز به اون منتقل بشه که برای استفاده از منو روی آيکون مورد نظر اهميت پيدا ميکنه

myicon.cbSize=sizeof(NOTIFYICONDATA);//رو که مقدار دهی ميکنه که هميشه همينهNOTIFYICONDATAاندازه متغيير

myicon.uFlags=NIF_MESSAGE | NIF_ICON | NIF_TIP | NIF_INFO;// امکاناتی که می خوايد اين آيکون داشته باشه از جمله پيغامهای ويندوز و نمايش خود آيکون و نمايش بالون محتوی توضی در مورد آيکون

myicon.uCallbackMessage=IDD_DIALOG1;// آی دی ديالوگی که پيغامهای ويندوز به اون منتقل ميشه

myicon.hIcon=hIcon;//متغييری که بالا برای آيکون خودمون تنظيم کرديم

myicon.szInfoTitle="My Title";//تيتر بالونی که روی آيکون ايجاد ميشه

myicon.szInfo="My information";// متن اصلی بالونی که روی آيکون ايجاد ميشه

myicon.szTip="Mouse over information (Tool Tip !)";// متنی که وقتی موس روی آيکون نگهداشته ميشه نشمون ميده

myicon.uTimeout=20;// زمانی که بالون نمايش داده ميشه

Shell_NotifyIcon(NIM_ADD,&myicon);// با اين تابع آيکون در کنار ساعت نمايش داده ميشه

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

ShowWindow(SW_HIDE);

** نکته:

بايد بگم که موارد بالون و ToolTip در VisualC++6 با مشکل همراه هستش و ظاهرا support نمی کنه و بايد اين رو توی VisualC++.NET انجام بديد !
لينک مقاله
http://visualc6.persianblog.com :منبع

مقالات مرتبط با اين موضوع
نمايش Menu روی Tray Icon | c
Modless Dialog | c
Tray Icon | c
DialUp | c
مقدمه ای بر پردازش تصوير | c
تغيير رنگ پس زمينه ديالوگ | c
Socket - Socket Programming چيست ؟ | c
توابع مجازی | c
ارث بری کلاسها ( مشتق کردن کلاسی از کلاس دیگر ) | c
چند ريختی Polymorphism | c
سازنده ها و مخربها در يک کلاس | c
سطح دسترسی در کلاسها | c
کلاس چیست ؟include | c

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


Modless Dialog

مطلب امروز در مورد پنجره های Modless هستش.

شايد بگيد يعنی چی !!!

اگه دقت کرده باشيد معمولا پيغامهای خطا يا هشدار دهنده به شکلی هستند که وقتی نمايش داده ميشوند ديگه نمی تونيد به پنجره برنامه اصلی دسترسی داشته باشيد و غير فعال می شود تا زمانی که به اون پيغام خطا يا هشدار يه جواب مناسب (حالا از OK گرفته تا Yes و No ) بدهيد. به اينگونه نمايش يه پنجره (همون پيغام خطا خودش يه پنجره هستش ديگه) روش Modal ميگن.

حالا بعضی مواقع نياز داريد که پنجره هايی رو نشون بديد که همزمان نياز باشه که هم روی پنجره اصلی برنامه و هم روی اين پنجره جديد نمايش داده شده کار شود (يه مثال خوب و روشن برای اين نوع ياهو مسنجر هستش که اين صفحه اصلی رو در ابتدا داريد و به ازای هر PM که باز می کنيد يا به شما داده ميشه يه پنجره باز ميشه که بايد بتونيد روی هرکدوم که خواستيد کار کنيد ) به اين نوع نمايش پنجره Modless ميگن.

کار خيلی راحت و کوتاه هستش.

اول که خب بايد ديالوگتون و کد های مربوط رو بنويسيد!

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

CDialog *MyDlg=new CDialog();

MyDlg->Create(IDD_ABOUTBOX,0);

MyDlg->ShowWindow(true);

توضيحات :

IDD_ABOUTBOX مربوط به ID ديالوگ اصلی شما ميشود که حالا اينجا من برای سادگی کار خواستم ديالوگ About که بصورت پيش فرض ساخته ميشه رو نشون بدم !

اگه دقت کنيد تابع Create از شما ۲ تا پارامتر می خواد که با اولی آشنا شديد. اما دومی چيه ؟! بايد بگم اگه دومی رو مقدار ۰ يا همون NULL قرار بديد فرض ميکنه که پدر ديالوگی که ميخواهيد نمايش بديد اون ديالوگی هستش که از اون قصد نمايش اين ديالوگ جديد رو داريد و يکم با اينکه يه ديالوگ مستقل باشه فرق ميکنه (مثلا اگه ديالوگ اصلی رو مينيمم کنيد اين هم همراه اون مينيمم ميشه و اگه اين جديد رو مينيمم کنيد ديگه روی TaskBar ديده نميشه و مثل پروژهای MDI انگار که ديالوگ اصلی شما برنامه Container اصلی باشد ديالوگ جديد به همون شکل مينيمم ميشه ! حالا تست کنيد بهتر دستگيرتون ميشه!). اما اگه بخواهيد عين صفحه PM در YAHOO! Messeneger وقتی ديالوگ جديد رو نمايش ميديد بر روی TaskBar هم ديده بشه بايد يه اشاره گر به Desktop بهش بديد که با تابع GetDesktopWindow که هيچ پارامتر ورودی هم نياز نداره اين کار ميسر ميشه.
لينک مقاله
http://visualc6.persianblog.com :منبع

مقالات مرتبط با اين موضوع
نمايش Menu روی Tray Icon | c
Modless Dialog | c
Tray Icon | c
DialUp | c
مقدمه ای بر پردازش تصوير | c
تغيير رنگ پس زمينه ديالوگ | c
Socket - Socket Programming چيست ؟ | c
توابع مجازی | c
ارث بری کلاسها ( مشتق کردن کلاسی از کلاس دیگر ) | c
چند ريختی Polymorphism | c
سازنده ها و مخربها در يک کلاس | c
سطح دسترسی در کلاسها | c
کلاس چیست ؟include | c

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


نمايش Menu روی Tray Icon

قرار بود نمايش Menu روی Tray Icon رو بگم. کار ساده تر از اين حرفاست.

توی کلاس ديالوگتون بصورت public تابع زير رو اضافه کنيد :

virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);

اين برا اينه که message ها رو handle کنيم (ديگه چون يکم عکس گذاشتن سختم بود دستی ميگم انجام بديد که عکس نخواد )

حالا تابع زير رو توی کد اصلی بنويسيد که قراره menu رو اينجا نمايش بديم :

LRESULT اسم کلاس برنامه تونDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{

return CDialog::WindowProc(message, wParam, lParam);
}

حالا بايد يه menu ساخته باشيد و با استفاده از ID اون و چند خط کد زير می تونيد menu رو نمايش بديد (اينجا من از پيغام کليک راست روی آيکون استفاده کردم) :

CMenu mymenu,*pmenu;
if (message == myicon.uCallbackMessage)
{
if(lParam==WM_RBUTTONDOWN)
{
mymenu.LoadMenu(IDR_MENU1);
pmenu=mymenu.GetSubMenu(0);
CPoint pos;
#ifdef _WIN32_WCE
pos = CPoint(GetMessagePos());
#else
GetCursorPos(&pos);
#endif
::TrackPopupMenu(pmenu->m_hMenu, TPM_TOPALIGN, pos.x, pos.y, 0,
this->GetSafeHwnd(), NULL);
mymenu.DestroyMenu();
pmenu->DestroyMenu();
}

**اما myicon.uCallbackMessage چيه ؟!

اگه يادتون باشه برای ايجاد tray icon يه شی با اسم myicon ساخته بوديم همونه که uCallbackMessage رو توش ست کرده بوديم.

**IDR_MENU1 هم ID منوی مورد نظر هستش.

همين !!
لينک مقاله
http://visualc6.persianblog.com :منبع

مقالات مرتبط با اين موضوع
نمايش Menu روی Tray Icon | c
Modless Dialog | c
Tray Icon | c
DialUp | c
مقدمه ای بر پردازش تصوير | c
تغيير رنگ پس زمينه ديالوگ | c
Socket - Socket Programming چيست ؟ | c
توابع مجازی | c
ارث بری کلاسها ( مشتق کردن کلاسی از کلاس دیگر ) | c
چند ريختی Polymorphism | c
سازنده ها و مخربها در يک کلاس | c
سطح دسترسی در کلاسها | c
کلاس چیست ؟include | c

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


معرفی SQL و دستورات عمومی آن
توسط SQL ميتوان درون يك بانك اطلاعاتي پرس و جو كرده (Query) و نتيجه را برگرداند. بانك اطلاعاتي شامل آبجكتي به نام جدول (Table) ميباشد.
ركوردها در بانكهاي اطلاعات در جداول ذخيره ميگردند.
جدول شامل سطر و ستون ميباشند.
در زير ميتوان يك جدول را مشاهده كرد :
Last Name First Name Address City
مثال:
Select Last name from persons
پر كاربرد ترين دستورات SQL شامل موارد زير است :
SELECT استخراج يك داده از بانك اطلاعاتي
UPDATE به روز رساني يك داده درون بانك
DELETE پاك كردن يك داده از بانك اطلاعاتي
INSERT وارد كردن يك داده جديد به بانك اطلاعاتي
همچنين در SQL ميتوان داده هايي نيز تعريف كرد :
CREATE TABLE ايجاد يك جدول جديد
ALTER TABLE تغيير دادن يك جدول
DROP TABLE پاك كردن يك جدول
CREATE INDEX ايجاد يك انديس
(كليد جستجو) DROP INDEX پاك كردن يك انديس

SQL و Active Server Pages - ASP :
SQL يكي از قسمتهاي خيلي مهم ASP ميباشد زيرا در ASP براي كار با بانكهاي اطلاعاتي از SQL استفاده ميشود. و توسط تكنولوژي ADO ميتوان از SQL در ASP استفاده كرد.
دستور SELECT :
SELECT column-name(s) FROM table-name
مثال :
نام جدول Persons است
Last Name First Name Address City
Hasani Ali Esfahan

دستور Select همراه با شرط

SELECT column FROM table WHERE column condition value
عملگر ها در SQL:
عملگر مفهوم
= معادل بودن
<> برابر نبودن
> بزرگتر

دستور DISTINCT (جداسازي) :

SELECT DISTINCT column-name(s) FROM table-name
مثال :
نام جدول Order است Company Order Number
sega 3412

--------------------------------------------------------------------------------
دستور Order By :

براي مرتب كردن سطرها
نام جدول Order است Company Order Number
sega 3412
ABS Shop 5678
w3s 3212
W3S 6778
مثال :
SELECT Company , OrderNumber

دستور Insert :

INSERT INTO Table-Name ( Column1 , Column2) VALUES

مثال :
DELETE FROM Person WHERE Lastname=’hasani’ نام جدول Persons است last name First name Adress city
alian hasani NO 40 Esfahan
Hasani Ali No 15 Tehran
نتيجه :
last name First name Adress city
alian hasani NO 40 Esfahan
SEGA
W3S
Trio

--------------------------------------------------------------------------------
دسترسي به يك پايگاه داده از يك صفحه ASP :

١-ايجاد يك ADO Connection به يك پايگاه داده
2-باز كردن Connection پايگاه داده
3-ايجاد يك
ADO Record Set 4-باز كردن
Record set 5-گرفتن داده هايي كه نياز داريم از
Record Set 6-بستن
Record Set 7-بستن
Connection

--------------------------------------------------------------------------------
1-ايجاد يك ADO Connection به يك پايگاه داده

١-1- روش DSN-LESS C:/InetPub/wwwroot/nor.mdb مسير فايل نمونه
< % var conn=Server. CreateObject ( “ADODB.
Connection”) Conn. Provider=” Microsoft . Jet . OLEDB.4.0” Conn.Open
(“C:/InetPub/wwwroot/nor.mdb”) % >

--------------------------------------------------------------------------------
2- روش ODBC

-2- روش ODBC : در اين روش ابتدا بايد يك ODBD Connection به Data Base ايجاد كنيم و سپس از طريق ADO به فايل DSN به طريق زير Connect كنيم.
< % var conn=Server. CreateObject

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

ايجاد يك ODBC Connection به پايگاه داده MS Access :

١- وارد شدن به ODBC از Control Panel
2- انتخاب
System DSN 3- كليك كردن روي دكمه ADD
4- انتخاب Microsoft Access Driver و كليك كردن روي دكمه
Finish 5- در مرحله بعد كليك كردن بر روي دكمه Select و تعيين محل پايگاه داده
6- دادن يك نام در قسمت
Data Source Name 7- كليك كردن روي دكمه OK براي اينكه قادر باشيم اطلاعات يك پايگاه داده را بخوانيم اطلاعات بايد ابتدا در Record Set ، Load شوند. بنابر اين بعد از ساختن يك Connection بايد يك Record Set ايجاد كنيم.
مثال :
نام Data Base = nor.mdb
نام جدول =
Customer C:/Inetpub/wwwroot/nor.mdb Data Base مسير فايل < % conn= Server. CreateObject ( “ADODB.Connection”)
Connection ايجاد
conn.Provider=”Micrisoft.Jet.OLEDB.4.0” conn . Open (“C:/WebData/ nor.mdb”) Connection بازكردن rs=Server. CreateObject (“ADODB.Recordset”)
Record Set ايجاد rs. Open(“Customer”, conn) Record Set بازكردن % > در اين مثال تمام محتويات جدول Customer به rs ريخته ميشود.
حال ميخواهيم در انتخاب محتوياتي از Customer كه ميخواهند به rs انتقال داده شوند از دستور SQL استفاده كنيم.

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

ساختن يك Connection و Record Set و به كار بردن SQL :

< % set conn=Server. CreateObject (“ADODB .Connection”
conn. Provider=”Microsoft.jet.OLEDB.4.0” conn.
Open ( “C:/Inetpub/wwwroot/nor.mdb”) (Record Se

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

گرفتن داده هايي كه نياز داريم از Record Set :

بعد از اينكه Record Set را باز كرديم ميتوانيم به داده هايي كه نياز داريم دسترسي داشته باشيم.
مثال :
دسترسي به فيلد name از جدول rs rs(name

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

چاپ داده ها :

مثال : چاپ فيلد name از جدول rs Response.write(rs(n

بستن Recordset و Connection :

- براي بستن Recordset
rs.close() - براي بستن Connection
لينک مقاله
http://sqlserver.persianblog.com :منبع

مقالات مرتبط با اين موضوع
خلاصه سازی داده ها | sqlserver
ارتباط دادن جداول | sqlserver
مرتب سازی و انتخاب کردن سطرها | sqlserver
عبارت SELECT | sqlserver
بازيابی سطرها | sqlserver
ايجاد کردن نمودار پايگاه داده | sqlserver
شناخت عبارت INSERT | sqlserver
جداول موقت | sqlserver
ايجاد کردن ارتباطات | sqlserver
ايجاد کردن Check Constraint | sqlserver
ايجاد کردن شئی های جدول | sqlserver
ايجاد کردن يک پايگاه اطلاعاتی | sqlserver
ايجاد كردن جداول و تغییر دادنشان | sqlserver
شناخت ايندکس ها | sqlserver
امنيت 2000 SQL Server | sqlserver
نسخه برداری کردن و باز گرداندن پايگاه داده ها | sqlserver
معرفی SQL و دستورات عمومی آن | sqlserver

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


نسخه برداری کردن و باز گرداندن پايگاه داده ها

نسخه برداری کردن و باز گرداندن پايگاه داده ها
هيچ مسئله ای نيست که چگونه زمينه قرار دادن يک تکنولوژی معتبر باشد. مواردی که اتفاق می افتد: قصورهای سخت افزارهای کامپيوتر، نرم افزارهای بر هم خورده که از دور خارج می شوند و اشتباهات که کاربرها سبب می شوند بهترين محافظت تان کپی گرفتن منظم از داده ها و ذخيره سازی آنها در جای مطمئن می باشد. که Taking a Backup ناميده می شود. اگر هر موردی پيش آيد شما می توانيد از نسخه پشتيبان برای باز گرداندن پايگاه داده که قبلاً دچار مشکل شده استفاده کرد.

نسخه برداری از يک پايگاه داده
2000 SQL Server چندين راه مختلف برای نسخه برداری از پايگاه داده فراهم می آورد. ساده ترين راه گرفتن Backup کامل يک کپی کامل از پايگاه داده در يک نقطه زمانی خاص می باشد.
راهنمايی:SQL Server اجازه می دهد که نسخه برداريها گرفته شوند هنگامی که پايگاه داده در حال استفاده می باشد و نياز به بستن سيستم برای نگهداری آن نيست. اگر چه انواع اصلی عمليات از طريق Backup نمی تواند به انجام رسد. اينها شامل عملياتی هستند که ساختار پايگاه داده را تغيير می دهند. از قبيل ايجاد کردن و حذف کردن فايل ها يا ايجاد Index ها و به انجام رساندن عملياتهای مرتبط نشده به سيستم Non Logged همچنينSQL Server دومين نوع نسخه برداری را فراهم می آورد که به طور Differential Backup شناخته شده است. يک Differential Backupفقط اطلاعاتی را که از آخرين نسخه برداری کامل تغيير پيدا کرده است ثبت می کند. امتيازات آن اين می باشد که بيشترين محيطهایDifferential Backup از يک نسخه برداری کامل کوچکتر خواهد بود و اينکه فرآيند نسخه برداری سريعتر خواهد شد.
راهنمايی: Differential Backup مفهوم می شود اگر يک درصد کمی از داده ها ممکن برای شما تغيير بيابد، برای مثال يک Differential Backup روزانه بسازيد و نسخه برداری کامل را يک بار در هفته صورت دهيد. سومين نوع سيستم نسخه برداری به وسيله SQL Server فراهم می گردد يک Transaction Log Backup می باشد. Kg Transaction يک رکوردی از همه تراکنش ها انجام شده است که برخلاف پايگاه داده همان Transaction Log است که آخرين بار نسخه برداری شده است.
راهنمايی:Backups Transaction Log همچنين به شما اجازه باز گرداندن يک پايگاه داده برای يک نقطه زمانی خاص می دهد اين می تواند مفيد واقع شود. برای مثال يک اشتباه اپراتور باعث نادرست وارد شدن اطلاعات در داخل يک پايگاه داده شود.
شما می توانيد از يک Transaction Log برای باز گرداندن پايگاه داده در حالتی که آن قبلاً بوده برای اضافه کردن اطلاعات غلط استفاده کنيد.
SQL Server از Transaction Log برای بازگرداندن پايگاه داده به طور خودکار استفاده می کند اگرServer پذيرفته شود. شما می توانيد آن را برای نسخه برداری از داده هايتان در ترکيب با يک نسخه برداری کامل يا Full And Differential Backupاستفاده کنيد. امتيازاتTransaction Log Backup هست از بيشترين تفصيل های نتايج فايل Backup که کوچکتر از Differential Backup ياFull می باشد.
راهنمايی: در بعضی از حالات يک Transaction Log Backup ممکن بزرگتر از نسخه برداری يک پايگاه داده شود. برای مثال اگر يک گروه کوچک از رکوردها نسبتاً به طور پی در پی تغيير داده شود در اين حالتها، شما می توانيد همچنين يک نسخه برداری کامل يا Transaction Log Backupsبه طور متناوب بگيريد.

نسخه برداری يک پايگاه داده با استفاده کردن از Database Backup Wizard
مهم: اگر شما هنوز نمونه پايگاه داده را نصب نکرده ايد، نخست آن را انجام داده قبل از اينکه به اين درس برگرديم.
1- در درخت Consol پايگاه داده Aromatherapy را انتخاب می کنيم.SQL Server يک ليست از شئی های پايگاه داده ها را در قابDetails نشان می دهد.

2- دکمهWizard روی نوار ابزارEnterprise Manager را کليک می کنيم. SQL Server کادر محاوره ای Select Wizard را نشان می دهد.

3- در بخش Manager ، Backup Wizard را کليک می کنيم. SQL Server اولين صفحه از Create Database Backup Wizard را نشان می دهد.

4- Next را کليک کرده ويزارد يک صفحه را نشان داده که به انتخاب پايگاه داده برایBackup سؤال می کند.

5- اطمينان حاصل کنيد کهAromatherapy در کادر Combo انتخاب می شود و سپس Nextرا کليک می کنيم. ويزارد صفحه ای را نشان می دهد که از شما برای نام و شرحBackup سؤال می کند.

6- در کادر Description ،Lesson 2 Backup را تايپ می کنيم.

7- Next را کليک می کنيم. ويزارد يک صفحه را نشان می دهد که سؤال می کند کدام نوع از Backup را شما می خواهيد به انجام رسانيد: يکBackup کامل، يکBackup متفاوت با يک Transaction Log Backup .

8- در اين تمرين ما يکBackup کامل را به انجام خواهيم رساند بنابراين Next را کليک می کنيم. ويزارد يک صفحه را نشان می دهد که از شما به انتخاب مقصدBackup می پرسد.

9- دکمه Browse را کليک می کنيم. ويزارد کادر محاوره ایBackup Device Location را نشان می دهد.

10- پوشه را آنجايی که فايلهای تمرينی را نصب کرده ايد هدايت می کنيم.
مهم: در يک محيط توليد شما هرگز نبايد نسخه برداريها را روی ابزار فيزيکی ذخيره سازيد به طوری که پايگاه داده ها وجود دارند. معمولاً آنها را در جای مطمئن به طور بهتر در محل ديگر ذخيره می کنيم.
11- OK را برای برگشت به ويزارد کليک می کنيم. در بخشProperties ، شما می توانيد Append Back Up Media يا Over Write Back Up Media را انتخاب کنيد.

12- Next را کليک می کنيم. ويزارد يک صفحه ای را نشان می دهد و از شما برای رسيدگی و زمانبندی کردن جزئيات سؤال می کند.

13- در اين مثال نياز بهSQL Server برای رسيدگی به نسخه برداری نداريم. بنابراين بر چسب Backup Set Expiration Data و Checkbox Media Set Name را انتخاب نمی کنيم.

14- Next را کليک می کنيم. ويزارد يک صفحه رسيدگی کننده انتخابهايی که شما ساخته ايد را نشان می دهد.
راهنمايی:Media , SQL Server نسخه برداری را در دستگاهMedia سازماندهی می کند. يک دستگاه Media می توانيد يک فايل تک ديسک شود يا يک مجموعه20 تايی يا بيشتر از نوارهای نسخه برداری شود.

15- Finish را کليک می کنيم. The Create Database Backup Wizard يک کادر محاوره ای پيشرفته را نشان می دهد هنگامی که آن نسخه برداری را به انجام می رساند و سپس يک متن اشاره می کند که نسخه برداری به طور موفقيت آميز تمام شده است.

راهنمايی: همچنين شما می توانيد از يک پايگاه داده با انتخاب پايگاه دادهBackup روی منوی محتويات پايگاه داده نسخه برداری کنيد. اين گزينه يک کادر محاوره ايی دقيق تر از استفاده کردنThe Create Database Backup می باشد اما همه گزينه ها شبيه می باشند.

باز گرداندن يک پايگاه داده
بديهی است که ساختن Backup هايی داده هايتان زياد استفاده نمی شود مگر اينکه شما چندين راه برای برگرداندن آن داده ها در داخل سيستم توليدتان در حوادث موفقيت ناآميز داشته باشيد. که بازگرداندن پايگاه داده ها ناميده می شود و Enterprise Manager آن را به آسانی نسخه برداری پايگاه داده ها باز می گرداند.

بازگرداندن يک پايگاه داده
1- پايگاه دادهAromatherapy را در درخت Consoleکليک راست کرده، روی همه Task ها رفته و سپس Restore Databaseرا کليک می کنيم. SQL Serverکادر محاوره ایRestore Database را نشان می دهد.

2- OK را کليک می کنيم. SQL Server يک کادر محاوره ای Progressرا نشان می دهد هنگامی که آن عمل Restore را به انجام می رساند و سپس يک متن نشان می دهد کار Restore به طور موفقيت آميز کامل شده است.

استفاده کردن The Database Maintenance Plan Wizard
تاكنون در اين درس شما آموخته ايد كه چگونه پايگاه داده ها را نسخه برداری و بازگردانيد. اما نسخه برداريها بايد به طوري منظم به انجام برسد و آن آسان مي باشد فراموش كردن انجام آنها، SQL Server يك مكانيزم براي شما براي به انجام رساندن نسخه برداريها به طور خودكار در برنامه زمان بندي شده فراهم مي سازد، چندين راه براي انجام آن وجود دارد. اما ساده ترين راه آن استفاده كردن ازThe Database Maintenance Plan Wizard مي باشد كه اجازه مي دهد به شما براي زمانبندي چندين كار نگهداري كه بايد به طور منظم انجام شود. بيشترين اطلاعات آن به روز كردن آمارهاي پايگاه داده ها مي باشد. SQL Server اطلاعاتي درباره توزيع آماری در جداول را نگهداري مي كند. اين اطلاعات به وسيله SQL Server براي تعيين پر بازده ترين روش بازيابي اطلاعات استفاده می شود. اگر چه به مرور زمان اين داده ها قطعي مي شوند همان طوري كه داده ها تغيير يافته و داده هاي جديد اضافه مي شود. SQL Server به طور خودكار متناوباً اطلاعات آماري را به روز مي سازد. اما شما مي توانيد آن را براي به روز رساني اين اطلاعات در زمانهاي مشخص شده با استفاده از Database Maintenance Plan Wizard امر كنيد. به طور كلي شما مي توانيد از Database Maintenance Plan Wizard براي زمان بندي SQL Server براي به انجام رساندن منظم تستهاي بي نقص استفاده کنيد. اينها تستهاي سطح پايين از بي نقصي فيزيكي کاربر و جدول سيستم هستند. بالاخره شما مي توانيد از Database Maintenance Plan Wizard براي راه اندازي Log Shipping استفاده كنيد. كه يك روشي براي نگهداري خودكار يك Server Back Up به وسيله كپي گرفتن دائمي از Transaction Logs براي Server مي باشد. يك رويه نگهداري پايگاه داده واحد مي تواند در هر تركيبي اين وظايف را به انجام رساند. به طور اضافی شما مي توانيد SQL Server داشته باشيد كه يك گزارش روي نتايجي از وظايف كه به انجام مي رسد ايجاد كند. اين گزارش مي تواند براي يك دايركتوري مشخص شده به عنوان يك فايل متني يا سند Html و يا آن مي تواند براي يك اپراتور پست الكترونيكي شود. در تمرين زير، ما به آساني يك نسخه برداری منظم را برپا مي كنيم.

ايجاد كردن يك رويه نگهداري ماهانه براي نسخه برداري از يك پايگاه داده
1- پايگاه داده Aromatherapy را در درخت Console انتخاب مي كنيم. SQL Server يك ليستي از شئی هاي پايگاه داده را در قاب Details نشان مي دهد.

2- دكمه ويزارد را روي نوار ابزار Enterprise Manager كليك مي كنيم SQL Server كادر محاوره اي Select Wizard را نشان مي دهد.

3- Database Maintenance Plan Wizard را در قسمت Manager انتخاب مي كنيم. SQL Server اولين صفحه از Database Maintenance Plan Wizard را نشان مي دهد.

4- Next را کليک می کنيم. ويزارد يك صفحه را نشان مي دهد كه از شما براي انتخاب پايگاه داده كه شما بر آن يك رويه نگهداري ايجاد كرده ايد. از زماني كه Aromatherapy در درخت Console انتخاب شده وقتي كه شما ويزارد را شروع مي كنيد آن به طور پيش فرض انتخاب خواهد شد. اما شما مي توانيد به وسيله چك كردن گزينه هاي مناسب در اين كادر محاوره اي انتخاب را تغيير دهيد.

5- Next را کليک می کنيم. ويزارد يك صفحه را نشان مي دهد و از شما سؤال مي كند براي انتخاب اطلاعات بهينه براي اينكه به روز شود.

6- Next را کليک می کنيم. ويزارد يك صفحه را نشان مي دهد سؤال مي كند كه آيا Integrity Checksرا انجام دهد.

7- Next را كليك مي كنيم. ويزارد يك صفحه را نشان مي دهد از شما براي مشخص كردن رويه نسخه برداری پايگاه داده ها سؤال مي كند. براي اين تمرين همه تنظيمات پيش فرض را مي پذيريم و تغييرات را فقط در مورد زمانبندي Back Up صورت مي دهيم.

8- Change را براي تغيير زمان بندي Back Up كليك مي كنيم. ويزارد كادر محاوره اي Edit Recurring Job Schedule را نشان مي دهد.

9- در گروهOccurs ، Monthly را انتخاب مي كنيم. ويزارد كادر محاوره اي را براي نمايش دادن گزينه ها براي نسخه برداريهاي ماهانه تغيير مي دهد.
10- دكمه Option را براي زمان بندي Backup برای اولين يكشنبه از هر ماه انتخاب مي كنيم.

11- OK را براي باز گرداندن Database Maintenance Plan Wizard كليك مي كنيم.

12- Next را كليك مي كنيم. ويزارد يك صفحه را براي پرسيدن درباره دايركتوريBackup نشان مي دهد.
مهم: اگر شما Database Maintenance Plan Wizard را براي زمانبندي ديگر كارهاي نگهداري استفاده كنيد و گزينهBackup را انتخاب كنيد اين صفحه نشان داده نخواهد شد.

13- استفاده كردن از دكمهOption دايركتوري را انتخاب مي كنيم و سپس دكمه Browse را كليك مي كنيم. ويزارد كادر محاوره اي Find Backup Directory را نشان مي دهد.

14- دايركتوري را دنبال كرده تا جايي كه فايل Sample نصب مي شوند و سپسOK را كليك مي كنيم. كادر محاوره اي The Find Backup Directory بسته مي شود.
15- Next را كليك مي كنيم. ويزارد يك صفحه را نشان مي دهد به پرسيدن اينكه آياTransaction Log در طرحBackup موجود است.

مهم: شما بايد از اين صفحه، بيشتر از صفحه اي كه مي پرسد از شما براي شامل شدن پايگاه داده در طرح Maintenance ، اگر شما فقط بخواهيد يكTransaction Log Backup را به انجام رسانيد (بيشتر از يك پايگاه داده کامل).
16- Next را كليك مي كنيم. ويزارد يك صفحه را نشان مي دهد و سؤال مي كند براي توليد يك گزارش، زماني كه طرح تكميل مي گردد.

17- Next را كليك مي كنيم. ويزارد يك صفحه را نشان مي دهد و درباره ذخيره كردن تاريخچه Maintenance روي Server محلي سؤال مي كند. براي اين مثال تنظيمات پيش فرض را مي پذيريم.

18- Next را كليك مي كنيم.The Database Maintenance Plan Wizard يك صفحه براي تأييد انتخاباتي كه شما ساخته ايد نشان مي دهد.

19- Cancel را كليك مي كنيم.
مهم: معمولاَ شما Finish را براي ابزار طرح Maintenance كليك خواهيد كرد، اما ما حالا آن را نخواهيم انجام داد تا زماني كه فقط پايگاه داده تمريني وجود دارد.
راهنمايي: طرحهاي نگهداري در درخت Console در پوشه Manager قابل ديدن مي باشد. شما مي توانيد ببينيد و طرح نگهداري را به وسيله دابل کليک كردن آن در قاب Details ويرايش كنيد.
لينک مقاله
http://sqlserver.persianblog.com :منبع

مقالات مرتبط با اين موضوع
خلاصه سازی داده ها | sqlserver
ارتباط دادن جداول | sqlserver
مرتب سازی و انتخاب کردن سطرها | sqlserver
عبارت SELECT | sqlserver
بازيابی سطرها | sqlserver
ايجاد کردن نمودار پايگاه داده | sqlserver
شناخت عبارت INSERT | sqlserver
جداول موقت | sqlserver
ايجاد کردن ارتباطات | sqlserver
ايجاد کردن Check Constraint | sqlserver
ايجاد کردن شئی های جدول | sqlserver
ايجاد کردن يک پايگاه اطلاعاتی | sqlserver
ايجاد كردن جداول و تغییر دادنشان | sqlserver
شناخت ايندکس ها | sqlserver
امنيت 2000 SQL Server | sqlserver
نسخه برداری کردن و باز گرداندن پايگاه داده ها | sqlserver
معرفی SQL و دستورات عمومی آن | sqlserver

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


امنيت 2000 SQL Server

امنيت 2000 SQL Server
يکی از مهمترين صورتهای مديريت يک پايگاه داده مراقبت کردن از امنيت داده ها می باشد. شما بايد تضمين کنيد که برای هر کسی که به طور قانونی نياز به دسترسی داده ها دارد، بتواند داده هايش را بگيرد البته نه اينکه به کسی دسترسی نامناسب دهيد. در اين درس، ما امتحان می کنيم که چگونه امنيت 2000 SQL Server به کار برده می شود و می آموزيم که چگونه امتيازهای امنيتی را ايجاد و تخصيص دهيم.

شناختن مدهای امنيت
زمانی در مرحله ای از SQL Server يک درخواست برای اتصال دريافت می کنيم. آن از يک Login ID عبور می کند. Login ID معرف Account می باشد که دسترسی به 2000 SQL Server را کنترل می کند. SQL Server بررسی می کند Login ID که داده شده است معتبر باشد. سپس معين می کند که آيا Login ID که پذيرفته شده است امتياز امنيتی کافی برای به انجام رساندن عمليات درخواست شده دارد. اين عمليات به عنوان authentication ناميده می شود. 2000 SQL Server ، authentication را از دو راه می تواند پشتيبانی کند. آن می تواند به NT ويندوز مايکروسافت يا امنيت ويندوز 2000 برای معتبر کردن ID اطمينان کند يا آن می تواند اعتبار سازی را خودش به انجام رساند.

Authentication (تأييد اعتبار) ويندوز
زمانی که از تأييد اعتبار ويندوز (شناخته شده به عنوان امنيت مجتمع در نسخه های قبلی از SQL Server) مدير سيستم صورتهای امنيتی برای ويندوز NT و Account های ويندوز 2000 و گروهها را می پذيرد. نرم افزار پردازشگر ويندوز يک اتصال معتبر برای Server را درخواست می کند. يک اتصال معتبر از زمانی پذيرفته خواهد شد اگر ويندوز NT يا ويندوز 2000 قبلاً يک User را تصديق کرده باشد. 2000 SQL Server نياز دارد به تضمين Login ID که برای دسترسی پيدا کردن بهServer و پايگاه داده فراهم شده است.
مهم: زمانی که ويندوز 98 نمی تواند ارتباطات معتبر را پشتيبانی کند مواردی از 2000 SQL Server که روی ويندوز 98 اجرا می گردد نمی تواند از مد تأييد اعتبار ويندوز استفاده کند. نرم افزار پردازشگر يا Client می تواند روی ويندوز 98 اجرا شود. اگر چه با استفاده از تأييد اعتبار ويندوز تهيه شده، Server خودش روی ويندوز NT يا ويندوز 2000 اجرا می شود.

تأييد اعتبار SQL Server
به طور کلی توانا بودن تأييد اعتبار Login نماينده برای سيستم امنيتی ويندوز زمانی که آن را از مد تأييد اعتبار ويندوز استفاده می کند، 2000 SQL Server امنيت خودش را به کار می برد، نه به طور حيرت آور، تأييد اعتبار SQL Server (شناخته شده به عنوان امنيت استاندارد در نسخه های قبلی از SQL Server). زمانی که درخواست اتصال صورت گيرد از تأييد اعتبار SQL Server استفاده می کنيم.
2000 SQL Server هر دوی Login ID و Password را دريافت می کند. که آن برخلاف ليست از Login های مشخص شده برای آن به وسيله مدير سيستم معتبر می شود.
مهم: مايکروسافت توصيه می کند که از تأييد اعتبار ويندوز در هر جای ممکن استفاده کنيد.

User Logins
امنيت در داخل 2000 SQL Server از طريق چندين شئی امنيتی کنترل می شود. در بالاترين سطوح Login ها می باشند که يک 2000 SQL Server ، کاربر ويندوز يا يک گروه ويندوز برای Server را مشخص می کند.
مهم: برای تکميل تمرينات زير، شما بايد همچنين مديرهای امنيتی يا وظايف مديرهای سيستم در داخل SQL Server تخصيص داده باشيد لطفاً به مدير پايگاه داده تان رجوع کنيد اگر شما درباره حق انحصاری تان در داخل سيستم مطمئن نيستيد.

ايجاد کردن User Login
Login ها می تواند به طور دستی هدايت کردن آيکون Login از پوشه Security در يک Server ايجاد کنيد و يک Login جديد از منوی Context انتخاب کنيد اما ساده ترين راه استفاده کردن از Create Login Wizard می باشد.

ايجاد کردن SQL Server Login
1- Server را در درخت Console انتخاب می کنيم. SQL Server يک ليستی از شئی های Server در قاب Details نشان می دهد.

2- دکمه Wizard را روی نوار ابزار Manager Enterprise کليک می کنيم. SQL Server کادر محاوره اي Select Wizard را نشان می دهد.

3- در بخش پايگاه داده، Create Login Wizard را انتخاب کرده و سپس OK را کليک می کنيم. SQL Server اولين صفحه از Create Login Wizard را نشان می دهد.

4- Next را کليک می کنيم، ويزارد يک صفحه ای را نشان می دهد که از مد تأييد اعتبار Server برای Login سؤال می کند.

5- دکمهOption برچسب شده اطلاعات SQL Server Login را انتخاب می کنيم که به وسيله سيستم به من تخصيص داده می شود (SQL Server Authentication)

6- Next را کليک کرده، ويزارد يک صفحه که Login ID ، Password را درخواست می کند نشان می دهد.

7- Test ID را به صورت نام و Password که شما مايل هستيد وارد می کنيد.

8- Next را کليک کرده، ويزارد يک صفحه درخواست وظايف امنيتی برای اينکه Login بايد تخصيص داده شود را نشان می دهد.

9- Login را برای وظايف مديرهای سيستم اضافه می کنيم.

10- Next را کليک می کنيم ويزارد يک صفحه را که درخواست می کند از پايگاههای داده که اينLogin بايد دسترسی دهد.

وظايف Server
وظايف Server که به يک Login تخصيص داده می شود معين می کند که چه حق ويژه امنيتی Login در سطح Server دارد. جدول 3.1 حق ويژه تخصيص داده شده به هر وظيفه را تشريح می کند.
Bulk Insert Administrators Bulkadmin می تواند عمليات قرارگيری را به طور عمده به انجام رساند
Database Creators dbCreator می تواند داده های پايگاه را ايجاد، تغيير و حذف کند
Disk Administrators diskadmin می تواند فايلهای ديسک را مديريت کند
Process Administrators Processadmin می تواند عملياتهای اجرايی را در SQL Server را مديريت کند
Security Administrators Securityadmin می تواند Logins و ايجاد پايگاه داده را مديريت کند
Server Administrator Securityadmin می تواند گزينه های قالب بندی کل SQL Server را تنظيم کند و Server را خاموش کند
Setup Administrator Set upadmin می تواند Server های Link شده، روشهای Startup و روشهای ذخيره شده را مديريت کند
System Admin Sysadmin می تواند هر فعاليتی را در SQL Server انجام دهد
توضيحات نام نام کامل

11- Login برای پايگاه داده Aromatherapy اضافه می کنيم.

12- Next را کليک می کنيم. ويزارد يک صفحه را برای تأييد کردن انتخابهايی که شما ساخته ايد نشان می دهد.

مهم:Login هايی که برای وظايف Server های ويژه می باشد به ويژه وظيفه مديرهای سيستم حق ويژه روی همه پايگاه داده ها خواهند داشت، اعم از اينکه آنها برای Login به طور خاص پذيرفته شده اند يا خير.
13- Finish را کليک کرده، ويزارد ايجاد Login يک متنی را برای تأييد اينکه Login اضافه شده است نشان می دهد.

ايجاد کردن Login ويندوز
1- Server را در درخت Console انتخاب می کنيم. SQL Server يک ليستی از پوشه های Object را در قاب Details نشان می دهد.

2- 2- دکمه Wizard را در نوار ابزار Manager Enterprise کليک می کنيم SQL Server کادر محاوره ای Select Wizard را نشان می دهد.

3- ويزارد ايجادLogin را در بخش پايگاه داده ها انتخاب کرده و سپس OK را کليک می کنيم. SQL Server اولين صفحه از Wizard Create Login را نشان می دهد.

4- Next را کليک می کنيم ويزارد يک صفحه را نشان می دهد که برای مد تأييد اعتبار Server برای Login سؤال می کند تنظيمات پيش فرض را می پذيريم.

5- Next را کليک می کنيم. ويزارد يک صفحه را برای درخواستID Account ويندوز نشان می دهد.

6- Windows ID را در اين فرم وارد می کنيم. Account Name وDomain Name (account name ، می تواند کاربر يا گروه باشد). Next را کليک می کنيم. ويزارد يک صفحه نشان می دهد که وظايف امنيتی برای اينکه Login بايد تخصيص داده شود را درخواست می کند.
راهنمايی: رد دسترسی به گزينه Server در اين صفحه می تواند به طور آشکار برای رد دسترسی به يک گروه کاربر تکی استفاده شود.

7- Login را برای وظيفه ايجاد کننده ها پايگاه داده ها اضافه می کنيم.

8- Next را کليک می کنيم. ويزارد يک صفحه را نشان می دهد که درخواست می کند از پايگاه داده ها که دسترسی به اين Login بايد پذيرفته شود.

9- Login را برای پايگاه داده Aromatherapy اضافه می کنيم.

10- Next را کليک می کنيم. ويزارد يک صفحه که انتخابهای ساخته شده را نشان می دهد تأييد می کند.

مهم:Login هايی که برای نقشهای Server خاص می باشد، به ويژه نقش مديرهای سيستم حق انحصاری در همه پايگاه داده ها خواهند داشت اعم از اينکه آنها برای Login به طور خاص پذيرفته شده اند يا خير.
11- Finish را کليک کرده Create Login Wizard يک متنی را نشان می دهد که Login ها اضافه شده است.

مديريت Logins
در همان راهی که شئی های پايگاه داده ها ديگر نياز به نگهداری گاهگاهی دارند. شما ممکن است نياز به تغيير خصوصيات از يک User Login داشته باشيد. برای مثال، شما ممکن است نياز به تغيير Security Role برای اينکه Login مقرر شود، يا پايگاه داده ها برای اينکه به آن دسترسی پيدا کند داشته باشيد. البته شما بعضی اوقات نياز خواهيد داشت به برداشتن يک Login به طور کامل که همه اين عملياتها با استفاده از Manager Enterprise ساده می باشد.

تغيير دادن خصوصيات Properties Login
1- آيکون Logins را در پوشه Security در درخت Console راهبری می کنيم. SQL Server يک ليستی از Login در قاب Details نشان می دهد.

2- Test ID Login را در قاب Detail دابل کليک می کنيم. SQL Server کادر محاوره ای SQL Server Login Properties را نشان می دهد.

3- زبانه Server Roles را انتخاب می کنيم. SQL Server ، Server Roles را برای اينکه Login برقرار شده نشان می دهد.

4- Login را از نقش مديرهای سيستم (System Administrators Role) برمی داريم.

5- زبانه Database Access را انتخاب می کنيم. SQL Server پايگاه داده هايی را نشان می دهد. برای اينکه دسترسی به Login مقرر شود.

6- North Wind را به ليست پايگاه داده ها اضافه می کنيم.

7- Ok را برای بستن کادر محاوره ای SQL Server Login Properties کليک می کنيم. SQL Server خصوصيات Login را تغيير می دهد.

برداشتن يک Login
1- آيکون Login را در پوشه Security در درخت Console می بريم. SQL Server يک ليستی از Login در قاب Details نشان می دهد.

2- Test ID Login را در قاب Details انتخاب می کنيم و سپس کليد Delete را فشار می دهيم. SQL Server يک متنی را نشان می دهد که از شما برای تأييد حذفيات سؤال می کند.

3- Yes را کليک می کنيم. SQL Server ، Login را حذف می کند.

سطح امنيتی پايگاه داده
در سطح پايگاه داده، هر User account ويندوز يا SQL Server Login برای يک User Account در يک پايگاه داده ترسيم می گردد. حتی دسترسی که به يک نمونه Server SQL که با يک Login تخصيص داده می شود ضرورتاً نياز به دسترسی داشتن به يک پايگاه داده مشخص نخواهد داشت مگر اينکه يک شخص يک کاربر برای آن پايگاه داده ساخته باشد. همان طور Login ها می تواند به Server Roles تخصيص داده شود که يک حق انحصاری ويژه برای آنها اعطاء می کند، کاربرها می تواند به نقشهايی در سطح پايگاه داده تخصيص داده شوند که به آنها حق انحصاری ويژه اعطاء می گردد.
راهنمايی: از طريق حقوق انحصاری امنيتی که در سطح جداگانه می تواند تخصيص داده شود که به طور کلی توصيه نمی شود از زمانی که مديريت امنيت را پيچيده می کند. آن خيلی ساده تر می باشد اضافه يا برداشتن افراد برای گروههايی از پيش تعريف شده که دارند يک تنظيم ويژه ای از حقوق انحصاری امنيت از زمانی که تخصيص می گردد و مجدداً حقوق انحصاری را تخصيص می دهد.

User های پايگاه داده
زمانی که شما يک Login جديد را با استفاده از Create Login Wizard ايجاد می کنيد و به آن دسترسی پايگاه داده را واگذار می کنيد Login به طور خودکار به ليست کاربرهای پايگاه داده اضافه خواهد شد. اگر چه زمانی که شما يک پايگاه داده جديد ايجاد می کنيد احتمالاً شما خواهيد خواست به اضافه کردن Login های موجود برای آن به عنوان کاربر.

ايجاد يک User پايگاه داده
1- آيکون User را در پايگاه داده Aromatherapy می بريم. SQL Server يک ليستی از User ها در قاب Details نشان می دهد.

2- دکمه New را در نوار ابزار Manager Enterprise کليک می کنيم.

راهنمايی: شما همچنين می توانيد کادر محاوره ای Database User Properties را به وسيله کليک راست کردن باز کنيد. آيکون Users در درخت Console و Database User جديد را در منوی Context انتخاب می کنيم.
3- نام Login تان را در Combo Boy انتخاب می کنيم. SQL Server نام Login را به عنوان نام User پيش فرض پيشنهاد خواهد داد اما شما می توانيد آن را تغيير دهيد اگر بخواهيد.
4- db-Owner را برای نقشهای واگذار شده به User جديد اضافه می کنيم.

-5 OK را کليک می کنيم. SQL Server ، User را به پايگاه داده اضافه می کند.
راهنمايی: نقشهايی که به يک User پايگاه داده تخصيص می شود تعيين می کند که چه حقوق انحصاری امنيتی، کاربر برای پايگاه داده دارد. بخش زير Database Roles را برای جزئيات بيشتر ببينيد.

برداشتن يک User پايگاه داده
1- آيکون Users را برای پايگاه Aromatherapy در درخت Console می بريم. SQL Server يک ليستی از کاربرها را در قاب Details نشان می دهد.

2- User که شما در آخرين تمرين در ليست ايجاد کرديد را انتخاب می کنيم و سپس کليد Delete را فشار می دهيم. SQL Server يک متنی را نشان می دهد که از شما برای تأييد حذفيات سؤال می کند.

3- Yes را کليک می کنيم. SQL Server ، User را از پايگاه داده حذف می کند.

Database Roles
يک Database Roles مانند يک کاربر مجازی که شما برای مديريت دسترسی پايگاه داده ايجاد می کنيد می باشد. هر تعدادی از کاربرهای پايگاه داده می تواند به يک نقش تخصيص داده شود. هر کاربر معين می تواند به چندين نقش تخصيص داده شود. زمانی که شما حقوق انحصاری به يک نقش پايگاه داده تخصيص می دهيد و سپس يک کاربر برای آن نقش تخصيص می دهيد. کاربر همه حقوق انحصاری از نقش را به ارث می برد. اين خيلی ساده تر از نگهداری حقوق انحصاری برای کاربرهای شخصی می باشد. SQL Server 2000 يک تعدادی از نقشهايی از قبل تعريف شده را تهيه می کند. به طوری که در جدول 3.2 نشان داده شده همچنين شما می توانيد نقش سفارشی که برای پايگاه داده واحد می باشند را ايجاد کنيد.
راهنمايی: نقشهای پايگاه داده ای که شما در پايگاه داده اصلی ايجاد می کنيد اضافه خواهد شد. برای هر پايگاه داده های جديد که شما برای آن Server ايجاد می کنيد.
توضيحات نام نام کامل
Access Administrator db-Accessadmin می تواند User IDS را اضافه يا بردارد
ûackup Operator Db-Baclcupoprator می تواند DBCC ، CHECKPOINT و حالتهای BACKUP صادر کند
Data Reader db-Data Reader می تواند همه داده ها از هر جدول کاربر در پايگاه داده ها را انتخاب کند
Data Writer db-Data Writer می تواند هر داده در هر جدول کاربر در پايگاه داده ها اصلاح کند
Data DefinitionAdministrator db-dd Ladmin می تواند حالتهای زبان تعريف داده ها DDL را به انجام رساند اما نمی تواند GRANT ، REVOKE يا حالتهای DENY صادر کند
Deny Data Rader db-deny Data Writer می تواند اجازات SELECT را روی هر شئی در پايگاه داده لغو کند
Data Base Owner db-Owner همه اجازات دسترسی در پايگاه داده ها را دارد
Deny Data Writer db-deny Data Writer می تواند INSERT UP DATE و اجازات دسترسی DELETE را روی هر شئی در پايگاه داده رد يا ملغی کند
Security Administrator db-Securityadmin می تواند همه اجازات، حق مالکيت شئی نقشها و عضويتهای نقش را کنترل کند
Public نقش پيش فرض که به هر پايگاه داده کاربر متعلق می باشد

ايجاد کردن يک Role پايگاه داده
1- آيکون Roles برای پايگاه داده Aromatherapy را در درخت Console کليک می کنيم. SQL Server يک ليستی از نقشهای پايگاه داده موجود را نشان می دهد.

2- دکمه New را روی نوار ابزار Manager Enterprise را کليک می کنيم. SQL Server کادر محاوره ای Database Role Properties را نشان می دهد.

3- 3 Lesson را به عنوان نام نقش وارد می کنيم.

4- OK را کليک کرده، SQL Server کادر محاوره ای Database Role Properties را می بندد.
5- Role 3 Lesson را در قاب Details دابل کليک می کنيم. SQL Server کادر محاوره ای Database Role Properties را نشان می دهد.

مهم: شما بايد کادر محاوره ای Database Role Properties را به ترتيب برای قادر ساختن دکمه Permissions ببنديد.

6- دکمه Permissions را کليک می کنيم. SQL Server کادر محاوره ای Permissions را نشان می دهد.

راهنمايی: کادر محاوره ای Database Role Properties دو نوع از نقشها Standard Roles و Application را پشتيبانی می کند. نقشهايی که دراين درس بحث شده اند همه Standard Roles می باشند. يک application Role يک تابع ويژه ای است که احتياجات برنامه های کاربردی پيچيده را پشتيبانی می کند.
Establishing Application Security And Application Roles را در کتاب SQL Server Online برای جزئيات درباره application Role ببينيد.
7- نقش که اجازات دسترسی در جدول Oils را انتخاب می کند فراهم می کنيم.

8- OK را کليک کرده SQL Server کادر محاوره ای Permissions را می بندد.
9- OK را کليک می کنيم. SQL Server يک نقش جديد را اضافه می کند.

تخصيص يک کاربر به يک نقش پايگاه داده
1- آيکون Users را برای پايگاه Aromatherapy در درخت Console راهبری می کنيم. SQL Server يک ليستی از User ها را در قاب Details نشان می دهد.

2- نام کاربرتان را در ليست کاربرها دابل کليک می کنيم. SQL Server کادر محاوره ای Database User Properties را نشان می دهد.

3- کاربر را برای Role 3 Lesson با کليک کردن آن در کادر ليستDatabase Role Membership اضافه می کنيم.

4- Ok را کليک کرده SQL Server کاربر را برای نقش اضافه می کند و کادر محاوره ای Database Role Membership را می بنديم.

برداشتن يک User از يک Database Role
1- آيکون Users را برای پايگاه داده Aromatherapy در درخت Console راهبری می کنيم. SQL Server يک ليستی از User ها را در قاب Details نشان می دهد.

2- نام کاربرتان را در ليست دابل کليک می کنيم. SQL Server کادر محاوره ای Database User Properties را نشان می دهد.

3- 3 Role Lesson را در ليست Database Role Membership انتخاب نمی کنيم.

4- OK را کليک کرده SQL Server ، Users Membership را از نقش برمی دارد و کادر محاوره ای را می بندد.

برداشتن يک Data Base Role
1- آيکون Roles برای پايگاه Aromatherapy در درخت Console را راهبری می کنيم. SQL Server يک ليستی از نقشها را در قاب Details نشان می دهد.

2- Role 3 Lesson را در قاب Details انتخاب کرده و کليد Delete را فشار می دهيم. SQL Server يک متنی را نشان می دهد که از شما برای تأييد حذفيات می پرسد.

3- Yes را کليک می کنيم. SQL Server ، نقش را از پايگاه داده حذف می کنيم.
لينک مقاله
http://sqlserver.persianblog.com :منبع

مقالات مرتبط با اين موضوع
خلاصه سازی داده ها | sqlserver
ارتباط دادن جداول | sqlserver
مرتب سازی و انتخاب کردن سطرها | sqlserver
عبارت SELECT | sqlserver
بازيابی سطرها | sqlserver
ايجاد کردن نمودار پايگاه داده | sqlserver
شناخت عبارت INSERT | sqlserver
جداول موقت | sqlserver
ايجاد کردن ارتباطات | sqlserver
ايجاد کردن Check Constraint | sqlserver
ايجاد کردن شئی های جدول | sqlserver
ايجاد کردن يک پايگاه اطلاعاتی | sqlserver
ايجاد كردن جداول و تغییر دادنشان | sqlserver
شناخت ايندکس ها | sqlserver
امنيت 2000 SQL Server | sqlserver
نسخه برداری کردن و باز گرداندن پايگاه داده ها | sqlserver
معرفی SQL و دستورات عمومی آن | sqlserver

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


شناخت ايندکس ها

شناخت ايندکس ها
در يک پايگاه داده مرتبط يک ايندکس يک شئی خاصی است که اجازه می دهد به پايگاه داده برای دسترسی سريع سطرها در يک جدول بر پايه ارزشهای يک يا بيشتر ستونها در بسياری از راههای يکسان به عنوان ايندکس از يک کتاب که دسترسی سريع به محتوياتش را مبنی بر کلمات کليدی ويژه فراهم می آورد. SQL Server مايکروسافت دو نوع مختلف از ايندکس ها را فراهم می آورد. کلاستر شده و کلاستر نشده. يک ايندکس کلاستر شده بر طبق سطرهايی از جدول که به طور فيزيکی ذخيره می شوند تعيين می گردند. از طرف ديگر يک ايندکس کلاستر نشده يک شئی جدا شده در داخل پايگاه داده می باشد که به سطرهای ويژه ای در داخل يک جدول توجه می کند اما چگونه ذخيره شدن سطرها را تعيين نمی کند. يک ايندکس مبنايی برای يک يا چند ستون در يک جدول باشد. يک ايندکس که راجع به تک ستون می باشد Simple Index ناميده می شود نظر به اينکه ايندکسی که راجع به به چندين ستون می باشد Composite Index ناميده می شود. به طور کلی برای ايندکس هايی که شما برای خودتان تعريف می کند. SQL Server به طور خودکار يک ايندکس کلاستر شده به نام Primary key Index ايجاد می کند زمانی که شما يک کليد Primary برای يک جدول تعريف می کنيد. يک کليد Primaryستون يا ستونهايی می باشد که به طور واحد برای مشخص کردن هر سطر استفاده خواهد شد.

ايجاد کردن ايندکس ها
در Enterprise Manager ايندکس ها می توانيد با استفاده از The Create Index يا از طريق The Table Designer به وسيله تنظيم خصوصيات The primary key يا به وسيله تعريف ايندکس در کادر محاوره ای The Tables Properties ايجاد شوند.

ايجاد يک ايندکس با استفاده از The Create Index
1- پايگاه داده Aromatherapy را در درخت Console راهبری می کنيم. SQL Server يک ليستی از Objects پايگاه داده را در قاب Details نشان می دهد.

2- دکمه The Wizard را روی نوار ابزار Manager Enterprise کليک می کنيم. SQL Server کادر محاوره ای Select Wizard را نشان می دهد.

3- Create Index Wizard را در قسمت پايگاه داده انتخاب کرده، و سپس OK را کليک می کنيم. SQL Server اولين صفحه از Create Index Wizard را نشان می دهد.

4-Next را کليک کرده ويزارد يک صفحه را نشان می دهد که يک پايگاه داده و جدول را درخواست می کند برای اينکه ايندکس ايجاد خواهد شد.

5- اطمينان حاصل کنيد که Aromatherapy ، نام پايگاه داده انتخاب شده است و Oils را به عنوان نام جدول انتخاب می کنيم.

6-Next را کليک می کنيم ويزارد ايندکس های موجود را برای جدول نشان می دهد. ايندکس ها با نامهای متنوع به وسيلهSQL Server برای اعمال ارتباط ايجاد می گردند. ما در مورد ارتباطات در درس بعد صحبت خواهيم کرد.

7-Next را کليک کرده ويزارد ستونهايی را در جدول نشان می دهد.

8- Include را در سل ايندکس ستونهای Oil Name وLatin Name برای شامل کردن آنها در ايندکس کليک می کنيم.

9- Next را کليک کرده ويزارد يک صفحه را نشان می دهد که خصوصيات ايندکس را نشان می دهد.

10- مقادير پيش فرض را به وسيله کليک کردن Next می پذيريم. ويزارد نشان می دهد يک صفحه برای تأييد انتخابتان و يک نام برای ايندکس درخواست می کند نام پيش فرض را می پذيريم.

11- فيلد Latin Name را انتخاب و دکمه Move Up برای تغيير ترتيب فيلدها در ايندکس کليک می کنيم.

12-Finish را کليک کرده ويزارد نشان می دهد يک متنی برای تأييد اينکه ايندکس به وجود آمده است.

ايجاد کردن يک ايندکس کليک اصلی
1- پوشه جدول از پايگاه داده Aromatherapy را در درخت Console راهبری می کنيم. SQL Server يک ليستی از جداول در پايگاه داده نشان می دهد.

2- Table Designer را برای جدول Planttypes به وسيله کليک راست کردن نام جدول در قاب Details باز می کنيم و Design Table را انتخاب می کنيم SQL Server ، The Table Designer را باز می کند.

3- ستون PlanttypeID را در شبکه با کليک کردن سمت چپ نام ستون انتخاب می کنيم SQL Server ستون را انتخاب می کند.

4- دکمه کليد اصلی را روی نوار ابزار Table Designer کليک می کنيم. SQL Server ستون انتخاب شده را به عنوان کليد اصلی قرار می دهد.

5- دکمه Save را برای ذخيره سازی تغييرات کليک می کنيم و پنجره را Close می کنيم.

ايجاد کردن يک ايندکس ساده
1- Table Designer را برای جداول Oils با کليک راست کردن نام جدول در قاب Details باز می کنيم وDesign Table را انتخاب می کنيم. SQL Server ،Table Designer را باز می کند.

2- دکمه Indexes/Keys را کليک می کنيم SQL Server کادر محاوره ای The Tables Properties را با صفحه خصوصيات Indexes/Keys نشان داده شده باز می کند.

راهنمايی: شما همچنين می توانيد کادرهای محاوره ای The Tables Properties را به وسيله کليک کردن دکمه Properties و سپس زبانه/Keys Indexes باز کنيد.
3-New را کليک کرده SQL Server ، Ix-Oils را به عنوان نام ايندکس Oil Id را به عنوان ستون ايندکس شده پيشنهاد می کند.

4- نام ايندکس را به IX-Oil Name تغيير می دهيم.

5- نام ستون ايندکس را به Oilname به وسيله انتخاب ستون از Combo Box تغيير می دهيم.

6- Create Unique , Checkbox را برای ايجاد ايندکس واحد چک می کنيم. SQL Server به ايجاد کردن کادر گروه UNIQUE قادر می باشد.

7- گزينه Index را انتخاب می کنيم.

ايندکس های واحد
يک ايندکس منحصر به فرد تضمين می کند که هيچ دو سطر در يک جدول نمی تواند شامل داده ها دوتايی شده برای ستون يا ستونهای مشخص شده در ايندکس باشد. کليدهای اصلی ايندکس ها معمولاً منحصر به فرد می باشند اما شما می توانيد به طور کلی ايندکس های منحصر به فرد را اگر مايل باشيد اضافه کنيد. مواظب باشيد در مورد ايجاد ايندکس هايی منحصر به فردی روی ستونها که مقادير Null (تهی) را می پذيرد. اگر چه، SQL Server يک سطر تکی را با يک مقدار تهی خواهد پذيرفت اما ستونهای بعدی را به عنوان مقادير دو تايی (Duplicate) نخواهد پذيرفت.
8- Close را کليک کرده، SQL Server کادر محاوره ای را می بندد.
-9دکمه Save در نوار ابزار Table Designer را برای ذخيره سازی تغييرات کليک می کنيم و سپس پنجره Table Designer را می بنديم.

ايجاد کردن يک ايندکس مرکب
1- Table Designer را برای جدول Oil Odors به وسيله کليک راست کردن نام جدول در قاب Details و انتخاب جدول Design باز می کنيم. Table Designer , SQL Server را باز می کند.

2- دکمه Indexes/Keys را کليک می کنيم.SQL Server کادر محاوره اي Tables Properties را با صفحه خصوصيات Indexes/Keys نشان داده شده باز می کند.

3- New را کليک کرده SQL Server ، Ix-Oil Odors را به عنوان نام ايندکس و Oil ID را به عنوان ستون ايندکس شده در نظر می گيرد.

4- ستون Odor ID را برای ايندکس به وسيله کليک کردن در سل نام ستون اضافه می کنيم و آن را از Combo Box انتخاب می کنيم.

5- Close را کليک کرده SQL Server کادر محاوره ای را می بندد.
6- دکمه Save را روی نوار ابزار Table Designer برای ذخيره سازی تغييرات کليک کرده و سپس پنجره Table Designer را می بنديم.
نگهداری کردن ايندکس ها
مانند هر شئی ديگر در پايگاه داده، شما بعضی مواقع نياز به تغيير ايندکس ها که ايجاد کرده ايد خواهيد داشت. ايندکس ها و خصوصيات آنها در کادر محاوره ای Table Designers Properties نگهداری می شوند.

تغيير ايندکس ها
همان طوری که شما می توانيد خصوصيات ستونها را به وسيله باز کردن Table Designers اصلاح کنيد و در کادر محاوره ای Tables Properties نشان دهيد. شما می توانيد خصوصيات يک ايندکس را به همان صورت تغيير دهيد.

تغيير نام يک ايندکس
1- Table Designers را برای جدول Oils به وسيله کليک راست کردن نام جدول در قاب Details باز می کنيم و Table Design را انتخاب می کنيم.

2- دکمه Indexes/Keys را کليک می کنيم. SQL Server کادر محاوره ای Properties را با صفحه خصوصيات Indexes/Keys نشان داده شده باز می کند.

3- IX-Oil Name را در ايندکس انتخاب شده Combo Box انتخاب می کنيم. SQL Server جزئيات ايندکس را نشان می دهد.

4- نام ايندکس را برای IX-Nameتغيير می دهيم.

5- Close را کليک کرده، SQL Server کادر محاوره اي را می بندد.
6- دکمه Save را در نوار ابزار Table Designer برای ذخيره تغييرات کليک می کنيم.

تغيير ستونها در يک ايندکس
1- اگر Table Designer برای جدولOils باز نباشد آن را به وسيله کليک راست کردن نام جدول در قاب Details باز می کنيم و جدول Design را انتخاب می کنيم.

2- دکمه Indexes/Keys را کليک کردهSQL Server کادر محاوره اي Properties را با زبانه Indexes/Keys انتخاب شده باز می کند.

3- IX-Oil Name را در ايندکس انتخاب شده Combo Box انتخاب می کنيم. SQL Server خصوصيات ايندکس را نشان می دهد.

4- سل Latin Name را در فيلد Column Name را انتخاب کرده و ستون ايندکس شده را برای Plant Type ID تغيير می دهيم.

5- Close را کليک کرده SQL Server کادر محاوره ای را می بندد.
6- دکمه Save را در نوار ابزار Table Designer برای ذخيره سازی تغييرات کليک می کنيم.

برداشتن Indexe ها
بعضی مواقع شما نياز به برداشتن يک ايندکس از يک جدول خواهيد داشت، به دليل اينکه آن خيلی زياد مورد نياز نمی باشد يا به دليل اينکه کارايی بازيافت داده های بهبود يافته که ايندکس فراهم می آورد به وسيله زمانهای اضافی مورد نياز برای نگهداری ايندکس موقعی که داده مورد نظر به هنگام می شود بيشتر شود. مانند همه وظايف نگهداری ايندکس، حذف کردن يک ايندکس که با استفاده کردن از زبانه Indexes/Keys از کادر محاوره ای Table Designers Properties به انجام می رسد.

از بين بردن يک ايندکس
1- اگرTable Designer برای جدول Oils باز نباشد، آن را به وسيله کليک راست کردن نام جدول در قاب Details باز کرده و جدول Design را انتخاب می کنيم. Table Designer SQL Server را باز می کند.

2- دکمه Indexes/Keys را کليک کرده SQL Server کادر محاوره ای Tables Properties را با صفحه خصوصيات Indexes/Keys نشان داده شده باز می کند.

3- IX-Name را در ايندکس انتخاب شده Combo Box انتخاب می کنيم.

4- دکمه Delete را کليک کرده SQL Server ، ايندکس را حذف می کند.
5- Close را کليک کرده، SQL Server کادرهای محاوره ای را می بندد.
6- دکمه Save را در نوار ابزار Table Designer برای ذخيره سازی تغييرات کليک می کنيم و سپس پنجره Table Designer را می بنديم.
لينک مقاله
http://sqlserver.persianblog.com :منبع

مقالات مرتبط با اين موضوع
خلاصه سازی داده ها | sqlserver
ارتباط دادن جداول | sqlserver
مرتب سازی و انتخاب کردن سطرها | sqlserver
عبارت SELECT | sqlserver
بازيابی سطرها | sqlserver
ايجاد کردن نمودار پايگاه داده | sqlserver
شناخت عبارت INSERT | sqlserver
جداول موقت | sqlserver
ايجاد کردن ارتباطات | sqlserver
ايجاد کردن Check Constraint | sqlserver
ايجاد کردن شئی های جدول | sqlserver
ايجاد کردن يک پايگاه اطلاعاتی | sqlserver
ايجاد كردن جداول و تغییر دادنشان | sqlserver
شناخت ايندکس ها | sqlserver
امنيت 2000 SQL Server | sqlserver
نسخه برداری کردن و باز گرداندن پايگاه داده ها | sqlserver
معرفی SQL و دستورات عمومی آن | sqlserver

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


ايجاد كردن جداول و تغییر دادنشان

ايجاد كردن جداول
در محيط SQL Server ميكروسافت، در هر پايگاه داده مرتبط، اطلاعاتي در داخل جداول سازماندهي مي شوند بر طبق ترتيب سطرها و ستونها كه داده ها را براي شئی های تکی ذخيره می کند. در اين درس، شما مي آموزيد كه چگونه يك جدول جديد را ايجاد كنيد و معين كنيد ستونهايي كه آن جدول در بردارد.
راهنمايي: در نظر گرفتن محتويات جدول به عنوان يك شبكه (Grid) مانند يك صفحه گسترده ايده آل مي باشد. اما اين موضوع مهم مي باشد به تشخيص اينكه ركوردها در يك جدول نظم دروني ندارند. ايده هاي Previous و Next در يك ركورد جدول به كار برده نمي شوند. اگر شما نياز به انجام عملياتهاي متوالي نداشته باشيد، شما مي توانيد به وسيله ای به نام Cursor آن را انجام دهيد. يك ماهيتي كه به يك سطر ويژه در يك مجموعه از ركوردها اشاره مي كند. در مورد Cursor در درس 27 بحث خواهيم كرد.

ايجاد كردن جداول
جداول يك واحد تابعي از انبار داده ها در يك پايگاه داده های مرتبط مي باشند. به عنوان يك قاعده كلي، هر نوع از موجوديتها از قبيل Essential Oil در پايگاه داده نمونه مان به وسيله يك جدول نشان داده مي شود، نظر به اينكه هر نمونه از آن موجوديتها از قبيلGerman Chamomile Clary Sage به وسيله يك سطر در جدول نشان داده مي شود.

طراحي پايگاه داده
در بيشترين روش رايج براي تعريف پايگاه داده ها از راهكارهاي (مفهومهاي) Entities و Attributes استفاده مي كنيم زماني كه شما از طراحي منطقي به طراحی فيزيكي پيش مي رويد. موجوديتها معمولاً به صورت جداول پياده سازی مي شوند و مشخصه ها (Attributes) در ستونها پياده سازی مي شوند. (همچنين در فيلدها شناخته مي شوند)

شناخت انواع داده ها
هر ستون در جدول داراي خصوصيات معين مي باشد كه آن را براي SQL Server تعريف مي كند. مهمتر از اين خصوصيات، نوع داده هاي ستون مي باشد، كه تعريفي از نوع اطلاعاتی كه درستونها ذخيره خواهند شد می باشد. SQL Server يك محدوده وسيعي از انواع داده ها را فراهم آورد كه در جدول 1-5 نشان داده شده است. به طور كلي انواع داده ها به وسيله SQL Server فراهم مي گردد، همچنين شما مي توانيد خودتان تعريف كنيد. شما خواهيد آموخت كه چگونه اين را در درس 9 انجام دهيد.

مقادير قابل قبول انواع داده
مقادير عددی
مقادير اعداد صحيح از 63^2- تا1-63^2 bight
مقادير اعداد صحيح از 31^2- تا 1-31^2 Int
مقادير اعداد صحيح از 15^2- تا 1-15^2 Smallint
مقادير اعداد صحيح از 0 تا 255 Tinyint
مقادير اعداد صحيح با ارزش 0 و 1 bit
مقادير مقياس با دقت ثابت شده از 1+38^10 تا 1-38^10 decimal
مقادير Decimal همچنين مي تواند تعريف شود به صورتNumeric ، دامنه مقادير يكسان مي باشد.
مقادير Monetary (مالي) از 63^2- تا 1-63^2 (مقادير Money تا 0.0001 از هرواحد دقت دارد). Money
مقاديرMonetary از 3648 . 748 . 214- تا 3647 . 748 . 214 مي باشد Smallmoney
(مقادير Small Monetary تا 0001/0 واحد دقيق مي باشد).
مقادير صحيح شناور (متغير) از 308+E1.79- تا 308+E1.79 (مقادير Float فقط تقريبي مي باشد) Float
مقادير صحيح شناور متغير از 38+E3.40- تا 38+E3.40 مي باشند (مقادير real فقط تقريبي مي باشد) real
مقادير تاريخ و زمان از 1.1753 ژانويه تا 31.9999 دسامبر مي باشد datetime
(مقادير Date Time تا 3 هزارم ثانيه يا 3.33 ميلي ثانيه دقت دارد) Smalldatedtime
مقادير تاريخ و زمان از 1 ژانويه و 1900 تا 6 ژوئن و 2079 مي باشد (مقاديرSmalldatetime تا 1 دقيقه دقت دارند)
مقادير کاراکتری
مقادير حرفي كدگذاري نشده با طول ثابت با طول حداكثر 8000 حرف مي باشد. Char
مقادير حرفي كدگذاري نشده با طول متغير با طول حداكثر 8000 حرف مي باشد. Varchar
داده كدگذاري شده با طول متغير با طول حداكثر 1-31^2 (647 . 741 . 073 . 1) حرف مي باشد. Text
داده كدگذاري شده با طول ثابت با طول حداكثر 4000 حرف مي باشد Nchar
داده كدگذاري نشده با طول متغير با حداكثر طول 4000 حرف مي باشد nvarchar
داده كدگذاري شده با طول متغير با حداكثر طول 1-30^2 (823 . 741 . 073 . 1) حرف مي باشد ntext
مقادير باينری (1 و 0)
داده باينري با طول ثابت با حداكثر طول 8000 بايت مي باشد binary
داده باينري با طول متغير با حداكثر طول 8000 بايت مي باشد Varbinary
داده باينري با طول متغير با حداكثر طول 1-31^2 (647 . 783 . 147 . 2) بايت مي باشد Image
مقادير ديگر
يك مرجع مبناء براي يك Cursor مي باشد (يكCursor يك ماهيتي است كه يك مرجع مبناء را براي يك سطر مشخص در يك Result Set نشان مي دهد. Cursor
يك شمار واحد پايگاه داده است كه به هنگام مي شود هر زماني كه يك سطر به هنگام شود. (نوع داده rowversion در نسخه قبلی از Timestamp SQL Server ناميده می شود) rowversion
مقاديري از هر نوع غير از text ، ntext ، rowversion (timestamp) و sql - variant می باشد. يك معرف واحد کلي GUID مي باشد. Uniqveidentifier

ايجاد كردن يك جدول جديد
جداول تهيه و با استفاده از طراح جدول Enterprise Manager نگهداري مي شوند. اولين گام ايجاد و نامگذاري جدول به وسيله باز كردن Table Designer براي يك جدول جديد مي باشد.

ايجاد يك جدول جديد
1- در پايگاه داده Aromatherapy بر روی پوشه Table می رويم. SQL Server يک ليستی از جداول موجود را نشان می دهد.

2- دکمه New را روی نوار ابزار کليک می کنيم. SQL Server ، Table Designer را باز می کند.

3- دکمه Properties را در نوار ابزار کليک می کنيم. SQL Server کادر محاوره ای Tables Properties را باز می کند.

4- نام جدول را به 5 Lesson تغيير می دهيم.

5- Close را کليک می کنيم. SQL Server کادر محاوره ای Properties را می بندد.

اضافه کردن ستونها به يک جدول
اگر چه يک جدول يک Properties معين برای خود دارد. از قبيل نامی که ما در تمرين آخر به کار برديم. يک جدول اصولاً به وسيله ستونها که در آن موجود است تعريف می شود.

اضافه کردن يک ستون عددی به جدول
1- My Number را در سل Column Name تايپ کرده و سپس Tab را فشار می دهيم. SQL Server، char را به عنوان نوع داده پيشنهاد می دهد.

2- نوع داده را برای decimal تغيير می دهيم. SQL Server طول ستون را به 9 تغيير داده و صحت، مقياس و مشخصات فيلدها را تأييد می کند.

3- در سل Description ، Sample Numeric Column را تايپ می کنيم.
4- Precision ستون را به 5 و Scale را به 2 تغيير می دهيم. SQL Server طول ستون را به 5 برای نمايش دادن Precision جديد تغيير می دهد.

شرح ستون
توانايی اضافه کردن يک شرح برای يک ستون در enterprise Manager در 2000 SQL Server جديد می باشد که بخشی از عامليت جديد است که به طور extended Properties شناخته می شود. مايکروسافت مقداری از خصوصيات گسترده شده را از قبيل Column description به عنوان بخشی از نصب Server استاندارد ايجاد کرده است. شما می توانيد به طور کلی خصوصيات گسترده شده را برای ذخيره اطلاعات ويژه سايت يا اطلاعات ويژه کاربردی در حدود شئی های پايگاه داده ايجاد کنيد. extended Properties نام کاربر تعريف شده و يک مقدار دارد که مقاديری از يک extended Properties مقادير sql - variant می باشد که می تواند شامل بيش از 7500 بايت از داده ها باشد. شما می توانيد extended Properties چندگانه را برای هر شئی با استفاده از روشهای ذخيره شده تعريف کنيد. برای اطلاعات بيشتر در مورد روشهای ذخيره شده (Stored Procedures) به درس 28 رجوع کنيد.

Precision و Scale (دقت و مقياس)
دقت يک ارزش عددي مقدار ماكزيمم از رقمهاي decimal است كه ارزش آن را نشان مي دهد. براي سمت چپ و راست از نقطه Decimal . مقياس يک ارزش عددی رقمهای سمت راست از نقطه Decimal مي باشد. براي مثال، مقدار عددي 311 . 3647 يك دقت 7 دارد (مجموع شماره رقمها) و يك مقياس 3 (رقمهاي سمت راست از نقطه Decimal) را دارا مي باشد. آن مهم مي باشد كه بدانيم دقت و مقياس ارزش يك عدد بر روي طول يك ستون تأثير نمي گذارد. نوع داده طول ستون را تعيين مي كند. دقت و مقياس تعيين مي كند كه چگونه SQL Server داده هاي ذخيره شده در ستونها را تفسير مي كند.

اضافه كردن يك ستون Identity به جدول
1- در يك سل خالي در ستون Column Name كليك مي كنيم.Myidentity را تايپ كرده و سپسTab را فشار مي دهيم. SQL Server ، char را به عنوان يك نوع داده پيشنهاد مي كند.

2- نوع داده ها به decimal تغيير مي دهيم. SQL Server طول ستون را به 9 تغيير داده و فيلدهاي Identity و Scale و Precision را تأييد مي كند.

3- Allow Nulls را تيك مي كنيم.

Nulls
ارزش Nulls يك نوع خاصي از يك ارزش در تكنولوژي رابطه اي مي باشد كه استفاده مي شود براي نشان دادن اينكه يك ارزش ناپيدا يا غير موجود مي باشد استفاده كردن از Nulls قدري پيچيده و مسئله ساز و قطعاً مورد بحث مي باشد.
4- در سل Description و Sample Identity Column را تايپ مي كنيم.
5- فيلد Identity را به Yes تغيير مي دهيم (نه براي Replication)SQL Server براي هر دوي از فيلد Identity Seed و فيلد Increment Identity مقدار 1 را پيشنهاد می دهد.

ارزشهاي Identity
زماني كه شما خصوصيات Identity يك ستون را تنظيم مي كنيد، شما به SQL Server مي گوييد كه يك مقدار را در داخل ستون كه به طور واحد هر سطر را مشخص مي كند قرار دهد. نوع داده انتخاب شده ماهيت دقيق از ستون را تعيين مي كند. ستونهاي Identity مي توانند نوع داده هايي مانند int و Smallint و tinyint يا decimal داشته باشند. زماني كه SQL Server يك سطر را در داخل يك جدول كه داراي يك ستون Identity است قرار مي دهد. آن به طور خودكار ارزشي براي ستون مبني بر ارزش استفاده شده اخير (كه با Identity Seed شروع مي شود) و Identity Increment مشخص شده زماني كه جدول ايجاد شده بود ايجاد مي كند. براي مثال، اگر يك ستون Identity به عنوان يك Small int با Identity Seed ، 50 و يک Identity Increment ، 5 تعريف شود اولين سطر عدد 50 و دومين سطر 55 و سومين سطر 60 و غيره تخصيص داده می شود فقط يک ستون در يک جدول می تواند تنظيمات Identity Property را داشته باشد.

اضافه کردن ستون GUID به جدول
1- در يك سل خالي در ستون Column Nameكليك کرده، My Guid را تايپ کرده و سپس Tab را فشار می دهيم. SQL Server ، نوع داده char را پيشنهاد می دهد.

2- نوع داده را به Uniqueidentifier را تغيير می دهيم. SQL Server طول ستون را به 16 تغيير داده و فيلد IsrowGuid را تأييد می کند.

3- در سل Description ، Sample Guid تايپ می کنيم.
4- IsrowGuid را به Yes تغيير می دهيم. SQL Server يک مقدار پيش فرض به Newid( ) می دهد.

GUIDS
Guid که از GloballyUniqueIdentifier گرفته شده، يک مقادير باينری (1 و 0) 16 بايتی می باشد که هيچ کامپيوتر ديگری در دنيا نخواهد مقدار آن را توليد کند. نوع داده uniqueidentifier برای ذخيره کردن Guids استفاده می شود. SQL Server به طور خودکار مقادير Guid را از همان راهی که مقادير Identity ايجاد می شود، فراهم نمی کند. زيرا يک جدول می تواند شامل Guids چندگانه باشد، اما فقط يک Identity منحصر به فرد باشد. اگر چه، تابع NEWID که SQL Server آن را به صورت پيش فرض در نظر می گيرد زمانی که خصوصيات IsrowGuid ، Yes می شود. يک Guid جديد بر خواهد گشت زمانی که سطر قرار داده می شود.

اضافه کردن يک ستون Data در جدول
1- در يک سل خالی در ستون Column Name کليک کرده، Mydata را تايپ کرده و سپس Tab را فشار می دهيم. SQL Server ، char را به عنوان نوع داده در نظر می گيرد.

2- نوع داده را به datetime تغيير می دهيم. SQL Server طول ستون را به 8 تغيير می دهد.

3- در سل Sample Date Column Description را تايپ می کنيم.

اضافه کردن يک ستون Character به جدول
1- در يک سل خالی در ستون Column Name کليک کرده، Mychar را تايپ و سپس Tab را فشار می دهيم. SQL Server ، char را به عنوان نوع داده در نظر می گيرد.

انواع داده های Character
SQL Server دو نوع مختلف از ستونها Character را پشتيبانی می کند. طول ثابت شده و طول متغير که هر کدام در دو ""Flavors مختلف Unicode و Non-Unicode و 3 طول متفاوت می باشند. Unicode يک روش از علامت کد گذاری می باشد که انواع بايتهای دابل را پشتيبانی می کند. اگر يک ستون به طور طول متغير نمايان شود (برای مثال، varchar يا text برای داده های Non-Unicode و nvarchar و ntext برای داده هایUnicode ) و SQL Server فقط خصوصيت داده های معين وارد شده را ذخيره خواهد ساخت. از طرف ديگر اگر ستون به صورت طول ثابت شده نمايان شود (char برای Non-Unicode داده nchar برای داده های Unicode) و SQL Server مقادير وارد شده را با فضاهای Pad خواهد کرد.
2- طول ستون را به 25 تغيير می دهيم.
3- در سل Description ، Sample Character Column را تايپ می کنيم.
4- Unknown را در سل Default Valve تايپ می کنيم (اطمينان حاصل کنيد که اطراف کلمه ويرگول داشته باشد).

مقادير پيش فرض
يک Default Valve يک عددی می باشد که در داخل يک ستون قرار خواهد گرفت اگر کاربر به طور آشکار يکی را فراهم نکند. ما تاکنون دو نوع ويژه از مقادير پيش فرض را ديده ايم default Values به وسيله SQL Server تهيه می شود زمانی که شما Identity Property را تنظيم می کنيد و تابع NEWID به وسيله SQL Server تهيه می شود زمانی که شما IsrowGuid را تنظيم می کنيد. در حقيقت، شما می توانيد مقادير پيش فرض را برای هر ستون مشخص کنيد. مقادير پيش فرض می تواند دائمی باشد مانند "Unknown" يا 123 توابعی از قبيل NEWID يا GETDATE يا عبارات رياضی مانند 5+3 .

ذخيره کردن و بستن جداول
1- دکمه Save را در نوار ابزار Table Designer کليک می کنيم. SQL Server تعريف جدول را ذخيره می سازد.
2- پنجره را می بنديم.

مديريت جداول
اگر چه "Best Practice" امر می کند که طراحی پايگاه داده تان بايد ثابت باشد قبل از اينکه شما پياده سازی را شروع کنيد. خوشبختانه SQL Server به انجام رسانی وظايف نگهداری را آسان می سازد.

تغيير دادن ستونها
شما می توانيد مجدد Table Designer را برای يک جدول به وسيله کليک راست کردن نام جدول در قاب Details باز کنيد و Design Table را از منوی Context انتخاب کنيد. همان موقعی که Table Designer باز می شود شما می توانيد خصوصيات ستونهای موجود را تغيير دهيد آنها را حذف و يا ستون جديدی را اضافه کنيد.

تغيير نام يک ستون
1- پوشه Tables را برای پايگاه داده Aromatherapy در درخت Console انتخاب می کنيم. SQL Server يک ليستی از جداول در قاب Details را نشان می دهد.

2- جدول 5 Lesson را در قاب Details کليک راست کرده و Design Table را انتخاب می کنيم. SQL Server ، Table Designer را باز می کند.

3- Mychar را در سل Column Name انتخاب و MyCharacter را تايپ می کنيم. SQL Server ، Column Name را تغيير می دهد.

4- دکمه Save را در نوار ابزار Table Designer کليک کرده و تغييرات را ذخيره می سازيم.

برداشتن يک ستون
1- ستون Mydate را به وسيله کليک کردن روی gray Boy در سمت چپ از Column Name انتخاب می کنيم.

2- کليد Delete را فشار می دهيم. SQL Server ستون را برمی دارد.

3- کليد Save را برای ذخيره کردن تغييرات کليک می کنيم.
4- پنجره Table Designer را می بنديم.

تغيير دادن جداول
به طور کلی برای تغيير تعريف ستونهای يک جدول، Enterprise Manager تغيير نام دادن جداول را آسان می سازد و جداول را از پايگاه داده حذف می کند.

تغيير نام يک جدول
1- پوشه Table را در پايگاه داده Aromatherapy در درخت Console راهبری می کنيم. SQL Server يک ليستی از جداول در قاب Details نشان می دهد.

2- جدول 5 Lesson را در قاب Details کليک راست کرده و Rename را انتخاب می کنيم.
3- New Lesson 5 را تايپ و Enter را فشار می دهيم. SQL Server کادر محاوره ای Rename را نشان می دهد که به شما اخطار می کند که تغيير در نام جدول هر رابط برای آن را در شئی های ديگر، باطل خواهد کرد.

4- View Dependencies را برای نشان دادن هر شئی که ممکن است به وسيله تغييرات تأثير يابد را کليک می کنيم. SQL Server کادر محاوره ای Dependencies را باز می کند.

5- Close را برای مرخص کردن کادر محاوره ای کليک می کنيم.
6- Yes را در کادر محاوره ای Rename برای تأييد تغيير نام کليک می کنيم. SQL Server نشان می دهد يک متنی را که تکميل موفقيت آميز تغيير نام را تأييد می کند.

برداشتن يک جدول
1- New Lesson 5 را در قاب Details انتخاب می کنيم.
2- کليد Delete را فشار می دهيم. SQL Server کادر محاوره ای Drop Object را نشان می دهد.

راهنمايی: شما می توانيد دکمه Show Dependencies را برای نشان دادن هر Objects که متأثر خواهد شد به وسيله حذف جدول کليک کنيد.
3- Drop All را کليک می کنيم. SQL Server جدول را از پايگاه داده برمی دارد.
مهم: زمانی که شما يک جدول را حذف می کنيد، جدول و همه داده هايش به طور دائمی از پايگاه داده برداشته می شود و تنها راه برای بازگرداندن آن نسخه پشتيبان پايگاه داده می باشد.
لينک مقاله
http://sqlserver.persianblog.com :منبع

مقالات مرتبط با اين موضوع
خلاصه سازی داده ها | sqlserver
ارتباط دادن جداول | sqlserver
مرتب سازی و انتخاب کردن سطرها | sqlserver
عبارت SELECT | sqlserver
بازيابی سطرها | sqlserver
ايجاد کردن نمودار پايگاه داده | sqlserver
شناخت عبارت INSERT | sqlserver
جداول موقت | sqlserver
ايجاد کردن ارتباطات | sqlserver
ايجاد کردن Check Constraint | sqlserver
ايجاد کردن شئی های جدول | sqlserver
ايجاد کردن يک پايگاه اطلاعاتی | sqlserver
ايجاد كردن جداول و تغییر دادنشان | sqlserver
شناخت ايندکس ها | sqlserver
امنيت 2000 SQL Server | sqlserver
نسخه برداری کردن و باز گرداندن پايگاه داده ها | sqlserver
معرفی SQL و دستورات عمومی آن | sqlserver

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


ايجاد کردن يک پايگاه اطلاعاتی
در محيط SQL Server شما جداول، نماها و ديگر شیءها که مربوط به تنظيم اطلاعات در يک پايگاه داده می باشد را ذخيره می کنيد. بنابراين اولين گام برای نمايش دادن يک برنامه پايگاه اطلاعاتی، به طور آشکار، ايجاد پايگاه داده می باشد و در اين درس خواهيم آموخت که چگونه آن را انجام دهيم.

ايجاد کردن پايگاه داده ها
برای هر پايگاه داده منطقی، SQL Server دو فايل فيزيکی ايجاد می کند: يکی برای Objects و ديگری برای Transaction Log .
راهنمايی: اگر چه به وسيله SQL Server پيش فرض يک محل يکسان برای هر دوی پايگاه داده فايل و Transaction Log پيشنهاد می کنيم. در يک سيستم Production شما بايد معمولاً Transaction Log را در يک محلی ديگر ترجيحاً روی يک ماشين ديگر ذخيره سازيد که آن را ممکن می سازد به بازگرداندن پايگاه داده در حالتی از ناتوانی سخت افزار که خوانده شدن از ديسک جلوگيری می کند.

ايجاد کردن يک پايگاه داده جديد
اگر چه آن ممکن است به ايجاد يک پايگاه داده جديد به وسيله انتخاب دستور New Database در منوی محتويات پوشه Database که ساده ترين راه برای استفاده کردن از Create Database Wizard می باشد.

ايجاد يک پايگاه داده جديد
1- پوشه Database را از Server که شما استفاده می کنيد برای اين درسها راهبری می کنيم. SQL Server ليستی از پايگاه داده را در قاب Details نشان می دهد.

2- دکمه Wizard را روی نوار ابزار Manager Enterprise کليک می کنيم. SQL Server کادر محاوره ای The Select Wizard را نشان می دهد.

3- Create Database Wizard را از بخش Database انتخاب کرده و OK را کليک می کنيم. SQL Server اولين صفحه از Wizard را نشان می دهد.

4- Next را کليک کرده Create Database Wizard يک صفحه که نام و محل پايگاه داده را درخواست می کند نشان می دهد.

5- 4 Lessen را در فيلد نام پايگاه داده تايپ می کنيم.
6- دکمه Brows را برای تغيير محل فايل پايگاه داده کليک می کنيم. ويزارد يک کادر محاوره ای را که محل جديد را درخواست می کند نشان می دهد.

مکانهای فايل پايگاه داده
زمانی که SQL Server اولين بار نصب می گردد، آن در محل پيش فرض MS SQL / Data برای فايلهای پايگاه داده جديد در پوشه آنجايی که Server نصب می گردد قرار می گيرد. اين پيش فرض در The Create Database Wizard تعبيه شده است. برای تغيير دائمی پيش فرض شما می توانيد يک مکان جديد روی زبانه Settings پايگاه داده از کادر محاوره ای SQL Server Properties برقرار کنيد که در دسترس می باشد. با کليک راست کردن Server در درخت Console ، Properties را انتخاب کرده سپس زبانه Settings پايگاه داده را انتخاب می کنيم.

6- پوشه Step by Step 2000 The SQL را به ريشه دايرکتوری هدايت کرده و سپس OK را کليک می کنيم. ويزارد مکان فايل پايگاه داده را برای دايرکتوری انتخاب شده فراهم می کند.
7- دکمه Browse را برای تغيير موقعيت Transaction Log کليک می کنيم. ويزارد يک کادر محاوره ای که يک موقعيت جديد را درخواست می کند نشان می دهد.

8- پوشه Step by Step 2000 SQLرا به ريشه دايرکتوری فرستاده و سپس OK را کليک می کنيم. ويزارد مکان فايل Log Transaction را برای دايرکتوری انتخاب شده تنظيم می کند.
9- Next را کليک می کنيم. ويزارد يک صفحه ای که نام و اندازه اوليه برای فايل پايگاه داده درخواست می کند نشان می دهد.

10- Next را کليک می کنيم. ويزارد نشان می دهد صفحه ای که به شما اجازه می دهد به انتخاب اينکه آيا فايلهای پايگاه داده به طور خودکار افزايش می يابد و يا اينکه فقط زمانی که شما آنها را بسط می دهيد افزايش می يابد. برای اين تمرين تنظيمات پيش فرض را می پذيريم.

11- Next را کليک کرده ويزارد يک صفحه ای را که از شما نام و سايز اصلی برای Transaction Log را درخواست می کند نشان می دهد.

12- Next را کليک کرده ويزارد يک صفحه ای را نشان می دهد که اجازه می دهد به شما انتخاب کنيد که آيا Transaction File بايد به طور خودکار افزايش يابد.

13- Next را کليک کرده ويزارد يک صفحه ای را برای تأييد انتخابهايی که شما ساخته ايد نشان می دهد.

14- Finish را کليک کرده ويزارد پايگاه داده و فايلها Transaction Log را ايجاد می کند و سپس می پرسد آيا شما می خواهيد يک طرح نگهداری برای پايگاه داده جديد ايجاد کنيد.

15- NO را کليک کرده ويزارد بسته می شود.

تنظيمات خصوصيات پايگاه داده
زمانی که شما با Create Database Wizard يک پايگاه داده ايجاد می کنيد. شما مشخصه يا خصوصيات از پايگاه داده را مشخص می کنيد مانند نام پايگاه داده و مکانهای فايل. بعد از اينکه پايگاه داده ايجاد می شود، شما می توانيد اين خصوصيات را به وسيله تغيير دادن تنظيمات appropriate در کادر محاوره ای databases Properties تغيير دهيد.
برای مثال بزرگ کردن اندازه فايل داده فيزيکی Growing The File در عبارت SQL Server هست به طور واضح يک عملياتی که به آهستگی زمان مسئوليت پذيری جواب گويی Server را پايين می آورد. اگر شما پيدا کنيد SQL Server که اغلب مجبور به بزرگ کردن فايل می باشد، ممکن است شما تغيير تنظيمات درصد رشد فايل را در کادر محاوره ای Properties مورد ملاحظه قرار دهيد. بنابراين Server فايل را بيش تر از ارزش پيش فرض 10 درصد رشد خواهد شد.

تغيير درصد رشد فايل پايگاه داده
1- پايگاه داده 4Lesson را در درخت Console انتخاب می کنيم.
2- دکمه Properties را در نوار ابزار کليک می کنيم. SQL Server کادر محاوره ای databases Properties را نشان می دهد.

3- زبانه Data Files را کليک کرده SQL Server خصوصياتی از فايلهای داده پايگاه داده را نشان می دهد.

4- درصد رشد 20 درصد قرار می دهيم.

5- را کليک می کنيم. SQL Server يک خصوصيت جديد را ايجاد کرده و کادر محاوره ای Properties را می بندد.

مديريت پايگاه داده ها
به طور کلی برای تغيير دادن خصوصيات يک پايگاه داده، شما گاه گاهی نياز به حذف همگی آنها خواهيد داشت که Manager Enterprise آن را خيلی ساده می سازد.
نکته: کارهای مديريت ديگری که شما ممکن بخواهيد به انجام رسانيد نامگذاری مجدد پايگاه داده، در داخل Manager Enterprise نمی تواند انجام شود. ما در درس 28 خواهيم آموخت که چگونه يک پايگاه داده را مجدد نامگذاری کنيم.

حذف کردن يک پايگاه داده
زمانی که پايگاه داده ای که ايجاد کرده ايد خيلی زياد مورد نياز نباشد. شما می توانيد آن را از Server حذف کنيد. حذف يک پايگاه داده هر دوی فايلهای فيزيکی گردآوری شده با پايگاه داده و همه منابع پايگاه داده در جداول سيستم را برمی دارد.
راهنمايی: آن يک نظر خوبی است که يک نسخه پشتيبان از پايگاه داده های سيستم بعد از اينکه پايگاه داده حذف می گردد ايجاد کنيم.

حذف يک پايگاه داده
1- پايگاه داده 4 Lesson را در درخت Console انتخاب می کنيم.
2- کليد Delete را فشار می دهيم. SQL Server يک متنی که از شما برای تأييد حذف درخواست می کند نشان می دهد.

4- Yes را کليک کرده SQL Server جايگاه داده ها و همه منابع گردآوری شده را از Server برمی دارد.
لينک مقاله
http://sqlserver.persianblog.com :منبع

مقالات مرتبط با اين موضوع
خلاصه سازی داده ها | sqlserver
ارتباط دادن جداول | sqlserver
مرتب سازی و انتخاب کردن سطرها | sqlserver
عبارت SELECT | sqlserver
بازيابی سطرها | sqlserver
ايجاد کردن نمودار پايگاه داده | sqlserver
شناخت عبارت INSERT | sqlserver
جداول موقت | sqlserver
ايجاد کردن ارتباطات | sqlserver
ايجاد کردن Check Constraint | sqlserver
ايجاد کردن شئی های جدول | sqlserver
ايجاد کردن يک پايگاه اطلاعاتی | sqlserver
ايجاد كردن جداول و تغییر دادنشان | sqlserver
شناخت ايندکس ها | sqlserver
امنيت 2000 SQL Server | sqlserver
نسخه برداری کردن و باز گرداندن پايگاه داده ها | sqlserver
معرفی SQL و دستورات عمومی آن | sqlserver

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


ايجاد کردن شئی های جدول
ايجاد کردن شئی های جدول
در درسهای گذشته، شما آموختيد که چگونه خصوصيات گوناگون از قبيل مقادير پيش فرض و Check Constraints برای ستونهای خاص از يک جدول تخصيص دهيم. بعضی مواقع اگر چه، يک نوع خاص از ستون در چندين جدول مختلف استفاده می گردد. در اين وضعيت، آن اغلب مفيد می باشد به ايجاد Properties در يک جای جداگانه به طوری که آنها را برای هر جدول به کار ببريم.
پيش فرضها، نقشها و انواع داده تعريف شده کاربر مکانيزمی را برای ايجاد و نگهداری اين شئی ها در يک مکان جداگانه فراهم می آورند. برای مثال شما يک مدل پايگاه داده برای جوابگويی به ارزيابی مشتری می سازيد. شما در ابتدا تصميم می گيريد که مقدار پيش فرض برای هر سؤالی که جواب داده نشده بايد Unknown"" شوند. اگر شما يک پيش فرض ايجاد کنيد و پيش فرضها را برای ستون مناسب پيوند دهيد. شما می توانيد بعداً پيش فرض را به Unanswered تغيير دهيد. بدون هيچ تغييری هر ستون، آن پيش فرض را استفاده می کند.

شناخت پيش فرضها
توابع پيش فرض از همان راهی که خصوصيات پيش فرض که شما مشخص می کنيد زمانی که شما يک ستون در Table Designer ايجاد می کنيد آنها مقاديری هستند که به طور خودکار به وسيله SQL Server تخصيص داده می شوند. اگر کاربر يک مقدار را زمانی که سطری را ايجاد می کند مشخص نکند. اگر چه پيش فرض، شئی های سطح پايگاه داده می باشند که می تواند برای چندين ستونها به کار برده شوند.

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

ايجاد کردن يک پيش فرض
1- پوشه Defaults را از پايگاه داده Aromatherapy از درختConsole جستجو می کنيم. SQL Server يک ليستی از Default ها را در قالب Details نشان می دهد. (چيزی در پايگاه داده Sample وجود ندارد).

2- دکمه Newرا کليک کرده، SQL Server کادر محاوه اي Default Properties را نشان می دهد.

3- در فيلدName ، Default Unknown را تايپ مي کنيم.

4- "Unknown" را در فيلد Value تايپ می کنيم.

5- OK را کليک کرده،SQL Server پيش فرض را ايجاد می کند.

ربط دادن يک پيش فرض به يک ستون
1- پوشهTables را راهبری کرده، Table Designer را برای جدول Oil با کليک راست کردن نام جدول در قاب Details باز کرده و Table Design را انتخاب می کنيم.

2- يک ستون جديد برای جدولی که Sample ناميده شده اضافه می کنيم. انواع داده پيش فرض را پذيرفته و طول آن به وسيله SQL Server پيشنهاد می گردد.

3- فيلد Default Valve را برای ستون کليک کرده و سپس dbo.DefaultUnknown را از ليست انتخاب می کنيم.

4- دکمه Save را کليک کردهSQL Server جدول را ذخيره می کند.

قطع پيوند يک پيش فرض
1- اگر Table Designer برای جدول Oilsاز تمرين قبل باز نيست، آن را به وسيله کليک راست کردن نام جدول در قاب Pet ail> باز کرده و Design Table را انتخاب مي کنيم. SQL Server، Table Disdainer را باز مي کند.

2- ستون Sampleرا انتخاب کرده، Table Designerخصوصيات اين ستون را نشان می دهد.

3- dbo.DefaultUnknown را در فيلد Default Value انتخاب کرده و کليد Delete را برای برداشتن مقدار فشار می دهيم.

4- دکمه Save راکليک کرده SQL Server تغييرات برای تعريف ستون را ذخيره می سازد.

شناخت نقشها
نقشها مانند پيش فرضها سطوح شئی های پايگاه داده می باشند که می تواند برای ستونها در جداول چندگانه به کار برده شوند. يک نقش Check Constraint موجود می باشد که مشخص می کند مقادير داده ها در يک ستون مورد قبول می باشند، اما استفاده از آن بيشتر محدود شده است. يک ستون می تواند چندين Check Constraintداشته باشد که برای آن به کار برده می شود.
راهنمايی: مايکروسافت نقشها و توصيه ها را که با Check Constraint جايگزين می شود را درست نمی داند. اگر چه نقشها هنوز جايگاهشان را در پايگاه داده هایSQL Server دارند از زمانی که فقط يک وظيفه بتواند برای نوع داده هايی که به وسيله SQL Server تعريف شده به کار برده شود.
برخلاف Check Constraint ، يک نقش نمی تواند مبنايی برای يک ستون به طور مستقيم باشد. در عوض، مقاديری که يک نقش به کار می برد به نقشی که در يک متغيری که فرمت@Variable Name مي گيرد داده می شود. در مورد متغيرها در Detail در فصل 24 بحث خواهيم کرد.

ايجاد کردن نقشها
از زمانی که نقشها مانند Defaults مستقل از شئی های پايگاه داده می باشند، شما بايد آنها را قبل از اينکه شما بتوانيد آنها را برای يک ستون در جدول به کار ببريد ايجاد کنيد.

ايجاد يک نقش
1- پوشه نقش را از پايگاه داده در درخت Console راهبری کرده SQL Server يک ليستی از نقشها در پايگاه داده نشان می دهد. (ليست در پايگاه داده Sample خالی می باشد)

2- دکمه New را کليک کردهSQL Server کادر محاوره ای را باز می کند.

3- Sample Rule را به عنوان نام نقش تايپ می کنيم.

4- LEN(@Fldalue)>3 را به عنوان متن نقش تايپ می کنيم.

راهنمايی: به خاطر داشته باشيد LEN يک تابعTransact SQL می باشد که تعدادی از کاراکترها را در يک متن رشته ای برمی گرداند و اينکه @ قبل از يک بر چسب عبارتTransact SQL يک متغيــر را نشان می دهد، يک مقدار که برای عبارت داده می شود. بنابراين در اين حالت نقش Trueمی گردد اگر طول ستون بزرگتر از 3 باشد.
5-OK را کليک کرده، SQL Server کادر محاوره ای Rule Properties را می بندد و نقش را ايجاد می کند.

ربط دادن يک Rule به يک ستون
1- کادر محاوره ای Rule Properties را برایSample Rule به وسيله دابل کليک کردن نام Rule در قاب Details باز می کنيم. SQL Server کادر محاوره ای Rule Properties را نشان می دهد.

2- ستونBind را کليک کرده SQL Server کادر محاوره ایBind Rule to Columns را نشان می دهد.

3- [dbo].[Oils] را درTable Combo Box انتخاب می کنيم.SQL Server فيلدها را در جدول Oils نشان می دهد.

4- ستون Sample را در ليست Unbound Columns انتخاب کرده و سپس Add را کليک می کنيم. SQL Server ستون را به ليست Bound Columns حرکت می دهد.

5- SQL Server کادر محاوره ايBind Rule to Columns را می بندد.
6-OK را مجدداً برای بستن کادر محاوره ای Rule Properties کليک می کنيم.

شناخت User-Defined Data Types
نقشها و پيش فرضها مکانيزم مفيدی برای نگهداری محدوديتهای پايگاه داده ها می باشند، اما SQL Server حتی مکانيزم قوی تری در User-Defined Data Typesها فراهم می آورد. User-Defined Data Types بر مبنای هيچ نوع از پايگاه داده حقيقی مشخص نمی گردد و شامل مشخصاتی از طول ستون می باشد. به طور کلی نقشها و پيش فرضها ممکن است به طور انتخابی برای يکUser-Defined Data Types به کار برده شوند. زمانی که يک ستون بر مبنای يک User-Defined Data Typesايجاد می گردد، ستون جدول همه خصوصيات مشخص شده را برای آن نمونه به ارث خواهد برد. زمانی که مشخصات از User-Defined Data Typesتغييرمی يابد،نقشها برای ستونها بر اساس آن نمونه همچنين تغيير خواهد کرد.
راهنمايی: اگر يک User-Defined Data Type در پايگاه داده Model ايجاد گردد، همه پايگاه داده جديد به طور خودکار به آن نوع دسترسی خواهد داشت.

ايجادکردن User-Defined Data Types
User-Defined Data Types از شئی های پايگاه داده مستقل می باشند و بايد در داخل پايگاه داده تعريف شوند قبل از اينکه آنها بتوانند به ستونها تخصيص داده شوند.

ايجاد کردن يک User-Defined Data Types
1- پوشه User-Defined Data Types را از پايگاه داده Aromatherapy راهبری می کنيم. SQL Server يک ليستی ازUser-Defined Data Types را نشان می دهد (چيزی در پايگاه داده Sample وجودندارد).

2- دکمه New را کليک کرده SQL Server کادر محاوره اي User-Defined Data Types را نشان می دهد.

3- MySample را به عنوان نام User-Defined Data Types تايپ می کنيم.

4- نوع داده پايگاه را varchar و طول آن را 20 قرار می دهيم.

5- Dbo.Sample Rule را در Rule Combo Box انتخاب می کنيم.

6- مقادير پيش فرض برای Allow Nulls و گزينه های پيش فرض را می پذيريم و OKرا کليک می کنيم. SQL Server ، User-Defined Data Types را ايجاد می کند.

تخصيص يک ستون برای يک User-Defined Data Types
1- Table Designer را برای جدول Oils به وسيله کليک راست کردن نام آن در قاب Details باز می کنيم و Details Table را انتخاب می کنيم. SQL Server ، Table Designer را باز می کند.

2- ستون Sample را انتخاب کرده وMySample را از Data Type Combo Boxرا انتخاب می کنيم. Data Type , SQL Server را برای MySampleقرار می دهد.
راهنمايی: User-Defined Data Types در پايين ليست Data Type می باشد.

3- دکمهSave را کليک کردهSQL Server جدول را با تعريف جديد ذخيره می سازد.
لينک مقاله
http://sqlserver.persianblog.com :منبع

مقالات مرتبط با اين موضوع
خلاصه سازی داده ها | sqlserver
ارتباط دادن جداول | sqlserver
مرتب سازی و انتخاب کردن سطرها | sqlserver
عبارت SELECT | sqlserver
بازيابی سطرها | sqlserver
ايجاد کردن نمودار پايگاه داده | sqlserver
شناخت عبارت INSERT | sqlserver
جداول موقت | sqlserver
ايجاد کردن ارتباطات | sqlserver
ايجاد کردن Check Constraint | sqlserver
ايجاد کردن شئی های جدول | sqlserver
ايجاد کردن يک پايگاه اطلاعاتی | sqlserver
ايجاد كردن جداول و تغییر دادنشان | sqlserver
شناخت ايندکس ها | sqlserver
امنيت 2000 SQL Server | sqlserver
نسخه برداری کردن و باز گرداندن پايگاه داده ها | sqlserver
معرفی SQL و دستورات عمومی آن | sqlserver

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


ايجاد کردن Check Constraint
ايجاد کردن Check Constraint
شناخت Check Constraint
يکی از مهمترين بازرسی های طراحی پايگاه داده يکپارچه سازی داده ها می باشد. قاعده يکپارچگی داده ها تضمين مي کند که داده های ايجاد شده در پايگاه داده اگر درست نباشد حداقل قابل قبول می باشد. چندين سطح از يکپارچگی داده ها وجود دارد. در درس 7 ما درباره يکپارچگی رابطه ای مطالعه کرديم که تضمين می کند اجتماع بين جداول ايجاد و به طور صحيح نگهداری می گردند.
Check Constraintsبرای اجرای دو فرم اضافی از يکپارچگی پايگاه داده استفاده می شود. domain Integrity و entity Integrity . در اصطلاحات رابطه ای که Domain محدوده ای از مقاديری است که يک ستون می تواند داشته باشد. نوع داده های يک ستون يکی از ويژگيهای از يک Domain می باشد، اما تعريف نوع داده معمولاً کافی نيست. برای مثال، يک ستون Smallint می تواند شامل مقادير صحيح از 768/32- تا 767/32 می باشد که ممکن نوع داده مناسبی برای يک ستونی که شامل سالی است که يک کارمند مدرک دانشگاهي را در دريافت می کند باشد. اما حدود اصلی مقادير ستون Year Degree Awarded بيشتر محدود شده و بين 1900 و سال جاری می باشد. شما از يک Check Constraints استفاده می کنيد، برای تخمين اينکه هيچ کس به طور واقعی مقادير 1543 يا 2075 را به عنوان مقدار ستون وارد نمی کند. Entity Integrity Constraints جامعيت از موجودی خودش را اجرا می کند. مهمترين محدوديتهای يکپارچگی موجوديت آن است که هر موجوديت Entity Integrity بايد به طور واحد قابل شناسايی باشد. اين محدوديت به وسيله مشخص کردن يک کليد اصلی برای جدول انجام می گيرد. يکپارچگی موجوديت همچنين می تواند درگير ارزيابی شرطی از چندين ستون در يک جدول باشد و اين نوع از محدوديت اغلب بيشتر با استفاده از Check Constraints انجام می گيرد. برای مثال، اگر يک جدول شامل ستونهای کشور و ايالت باشد شما ممکن از يک Check Constraints برای مشخص کردن اينکه ارزش ستون State ، "AZ" معتبر می باشد فقط اگر ستون Country شامل مقادير USA باشد. Check Constraint به عنوان Boolean Expressions شناخته می شود يک Boolean Expressions برای مقادير True يا False ارزيابی می گردد. Boolean Expressions را در درس 13 می آموزيم. در اين درس ما از عبارت LEN()>=4 استفاده می کنيم. LEN يک تابع Transact-SQL می باشد که تعدادی کارکترهای يک رشته را برمی گرداند. بنابراين عبارت LEN()>=4 ارزش آن اگر شامل 4 يا بيشتر کارکتر باشد ارزش آن True و اگر کمتر از 4 باشد ارزش آن False می گردد.

ايجاد کردن Check Constraint)
مانند ايندکس ها و پيوندها شما می توانيد Check Constraints را با استفاده از کادر محاوره ای Properties از Table Designer ايجاد کنيد.
1- Table Designer را برای جدول Oils به وسيله کليک راست کردن نام جدول در قاب Details باز کرده و Design Table را انتخاب می کنيم. Table Designer , SQL Server را باز می کنيم.

2- دکمه Constraints را کليک کرده SQL Server کادر محاوره ای Table Designer Properties را با صفحه خصوصيات Constraints Check نشان داده شده باز می کنيم.

3- New را کليک کرده Ck-Oils , SQL Server را به عنوان نام محدوديت پيشنهاد می دهد. برای اين مثال اين نام را می پذيريم.

4- Len(Oil Name)>=4را به عنوان عبارت محدوديت وارد می کنيم.

راهنمايی: اگر شما يک Check Constraint جديد را ايجاد می کنيد و مراقب نيستيد که آيا داده های موجود متابعت می شوند، شما می توانيد بگويد به SQL Server که از ايجاد کردن داده به وسيله چک نکردنCheck Existing Data On Creation از محدوديت چشم پوشی کند.
5- Close را کليک کرده SQL Server کادر محاوره ای Designers Properties Table را می بندد.
6- دکمه Save را کليک کرده SQL Server کنترل می کند که همه سطرها در جدول باCheck Constraint مواجه می شوند و سپس محدوديت را ذخيره می کنيم.

مديريت Check Constraints
به عنوان بخشی از طرح پايگ اه داده، Check Constraints نبايد تحت شرايط نرمال نياز به مقدار زياد نگهداری داشته باشد. شما آنها را يکباره تعريف کرده زمانی که پايگاه داده را ايجاد می کنيد. اگر چه طرحهای پايگاه داده به تدريج تغيير خواهد کرد. تغييرات Check Constraints تغيير خواهد کرد. Enterprise Manager نگهداری محدوديتها را آسان می سازد.

تغيير دادن Check Constraint
Table Designer مکانيزمی برای تغيير متن از يک Check Constraint از همان کادر محاوره ای که شما برای ايجاد آن استفاده کرديد فراهم می کند.

تغيير متن محدوديت
1- اگر Table Designer برای جدول Oils هنوز از تمرين قبل باز نمی باشد به وسيله کليک راست کردن نام جدول در قاب Details آن را باز کرده وDesign Table را انتخاب می کنيم. Table Designer , SQL Sarver را باز می کند.

2- دکمه Constraints را کليک کرده SQL Sarver کادر محاوره ایTable Designer را با صفحه خصوصيات Check Constraint باز می کند.

3- اطمينان حاصل کنيد کهCk – Oilsدر Constraint Combo Box انتخاب شده نشان داده شده است.
4- متن محدوديت را برایLEN (Oil Name )>2 به عنوان عبارت محدوديت جديد تغيير می دهيم.

5- Close را کليک کردهSQL Server کادر محاوره ایTable Designer’s Properties را می بندد.
6- دکمه Save را کليک کرده SQL Server همه سطرها در جدول را که با Check Constraint جديد مواجه است را کنترل کرده و سپس محدوديت را ذخيره می سازد.

نگهداری Check Constraints
مانند ديگر خصوصيات جدول ديگر، Check Constraints در کادر محاوره ای Properties ازTable Design نگهداری می گردد.

تغيير نام يک Check Constraints
1- Table Designer برای جدول Oils به وسيله کليک راست کردن نام جدول در قاب Details باز کرده و Design Table را انتخاب می کنيم. Table Designer , SQL Server را باز می کنيم.

2- دکمه Constraints را کليک کرده SQL Server کادر محاوره ای Table Designers Properties را با صفحه خصوصيات Check Constraint نشان داده شده باز می کند.

3- Ck-Oils را در فيلد Constraint Name انتخاب کرده و آن را به Ck-Deleteme تغيير می دهيم.

4- Close را کليک کرده SQL Server کادر محاوره ای Properties را می بندد.
5- دکمه Save را کليک کردهSQL Server همه سطرها در جدول که باCheck Constraint مواجه شده اند را کنترل می کند و سپسConstraint ذخيره می گردد.

حذف يک Check Constraint
1- Table Designer برای جدول Oils را به وسيله کليک راست کردن نام جدول در قاب Details باز کرده و جدول Design را انتخاب می کنيم. Table Designer , SQL Server را باز می کند.

2- دکمه Constraints را کليک کرده SQL Server کادر محاوره ای Table Designers Properties را با صفحه خصوصياتCheck Constraint نشان داده شده باز می کنيم.

3- اطمينان حاصل کنيد که Ck-Deleteme در فيلد محدوديت انتخاب شده می باشد و سپس Delete را کليک می کنيم. SQL Server محدوديت را برمی دارد.

4- Close را کليک کرده SQL Server کادر محاوره ای Properties را می بندد.
5- دکمه Save را کليک می کنيم. SQL Server محدوديت را برمی دارد.
6- Table Designer را می بنديم.
لينک مقاله
http://sqlserver.persianblog.com :منبع

مقالات مرتبط با اين موضوع
خلاصه سازی داده ها | sqlserver
ارتباط دادن جداول | sqlserver
مرتب سازی و انتخاب کردن سطرها | sqlserver
عبارت SELECT | sqlserver
بازيابی سطرها | sqlserver
ايجاد کردن نمودار پايگاه داده | sqlserver
شناخت عبارت INSERT | sqlserver
جداول موقت | sqlserver
ايجاد کردن ارتباطات | sqlserver
ايجاد کردن Check Constraint | sqlserver
ايجاد کردن شئی های جدول | sqlserver
ايجاد کردن يک پايگاه اطلاعاتی | sqlserver
ايجاد كردن جداول و تغییر دادنشان | sqlserver
شناخت ايندکس ها | sqlserver
امنيت 2000 SQL Server | sqlserver
نسخه برداری کردن و باز گرداندن پايگاه داده ها | sqlserver
معرفی SQL و دستورات عمومی آن | sqlserver

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


ايجاد کردن ارتباطات
بيشتر پايگاه داده در نظر گرفته مي شوند به صورت مدلهايي که در دنيای واقعي وجود دارد که به صورت Problem Space شناخته شده است.در سطح منطقی، شیءها در Problem Space موجوديتها و اجتماع بين آنها می باشد که با هم در ارتباطند. در سطح فيزيکی، SQL Server موجوديتها را به صورت جداول و ارتباط ها به صورت محدوديت کليدهاي خارجي نشان مي دهد که کليدهاي خارجي را تعريف مي کند.

مدل رابطه اي
بيشتر مردم معتقدند که پايگاههاي داده رابطه اي Relational ناميده مي شود زيرا ارتباطات بين جداول ايجاد مي گردد. در حقيقت، توصيف آن از اصلاح Relation مي آيد که Dr .E .F .codd (که او در اصل مدل رابطه اي را در اواخر 1960 گسترش داده) برگزيده شد براي تشريح شئی ها که در SQL Server به صورت جداول به کار برده مي شود.
به صورت منطقي سه نوع ارتباط وجود دارد: يک به يک که هر سطر از يک جدول به صفر يا يک سطر از جدول ديگر ربط مي شود. يک به چند که هر سطر از يک جدول به صفر، يک يا سطرهاي بيشتر در ديگر جداول مربوط مي شود و چند به چند که هر سطر در جدول اول به صفر، يک و چندين سطر از جدول دوم مربوط مي شود. هر سطر در دومين جدول مي تواند به صفر، يک يا سطرهاي بيشتر در جدول اول مربوط شود. ارتباطات يک به يک نسبتاً نادر مي باشد. آنها اغلب زماني که يک مجموعه از مشخصات فقط براي مقداري از نمونه هاي موجوديتها به کار مي رود استفاده مي گردند. براي مثال، فقط يک زير مجموعه کوچکي از کارمندان که در شرکت در تيم Softball بازي مي کنند. يک طراح پايگاه داده ممکن است همه ويژگيهاي تيم Softball را در يک جدول قرار دهد و سپس يک ارتباط يک به يک بين آن و جدول کارمندان ايجاد کند. از طرف ديگر ارتباطات يک به چند کاملاً رايج مي باشند. در پايگاه داده نمونه مان، يک ارتباط يک به چند بين جدول Plant Parts وOils ايجاد می گردد. هر سطر موجود در جدول Plant Parts می تواند به صفر، يک يا سطرهای بيشتر در جدول Oils مربوط شود. ارتباط چند به چند همچنين رايج مي باشند. براي مثال، يک ارتباط چند به چند بين جدول Properties و جدول oils ايجاد مي گردد هر Oil موجود مي تواند چندين Properties داشته باشد و هر Properties به چندين oils تخصيص داده مي شود. SQL Server مانند ديگر موتورهاي پايگاه داده رابطه اي به صورت مدلهاي يک به يک و يک به چند به طور مستقيم به يکديگر مربوط مي شوند. اما آن يک نوع ويژه از جدول را که به صورت Junction Table شناخته شده براي تجزيه کردن جداول چند به چند استفاده مي کند. يک Junction Table شامل کليدهاي اصلي از جداول در دو طرف ارتباط مي باشند. يک ارتباط يک به چند بين جدول Junction و هر جدول اصلي که در شکل 1-7 نشان داده شده ايجاد مي گردد.

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

در سطح جدول، يک ارتباط با موجود بودن شناسه واحد که معمولاً کليد اصلي مي باشد، از يک جدول از يک طرف (که جدول کليد اصلي ناميده مي شود) به جداولی از سوي ديگر (که جدول کليد خارجي ناميده مي شود) مدل سازي مي شود. شناسه به صورت کليدهاي خارجي شناخته مي شود.
راهنمايي: شناسه واحد که به صورت کليد خارجي استفاده مي شود معمولاً کليدهاي اصلي از کليد اصلي جدول مي باشد اما آن مي تواند ستون باشد يا مجموعه يا ستونهايی که به صورت واحد آشکار مي گردد. SQL Server مي تواند ارتباطاتي که شما در پايگاه داده ايجاد کرده ايد را اجرا کند. که اين Maintaining Referential in Tearing ناميده مي شود. به طور پيش فرض SQL Server هر تغييري بر روي کليدهاي اصلي از يک ستون از کليد اصلی جدول که به ستونهايي از کليد خارجي جدول مربوط شده را نخواهد پذيرفت. مورد جديد در SQL Server توانايي انتشاری کردن تغييرات براي کليد اصلي جدول مي باشد. اگر شما به SQL Server بگوييد براي حذف درختي ارتباط، حذف يک سطر در کليد اصلي جدول سبب خواهد شد که SQL Server همه سطرها مربوط به کليد خارجي جدول را حذف کند. به همين صورت، اگر شما به SQL Server بگوييد به روز رساني انتشاري را صورت دهد. تغيير کليد اصلي از کليد اصلي جدول سبب خواهد شد که ستونهاي کليد خارجي جدول به روز گردد.
مهم: تعدادي از طرحهاي پايگاه داده مي تواند کاملاً پيچيده باشد. با استفاده از حذف و به هنگام سازي انتشاري، نگهداري ساختار پيچيده داده مي تواند ساده شود. اما SQL Server نياز دارد که انتشارها چرخشی نباشند. برای مثال حذف يک سطر در جدول A می تواند سبب حذف يک سطر در جدول B شود که به اين صورت باعث حذف يک سطر در جدول C می گردد. ولی عکس اين قضيه صادق نيست.

ايجاد ارتباطات
در SQL Server ، ارتباطات از طريق زبانه Relationships در کادر محاوره اي Table Designers Properties ايجاد مي گردد به طور کلي ارتباط يک به يک و يک به چند دقيقاً مثل هم به وجود مي آيند. SQL Server انواع ارتباطات را بر اساس ستونهاي مشخص شده در کليدهاي خارجي جداول معين خواهد کرد. اگر يک ايندکس واحد در ستونهاي کليد خارجي وجود داشته باشد ارتباط يک به يک خواهد بود در غير اين صورت يک به چند خواهد بود.

ايجاد يک ارتباط
1- Table Designer را براي جدول Oilsبه وسيله کليک راست کردن نام جدول در قاب Detailsباز مي کنيم و جدول Design را انتخاب مي کنيم. SQL Server،Table Designer را باز مي کند.

2- دکمه Relation Ships را در نوار ابزار Table Designer کليک کرده SQL Serverکادر محاوره اي Table Designers Properties را با صفحه خصوصيات Relationships نشان داده شده باز مي کند.

3- New را کليک کرده SQL Server اولين جدول درليست جداول را براي ارتباط جديد درخواست مي کند.

4- Planttypes را به عنوان کليد اصلي جدول انتخاب مي کند.FK- Oils- Planttypes , SQL Server را به عنوان نام ارتباط پيشنهاد مي کند.

5- Planttypes ID را به عنوان فيلد کليد اصلي انتخاب مي کنيم.

6- Planttypes ID را به عنوان فيلد کليد خارجي انتخاب مي کنيم.

راهنمايي: اگر شما تنظيمات يا حذفيات انتشاري را براي ارتباط خواستار باشيد، آن را با انتخاب Check box ها در صفحه Property انجام مي دهيم.
7- Close را کليک کرده SQL Server کادر محاوره اي Properties را مي بندد.
8- دکمه Save را در نوار ابزار Table Designer کليک مي کنيم. SQL Server يک کادر محاوره اي را نشان مي دهد که از شما براي تأييد تغييرات که براي دو جدول از پايگاه داده تان ذخيره خواهد شد مي پرسد.

9- Yes را کليک کردهSQL Server ارتباط را ايجاد مي کند.
10- پنجره Table Designer را مي بنديم.

مديريت کردن ارتباطات
ارتباط بين جداول مي تواند به خوبي پايدار گردد اما مانند هر بخش ديگري از طرح پايگاه داده، آنها مي توانند در طي زمان تغيير يابند. Manager Enterpriseکنترل اين تغييرات را آسان مي سازد.

تغيير دادن ارتباطات
تغيير دادن يک ارتباط خيلي مرسوم نيست اما بعضي مواقع يک تغيير در ساختار يکی از جداول مورد نياز خواهد بود که شما می توانيد ستونهايی که در ارتباط درگير می باشند را به وسيله تغيير دادن ساده مشخصات در صفحه خصوصيات Relationships از کادر محاوره ه اي Table Propertiesتغيير دهيد.
تغيير دادن يک ارتباط
1- Table Designer را برای جدول Oils به وسيله کليک راست کردن نام جدول در قاب Detailsباز کرده Table Design را انتخاب می کنيم. Table Designer , SQL Serverرا باز مي کند.

2- دکمه Relationshipsدر نوار ابزارTable Designer را کليک مي کنيم. SQL Server کادر محاوره اي Table Designersرا با صحفه خصوصيات Relationships نشان داده شده باز مي کند.

3- اطمينان حاصل کنيد که FK-Oils-Planttypes در Combo Box انتخاب شده است.SQL Server مشخصاتي از ارتباطات را نشان مي دهد.
4- Plantpart ID را به عنوان فيلد کليد خارجي انتخاب مي کنيم.

5- Close را کليک کرده SQL Server کادر محاوره اي Properties را می بندد.
6- دکمه Save را در نوار ابزار Table Designer کليک می کنيم. SQL Server يک کادر محاوره ای را نشان مي دهد که از شما براي تأييد تغييراتي براي دو جدول که در پايگاه داده تان ذخيره خواهد شد سؤال مي کند.

7-Yes را کليک مي کنيم. SQL Serverارتباط را تغيير مي دهد.
8- پنجرهTable Designer را مي بنديم.

نگهداري ارتباطات
همان طوری که شما احتمالاً تا حال منتظر بوديد ارتباطات با استفاده از کادر محاوره اي Properties که شما براي ايجاد بر آنها استفاده کرده ايد نگهداري مي گردند.

تغيير نام يک ارتباط
1- Table Designer را براي جدول Oils به وسيله کليک راست کردن نام جدول در قاب Details باز مي کنيم. Design Tableرا انتخاب مي کنيم. SQL Server و Table Designer را باز می کند.

2- دکمه Relationships را کليک می کنيم. SQL Server کادر محاوره ای Table Designers Properties را با صفحه خصوصيات Relationships نشان داده شده باز می کند.

3- FK-Oils-Planttypes را در Combo Box ارتباطی انتخاب شده انتخاب می کنيم. SQL Server خصوصيات ارتباط را نشان می دهد.

4- متن را در فيلدRelation Ship Name انتخاب و Delete Me را تايپ می کنيم.
5- Close را کليک کرده SQL Server کادر محاوره ای Properties را می بندد.
6- دکمه Save را کليک کرده SQL Server يک کادر محاوره ای را نشان می دهد و از شما برای تأييد تغييرات برای دو جدول که در پايگاه داده تان ذخيره خواهد شد می پرسد.
7- Yes را کليک کرده SQL Server نام ارتباط را تغيير می دهد.
8- پنجره Table Designer را می بنديم.

حذف کردن يک ارتباط
1- Table Designer را برای جدول Oils با کليک راست کردن نام جدول در قاب Details باز می کنيم و Design Table را انتخاب می کنيم. SQL Server ، Table Designer را باز می کند.

2- دکمه Relation Ships را کليک می کنيم. SQL Server کادر محاوره ای Table Designers Properties را با صفحه خصوصيات Relationships نشان داده شده باز می کنيم.

3- Delete Me را در Combo Box ارتباطی انتخاب شده، انتخاب می کنيم. SQL Server خصوصيات ارتباطی را نشان می دهد.

4- Delete را کليک کرده SQL Server يک متنی که ازشما برای تأييد حذفيات سؤال می کند نشان می دهد.

5- Yes را کليک می کنيم.
6- Close را کليک کرده SQL Server کادر محاوره ای Properties را می بندد.
7- دکمه Save را کليک کرده SQL Server يک کادر محاوره ای را نشان می دهد که از شما برای تأييد تغييرات که برای دو جدول پايگاه داده تان ذخيره خواهد شد سؤال خواهد کرد.

8- Yes را کليک کرده SQL Server ارتباط را حذف می کند.
9- پنجره Table Designer را می بنديم.
لينک مقاله
http://sqlserver.persianblog.com :منبع

مقالات مرتبط با اين موضوع
خلاصه سازی داده ها | sqlserver
ارتباط دادن جداول | sqlserver
مرتب سازی و انتخاب کردن سطرها | sqlserver
عبارت SELECT | sqlserver
بازيابی سطرها | sqlserver
ايجاد کردن نمودار پايگاه داده | sqlserver
شناخت عبارت INSERT | sqlserver
جداول موقت | sqlserver
ايجاد کردن ارتباطات | sqlserver
ايجاد کردن Check Constraint | sqlserver
ايجاد کردن شئی های جدول | sqlserver
ايجاد کردن يک پايگاه اطلاعاتی | sqlserver
ايجاد كردن جداول و تغییر دادنشان | sqlserver
شناخت ايندکس ها | sqlserver
امنيت 2000 SQL Server | sqlserver
نسخه برداری کردن و باز گرداندن پايگاه داده ها | sqlserver
معرفی SQL و دستورات عمومی آن | sqlserver

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


جداول موقت

جداول موقت

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

استفاده از جدول موقت

جداول موقت با استفاده از همان فرمان Create و Select INTO به عنوان جداول عادی ايجاد می شوند. بعد از تهيه جدول در سؤال قابل دسترسی به ارتباط خواهد بود. (اين است که اين يک جدول محلی تهيه شده توسط ارتباط متفاوت نيست)، اين عمل همچنين مثل جداول عادی قابل استفاده می باشد.

ايجاد جدول موقت محلی

1- دکمه علامت سؤال جديد را روی Toolbar تجزيه کننده سؤال کليک کنيد تا يک پنجره سؤال جديد ظاهر شود.

2- روی دکمه Loud Script روی Toolbar تجزيه کننده سؤال کليک کنيد. تجزيه کننده سؤال جعبه پرونده گفتگو را نشان خواهد داد.

3- نسخه خطی Create Local را انتخاب کنيد و Open را کليک کنيد. تجزيه کننده سؤال نسخه خطی را پر می کند.

4- دکمه Execute Query را در Toolbar تجزيه کننده سؤال کليک کنيد. تجزيه کننده سؤال جدول موقت ايجاد می کند.

5- User Table Folder را که در پايگاه داده Tempdb در Object browser می باشد را انتخاب کنيد.

6- F5 را برای به کارگيری مجدد نمايشگر Object browser فشار دهيد و User Table Folder را گسترش دهيد. نمايشگر سؤال جدول محلی dbo.# را در ليست نشان خواهد داد.

ايجاد جدول جهانی موقت

1- بدون بستن پنجره شامل نسخه خطی Create Local بر روی دکمه New Query روی Query Analyzer Toolbar برای باز کردن يک پنجره جديد خطی، کليک کنيد.

2- بر روی دکمه Loud Script روی Query Analyzer Toolbar کليک کنيد. Query Analyzer نشانگر جعبه گفتگوی فايل Query خواهد بود.

3- خطی را که در آن Create 6 Loud وجود دارد را انتخاب کنيد و Open را کليک کنيد. تجزيه کننده سؤال خط انتخابی را Loud می کند.

4- دکمه Execute Query را که روی Query Analyzer Toolbar می باشد را کليک کنيد. Query Analyzer جدول موقت را ايجاد می کند.

5- User Folder Table که مربوط به Tempdb Database در Object browser را انتخاب کنيد.

6- F5 را برای راه اندازی مجدد نمايشگر Object browser فشار دهيد. Query Analyzer نمايشگر dbo##6 Loud Table ليست خواهد بود.
لينک مقاله
http://sqlserver.persianblog.com :منبع

مقالات مرتبط با اين موضوع
خلاصه سازی داده ها | sqlserver
ارتباط دادن جداول | sqlserver
مرتب سازی و انتخاب کردن سطرها | sqlserver
عبارت SELECT | sqlserver
بازيابی سطرها | sqlserver
ايجاد کردن نمودار پايگاه داده | sqlserver
شناخت عبارت INSERT | sqlserver
جداول موقت | sqlserver
ايجاد کردن ارتباطات | sqlserver
ايجاد کردن Check Constraint | sqlserver
ايجاد کردن شئی های جدول | sqlserver
ايجاد کردن يک پايگاه اطلاعاتی | sqlserver
ايجاد كردن جداول و تغییر دادنشان | sqlserver
شناخت ايندکس ها | sqlserver
امنيت 2000 SQL Server | sqlserver
نسخه برداری کردن و باز گرداندن پايگاه داده ها | sqlserver
معرفی SQL و دستورات عمومی آن | sqlserver

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


شناخت عبارت INSERT

شناخت عبارت INSERT

ساختار دستور عبارت Insert شبيه به عبارت Select می باشد، بيشترين شکل مبنای آن عبارت است از:

INSERT [INTO] Table-or-View [(Column-List)]

VALUES (Value-List)

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

View نبايد شامل يک تابع به هم پيوسته مانند COUNT يا AVG باشد.

View نبايد شامل Top ، GROUP BY ، UNION يا DISTINCT باشد.

View نبايد شامل يک ستون محاسبه شده باشد.

View بايد يک جدول را در شرط From باز گرداند.

عبارت Insert ستونهاي يک جدول منفرد را فقط به هنگام می سازد.

ليست ستون در عبارت Insert اختياری می باشد. اگر آن فراهم نگردد عبارت Insert بايد شامل مقاديری برای همه ستونها در جدول يا نما باشد و آنها بايد به همان ترتيب به عنوان ستونهايی در جدول يا نما فراهم شوند. اگر چه شما می توانيد از کليدهای ويژه DEFAULT برای مشخص کردن مقادير پيش فرض برای يک سطر استفاده کنيد. زمانی که ليست ستون گنجانده می شود. آن يک فرمت شبيه از ليست ستون در عبارت Select می گيرد: يک ليستی از نامهای ستون که با کاما جدا شده است. از زمانی که يک عبارت Insert می تواند يک سطر را فقط برای يک جدول اضافه کند، شما معمولاً نياز به استفاده کردن مشخصه نام جدول برای نام ستون نخواهيد داشت.

استفاده کردن از عبارت INSERT

يک عبارت Insert می تواند با استفاده کردن از قاب Grid برای مشخص کردن ستونها يا با استفاده کردن قاب SQL برای وارد کردن مستقيم عبارت ايجاد گردد.

درج کردن سطرها با استفاده از قاب Grid

قاب Grid احتمالاً آسانترين راه برای ايجاد يک عبارت Insert می باشد از زمانی که ياد آوردن هر ساختار دستور مورد درخواست شما نباشد.

درج کردن يک سطر با استفاده از قاب Grid

پوشه Tables را از پايگاه داده Aromatherapy راهبری کرده، جدول Oils را در قاب Details کليک راست می کنيم. در زير منوی Open Table رفته و Query را انتخاب می کنيم. Query Designer همه چهار قاب نشان داده شده را باز می کند.
لينک مقاله
http://sqlserver.persianblog.com :منبع

مقالات مرتبط با اين موضوع
خلاصه سازی داده ها | sqlserver
ارتباط دادن جداول | sqlserver
مرتب سازی و انتخاب کردن سطرها | sqlserver
عبارت SELECT | sqlserver
بازيابی سطرها | sqlserver
ايجاد کردن نمودار پايگاه داده | sqlserver
شناخت عبارت INSERT | sqlserver
جداول موقت | sqlserver
ايجاد کردن ارتباطات | sqlserver
ايجاد کردن Check Constraint | sqlserver
ايجاد کردن شئی های جدول | sqlserver
ايجاد کردن يک پايگاه اطلاعاتی | sqlserver
ايجاد كردن جداول و تغییر دادنشان | sqlserver
شناخت ايندکس ها | sqlserver
امنيت 2000 SQL Server | sqlserver
نسخه برداری کردن و باز گرداندن پايگاه داده ها | sqlserver
معرفی SQL و دستورات عمومی آن | sqlserver

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


ايجاد کردن نمودار پايگاه داده
ايجاد کردن نمودار پايگاه داده
شناخت درباره نمودار پايگاه داده
نمودارهای پايگاه داده يک راه خوبی برای مجسم کردن ساختار و ارتباطات جداول در يک پايگاه داده فراهم می آورد (طرح پايگاه داده). حاوی بودن آنها در داخل پايگاه داده خودش يک روش دستی برای سند سازی طرح می باشد از زمانی که نمودارها به طور خودکار هر تغييری را که شما می سازيد منعکس می کنند.

ايجاد يک نمودار پايگاه داده از يک طرح موجود
اگر چه ايجاد يک طرح پايگاه داده کامل در داخل پنجره نمودار پايگاه داده امکان پذير است و ايجاد کردن نمودارها از جداول موجود رايج تر می باشد. ويزاردCreate Database Diagram آن را ساده می سازد. فقط جداولی که شما می خواهيد در نمودار موجود باشد را انتخاب می کنيم و ويزارد Create Database Diagram بقيه کار را انجام می دهد. يک بار شما يک نمودار پايگاه داده را با استفاده از Create Database Diagram ايجاد کرده ايد و شما می توانيد جداول را اضافه و برداريد و مقاديری از جزئيات نشان داده شده را برای هر جدول تغيير دهيد.

ايجاد کردن يک نمودار پايگاه داده
1- پوشه Diagram را از پايگاه داده Aromatherapyراهبری می کنيم.SQL Server نمودار موجود را در قاب Detailsنشان می دهد.

2- دکمه New را کليک کرده SQL Server اولين صفحه از ويزاردCreate Database Diagram را
نشان می دهد.

3-Next را کليک کرده، ويزارد Create Database Diagram يک صفحه را نشان می دهد و از شما برای انتخاب جداولی که در نمودار پايگاه داده موجود می باشند سؤال می کند.

4- Add Related Tables Automatically را انتخاب کرده و سطح جداول موجود را 2 قرار می دهيم.

5- در ليست Available Tables ،Oils را انتخاب کرده و سپس Add را کليک می کنيم. ويزارد Create Database Diagram جدولOils را اضافه کرده و همه جداول مربوط به ليست جداول به نمودار اضافه می شوند.

6-Next را کليک کرده و ويزارد Create Database Diagramيک صفحه ای را نشان می دهد که از شما برای تأييد ليست جداول برای اضافه شدن به نمودار پايگاه داده سؤال می کند.

7-Finish را کليک کرده و ويزارد Create Database Diagram نمودار را ايجاد می کند.

راهنمايی: زمانی که SQL Serverيک نمودار پايگاه داده ايجاد می کند آن به وسيله خطوط که ارتباط بين آنها را نشان می دهد مربوط می شوند. شما می توانيد خطوط ارتباطی را به وسيله کليک کردن و درج آنها دوباره تنظيم کنيد. برای مثال شما ممکن است بخواهيد خطوط را مرتب سازيد به طوری که آنها متوجه ستونهای درگير شده در ارتباط يا آراسته کردن نمودار باشند.
8- دکمه Save را کليک کرده SQL Server يک کادر محاوره ای از شما برای نامگذاری نمودار سؤال می کند.

9- 10 Lesson را به عنوان نام تايپ کرده و سپس OK را کليک می کنيم.

تغيير دادن جزئيات نشان داده شده در يک نمودار يايگاه داده
1- جدول Oils را در نمودار پايگاه داده به وسيله کليک کردن نام آن در نمودار انتخاب می کنيم.

2- استاندارد را از ليست پايين رونده نشان داده شده انتخاب کرده زمانی که شما دکمهShow را در نوار ابزار پنجره نمودار پايگاه داده کليک می کنيد. SQL Server نوع داده، طول و کاراکتر تهی برای نشان دادن جداول Oils اضافه می کند.

راهنمايی: شما می توانيد نمايش جداول چندگانه را در نمودار به وسيله انتخاب کردن آنها از Ctrl-Click در نمودار، قبل از انتخاب دکمهShow روی نوار ابزار تغيير دهيد.
3- دکمهArrange Tables را روی نوار ابزار پنجره نمودار کليک می کنيم. SQL Server نمودار پايگاه داده را برای جا دادن فضای کلی مورد نياز برای جدول Oils مجدد تنظيم می سازد.

4- دکمه Save را کليک کرده SQL Server جانمايی نمودار جديد را ذخيره می سازد.

اضافه کردن يک جدول موجود برای نمودار پايگاه داده
1- دکمه Add Table را در نمودار پايگاه داده کليک کرده SQL Server کادر محاوره ایAdd Table را نشان می دهد.

2- Table Named dtproperties را در ليست انتخاب کرده و سپسAdd را کليک می کنيم. SQL Server جدول را به نمودار اضافه می کند از زمانی کهdtproperties يک سيستم جدول است که به جداول داده در پايگاه داده مربوط نمی شود، SQL Server هيچ خطوط ارتباطی را برای نمودار اضافه نمی کند.

3- Close را برای بستن کادر محاوره ای Add Table کليک کرده و سپس دکمهSave را روی نوار ابزار پنجره نمودار پايگاه داده کليک می کنيم. SQL Server نمودار را با جدول جديد ذخيره می سازد.

برداشتن يک جدول از يک نمودار پايگاه داده
1- جدول Dtpropertiesرا در نمودار پايگاه داده کليک راست کرده و از منوی Context ، Remove Table From Diagram را انتخاب می کنيم. SQL Serverجدول را از نمودار برمي دارد.

2- دکمه Save را کليک کرده SQL Server نمودار را ذخيره می سازد.
استفاده کردن از نمودار پايگاه داده برای نگهداری پايگاه داده
پنجره نمودار پايگاه داده Enterprise Manager به شما به نگهداری طرح پايگاه داده در داخل محيط گرافيکی اش اجازه می دهد. شما می توانيد جداول جديد را اضافه و تغيير داده و ارتباط بين آنها را حفظ کنيد.

تغيير دادن طرح پايگاه داده
يکی از مفيدترين قابليتهای پنجره نمودار پايگاه داده توانايی برای اصلاح پايگاه داده در داخل نمودار خودش می باشد.Graphical Display يک ابزار ويژه برای مجسم کردن جداول و ارتباطات در پايگاه داده تان می باشد و توانايی برای اصلاح طرح به طور مستقيم به شما برای ساختن تنظيمات فرعی (جزئی) به طور آسان اجازه می دهد.

اضافه کردن يک ستون به يک جدول در پنجره نمودار پايگاه داده
1- جدولOils را در نمودار پايگاه داده به وسيله درج کردن به سمت پايين ترين گوشه سمت راست بزرگ می کنيم تا اينکه يک سطر از شبکه ستون نشان داده می شود.

2- در اولين سل خالی در فيلد Column Name کليک کرده و يک ستون جديد به نام Description اضافه می کنيم. نوع داده اش را بهvarchar و طول آن را 50 قرار می دهيم.

راهنمايی: توجه کنيد که نام جدول برای جدولOils يک علامت (*) به دنبال دارد. SQL Server هر جدولی که در پنجره نمودار پايگاه داده تغيير پيدا کرده است را علامتگذاری می کند، برای نشان دادن اينکه تغييرات هنوز ذخيره شده است. بعد از آن SQL Server طرح پايگاه داده را تغيير نمی دهد تا اينکه شما نمودار را ذخيره سازيد. شما می توانيد از پنجره نمودار پايگاه داده برای آزمايش کردن خوب تغييرات قبل از اينکه آنها اعمال شوند استفاده کنيد. اگر شما محتوی ذهن تان را تغيير دهيد مانند بستن يک پنجره بدون ذخيره سازی و تغيير دادن آن پايگاه داده تان همان طوری که بوده باقی خواهد ماند.
3- دکمه Arrange Tables را برای اينکه SQL Server نمايش جدول را مجدد سايز بندی کند کليک می کنيم.

4- دکمهSave را کليک کرده SQL Server يک کادر محاوره ای را نشان می دهد که از شما برای تأييد تغييرات جدول Oils می پرسد.

5-Yes را کليک کرده، SQL Server جدول Oils را با ستون جديد به هنگام می کند و علامت (*) را از Oil Table Display برمی داريم.

ايجاد کردن شئی های پايگاه داده
1- يک ناحيه خالی از پنجره نمودار پايگاه داده را کليک راست کرده و جدول جديد را از منوی Context انتخاب می کنيم. SQL Server کادر محاوره ای نشان می دهد که نامی برای جدول جديد درخواست کند.

راهنمايی: شما می توانيد همچنين يک جدول جديد به وسيله کليک کردن دکمهNew Table روی نوار ابزار پنجره نمودار پايگاه داده ايجاد کنيد.
2-Images را به عنوان نام جديد تايپ کرده و سپس OK را کليک می کنيم. SQL Server جدول را به نمودار اضافه می کند.

3- دو ستون برای جدول جديد اضافه می کنيم.

Allow Nulls طول نوع داده نام ستون
No 4 Int OilID No 16 Image picture

4- ستونOilID را به وسيله کليک کردنGray Box در سمت چپ نام ستون انتخاب کرده و سپس دکمه کليد اصلی را روی نوار ابزار پنجره نمودار پايگاه داده کليک می کنيم. SQL Server ، OilID را به عنوان کليد اصلی از جدول قرار می دهد.

5- جدول را کليک راست کرده، در زير منوی Table View رفته وColumn Names را انتخاب می کنيم. SQL Server ،Table Display را تغيير می دهد.
6- دکمهSave را کليک کرده SQL Server يک کادر محاوره ای را به شما نشان می دهد و برای تأييد تغييرات در طرح پايگاه داده سؤال می کند.

7-Yes را کليک کرده SQL Server جدول جديد را برای پايگاه داده اضافه می کند.

ايجاد کردن يک ارتباط در پنجره نمودار پايگاه داده
1- ستون OilID را در جدول Oils در نمودار پايگاه داده انتخاب می کنيم و آن را برای ستون OilID را در جدول Image درج می کنيم. SQL Server کادر محاوره ایCrate Relationship را باز می کند.

راهنمايی: شما می توانيد هر تغييری را که برای ارتباطات نياز داريد در اين کادر محاوره ای بسازيد.
2-Ok را کليک کرده، SQL Server کادر محاوره ای را می بندد.
راهنمايی: توجه کنيد که خط ارتباط بين جداولImages , Oils يک کليد کوچک در هر سر آن دارد. اين نشان می دهد که ارتباط يک به يک می باشد تا زمانی که ارتباط بين کليدهای اصلی می باشد. يک علامت کوچک تعريفی در سر ديگر خط ارتباط نشان می دهد که جداول زيادی در آن طرف ارتباط وجود دارد.
3- دکمهSave را کليک کرده، SQL Server يک کادر محاوره ای را نشان می دهد که از شئی برای تأييد تغييرات طرح پايگاه داده سؤال می کند.

4-Yes را کليک کرده، SQL Server نمودار و به هنگام سازی طرح پايگاه داده را ذخيره می سازد.
لينک مقاله
http://sqlserver.persianblog.com :منبع

مقالات مرتبط با اين موضوع
خلاصه سازی داده ها | sqlserver
ارتباط دادن جداول | sqlserver
مرتب سازی و انتخاب کردن سطرها | sqlserver
عبارت SELECT | sqlserver
بازيابی سطرها | sqlserver
ايجاد کردن نمودار پايگاه داده | sqlserver
شناخت عبارت INSERT | sqlserver
جداول موقت | sqlserver
ايجاد کردن ارتباطات | sqlserver
ايجاد کردن Check Constraint | sqlserver
ايجاد کردن شئی های جدول | sqlserver
ايجاد کردن يک پايگاه اطلاعاتی | sqlserver
ايجاد كردن جداول و تغییر دادنشان | sqlserver
شناخت ايندکس ها | sqlserver
امنيت 2000 SQL Server | sqlserver
نسخه برداری کردن و باز گرداندن پايگاه داده ها | sqlserver
معرفی SQL و دستورات عمومی آن | sqlserver

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


بازيابی سطرها

بيشتر برنامه های پايگاه داده از يک برنامه ريزی محيطی از قبيل مايکروسافت Access يا مايکروسافت Visual Basic برای فراهم آوردن رابط کاربر استفاده خواهند کرد. اگر چه Manager Enterprise يک ابزار ساده به نام Query Designer فراهم می آورد که به شما به آسانی اجازه می دهد داده ها را در يک يا چندين جدول در پايگاه داده Aromatherapy استفاده می کنيد.

استفاده کردن از Query Designer
حتی با وجود اينکه داده در يک پايگاه داده SQL Server ذخيره شده به سختی در حالت Raw استفاده شده بدون اينکه ذخيره شود يا فيلتر شود در چندين طريق، بعضی مواقع آن به توانا بودن برای کنترل سريع محتويات يک جدول مفيد واقع می شود. Query Designer مديريت Enterprise آن را برای ديدن و ويرايش سطرها آسان ساخته و حتی سطرهای جديد ديگر اضافه می کند.

ديدن سطرها در يک جدول
ساده ترين راه برای ديدن سطرها در يک جدول بازکردن Query Designer از طريق منوی Context جدول می باشد.

ديدن همه سطرها در يک جدول
1- در Manager Enterprise ، پوشه Tables را از پايگاه داده Aromatherapy راهبری می کنيم. SQL Server يک سيستمی از جداول در قاب Details را نشان می دهد.

2- جدول Plant Parts را کليک راست کرده روی زير منوی Open Table رفته و همه سطرهای برگردانده شده را انتخاب می کنيم. SQL Server ، Query Designer را با همه سطرهای نشان داده شده در جدول باز می کند.

محدود کردن تعدادی از سطرهای نشان داده شده
1- Query Designer را اگر هنوز از تمرين قبل بازمانده است می بنديم.
2- جدول Odors را در قاب Details کليک راست کرده روی Open Table Submenu رفته و Return Top را انتخاب می کنيم. SQL Server يک کادر محاوره ای را نشان می دهد که از شما درخواست می کند که تعدادی از سطرها را که مشخص کرده ايد بياوريد.

3- 5 را به عنوان تعداد ماکزيمم برای آوردن سطر تايپ می کنيم.

4- OK را کليک کرده Query Designer را باز می کنيم. 5 سطر اول را در جدول نشان می دهد.

5- پنجره Query Designer را می بنديم.
به هنگام سازی سطرها در يک جدول
Query Designer همچنين می تواند برای تغيير مقادير از سطرهای موجود در يک جدول يا اضافه کردن سطرها استفاده گردد.

ويرايش يک سطر در Query Designer
1- جدول Plantparts را در قاب Details کليک راست کرده روی Open Table Submenu رفته و سپس همه سطرهای بازگشتی را برای بازکردن Query Designer برای جدول Plantparts انتخاب می کنيم.
2- ستون Plantparts از سطر را با يک Plantparts ID 12 از برای خواندن Fruit Kernel به جای Fruit Kernal تغيير می دهيم. Query Designer يک آيکون Edit برای انتخابگر سطر اضافه می کند. برای نشان دادن اينکه رکورد ويرايش شده است اما تغييرات هنوز ذخيره نشده است.

3- سطر ديگر را کليک می کنيم. Query Designer آيکون Edit را ذخيره، تغيير و برمی دارد.

راهنمايی: قبل از اينکه شما به ديگر سطر حرکت کنيد، شما می توانيد کليد Esc را برای اعمال نکردن تغييراتتان فشار دهيد.

اضافه کردن يک سطر جديد در Query Designer
1- در Query Designer در ستون Plantparts از آخرين سطر (که با آيکون جديد در انتخابگر سطر علامتگذاری شده) کليک می کنيم.
2- Fruit را تايپ می کنيم. Query Designer سطر را با آيکون Edit علامتگذاری کرده و يک سطر جديد در پايين جدول اضافه می کند.

3- در هر سطر ديگر در جدول کليک می کنيم. Query Designer يک PlantpartsID را برای سطر جديد تخصيص داده و آن را برای جدول ذخيره می سازد.

راهنمايی: شما نمی توانيد يک PlantpartsID را به سطر جديد اضافه کنيد زيرا آن به صورت يک ستون موجوديت تغيير داده است. اگر شما آن را انجام دهيد Query Designer يک متن Error نشان خواهد داد.

شناخت Query Designer
زمانی که شما Query Designer را با استفاده از دستور Open Table باز می کنيد. سطرها در جدول در يک شبکه شبيه به Data Sheet View يک جدول در Access نشان داده می شود که قاب Query Designers Results می باشد. Query Designer سه قاب کلی دارد. قاب Diagram قاب Grid و قاب SQL .
شما صفحه نمايشگر قابهای گوناگون را در Query Designer با استفاده از دکمه های Toolbar کنترل می کنيد. شما می توانيد قابها را در هر ترکيب نشان دهيد. Query Designer از به هنگام سازی هر صفحه نمايش قاب مواظبت خواهد کرد زمانی که شما تغييراتی را برای Query می سازيد.

قاب Diagram
دکمه قاب Diagram را در نوار ابزار Query Designer که قاب Diagram را نشان می دهد کليک می کنيم. قاب Diagram يک نمايشی از Query برای يک نمودار پايگاه داده نشان می دهد. به طور کلی برای همه مزيتها از يک نمايش گرافيکی، قاب Diagram مفيد می باشد. برای مشخص کردن جداول و نماهايی که روی هر کدام از Query هايتان پايه ريزی خواهد شد و ارتباطی بين آنها به خوبی ستونهايی که نشان داده شده است.

قاب Grid
دکمه قاب Grid را در نوار ابزار Query Designer که قاب Grid را نشان می دهد کليک می کنيم. قاب Grid شبيه به Query Designer Grid در Access می باشد. آن يک راه سريع برای تغيير سر ستون از يک ستون Query را فراهم می آورد و دستوراتی را که در هر کدام از سطرها نشان داده خواهد شد را مشخص می کند. انتخاب ملاک مانند را Surname = Jones قرار می دهد.

قاب SQL
دکمه قاب SQL را روی نوار ابزار Query Designer که قاب SQL را نشان می دهد کليک می کنيم. قاب SQL عبارت Transact-SQL واقعی را که Query را توليد خواهد کرد نشان می دهد. شما می توانيد مستقيماً عبارت Transact-SQL را با استفاده از قاب SQL وارد و ويرايش کنيد.
راهنمايی: زمانی که شما اولين Transact-SQL را می آموزيد، قاب SQL يک ابزار بزرگ آموزش می باشد. Query را با استفاده از قاب Diagram و Grid راه اندازی کرده و Query Designer عبارت Transact-SQL را برای شما خواهد ساخت.
لينک مقاله
http://sqlserver.persianblog.com :منبع

مقالات مرتبط با اين موضوع
خلاصه سازی داده ها | sqlserver
ارتباط دادن جداول | sqlserver
مرتب سازی و انتخاب کردن سطرها | sqlserver
عبارت SELECT | sqlserver
بازيابی سطرها | sqlserver
ايجاد کردن نمودار پايگاه داده | sqlserver
شناخت عبارت INSERT | sqlserver
جداول موقت | sqlserver
ايجاد کردن ارتباطات | sqlserver
ايجاد کردن Check Constraint | sqlserver
ايجاد کردن شئی های جدول | sqlserver
ايجاد کردن يک پايگاه اطلاعاتی | sqlserver
ايجاد كردن جداول و تغییر دادنشان | sqlserver
شناخت ايندکس ها | sqlserver
امنيت 2000 SQL Server | sqlserver
نسخه برداری کردن و باز گرداندن پايگاه داده ها | sqlserver
معرفی SQL و دستورات عمومی آن | sqlserver

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


عبارت SELECT
عبارت SELECT
پايه و اساس همه داده های رابطه ای در محيط SQL Server يک حالت Transact-SQL تنها است که عبارت Select می باشد. در اين درس ما به مهمترين ترکيبات حالت Select و راههای استفاده کردن از Query Designer برای ساختن خودکار عبارت می پردازيم. با استفاده از Query Designer شما می توانيد يک عبارت Select را مستقيماً در قاب SQL وارد سازيد يا با داشتن Query Designer آن را به وسيله قابهای Grid و Diagram بسازيد. گزينه ها متقابلاً منحصر به فرد نمی باشند. شما می توانيد يک Query را به وسيله اضافه کردن جداول برای قاب Diagram ، تغيير نام ستون با استفاده از قاب Grid شروع کنيد و دستورات را به طوری که سطرها برگردانده می شود به وسيله وارد کردن شرط ORDER BY به صورت مستقيم در قاب SQL مشخص کنيد.
تمرينهای درس يک گونه ای از تکنيکها را به شما نشان خواهد داد. موقعی که خودتان کار می کنيد شما می توانيد يکی را که در زمان ساده تر به نظر می رسد را انتخاب کنيد.

شناختن عبارت SELECT
ساختار دستور عبارت Select خيلی پيچيده می باشد که دارای چندين شرط و اپراتور می باشد اما ساختار اصلی کاملاً ساده می باشد.
Select [ Top n [PERCENT] ] Column-List
From Source-List
[ Where Search-Condition ]
[ ORDER By Expression ]
فقط اولين و دومين شرط از عبارت Select مورد نياز می باشد. اولين شرط، Select Column-List مشخص می کند ستونهايی که به وسيله Query بازگردانده خواهد شد. ليست Column می تواند شامل ستونهای اصلی از جداول و نماهايی باشد که بر روی Query پايه ريزی شده است يا اينکه می تواند شامل ستونهای محاسباتی اقتباس شده از ستونهای اصلی باشد. دومين شرط، From Source-LIST ، نماها و جداول را که در Query پايه ريزی شده مشخص می کند.

انتخاب کردن تمام ستونها
ساده ترين شکل از عبارت Select آن انتخابی است که همه ستونها از يک جدول تکی را انتخاب می کند. با بيشترين نسخه های زبان SQL ، Transact-SQL اجازه می دهد به شما به استفاده از (*) به عنوان يک Shorthand برای مشخص کردن تمام ستونها، بنابراين اين فرم ساده از عبارت اين چنين است:
SELECT *
FROM Table-Name

انتخاب همه ستونها
1- Query Designer را برای Properties Table به وسيله کليک راست کردن نام آن در قاب Detail Enterprise Manager باز می کنيم، روی زير منوی Open Table رفته و Return All Rows را انتخاب می کنيم. SQL Server ، Query Designer را برای جدول باز می کند.

2- قاب SQL را به وسيله کليک کردن دکمه قاب SQL روی نوار ابزار Query Designer راه می اندازيم. Query Designer قاب SQL را نشان می دهد.

3- عبارت SQL را برای نشان دادن همه ستونها از جدول Oils تغيير می دهيم.

4- دکمه Run را روی نوار ابزار Query Designer برای به اجرا در آوردن Query کليک می کنيم. Query Designer همه رکوردها در جدول Oils را نشان می دهد.

راهنمايی: شما می توانيد بيشتر سطرها را در قاب Results به وسيله درج کردن درايور قاب بين قابها نشان دهيد.

انتخاب زير مجموعه از ستونها
اگر چه ساختار دستور Select * آسان و سريع می باشد، شما اغلب بيشتر می خواهيد که Query تان فقط به ستونهای انتخاب شده باز گردد. اين با مشخص کردن ستونها در Column-List از شرط Select به انجام می رسد.

انتخاب ستونها با استفاده از قاب SQL
1- علامت * را در عبارت Select با تايپ کردن نام ستون Oil Name جايگزين می کنيم.

2- دکمه Run را روی نوار ابزار Query Designer برای به کار بستن Query کليک می کنيم. Query فقط ستون Oil Name را نشان می دهد.

انتخاب ستونها با استفاده از قاب Diagram
1- قاب SQL را پنهان کرده و قاب Diagram را به وسيله کليک کردن دکمه ها در نوار ابزار Query Designer نشان می دهيم.

2- فيلد LatinName را در قاب Diagram کليک کرده Query Designer قاب Results به جهت اينکه زياد معتبر نيست کم نور نشان می دهد.

3- دکمه Run را برای به کارگيری Query کليک کرده Query Designer هر دو ستون Latin Name و Oil Name را در قاب Results نشان می دهد.

ايجاد کردن نام مستعار ستون
به طور پيش فرض، يک ستون در يک Query نام يکسان دارد که در جدول يا نمای مورد نظر می باشد. اگر چه اغلب تغيير دادن نام آن مفيد می باشد. نامتناسب به نظر می رسد که فيلد به کاربر بدين صورت ( "My Long Column Name With No Spaces" ) يا اينکه به طور خلاصه اين چنين 32713 PK-Varchar-50-Col نشان داده شود. عبارت Select به شما اجازه می دهد که يک ستون را در Query به وسيله ايجاد يک alias تغيير نام دهيد. نام مستعار، نام ستون را در Query تغيير می دهد نه در جدول.

ايجاد يک نام مستعار برای ستون با استفاده از قاب Grid
1- قاب Diagram را پنهان کرده و قاب Grid را به وسيله کليک کردن دکمه ها روی نوار ابزار Query Designer نشان می دهيم.

2- يک نام مستعار برای ستون OilName به وسيله تايپ کردن OilName در فيلد alias ايجاد می کنيم. Query Designer به طور خودکار در اطراف alias پرانتز اضافه کرده زيرا alias شامل يک فضا می باشد.

راهنمايی: پرانتزهای چهارگوش در خروجی Query نشان داده نخواهند شد. آنها به نحوه آسان به SQL Server می گويند که با عبارت "Oil Name" به عنوان يک نام مجزا برخورد کنيم. پرانتزها فقط موقعی مورد نياز می باشند که نام مستعار شامل يک جای خالی باشد، اما آنها می تواند برای نام هر ستون استفاده شود.
3- دکمه Run را روی نوار ابزار Query Designer برای مجدد به کار بستن Query کليک می کنيم. SQL Server نام را در سر ستون با جای خالی اضافه شده بين دو کلمه نشان می دهد.

ايجاد نام مستعار ستون با استفاده از قاب SQL
1- قاب Grid را پنهان کرده و قاب SQL را به وسيله کليک کردن دکمه ها در نوار ابزار Query Designer نشان می دهيم.

2- [ Latin Name ] را به عنوان نام مستعار برای دومين ستون اضافه می کنيم.

3- دکمه Run را روی نوار ابزار Query Designer برای به کارگيری Query کليک می کنيم. Query Designer نام را در سر ستون با يک فضای خالی بين دو کلمه نشان می دهد.

ايجاد کردن ستونهای محاسباتی
علاوه بر اينکه ستونها به طرز ساده اطلاعات را در جداول Underlying و نماها نشان می دهد، همچنين Query تان می تواند شامل ستونهايی باشد که محاسبه شده اند بر اساس داده های Underlying ، توابع SQL Server يا هر ترکيب دوتايی. ستون محاسباتی به وسيله مشخص کردن يک عبارت به عنوان ستون ايجاد می گردد.
ما به عبارات Transact-SQL در Detail در درس 21 "The Transact-SQL Language" می پردازيم. بنابراين در اين تمرين ما فقط يک جفت از عبارات ساده که بر اساس اپراتور الحاق رشته Transact-SQL که دو رشته و تابع GETDATE را که داده ها و زمان سيستم جاری را باز می گرداند اضافه می کنيم.

ايجاد کردن يک ستون محاسباتی با استفاده از قاب Grid
1- قاب SQL را پنهان کرده و قابGrid را به وسيله کليک کردن دکمه روی نوار ابزار Query Designer نشان می دهيم.

2- در هر سل ستون خالی در قاب Grid کليک کرده و Oil Name +' – '+ Latin Name را تايپ می کنيم.

راهنمايی: شما می توانيد سل ها را در قاب Grid به وسيله درج کردن خطوط تقسيم بين سر ستونها عريض تر سازيد.
3- کليد Tab را فشار می دهيم. SQL Server ، 1 Expr را به عنوان نام مستعار ستون پيشنهاد می دهد.

4- نام مستعار را برای Extended Name تغيير می دهيم.

5- دکمه Run را برای به کارگيری مجدد Query کليک می کنيم. Query Designer ستون جديد را در قاب Results نشان می دهد.

ايجاد کردن يک ستون محاسباتی با استفاده از قاب SQL
1- قاب Grid را پنهان کرده و قاب SQL را به وسيله کليک کردن دکمه ها روی نوار ابزار Query Designer نشان می دهيم.

2- GETDATE را به عنوان [ Today’s Data ] برای ليست ستون از شروط Select اضافه می کنيم.

راهنمايی: کاما را قبل از GETDATE فراموش نکنيد.
3- دکمه Run را در نوار ابزار Query Designer برای به کارگيری مجدد Query کليک می کنيم. SQL Server تاريخ جاری در هر سطر را نشان می دهد.

استفاده کردن از شرط Top n
زمانی که شما دستور Return Top را از منوی متن جدول انتخاب می کنيد. SQL Server شرط Top n را در پايين پوششها برای ايجاد صفحه نمايش در Query Designer استفاده می کند. علاوه بر اينکه يک شماره مشخصی از سطرها را مشخص می کنيد شما می توانيد همچنين يک درصد از سطرها را به وسيله استفاده کردن از شرط Top n Percent نشان دهيد. همان طوری که شما ممکن است انتظار داشته باشيد درصدی از سطرهای مشخص شده را باز می گردانيم.

نشان دادن سطرهای Top s
1- Top 5 را قبل از اولين کلمه در Column-List از شروط Select در قاب SQL اضافه می کنيم.

2- دکمه Run را در نوار ابزار Query Designer برای به کارگيری مجدد Query کليک می کنيم. SQL Server فقط 5 سطر اول را نشان می دهد.

نشان دادن Top 5 درصد از سطرها
1- کلمه Percent را بعد از Top 5 در قاب SQL اضافه می کنيم.

2- دکمه Run را در نوار ابزار Query Designer برای به کارگيری Query کليک می کنيم. SQL Server فقط 5 درصد اول از سطرها را در SQL Server نشان می دهد.
لينک مقاله
http://sqlserver.persianblog.com :منبع

مقالات مرتبط با اين موضوع
خلاصه سازی داده ها | sqlserver
ارتباط دادن جداول | sqlserver
مرتب سازی و انتخاب کردن سطرها | sqlserver
عبارت SELECT | sqlserver
بازيابی سطرها | sqlserver
ايجاد کردن نمودار پايگاه داده | sqlserver
شناخت عبارت INSERT | sqlserver
جداول موقت | sqlserver
ايجاد کردن ارتباطات | sqlserver
ايجاد کردن Check Constraint | sqlserver
ايجاد کردن شئی های جدول | sqlserver
ايجاد کردن يک پايگاه اطلاعاتی | sqlserver
ايجاد كردن جداول و تغییر دادنشان | sqlserver
شناخت ايندکس ها | sqlserver
امنيت 2000 SQL Server | sqlserver
نسخه برداری کردن و باز گرداندن پايگاه داده ها | sqlserver
معرفی SQL و دستورات عمومی آن | sqlserver

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


مرتب سازی و انتخاب کردن سطرها

در فصل گذشته ما بيشترين فرمهای مقدماتی از حالت SELECT را مرور کرده و آنها را برای انتخاب ستونهای يک جدول استفاده کرديم. اما بيشتر مواقع شما بازگشت به سطرها در جدول پس زمينه يا نمايش در يک قاعده خاص و فقط بازگشت به يک زير مجموعه از آنها را خواهيد خواست. شرطهای ORDER BY و WHERE در اين درس بررسی شده و اجرای آن برای شما فراهم شود.

شرط ORDER BY
شرط The ORDER BY يک ترکيب گزينه ای از يک حالت SELECT می باشد. آن به شما برای مشخص کردن ترتيب در آن سطرهايی که بازگشت خواهند کرد اجازه می دهد. ستونهای چندگانه می توانند مشخص شوند و سطرها می توانند به صورت ترتيب افزايشی يا کاهشی باز گردانده شوند.

مرتب سازی سطرها
ساده ترين فرم در شرط ORDER BY فراهم می سازد يک نام ستون تکی که برای مرتب کردن سطرها که به وسيله Query باز گردانده می شود استفاده خواهد شد.

مرتب کردن سطرها با استفاده از قاب Grid
1- Query Designer را برای جدول Oils به وسيله کليک راست کردن نام آن در قاب Details باز می کنيم. به زير منوی جدول Open رفته و همه ستونهای بازگشتی را انتخاب می کنيم. SQL Server ، Query Designer را برای جدول باز می کند.
2- قاب Grid را به وسيله کليک راست کردن دکمه قاب Grid در نوار ابزار Query Designer نشان می دهيم.

3- فقط ستونهای OilID ، Oil Name ، LatinName را برای نمايش انتخاب می کنيم. Query Designer محتويات قاب Results را که کمرنگ شده برای نشان دادن اينکه با مشخصات Query زياد مربوط نمی باشد نشان می دهد.

4- دکمه Run را در نوار ابزار Query Designer برای اجرای Query کليک می کنيم. Query Designer فقط ستونهای مشخص شده را نشان می دهد.

5- نوع Sort فيلد Oil Name را صعودی قرار می دهيم.

6- دکمه Run را در نوار ابزار Query Designer برای اجرای Query کليک می کنيم. Query Designer سطرهای مرتب شده با Oil Name را نشان می دهد.

مرتب سازی سطرها با استفاده از قاب SQL
1- قاب Grid را پنهان ساخته و قاب SQL را به وسيله کليک کردن دکمه ها روی نوار ابزار Query Designer نشان می دهيم.

2- DESC را بعد از شرط ORDER BY OilName اضافه می کنيم.

راهنمايی: کليد واژه DESCبه SQL Server برگرداندن سطرها به ترتيب نزولی را ابراز می کند. کليد واژه ASC که گزينه ای می باشد سطرها را به ترتيب صعودی برمی گرداند.
3- دکمه Run را روی نوار ابزار Query Designer برای اجرای Query کليک می کنيم. Query Designer نتايح را که با OilName ذخيره شده به صورت نزولی نشان می دهد.

مرتب سازی ستونهای چندگانه
شما می توانيد ستونهای چندگانه را در شرط ORDER BY مشخص کنيد. زمانی که ستونهای چندگانه مشخص می گردند ترتيب ستونها نتايج SQL Server را که به وسيله اولين ستون و سپس به وسيله دومين ستون و بنابراين چهارمين ستون مرتب خواهد شد مشخص می کند.
راهنمايی: تمرينها در اين بخش از جدول OilOdors استفاده می کند که به صورت جدول الحاقی انجام وظيفه می کند که ارتباط چندبه چند بين جدول Oils و Odors را تجزيه و تحليل می کند. معمولاً شما کليدهای خارجی ترکيب شده در اين جدول را با استفاده از يک ارتباط تجزيه می کرديد.

مرتب سازی سطرها با استفاده از قاب Grid
1- پنجره شماره 1 را از منوی Window برای برگشت به درخت Console انتخاب می کنيم.
2- Query Designer را برای جدول Oil Orders به وسيله کليک راست کردن نام آن در قاب Details باز کرده روی زير منوی جدول Open رفته و همه سطرهای بازگشتی را انتخاب می کنيم. SQL Server ، Query Designer را برای جدول باز می کند.
3- قاب Grid را به وسيله کليک کردن دکمه قاب Grid روی نوار ابزار Query Designer نشان می دهيم.

4- * را در قاب Grid با نامهای دو فيلد جايگزين می کنيم. SQL Server محتويات از قاب Results را برای نشان دادن اينکه آن با مشخصات Query زياد در ارتباط نيست کم رنگ می کند.

5- دکمه Run را در نوار ابزار Query Designer برای اجرای Query کليک می کنيم. Query Designer فقط ستونهای مشخص شده شما را نشان می دهد.

6- نوع Sort هر دوی ستونها را صعودی قرار می دهيم.

7- دکمه Run را در نوار ابزار Query Designer برای اجرای Query کليک می کنيم. Query Designer سطرهای مرتب شده را با اولين OilID و سپس با OdorID در داخل OilID نشان می دهد.

مرتب کردن سطرها با استفاده از قاب SQL
1- قاب Grid را پنهان کرده و قاب SQL را به وسيله کليک کردن دکمه ها در نوار ابزار Query Designer نشان می دهيم.

2- ستونها را در شرط ORDER BY معکوس می کنيم.

3- دکمه Run را در نوار ابزار Query Designer برای اجرای Query کليک می کنيم. Query Designer نتايج مرتب شده را با اولين OdorID و سپس با OilID نشان می دهد.

4- پنجره Query Designer را می بنديم.

شرط WHERE
با استفاده از شرط اختياری WHERE از حالت SELECT شما می توانيد يک زير مجموعه از سطرها که باز گردانده می شوند را مشخص کنيد. برای مثال شما ممکن است بخواهيد فقط مشتريهايی که بيش از $1000 در 12 ماه قبل خرج کرده اند را ببينيد يا اينکه فقط نامهای Oil که با حرف R شروع می شوند را ببينيد. شما اين ملاکها را با استفاده از شرط WHERE مشخص خواهيد کرد.

شرط WHERE BASIC
Operator Meaning
مساويست با = بزرگتر از < کوچکتر از >بزرگتر يا مساويست با =<کوچکتر يا مساويست با => مساوی نيست با <>
کليد برای شرط WHERE يک ملاک انتخابی می باشد که مشخص می کند که کدام سطرها باز خواهند گشت. ساختار پايه ای از يک شرط WHERE ، WHERE می باشد. SQL Server يک حدود کاملی از اپراتورهای مقايسه ای را به طوری که در جدول B-1 نشان داده شده فراهم می سازد.

مشخص شده در شرايط WHERE می تواند يک ارزش دائمی باشد مانند Red"" يا 10000 يا می تواند باشد يک عبارتی که يک ارزش مانند GETDATE. را باز گرداند. به طور شبيه ارزش می تواند دستی ساخته شوند با استفاده از تابعهای Transact-SQL مانند LEFT که يک تعدادی از کاراکترهای مشخص شده از چپ يک رشته را باز می گرداند، ما تمام جزئيات توابع را در درس 24 مرور خواهيم کرد.
مشخص کردن يک شرط WHERE با استفاده از قاب Grid
1- پنجره شماره 2 را از منوی Window برای بازگشت به پنجره Query Designer که ما زودتر در اين درس استفاده کرده ايم انتخاب می کنيم.
2- قاب SQL را پنهان کرده و قاب Grid را به وسيله کليک کردن دکمه ها در نوار ابزار Query Designer نشان می دهيم.
3- "="Eucalyptus را در سل ملاک سطر OilName از قاب Grid وارد می کنيم.

4- دکمه Run را روی نوار ابزار Query Designer برای اجرای Query کليک می کنيم، Query Designer فقط يک سطر تنها را نشان می دهد.

مشخص کردن يک شرط WHERE با استفاده از قاب SQL
1- قاب Grid را پنهان ساخته و قاب SQL را به وسيله کليک کردن دکمه ها در نوار ابزار Query Designer کليک می کنيم.

2- شرط WHERE را با WHERE (LEFT(Oil Name,1)="R") تغيير می دهيم.

3- دکمه Run را در نوار ابزار Query Designer برای اجرای Query کليک می کنيم. Query Designer نامهای Oil را که با "R" شروع می گردد را نشان می دهد.

استفاده کردن از اپراتورهای ويژه
علاوه بر فرمت استاندارد برای يک شرط WHERE از ، SQL Server همچنين سه عملگر را پشتيبانی می کند: LIKE که اجازه می دهد به شما به فراهم ساختن مقدار نامشخص با استفاده از وايلد کارتهای نشان داده شده در جدول 2-13 و BETWEEN که اجازه می دهد به شما مشخص کردن يک محدوده از ارزشها و IN که اجازه می دهد به شما برای مشخص کردن يک مجموعه از مقادير.
مثال معنی Wildcard
LIKE 'a' که ارتباط می دهد at"" و "as" هر تک کاراکتر -اما نه "and"%'t'%ILKE که ارتباط می دهد "at" و bat"" و "Together" اما نه "Lucky" هر رشته از صفر يا چندين کاراکتر %LIKE '[a-c]at' که ارتباط می دهدCat"" و "bat" اما نه "fat" هر کاراکتر ويژه در داخل يک محدوده يا مجموعه []LIKE '[a-b]at' که ارتباط می دهدBat"" اما نه "Cat"LIKE '[^c]at' که ارتباط می دهد "Bat" و "fat" اما نه "Cat" هر کاراکتر ويژه که در داخل يک محدوده يا مجموعه نمی باشد [^]

مشخص کردن يک شرط WHERE با استفاده از LIKE
1- شرط WHERE را در قاب SQL برای WHERE تغيير می دهيم. )% (Oil Name LIKE 'Rose'

2- دکمه Run را در نوار ابزار Query Designer برای اجرای Query کليک می کنيم. Query Designer همه سطرهايی که با Rose شروع می گردد را نشان می دهد.

مشخص کردن يک شرط WHERE با استفاده از BETWEEN
1- شرط WHERE را در قاب SQL باWHERE(LEFT(Oil Name,1)BETWEEN A AND 'C') تغيير می دهيم.

2- دکمه Run را در نوار ابزار Query Designer برای اجرای Query کليک می کنيم. Query Designer همه سطرها که با A و B يا C شروع می گردد را نشان می دهد.

راهنمايی: Transact-SQL همچنين عملگرها Not BETWEEN را پشتيبانی می کند که دقيقاً از همان طريق کار می کند. به استثنای اينکه آن شامل يک محدوده ای از مقادير می باشد. برای مثال Left (Oil Name , 1) Not BETWEEN 'C' And 'E' همه سطرها باز خواهد گرداند به جز آنهايی که Oil Name با C و D يا E شروع می کند.

مشخص کردن يک شرط WHERE با استفاده از IN
1- شرط WHERE را در قاب SQL با WHERE (LEFT (OilName , 1) IN('G','M','V')) تغيير می دهيم.

2- دکمه Run را در نوار ابزار Query Designer برای اجرا Query کليک می کنيم. Query Designer ، 8 سطر را نشان می دهد.

ترکيب کردن ملاک انتخابی
علاوه بر مشخص کردن يک شرط WHERE با استفاده از عبارت Format شما می توانيد همچنين عبارات را با استفاده از عملگر منطقی OR يا AND ترکيب کنيد. يک شرط WHERE از فرمت FormatOR سطرهايی که به ملاک مربوط می گردند خواهد بازگرداند، نظر به اينکه يک شرط WHERE از And Format سطرهايی که به هر دو ملاکها مربوط می گردند را باز خواهد گرداند.

مشخص کردن ملاک پيچيده با استفاده از OR
1- شرط WHERE رادرقاب SQL به WHERE (OilName='Rosemary' OR OilName='Sagy) تغيير می دهيم.

2- دکمه Run را روی نوار ابزار Query Designer برای اجرای Query کليک می کنيم. Query Designer دو سطر را نشان می دهد.

مشخص کردن ملاک پيچيده با استفاده از AND
1- شرط WHERE را در قاب SQL به ) %(Oil Name LIKE 'Rose' WHERE تغيير می دهيم.

2- دکمه Run را روی نوار ابزار Query Designer برای اجرای Query کليک می کنيم. Query Designer ، 4 سطر را نشان می دهد.

3- شرط WHERE را در قاب SQL به And (OilID<40) ) %(OilName LIKE Rose WHERE تغيير می دهيم.

4- دکمه Run را روی نوار ابزار Query Designer برای اجرای Query کليک می کنيم. Query Designer سطر Roso Otto را شامل می گردد.
لينک مقاله
http://sqlserver.persianblog.com :منبع

مقالات مرتبط با اين موضوع
خلاصه سازی داده ها | sqlserver
ارتباط دادن جداول | sqlserver
مرتب سازی و انتخاب کردن سطرها | sqlserver
عبارت SELECT | sqlserver
بازيابی سطرها | sqlserver
ايجاد کردن نمودار پايگاه داده | sqlserver
شناخت عبارت INSERT | sqlserver
جداول موقت | sqlserver
ايجاد کردن ارتباطات | sqlserver
ايجاد کردن Check Constraint | sqlserver
ايجاد کردن شئی های جدول | sqlserver
ايجاد کردن يک پايگاه اطلاعاتی | sqlserver
ايجاد كردن جداول و تغییر دادنشان | sqlserver
شناخت ايندکس ها | sqlserver
امنيت 2000 SQL Server | sqlserver
نسخه برداری کردن و باز گرداندن پايگاه داده ها | sqlserver
معرفی SQL و دستورات عمومی آن | sqlserver

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


ارتباط دادن جداول

ارتباط دادن جداول

Query هايی که در فصل 3 بررسی گرديد سطرهايش از يک جدول تکی ترسيم گرديده است اما Query ها به ويژه می توانند مفيد باشند برای ترکيب ستونهايی از چندين جدول يا نما که Joining Tables ناميده می شود و آن در شرطهای FROM يا WHERE از حالت SELECT انجام می گيرد. در اين فصل ما بر روی ايجاد ارتباطها با استفاده از شرط FROM که روشی توصيه شده است متمرکز خواهيم شد.

شناختن شرط FROM
همان طوری که ما ديده ايم، ساختار پايه ای از شرط FROM به آسانی نام از يک جدول يا نما ساده را فراهم می سازد. اما برای دسترسی پيدا کردن به توانايی از مدل ارتباطی، ما بايد به بازيابی ستونها از جداول چندگانه و نماها در يک Query خاص قادر باشيم. شرط FROM يک مکانيزمی برای انجام آن با استفاده از ساختار دستور زير:FROMON
اپراتور پيوند انواع پيوند برای به انجام رسيدن را تشريح می کند. Server SQL پيوندهای داخلی و خارجی همه نوسانات را پشتيبانی می کند، همان طوری که در بخش بعدی خواهيم ديد. شرايط پيوند يک تعبيری می باشد شبيه به ملاک که در شرط WHERE استفاده شده است. آن مشخص می کند که چگونه سطرها در دو جدول ارتباط خواهند يافت. بيشتر پردازشگرهای ربطی روی پايه ای از عبارتهای برابری مانند B ستون = A ستون به انجام می رسند. اما SQL Server هر اپراتور منطقی را پشتيبانی کرده و شرايط پيوند می تواند به طور دلخواه پيچيده باشد، با عبارات چندگانه پيوند يافته که از حرف ربط AND يا OR از همان راهی که يک شرط WHERE می تواند ملاک انتخابی چندگانه را شامل باشد استفاده کند. عبارت پيوند می تواند برای اضافه کردن جداول و نماهای اضافی برای Query تکرار شود. ساختار دستور برای پيوند جداول چندگانه عبارت است از: FROM
ON
يک حدود فرضی 256 جدولی برای هر Query وجود دارد، اما آن به حد زياد غير محتمل است که شما اصلاً نياز به 5 يا 6 نياز نداريد و 2 يا 3 بيشتر معمول می باشد. در حقيقت اگر شما نياز به اتصال بيش از 10 جدول در يک Query باشيد، شما بايد به دقت طرح پايگاه داده آن را نگاه کرده برای اينکه مطمئن شويد که آن به طور صحيح به حالت عادی در آمده است.

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

نامگذاری شئی ها
زمانی که شما با يک جدول يا نمای تکی کار می کنيد آنجا می تواند هيچ ابهامی در حدود منابع از يک ستون نداشته باشد از موقعی که همه نام ستونها در يک جدول بايد منحصر به فرد باشند. هنگامی که شما برای بار اول کار کردن با چندين جدول در يک Query را شروع می کنيد يا شما بايد برای مشخص کردن نام ستونها صريحاً مواظب باشيد. مشخصات کامل برای هر شئی پايگاه داده چهار معرفه را در بردارد. نام سرور، نام پايگاه داده، نام صاحب، نام شئی. معرفه ها به وسيله پريودها جداسازی می گردند. بنابراين نام واجد شرايط از جدول Oils در سيستم من Bunny.Aromatherary.dbo.Oil می باشد. مقداری از شئی ها مانند نماها و جداول شامل شئی های ديگر می باشد. برای رجوع به يکی از اين شئی های گنجانده شده (در اين حالت، ستونها). شما به آسانی نام آن را به نام شئی ضميمه می کنيد. نام واجد شرايط کامل از ستون OilID از جدول Oils (Bunny.Aromatherapy.dbo.Oils.Oil ID) می باشد. خوشبختانه شما فقط نياز به مشخص کردن کافی از درجه بندی ابهام اجتناب پذير داريد.
در يک Query مبنی بر يک جدول تکی، برای مثال نام ستون به وسيله خودش دارای مشخصات کافی می باشد. اگر يک Query به بيش از يک جدول مربوط گردد، اگر چه جداول دارای ستونهايی با يک نام باشد. شما بايد نام جدول را در نام شئی (Object) Oils.OilID , OilPropertise.OilID که تمايز را به طور کامل روشن می سازد لحاظ کنيد.

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

پيوند دو جدول با استفاده از قاب دياگرام
1- Query Designer جدول Oils را به وسيله کليک راست کردن نام آن در قاب Details باز کرده روی جدول Open رفته و همه سطرهای بازگشتی را انتخاب می کنيم.

2- قاب دياگرام را به وسيله کليک کردن دکمه قاب دياگرام روی نوار ابزار Query Designer نشان می دهيم.

3- دکمه Add Table را روی نوار ابزار Query Designer کليک می کنيم. Query Designer کادر محاوره ای Add Table را نشان می دهد.

4- جدول PlantTypes را در ليست جدول انتخاب کرده و Add را کليک می کنيم. SQL Server جدول را به Query اضافه می کند.
5- Close را برای بستن کادر محاوره ای Add Table کليک می کنيم.

6- دکمه قاب SQL را در نوار ابزار Query Designer کليک می کنيم. Query Designer قاب SQL را نشان می دهد.

7- علامت * را بعد از کليد واژه SELECT حذف می کنيم.

8- دکمه قاب SQL را در نوار ابزار Query Designer کليک می کنيم. (OK را کليک کرده اگر Query Designer يک متن خطا درباره ساختار دستور SELECT نشان دهد). Query Designer قاب SQL را پنهان می سازد.
مهم: زمانی که شما Query Designer را باز می کنيد، حالت SQL معمولاً * را انتخاب می کند. انتخاب کردن ستونهای مشخص در قاب دياگرام سبب می شود که آنها به ليست ستون اضافه شوند. مايکروسافت آن را به صورت يک خصيصه در نظر می گيرد.

9- در قاب دياگرام ستونهای OilID و OilName را در جدول Oils و ستون PlantType را در جدول PlantType انتخاب می کنيم.

10- دکمه Run روی نوار ابزار Query Designer برای اجرای Query کليک می کنيم. Query Designer مقادير Planttype را برای هر Oil نشان می دهد.

ارتباط دو جدول به وسيله قاب SQL
1- قاب دياگرام را پنهان کرده و قاب SQL را به وسيله کليک کردن دکمه ها روی نوار ابزار Query Designer نشان می دهيم.

2- حالت SQL موجود را با عبارت زير جايگزين می کنيم.
SELECT Oils.OilID,Oils.Oil Name,PlantParts.PlantPart
FROM OilsINNER Join
PlantParts ON Oils.PlantPartID=PlantParts.PlantPart ID

3- دکمه Run را در نوار ابزار Query Designer برای اجرای Query کليک می کنيم. Query Designer مقاديرها برای هر سطر Oils Plant Part را نشان می دهد.

ارتباط جداول چندگانه با استفاده از قاب دياگرام
1- قاب SQL را پنهان کرده و قاب دياگرام را نمايش می دهيم.

2- دکمه Add Table را روی نوار ابزار Query Designer کليک می کنيم. Query Designer کادر محاوره ای Add Table را نشان می دهد.

3- جدول Planttypes را در ليست جداول انتخاب می کنيم. Add را کليک کرده SQL Server جدول را به Query اضافه می کند.
4- Close را برای بستن کادر محاوره ای Add Table کليک می کنيم.

5- در قاب دياگرام ستون Planttype را در جدول Planttypes برای اضافه کردن ستون به Query کليک می کنيم.

6- دکمه Run در نوار ابزار Query Designer برای اجرای Query کليک می کنيم. Query Designer هر دوی ستونهای PlantPart و Planttype را برای هر Oil نشان می دهد.

ارتباط جداول چندگانه با استفاده از قاب SQL
1- قاب دياگرام را پنهان کرده و قاب SQL را نشان می دهيم.
2- عبارت SELECT موجود را با عبارت زير جايگزين می کنيم.
SELECT Oils.Oil ID.Oils.Oil Name.odors.odor
FROM Oils
INNER Join Oilodors on Oils.OilID=Oil odors.OilID
INNER Join odors on Oilodors.odor ID=odors.odorID

3- دکمه Run را در نوار ابزار Query Designer برای اجرای Query کليک می کنيم.

4- پنجره Query Designer را می بنديم.

ارتباطات خارجی
بعضی مواقع شما می خواهيد که يک Query همه سطرها يک يا چندين جدول را باز گرداند، خواه آنها سطرهای ارتباطی در جداول ديگر داشته باشند و يا خير. که با استفاده از يک ارتباط خارجی به انجام رسيده که می تواند سه گونه باشد: چپ، راست و کامل. يک ارتباط خارجی همه سطرهايی از جدول چپ در شرط JOIN و فقط آن سطرهايی از جدول راست برای اينکه شرايط ارتباط TRUE می باشد را باز خواهد گرداند.
دستور ساختار برای يک ارتباط خارجی عبارت است از:
FROM Left Table Left Outer Join Right able on
برای مثال عبارت SELECT زير، همه سطرها در جدول Oils را باز می گرداند و مقادير PlantPart از جدول آنجايی که PlantPart مشخص شده جفت می شود. آنجا سطرهای ارتباطی در جدول Plant Parts وجود ندارد و Query ، Null را به عنوان مقدار PlantPart برای آن سطر باز می گرداند.
SELECT Oils.Oil Name.Plant Parts.Plant Part
FROM Oils Left Outer Join
Plant Parts on Oils.Plant Part ID=Plant Parts.Plant Part ID
يک ارتباط خارجی سمت راست مقابل يک ارتباط خارجی سمت چپ می باشد. آن همه سطرها از جدول راست در شرط JOIN را باز می گرداند و مقادير ارتباطی را از جدول چپ ارتباط می دهد. نظر به اينکه يک ارتباط کاملاً خارجی همه سطرها از دو جدول را با هم هماهنگ می سازد آنجايی که امکان پذير باشد.

ايجاد کردن يک ارتباط خارجی چپ با استفاده از قاب دياگرام
1- Query Designer را برای جدول Oils به وسيله کليک راست کردن نام جدول در قاب Details باز کرده، روی جدول Open رفته و همه سطرهای بازگشتی را انتخاب می کنيم.
2- قاب دياگرام را نشان می دهيم.

3- دکمه Add Table را در نوار ابزار Query Designer کليک می کنيم. Query Designer کادر محاوره ای Add Table را نشان می دهد.

4- Cautions و Oil Cautions در ليست جدول را انتخاب و سپس Add را کليک می کنيم. Query Designer جدولی برای Query اضافه می کند.
راهنمايی: شما می توانيد يک ارتباط خارجی چپ با دو جدول ايجاد کنيد. ما حالت سوم را در ايجاد استفاده می کنيم با جدول OilCautions که به عنوان يک جدول الحاقی عمل می کند که ارتباط چندگانه بين Oils و Cautions را حل می کند.
5- Close را برای بستن کادر محاوره ای کليک می کنيم.

راهنمايی: شما می توانيد جداول را در قاب دياگرام برای پاک کردن نمايشگر درج کنيد.

6- دکمه قاب SQL را در نوار ابزار Query Designer کليک می کنيم. Query Designer قاب SQL را نشان می دهد.

7- علامت * را در کليد واژه SELECT حذف می کنيم.

8- دکمه قاب SQL را در نوار ابزار Query Designer کليک می کنيم. (OK را کليک کرده اگر Query Designer يک متن خطا درباره ساختار از عبارت SELECT نشان دهد) Query Designer قاب SQL را پنهان می سازد.
مهم: زمانی که شما Query Designer را باز می کنيد عبارت SQL پيش فرض معمولاً * را انتخاب می کند. ستون ويژه که در قاب دياگرام انتخاب شده سبب می شود که آنها برای ليست ستون اضافه شوند. مايکروسافت اين را به عنوان يک ويژگی در نظر می گيرد.

9- در قاب دياگرام، ستونها از OilName و OilID را از جدول Oils و ستون Caution را از جدول Cautions برای خروجی انتخاب می کنيم.

10- دکمه Run را در نوار ابزار Query Designer برای اجرای Query کليک می کنيم. Query Designer فقط آن Oils که Cautions دارد را نشان می دهد.

11- خط ارتباطی بين جداول Oil Cautions و Oils را به وسيله کليک کردن آن انتخاب می کنيم و سپس دکمه Properties را در نوار ابزار Query Designer کليک می کنيم. Query Designer کادر محاوره ای Join Properties را نشان می دهد.

12- All Rows From Oils را انتخاب می کنيم.

راهنمايی: همه سطرها از Oil Cautions يک ارتباطی خارجی سمت راست ايجاد خواهد کرد و هر دوی گزينه ها را انتخاب کرده که يک ارتباط کامل خارجی ايجاد می کند.
13- Close را برای بستن کادر محاوره ای کليک می کنيم. Query Designer خط ارتباطی را برای انعکاس مشخصات ارتباطی جديد تغيير می دهد.

14- دکمه Run در نوار ابزار Query Designer برای اجرای Query کليک می کنيم. Query Designer همه سطرها در جدول Oils را نشان می دهد و مقادير از جدول Cautions را ارتباط می دهد.

ايجاد يک ارتباط خارجی سمت راست با استفاده از قاب SQL
1- قاب دياگرام را پنهان کرده و قاب SQL را در Query Designer نشان می دهيم.

2- حالت SELECT موجود را با عبارت زير جايگزين می کنيم.
SELECT Oils.Oil Name.Properties.Property
FROM Oils
Right OUTER JOIN Oil Properties on
Oils.Oil ID=Oil Properties.Oil ID
INNER JOIN Properties on
Oil Properties.Property ID=Properties.Property ID

3- دکمه Run را در نوار ابزار Query Designer برای اجرای Query کليک می کنيم. Query Designer شامل همه سطرها از جدول Oil Properties با مقادير ارتباطی از جدول Oils می باشد.

4- پنجره Query Designer را می بنديم.

UNIONS
آخرين نوع از ارتباط به صورت Union شناخته می گردد. يک Union نتايجی از دو عبارت SELECT متمايز را در داخل يک تنظيم از سطرها ترکيب می کند. ارتباطات داخلی و خارجی ستونهايی از دو جدول درگير شده در يک سطر تکی را با هم ترکيب می کند يک Union سطرهايی از دو جدول در يک ستون تکی را به هم ترکيب می کند. شما می توانيد تصور کنيد که تنظيمات دو سطر را گرفته و يکی را در بالای ديگری باز گردانيد. اگر چه قاعده اصلی از سطرها باز گردانده شده به وسيله شرط ORDER BY مشخص می گردد. ساختار دستور يک Union از پيوندها متفاوت می باشد. يک Union ساختار دستوری به صورت زير دارد:
SELECT FROM
UNION [All]
SELECT FROM
[ORDER BY ]
شما می توانيد بسياری از حالتهای UNION SELECT را همان طوری که شما برای يک Query دوست داريد اضافه کنيد. (اين موضوع برای 256 جدول محدود می باشد) اما همه عبارتهای SELECT بايد همان تعداد از ستونها را از انواع سازگار يا شبيه در همان دستور باز گرداند. اولين عبارت SELECT نامهای ستون را مشخص خواهد کرد و شرط ORDER BY از آخرين عبارت SELECT دستور Sort را تعيين خواهد کرد. به طور پيش فرض، SQL Server سطرهای چندگانه ای از نتايج را از يک Union Query برمی دارد. اگر شما Union All را مشخص کنيد، ولی سطرهای چندگانه حفظ خواهد شد.

ايجاد کردن يک UNION
1- Query Designer را به وسيله کليک کردن جدول Properties در قاب Details باز کرده روی جدول Open رفته و همه سطرهای بازگشتی را انتخاب می کنيم.
2- قاب SQL را نشان می دهيم.

3- حالت SQL موجود را با عبارت زير جايگزين می کنيم.

SELECT Property Table AS Table Name.Property ID AS ID
Property AS Quality From Properties
UNION
SELECT odor Table.odor ID odor From odors
ORDER BY Quality

4- دکمه Run در نوار ابزار Query Designer را برای اجرای Query کليک می کنيم. Query Designer نتايجی از دو عبارت SELECT را با هم ترکيب می کند.
لينک مقاله
http://sqlserver.persianblog.com :منبع

مقالات مرتبط با اين موضوع
خلاصه سازی داده ها | sqlserver
ارتباط دادن جداول | sqlserver
مرتب سازی و انتخاب کردن سطرها | sqlserver
عبارت SELECT | sqlserver
بازيابی سطرها | sqlserver
ايجاد کردن نمودار پايگاه داده | sqlserver
شناخت عبارت INSERT | sqlserver
جداول موقت | sqlserver
ايجاد کردن ارتباطات | sqlserver
ايجاد کردن Check Constraint | sqlserver
ايجاد کردن شئی های جدول | sqlserver
ايجاد کردن يک پايگاه اطلاعاتی | sqlserver
ايجاد كردن جداول و تغییر دادنشان | sqlserver
شناخت ايندکس ها | sqlserver
امنيت 2000 SQL Server | sqlserver
نسخه برداری کردن و باز گرداندن پايگاه داده ها | sqlserver
معرفی SQL و دستورات عمومی آن | sqlserver

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


خلاصه سازی داده ها
هنگامی که دو جدول در يک پيوند يک به چند سهيم هستند. وسيله محرک Query مقاديری از سطر را از يک طرف برای ارتباط دادن سطرها در طرفهای ديگری تکرار می کند. بعضی مواقع آن دقيقاً چيزی است که شما می خواهيد، اما اغلب شما می خواهيد تکرار کردن سطرها را از چندين طريق دسته بندی يا خلاصه سازيد. در اين درس، ما به دو روش برای انجام آن که عبارتند از کليد واژه DISTINCT و شرط GROUP BY نگاه خواهيم کرد.

شناختن SELECT DISTINCT
يکی از اهداف طرح پايگاه داده ارتباطی برداشتن وابستگی داده ها می باشد. اما بيشتر پايگاه داده به طور ضروری مقادير واقعی در چندين سطر را شامل خواهد شد. يک جدولی که شامل اطلاعات آدرس مشتری می باشد برای مثال احتمالاً کد ايالتی و کشوری برای چندين سطر خواهد داشت که نه اشتباه و نه تکراری می باشد. نظر به اينکه هر کد ايالتی نسبتی از يک مشتری می باشد. به همين نحو يک جدول از چندين جهت از يک ارتباط يک به چند ممکن است هر مقدار کليد خارجی معلوم که چندين بار تکرار شده را داشته باشد. آن برای يک ارتباط يکپارچه از پايگاه داده لازم می باشد. اگر چه اين تکرار می تواند بعضی مواقع نتايج Query را نامطلوب سازد. يک جدول مشتری با 1000 سطر با 90 درصد مشتری از کاليفرنيا، Query زير کد CA را 9000 بار خواهد باز گرداند که اصلاً يک نتيجه مفيدی نمی باشد.
SELECT State From Customer
کليد واژه Distinct در اين موقعيت شما را کمک می کند. Distinct که درست بعد از SELECT قرار می گيرد به SQL Server دستور داده که سطرهايی چندگانه در قرارگيری نتايج را حذف نمايد. بنابراين Query زير هر کد ايالتی را فقط يک بار باز می گرداند به طور وضوح ليستی که شما جستجو می کنيد.
SELECT DISTINCT State From Customer
راهنمايی: همتای کليد واژه Distinct ، All می باشد که SQL Server را برای بازگرداندن همه سطرها آگاه می سازد خواه آن واحد باشد يا خير. از موقعی که اين يک عملکرد پيش فرض از يک عبارت SELECT می باشد All به طور معمول استفاده نمی گردد. اما شما ممکن تصميم بگيريد به در برداشتن آن اگر ساختار دستور Query را بيشتر قابل فهم سازيد.

استفاده کردن از SELECT DISTINCT
کليد واژه Distinct می تواند در عبارت SQL از Query Distinct يا به وسيله تنظيمات Properties از Query مشخص گردد.

ايجاد کردن Distinct Query با استفاده از قاب دياگرام
1- Query Designer را برای جدول Oils به وسيله کليک راست کردن نام جدول در قاب Details باز کرده روی جدول Open رفته و همه سطرهای بازگشتی را انتخاب می کنيم.
2- قاب دياگرام را به وسيله کليک کردن روی دکمه قاب دياگرام در نوار ابزار Query Designer نشان می دهيم.
3- دکمه Add Table را کليک می کنيم. Query Designer کادر محاوره ای Add Table را نشان می دهد.
4- Plantparts را در ليست جدول انتخاب می کنيم و سپس Add را کليک می کنيم. Query Designer جدول را به Query اضافه می کند.
5- Close را برای بستن کادر محاوره ای کليک می کنيم.
6- دکمه قاب SQL را در نوار ابزار Query Designer کليک می کنيم. قاب SQL ، Query Designer را نشان می دهد.
7- علامت * بعد از کليد واژه SELECT را حذف می کنيم.

8- دکمه قاب SQL را در نوار ابزار Query Designer کليک می کنيم (OK را اگر Query Designer يک متن خطا درباره ساختار دستور عبارت SELECT نشان می دهد کليک می کنيم). Query Designer قاب SQL را پنهان می سازد.
مهم: زمانی که شما Query Designer را باز می کنيد حالت SQL پيش فرض معمولاً SELECT* می باشد. ستون ويژه در قاب دياگرام به سبب اينکه آنها به ليست ستون اضافه می شوند انتخاب می گردند. مايکروسافت اين را يک ويژگی در نظر می گيرد.
9- در قاب دياگرام فقط ستون Plantpart را از جدول Plantparts برای نشان دادن انتخاب می کنيم.

10- دکمه Run را برای اجرای مجدد Query کليک می کنيم. Query Designer هر مقدار Plantpart را چندين بار ليست می کند.

11- در يک ناحيه خالی از قاب دياگرام کليک راست کرده و Properties را انتخاب می کنيم. Query Designer کادر محاوره ای Properties را نشان می دهد.

12- گزينه مقادير Distinct را انتخاب می کنيم.

13- Close را برای بستن کادر محاوره ای کليک می کنيم.
14- دکمه Run را برای اجرای مجدد Query کليک می کنيم. Query Designer هر مقدار را فقط يک بار نشان می دهد.

ايجاد کردن يک SELECT DISTINCT با استفاده از قاب SQL
1- قاب دياگرام را پنهان ساخته و قاب SQL را نشان می دهيم.
2- عبارت SELECT موجود را با متن زير جايگزين می کنيم.
SELECT DISTINCT Plant Types Plant Type
FROM Oils INNER Join
Plant Types ON Oils Plant Type ID=Plant Types Plant Type ID

3- دکمه Run را برای اجرا مجدد Query کليک می کنيم. Query Designer مقدار PlantType متمايز که به وسيله جدول Oils بازگشت شده را نشان می دهد.

شناختن GROUP BY
کليد واژه Distinct امر می کند. SQL Server را به بازگرداندن سطرهای واحد نظر به اينکه شرط GROUP BY ، SQL Server را به ترکيب سطرها با مقادير يکسان در ستون يا ستونهای مشخص شده در شرط در داخل سطر تکی امر می کند.
مهم: هر ستونی که در شرط GROUP BY شامل می باشد بايد در خروجی Query شامل گردد.
شرط GROUP BY اغلب با يک aggregate Function استفاده می گردد. يک aggregate Function محاسبات در مجموعه از مقادير را به انجام می رساند و يک نتيجه تک مقداری را باز می گرداند. رايج ترين گزينه های به هم پيوسته استفاده شده در پرس و جوهایGROUP BY ، MIN می باشد که کوچکترين مقادير را در مجموعه باز می گرداند. MAX که بزرگترين مقادير در مجموعه را باز می گرداند و COUNT که تعدادی از مقادير را در يک مجموعه باز می گرداند.

استفاده کردن از GROUP BY
شرط GROUP BY می تواند مشخص شود با استفاده کردن از هر يک از قابها در Query Designer ، اما قابهای SQL و Grid بيشترين کنترل را فراهم می سازد.

ايجاد کردن يک GROUP BY Query با استفاده از قاب Grid
1- قاب SQL را پنهان ساخته و قاب Grid را نشان می دهيم.

2- ستون OilName را برای Query اضافه می کنيم.

3- دکمه Group By را در نوار ابزار Query Designer کليک می کنيم. Query Designer يک ستون Group By برای شبکه اضافه می کند و هر دوی مقادير را برای Group By قرار می دهد.

4- سل Group By را برای تغيير دادن سطر OilName به Count تغيير می دهيم.

5- دکمه Run را برای اجرا مجدد Query کليک می کنيم. Query Designer تعدادی از Oils را برای هر PlantType نشان می دهد.

ايجاد کردن يک Group By Query با استفاده از قاب SQL
1- قاب شبکه را پنهان ساخته و قاب SQL را نشان می دهيم.

2- عبارت SELECT موجود را با متن زير جايگزين می کنيم.
SELECT Plant parts Plant part Count (Oils Oil Name) As Number Of Oils
FROM Oils INNER Join
Plant parts ON Oils Plant part ID=Plant parts Plant part ID
GROUP BY Plant parts Plant part

3- دکمه Run را برای اجرای مجدد Query کليک می کنيم. Query Designer مقدار oils برای هر Plantpart نشان می دهد.

استفاده کردن از شرط HAVING
شرط Having سطرهای بازگردانده شده به وسيله شرط GROUP BY را از همان راهی که يک شرط Where سطرهای بازگردانده شده را به وسيله شرط SELECT محدود می سازد. هر دو شرط Where و Having می تواند در يک عبارت SELECT شامل شود که شرط Where قبل از گروه بندی علميات و شرط Having بعد از آن به کار برده می شود. ساختار دستور شرط Having همانند شرط Where می باشد به استثنای اينکه شرط Having می تواند شامل يکی از توابعهای به هم پيوسته باشد که در ليست ستونها از شرط SELECT قرار می گيرد. اگر چه شما بايد توابع به هم پيوسته را تکرار کنيد. برای مثال شرط Having که در حالت زير استفاده شده صحيح می باشد.
SELECT Plant parts Plant part Count (Oils Oil Name) As Number Of Oils
FROM Oils INNER Join
Plant parts ON Oils Plant part ID=Plant Parts Plant part ID
GROUP BY Plant parts Plant part
HAVING Count (Oils Oil Name)>3
اگر چه شما نمی توانيد از اسم مستعار برای تابع Count در شرط Having استفاده کنيد. بنابراين شرط Having زير درست نخواهد بود.
HAVING Number Of Oils>3

ايجاد کردن يک Query با استفاده از HAVING در قاب Grid
1- قاب SQL را پنهان ساخته و قاب Grid را نمايش می دهيم.

2- 5Add> را برای سل مورد نظر از ستون oil Name قرار می دهيم.

3- دکمه Run در نوار ابزار Query Designer را برای اجرای مجدد Query کليک می کنيم.

ايجاد کردن يک Query با استفاده از HAVING در قاب SQL
1- قاب Grid را پنهان ساخته و قاب SQL را نشان می دهيم.

2- شرط Having را برای HAVING (Count (Oils Oil Name)<5) تغيير می دهيم.

3- دکمه Run در نوار ابزار Query Designer را برای اجرای مجدد Query کليک می کنيم. Query Designer فقط آن Plantparts که Oils اشتراکی کمتر از 5 دارد را نشان می دهد.
لينک مقاله
http://sqlserver.persianblog.com :منبع

مقالات مرتبط با اين موضوع
خلاصه سازی داده ها | sqlserver
ارتباط دادن جداول | sqlserver
مرتب سازی و انتخاب کردن سطرها | sqlserver
عبارت SELECT | sqlserver
بازيابی سطرها | sqlserver
ايجاد کردن نمودار پايگاه داده | sqlserver
شناخت عبارت INSERT | sqlserver
جداول موقت | sqlserver
ايجاد کردن ارتباطات | sqlserver
ايجاد کردن Check Constraint | sqlserver
ايجاد کردن شئی های جدول | sqlserver
ايجاد کردن يک پايگاه اطلاعاتی | sqlserver
ايجاد كردن جداول و تغییر دادنشان | sqlserver
شناخت ايندکس ها | sqlserver
امنيت 2000 SQL Server | sqlserver
نسخه برداری کردن و باز گرداندن پايگاه داده ها | sqlserver
معرفی SQL و دستورات عمومی آن | sqlserver

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


انواع استایل ها

استايلها CSS (Cascading style sheet) بر سه نوع هستند.
۱. Inline Style: اين نوع استايل در داخل تگهاي HTML به كار گرفته ميشوند، و اين استايل فقط بروي همان تگ به خصوص تاثير خواهد گذاشت و به صورت زير نوشته خواهد شد:

<tag style="Style Declarations">

*Style declarations: حالتهاي و نوع استايلهاي هستش.

براي مثال:

<h2 style="color:red; font-family:arial">Bolghan Tools</h2>

Bolghan Tools

۲. Embedded or Global Style: در اين نوع، استايل نوشته شده در تمامي صفحه تاثير خواهد گذاشت، اينرا بين دو تگ (<head></head>) به صورت زير نوشته خواهد شد.

<style>
Style Declaration
</style>

براي مثال:

<style>
h1 {color: gold; font-family: Times New Roman}
</style>

۳. Linked or External style sheet: نوع آخر هم معروف به استايلهاي خارجي هستند كه به صورت لينك فايل استايل را به صفحات خود لينك ميدهيد. فايلهاي استايل با فرمت CSS ذخيره ميشوند و به صورت زير به صفحات لينك داده ميشود.

<link href="url" rel="relation type" type="link type">

* URL: آدرس فايل استايل | *Relation type: برابر با stylesheet هست | *link type: هم با text/css برابر ميباشد.

براي مثال:

<link href="http://tools.bolghan.com/test.css" rel="stylesheet" type="text/css">
لينک مقاله
http://tools.bolghan.com :منبع

مقالات مرتبط با اين موضوع
انواع استایل ها | css
ده نکته برای افزایش سرعت بارگزاری صفحات وب | css
استايل (CSS) چيست؟ | css
صفحات دو ستونی در CSS | css
رنگ ScrollBar صفحه سايت خود را عوض كنيد | css
CSS و كاربرد آن در طرح هاي امروزي | css

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آشنائی با زبان #C

مايكروسافت در مصاف با جاوا، بدنبال ارائه يك زبان كامل بود كه سايه جاوا را در ميادين برنامه نويسی كم رنگ تر نمايد. شايد بهمين دليل باشد كه #C را ايجاد كرد. شباهت های بين دو زبان بسيار چشمگير است. مايكروسافت در رابطه با ميزان استفاده و گسترش زبان فوق بسيار خوشبين بوده و اميدوار است بسرعت زبان فوق گستردگی و مقبوليتی به مراتب بيشتر از جاوا را نزد پياده كنندگان نرم افزار پيدا كند.

با توجه به نقش محوری اين زبان، از آن بعنوان مادر زبانهای برنامه نويسی در دات نت نام برده می شود. مورد فوق به تنهائی، می تواند دليل قانع كننده ای برای يادگيری اين زبان باشد، ولی دلايل متعدد ديگری نيز وجود دارد كه در ادامه به برخی از آنها اشاره می گردد.

مطرح شدن بعنوان يك استاندارد صنعتی
انجمن توليدكنندگان كامپيوتر اروپا (ECMA) زبان #C را در سوم اكتبر سال 2001 بعنوان يك استاندارد پذيرفته (ECMA-334) و بدنبال آن تلاش های وسيعی برای كسب گواهی ISO نيز انجام شده است. زبان فوق در ابتدا توسط شركت مايكروسافت و بعنوان بخشی از دات نت پياده سازی و بلافاصله پس از آن توسط شركت های اينتل، هيوليت پاكارد و مايكروسافت مشتركا، جهت استاندارسازی پيشنهاد گرديد.

زبان #C بگونه ای طراحی شده است كه نه تنها وابستگی به يك Platform خاص را ندارد، بلكه در اغلب موارد وابستگی RunTime نيز ندارد. كامپايلر #C می تواند بر روی هر نوع معماری سخت افزاری طراحی و اجرا گردد. در برخی از نسخه های اوليه كامپايلر زبان فوق كه توسط برخی از شركت های جانبی ارائه شده است، كدهای #C را به بايت كدهای جاوا كمپايل می كنند. يكی از چنين كامپايلرهائی را می توان در سايت Halcyonsoft.com مشاهده نمود. بنابراين كدهای #C براحتی قابليت حمل بر روی محيط های متفاوت را دارا خواهند بود.

مشخصات تعريف شده زبان #C با ساير استاندارهای تعريف شده ECMA نظير (ECMA-335) CLI (Common Language Infrastructure) بخوبی مطابقت می نمايند. CLI قلب و روح دات نت و CLR(Common Language Runtime) است. اولين نسخه از كامپايلر زبان #C كه از CLI استفاده می كند، NET Framwork. مايكروسافت است.

با توجه به موارد گفته شده، مشخص می گردد كه اين زبان بسرعت بسمت استاندارد شدن حركت و با تاييد استانداردهای مربوطه از طرف انجمن های معتبر بين المللی و حمايت فراگير شركت های معتبر كامپيوتری در دنيا مسير خود را بسمت جهانی شدن بخوبی طی می نمايد.

#C چيست ؟
طراحان زبان #C با تاكيد و الگوبرداری مناسب از مزايای زبانهائی نظير ++C، C و جاوا و ناديده گرفتن برخی از امكانات تامل برانگيز و كم استفاده شده در هر يك از زبانهای فوق، يك زبان برنامه نويسی مدرن شی گراء را طراحی كرده اند. در مواردی، برخی از ويژگی های استفاده نشده و درست درك نشده در هر يك از زبانهای گفته شده، حذف و يا با اعمال كنترل های لازم بر روی آنها، زمينه ايجاد يك زبان آسان و ايمن برای اغلب پياده كنندگان نرم افزار بوجود آمده است. مثلا C و ++C می توانند مستقيما با استفاده از اشاره گرها عمليات دلخواه خود را در حافظه انجام دهند. وجود توانائی فوق برای نوشتن برنامه های كامپيوتری با كارائی بالا ضرورت اساسی دارد. اما در صورتيكه عملياتی اينچنين بدرستی كنترل و هدايت نگردند، خود می تواند باعث بروز مسائل (Bugs) بيشماری گردد.

طراحان زبان #C، با درك اهميت موضوع فوق، اين ويژگی را كماكان در آن گنجانده ولی بمنظور ممانعت از استفاده نادرست و ايجاد اطمينان های لازم مسئله حفاظت نيز مورد توجه قرار گرفته است. جهت استفاده از ويژگی فوق، برنامه نويسان می بايست با صراحت و به روشنی خواسته خود را از طريق استفاده از Keyword های مربوطه اعلان نمايند( فراخوانی يك توانائی و استفاده از آن).

#C بعنوان يك زبان شی گراء عالی است. اين زبان First-Class را برای مفهوم Property (Data Member) بهمراه ساير خصائص عمومی برنامه نويسی شی گراء حمايت می كند. در C و ++C و جاوا يك متد get/set اغلب برای دستيابی به ويژگی های هر Property استفاده می گردد. CLI همچنان تعريف Property را به متدهای get/ser ترجمه كرده تا بدين طريق بتواند دارای حداكثر ارتباط متقابل با ساير زبانهای برنامه نويسی باشد. #C بصورت فطری Events ، Declared Value، Reference Type ، Operator Overloading را نيز حمايت می كند.

كد مديريت يافته
با استفاده از نسخه پياده سازی شده #C توسط مايكروسافت، می توان همواره كد مديريت يافته ای را توليد كرد. يك برنامه #C پس از كامپايل، بصورت برنامه ای در خواهد آمد كه شامل دستورالعمل های تلفيق شده ( CIL (Common Intermediate Language است (درست بر خلاف دستورالعمل های مختص يك ماشين خاص). CIL (گاها با نام MSIL(Microsoft Intermediate Language) با به اختصار IL نيز ناميده می شود ) ، در مفهوم مشابه بايت كدهای جاوا بوده و شامل مجموعه ای از دستورالعمل های سطح پايين قابل فهم توسط تكنولوژی مبتنی بر CLI نظير CLR مايكروسافت خواهد بود. اين برنامه ها بدين دليل كد مديريت يافته، ناميده می شوند كه CLR مسئوليت تبديل اين دستورالعمل ها به كدهای قابل اجرا برروی ماشين و ارائه اغلب سرويس های اساسی برای كدينگ نظير : Garbage Collection، مديريت Heap و عمر مفيد يك Object و يا Type Verification را فراهم می كند.

روش يادگيری #C
يادگيری اين زبان برای افراديكه دارای سابقه آشنائی با يكی از زبانهای برنامه نويسی ++C، C و يا جاوا باشند كار مشكلی نخواهد بود، حتی افراديكه دارای آشنائی اوليه با جاوااسكريپت و يا ديگر زبانهای برنامه نويسی نظير ويژوال بيسك می باشند، امكان پذير و راحت خواهد بود. برخی از برنامه نويسان حرفه ای بر اين باور هستند كه #C نسبت به VB.NET با اقبال بيشتر و سريعتری مواجه خواهد شد، چراكه #C نسبت به ويژوال بيسك خلاصه تر است. حتی برنامه های بزرگ و پيچيده ای كه توسط #C نوشته می گردند خواناتر، كوتاه و زيبا خواهند بود. برخی از ويژگی های ارائه شده در #C نظير Unsigned Integer، Operator OverLoading و امنيت بيشتر Type ها، در VB.NET وجود نداشته و اين امر می تواند دليلی بر فراگيرتر شدن #C نسبت به VB.NET نزد برنامه نويسان با تجربه باشد.

برای يادگيری هر يك از زبانهای حمايت شده در دات نت، می بايست از BCL (Basic Class Library) مربوط به NET Framework. شروع كرد. #C خود صرفا دارای ۷۷ کلمه کليدی يا Keyword بوده كه برای اكثر برنامه نويسان غريب نخواهند بود. در مقابل BCL، دارای ۴۵۰۰ كلاس و تعداد بيشماری متد و Property است كه برنامه نويسان #C، می توانند از آنها برای انجام عمليات دلخواه خود استفاده نمايند. شايد يكی از مسائل قابل توجه جهت يادگيری اين زبان برای برخی از برنامه نويسان حرفه ای عدم وجود برخی از ويژگی ها و امكاناتی باشد كه در گذشته و از طريق ساير زبانهای استفاده شده، بخدمت گرفته می شدند. مثلا عدم وجود امكاناتی جهت توارث چندگانه (MI) سلسله مراتبی يك شئ.

خلاصه
بدون شك فراگيری و تسلط بر زبان #C بمنزله كسب يك پتانسيل با ارزش بوده كه ثمرات آن برای برنامه نويسان در حال و آينده ای نه چندان دور بيشتر هويدا خواهد شد. استاندارد بودن و وجود كتابخانه ای مملو از كلاس اين اطمينان را بوجود خواهد آورد كه با فراگيری زبان فوق و كسب، مهارت های لازم، به يك توانائی فرا محيطی جديد دست پيدا خواهيم كرد كه امكان استفاده از آن بر روی محيط های متفاوت وجود خواهد داشت. ويژگی ها و قابليت های بيشمار اين زبان از جمله دلايل قانع كننده ديگری است كه فراگيری آن را توجيه پذير و منطقی می كند.
لينک مقاله
http://www.iranasp.net :منبع

مقالات مرتبط با اين موضوع
مقدمه اي بر سي شارپ : قسمت بيستم | c-sharp
مقدمه اي بر سي شارپ : قسمت نوزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هجدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت شانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت پانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهاردهم | c-sharp
مقدمه اي بر سي شارپ : قسمت سيزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت يازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دهم | c-sharp
مقدمه اي بر سي شارپ : قسمت نهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هشتم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفتم | c-sharp
مقدمه اي بر سي شارپ : قسمت ششم | c-sharp
مقدمه اي بر سي شارپ : قسمت پنجم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهارم | c-sharp
مقدمه اي بر سي شارپ : قسمت سوم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوم | c-sharp
مقدمه اي بر سي شارپ : قسمت اول | c-sharp
آشنائی با زبان #C | c-sharp

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


محدودكردن تغییر اندازه فرم در دلفی

گاهی اوقات نیاز است فرم ما از نظر اندازه پیرو یک الگو باشد و کاربر نتواند خارج از محدوده این فرم را تغییر اندازه دهد، راهی که پیشنهاد می شود، استفاده از Windows Messages، تابع WM_GetMinMaxInfo میباشد.

unit MinMax;

interface

uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs;

type
  TForm1 = class(TForm)
  private
    { Private declarations }
    procedure WMGetMinMaxInfo(var MSG: Tmessage); message WM_GetMinMaxInfo;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.WMGetMinMaxInfo(var MSG: Tmessage);
Begin
  inherited;
  with PMinMaxInfo(MSG.lparam)^ do
  begin
    with ptMinTrackSize do
    begin
      X := 300;
      Y := 150;
    end;
    with ptMaxTrackSize do
    begin
      X := 350;
      Y := 250;
    end;
  end;
end;

end.
لينک مقاله
http://www.idevcenter.com :منبع

مقالات مرتبط با اين موضوع
مدیریت حافظه در دلفی | delphi
آرایه‌ها در دلفی | delphi
نكات مفید كار در محیط دلفی | delphi
تاریخچه زبان دلفی | delphi
تغییر Hint برای هر ستون از DBGrid در دلفی | delphi
نمایش میزان كپی شدن فایل با ProgressBar در دلفی | delphi
نصب ProgressBar روی StatusBar در دلفی | delphi
استفاده از DLL‌ها در دلفی | delphi
محدودكردن تغییر اندازه فرم در دلفی | delphi

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


استفاده از DLL‌ها در دلفی

ایجاد یک DLL
با استفاده از منو فایل گزینه New Items را انتخاب کنید و آیتم DLL Wizard را انتخاب نمایید. حال به فایل ایجاد شده، یک فرم با استفاده از روش بالا اضافه نمایید. دقت نمایید که Application را بجای فرم انتخاب ننمایید. حال اگر فرض کنیم که نام فرم شما Demo باشد و بانام UDemo.pas آنرا ذخیره کرده باشید. باید در فایل DLL بصورت زیر کد نویسی نمایید:

library demodll;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }

uses
   SysUtils,
   Classes,
   UDemo in 'UDemo.pas' {Demo};

{$R *.res}
procedure ShowdemoForm;stdcall;
begin
   Demo :=Tdemo.Create(nil);
   demo.Show;
end;

function ShowdemoFormModal:integer;stdcall;
begin
   demo :=Tdemo.Create(nil);
   Result := demo.ShowModal;
end;

Exports
   ShowDemoForm,
   ShowdemoFormModal;
begin
end.

دقت کنید که نام DLL فوق DemoDll می باشد و با نام DemoDll.dpr ذخیره گردیده است.

حال بر روی فرم موجود تمام دکمه‌ها و آبجکت‌های مورد نظرتان را اضافه و کد نویسی کنید (اختیاری). در پایان در منو Project گذینه Build DemoDll را انتخاب کرده و اجرا نمایید. فایلی با نام DemoDll.dll ایجاد می گردد که برای استفاده آماده است.

استفاده از یک DLL بصورت دینامیکی
برای استفاده از یک DLL ‌بصورت دینامیکی، ابتدا نام توابعی را که در فایل DLL شما موجود است بصورت زیر تعریف نمایید:

unit UMain;

interface

uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, StdCtrls, ExtCtrls;

type
TShowdemoFormModal= Function :integer;
.
.
.

دقت کنید که نام برنامه انتخابی پیش فرض Main و با نام UMain.pas ذخیره گشته است. حال برای لود کردن DLL یادشده، یک دکمه بر روی فرم قرارداده آنرا بصورت زیر کد نویسی کنید:

var
hndDLLHandle:THandle;
ShowdemoFormModal:TShowdemoFormModal;

procedure TFMain.Button1Click(Sender: TObject);
begin
   try
      hndDLLHandle:=LoadLibrary('Demodll.dll');

      if hndDLLHandle <> 0 then begin
         @ShowdemoFormModal:=getProcAddress(hndDLLHandle,'ShowdemoFormModal');

         if addr(ShowdemoFormModal) <> nil then begin
            ShowdemoFormModal;
         end
         else
            showmessage ('function not exists ...');
         end
      else
         showMessage('Dll Not Found!');
      finally
         freelibrary(hndDLLHandle);
      end;
end;

فرم شما آماده اجراست. در پایان متذکر می شوم که استفاده ار روش دینامیکی در لود کردن DLL ها باعث پایین آمدن سرعت نمایش فرم‌ها و در عوض بالارفتن سرعت برنامه خواهد شد.

لينک مقاله
http://www.idevcenter.com :منبع

مقالات مرتبط با اين موضوع
مدیریت حافظه در دلفی | delphi
آرایه‌ها در دلفی | delphi
نكات مفید كار در محیط دلفی | delphi
تاریخچه زبان دلفی | delphi
تغییر Hint برای هر ستون از DBGrid در دلفی | delphi
نمایش میزان كپی شدن فایل با ProgressBar در دلفی | delphi
نصب ProgressBar روی StatusBar در دلفی | delphi
استفاده از DLL‌ها در دلفی | delphi
محدودكردن تغییر اندازه فرم در دلفی | delphi

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


نصب ProgressBar روی StatusBar در دلفی
StatusBar می باشد. انجام این کار بسیار ساده است. برای این کار کافی است بر روی فرم خود یک StatusBar اضافه نمایید حالا در قسمت تعاریف متغیر های عمومی کد زیر را بنویسید:

ProgressBar1: TprogressBar;

در ادامه دستورات زیر را در خاصیت OnCreate فرم خود بنویسید:

var
ProgressBarStyle: LongInt;
begin
{create a run progress bar in the status bar}
ProgressBar1 := TProgressBar.Create(StatusBar1);
ProgressBar1.Parent := StatusBar1;
{remove progress bar border}
ProgressBarStyle := GetWindowLong(ProgressBar1.Handle, GWL_EXSTYLE);
ProgressBarStyle := ProgressBarStyle - WS_EX_STATICEDGE;
SetWindowLong(ProgressBar1.Handle, GWL_EXSTYLE, ProgressBarStyle);
{set progress bar position and size - put in Panel[2]}
ProgressBar1.Left := StatusBar1.Panels.Items[0].Width +
StatusBar1.Panels.Items[1].Width + 4;
ProgressBar1.Top := 4;
ProgressBar1.Height := StatusBar1.Height - 6;
ProgressBar1.Width := StatusBar1.Panels.Items[2].Width - 6;
{set range and initial state}
ProgressBar1.Min := 0;
ProgressBar1.Max := 100;
ProgressBar1.Step := 1;
ProgressBar1.Position := 0;
end;

حالا برای آنکه پس از خارج شدن از فرم حافظه اشغال شده آزاد گردد، در قسمت OnDestroy در Event فرمتان دستور زیر را اضافه نمایید:

ProgressBar1.free;

لينک مقاله
http://www.idevcenter.com :منبع

مقالات مرتبط با اين موضوع
مدیریت حافظه در دلفی | delphi
آرایه‌ها در دلفی | delphi
نكات مفید كار در محیط دلفی | delphi
تاریخچه زبان دلفی | delphi
تغییر Hint برای هر ستون از DBGrid در دلفی | delphi
نمایش میزان كپی شدن فایل با ProgressBar در دلفی | delphi
نصب ProgressBar روی StatusBar در دلفی | delphi
استفاده از DLL‌ها در دلفی | delphi
محدودكردن تغییر اندازه فرم در دلفی | delphi

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


نمایش میزان كپی شدن فایل با ProgressBar در دلفی

چطور میتوان زمان کپی شدن فایل را با استفاده از ProgressBar نمایش داد؟
برای انجام این کار ابتدا بر روی یک فرم یک ProgressBar اضافه کنید سپس تابع زیر را تایپ کنید:

procedure TForm1.CopyFileWithProgressBar1(Source, Destination: string);
var
  FromF, ToF: file of byte;
  Buffer: array[0..4096] of char;
  NumRead: integer;
  FileLength: longint;
begin
  AssignFile(FromF, Source);
  reset(FromF);
  AssignFile(ToF, Destination);
  rewrite(ToF);
  FileLength := FileSize(FromF);
  with Progressbar1 do
  begin
    Min := 0;
    Max := FileLength;
    while FileLength > 0 do
    begin
      BlockRead(FromF, Buffer[0], SizeOf(Buffer), NumRead);
      FileLength := FileLength - NumRead;
      BlockWrite(ToF, Buffer[0], NumRead);
      Position := Position + NumRead;
    end;
    CloseFile(FromF);
    CloseFile(ToF);
  end;
end;

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

procedure TForm1.Button1Click(Sender: TObject);
begin
  CopyFileWithProgressBar1('c:\Welcome.exe', 'c:\temp\Welcome.exe');
end;

چطور می توان زمان کپی شدن فایل را محاسبه و نمایش داد؟
برای این کار نیز میتوانید از تابع زیر استفاده کنید:

procedure TForm1.CopyFileWithProgressBar1(Source, Destination: string);
var
  FromF, ToF: file of byte;
  Buffer: array[0..4096] of char;
  NumRead: integer;
  FileLength: longint;
  t1, t2: DWORD;
  maxi: integer;
begin
  AssignFile(FromF, Source);
  reset(FromF);
  AssignFile(ToF, Destination);
  rewrite(ToF);
  FileLength := FileSize(FromF);
  with Progressbar1 do
  begin
    Min  := 0;
    Max  := FileLength;
    t1   := TimeGetTime;
    maxi := Max div 4096;
    while FileLength > 0 do
    begin
      BlockRead(FromF, Buffer[0], SizeOf(Buffer), NumRead);
      FileLength := FileLength - NumRead;
      BlockWrite(ToF, Buffer[0], NumRead);
      t2  := TimeGetTime;
      Min := Min + 1;
      // Show the time in Label1
      label1.Caption := FormatFloat('0.00', ((t2 - t1) / min * maxi - t2 + t1) / 100);
      Application.ProcessMessages;
      Position := Position + NumRead;
    end;
    CloseFile(FromF);
    CloseFile(ToF);
  end;
end;

در این تابغ ابتدا زمان اولیه در متغیر t1 ذخیره شده و سپس پس از کپی شدن هر قسمت از فایل، زمان در متغیر t2 ذخیره میشود و توسط فرمول زیر مقدار زمان باقی مانده تا کپی کامل فایل بدست می آید.

((t2 - t1) / min * maxi - t2 + t1) / 100

لينک مقاله
http://www.idevcenter.com :منبع

مقالات مرتبط با اين موضوع
مدیریت حافظه در دلفی | delphi
آرایه‌ها در دلفی | delphi
نكات مفید كار در محیط دلفی | delphi
تاریخچه زبان دلفی | delphi
تغییر Hint برای هر ستون از DBGrid در دلفی | delphi
نمایش میزان كپی شدن فایل با ProgressBar در دلفی | delphi
نصب ProgressBar روی StatusBar در دلفی | delphi
استفاده از DLL‌ها در دلفی | delphi
محدودكردن تغییر اندازه فرم در دلفی | delphi

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


تغییر Hint برای هر ستون از DBGrid در دلفی

ابتدا باید یک عنصر جدید مبتنی بر TDBGrid ایجاد کنید و رویداد OnMouseMove را فراخوانی کنید:

type
   TMyDBGrid = class(TDBGrid)
   published
    property OnMouseMove;
   end;

اگرچه شما در رویداد OnMouseMove مختصات X و Y را بدست خواهید آورد، اما شما باید ستون مورد نظر را پیدا کنید. برای ادامه کار لازم است که سطر زیر را در قسمت protected قرار دهید:

procedure WMMouseMove(var Message : TWMMouse); message WM_MOUSEMOVE;

همچنین متغیر های زیر را در قسمت public اضافه نمایید:

MouseRow : integer;
MouseCol : integer;

بنابراین متد WMMouseMove بصورت ریر خواهد بود:

procedure TMyDBGrid.WMMouseMove(var Message : TWMMouse);
var
   t : TGridCoord;
begin
   t := MouseCoord(Message.XPos, Message.YPos);
   MouseCol := t.x;
   MouseRow := t.y;
   inherited;
end;

ما ابتدا فیلدهای XPost و YPos را از ساختار WMMouseMove تنظیم میکنیم:

procedure TForm2.MyDBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X, Y:
Integer);
begin
    if (((dgIndicator in MyDBGrid1.Options) and (MyDBGrid1.MouseCol > 0)) or
       ((not (dgIndicator in MyDBGrid1.Options)) and (MyDBGrid1.MouseCol <> -1)))
       and (MyDBGrid1.MouseCol <> OldMouseCol) then begin
      OldMouseCol := MyDBGrid1.MouseCol;
      if dgIndicator in MyDBGrid1.Options then
         MYDBGrid1.Hint := MyDBGrid1.Columns[MyDBGrid1.MouseCol - 1].FieldName
      else
         MYDBGrid1.Hint := MyDBGrid1.Columns[MyDBGrid1.MouseCol].FieldName;
    end;
end;

حالا مجددا" تعریف زیر را در قسمت public قرار دهید:

HintMouseMessage(Control : TControl; var Message : TMessage)

در قسمت OnMouseMove از TDBGrid نیز فرامین زیر را اضافه نمایید:

var
   r : TMessage;
begin

   Application.HintMouseMessage(self, r);
   TWMMouse(r).XPos := X;
   TWMMouse(r).YPos := Y;
   Application.HintMouseMessage(MyDBGrid1, r);
end;

همه کارها انجام شد. حالا شما میتوانید نتیجه را مشاهده کنید.
لينک مقاله
http://www.idevcenter.com :منبع

مقالات مرتبط با اين موضوع
مدیریت حافظه در دلفی | delphi
آرایه‌ها در دلفی | delphi
نكات مفید كار در محیط دلفی | delphi
تاریخچه زبان دلفی | delphi
تغییر Hint برای هر ستون از DBGrid در دلفی | delphi
نمایش میزان كپی شدن فایل با ProgressBar در دلفی | delphi
نصب ProgressBar روی StatusBar در دلفی | delphi
استفاده از DLL‌ها در دلفی | delphi
محدودكردن تغییر اندازه فرم در دلفی | delphi

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


تاریخچه زبان دلفی

دلفی در واقع یک کامپایلر پاسکال است. دلفی 6 نسل جدید کامپایلر های پاسکال است که شرکت Borland از زمان ایجاد اولین نسخه پاسکال توسط Andres Hejlsberg در 15 سال پیش به بازار عرضه کرد.

برنامه نویسی به زبان پاسکال در سالیان سال از استواری و ثبات، زیبایی و ظرافت و البته سرعت بالای کامپایل سود برده است. دلفی هم از این قاعده مستثنی نیست. کامپایلر دلفی ترکیبی از بیش از یک دهه تجربه طراحی کامپایلر پاسکال و معماری بهبود یافته کامپایلر های 32 بیتی است. اگرچه قابلیت های کامپایلرها با گذشت زمان پیشرفت قابل توجهی داشته است ولی سرعت آن چندان کاهش نیافته و همچنان از سرعت بالایی برخوردار است. به علاوه استحکام و قدرت کامپایلر دلفی معیاری برای سنجش دیگر کامپایلر هاست.

در اینجا به بررسی تفصیلی روند حرکتی دلفی در هر یک از نسخه های آن می پردازیم و مشخصات مهم آن را بررسی می کنیم.

سال 1995 - Delphi1
در زمان استفاده از سیستم عامل DOS برنامه نویسان مجبور بودند از بین زبان پر قدرت ولی کم سرعت Basic و زبان کارآمد ولی پیچیده و نامفهوم Assembly یکی را انتخاب کنند. پاسکال با ارائه یک زبان ساخت یافته و یک کامپایلر سریع و کم نقص این شکاف را پرکرد. برنامه نویسان Windows 3.1 هم با تصمیم گیری مشابهی رو برو شدند. یکی زبان قدرتمند و سنگین ++C و یکی زبان ساده و محدود کننده Visual Basic .

ارائه Delphi1 در این مورد هم راه حل خوبی برای برنامه نویسان بود. دلفی مجموعه متفاوتی برای برنامه نویسی بود . طراحی و توسعه برنامه های کاربردی، ایجاد DLL ها، پایگاههای داده و ... که یک محیط ویژوال وسیع را تشکیل می داد. Delphi1 اولین ابزار برنامه نویسی ویندوز بود که محیط طراحی ویژوال، کامپایلر بهینه کد برنامه و دسترسی قوی به پایگاههای داده را در یک جا جمع کرد که آن را به یکی از بهترین ابزارهای روش نوین توسعه سریع نرم افزار (Rapid Application Development) تبدیل کرد. این مجموعه قدرتمند باعث شد که در همان زمان بسیاری از برنامه نویسان زبانهای دیگر به Delphi روی بیاورند و این موفقیت بزرگی برای Borland به حساب می آمد. همچنین بسیاری از برنامه نویسان پاسکال دلفی را ابزاری یافتند که توسط آن هم از توانایی و تجربه خود در برنامه نویسی پاسکال استفاده می کردند و هم توانایی کار در ویندوز را به دست آوردند. همچنین زبانی که در آن زمان با نام پاسکال شیئی (ObjectPascal) در دانشگاهها ایجاد شده بود یک زبان بسیار خشک و محدود کننده بود که اصلاٌ حالت کاربردی پیدا نکرد.

ویژگیهای دلفی مثل طراحی ظاهری حساب شده و کاربر پسند آن باعث شد که زبان پاسکال شیئی عملاٌ از رده خارج شود. تیم طراحی VB در Microsoft قبل از حضور دلفی هیچ رقیب مهمی برای خود نمی دید. VisualBasic در آن زمان زبانی نا کارآ ، کم سرعت و کند ذهن بود. Visual Basic 3 در عمل اصلا توانایی رقابت با Delphi 1 را نداشت. در این سال شرکت Borland گرفتار یک سری مشکلات قضائی با شرکت Lotus بود که در نهایت هم متخلف شناخته شد. همچنین درگیری مشابهی هم با Microsoft بر سر تلاش در تغییر دادن فضای نرم افزار های Microsoft پیدا کرد. همچنین Borland مشغول طراحی و فروش طرح Quatro به شرکت Novell و طراحی پایگاه های داده dBase و Paradox بود که با استقبال قابل توجهی مواجه نشد.

در این زمان که Borland مشغول فعالیتهای قضایی و تجاری بود Microsft توانست گوی سبقت را از Borland برباید و قسمت اعظم بازار ابزار های برنامه نویسی تحت Windows را در اختیار بگیرد و سعی می کرد تا این طرز فکر را اشاعه دهد که چون Windows را طراحی کرده صلاحیت و توانایی تهیه بهترین ابزار های برنامه نویسی تحت آن را نیز در دست دارد. در این شرایط Borland با عرضه Delphi و نسخه جدید ++Borland C سعی کرد خدشه ای در فرمانروایی Microsoft وارد کند و سهمی در بازار بزرگ این محصولات داشته باشد.

سال 1996 - Delphi2
یک سال بعد Delphi2 تمام مزایای نسخه قبلی را تحت سیستم های جدید 32 بیتی (Windows 95,Windows NT) ارائه داد. همچنین Delphi2 با ارائه خصوصیات اضافه و کارکرد های قویتری نسبت به Delphi1 توانایی های خود را افزایش داد. (ازجمله ارائه کامپایلر 32 بیتی که سرعت بالایی به نرم افزار ها می بخشید، کتابخانه بزرگ و کاملی از اشیای مختلف، شیوه جدید و تکامل یافته ای برای اتصال به پایگاه های داده مختلف، ادیتور پیشرفته، پشتیبانی از OLE ، توانایی وراثت در فرمهای ویژوال و سازگاری با پروژه های 16 بیتی Delphi1 ). Delphi2 به معیاری برای سنجش و مقایسه همه ابزارهای توسعه نرم افزار در آن زمان تبدیل شد.

در آن زمان با ارائه سیستم 32 بیتی Windows95جهش بزرگی در سیستم عامل Windows رخ داد و Borland بسیار مشتاق بود که Delphi را به بهترین ابزار برنامه نویسی سیستم جدید تبدیل کند. نکته این که در آن زمان به منظور تاثیر در افکار عمومی و تاکید بر قدرت Delphi در سیستم عامل 32 بیتی قرار بود که نرم افزار با نام جدید Delphi32 به بازار عرضه شود ولی در آخرین مراحل به خاطر اینکه نشان دهند این زبان زبانی رشد یافته و تکامل یافته نسخه قبلی یعنی Delphi1 است نام Delphi2 را برای آن انتخاب کردند.

Microsoft تلاش کرد که با Visual Basic 4 با Delphi مقابله کند ولی از ابتدا کیفیت پایین آن و ضعف آن در انتقال برنامه های 16 بیتی به سیستم 32 بیتی و بروز اشکالات ساختاری در طراحی آن موجب شکست زودهنگام Visual Basic 4 شد. در این زمان هنوز تعداد زیادی از برنامه نویسان به Visual Basic وفادار بودند. Borland هنچنین روشها و ابزارهای قدرتمندی همچون PowerBuilder برای طراحی نرم افزار های Client/Server ارائه داد ولی Delphi هنوز آن قدر قدرتمند نشده بود که بتواند نرم افزارهایی که جایی در بین توسعه گران پیدا کرده اند را براندازد.

سال 1997 - Delphi3
از زمان تهیه و توسعه Delphi1 تیم توسعه Delphi در فکر گسترش و ایجاد یک زبان قدرتمند جهانی بود. برای Delphi2 این تیم تمام نیروی خود را صرف اعمال مربوط به انتقال تواناییها و کارکرد ها به سیستم 32 بیتی و همچنین اضافه کردن خصوصیات Client/Server و پایگاه داده کرد. در زمان تهیه Delphi3 تیم توسعه فرصت لازم برای گسترش مجموعه ابزار موجود را یافت و در این راستا کیفیت و کمیت ابزارهای Delphi بهبود یافت. به علاوه راه حل هایی برای مشکلات عمده و قدیمی برنامه نویسان تحت ویندوز ارائه شد. به ویژه استفاده از برخی فناوری های پیچیده و نا مفهوم (مثل COM و ActiveX وتوسعه نرم افزار های تحت Web وکنترل پایگاههای داده چند کاربره). روش نمایش کد برنامه همچنین توانایی کامل کردن خودکار کد (Code Completion) عملیات کد نویسی را راحت تر کرد. ضمن این که همچنان در بیشتر موارد اساس و متدولوژی برنامه نویسی مانند Delphi1 بود و بر پایبندی به قوانین اصولی Pascal تاکید می شد.

در این زمان رقابت شرکت های تولید کننده ابزار های برنامه نویسی بسیار تنگاتنگ شده بود. Microsoft با ارائه Visual Basic 5 به پیشرفت های خوبی دست یافت ازجمله پشتیبانی قوی از COM و ActiveX و ایجاد برخی خصوصیات و تغییرات کلیدی و اساسی در کامپایلر VB. ضمن این در همین سال Borland با پشتوانه قوی Delphi و با استفاده از ساختار موفق آن ابزارهای دیگری همچون Forte و BC++ Builder به بازار عرضه کرد.

تیم Delphi در زمان طراحی Delphi3 چند تن از اعضای کلیدی خود را از دست داد. Andres Hejlsberg معمار اصلی Delphi در اقدام غیر منتظره ای Borland را ترک کرد و تصمیم گرفت به رقیب دیرینه یعنی Microsoft بپیوندد. اما حرکت تیم Delphi متوقف نشد و معاون Hejlsberg که سالها تجربه همکاری با او را داشت توانست رهبری این تیم را به خوبی در دست بگیرد. همچنین مسئول فنی تیم (Paul Gross) هم در اقدام مشابهی به گروه Microsoft ملحق شد. این تغییرات بیشتر به خاطر اختلافات شخصی بین افراد تیم بود و نه به خاطر مسائل حرفه ای.

سال 1998 - Delphi4
Delphi4 بیشتر بر روی راحتتر کردن کار با دلفی متمرکز شد. مرورگر روال ها (Module Explorer) بهبود یافت و مرور و ویرایش Unit ها را راحت تر کرد. کنترل کد و کامل کردن خودکار کلاسها این فرصت را به کاربر داد که فکر و زمان خود را روی ساختار اصلی برنامه بگذارد و در وقت صرفه جویی کند. طراحی رابط کاربر هم کاملاٌ عوض شد و بهبود یافت و اشکال زدا (Debugger) نیز پیشرفت قابل توجهی داشت. Delphi4 قابلیتهای برنامه نویسان را در استفاده از تکنولوژیهای چند منظوره خارجی مثل MIDAS ، DCOM ، MIS و Corba افزایش داد.

در این سال Delphi جایگاه خود را در رقابت با دیگران مستحکم کرده بود و کم کم به سمت دست یابی به سودآوری مالی مورد نظر خود پیش می رفت. در واقع در این زمان بود که حاصل کار سنگین چند ساله تیم نمایان می شد. بعد از سالها آزمایش Delphi شهرت و محبوبیت خاصی پیدا کرد و دیگر برنامه نویسان Delphi توانایی جدا شدن از آن را نداشتند. در این زمان Borland به کار سوٌال برانگیزی دست زد و به منظور تبلیغ بیشتر و برتری در جنگ روانی با دیگر شرکتها نام Inprise را برای فعالیتهای تجاری خود برگزید.

ابزار های مربوط به فن آوری Corba را گسترش داد تا راه جدیدی برای سودآوری ایجاد کند. برای موفقیت در این زمینه Corba نیاز به رابط کاربر قدرتمندی داشت که در کنار توانایی های آن کار کردن با آن نیز راحت باشد. دقیقاٌ همان کاری که در سالهای قبل در مورد COM و برنامه نویسی تحت Web انجام شده بود و به موفقیت دست یافته بود. با این وجود بنا به دلایل مختلفی این گسترش و توسعه Corba هیچ وقت تکامل و موفقیتی که مورد نظر بود را به دست نیاورد و بر خلاف تبلیغات و سرمایه گذاری های انجام شده فن آوری Corba تنها توانست نقش کوچکی در روند رو به جلوی Delphi ایفا کند.

سال 1999 - Delphi5
Delphi5 در برخی زمینه ها پیشرفت های قبلی را ادامه داده است. اولاٌ مسیری را که Delphi4 با اضافه کردن ویژگیهای زیادی شروع کرده بود ادامه داد. Delphi4 باعث شد کارهایی که قبلاٌ به صرف وقت زیادی احتیاج داشت بسیار سریعتر انجام شود. Delphi به شکل امیدوار کننده ای به برنامه نویس این امکان را می دهد که بیشتر به برنامه ای که میخواهد بنویسد توجه کند و نه به قواعد برنامه نویسی و نوشتن کد های تکراری و خسته کننده. این ویژگیهای سودمند شامل رابط کاربر بهبودیافته و سیستم اشکال زدایی(Debugger) توانمند ، امکانات برنامه نویسی تیمی و ابزار های ترجمه می شود.

ثانیا Delphi5 خصوصیات جدیدی را در بر می گیرد که توسعه برنامه های تحت وب را واقعاٌ راحت کرده است. این ویژگیها شامل طراح اشیای مربوط به ASP برای ساختن صفحات (Active Server Page)، اشیایی موسوم به Internet Express برای پشتیبانی از XML و خصوصیات جدید MIDAS که آن را به یک ابزار همه کاره در پایگاه های داده تحت Web تبدیل کرد. در نهایت با صرف وقت ، هزینه و صبر زیاد توانست Delphi5 قدرتمند را عرضه کند. این فعالیت مدتها به طول انجامید و قبل از عرضه عمومی، Delphi5 بارها در بازبینی ها و آزمایشهای داخلی قسمتهای مختلف آن تغییر کرد و بهبود یافت.

Delphi5 در نیمه دوم سال 1999 به بازار عرضه شد و به نفوذ و تسلط بر بازار ادامه داد. در این زمان Visual Basic که کم کم به عضوی تحقیر آمیز برای Microsoft تبدیل می شد هم با پیشرفتهایی توانست در رقابت دوام بیاورد و از صحنه خارج نشود. در اقدام درست و به جایی نام Inprise دوباره به Borland بازگشت. این اقدام از سوی طرفداران و مشتریان قدیمی Borland با استقبال خوبی مواجه شد.

سال 2001 – Delphi6
در هنگام تهیه Delphi6 ساختار Delphi در زمینه های مختلف شکل گرفته بود و به یک تکامل نسبی رسیده بود. این مسئله باعث شد که تیم طراحی بتواند وقت خود را بر روی طرحی که مدتها تنها در حد یک نظریه بود بگذارد و آن را بسیار زودتر از آن که انتظار می رفت عملی کند: گام نهادن به محیط های فراتر از Windows . بیشتر نیروی توسعه گران Delphi در این مدت صرف رهانیدن Delphi از بند Windows شد که این خود در درجه اول مبارزه ای آشکار با سلطه Microsoft بود و ثانیاٌ راه برنامه نویسان را به سوی فضا های دیگر برنامه نویسی باز کرد. در ابتدا این عمل ریسک بزرگی بود و بیم آن می رفت که جایگاه Delphi در Windows هم به خطر بیفتد ولی در نهایت به نقطه رشد و قوتی بدل شد که Delphi را به یکی از بهترین ابزار برنامه نویسی Multi Platform تبدیل کرد.تکنولوژی CLX روالهای مختلف Delphi را با Kylix (عضو جدید خانواده Borland که در فضای Linux کار می کند) به اشتراک گذاشت و استفاده از سیستم بایت Java باعث شد که Delphi حتی از قید سخت افزار هم رها شود.

به نظر می رسد که این فعالیتها باعث ثبات Delphi در دنیای برنامه نویسان شود و نگرانی های Borland و برنامه نویسان که همیشه می ترسیدند که مبادا با ضعیف شدن Windows جایگاه خود را از دست بدهند حال به افتخار و آرامش برای آنان و نگرانی برای طرفداران Microsoft تبدیل شده است.
لينک مقاله
http://www.idevcenter.com :منبع

مقالات مرتبط با اين موضوع
مدیریت حافظه در دلفی | delphi
آرایه‌ها در دلفی | delphi
نكات مفید كار در محیط دلفی | delphi
تاریخچه زبان دلفی | delphi
تغییر Hint برای هر ستون از DBGrid در دلفی | delphi
نمایش میزان كپی شدن فایل با ProgressBar در دلفی | delphi
نصب ProgressBar روی StatusBar در دلفی | delphi
استفاده از DLL‌ها در دلفی | delphi
محدودكردن تغییر اندازه فرم در دلفی | delphi

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


نكات مفید كار در محیط دلفی

محیط دلفی برای برنامه نویسی یکی از بهترین محیطهای برنامه نویسی است گذشته از کارکرد داخلی و کمپایلر آن که بسیار قوی و سریع است، محیط آن یعنی IDE آنهم قدرت بسیار زیادی دارد که باعث شده یکی از بهترین ادیتورها باشد. در این مقاله من سعی بر این داشته ام تا با ارائه یک سری از نکات و کلیدهای میانبر که می توانند برای کار در دلفی بسیار مفید و کارا باشند، کمک کنم تا شما بتوانید با قدرت بیشتر به برنامه نویسی و کار در این محیط قدرتمند ادامه دهید.

در قسمت اول مقاله که در حال حاضر در مقابل شماست من یک سری از کلیدهای میانبر و ترکیبی مورد استفاده در IDE دلفی را بصورت لیست وار و همراه یک توضیح کوچک آورده ام. دوستان عزیز برنامه نویس ممکنه که شما مدتها با دلفی مشغول برنامه نویسی بوده باشید اما من یقین دارم که در این لیست نکات و روشهای جدیدی را خواهید آموخت.

جستجو در متن بصورت مستقیم:
برای اینکار کلیدهای Ctrl+E را بفشارید و بدنبال آن شروع به تایپ کلمه مورد نظر کنید نتیجه آن را خود ببینید. برای اینکه به کلمه بعدی بروید کافیست کلید F3 را بزنید.

ایجاد فرورفتگی در کد:
بعضی اوقات - که خیلی هم پیش می‌آید - لازم است که یک مقداری از متن را بصورت بلوک شده به جلو و یا عقب ببریم. منظور دندانه دار کردن متن است که به خوانایی برنامه کمک می کند. برای اینکار می تونید از کلید Ctrl +Shift+I برای جلو بردن و Ctrl+Shift+U برای عقب برگرداندن متن بلوک شده استفاده کنید.

پرش به قسمت تعریف یک شی (Object):
ببنید شی مورد نظرتون (از قبیل VCL, Procedure, Function,...) در کجا و چطور تعریف شده می توانید کلید Crtl رو پایین نگه داشته و روی شی مورد نظر Click کنید.

برای تغییر حالت کاراکترها:
شما می توانید یک قسمت از متن (که ممکن است با حروف بزرگ و یا کوچک تایپ شده باشد) را انتخاب کنید و با زدن کلیدهای Ctrl+O+U به ترتیب تمامی حروف کوچک آن قسمت از متن را به حروف بزرگ و تمامی حروف بزرگ آنرا به حروف کوچک تبدیل کنید. برای تعییر حالت یک کلمه نیز میتوانید روی کلمه مورد نظر رفته و کلیدهای Ctrl+K+F برای بزرگ کردن و کلیدهای Ctrl+K+E را برای کوچک کردن حروف آن کلمه بکار برد.

درست کردن ماکرو متنی:
این امکان بسیار مفید است و می تواند بسیاری از کارهای نوشتاری را کاهش دهد با اینکار شما میتوانید یک سری از کارهای تکراری که روی متون انجام می دهید را بصورت ماکرو در آورده و از آنها به راحتی استفاده کنید. برای شروع به ضبط ماکرو کلیدهای Ctrl+Shift+R را بفشارید و آن سری کارهایی را که می خواهید را انجام دهید و سپس برای اینکه به کار ضبط ماکرو پایان دهید کلیدهای Ctrl+Shift+R را دوباره بزنید. حال برای استفاده از ماکرو کافیست در هر جا که لازم بود کلیدهای Ctrl+Shift+P را بفشارید.

انتخاب متن بصورت مربعی:
اگر شما از کهنه کارهای کامپیوتر باشید حتما از زمان داس یادتون هست که برنامه ای بود به نام PE2 که یکی از امکانات بسیار جالبش این بود که یک مربع از متن رو میتوانستین انتخاب کنید و آنرا کپی یا حذف کنید. بله درست متوجه شدید در محیط دلفی هم شما اینکار را میتوانید انجام دهید اما نه به مشکلی PE2 بلکه اینکار را میتوانید فقط با گرفتن کلید Alt و کشیدن موس روی متن انجام دهید. هر چند ممکن است در نگاه اول زیاد این امکان مفید به نظر نیاید ولی بعضی وقتهای خیلی کار را راحت میکنه، که حتماً تجربه خواهید کرد.

گذاشتن علامت روی متن:
این کار که به BookMark معروف است بسیار مفید و کارا می باشد. در هنگامی که شما روی قسمتی از متن برنامه کار میکنید و می خواهید به یک قسمت دیگر بروید ممکن است برای برگشتن به مکان اول خود کمی مشکل پیدا کنید. ولی شما میتوانید با زدن چند دکمه به محل مورد نظرتون باز گردید. برای اینکار در خطی که قصد دارید علامت بگذارید کلیدهای Ctrl+Shift+0..9 را بفشارید. منظور اینست که کلیدهای Ctrl+Shift را نگه دارید و یکی از اعداد 0 تا 9 را وارد کنید تا آن خط به همان شماره علامت گذاری شود و سپس هر جا که خواستید بروید و سپس هر بار که کلید Ctrl را نگه دارید و شماره مورد نظر را وارد کنید به همان خط باز خواهید گشت. البته توجه داشته باشید که فقط می توانید 10 خط را با این روش علامت گذاری بکنید و برای برداشتن علامت ها کافیست روی همان خط دوباره کلید Ctrl+shift و شماره‌ای که برای آن خط وارد کرده اید را بفشارید با اینکار علامت آن خط برداشته می شود.

ایجاد کلاس مورد نظر:
شما هنگامی که در قسمت Private و یا Public یک type، روال یا تابع درست کردید لازم دارید که قسمتی را برای قرار دادن کدهای مربوط به آن روال یا تابع را ایجاد کنید. برای اینکار شما پس از اینکه نام تابع را تایپ کردید می توانید کلیدهای Ctrl+Shift+C را فشار دهید تا دلفی یک قسمت برای نوشتن کدهای مورد نظرتان ایجاد کند.

ظاهر کردن پنجره Code insight:
شما حتما به اهمیت و مفید بودن این قسمت دلفی واقفید که در هنگام کد نویسی تا چه حد می تواند کارها را راحت کند. بله در هنگام وارد کردن کدها بعد از وارد کردن نام یک کلاس و یا Object با زدن یک نقطه (.) پنجره Code Insight‌ ظاهر می شود. حال در بعضی وقتها شما ممکن است که نقطه را قبلا وارد کرده باشید و یا در مواقع دیگر این پنجره ظاهر نشود. در این صورت برای اینکه پنجره را ظاهر کنید باید دوباره نقطه را وارد کنید ولی راه آسانتری هم وجود دارد و آن اینست که کلیدهای Ctrl+Speacebar را فشار دهید.

ظاهر کردن پنجره Code Parameter:
همانند بالا در هنگام ظاهر شدن Hint مربوط به راهنمای توابع که معمولاً بعد از گذاشتن پرانتز مربوط ظاهر میشود و در مورد پارامترهای لازم می باشد نیز می توانید از کلیدهای Ctrl+Shift+SpaceBar استفاده کنید.

رفتن از قسمت تعریف توابع و روالها به قسمت کد آنها:
همیشه این نیاز وجود خواهد داشت که شما در هنگامی که دارید به دنبال یک روال در قسمت type میگردید بعد از پیدا کردن نام آن می خواهید که خود آن تابع یا روال را نیز ببنید. برای اینکار خوب حتما نام آن را جستجو میکنید ولی یک راه آسانتر اینست که شما روی نام آن تابع قرار گیرید و کلیدهای Ctrl+Shift+Up/Down را بزنید. در اینحالت اگر روی کد تابع باشید به قسمت تعریف آن خواهید رفت.

لينک مقاله
http://www.idevcenter.com :منبع

مقالات مرتبط با اين موضوع
مدیریت حافظه در دلفی | delphi
آرایه‌ها در دلفی | delphi
نكات مفید كار در محیط دلفی | delphi
تاریخچه زبان دلفی | delphi
تغییر Hint برای هر ستون از DBGrid در دلفی | delphi
نمایش میزان كپی شدن فایل با ProgressBar در دلفی | delphi
نصب ProgressBar روی StatusBar در دلفی | delphi
استفاده از DLL‌ها در دلفی | delphi
محدودكردن تغییر اندازه فرم در دلفی | delphi

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آرایه‌ها در دلفی

دلفی به ما امکان می دهد آرایه‌هایی از هر نوع متغییری را ایجاد کنیم. برای تعریف آرایه به صورت زیر عمل میکنیم:

var
   array[indexType1, ..., indexTypen] of baseType;

در این تعریف برای نامگذاری آرایه، از قانون نامگذاری متغییرها استفاده میکنیم و مقدار اولیه را نیز درون یک جفت کروشه قرار می دهیم.

نکته: شما می توانید به جای استفاده از کروشه [] از ترکیب پرانتز نقطه استفاده کنید:

d(.i.):= 3 + i; // Equivalent d[i]:= 3 + i;

نکته: وقتی که شما یک آرایه را تعریف می کنید احتیاجی ندارید که به آن مقدار کمترین یا بیشترین بدهید:

var
   A : array [Boolean] of integer;
begin
   A[True] := 50;
   A[False] := 100;
end;

نکته: توابع Low و High کران‌های پایین وبالای یک متغییر آرایه‌ای یا نوعی یا ترتیبی را بر میگردانند:

for I := 0 to High(X) do S := S + X[I];

آرایه‌های ثابت:
آرایه های ثابت می توانند توسط ساختار ثابت نوع دلفی تعریف شود. نوع ثابت که همیشه با عبارت Const تعریف می شود، نه تنها مانع تغییر مقدار پارامتر می شود، بلکه کدهای بهینه بیشتری برای رشته‌ها و رکوردهای رد شده به توابع تولید می کند. ما هنگامی از این نوع استفاده می کنیم که نخواهیم مقدار رد شده به یک تابع تغییر کند.

type
   TDay = (Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday);

const
   DayNames : array [TDay] of String[9] = ('Sunday', 'Monday', 'Tuesday',
                                           'Wednesday', 'Thursday',
                                           'Friday', 'Saturday');
var
   Today : TDay;

begin
   Today := TDay(DayOfWeek(Date) - 1);
   ShowMessage('Today is ' + DayNames[Today] + '!');
end;

آرایه‌های دینامیکی:
آرایه‌های دینامیکی، آرایه‌های تحلیلی پویایی هستند که ابعاد آنها موقع کامپایل شدن شناخته شده نیست. برای اعلان آنها کافی است یک آرایه بدون بعد تعریف کنید:

var MyFlexibleArray: array of Real;

قبل از به کار گیری آرایه‌های دینامیکی، ابتدا باید از رویه SetLength برای تخصیص حافظه آرایه استفاده کرد:

SetLength (MyFlexibleArray, 2; (

نکته: آرایه‌های دینامیکی همیشه مبتنی بر صفر می باشند.

نکته: شما می‌توانید آرایه‌های دینامیکی را قبل از رسیدن به ترک قلمرو از حافظه خارج کنید:

MyFlexibleArray := nil;

نکته: مقدار حافظه‌ای که در اختیار آرایه قرار میگیرد، به طول آرایه ونوع عناصر آن بستگی دارد. به عنوان مثال اگر آرایه‌ای از نوع صحیح به طول 10 داشته باشیم 4*10 بایت حافظه به آن اختصاص می‌یابد.

فشرده‌سازی آرایه‌ها:
در دلفی شما هنگامی که ساختار خود را تعیین کردید می‌توانید با استفاده از کلمه کلیدی packed اطلاعات ذخیره شده خود را متراکم کنید:

type TNumbers = packed array[1..100] of Real;

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

آرایه‌های چند بعدی دینامیکی:
برای تعریف آرایه‌های چند بعدی دینامیکی، تنها کافی است ...array of را در ساختار خود تکرار کنید. به طور مثال:

type
   TMessageGrid = array of array of string;

var
   Msgs: TMessageGrid;

این تعریف یک آرایه دو بعدی از رشته‌ها می باشد. سپس باید به آرایه خود فضا نسبت داد:

SetLength(Msgs, I, J);

شما می‌توانید آرایه‌های چند بعدی دینامیکی خود را به صورت غیر مستطیلی (Not Rectangular) ایجاد کنید. ابتدا رویه SetLength را صدا زده و پارامتر بعد اول را بدهید:

var
   Ints: array of array of Integer;

SetLength(Ints, 10);

ما 10 سطر به آرایه خود اختصاص دادیم. از این پس، شما می توانید ستونهای خود را در هر زمان (با اندازه‌های مختلف) تخصیص دهید:

SetLength(Ints[2], 5);
لينک مقاله
http://www.idevcenter.com :منبع

مقالات مرتبط با اين موضوع
مدیریت حافظه در دلفی | delphi
آرایه‌ها در دلفی | delphi
نكات مفید كار در محیط دلفی | delphi
تاریخچه زبان دلفی | delphi
تغییر Hint برای هر ستون از DBGrid در دلفی | delphi
نمایش میزان كپی شدن فایل با ProgressBar در دلفی | delphi
نصب ProgressBar روی StatusBar در دلفی | delphi
استفاده از DLL‌ها در دلفی | delphi
محدودكردن تغییر اندازه فرم در دلفی | delphi

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


مدیریت حافظه در دلفی
تخصیص خودکار حافظه
وقتی شما از نوع‌های پایه (Integer ،real ،word و…) برای ایجاد متغییرهای خود استفاده می کنید، هیچ نگرانی درباره تخصیص حافظه آن وجود ندارد چون دلفی خودش آنرا تخصیص حافظه می کند و سپس آزاد میکند.

type
   TDay = (Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday)
var
   Name  : String;                          {256 Bytes}
   X, Y  : Integer;                           {4 + 4 = 8 Bytes}
   List  : array [0..10] of Double;     {8 * 11 = 88 Bytes}
   Today : TDay;                            {1 Byte}

دراین نمونه پس از پایان برنامه، تمام حافظه تخصیص داده شده فراخوانی و آزاد می شود.

تخصیص حافظه دینامیکی
در این حالت برنامه نویس احتیاج دارد تا انباره حافظه را شخصا" تخصیص و آزاد کند.

نوع Pointer
اشاره‌گرها در دلفی می‌توانند شکل‌های مختلفی را در برگیرد. نخست، نوع اشاره‌گری که یک آدرس حافظه را برای نوع ویژه‌ای از داده، همانند صحیح، رشته و غیره نگه میدارد (Typed Pointer).

var
;Number : ^Integer
;Name   : ^String

دوم، اشاره‌گرهای بدون نوع. اشاره‌گرهای بدون نوع (Untyped Pointers) خیلی به نوع معمولی خود شبیه هستند. اما محدودیت‌هایی مثل اینکه باید به نوع خاصی اشاره (Point) کند را ندارد.

var
;Something : Pointer

حال اشاره‌گر بدون نوع ما می تواند به هر نوعی از داده اشاره کند. برای تخصیص حافظه آن، از کمپلکس بیش از یک بیت استفاده میکنیم. برای مثال برنامه زیر کامپایل می شود ولی در زمان اجرا حافظه‌ای تخصیص نمیشود.

begin
   New(Something);
   Dispose(Something);
end;

برای تخصیص حافظه کامپایلر باید بداند که نوع داده ما برای تخصیص حافظه چیست:

type
   IntPtr = ^Integer;

var
   Something : Pointer;
begin
   Something := New(IntPtr);
   Integer(Something^) := 10;
   Dispose(Something);
end;

تخصیص بلاکی از حافظه
ما می‌توانیم از اشاره به بلاک‌هایی از تخصیص حافظه در سیستم استفاده کنیم. این کار را با رویه‌های GetMem و FreeMem برای تخصیص و آزاد سازی حافظه استفاده میکنیم.

var
   Something : Pointer
begin
   GetMem(Something, 100);
   FreeMem(Something, 100);
end;

اشاره به حافظه از قبل تخصیص داده شده
هر دو نوع اشاره‌گرها می توانند به هر جایی از حافظه اشاره بکنند. این بدان معناست که آنها می‌توانند اشاره به فضای اشغال شده با داده‌هایی که در حال حاضر موجودند داشته باشند. این نمونه اشاره‌گر احتیاجی به تخصیص حافظه ندارد.

var
   Something : Pointer;
   MyString  : PChar;        // type PChar = ^Char;

begin
   GetMem(Something, 100);
   MyString := Something;
   StrCopy(Something, 'Hello World');
   FreeMem(Something, 100);
end;

حافظه Heap
Heap شامل قسمتی از حافظه موجود در یک برنامه است که آنرا حافظه پویا می نامیم. Heap بخشی است که در آن تخصیص و تعریف حافظه به صورت تصادفی (Random) اتفاق می‌افتد. این به آن معناست که اگر شما سه بلاک از حافظه را به طور متوالی تخصیص دهید، می توانید بعد از هر دستور آنرا از بین ببرید. مدیر Heap جزئیات را برای شما نگهداری می کند. بنابراین شما به سادگی می توانید یک حافظه جدید را با GetMem و یا بوسیله صدا زدن constructor هنگام ساختن یک شی درخواست کنید و دلفی به شما یک بلاک جدید را برخواهد گرداند. Heap یکی از سه فضای موجود در برنامه کاربردی را استفاده کرده و دوتای دیگر به صورت فضای یکپارچه (Global) و پشته قرار می گیرند.

حافظه Stack
Stack شامل قسمتی از یک بخش از حافظه موجود یک برنامه است که دینامیکی است اما برای تخصیص و آزادسازی فرامین مخصوص دارد. تخصیص Stack به صورت LIFO می باشد. این بدان معناست که آخرین حافظه شیء شما تخصیص داه خواهد شد و سپس حذف می شود. حافظه پشته در روتین‌های نوعی استفاده می‌شود. وقتی شما یک روتین را صدا میزنید، پارامترهایش و روتین نوع آن در پشته ریخته می شود. همچنین پارامترهایی که در یک روتین تعریف میشوند، در پشته ذخیره میشوند و وقتی روتین خاتمه پیدا می کند تمام آنها به طور خودکار از بین می رود.
لينک مقاله
http://www.idevcenter.com :منبع

مقالات مرتبط با اين موضوع
مدیریت حافظه در دلفی | delphi
آرایه‌ها در دلفی | delphi
نكات مفید كار در محیط دلفی | delphi
تاریخچه زبان دلفی | delphi
تغییر Hint برای هر ستون از DBGrid در دلفی | delphi
نمایش میزان كپی شدن فایل با ProgressBar در دلفی | delphi
نصب ProgressBar روی StatusBar در دلفی | delphi
استفاده از DLL‌ها در دلفی | delphi
محدودكردن تغییر اندازه فرم در دلفی | delphi

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


Join کردن بيش از ۲ جدول براي Database هاي Access

کتاب ColdFusion MX Bible براي Join کردن بيش از دو جدول يک بانک اطلاعاتي راه حل زير را پيشنهاد مي کند:

SELECT
  c.CompanyID,
  c.CompanyName,
  e.LastName,
  e.FirstName,
  e.Salary,
  d.FullName,
  d.RelationShip
FROM
  Company c INNER JOIN Employee e
  ON c.CompanyID = e.CompanyID
  INNER JOIN Dependant d
  ON e.SSN = d.SSN
که در بيشتر برنامه هاي Database Server درست عمل مي کند.
اما در بانکهاي اطلاعاتي Microsoft Access پيغام خطايي با توضيح زير مي دهد :
Operator expected
من پس از يک کم جستجو در کتاب ها و پرسش از ديگران ، يک دوست آمريکايي من راه حل زير را پيشنهاد داد. در اکسس در برخي قسمت ها وجو د پارانتز الزامي است با اينکه در انواع ديگر بانک هاي اطلاعاتي نيازي به آن پارانتز ها نيست. يعني کد مورد نظر را بايد به صورت زير باز نويسي کنيم :
SELECT
  c.CompanyID,
  c.CompanyName,
  e.LastName,
  e.FirstName,
  e.Salary,
  d.FullName,
  d.RelationShip
FROM
  (Company c INNER JOIN Employee e
  ON c.CompanyID = e.CompanyID)
  INNER JOIN Dependant d
  ON e.SSN = d.SSN

و يک نمونه ي ديگر در اتصال ۴ جدول :
SELECT
  cfarticle.id,
  cfarticle.title,
  cfarticle.description,
  cfarticle.dateadded,
  editorial.authorname as author,
  categories.name,
  levels.levelname
FROM
  ((cfarticle INNER JOIN categories ON cfarticle.category=categories.id)
   INNER JOIN editorial ON cfarticle.author=editorial.id)
    INNER JOIN levels ON cfarticle.skllevel=levels.id
لينک مقاله
http://www.macromediax.com :منبع

مقالات مرتبط با اين موضوع
تعريف كلي از اكسسAccess | access
تابع تبديل عدد به حروف | access
بستن دكمه شيفت | access
صدور پيغامهاي فارسي بجاي پيغامهاي Error اكسس | access
ماجول تاريخ هجري شمسي با توابع جانبي آن | access
ایراد The search key was not found in any record | access
Join کردن بيش از ۲ جدول براي Database هاي Access | access

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


ایراد The search key was not found in any record

Microsoft JET Database Engine error '80040e21'

The search key was not found in any record.

/myfile.asp, line 113

یه روز یه برنامه ASP که از بانک اطلاعاتی ACCESS استفاده میکرد نوشته بودم که وقتی فرمان update يا delete را بر روی بانک اعمال ميکردم پيام فوق برام می آمد و به من میگفت که چنین رکوردی در بانک وجود ندارد.این در حالی بود که وقتی Query میگرفتم همه چیز درست بود . فکر کردم مشکل از سرور است .دیتابیس رو از سایت دانلود کردم تا رکورد موردنظر را در اکسس بصورت دستی پاک کنم ، اما با کمال تعجب دیدم که در حالی که رکورد موردنظر جلوی چشمان منه ، میگه چنین رکوردی موجود نیست . هر چی کتاب در این زمینه داشتم زیر و رو کردم ، اما چیزی پیدا نکردم . یه دفعه یاد یه کتابخانه خیلی بزرگ افتادم که میدونستم حتما حداقل یه مقاله در این مورد توش هست ! بله ، اینترنت !

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

  • برای تعمیر دیتابیس : اگر بانک روی سرور است آنرا دانلود کنید و در اکسس آن را باز کنید . به منوی Tools بروید و 'Database Utilities را باز کنید و Compact and Repair Database را انتخاب کنید . با اینکار اکسس دیتابیس را تعمیر میکند . حال آنرا ذخیره کنید و دوباره میتوانید رکورد ها را حذف یا آپدیت کنید.

این کار را کردم ودرست شد و من دیتابیس را آپلود کردم . اما بار دیگر این اتفاق افتاد .خوب ، باید یه راه درستی باشه که از بروز این مشکل پیشگیری کنه، نمیشه که هر روز من فایل رو دانلود کنم. ( همیشه پیشگیری بهتر از درمان است ) و بالاخره راه حل را یافتم .

  • برای پیشگیری از بروز مشکل : فیلد MEMO نباید Index آن برابر YES باشد . چون فیلد های memo نمی توانند اندیس داشته باشند این مشکل روی میدهد .
  • یک مشکل و یک راه دیگر : این مشکل در موقعی که نام یک فیلد دارای فاصله باشد نیز روی میدهد . هنگام استفاده از درایور ODBC با یک کرسر سمت سرور ، اجازه آپدیت داده نمیشود و بجای آن ADO یک فرمان SQL برای آن میسازد ، ولی از گذاشتن علامت [ ] در اطراف نام فیلد غفلت میکند و این امر باعث ایجاد Error میشود . برای پیشگیری از این مشکل در نام فیلد از فاصله استفاده نکنید و یا بجای ADO از فرامین SQL استفاده کنید .

با تشکر از : ASP Free Forums
لينک مقاله
http://www.macromediax.com :منبع

مقالات مرتبط با اين موضوع
تعريف كلي از اكسسAccess | access
تابع تبديل عدد به حروف | access
بستن دكمه شيفت | access
صدور پيغامهاي فارسي بجاي پيغامهاي Error اكسس | access
ماجول تاريخ هجري شمسي با توابع جانبي آن | access
ایراد The search key was not found in any record | access
Join کردن بيش از ۲ جدول براي Database هاي Access | access

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


رويدادها در ويژوال بيسيک

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

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

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

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

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

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

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

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

حالا برنامه رو اجرا کنين ماوس رو روي ليبل بذارين و از روش بردارين -[ ...اينه ! ]
لينک مقاله
http://aspx.persianblog.com :منبع

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


ماجول تاريخ هجري شمسي با توابع جانبي آن

در بانك اطلاعاتي Access فيلدهاي نوع Date پاسخگوي نياز كاربران فارسي كه با تاريخ هجري شمسي كار مي كنند نيست . البته برنامه هايي مثل پارسا ۹۹ تقويم سيستم را به تقويم هجري شمسي تبديل مي كند و بعد از آن كاربران فارسي مي توانند از فيلدهاي نوع Date اكسس استفاده كنند .بدين ترتيب پارسا مشكل تاريخ هجري شمسي را حل ميكند ولي بعضا تاريخ شمسي سيستم بنا به دلايلي از بين ميرود . مثلا اگربعد از نصب پارسا، Officeنصب شود تاريخ هجري شمسي سيستم به هم مي خورد. براي رهايي از وابستگي برنامه هاي شما به پارسا و ... ، توابع زير مي تواند مشكل شما را بطور كامل حل كند .
اين ماجول در چندين برنامه تست شده و جواب گرفته است شما هم مي توانيد از آن استفاده كنيد.
(توجه داشته باشيد كه كدهاي نوشته شده ، در اينجا از چپ به راست نمايش داده شده اند ولي با كپي آن در اكسس ، نمايش آن از چپ به راست خواهد شد)

در صورت استفاده از اين ماجول ، فيلدهاي از نوع تاريخ را بايد از نوع Number تعريف كنيد. توضيحات بيشتر جهت استفاده از ماجول ، درون خود ماجول نوشته شده است.
براي استفاده از اين ماجول ، از دو خط پايين تر تا انتهاي متن را در حافظه كپي كرده (Copy) و سپس در يك ماجول جديد در اكسس يا VB قرار دهيد (Paste):

' *************************************************************
' برنامه نويس : حميد آزادي
' Email: azadi1355@yahoo.com
' Web Address: http://try.persianblog.com
' ويرايش سوم : زمستان 1381
' *************************************************************

' 1- تعريف كنيد Number(Long) است را بصورت Date فيلدهايي كه نوع آنها
' 2- اين فيلدها را بصورت 00/00/00 تنظيم كنيد InputMask خاصيت
' بدليل 6 رقمي در نظر گرفتن فيلد تاريخ ، اين توابع تا سال 1399 كارايي دارد
' ...
' تاريخ جاري سيستم را به هجري شمسي تبديل مي كند Shamsi() تابع
' بكار ببريد Now() را مي توانيد در گزارشات بجاي تابع Dat() تابع
' :براي جلوگيري از ورود تاريخ غلط به درون يك فيلد بترتيب زير عمل ميكنيد
' :بشكل زير بكار ببريد ValidationRule را در خاصيت ValidDate() تابع
' ValidDate([نام فيلد])=True
' ...

'*******************************************
Public Function Rooz(F_Date As Long) As Byte
'اين تابع عدد مربوط به روز يك تاريخ را برمگرداند
Rooz = F_Date Mod 100
End Function
'*******************************************
Function Mah(F_Date As Long) As Byte
'اين تابع عدد مربوط به ماه يك تاريخ را برمگرداند
Mah = Int((F_Date Mod 10000) / 100)
End Function
'*******************************************
Public Function Sal(F_Date As Long) As Byte
'اين تابع عدد مربوط به سال يك تاريخ را برمگرداند
Sal = Int(F_Date / 10000)
End Function
'*******************************************
Public Function Kabiseh(ByVal OnlySal As Variant) As Byte
'ورودي تابع عدد دورقمي است
'اين تابع كبيسه بودن سال را برميگرداند
'اگر سال كبيسه باشد عدد يك و درغير اينصورت صفر را بر ميگرداند
Kabiseh = 0
If OnlySal >= 75 Then
If (OnlySal - 75) Mod 4 = 0 Then
Kabiseh = 1
Exit Function
End If
ElseIf OnlySal <= 70 Then
If (70 - OnlySal) Mod 4 = 0 Then
Kabiseh = 1
Exit Function
End If
End If

End Function
'*******************************************
Function ValidDate(F_Date As Long) As Boolean
Dim M, S, R As Byte
' اين تابع اعتبار يك عدد ورودي را از نظر تاريخ هجري شمسي بررسي مي كند
' را برمي گرداند False واگر نامعتبر باشد True اگر تاريخ معتبر باشد
ValidDate = True
S = Sal(F_Date)
M = Mah(F_Date)
R = Rooz(F_Date)
'********
If F_Date < 100101 Then
ValidDate = False
Exit Function
End If

If M > 12 Or M = 0 Or R = 0 Then
ValidDate = False
Exit Function
End If

If R > MahDays(S, M) Then
ValidDate = False
Exit Function
End If
End Function
'*******************************************
Public Function AddDay(ByVal F_Date As Long, ByVal add As Integer) As Long
Dim K, M, S, R, Days As Byte
R = Rooz(F_Date)
M = Mah(F_Date)
S = Sal(F_Date)
K = Kabiseh(S)

'تبديل روز به عدد 1 جهت ادامه محاسبات و يا اتمام محاسبه
Days = MahDays(S, M)
If add > Days - R Then
add = add - (Days - R + 1)
R = 1
If M < 12 Then
M = M + 1
Else
M = 1
S = S + 1
End If
Else
R = R + add
add = 0
End If

While add > 0
K = Kabiseh(S) 'كبيسه: 1 و غير كبيسه: 0
Days = MahDays(S, M) 'تعداد روزهاي ماه فعلي
Select Case add
Case Is < Days
'اگر تعداد روزهاي افزودني كمتر از يك ماه باشد
R = R + add
add = 0
Case Days To IIf(K = 0, 365, 366) - 1
'اگر تعداد روزهاي افزودني بيشتر از يك ماه و كمتر از يك سال باشد
add = add - Days
If M < 12 Then
M = M + 1
Else
S = S + 1
M = 1
End If
Case Else
'اگر تعداد روزهاي افزودني بيشتر از يك سال باشد
S = S + 1
add = add - IIf(K = 0, 365, 366)
End Select
Wend
AddDay = (S * 10000) + (M * 100) + (R)

End Function

'***********************************************
Public Function Shamsi() As Long
'تاريخ جاري سيستم را به تاريخ هجري شمسي تبديل مي كند
Dim Shamsi_Mabna As Long
Dim Miladi_mabna As Date
Dim Dif As Long
'در اينجا 80/10/11 با 2002/01/01 معادل قرارداده شده
Shamsi_Mabna = 791012
Miladi_mabna = #1/1/01#
Dif = DateDiff("d", Miladi_mabna, Date)
If Dif < 0 Then
MsgBox "تاريخ جاري سيستم شما نادرست است , آنرا اصلاح كنيد."
Else
Shamsi = AddDay(Shamsi_Mabna, Dif)
End If
End Function
'***********************************************
Public Function DayWeek(F_Date As Long) As String
Dim a As String
Dim N As Byte
N = DayWeekNo(F_Date)
Select Case N
Case 0
a = "شنبه"
Case 1
a = "يكشنبه"
Case 2
a = "دوشنبه"
Case 3
a = "سه‌شنبه"
Case 4
a = "چهارشنبه"
Case 5
a = "پنج‌شنبه"
Case 6
a = "جمعه"
End Select
DayWeek = a
End Function

'***********************************************
Public Function Dat()
Dim D As Long
D = Shamsi
Dat = DayWeek(D) & " 13" & Sal(D) & "/" & Mah(D) & "/" & Rooz(D)
End Function

'***********************************************
Public Function Diff(ByVal FromDate As Long, ByVal To_Date As Long) As Long
'اين تابع تعداد روزهاي بين دو تاريخ را ارائه مي كند
Dim Tmp As Long
Dim S1, M1, r1, S2, m2, r2 As Integer
Dim Sumation As Single
Dim Flag As Boolean
Flag = False
If FromDate = 0 Or IsNull(FromDate) = True Or To_Date = 0 Or IsNull(To_Date) = True Then
Diff = 0
Exit Function
End If

If FromDate > To_Date Then
'اگر تاريخ شروع از تاريخ پايان بزرگتر باشد آنها موقتا جابجا مي شوند
Flag = True
Tmp = FromDate
FromDate = To_Date
To_Date = Tmp
End If
r1 = Rooz(FromDate)
M1 = Mah(FromDate)
S1 = Sal(FromDate)
r2 = Rooz(To_Date)
m2 = Mah(To_Date)
S2 = Sal(To_Date)
Sumation = 0

Do While S1 < S2 - 1 Or (S1 = S2 - 1 And (M1 < m2 Or (M1 = m2 And r1 <= r2)))
'اگر يك سال يا بيشتر اختلاف بود
If Kabiseh((S1)) = 1 Then
If M1 = 12 And r1 = 30 Then
Sumation = Sumation + 365
r1 = 29
Else
Sumation = Sumation + 366
End If
Else
Sumation = Sumation + 365
End If
S1 = S1 + 1
Loop

Do While S1 < S2 Or M1 < m2 - 1 Or (M1 = m2 - 1 And r1 < r2)
'اگر يك ماه يا بيشتر اختلاف بود
Select Case M1
Case 1 To 6
If M1 = 6 And r1 = 31 Then
Sumation = Sumation + 30
r1 = 30
Else
Sumation = Sumation + 31
End If
M1 = M1 + 1
Case 7 To 11
If M1 = 11 And r1 = 30 And Kabiseh(S1) = 0 Then
Sumation = Sumation + 29
r1 = 29
Else
Sumation = Sumation + 30
End If
M1 = M1 + 1
Case 12
If Kabiseh(S1) = 1 Then
Sumation = Sumation + 30
Else
Sumation = Sumation + 29
End If
S1 = S1 + 1
M1 = 1
End Select
Loop

If M1 = m2 Then
Sumation = Sumation + (r2 - r1)
Else
Select Case M1
Case 1 To 6
Sumation = Sumation + (31 - r1) + r2
Case 7 To 11
Sumation = Sumation + (30 - r1) + r2
Case 12
If Kabiseh(S1) = 1 Then
Sumation = Sumation + (30 - r1) + r2
Else
Sumation = Sumation + (29 - r1) + r2
End If
End Select
End If

If Flag = True Then
Sumation = -Sumation
End If
Diff = Sumation
End Function

Public Function DayWeekNo(F_Date As Long) As String
'اين تابع يك تاريخ را دريافت كرده و مشخص مي كند چه روزي از هفته است
'اگر شنبه باشد عدد 0
'اگر 1شنبه باشد عدد 1
'......
'اگر جمعه باشد عدد 6
Dim day As String
Dim Shmsi_Mabna As Long
Dim Dif As Long
'مبنا 80/10/11
Shmsi_Mabna = 801011
Dif = Diff(Shmsi_Mabna, F_Date)
If Shmsi_Mabna > F_Date Then
Dif = -Dif
End If
'با توجه به اينكه 80/10/11 3شنبه است محاسبه ميشود day متغير
day = (Dif + 3) Mod 7
If day < 0 Then
DayWeekNo = day + 7
Else
DayWeekNo = day
End If
End Function

Function MahName(ByVal Mah_no As Byte) As String
Select Case Mah_no
Case 1
MahName = "فروردين"
Case 2
MahName = "ارديبهشت"
Case 3
MahName = "خرداد"
Case 4
MahName = "تير"
Case 5
MahName = "مرداد"
Case 6
MahName = "شهريور"
Case 7
MahName = "مهر"
Case 8
MahName = "آبان"
Case 9
MahName = "آذر"
Case 10
MahName = "دي"
Case 11
MahName = "بهمن"
Case 12
MahName = "اسفند"
End Select
End Function

Function SalMah(ByVal F_Date As Long) As Integer
'چهار رقم اول تاريخ كه معرف سال و ماه است را برمي گرداند
SalMah = Val(Left$(F_Date, 4))
End Function

Function MahDays(ByVal Sal As Byte, ByVal Mah As Byte) As Byte
'اين تابع تعداد روزهاي يك ماه را برمي گرداند
Select Case Mah
Case 1 To 6
MahDays = 31
Case 7 To 11
MahDays = 30
Case 12
If Kabiseh(Sal) = 1 Then
MahDays = 30
Else
MahDays = 29
End If
End Select

End Function

Function Make_Date(ByVal F_Date As Long) As String
'يك تاريخ را بصورت يك رشته 10 رقمي با ذكر چهار رقم براي سال ارائه مي كند
Dim D As String
D = Trim(Str(F_Date))
If IsNull(F_Date) = True Or F_Date = 0 Then
Make_Date = ""
Else
Make_Date = "13" & Mid(D, 1, 2) & "/" & Mid(D, 3, 2) & "/" & Mid(D, 5, 2)
End If
End Function

Function NextMah(ByVal Sal_Mah As Integer) As Integer
If (Sal_Mah Mod 100) = 12 Then
NextMah = (Int(Sal_Mah / 100) + 1) * 100 + 1
Else
NextMah = Sal_Mah + 1
End If
End Function

Function PreviousMah(ByVal Sal_Mah As Integer) As Integer
If (Sal_Mah Mod 100) = 1 Then
PreviousMah = (Int(Sal_Mah / 100) - 1) * 100 + 12
Else
PreviousMah = Sal_Mah - 1
End If
End Function

Function SubtractDay(ByVal F_Date As Long, ByVal Subtract As Long) As Long
'به تعداد روز معيني از يك تاريخ كم كرده و تاريخ حاصله را ارائه ميكند
Dim K, M, S, R, Days As Byte

R = Rooz(F_Date)
M = Mah(F_Date)
S = Sal(F_Date)
K = Kabiseh(S)

'تبديل روز به عدد 1 جهت ادامه محاسبات و يا اتمام محاسبه
If Subtract >= R - 1 Then
Subtract = Subtract - (R - 1)
R = 1
Else
R = R - Subtract
Subtract = 0
End If

While Subtract > 0
K = Kabiseh(S - 1) 'كبيسه: 1 و غير كبيسه: 0
Days = MahDays(IIf(M >= 2, S, S - 1), IIf(M >= 2, M - 1, 12)) 'تعداد روزهاي ماه قبلي
Select Case Subtract
Case Is < Days
'اگر تعداد روزهاي كاهش كمتر از يك ماه باشد
R = Days - Subtract + 1
Subtract = 0
If M >= 2 Then
M = M - 1
Else
S = S - 1
M = 12
End If
Case Days To IIf(K = 0, 365, 366) - 1
'اگر تعداد روزهاي كاهش بيشتر از يك ماه و كمتر از يك سال باشد
Subtract = Subtract - Days
If M >= 2 Then
M = M - 1
Else
S = S - 1
M = 12
End If
Case Else
'اگر تعداد روزهاي كاهش بيشتر از يك سال باشد
S = S - 1
Subtract = Subtract - IIf(K = 0, 365, 366)
End Select
Wend
SubtractDay = (S * 10000) + (M * 100) + (R)

End Function
لينک مقاله
http://try.persianblog.com :منبع

مقالات مرتبط با اين موضوع
تعريف كلي از اكسسAccess | access
تابع تبديل عدد به حروف | access
بستن دكمه شيفت | access
صدور پيغامهاي فارسي بجاي پيغامهاي Error اكسس | access
ماجول تاريخ هجري شمسي با توابع جانبي آن | access
ایراد The search key was not found in any record | access
Join کردن بيش از ۲ جدول براي Database هاي Access | access

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


صدور پيغامهاي فارسي بجاي پيغامهاي Error اكسس

يكي از دوستان وبلاگي من پرسيده بود چطوري پيغام Error مربوط به ورود ركورد تكراري را در اكسس فارسي كنيم . ترجيح دادم جواب كاملي براي سئوال ايشون بدم تا همه استفاده كنن. بنابراين ابتدا جواب ايشون رو ميدم و بعد از اون بطور كاملتر براي همه وبلاگي هاي عزيز روش كنترل خطا را تشريح مي كنم .

(توجه داشته باشيد كه در زير كدهاي نوشته شده از راست به چپ نمايش داده مي شوند)

جواب دوست ما:
در رويداد OnError مربوط به فرم ورود اطلاعات اين كد را مي نويسيم:

If DataErr = 3022 Then
MsgBox "اطلاعات وارده تكراري است"
Response = acDataErrContinue
End If

جواب كلي :
اساسا ، هر خطا در اكسس يا VB يك كد توليد مي كند . برنامه نويسان بايد يك بانك اطلاعات از كد خطاهايي كه رخ مي دهد داشته باشند تا بتوانند با چك كردن شماره خطا پيغام فارسي مناسب آن خطا را صادر كنند .

بطور كلي دو روش كنترل خطا از اين قرارند:

1- اگر خطا مربوط به كل فرم باشد بايد از طريق رويداد OnError فرم كنترل شود .
معمولا خطاهايي كه مربوط به كدنويسي ما نبوده و صرفا توسط اكسس و در واكنش به اشتباهات كاربر صادر مي شود در اين رويداد كنترل مي شود . در اين رويداد ، پارامتر DataErr حاوي كد خطاست. (بعبارت واضح تر اگر مي خواهيد كد مربوط به هر Error را شناسايي كنيد مي توانيد اين دستور در رويداد OnError فرم بنويسيد: MsgBox DataErr )

بطور كلي بعد از اينكه كد خطاها را شناسايي كرديد با نوشتن قالب برنامه زير در رويداد OnError فرم مي توانيد خطاها را كنترل كنيد :

Dim Str as String

Select Case DataErr
Case 3022
Str="اطلاعات وارده تكراري است"
Case 2237
Str = "اطلاعات وارده در ليست وجود ندارد"
'خط فوق براي مواردي است كه يك مقداري كه در كمبو باكس وجود ندارد ، تايپ شده باشد
Case ...
Str=...
....
End Select

Msgbox Str
Response = acDataErrContinue

2- اگر خطا مربوط به كدهايي باشد كه خودمان در يك Sub نوشته ايم :
در اين روش بايد در ابتداي Sub با دستور : <اسم زير روال كنترل خطا> On Error Goto ، كنترل خطا را به يك روال كنترل خطا ارجاع دهيم.
( تمام كدهايي كه ويزارد Command Button بطور خودكار در رويداد OnClick دكمه ها ايجاد مي كند نمونه خوبي براي اين روش هستند. ضمنا در اين روش بكمك Err.Number كد خطا شناسايي مي شود )
لينک مقاله
http://try.persianblog.com :منبع

مقالات مرتبط با اين موضوع
تعريف كلي از اكسسAccess | access
تابع تبديل عدد به حروف | access
بستن دكمه شيفت | access
صدور پيغامهاي فارسي بجاي پيغامهاي Error اكسس | access
ماجول تاريخ هجري شمسي با توابع جانبي آن | access
ایراد The search key was not found in any record | access
Join کردن بيش از ۲ جدول براي Database هاي Access | access

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


بستن دكمه شيفت

در اين يادداشت روش غيرفعال كردن دكمه Shift به هنگام باز شدن فايلهاي اكسس را توضيح خواهم داد . در ابتدا بايد مقدمه اي را عنوان كنم.

مقدمه
مطلب زير در زمينه افزايش امنيت سيستم ها است. نكته اي كه در زمينه امنيت هر نوع سيستمي بايد به آن توجه داشت اينست كه بطور كلي امنيت يك امر نسبي است .
بعبارت ديگر يك راه حل امنيتي ، قطعا جلوي بسياري از حملات عليه سيستم را خواهد گرفت ولي هيچگاه بطور كامل حملات را خنثي نخواهد كرد و هميشه حفره هاي امنيتي وجود خواهند داشت .
در يادداشت قبل گفتيم كه به هنگام باز شدن فايلهاي اكسس، Startup اجراء مي شود . به كمك گزينه هاي Startup مي توانيم از دسترسي كاربران به محيط طراحي برنامه جلوگيري كنيم . ولي همانطور كه قبلا گفته شد ميكرو سافت با انگيزه ايجاد سيستم امنيتي چند مرحله اي يك روش ضد امنيتي براي آن ايجاد كرده است و كاربران برنامه ما مي توانند با پايين نگه داشتن دكمه Shift از اجراء Startup جلوگيري كنند و وارد محيط طراحي شوند . حال اگر بخواهيم دكمه شيفت را غير فعال كنيم تا كسي نتواند وارد محيط طراحي شود بايد به اين طريق عمل كرد :

استفاده از خاصيت AllowByPassKey
خاصيت AllowByPassKey يكي از خواص شيء Database است كه:
اگر مقدار آن True باشد دكمه شيفت فعال است .
و اگر مقدار آن False باشد دكمه شيفت غير فعال است .

اين خاصيت عملا در ليست خواص يك Database نيست و بايد آنرا فقط براي اولين بار ايجاد (Create) كرد . بعد از ايجاد آن مي توان مقدار آنرا False يا True كرد .

تذكر : حتما يك كپي از فايل خودتان قبل از اجراء اين برنامه برداريد چون ممكن است ديگر نتوانيد وارد محيط برنامه خودتان شويد . من هم با عرض معذرت وقت پاسخگويي به ايميل هاي دوستان را ندارم و دچار مشكل خواهيد شد.

سه دكمه روي يك فرم مطابق شكل بالا ايجاد كنيد و كدهاي زير را در آن بنويسد.
(نمايش كدهاي نوشته شده مناسب نيست ولي اگر آنرا در حافظه كپي كنيد و در ماجول فرمتان كپي كند بدرستي تمايش داده مي شود .)

'براي اولين دفعه :
Private Sub Create_Click()
On Error GoTo Er

Dim db As Database
Dim prp As Property
Set db = CurrentDb
Set prp = db.CreateProperty("allowbypasskey", dbBoolean, False)
db.Properties.Append prp
db.Close

Ex:
Exit Sub
Er:
If Err.Number = 3367 Then
MsgBox "اين خاصيت ايجاد شده و لازم نيست مجددا ايجاد شود"
End If
Resume Ex

End Sub

'جهت غير فعال كردن شيفت
Private Sub ShiftNo_Click()
Dim db As Database
Set db = CurrentDb
db.Properties("allowbypasskey") = False
db.Close
End Sub

'جهت فعال كردن شيفت
Private Sub ShiftOk_Click()
Dim db As Database
Set db = CurrentDb
db.Properties("allowbypasskey") = True
db.Close
End Sub
لينک مقاله
http://try.persianblog.com :منبع

مقالات مرتبط با اين موضوع
تعريف كلي از اكسسAccess | access
تابع تبديل عدد به حروف | access
بستن دكمه شيفت | access
صدور پيغامهاي فارسي بجاي پيغامهاي Error اكسس | access
ماجول تاريخ هجري شمسي با توابع جانبي آن | access
ایراد The search key was not found in any record | access
Join کردن بيش از ۲ جدول براي Database هاي Access | access

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


تابع تبديل عدد به حروف
مقدمه :
 در اين يادداشت تابع مربوط به تبديل عدد به معادل حروفي آن ارائه مي كنم . عمدتا در سيستم هاي مالي و حسابداري نياز است معادل حروفي اعداد هم نمايش داده شده يا چاپ شوند كه توابع زير اين نياز را پاسخ مي دهد. مثلا براي چاپ يك چك روي خود برگه چك ، علاوه بر نياز به چاپ مبلغ عددي چك لازمست تا مبلغ حروفي چك هم روي برگه چاپ شود.

نحوه استفاده از تابع :
تابع Adad كه در زير ارائه شده است يك عدد را بعنوان ورودي گرفته و معادل حروفي آن عدد در زبان فارسي را بعنوان خروجي توليد مي كند. مثلا (Adad(1373 مقدار"يكهزار و سيصد و هفتاد و سه" را بعنوان خروجي توليد مي كند.براي استفاده از اين توابع بايد از چند خط پايين تر (Start of Module) تا انتهاي اين يادداشت را در حافظه كپي (Copy) كرده و در يك ماجول جديد در اكسس يا VB ، Paste كنيد . ( توجه داشته باشيد كه نمايش كدهاي نوشته شده در اينجا راست به چپ است كه پس از كپي كردن آن در ماجول اكسس بشكل صحيح نمايش داده خواهد شد)

' *********** Start of Module ***********

'توابع تبديل عدد به معادل حروفي آن در زبان فارسي
'برنامه نويس : حميد آزادي اردكاني
'ويرايش اول : ارديبهشت 1380
' پست الكترونيك : azadi1355@yahoo.com
' آدرس وب : http://try.persianblog.com

Function Adad(ByVal Number As Double) As String
If Number = 0 Then
Adad = "صفر"
End If
Dim Flag As Boolean
Dim S As String
Dim I, L As Byte
Dim K(1 To 5) As Double

S = Trim(Str(Number))
L = Len(S)
If L > 15 Then
Adad = "بسيار بزرگ"
Exit Function
End If
For I = 1 To 15 - L
S = "0" & S
Next I
For I = 1 To Int((L / 3) + 0.99)
K(5 - I + 1) = Val(Mid(S, 3 * (5 - I) + 1, 3))
Next I
Flag = False
S = ""
For I = 1 To 5
If K(I) <> 0 Then
Select Case I
Case 1
S = S & Three(K(I)) & " تريليون"
Flag = True
Case 2
S = S & IIf(Flag = True, " و ", "") & Three(K(I)) & " ميليارد"
Flag = True
Case 3
S = S & IIf(Flag = True, " و ", "") & Three(K(I)) & " ميليون"
Flag = True
Case 4
S = S & IIf(Flag = True, " و ", "") & Three(K(I)) & " هزار"
Flag = True
Case 5
S = S & IIf(Flag = True, " و ", "") & Three(K(I))
End Select
End If
Next I
Adad = S
End Function

Function Three(ByVal Number As Integer) As String
Dim S As String
Dim I, L As Long
Dim h(1 To 3) As Byte
Dim Flag As Boolean
L = Len(Trim(Str(Number)))
If Number = 0 Then
Three = ""
Exit Function
End If
If Number = 100 Then
Three = "يكصد"
Exit Function
End If

If L = 2 Then h(1) = 0
If L = 1 Then
h(1) = 0
h(2) = 0
End If

For I = 1 To L
h(3 - I + 1) = Mid(Trim(Str(Number)), L - I + 1, 1)
Next I

Select Case h(1)
Case 1
S = "يكصد"
Case 2
S = "دويست"
Case 3
S = "سيصد"
Case 4
S = "چهارصد"
Case 5
S = "پانصد"
Case 6
S = "ششصد"
Case 7
S = "هفتصد"
Case 8
S = "هشتصد"
Case 9
S = "نهصد"
End Select

Select Case h(2)
Case 1
Select Case h(3)
Case 0
S = S & " و " & "ده"
Case 1
S = S & " و " & "يازده"
Case 2
S = S & " و " & "دوازده"
Case 3
S = S & " و " & "سيزده"
Case 4
S = S & " و " & "چهارده"
Case 5
S = S & " و " & "پانزده"
Case 6
S = S & " و " & "شانزده"
Case 7
S = S & " و " & "هفده"
Case 8
S = S & " و " & "هجده"
Case 9
S = S & " و " & "نوزده"
End Select

Case 2
S = S & " و " & "بيست"
Case 3
S = S & " و " & "سي"
Case 4
S = S & " و " & "چهل"
Case 5
S = S & " و " & "پنجاه"
Case 6
S = S & " و " & "شصت"
Case 7
S = S & " و " & "هفتاد"
Case 8
S = S & " و " & "هشتاد"
Case 9
S = S & " و " & "نود"
End Select

If h(2) <> 1 Then
Select Case h(3)
Case 1
S = S & " و " & "يك"
Case 2
S = S & " و " & "دو"
Case 3
S = S & " و " & "سه"
Case 4
S = S & " و " & "چهار"
Case 5
S = S & " و " & "پنج"
Case 6
S = S & " و " & "شش"
Case 7
S = S & " و " & "هفت"
Case 8
S = S & " و " & "هشت"
Case 9
S = S & " و " & "نه"
End Select
End If
S = IIf(L < 3, Right(S, Len(S) - 3), S)
Three = S
End Function
لينک مقاله
http://try.persianblog.com :منبع

مقالات مرتبط با اين موضوع
تعريف كلي از اكسسAccess | access
تابع تبديل عدد به حروف | access
بستن دكمه شيفت | access
صدور پيغامهاي فارسي بجاي پيغامهاي Error اكسس | access
ماجول تاريخ هجري شمسي با توابع جانبي آن | access
ایراد The search key was not found in any record | access
Join کردن بيش از ۲ جدول براي Database هاي Access | access

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


تعريف كلي از اكسسAccess

تعريف كلي از اكسسAccess

اكسس ابزاري براي توليد بانكهاي اطلاعاتي رابطه اي است. بانكهاي اطلاعاتي امكان گردآوري انواع اطلاعات را براي ذخيره ‌سازي ،جستجو و بازيابي فراهم مي‌كند.

اجزا بانك اطلاعاتي اكسس عبارتند از:

DataBase:

1. Table
2. Query
3. Form
4. Report
5. Macros
6. Modules

• ‏‏Table :(جدول ) هر جدول براي نگهداري داده‌هاي خام بانك اطلاعاتي است.داده‌ها را شما در جدول وارد مي‌كنيد.جداول سپس اين داده‌ها را به شكل سطرها و ستونهايي سازماندهي ميكند.

• Query :هر پرس و جو براي استخراج اطلاعات مورد نظر از يك بانك اطلاعاتي مورد استفاده قرار مي‌گيردهر پرس و جو مي‌تواند گروهي از ركوردها را كه شرايط خاص دارا هستند انتخاب كند.پرس و جوها را مي‌توان بر اساس جداول يا پرس و جوهاي ديگر اماده نمود. با استفاده از پزس‌وجوها مي‌توان ركوردهاي بانك اطلاعاتي را انتخاب كرد، تغيير داد و يا حذف نمود.

• Form :متداولترين روش استفاده از فرمها،براي ورود و نمايش داده‌ها است.

• Report :گزارش ها مي‌توانند بر اساس جدول ،پرس‌وجوها باشند ،قابليت گزارش چاپ داده‌ها مي‌باشدگزارشها را مي‌توان بر اساس چند جدول و پرس‌وجو تهيه نمود تا رابطه بين داده‌ها را نشان داد.

• Macro :ماكروها به خودكار كردن كارهاي تكراري ،بدون نوشتن برنامه‌هاي پيچيده يا فراگيري يك زبان برنامه نويسي ، ياري مي‌كند، در واقع ماكروها يكسري قابليت‌هايي هستند كه امكان سريع سازي را فراهم مي‌سازند.

• Modules : محيط بسيار قوي و با كيفيت براي برنامه‌نويسي محاسبات و عمليات پيچيده روي سيستم بانك اطلاعاتي.

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

الف ‌- تعريف دادهData :
هرگونه اطلاعات لازم و كاربردي درباره يك موجوديت را يك داده مي‌گويند.

ب‌- تعريف Fild :
به هر ستون يك جدول كه در بر گيرنده كليه اطلاعات مربوط به آن ستون مي‌باشد و بخشي از يك موجوديت را تشگيل ميدهد فيلد گفته مي‌شود.

ت‌- تعريف Record :
به هر سطر يك جدول كه اطلاعات مربوط به يك موجوديت را نشان مي‌دهد ، ركورد گويند.

ث‌- تعريف پايگاه داده‌اي ارتباطي:
پايگاه داده‌هاي ارتباطي، مجموعه‌اي از جدول‌هاي داده است كه يك فيلد مشترك در هر يك از جدولهاي موجود دارد و از طريق آن مي‌توان داده‌ها را بهم ربط داد.به اين مدل از پايگاه داده‌ها ، پايگاه داده‌هاي ارتباطي RelationShip مي‌گويند.
لينک مقاله
http://www.etvto.ir :منبع

مقالات مرتبط با اين موضوع
تعريف كلي از اكسسAccess | access
تابع تبديل عدد به حروف | access
بستن دكمه شيفت | access
صدور پيغامهاي فارسي بجاي پيغامهاي Error اكسس | access
ماجول تاريخ هجري شمسي با توابع جانبي آن | access
ایراد The search key was not found in any record | access
Join کردن بيش از ۲ جدول براي Database هاي Access | access

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


مقدمه اي بر سي شارپ : قسمت اول
طي سلسله مقالاتي مي خواهيم با C# بيشتر آشنا شويم. فرض اين مقالات بر اين است كه آشنايي مختصري با زبانهاي برنامه نويسي داريد ، هر چند كار ما تقريبا از صفر شروع مي شود و هدف آن سادگي هر چه بيشتر است.

C# از دو زبان C++ و Java متولد شده است! حاوي بسياري از جنبه هاي C++ مي باشد اما ويژگي هاي شيء گرايي خودش را از جاوا به ارث برده است.

C# اگرچه از C++ گرفته شده است اما يك زبان "خالص" شيء گرا (Object oriented) مي باشد. هر دو زبان ياد شده جزو زبانهاي هيبريد محسوب مي شوند اما طراحان C# اين مورد را به اندازه ي C++ مهم تلقي نكرده اند. يك زبان هيبريد اجازه ي برنامه نويسي با شيوه هاي مختلف را ميسر مي كند. دليل اينكه C++ هيبريد است ، اين است كه قرار بوده تا با زبان C سازگار باشد و همين امر سبب گرديده تا بعضي از جنبه هاي C++ بسيار پيچيده شوند.

زبان سي شارپ فرض اش بر اين است كه شما مي خواهيد تنها برنامه نويسي شيء گرا انجام دهيد و همانند C++ مخلوطي از برنامه نويسي رويه ايي (Procedural) و شيء گرا را نمي خواهيد به پايان برسانيد. بنابراين بايد طرز فكر خودتان را با دنياي شيء گرايي تطبيق دهيد. در ادامه خواهيد ديد كه در سي شارپ هر چيزي شيء است حتي يك برنامه ي سي شارپ.

برنامه ي اول :

Visual studio.net را اجرا كنيد و سپس در صفحه ي ظاهر شده New Project را برگزينيد. حالا از گزينه ي Visual C# projects قسمت Console applications را انتخاب نماييد. نامي دلخواه همانند ex01 را وارد نموده و سپس Ok نماييد. كد زير به صورت خودكار براي شما توليد خواهد شد:

using System;

namespace ex01
{
///
/// Summary description for Class1.
///
class Class1
{
///
/// The main entry point for the application.
///
[STAThread]
static void Main(string[] args)
{
//
// TODO: Add code to start application here
//
}
}
}

اگر يك سري از مفاهيم آنرا متوجه نمي شويد اصلا مهم نيست! در مقالات آتي تمام اين موارد مفصل توضيح داده خواهند شد.
متد استاندارد Main در اينجا قسمتي است كه عمليات اصلي برنامه در حالت Console ( شبيه به برنامه هاي تحت داس اما 32 بيتي ) در آن انجام مي شود.
بدون متد Main برنامه هاي سي شارپ قادر به اجرا نخواهند بود. نوع آن در اينجا void تعريف شده است يعني اين متد خروجي ندارد. حتي اگر برنامه هاي استاندارد ويندوز را هم بخواهيد با C# بنويسيد بازهم متد Main حضور خواهد داشت ، هر چند به صورت خودكار ويژوال استوديو آنرا توليد مي كند.

طريقه ي نوشتن توضيحات (Comments) در سي شارپ همانند C++ مي باشد يعني :

/* any comments */

ويا

// any comments

و تنها برنامه نويس براي نوشتن توضيحاتي در مورد كدهاي خود از آنها استفاده مي كند و در خروجي برنامه ظاهر نمي شوند.

فعلا براي پايان قسمت اول از شيء Console و متد WriteLine آن براي نمايش يك جمله ي ساده استفاده مي كنيم. راجع به متدها ، متغيرها و غيره در آينده بيشتر صحبت مي كنيم.
در آخر برنامه ي ما چيزي شبيه به عبارت زير مي باشد:

using System;

namespace ex01
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
Console.WriteLine("Hello C#!");
}
}
}

دكمه ي F5 را فشار دهيد تا برنامه اجرا شود.

تعريف متغيرها در سي شارپ:

سي شارپ عناصري را كه بكار مي گيرد همانند اعداد و كاراكترها ، به صورت نوع ها (Types) طبقه بندي مي كند. اين انواع شامل موارد زير مي شوند :
نوع هاي پايه ايي از پيش تعريف شده مانند اعداد و غيره.
نوع هاي تعريف شده توسط كاربر كه شامل STRUCT ها و ENUM ها مي شوند.

نحوه ي تعريف متغيرها از نوع هاي پايه ايي از پيش تعريف شده :
همانطور كه مي دانيد از متغيرها براي نگهداري اطلاعات استفاده مي شود. در سي شارپ ابتدا نوع متغير و سپس نام متغير و در آخر يك سمي كولون بكار برده مي شود. براي مثال :

int a;

كه در اينجا متغير a بعنوان يك متغير حاوي اعداد صحيح تعريف شده است.
نكته ي مهمي كه در اينجا حائز اهميت است ، مقدار دهي اوليه ي متغيرها مي باشد. در غير اينصورت كامپايلر سي شارپ برنامه را بايك خطا متوقف مي كند. دليل اين امر هم اين است كه از استفاده از متغيرهاي بدون مقدار در طول برنامه جلوگيري شود تا ميزان خطاهاي در حين اجرا كاهش يابد.

نوع هاي داده اي پايه ي زير در در سي شارپ به صورت پيش فرض مهيا هستند:

object : نوعي است نامحدود كه مي تواند تمام انواع ديگر را نيز شامل شود. مثال :

object = null;

string : رشته ؛ در اينجا يك رشته توالي كاراكترهاي يونيكد مي باشد. مثال :

string s= "hello";

sbyte : نوع داده ايي صحيح 8 بيتي علامت دار.
byte : نوع داده ايي صحيح 8 بيتي بدون علامت. مثال :

sbyte val = 12;

short : نوع داده ايي صحيح 16 بيتي علامت دار.
ushort : نوع داده ايي صحيح 16 بيتي بدون علامت. مثال :

short val = 12;

int : نوع داده ايي صحيح 32 بيتي علامت دار.
unit : نوع داده ايي صحيح 32 بيتي بدون علامت. مثال :

int val = 12;

long : نوع داده ايي صحيح 64 بيتي علامت دار.
ulong : نوع داده ايي صحيح 64 بيتي بدون علامت. مثال :

Long val1 = 12; long val2 = 34L;

كلا در اينجا u به معناي unsigned است.

float : نوع اعشاري با single precision .
double : نوع اعشاري با double precision . مثال :

float val = 1.23f;

bool : نوع داده ايي Boolean كه مي تواند true و يا false باشد. مثال :

Bool val = true;

char : كاراكتر، دراينجا char يك كاراكتر يونيكد است.

char val = 'h';

به نحوه ي تعريف كاراكتر ها و همچنين رشته ها در سي شارپ دقت كنيد.

decimal : نوع داده ايي دسيمال با 28 رقم معني دار.

decimal val = 1.23M;

يك نكته :

- بهتر است هنگام تعريف يك متغير ، نامي با مسما براي آن انتخاب شود تا در هنگام كار خواندن كد ساده تر گردد. همچنين رسم شده است كه نوع متغير را به صورت خلاصه به نام متغير اضافه مي كنند. براي مثال بجاي FirstName بهتر است بنويسيم strFirstName . به اين نوع نگارش Hungarian notation مي گويند.
- تمام نوع هاي پيش فرض تعريف شده در سي شارپ شيء هستند. در آينده بيشتر در اين مورد صحبت خواهيم كرد.

مثال اين قسمت :

يك برنامه ي console جديد در را VS.NET باز كنيد. نام آنرا در ابتدا ex02 انتخاب نماييد. در اينجا مي خواهيم دو متغير رشته ايي و صحيح را تعريف و سپس در خروجي نمايش دهيم.

كد نهايي به صورت زير مي باشد:

using System;

namespace ex02
{
///
/// Summary description for Class1.
///
class Class1
{
///
/// The main entry point for the application.
///
[STAThread]
static void Main(string[] args)
{
int intVar1 = 0;

int intVar2;
intVar2=1;

int intV3=15 , intV4 = 12;

string strText1 = "abcd";

Console.WriteLine(
"The value for variables are : \n intVar1="+intVar1 +
"\n intVar2="+ intVar2 +
"\n intV3=" + intV3 +
"\n intV4=" + intV4 +
"\n strText1=" + strText1);

Console.WriteLine("\n\n Press any key to terminate");
Console.ReadLine(); // pause screen!

}
}
}

نكاتي در مورد كد فوق:

- بك اسلش ان ، در زبانهاي مشتق شده از سي به معناي new line مي باشد.
- در كد فوق نحوه ي تعريف چند متغير در يك خط و حالتهاي مقدار دهي مختلف را ملاحظه مي كنيد.
- از متد ReadLine براي نگه داشتن خروجي و مشاهده ي آن در اينجا استفاده كرديم.
- عادت كنيد به صورت دندانه دار كد بنويسيد. اينكار خوانايي كد را صد برابر مي كند. در اينجا كدهاي داخل متد main ، كاملا چند دندانه از آكولادهاي باز و بسته كردن آن جلو تر هستند.
- در كد بالا در متد WriteLine اعداد و رشته ها با هم جمع شده اند! اين مورد بدليل وجود overload هاي زياد اين تابع و ... ميسر گشته است. اصلا به آن دل نبنديد! چون در آينده كامپايلر سي شارپ اگر چنين اعمالي را در جاهاي ديگري مرتكب شويد به شدت با شما برخورد خواهد كرد!! براي جمع كردن اعداد با رشته ها حتما بايد عدد به رشته تبديل گردد و بعد ... . در اين مورد در مقالات بعدي بحث خواهد گرديد.
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
مقدمه اي بر سي شارپ : قسمت بيستم | c-sharp
مقدمه اي بر سي شارپ : قسمت نوزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هجدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت شانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت پانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهاردهم | c-sharp
مقدمه اي بر سي شارپ : قسمت سيزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت يازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دهم | c-sharp
مقدمه اي بر سي شارپ : قسمت نهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هشتم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفتم | c-sharp
مقدمه اي بر سي شارپ : قسمت ششم | c-sharp
مقدمه اي بر سي شارپ : قسمت پنجم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهارم | c-sharp
مقدمه اي بر سي شارپ : قسمت سوم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوم | c-sharp
مقدمه اي بر سي شارپ : قسمت اول | c-sharp
آشنائی با زبان #C | c-sharp

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


مقدمه اي بر سي شارپ : قسمت دوم
مقدمه :

در اين قسمت مي خواهيم با يك سري از اصول اوليه ي شيء گرايي در سي شارپ كمي آشنا شويم. لازم به ذكر است ، بسياري از مواردي كه در اين قسمت مطرح مي شوند فقط براي آشنايي شما است و در آينده بيشتر بحث و مرور خواهند شد.

آشنايي با فضاهاي نام (NameSpaces) :

فضاهاي نام روشي براي مديريت كد نويسي هستند. براي مثال آنها ايجاد شده اند تا تداخلي بين نام هاي توابع در برنامه شما رخ ندهد. اين مساله در پروژه هاي بزرگ خود را نشان مي دهد و ممكن است دو آيتم در يك پروژه نام هاي يكساني را پيدا كنند. بدين وسيله اين شانس تصادم و تداخل كاهش پيدا مي كند. براي ايجاد يك فضاي نام به صورت زير عمل مي شود:

namespace anyName
{
……..

Class anyClassName
{
……….
}

…….

}

يكي از فضاهاي نام پايه اي در دات نت فريم ورك ، فضاي نام System مي باشد. براي استفاده از آن مي توان از كد زير كمك گرفت :

using System;

تمام فضاهاي نام به صورت پيش فرض public مي باشند و در خارج از كد شما قابل دسترسي هستند. روش استفاده از آنها به صورت زير است:

ProjectName.NameSpace.ClassName.MemberName

نكته :
اگر دقت كرده باشيد هنگامي كه كرسر ماوس را روي هر آيتمي در منوي autocomplete نگه مي داريد و يا آنرا انتخاب مي كنيد يك راهنماي كوچك نمايش داده مي شود كه در حقيقت كامنت مربوط به آن تابع مي باشد. روش نوشتن چنين كامنت حرفه اي كه در منوهاي ويژوال استوديو ظاهر شود به صورت زير است كه بهتر است (!) قبل از هر تابع يا خاصيت يا كلاس و .... نوشته شود

///
///
///
///

كلاس ها :

چون سي شارپ تمام سر و كارش با كلاس ها است بنابراين بايد در مورد نحوه ي تعريف و استفاده از آنها تسلط كافي داشته باشيم.

يك پروژه ي جديد console در VS.NET باز كنيد و نام آنرا در ابتدا ex03 وارد نماييد.
بعد از باز شدن پروژه ، از منوي Project گزينه ي Add class را انتخاب كنيد تا كلاسي جديد به نام clsDate.cs را اضافه نماييم. ساختار فايل ايجاد شده توسط VS.NET به صورت زير است :

using System;

namespace ex03
{
///
/// Summary description for clsDate.
///
public class clsDate
{
public clsDate()
{
//
// TODO: Add constructor logic here (chashm!)
//
}
}
}

تابع يا متد clsDate كه در اينجا به صورت پيش فرض ايجاد شده است اصطلاحا سازنده (constructor) نام دارد. اين تابع هر بار كه يك شيء جديد از كلاس مي سازيم به صورت خودكار اجرا مي شود.

از اين كلاس مي خواهيم براي نمايش تاريخ/ ساعت و غيره استفاده كنيم.

براي مثال مي خواهيم تاريخ جاري سيستم را به صورت يك خاصيت از اين كلاس دريافت كنيم. براي اين منظور كد زير را به برنامه اضافه مي نماييم:

public string currentSystemDate
{
get
{
return System.DateTime.Today.ToString() ;
}
}

توضيح كد فوق :

خاصيتي را كه مي خواهيم از برنامه دريافت كنيم با كلمه ي كليدي get معرفي مي نماييم. هر چيزي كه اين قسمت برگرداند خروجي currentSystemDate خواهد بود. اين دستور زبان كه در بالا معرفي شد استاندارد است و در همه جا به يك صورت تعريف و بكار برده مي شود. پس شكل آنرا به خاطر بسپاريد.
از كلمه ي كليدي return براي برگرداندن يك خروجي از خاصيت و يا تابع استفاده مي شود.

براي استفاده از اين خاصيت جديد ، در فايل Class1.cs كه متد main برنامه ي ما در آنجا قرار دارد به صورت زير عمل مي كنيم :

clsDate m_var = new clsDate(); // initialize variable
Console.WriteLine ( m_var.currentSystemDate );
Console.ReadLine();//pause!

توضيح كد فوق :

براي استفاده از يك كلاس بايد يك متغير از آن را تعريف كنيم. در هر زباني يك سري نوع هاي استاندارد مانند int و string و غيره وجود دارند. كلاس هم در حقيقت يك نوع داده ي بسيار بسيار قدرتمند به شمار مي آيد. براي تعريف يك متغير از نوع جديد روش كار مانند سابق است. براي مثال زماني كه يك متغير عدد صحيح را تعريف مي كنيد به صورت زير عمل مي شود :

int i=0;

راي تعريف يك متغير از نوع داده اي كه خودمان تعريف كرده ايم نيز بايد به همين صورت عمل شود.

clsDate m_var = new clsDate();

از كلمه ي كليدي new اينجا به صورت استاندارد براي مقدار دهي اوليه به اين متغير جديد استفاده مي نماييم.

سپس به روش دستيابي به اين خاصيتي كه به كلاس اضافه كرده ايم مي رسيم.

m_var.currentSystemDate

كلا چه يك خاصيت و يا يك متد را به كلاس اضافه نماييم براي دستيابي به آن از عملگر نقطه پس از ذكر نام متغير تعريف شده از نوع كلاس خود ، استفاده مي نماييم. براي استفاده از خاصيت ها نيازي به آوردن () بعد از ذكر نام خاصيت نمي باشد.

عموما از خاصيت ها براي برگرداندن و يا تنظيم يك مقدار ساده استفاده مي شود و در آنها عمليات پيچيده اي مد نظر نمي باشد.

توضيحي در مورد ; () System.DateTime.Today.ToString
استفاده از خواص :

شما به ويژگي هاي يك شيء با استفاده از خواص آن مي توانيد دسترسي پيدا كنيد. يك property عضوي است كه امكان دسترسي به ويژگي شيء يا كلاس را فراهم مي كند. براي مثال طول يك رشته (string) ، سايز يك فونت ، عنوان يك فرم و نام يك مصرف كننده ، خاصيت هستند .
بسياري از اشياء ذاتي دات نت فريم ورك ، خواص مفيد زيادي را به همراه دارند. براي مثال شيء DateTime را در نظر بگيريد. با استفاده از خاصيت Today آن مي توان تاريخ جاري سيستم را بدست آورد. براي استفاده از يك خاصيت لازم است تا كلاس تعريف كننده شيء در برنامه مهيا باشد. منظور همان استفاده از فضاي نام مربوطه مي باشد. پس از وارد كردن فضاي نام كلاس مورد نظر مي توانيد از شيء و خواص آن استفاده كنيد. دو راه وجود دارد يا به صورت كامل تمام موارد بايد ذكر شوند مانند System.DateTime.Now; و يا با وارد كردن فضاي نام System كوتاه سازي صورت مي گيرد.
براي استفاده از هر متد و يا شيء ايي در سي شارپ بايد اين شيء قابل دسترسي باشد. براي مثال شيء Console كه از آن براي چاپ كردن خروجي بر روي صفحه ي نمايش استفاده مي كنيم در فضاي نام System واقع شده است. يا بايد در ابتداي برنامه ذكر كرد using System ; و سپس خيلي راحت از اين شيء استفاده كرد و يا مي توان اينكار را انجام نداد و نوشت : System.Console و الي آخر. با ذكر فضاي نام در ابتدا با استفاده از using مي توان خلاصه نويسي كرد.

نتيجه ي نهايي مثال اين فصل :

محتويات فايل Class1.cs :
using System;

namespace ex03
{
///
/// Summary description for Class1.
///
class Class1
{
///
/// The main entry point for the application.
///
[STAThread]
static void Main(string[] args)
{
clsDate m_var = new clsDate(); // initialize variable
Console.WriteLine ( m_var.currentSystemDate );

Console.ReadLine();//pause!
}
}
}

محتويات فايل clsDate.cs كه به برنامه اضافه كرديم:

using System;

namespace ex03
{
///
/// Summary description for clsDate.
///
public class clsDate
{
public clsDate()
{
//
// TODO: Add constructor logic here
//
}

public string currentSystemDate
{
get
{
return System.DateTime.Today.ToString() ;
}
}

}
}

لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
مقدمه اي بر سي شارپ : قسمت بيستم | c-sharp
مقدمه اي بر سي شارپ : قسمت نوزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هجدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت شانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت پانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهاردهم | c-sharp
مقدمه اي بر سي شارپ : قسمت سيزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت يازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دهم | c-sharp
مقدمه اي بر سي شارپ : قسمت نهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هشتم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفتم | c-sharp
مقدمه اي بر سي شارپ : قسمت ششم | c-sharp
مقدمه اي بر سي شارپ : قسمت پنجم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهارم | c-sharp
مقدمه اي بر سي شارپ : قسمت سوم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوم | c-sharp
مقدمه اي بر سي شارپ : قسمت اول | c-sharp
آشنائی با زبان #C | c-sharp

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


مقدمه اي بر سي شارپ : قسمت سوم
ساختارهاي تصميم گيري :

در بسياري از موارد هنگام برنامه نويسي لازم است تا از عبارات شرطي استفاده كنيم. براي انجام اينكار دو روش عمده وجود دارد. استفاده از if و يا switch . از if بيشتر براي مقايسه هايي تكي و كوچك استفاده مي شود و حاصل مقايسه ي آن يا true است و يا false . از عبارت switch هنگامي استفاده مي شود كه مقايسه هاي متعددي بايد در مورد يك مقدار صورت گيرد.
هر دو عبارت if و switch توسط عبارتهايي Boolean كنترل مي شوند ( true و يا false ) . در هنگام استفاده از if اگر عبارت Boolean حاصل اش true باشد اولين قسمت شرط اجرا مي شود و سپس برنامه از انتهاي if ادامه پيدا مي كند. اگر حاصل عبارت Boolean مساوي false باشد كنترل برنامه به قسمت else منتقل مي شود.

مثال :

يك پروژه ي جديد console باز كنيد و نام آنرا ex04 بگذاريد. سپس كد زير را در آن وارد و جرا كنيد :

using System;

namespace ex04
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
Console.WriteLine("Enter 1 character to be evaluated");

char cUserInput = (char) Console.Read();

if ( char.IsDigit( cUserInput ) )
Console.WriteLine("The char is a number!");
else
Console.WriteLine("The char is not a number!");

}
}
}

نكاتي در مورد كد فوق :

1- سي شارپ به كوچكي و بزرگي حروف حساس است . براي مثال cUserInput با cUserinput فرق مي كند.
2- حتما بايد بعد از if پرانتزها ذكر گردد.
3- حتما بايد داخل if يك عبارت Boolean ذكر شود مانند if(x>5) .
4- در سي شارپ مقايسه ي تساوي دو عبارت با == و انتساب با = انجام مي شود. ( موارد 1 و 4 مواردي هستند كه اغلب تازه كاران با آن مشكل دارند! ) براي مثال if(i==3) صحيح است اما if(i=3) در سي شارپ معنايي ندارد.
5- اگر بعد از if يك خط كد قرار گيرد نيازي به آوردن آكولاد ها نيست. هنگامي نياز به آكولادها مي باشد كه بيش از يك خط بايد بعد از if قرار گيرد.
6- در سي شارپ همانند اسلاف خودش براي تبديل نوع هاي داده ايي مي توان به صورت زير نيز عمل كرد : (char) Console.Read() ; يعني دريافتي Read به char تبديل مي شود .در اين مورد باز هم صحبت خواهد شد.
7- همانطور كه ذكر شد در سي شارپ همه چيز شيء است حتي نوع هاي پايه ايي مانند char . با استفاده از متد IsDigit آن مي توان چك كرد كه آيا ورودي آن عدد است يا خير؟ ( در مورد متدها صحبت خواهد شد )

استفاده از switch :

بهتر است اين مورد را با يك مثال دنبال كنيم.
پروژه ي سي شارپ جديدي به نام ex05 در حالت console در VS.NET باز كنيد. دراينجا مي خواهيم يك كلاس جديد تعريف كرده و توسط خاصيتي كه در آن ايجاد مي كنيم متوجه شويم روز جاري مطابق سيستم چه روزي است .
يك كلاس جديد از منوي پروژه ،‌با استفاده از گزينه ي Add class به برنامه اضافه كنيد و نام آنرا در ابتدا clsDate بگذاريد.

using System;

namespace ex05
{
///
/// Summary description for clsDate.
///
public class clsDate
{
public clsDate()
{
//
// TODO: Add constructor logic here
//
}

public string systemDayOfWeek
{
get
{

string res="";
switch( System.DateTime.Now.DayOfWeek.ToString())
{
case "Saturday" :
res = "شنبه";
break;

case "Sunday" :
res = "يک شنبه" ;
break;

case "Monday":
res = "دوشنبه";
break;

case "Tuesday":
res = "سه شنبه";
break;

case "Wednesday":
res = "چهار شنبه";
break;

case "Thursday":
res = "پنج شنبه";
break;

case "Friday":
res = "جمعه" ;
break;
}

return res ;
}

}

}
}

هنگام ذخيره كردن اين كد ويژوال استوديو به شما اخطار مي دهد كه كد داراي حروف يونيكد است. از منوي فايل گزينه ي advanced save options را انتخاب كنيد. در اينجا مي توان نوع ذخيره سازي را يونيكد انتخاب كرد.

براي استفاده از كلاس فوق مانند مطالبي كه در قسمت قبل گفته شد عمل مي كنيم :

using System;

namespace ex05
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
clsDate m_var = new clsDate();
Console.WriteLine( m_var.systemDayOfWeek );
Console.ReadLine();

}
}
}

هر چند حالت console يونيكد را پشتيباني نمي كند ولي اصل برنامه براي ما مهم است و در آينده بيشتر از آن استفاده خواهيم كرد.

همانطور كه ملاحظه كرديد اگر از switch استفاده نمي شد بايد از 7 عدد if ‌استفاده مي گرديد كه اصلا ظاهر حرفه اي و شكيلي نداشت!
با استفاده از عبارت زير كار مقايسه شروع مي شود. روز سيستم در يافت شده و وارد بدنه ي switch مي گردد. سپس توسط case ها چك مي شود تا تساوي آن با عبارت بعد از case به اثبات برسد.

switch( System.DateTime.Now.DayOfWeek.ToString())

اگر هر كدام از عبارات بعد از case صحيح بودند كار پس از آن كه در اينجا انتساب است انجام شده و سپس توسط break كنترل برنامه از switch خارج مي شود و ادامه ي كار دنبال مي گردد.
اگر هيچكدام از case ها صحيح نبودند مي توان از گزينه ي default هم در صورت نياز استفاده كرد. اين حالت در يك چنين مواقعي اجرا مي گردد.
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
مقدمه اي بر سي شارپ : قسمت بيستم | c-sharp
مقدمه اي بر سي شارپ : قسمت نوزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هجدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت شانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت پانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهاردهم | c-sharp
مقدمه اي بر سي شارپ : قسمت سيزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت يازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دهم | c-sharp
مقدمه اي بر سي شارپ : قسمت نهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هشتم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفتم | c-sharp
مقدمه اي بر سي شارپ : قسمت ششم | c-sharp
مقدمه اي بر سي شارپ : قسمت پنجم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهارم | c-sharp
مقدمه اي بر سي شارپ : قسمت سوم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوم | c-sharp
مقدمه اي بر سي شارپ : قسمت اول | c-sharp
آشنائی با زبان #C | c-sharp

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


مقدمه اي بر سي شارپ : قسمت چهارم
آرايه ها در سي شارپ :

هنگامي آرايه ها ايجاد مي شوند كه بخواهيم با مجموعه اي از اطلاعات همجنس كار كنيم. براي نمونه از يك آرايه براي ذخيره تعدادي كاراكتر مي خواهيم استفاده نماييم. آرايه ها هم يك نوع متغير هستند پس بايد تعريف و مقدار دهي اوليه شوند ، نوع و تعداد اعضاي آنها نيز بايد معين گردد.
فرض كنيد 10 داده ي هم جنس داريم ( براي مثال رشته (string) ) و مي خواهيم آنها را ذخيره كنيم. يا مي توان 10 متغير مختلف را تعريف كرد و سپس تك تك آنها را مقدار دهي نمود و يا يك آرايه تعريف نمود و سپس در خانه هاي مختلف آن اين ده عضو را چيد. اين مطلب زماني حائز اهميت مي شود كه داده هاي همجنس و به نوعي مرتبط ما تعداد زيادي داشته باشند.

براي تعريف آرايه چندين راه مختلف وجود دارد :
براي تعريف آرايه ابتدا نوع آنرا مشخص مي كنيد سپس [] را بايد جلوي تعريف نوع بگذاريد اين دستور زبان است و چون چرا ندارد! در زبان سي كمي متفاوت بود. اين كروشه ها بعد از نام متغير مي آمدند. و سپس در اينجا نام يك متغير را كه بعدا به آن ارجا مي دهيم خواهيد گذاشت. براي مثال

int[] table; // not int table[];

حد پايين آرايه صفر بوده براي مثال اگر آرايه chrData[] ده عضو داشته باشد، اولين عضو آن chrData[0] و آخرين عضو آن chrData[9] است.
مطلب ديگري كه در مورد آرايه ها خيلي مهم است اندازه ي آن است. يعني يك آرايه حاوي چند خانه ي خالي است كه ما اجازه داريم آنرا پر كنيم. مثال :

int[] numbers; // declare numbers as an int array of any size
numbers = new int[10]; // numbers is a 10-element array
numbers = new int[20]; // now it's a 20-element array

1- تعريف آرايه اي از رشته ها و مقدار دهي اوليه آن.

String[] strData = new string[2];

2- تعريف و مقدار دهي اوليه

string [] strData = { "1234","abcd" };

كه آرايه اي از نوع رشته اي به طول 2 عضو با مقدار دهي اوليه ايجاد شده است. در اين حالت نيازي به تعيين طول آن نمي باشد.

3- روشي ديگر براي مقدار دهي اوليه

strData[0] = "1234";
strData[1] = "abcd";

مثال : يك پروژه ي جديد Console سي شارپ را باز كنيد و نام آنرا در ابتدا ex06 بگذاريد. در اين مثال مي خواهيم نحوه ي كار با آرايه ها را مرور كنيم :

using System;

namespace ex06
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
string[] sGoalList = new string[3];
string sReplyStatement = "You have choosen Goal '";

// Store goals in the array
sGoalList[0] = "Hike the Appalachian Trail";
sGoalList[1] = "Run the marathon";
sGoalList[2] = "Give $1 million to worthwhile causes";

// Store response to goals in the array
//(declaring and initializing on same line)
string[] sGoalResponse = {
"If you are staring from GA, you should get "
+ "started in early spring, so you will "+
"not get caught in snow.",
"Make sure that you have a good pair of shoes.",
"Start saving as soon as possible."};

// Give the user a list of goals to choose from
Console.WriteLine("GOAL LIST");

for(int i = 0; i < sGoalList.Length; i++)
{
Console.WriteLine("Goal " + i +
" - " + sGoalList[i]);
}

// Request the user to choose a goal.
Console.WriteLine (""); // Write an empty line for space
Console.Write("Please choose the number of the "
+ "goal that you want to achieve [0,1,2]: ");

Console.ReadLine();

}
}
}

نكاتي در مورد كد فوق :
1- نحوه ي استفاده از عملگر + را براي اتصال رشته هاي بلند در كد فوق مي توان ديد.
2- در سي شارپ پايان خط سمي كولون مي باشد. بنابراين نگراني در مورد چند خطي شدن يك دستور وجود ندارد.
3- هنگامي كه آرايه اي را با مقادير درون آكولادها ، مقدار دهي اوليه مي كنيد لزومي ندارد طول آن آرايه را مشخص كنيد ؛ مانند آرايه sGoalResponse در بالا. در غير اينصورت حتما بايد طول يك آرايه را كه معرف تعداد خانه هاي خالي آن است ، معرفي كنيد مانند آرايه sGoalList .
4- فعلا حلقه ي for را در اين مثال بخاطر داشته باشيد تا در مقاله ي بعدي راجع به آن صحبت كنيم
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
مقدمه اي بر سي شارپ : قسمت بيستم | c-sharp
مقدمه اي بر سي شارپ : قسمت نوزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هجدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت شانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت پانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهاردهم | c-sharp
مقدمه اي بر سي شارپ : قسمت سيزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت يازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دهم | c-sharp
مقدمه اي بر سي شارپ : قسمت نهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هشتم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفتم | c-sharp
مقدمه اي بر سي شارپ : قسمت ششم | c-sharp
مقدمه اي بر سي شارپ : قسمت پنجم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهارم | c-sharp
مقدمه اي بر سي شارپ : قسمت سوم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوم | c-sharp
مقدمه اي بر سي شارپ : قسمت اول | c-sharp
آشنائی با زبان #C | c-sharp

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


مقدمه اي بر سي شارپ : قسمت پنجم
حلقه ها در سي شارپ :

مقدمه :

اگر نياز باشد تا قطعه اي از كد بيش از يكبار اجرا شود نياز به استفاده از حلقه ها مي باشد. براي مثال فرض كنيد آرايه اي به طول 1000 تعريف كرده ايد. اكنون مي خواهيد آنرا با هزار عدد متوالي پركنيد. بديهي است كه روش زير كارآمد نيست! :

int[] intData = new int[1000];
intData[0]=0;
.
.
.
intData[999]=1000;

نوشتن اين خطوط متوالي احتمالا با كپي و پيست و اصلاح آن حداقل نيم ساعت طول مي كشد! بنابراين نياز به وسيله اي حس مي شود كه بتوان بوسيله ي آن امثال اينگونه كارها را انجام داد.

تعريف حلقه ها و استفاده از آنها :

براي تعريف حلقه ها ابزارهاي متعددي مانند while, do , for , foreach وجود دارند. استفاده و انتخاب آنها بستگي به سليقه ي شما و منطق برنامه دارد. در هر حال يك مساله بديهي است كه همواره بيش از يك راه حل براي يك مساله وجود خواهد داشت.

استفاده از حلقه ي for :

عموما كدنويسي را با كد نويسي مي توان آموخت! بنابراين در مورد انواع حلقه ها مثالهايي ارائه خواهد گرديد.

يك برنامه ي سي شارپ جديد console را در VS.NET باز كنيد و نام آنرا درابتدا ex07 انتخاب نماييد. سپس كد زير را درون آن بنويسيد :

using System;

namespace ex07
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
int[] intData = new int[1000];

for (int i=0 ; i<1000 ; i++ )
intData[i]=i;

for(int i=0 ; i< intData.Length ; i++)
{
int j = intData[i];
Console.WriteLine("intData[" + i + "]=" + j);
}

Console.ReadLine();

}
}
}

توضيحاتي در مورد كد فوق :
1- براي تعريف حلقه ي for همانطور كه مي بينيد بايد تعداد بار اجراي حلقه ( اينجا از 0 تا 999 است ) و همچنين نحوه ي رسيدن از 0 به 1000 را مشخص كرد ( در اينجا i++ است يعني هر بار يك واحد به شمارشگر حلقه اضافه مي شود. )
2- در زبان سي i++ يعني i=i+1 و i-- يعني i=i-1 و كلا i-=n يعني i=i-n و به همين ترتيب. براي مثال i*=n يعني i=i*n و i+=n يعني i=i+n و ...
3- اگر پس از حلقه ي for يك خط كد داشته باشيم نيازي به آكولاد نيست (مانند قسمت اول كد). ولي اگر تعداد خطوط مربوط به بدنه ي for زياد بود بايد حتما از آكولاد استفاده شود (مانند قسمت دوم كد). (اين قاعده اي كلي است در زبانهاي مشتق شده از زبان سي در مورد هر چيزي!)
4- فرض كنيد در قسمت اول كد بالا بجاي 1000 مي نوشتيد 1001 . سريعا با يك خطاي زمان اجرا مواجه مي شديد. زيرا مي خواستيد به عضوي از آرايه دسترسي پيدا كنيد كه تعريف نشده است. راه مدرن چك كردن اين مسائل استفاده از خاصيت Length آرايه است كه در قسمت دوم كد در عمل مشاهده مي نماييد. هميشه از اين روش استفاده كنيد.
5- حلقه ي اول يعني اينكه كار پر كردن آرايه intData را از صفر تا 999 يكي يكي (i++) انجام بده.

استفاده از حلقه ي while :
يك برنامه ي سي شارپ جديد console را در VS.NET باز كنيد و نام آنرا درابتدا ex08 انتخاب نماييد. سپس كد زير را درون آن بنويسيد :

using System;

namespace ex08
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
int n = 1;

while (n < 6)
{
Console.WriteLine("Current value of n is {0}", n);
n++;
}

Console.ReadLine();
}
}
}

توضيحاتي در مورد كد فوق :
1- حلقه ي while در بالا كار انجام حلقه را تا هنگامي انجام مي دهد كه شرط ذكر شده در ابتداي آن صادق و برقرار باشد. يعني در حلقه ي فوق تا وقتي n<6 است اين حلقه ادامه خواهد يافت.
2- حلقه ي while صفر يا بيشتر بار ممكن است اجرا شود.
3- در كد فوق از {0} استفاده گرديده است. متد WriteLine به شما اين اجازه را مي دهد كه n تا آرگومان براي آن تعريف كنيد و مقادير هر كدام را كه خواستيد در كد نمايش دهيد از {x} استفاده كنيد. در اين مورد مقدار آرگومان x ام نمايش داده مي شود.

استفاده از حلقه ي do :

يك برنامه ي سي شارپ جديد console را در VS.NET باز كنيد و نام آنرا درابتدا ex09 انتخاب نماييد. سپس كد زير را درون آن بنويسيد :

using System;

namespace ex09
{

class Class1
{
[STAThread]
static void Main(string[] args)
{
int x;
int y = 0;

do
{
x = y++;
Console.WriteLine(x);

}while(y < 5);

Console.ReadLine();

}
}
}

توضيحاتي در مورد كد فوق :
1- اين حلقه به حلقه ي do…while معروف است و هر دو جزء آن بايد ذكر گردد.
2- اين حلقه تا زماني كه شرط ذكر شده در قمست while صحيح است ادامه مي يابد.
3- اين حلقه در ابتداي كار بدون توجه به قسمت while حداقل يكبار اجرا مي شود. (مثال زير را اجرا نماييد)

int n = 10;
do
{
Console.WriteLine("Current value of n is {0}", n);
n++;
} while (n < 6);

استفاده از حلقه ي foreach :

يك برنامه ي سي شارپ جديد console را در VS.NET باز كنيد و نام آنرا درابتدا ex10 انتخاب نماييد. سپس كد زير را درون آن بنويسيد :

using System;

namespace ex10
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
int odd = 0, even = 0;
int[] arr = new int [] {0,1,2,5,7,8,11};

foreach (int i in arr)
{
if (i%2 == 0)
even++;
else
odd++;
}

Console.WriteLine(
"Found {0} Odd Numbers, and {1} Even Numbers.",
odd, even) ;

Console.ReadLine();

}
}
}

توضيحاتي در مورد كد فوق :
1- از foreach براي حركت در بين اعضاي يك آرايه (مانند مثال بالا) و يا مجموعه ايي از اشياء استفاده مي شود (روشي شكيل ، مدرن و مطمئن! و تقريبا به ارث رسيده از ويژوال بيسيك!!).
2- در زبانهاي مشتق شده از C ، عملگر % ، باقيمانده را محاسبه مي كند.
3- در كد فوق با استفاده از حلقه ي foreach تك تك اعضاي آرايه در مورد زوج و يا فرد بودند مورد بررسي قرار گرفته اند و تعداد اعضاي زوج و فرد در آخر نمايش داده مي شود
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
مقدمه اي بر سي شارپ : قسمت بيستم | c-sharp
مقدمه اي بر سي شارپ : قسمت نوزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هجدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت شانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت پانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهاردهم | c-sharp
مقدمه اي بر سي شارپ : قسمت سيزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت يازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دهم | c-sharp
مقدمه اي بر سي شارپ : قسمت نهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هشتم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفتم | c-sharp
مقدمه اي بر سي شارپ : قسمت ششم | c-sharp
مقدمه اي بر سي شارپ : قسمت پنجم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهارم | c-sharp
مقدمه اي بر سي شارپ : قسمت سوم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوم | c-sharp
مقدمه اي بر سي شارپ : قسمت اول | c-sharp
آشنائی با زبان #C | c-sharp

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


مقدمه اي بر سي شارپ : قسمت ششم
دو مورد تكميلي در مورد حلقه ها در سي شارپ :

1- هر جايي خواستيد به هر دليلي حلقه را پايان دهيد مي توانيد از دستور break; استفاده كنيد. در اين حالت به صورت آني حلقه خاتمه يافته و كدهاي ادامه ي برنامه پس از حلقه اجرا مي شوند.
2- نحوه ي استفاده از دستور continue : فرض كنيد حلقه ي شما در راند 15 خودش است! حالا در اين راند شما مي خواهيد يك سري از دستورات درون حلقه اجرا نشوند و حلقه به راند بعدي منتقل شده و كارش را ادامه دهد. اينجا است كه از دستور continue استفاده مي شود. بهتر است به يك مثال ساده در اين زمينه توجه كنيم.

مثال : يك برنامه ي سي شارپ جديد console را در VS.NET باز كنيد و نام آنرا درابتدا ex11 انتخاب نماييد. سپس كد زير را درون آن بنويسيد :

using System;

namespace ex11
{
class Class1
{
[STAThread]
static void Main(string[] args)
{

Console.WriteLine(
"for (int i = 1; i <= 100; i++) -> break at i==5" );
for (int i = 1; i <= 100; i++)
{
if (i == 5)
break;
Console.WriteLine(i);
}
Console.ReadLine();

Console.WriteLine(
"for (int i = 1; i <= 10; i++) -> continue if i<9" );
for (int i = 1; i <= 10; i++)
{
if (i < 9)
continue;
Console.WriteLine(i);
}
Console.ReadLine();

}
}
}

موارد تكميلي مربوط به رد و بدل كردن مقادير به/از كلاس ها :

در قسمت بعدي مي خواهيم خاصيتي را تعريف كنيم كه يك مقدار را از كاربر مي گيرد و در برنامه مي توان توسط قسمت هاي ديگر از آن استفاده كرد.

ابتدا يك متغير عمومي بايد در سطح كلاس تعريف كرد تا مقدار دريافت شده توسط set را در خود نگاه داري كند (در مورد scope متغيرها ( متغيرهاي عمومي و محلي و امثال اينها) در هنگام معرفي توابع بيشتر بحث خواهد شد) . سپس از طريق كلمه ي كليدي value مقدار دريافت شده به متغير انتساب مي يابد و چون در سطح كلاس عمومي است در تمام كلاس قابل درسترسي است.

مثال : يك برنامه ي سي شارپ جديد console را در VS.NET باز كنيد و نام آنرا درابتدا ex12 انتخاب نماييد. سپس از منوي پروژه يك كلاس جديد به آن اضافه نماييد (به نام clsDate) و كد زير را درون آن بنويسيد :

using System;

namespace ex12
{
public class clsDate
{
private int Year;

public clsDate()
{
}

public int setYear
{
set
{
Year = value;
}
}

public bool IsLeapYear
{
get
{
return System.DateTime.IsLeapYear(Year);
}
}

}
}

براي استفاده از آن در متد main برنامه به صورت زير عمل مي كنيم:

using System;

namespace ex12
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
clsDate m_var = new clsDate();

m_var.setYear = 1990;

if (m_var.IsLeapYear)
Console.WriteLine("1990 is a leap year.");
else
Console.WriteLine("1990 is not a leap year.");

Console.ReadLine();
}
}
}

توضيحاتي در مورد كد فوق:

1- نحوه ي تعريف متغير از يك كلاس جزو اساسي ترين قسمت هاي كار با يك كلاس محسوب مي شود كه در قسمت هاي پيشين نيز معرفي گرديد.
2- هنگامي كه از if استفاده مي كنيم لزومي ندارد حتما بنويسيم m_var.IsLeapYear==true . همين كه اين خاصيت ذكر مي شود در وهله ي اول true بودن آن چك خواهد شد.
3- نحوه ي مقدار دهي به يك خاصيت را هم در كد فوق ملاحظه مي نماييد. در هنگام استفاده از خاصيت ها نيازي به آوردن پرانتزها () در مقابل نام آنها وجود ندارد.
4- براي مرور ، نحوه ي معرفي خاصيت ها با get نيز بيان گرديد. با استفاده از set و get مي توان به كلاس ها ، مقادير متغيرها را پاس كرد و يا مقداري را دريافت نمود.
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
مقدمه اي بر سي شارپ : قسمت بيستم | c-sharp
مقدمه اي بر سي شارپ : قسمت نوزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هجدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت شانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت پانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهاردهم | c-sharp
مقدمه اي بر سي شارپ : قسمت سيزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت يازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دهم | c-sharp
مقدمه اي بر سي شارپ : قسمت نهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هشتم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفتم | c-sharp
مقدمه اي بر سي شارپ : قسمت ششم | c-sharp
مقدمه اي بر سي شارپ : قسمت پنجم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهارم | c-sharp
مقدمه اي بر سي شارپ : قسمت سوم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوم | c-sharp
مقدمه اي بر سي شارپ : قسمت اول | c-sharp
آشنائی با زبان #C | c-sharp

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


مقدمه اي بر سي شارپ : قسمت هفتم
تعريف متدها در سي شارپ

در اين قسمت به يكي از مهمترين مباحث برنامه نويسي سي شارپ مي رسيم.
متدها در سي شارپ و يا همان توابع در زبان C ، اعضاي يك شيء يا كلاس هستند و مجموعه اي از يك سري از كارها را انجام مي دهند. فرض كنيد در برنامه ي شما ، قسمتي بايد يك عمليات رياضي خاص را انجام دهد و اين قسمت از كد كه شامل چندين خط نيز مي گردد بايد بارها و بارها در برنامه صدا زده شود. براي نظم بخشيدن به برنامه ، آنها را مي توان به صورت توابع بسته بندي كرد و بجاي نوشتن چندين خط تكراري، فقط نام اين بسته ( تابع ) و پارامترهاي آن را فراخواني نمود.

در سي شارپ يك تابع به صورت زير تعريف مي شود :

(نوع و اسامي پارامترها) نام تابع نوع خروجي تابع سطح دسترسي به تابع
}
بدنه ي تابع
{

براي تعريف يك متد يا تابع ابتدا سطح دسترسي به آن مانند public و private سپس نوع خروجي تابع مانند void ( هيچي ) ذكر مي گردد كه داخل اين پرانتزها مي توان ورودي هاي تابع يا بقولي آرگومان هاي ورودي را معرفي كرد. سپس تابع بايد با { شروع و با يك } خاتمه يابد.

براي مثال :

public int myFunc( int x )
{
...….
}

هر تابعي مي تواند صفر تا تعداد بيشماري آرگومان ورودي و صفر تا تعداد بيشماري خروجي داشته باشد. بوسيله يك تابع مي توان پيچيدگي كار را مخفي كرد و صرفا با صدا زدن نام آن ، يك سري از عمليات را انجام داد. گاهي از اوقات لازم مي شود دو يا چند تابع با يك نام داشته باشيم بطوريكه پارامترهاي ورودي يا مقادير خروجي و يا نوع آرگومان هاي ورودي آنها با هم متفاوت باشد به اين كار overloading مي گويند.
بسياري از كلاس هاي دات نت فريم ورك متدها و يا توابع مفيد حاضر و آماده اي را دارند. براي مثال كلاس DateTime ، متدي به نام ToLongDatastring دارد كه تاريخ را به صورت يك رشته طولاني بر مي گرداند.

توابع void :

توابعي كه با نوع void معرفي مي شوند هيچ خروجي ندارند و در زبان ويژوال بيسيك به آْنها sub و در دلفي به آنها procedure مي گويند.

بازگرداندن يك مقدار از يك تابع :

پس از اينكه عمليات يك مجموعه از كدها درون تابع به پايان رسيد با استفاده از كلمه ي return مي توان خروجي تابع را معرفي كرد. لازم به ذكر است ، هرجايي اين كلمه ي return ذكر شود كار تابع خاتمه مي يابد.

بهتر است موارد فوق را با چند مثال مرور كنيم :

مثال : يك برنامه ي سي شارپ جديد console را در VS.NET باز كنيد و نام آنرا درابتدا ex13 انتخاب نماييد. در اينجا مي خواهيم تابعي را تعريف كنيم كه سه برابر جذر يك عدد را بر مي گرداند.

using System;

namespace ex13
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
Console.WriteLine( int3SQL(3) );
Console.ReadLine();
}

public static double int3SQL( double intInput )
{
double i=0;
i = Math.Sqrt( intInput );
return i;
}
}
}

توضيحاتي در مورد كد فوق :

1- از شيء Math در سي شارپ مي توان براي انجام يك سري عمليات رياضي ابتدايي استفاده كرد. در اينجا از متد جذر گرفتن آن استفاده شده است.
2- در تعريف تابع خودمان از كلمه ي كليدي static استفاده شده است. درون تابع Main نمي توان توابع غير استاتيك را فراخواني كرد. فعلا اين نكته را بخاطر را داشته باشيد تا در مقالات بعدي بيشتر راجع به آن صحبت شود.
3- بد نيست تابع تعريف شده را كمي بيشتر آناليز كنيم :

public static double int3SQL( double intInput )
{
double i=0;
i = Math.Sqrt( intInput );
return i;
}

ابتدا سطح دسترسي به تابع ذكر شده است. پابليك ، يعني اين تابع خارج از كلاس يك برنامه نيز قابل دسترسي است. سپس از كلمه ي static استفاده گرديده كه توضيح مختصري را در مورد آن ملاحظه كرديد. در ادامه نوع خروجي تابع كه در اينجا double مي باشد معرفي گرديده است. دقت كنيد كه حتما بايد نوع تعريف شده با مقداري كه يك تابع بر مي گرداند يكسان باشد و گرنه با يك خطا برنامه متوقف مي شود. سپس نام تابع تعريف شده است. داخل پرانتز ها نوع و نام آرگوماني ارائه شده است كه در بدنه ي تابع استفاده مي گردد. اگر به تعداد بيشتري پارامتر و يا آرگومان نياز بود مي توان آنها را با , از هم جدا كرد.
پس از اينكه عمليات تابع خاتمه مي يابد با استفاده از return اين خروجي را معرفي مي نماييم.
براي استفاده از اين تابع به سادگي نام تابع و سپس پرانتزها به همراه يك عدد دلخواه را مي نويسم كه آنرا در متد Main برنامه مي توان مشاهده كرد.

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

يكي از زيبايي هاي برنامه نويسي شيء گرا نظم و ترتيب و بسته بندي كارها مي باشد كه اصطلاحا در اينجا به آن encapsulation مي گويند. يعني ما يك سري از توابع و خواص را درون كپسولي به نام كلاس قرار مي دهيم تا به سادگي بارها و بارها از آن استفاده نماييم.
براي اينكار به سادگي يك توابع را به صورت معمول درون كلاس تعريف مي نماييم و سپس همانند خواص كه در مورد آنها صحبت شد ، از توابع مي توان استفاده كرد با اين تفاوت كه هنگام كار با توابع حتي اگر آنها هيچ آرگومان و يا پارامتر ورودي هم نداشته باشند ذكر پرانتزها الزامي است.

مثالي ديگر در اين زمينه :

مثال : يك برنامه ي سي شارپ جديد console را در VS.NET باز كنيد و نام آنرا درابتدا ex14 انتخاب نماييد. سپس از منوي پروژه يك كلاس جديد را به برنامه اضافه نماييد (نام آنرا clsTools بگذاريد) .

using System;

namespace ex14
{
public class clsTools
{
public clsTools()
{
}

public uint intCalc ( uint a , uint b )
{
uint c = Math.Min (a,b);
double x = Math.Sqrt(c) ;
uint w = Convert.ToUInt32 ( x);
return w;
}
}
}

سپس در متد Main برنامه مي توان به صورت زير از آن استفاده كرد :

using System;

namespace ex14
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
clsTools m_var = new clsTools();
Console.WriteLine( m_var.intCalc(4,9));
Console.ReadLine();
}
}
}

توضيحاتي در مورد كد فوق :
1- تابع intCalc ما دو عدد صحيح مثبت را مي گيرد و سپس جذر كوچكترين دو عدد ورودي را محاسبه مي كند.
2- براي تبديل نوع هاي عددي مختلف به هم مي توان از شيء Convert استفاده كرد.
3- بدون استفاده از شيء Convert يكبار برنامه را اجرا كنيد و دليل خطاي بوجود آمده را بيان نماييد
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
مقدمه اي بر سي شارپ : قسمت بيستم | c-sharp
مقدمه اي بر سي شارپ : قسمت نوزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هجدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت شانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت پانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهاردهم | c-sharp
مقدمه اي بر سي شارپ : قسمت سيزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت يازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دهم | c-sharp
مقدمه اي بر سي شارپ : قسمت نهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هشتم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفتم | c-sharp
مقدمه اي بر سي شارپ : قسمت ششم | c-sharp
مقدمه اي بر سي شارپ : قسمت پنجم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهارم | c-sharp
مقدمه اي بر سي شارپ : قسمت سوم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوم | c-sharp
مقدمه اي بر سي شارپ : قسمت اول | c-sharp
آشنائی با زبان #C | c-sharp

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


مقدمه اي بر سي شارپ : قسمت هشتم
چگونه از يك تابع بيش از يك خروجي دريافت كنيم.

ظاهرا به نظر مي رسد كه توابع فقط مي توانند يك return داشته باشند و بلافاصله پس از فراخواني return كار تابع پايان يافته است. در سي شارپ دو كلمه ي كليدي به نام هاي ref و out اضافه شده اند كه اين امر را ساده تر مي كنند.

استفاده از كلمه ي كليدي out :

از out در تعريف تابع قبل از معرفي نوع آرگومان ورودي استفاده مي كنيم . در اين حالت بجاي اينكه به اين آرگومان ، آرگومان ورودي بگوييم ، مي توان آنرا آرگومان خروجي ناميد. تا يك مثال را در اين زمينه با هم مرور نكنيم اين مورد مفهوم نخواهد بود :

مثال : يك برنامه ي سي شارپ جديد console را در VS.NET باز كنيد و نام آنرا درابتدا ex15 انتخاب نماييد. سپس كد زير را درون آن بنويسيد :

using System;

namespace ex15
{
class Class1
{

public static int TestOut(out char i)
{
i = 'b';
return -1;
}

[STAThread]
static void Main(string[] args)
{
char i; // variable need not be initialized
Console.WriteLine(TestOut(out i));
Console.WriteLine(i);
Console.ReadLine();

}
}
}

توضيحاتي در مورد كد فوق :
1- در تابع TestOut آرگومان i از با كلمه ي كليدي out مشخص شده است. يعني اينكه درون تابع هر گونه تغييري روي i انجام شود ، خارج از تابع قابل دسترسي است.
2- توابعي كه داراي آرگومانهايي تعريف شده با كلمه ي كليدي out هستند نيز مي توانند از return هم استفاده كنند. همانند مثال فوق.

استفاده از كلمه ي كليدي ref :

اين كلمه ي كليدي نيز دقيقا همانند out عمل مي كند و نحوه ي تعريف و استفاده از آن نيز مشابه است با اين تفاوت كه آرگوماني كه به اين نوع توابع فرستاده مي شود بايد مقدار دهي اوليه شده باشد.

مثال : يك برنامه ي سي شارپ جديد console را در VS.NET باز كنيد و نام آنرا درابتدا ex16 انتخاب نماييد. سپس كد زير را درون آن بنويسيد :

using System;

namespace ex16
{
class Class1
{
public static void FillArray(ref int[] arr)
{
// Create the array on demand:
if (arr == null)
arr = new int[10];
// Otherwise fill the array:
arr[0] = 123;
arr[4] = 1024;
}

[STAThread]
static void Main(string[] args)
{
// Initialize the array:
int[] myArray = {1,2,3,4,5};

// Pass the array using ref:
FillArray(ref myArray);

// Display the updated array:
Console.WriteLine("Array elements are:");
for (int i = 0; i < myArray.Length; i++)
Console.WriteLine(myArray[i]);

Console.ReadLine();
}
}
}

توضيحاتي در مورد كد فوق :
1- همانطور كه ملاحظه مي كنيد در اينجا هنگام استفاده از تابع FillArray بايد آرگوماني را كه مي خواهيم به آن پاس كنيم مقدار دهي اوليه كنيم.
2- پس مي توان نتيجه گرفت آرگومانهايي كه با out تعريف مي شوند به صورت خالص خروجي هستند و نيازي به مقدار دهي اوليه هنگام استفاده از آنها وجود ندارد. از ref هنگامي استفاده مي كنيم كه بخواهيم روي متغير موجود و مقدار دهي شده ي خارج از تابع ، درون تابع عملياتي صورت گيرد و سپس همان متغير دستكاري شده ، عودت داده شود.

تعريف تابعي با تعداد آرگومانهاي نامعلوم :

گاهي از اوقات نياز است تا تابعي تعريف كنيم كه تعداد آرگومانهاي آن متغير باشند .براي اين منظور از كلمه ي كليدي params استفاده مي شود.
دونكته در اينجا حائز اهميت است:
1- در هر تابعي تنها مي توان يكبار از params استفاده كرد.
2- پس از بكار بردن params ديگر نمي توان هيچ آرگوماني را تعريف كرد.

يكي از مثالهايي كه در اين زمينه مي توان ارائه داد استفاده از آرايه ها به عنوان آرگومان ورودي است. در اين حالت يا مي توان يك آرايه را به صورت كامل به تابع معرفي كرد و يا تنها نام آنرا به تابع پاس كرد. مثال زير را ملاحظه كنيد :

مثال : يك برنامه ي سي شارپ جديد console را در VS.NET باز كنيد و نام آنرا درابتدا ex17 انتخاب نماييد. سپس كد زير را درون آن بنويسيد :

using System;

namespace ex17
{
class Class1
{
public static void UseParams(params int[] list)
{
for ( int i = 0 ; i < list.Length ; i++ )
Console.WriteLine(list[i]);
Console.WriteLine();
}

[STAThread]
static void Main(string[] args)
{
UseParams(1, 2, 3);

int[] myarray = new int[3] {10,11,12};
UseParams(myarray);

Console.ReadLine();

}
}
}

توضيحاتي در مورد كد فوق :

1- در تابع main به دو صورت از تابع UseParams ما استفاده شده است. يا اينكه خيلي ساده هر تعداد آرگومان را مي توان به تابع فرستاد و يا اينكه در ادامه آرايه ايي رسما تعريف و سپس به تابع فرستاده شود.
2- نحوه ي تعريف و استفاده از آرايه ها به صورت آرگومان ورودي را نيز مي توان در مثال فوق آموخت
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
مقدمه اي بر سي شارپ : قسمت بيستم | c-sharp
مقدمه اي بر سي شارپ : قسمت نوزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هجدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت شانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت پانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهاردهم | c-sharp
مقدمه اي بر سي شارپ : قسمت سيزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت يازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دهم | c-sharp
مقدمه اي بر سي شارپ : قسمت نهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هشتم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفتم | c-sharp
مقدمه اي بر سي شارپ : قسمت ششم | c-sharp
مقدمه اي بر سي شارپ : قسمت پنجم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهارم | c-sharp
مقدمه اي بر سي شارپ : قسمت سوم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوم | c-sharp
مقدمه اي بر سي شارپ : قسمت اول | c-sharp
آشنائی با زبان #C | c-sharp

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


مقدمه اي بر سي شارپ : قسمت نهم
مبحث overloading :

گاهي از اوقات لازم است تا نگارش هاي مختلفي از يك تابع داشته باشيم. براي مثال تعريف سه تابع با يك نام اما با آرگومانهاي مختلف. به اين نوع توابع و يا متدها اصطلاحا Overloaded Methods مي گويند . ( فكر كنم آنرا سربارگذاري توابع ترجمه كرده اند! ) براي مثال :

void myMethod(int p1);
void myMethod(int p1, int p2);
void myMethod(int p1, string s1);

مثال : يك برنامه ي سي شارپ جديد console را در VS.NET باز كنيد و نام آنرا درابتدا ex18 انتخاب نماييد. سپس كد زير را درون آن بنويسيد :

using System;

namespace ex18
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
writeIT();

writeIT(12);

Console.ReadLine();
}

public static void writeIT()
{
Console.WriteLine(" writeIT() Ver." );
}

public static void writeIT(int intI)
{
Console.WriteLine(" writeIT(intI) Ver. = " + intI );
}

}
}

توضيحاتي در مورد كد فوق :

1- نحوه ي تعريف دو تابع با يك نام را ملاحظه مي نماييد. اينكار در زبان سي ممنوع است!
2- كامپايلر به صورت هوشمند بر اساس نوع و تعداد آرگومانهاي ورودي ، ورژن مناسب را انتخاب و اجرا مي كند.

نمونه ي ضعيفي از اين بحث در وي بي 6 به صورت تعريف توابعي با پارامترهاي Optional وجود داشت .

مباحث تكميلي آرايه ها (آرايه هاي چند بعدي):

آرايه هاي معمولي (يك بعدي) را مي توان يك رديف با تعدادي خانه خالي آماده ي پر شدن در نظر گرفت. آرايه ي دوبعدي را مي توان مانند يك جدول تشكليل شده از رديف ها و ستون ها در نظر گرفت و الي آخر...
سي شارپ دو نوع آرايه ي چند بعدي را پشتيباني مي كند : rectangular and jagged
در يك آرايه ي rectangular هر رديف ، طولش با رديف بعدي يكي است. آرايه ي jagged در حقيقت آرايه ايي از آرايه ها است ، بنابراين هر كدام از آنها مي تواند طول مختلفي داشته باشد.

تعريف يك آرايه ي دوبعدي به صورت زير است :

type [,] array-name

مثال : يك برنامه ي سي شارپ جديد console را در VS.NET باز كنيد و نام آنرا درابتدا ex19 انتخاب نماييد. سپس كد زير را درون آن بنويسيد :

using System;

namespace ex19
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
const int rows = 4;
const int columns = 3;
// declare a 4x3 integer array
int[,] rectangularArray = new int[rows, columns];
// populate the array
for (int i = 0;i < rows;i++)
{
for (int j = 0;j {
rectangularArray[i,j] = i+j;
}
}
// report the contents of the array
for (int i = 0;i < rows;i++)
{
for (int j = 0;j {
Console.WriteLine("rectangularArray[{0},{1}] = {2}",
i,j,rectangularArray[i,j]);
}
}

Console.ReadLine();
}
}
}

توضيحاتي در مورد كد فوق :
1- نحوه ي تعريف ، مقدار دهي اوليه و استفاده از آرايه هاي دو بعدي را در مثال فوق ملاحظه مي نماييد.
2- در يك آرايه ي دوبعدي محل قرار گيري رديف ها و ستون ها براي مثال به صورت زير است :

new int[rows, columns]-

استفاده از آرايه هاي چند بعدي :

مثال : يك برنامه ي سي شارپ جديد console را در VS.NET باز كنيد و نام آنرا درابتدا ex20 انتخاب نماييد. سپس كد زير را درون آن بنويسيد :

using System;

namespace ex20
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
const int rows = 4;
const int columns = 3;
// imply a 4x3 array
int[,] rectangularArray =
{
{0,1,2},
{3,4,5},
{6,7,8},
{9,10,11}
};
for (int i = 0;i < rows;i++)
{
for (int j = 0;j {
Console.WriteLine("rectangularArray[{0},{1}] = {2}",
i,j,rectangularArray[i,j]);
}
}
}
}
}

توضيحاتي در مورد كد فوق :
1- در حقيقت مثال فوق تعريف آرايه ايي از آرايه ها بود.
2- چون مقدار دهي اوليه به صورت واضحي انجام شده نيازي به ذكر ابعاد آرايه به صورت صحيح وجود نداشت
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
مقدمه اي بر سي شارپ : قسمت بيستم | c-sharp
مقدمه اي بر سي شارپ : قسمت نوزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هجدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت شانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت پانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهاردهم | c-sharp
مقدمه اي بر سي شارپ : قسمت سيزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت يازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دهم | c-sharp
مقدمه اي بر سي شارپ : قسمت نهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هشتم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفتم | c-sharp
مقدمه اي بر سي شارپ : قسمت ششم | c-sharp
مقدمه اي بر سي شارپ : قسمت پنجم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهارم | c-sharp
مقدمه اي بر سي شارپ : قسمت سوم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوم | c-sharp
مقدمه اي بر سي شارپ : قسمت اول | c-sharp
آشنائی با زبان #C | c-sharp

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


مقدمه اي بر سي شارپ : قسمت دهم
Jagged arrays

Jagged arrays آرايه اي از آرايه ها است و همانطور كه ذكر شد لزومي ندارد كه هر رديف آن با رديف بعدي هم طول باشد . هنگام تعريف اين نوع آرايه شما تعداد رديف ها را مشخص مي نماييد. هر رديف يك آرايه را نگهداري مي كند. در اينجا هر آرايه بايد تعريف شود. روش تعريف Jagged array به صورت زير است
type [] []...

در اينجا تعداد براكت ها بيانگر ابعاد آرايه مي باشد. براي مثال آرايه ي زير دو بعدي است :

int [] [] myJaggedArray;

و براي مثال براي دسترسي به پنجمين عنصر آرايه ي سوم به صورت زير عمل مي شود :

myJaggedArray[2][4]

مثال : يك برنامه ي سي شارپ جديد console را در VS.NET باز كنيد و نام آنرا درابتدا ex21 انتخاب نماييد. سپس كد زير را درون آن بنويسيد :

using System;

namespace ex21
{
class Class1
{
[STAThread]
static void Main(string[] args)
{

const int rows = 4;
// declare the jagged array as 4 rows high
int[][] jaggedArray = new int[rows][];
// the first row has 5 elements
jaggedArray[0] = new int[5];
// a row with 2 elements
jaggedArray[1] = new int[2];
// a row with 3 elements
jaggedArray[2] = new int[3];
// the last row has 5 elements
jaggedArray[3] = new int[5];
// Fill some (but not all) elements of the rows
jaggedArray[0][3] = 15;
jaggedArray[1][1] = 12;
jaggedArray[2][1] = 9;
jaggedArray[2][2] = 99;
jaggedArray[3][0] = 10;
jaggedArray[3][1] = 11;
jaggedArray[3][2] = 12;
jaggedArray[3][3] = 13;
jaggedArray[3][4] = 14;
for (int i = 0;i < 5; i++)
{
Console.WriteLine("jaggedArray[0][{0}] = {1}",
i,jaggedArray[0][i]);
}
for (int i = 0;i < 2; i++)
{
Console.WriteLine("jaggedArray[1][{0}] = {1}",
i,jaggedArray[1][i]);
}
for (int i = 0;i < 3; i++)
{
Console.WriteLine("jaggedArray[2][{0}] = {1}",
i,jaggedArray[2][i]);
}
for (int i = 0;i < 5; i++)
{
Console.WriteLine("jaggedArray[3][{0}] = {1}",
i,jaggedArray[3][i]);
}

Console.ReadLine();

}
}
}

توضيحاتي در مورد كد فوق :

هنگام كار با آرايه هاي rectangular براي درسترسي به اعضا به صورت زير عمل مي شد :

rectangularArrayrectangularArray[i,j]

اما در اينجا بدين صورت است :

jaggedArray[3][i]

استفاده از System.Array :

دات نت فريم ورك كلاسي را معرفي كرده است به نام Array. توسط اين كلاس كار با آرايه ها و اعمال روي آنها براي مثال سورت كردن و غيره به شدت ساده مي شود .

مثال : يك برنامه ي سي شارپ جديد console را در VS.NET باز كنيد و نام آنرا درابتدا ex22 انتخاب نماييد. سپس كد زير را درون آن بنويسيد :

using System;

namespace ex22
{
class Class1
{
public static void PrintMyArray(object[] theArray)
{
foreach (object obj in theArray)
{
Console.WriteLine("Value: {0}", obj);
}
Console.WriteLine("\n");
}

[STAThread]
static void Main(string[] args)
{
String[] myArray = {
"Who", "is", "John", "Galt"
};
PrintMyArray(myArray);
Array.Reverse(myArray);
PrintMyArray(myArray);
String[] myOtherArray = {
"We", "Hold", "These", "Truths",
"To", "Be", "Self", "Evident" };

PrintMyArray(myOtherArray);
Array.Sort(myOtherArray);
PrintMyArray(myOtherArray);

Console.ReadLine() ;

}
}
}

توضيحاتي در مورد كد فوق :
از دو متد Sort و Reverse در اينجا براي سورت كردن و نمايش آرايه به ترتيب معكوس (از انتها به ابتدا) استفاده گرديده است.

تعريف آرايه هاي ديناميك در سي شارپ :

يكي از مشكلاتي كه با آرايه هاي معمول وجود دارد اين است كه قبل از هر كاري بايد طول آْنها را مشخص كرد. گاهي از اوقات ما دقيقا نمي دانيم برنامه چه تعداد عضو را دريافت مي كند تا آرايه اي از پيش تعريف شده با همان تعداد عضو ايجاد كنيم. براي حل اين مشكل از كلاس ArrayList تعريف شده در دات نت فريم ورك مي توان استفاده كرد.

هنگام استفاده از ArrayList نيازي به دانستن تعداد اعضايي كه بايد اضافه شوند نمي باشد و با استفاده از متد Add آن به سادگي مي توان اعضاء را به آن اضافه نمود . تعدادي از خواص و متدهاي اين كلاس به صورت زير هستند :

Adapter , FixedSize , ReadOnly , Repeat , Synchronized , Capacity,Count , IsFixedSize , IsReadOnly , IsSynchronized , Item , SyncRoot , Add , AddRange , BinarySearch , Clear , Clone , Contains , CopyTo , GetEnumerator , GetRange , IndexOf , Insert , InsertRange , LastIndexOf , Remove , RemoveAt , RemoveRange , Reverse , SetRange , Sort , ToArray , TrimToSize

مثال : يك برنامه ي سي شارپ جديد console را در VS.NET باز كنيد و نام آنرا درابتدا ex23 انتخاب نماييد. سپس كد زير را درون آن بنويسيد :

using System;
using System.Collections;

namespace ex23
{
// a simple class to store in the array
public class Employee
{
public Employee(int empID)
{
this.empID = empID;
}
public override string ToString( )
{
return empID.ToString( );
}
public int EmpID
{
get
{
return empID;
}
set
{
empID = value;
}
}
private int empID;
}

class Class1
{
[STAThread]
static void Main(string[] args)
{

ArrayList empArray = new ArrayList( );
ArrayList intArray = new ArrayList( );
// populate the array
for (int i = 0;i<5;i++)
{
empArray.Add(new Employee(i+100));
intArray.Add(i*5);
}
// print all the contents
for (int i = 0;i {
Console.Write("{0} ", intArray[i].ToString( ));
}
Console.WriteLine("\n");
// print all the contents of the button array
for (int i = 0;i {
Console.Write("{0} ", empArray[i].ToString( ));
}
Console.WriteLine("\n");
Console.WriteLine("empArray.Capacity: {0}",
empArray.Capacity);

Console.ReadLine();

}
}
}

توضيحاتي در مورد كد فوق :

1- با كلمه ي كليدي override در قسمت هاي بعدي آشنا خواهيم شد.
2- براي استفاده از ArrayList لازم بود تا فضاي نامي را كه اين كلاس در آن تعريف شده است ، به برنامه اضافه كرد.
3- در مثال فوق نحوه ي تعريف دو كلاس را در يك فضاي نام مشاهده مي نماييد.
4- نحوه ي تعريف و مقدار دهي ArrayList و همچنين استفاده از خواص آن در مثال فوق بررسي شده است
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
مقدمه اي بر سي شارپ : قسمت بيستم | c-sharp
مقدمه اي بر سي شارپ : قسمت نوزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هجدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت شانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت پانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهاردهم | c-sharp
مقدمه اي بر سي شارپ : قسمت سيزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت يازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دهم | c-sharp
مقدمه اي بر سي شارپ : قسمت نهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هشتم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفتم | c-sharp
مقدمه اي بر سي شارپ : قسمت ششم | c-sharp
مقدمه اي بر سي شارپ : قسمت پنجم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهارم | c-sharp
مقدمه اي بر سي شارپ : قسمت سوم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوم | c-sharp
مقدمه اي بر سي شارپ : قسمت اول | c-sharp
آشنائی با زبان #C | c-sharp

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


مقدمه اي بر سي شارپ : قسمت يازدهم
از اين قسمت به بعد مي خواهيم نگاهي دقيق تر به بحث شيء گرايي در سي شارپ بياندازيم؛ همانند فضاهاي نام ، كلاس ها ، ارث بري ، پلي مرفيسم و غيره.

در قسمت هاي قبل آشنايي مختصري با فضاهاي نام پيدا كرديم. در ادامه جزئيات بيشتري را در مورد آن بررسي خواهيم كرد.
فضاهاي نام (namespaces) براي اداره كردن و نظم بخشيدن به كدها ارائه شده اند. همچنين از امكان تشابه اسمي در بين قسمت هاي مختلف برنامه نيز جلوگيري مي كنند. استفاده از آنها عادت پسنديده اي است هنگاميكه قصد داريم از كد نوشته شده بارها و بارها استفاده كنيم.

مثال : يك برنامه ي سي شارپ جديد console را در VS.NET باز كنيد و نام آنرا درابتدا ex24 انتخاب نماييد. سپس كد زير را درون آن بنويسيد :

// Namespace Declaration
using System;

namespace ex24
{
namespace tutorial
{
// Program start class
class NamespaceCSS
{
// Main begins program execution.
public static void Main()
{
// Write to console
Console.WriteLine("This is the new Namespace.");
}
}
}

}

توضيحاتي در مورد كد فوق :
يكي از روش هاي مناسب براي معرفي فضاهاي نام ، ارائه ي آنها به صورت سلسله مراتبي مي باشد. قسمت هاي عمومي تر در بالا و قسمت هاي اختصاصي تر در فصاهاي نام داخلي تر قرار داده مي شوند. اين روش به معرفي فضاهاي نام تو در تو منتهي مي شود (nested namespaces) ، همانند مثال بالا.

كد فوق را به صورت زير با استفاده از عملگر دات (.) مي توان خلاصه نويسي كرد و نتيجه با قبل تفاوتي ندارد:

// Namespace Declaration
using System;

namespace ex24.tutorial
{
// Program start class
class NamespaceCSS
{
// Main begins program execution.
public static void Main()
{
// Write to console
Console.WriteLine("This is the new Namespace.");
}
}
}

طريقه ي فراخواني اعضاي فضاهاي نام :

مثال : يك برنامه ي سي شارپ جديد console را در VS.NET باز كنيد و نام آنرا درابتدا ex25 انتخاب نماييد. سپس كد زير را درون آن بنويسيد :

// Namespace Declaration
using System;

namespace ex25
{
// nested namespace
namespace tutorial
{
class myExample1
{
public static void myPrint1()
{
Console.WriteLine("calling another namespace member1.");
}
}
}

// Program start class
class NamespaceCalling
{
// Main begins program execution.
public static void Main()
{
// Write to console
tutorial.myExample1.myPrint1();
tutorial.myExample2.myPrint2();
}
}
}

// same namespace as nested namespace above
namespace ex25.tutorial
{
class myExample2
{
public static void myPrint2()
{
Console.WriteLine("calling another namespace member2.");
}
}
}

توضيحاتي در مورد كد فوق :
در كد فوق نحوه ي استفاده از اعضاي تعريف شده در فضاهاي نام را مي توان مشاهده كرد. نحوه ي استفاده از آنها همانطور كه در قسمت هاي قبل نيز گفته شد به صورت زير است :

ProjectName.NameSpace.ClassName.MemberName

براي مثال در فصاي نام tutorial كلاس myExample1 قرار دارد و داخل آن متد myPrint1 تعريف شده است. پس نحوه ي دسترسي به متد آن به صورت زير است :

tutorial.myExample1.myPrint1();

كلاس هاي myExample1 و myExample2 هر دو به يك فضاي نام (ex25.tutorial) تعلق دارند ، هر چند جدا از هم نوشته شده اند. حتي آنها را با حفظ سلسله مراتب خودشان مي توان در فايلهاي جداگانه اي نيز نوشت.

استفاده از using :

مثال : يك برنامه ي سي شارپ جديد console را در VS.NET باز كنيد و نام آنرا درابتدا ex26 انتخاب نماييد. سپس كد زير را درون آن بنويسيد :

// Namespace Declaration
using System;
using ex26.tutorial;

// Program start class
class UsingDirective
{
// Main begins program execution.
public static void Main()
{
// Call namespace member
myExample.myPrint();
}
}

// C# Namespace
namespace ex26.tutorial
{
class myExample
{
public static void myPrint()
{
Console.WriteLine("Example of using a using directive.");
}
}
}

توضيحاتي در مورد كد فوق :

همانند مثال بالا ، براي خلاصه نويسي مي توان از كلمه ي using به همراه نام namespace مورد نظر استفاده كرد. براي مثال اگر متد WriteLine را بخواهيم كامل بنويسيم به صورت زير است :

System.Console.WriteLine(...);

اما با قيد كردن و الحاق كردن فضاي نام آن ، ديگر نيازي به ذكر System در ابتداي آن نيست.

نكته :

باز هم مي توان خلاصه نويسي بيشتري را ارائه داد

using csTut = ex26.tutorial.myExample; // alias

در اين صورت تنها كافي است متد كلاس تعريف شده در آنرا به صورت زير فراخواني كنيم :

csTut.myPrint();
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
مقدمه اي بر سي شارپ : قسمت بيستم | c-sharp
مقدمه اي بر سي شارپ : قسمت نوزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هجدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت شانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت پانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهاردهم | c-sharp
مقدمه اي بر سي شارپ : قسمت سيزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت يازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دهم | c-sharp
مقدمه اي بر سي شارپ : قسمت نهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هشتم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفتم | c-sharp
مقدمه اي بر سي شارپ : قسمت ششم | c-sharp
مقدمه اي بر سي شارپ : قسمت پنجم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهارم | c-sharp
مقدمه اي بر سي شارپ : قسمت سوم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوم | c-sharp
مقدمه اي بر سي شارپ : قسمت اول | c-sharp
آشنائی با زبان #C | c-sharp

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


مقدمه اي بر سي شارپ : قسمت دوازدهم
كلاس ها در سي شارپ :

تا بحال در حد كاربرد ، با كلاس ها آشنا شده ايم . اما در اين قسمت مي خواهيم نگاهي دقيق تر به كلاس ها بياندازيم.

هر كدي در سي شارپ قسمتي از يك كلاس مي باشد و تركيب تمام خواص و متدهاي موجود در يك كلاس يك نوع داده ي جديد تعريف شده از طرف ما را پديد مي آورد. هر متغيري كه از كلاس ساخته شود ، شيء ناميده مي شود و يك كپي منحصر به فرد است. براي مثال برنامه ي زير را درنظر بگيريد :

using System;

class Data
{
public int x;
}
class App
{
public static void Main()
{
Data d1 = new Data();
d1.x = 1;
Data d2 = new Data();
d2.x = 2;
Console.WriteLine("d1.x = {0}", d1.x);
Console.WriteLine("d2.x = {0}", d2.x);
}
}

در اينجا كلاس Data تعريف شده است و داراي يك عضو به نام x مي باشد. به اين نوع داده در كلاس فيلد گفته مي شود و هنگاميكه به صورت public معرفي مي شود يعني خارج از كلاس نيز قابل دسترسي است. در كد بالا دو متغير از كلاس تعريف و مقدار دهي اوليه شده اند. خروجي برنامه به صورت زير است :

d1.x = 1
d2.x = 2

دليل اين خروجي آن است كه هر instance (نمونه) از كلاس منحصر بفرد است و در اينجا نمي توان انتظار داشت كه هر دو خروجي يكي شوند.

براي مقدار دهي اوليه متغيرهايي كه به صورت فيلد تعريف مي شوند ، بهتر است مقدار دهي آنها را در سازنده ي كلاس (constructor) انجام دهيم.

class Data
{
public int x;
public Data(){x = 99;}
}

همانطور كه پيشتر نيز ذكر شد ، متدي كه هم نام كلاس است ، سازنده نام مي گيرد. يك كلاس مي تواند بيش از يك سازنده داشته باشد. براي مثال :

class Data
{
public int x;
private Data(){}
public Data(int y){x = y;}
public Data(int y, int z){x = y + z;}
}

از آنجائيكه كه سازنده ي بدون پارامتر ذكر شده در كد فوق private تعريف شده است بنابراين خارج از كلاس ديگر قابل دسترسي نمي باشد . بنابراين كدي خارج از كلاس ، تنها مي تواند از دو سازنده ي ديگر استفاده كند. براي مثال تعريف دو متغير جديد از اين كلاس به صورت زير مي باشد :

Data d1 = new Data(44);
Data d2 = new Data(22, 33);

سي شارپ به شما اجازه مي دهد تا سازنده ها را در يك كلاس توسط كلمه ي كليدي this نيز فراخواني كنيد يعني بجاي ذكر نام متد سازنده از كلمه ي this استفاده شود ( در خود كلاس ) .

اگر مي خواهيد متغيري را بين نمونه (instance) هاي مختلف يك كلاس به اشتراك بگذاريد كلمه ي كليدي static وارد صحنه مي شود. به مثال زير توجه كنيد :

using System;

class Counted
{
public static int count = 0;
public Counted()
{
count++;
}
public int GetInstanceCount()
{
return count;
}
}
class App
{
public static void Main()
{
Counted d1 = new Counted();
Console.WriteLine("current total {0}", d1.GetInstanceCount());
Counted d2 = new Counted();
Console.WriteLine("current total {0}", d2.GetInstanceCount());
Console.WriteLine("total {0}", Counted.count);
}
}

بايد خاطر نشان كرد كه متغيرهاي استاتيك توسط نمونه هاي كلاس قابل دستيابي نيستند و فقط درون كلاس به شكل زير مي توان از آْنها استفاده كرد :

.

در مثال فوق دو نمونه از كلاس Counted تعريف شده است. با هر بار فراخواني كلاس ، خودبخود سازنده اجرا شده و يك عدد به اين شمارشگر استاتيك اضافه مي شود. همانطور كه ذكر شد، براي اينكه بتوان به اين متغير استاتيك در خارج از كد دسترسي پيدا كرد يك متد غير استاتيك تعريف شده است.

در مثال فوق تابع GetInstanceCount تنها يك عدد را بر مي گرداند. در برنامه نويسي شيء گرا مرسوم است كه در اين حالت به جاي توابع از خواص استفاده شود كه به اندازه ي كافي در مورد آنها در قسمت هاي قبل توضيح داده شد. در اين صورت تعريف فوق به صورت زير در مي آيد :

class Counted
{
public static int x = 0;
public Counted()
{
x++;
}
public int InstanceCount // property
{
get{return x;}
}
}

و در اين صورت قسمت بعدي كد به صورت زير اصلاح مي شود (فراخواني خواص ، بدون ذكر پرانتزها بعد از نام آنها صورت مي گيرد):

Counted d1 = new Counted();
Console.WriteLine("current total {0}", d1.InstanceCount);
Counted d2 = new Counted();
Console.WriteLine("current total {0}", d2.InstanceCount);

اگر يك خاصيت هم خواندني و هم نوشتني باشد به صورت زير تعريف مي شود :

private string name;
public string Name
{
get{return name;}
set{name = value;}
}

فيلدهاي پابليك را مي توان خواند و يا تغيير داد. اگر لازم باشد تا كاربر نتواند آنها را تغيير دهد مي توان از كلمه ي كليدي readonly قبل از تعريف آنها استفاده كرد. مثال :

class Data
{
public readonly int x = 42;
}

بحث كلاس ها ادامه دارد...
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
مقدمه اي بر سي شارپ : قسمت بيستم | c-sharp
مقدمه اي بر سي شارپ : قسمت نوزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هجدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت شانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت پانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهاردهم | c-sharp
مقدمه اي بر سي شارپ : قسمت سيزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت يازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دهم | c-sharp
مقدمه اي بر سي شارپ : قسمت نهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هشتم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفتم | c-sharp
مقدمه اي بر سي شارپ : قسمت ششم | c-sharp
مقدمه اي بر سي شارپ : قسمت پنجم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهارم | c-sharp
مقدمه اي بر سي شارپ : قسمت سوم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوم | c-sharp
مقدمه اي بر سي شارپ : قسمت اول | c-sharp
آشنائی با زبان #C | c-sharp

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


مقدمه اي بر سي شارپ : قسمت سيزدهم
با استفاده از ايندكسرها مي توان با يك كلاس همانند آرايه ها رفتار كرد. به مثال زير توجه كنيد :

using System;

///
/// A simple indexer example.
///
class IntIndexer
{
private string[] myData;

public IntIndexer(int size)
{
myData = new string[size];

for (int i=0; i < size; i++)
{
myData[i] = "empty";
}
}

public string this[int pos]
{
get
{
return myData[pos];
}
set
{
myData[pos] = value;
}
}

static void Main(string[] args)
{
int size = 10;

IntIndexer myInd = new IntIndexer(size);

myInd[9] = "Some Value";
myInd[3] = "Another Value";
myInd[5] = "Any Value";

Console.WriteLine("\nIndexer Output\n");

for (int i=0; i < size; i++)
{
Console.WriteLine("myInd[{0}]: {1}", i, myInd[i]);
}
}
}

در مثال فوق نحوه ي تعريف و استفاده از ايندكسرها را مي توان مشاهده كرد. كلاس IntIndexer حاوي آرايه اي به نام myData مي باشد. بدليل private بودن آن در خارج از كلاس قابل دسترسي نيست. اين آرايه در سازنده ي كلاس (متد IntIndexer) با كلمه ي empty مقدار دهي اوليه شده است.
عضو بعدي كلاس Indexer مي باشد و با كلمه ي كليدي this و براكتها مشخص شده ست (this[int pos]). همانطور كه ملاحظه مي فرماييد نحوه ي تعريف ايندكسرها شبيه به تعريف خواص مي باشد.

this [argument list]
{
get
{
// Get codes goes here
}
set
{
// Set codes goes here
}
}

خروجي مثال فوق به صورت زير است :

myInd[0]: empty
myInd[1]: empty
myInd[2]: empty
myInd[3]: Another Value
myInd[4]: empty
myInd[5]: Any Value
myInd[6]: empty
myInd[7]: empty
myInd[8]: empty
myInd[9]: Some Value

استفاده از اعداد صحيح روشي است متداول براي دسترسي به اعضاي آرايه ها در بسياري از زبانها اما ايندكسرها در سي شارپ فراتر از اين مي رود. ايندكسرها را مي توان با پارامترهاي متعددي تعريف كرد و هر پارامتر با نوعي مختلف (دقيقا همانند پارامترهاي ورودي متدها). البته محدوديتي كه اينجا وجود دارد در مورد نوع پارامتر ها است كه تنها مي تواند integers, enums, and strings باشد . بعلاوه قابليت Overloading ايندكسرها نيز وجود دارد. به همين جهت به آنها آرايه هاي هوشمند هم گفته مي شود (smart arrays) .مثال :

using System;

///
/// Implements overloaded indexers.
///
class OvrIndexer
{
private string[] myData;
private int arrSize;

public OvrIndexer(int size)
{
arrSize = size;
myData = new string[size];

for (int i=0; i < size; i++)
{
myData[i] = "empty";
}
}

public string this[int pos]
{
get
{
return myData[pos];
}
set
{
myData[pos] = value;
}
}

public string this[string data]
{
get
{
int count = 0;

for (int i=0; i < arrSize; i++)
{
if (myData[i] == data)
{
count++;
}
}
return count.ToString();
}
set
{
for (int i=0; i < arrSize; i++)
{
if (myData[i] == data)
{
myData[i] = value;
}
}
}
}

static void Main(string[] args)
{
int size = 10;
OvrIndexer myInd = new OvrIndexer(size);

myInd[9] = "Some Value";
myInd[3] = "Another Value";
myInd[5] = "Any Value";

myInd["empty"] = "no value";

Console.WriteLine("\nIndexer Output\n");

for (int i=0; i < size; i++)
{
Console.WriteLine("myInd[{0}]: {1}", i, myInd[i]);
}

Console.WriteLine("\nNumber of \"no value\" entries: {0}", myInd["no value"]);
}
}

در مثال فوق اولين ايندكسر با يك پارامتر از نوع اعداد صحيح تعريف شده است و در ايندكسر دوم از نوع رشته.
خروجي برنامه ي فوق به صورت زير است :

myInd[0]: no value
myInd[1]: no value
myInd[2]: no value
myInd[3]: Another Value
myInd[4]: no value
myInd[5]: Any Value
myInd[6]: no value
myInd[7]: no value
myInd[8]: no value
myInd[9]: Some Value

Number of "no value" entries: 7

نكته :
1- امضاي (ليست پارامترهاي) ايندكسر ها در يك كلاس بايد منحصر بفرد باشد .
2- تعريف يك ايندكسر به صورت استاتيك مجاز نيست.

در صورت نياز به ايندكسرهايي با پارمترهاي ورودي متعدد مي توان به صورت زير عمل كرد :

public object this[int param1, ..., int paramN]
{
get
{
// process and return some class data
}
set
{
// process and assign some class data
}
}

يك مثال ديگر :

using System;

class IndexExample
{
string Message;

public static void Main()
{
IndexExample obj=new IndexExample("Welcome");

/* This will access the String variable Message
using array like notation
*/
for(int i=0;i < obj.Length;i++)
{
Console.WriteLine(obj[i]);
}
obj[obj.Length-1]="e to C#";

Console.WriteLine(obj.Message);

}

public IndexExample(string s)
{
Message=s;
}

public string this[int i]
{
get
{
if(i >= 0 && i < Message.Length)
{
return Message.Substring(i,1);
}
else
{
return "";
}
}
set
{
if(i >= 0 && i < Message.Length)
{
Message=Message.Substring(0,i) + value + Message.Substring(i+1);
}
}
}

public int Length
{
get
{
if(Message!=null)
{
return Message.Length;
}
else
return 0;
}
}
}

لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
مقدمه اي بر سي شارپ : قسمت بيستم | c-sharp
مقدمه اي بر سي شارپ : قسمت نوزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هجدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت شانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت پانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهاردهم | c-sharp
مقدمه اي بر سي شارپ : قسمت سيزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت يازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دهم | c-sharp
مقدمه اي بر سي شارپ : قسمت نهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هشتم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفتم | c-sharp
مقدمه اي بر سي شارپ : قسمت ششم | c-sharp
مقدمه اي بر سي شارپ : قسمت پنجم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهارم | c-sharp
مقدمه اي بر سي شارپ : قسمت سوم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوم | c-sharp
مقدمه اي بر سي شارپ : قسمت اول | c-sharp
آشنائی با زبان #C | c-sharp

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


مقدمه اي بر سي شارپ : قسمت چهاردهم
ارث بري (Inheritance) :

ارث بري يكي از مفاهيم اوليه ي برنامه نويسي شيء گرا مي باشد. با استفاده از آن استفاده مجدد از كد موجود به نحوي مؤثر ميسر مي گردد و صرفه جويي قابل توجهي را در زمان برنامه نويسي پديد مي آورد. به كد زير دقت كنيد :

using System;

public class ParentClass
{
public ParentClass()
{
Console.WriteLine("Parent Constructor.");
}
public void print()
{
Console.WriteLine("I'm a Parent Class.");
}
}

public class ChildClass : ParentClass
{
public ChildClass()
{
Console.WriteLine("Child Constructor.");
}
public static void Main()
{
ChildClass child = new ChildClass();
child.print();
}
}

Output:
Parent Constructor.
Child Constructor.
I'm a Parent Class.

كد فوق از دو كلاس استفاده مي كند. كلاس بالايي ParentClass و كلاس اصلي ChildClass مي باشد. كاري كه انجام شده است استفاده از كدهاي كلاس والد ParentClass در كلاس بچه (!) ChildClass مي باشد. براي اينكه ParentClass را بعنوان كلاس پايه براي ChildClass معرفي كنيم به صورت زير عمل شد :

public class ChildClass : ParentClass

كلاس پايه با استفاده از معرفي كولون ":" ، پس از كلاس مشتق شده تعريف مي شود. در سي شارپ تنها ارث بري يگانه پشتيباني مي شود. بنابراين تنها يك كلاس پايه را براي ارث بري مي توان تعريف كرد.

ChildClass دقيقا توانايي هاي ParentClass را دارا است. بنابراين مي توان گفت ChildClass همان ParentClass است. براي مثال در كد فوق ChildClass داراي متد print نمي باشد اما آنرا از كلاس ParentClass به ارث برده است و در متد Main برنامه از آن استفاده گرديده است.

هنگام ساختن يك شيء از كلاس مشتق شده (derived) ، ابتدا يك نمونه از كلاس والد خود بخود ساخته مي شود. اين مورد در خروجي كد فوق هنگامي كه متدهاي سازنده ها روي صفحه چاپ شده اند قابل مشاهده است.

تبادل اطلاعات بين كلاس والد و كلاس فرزند :

به مثال زير دقت كنيد :

using System;

public class Parent
{
string parentString;

public Parent()
{
Console.WriteLine("Parent Constructor.");
}

public Parent(string myString)
{
parentString = myString;
Console.WriteLine(parentString);
}

public void print()
{
Console.WriteLine("I'm a Parent Class.");
}
}

public class Child : Parent
{
public Child() : base("From Derived")
{
Console.WriteLine("Child Constructor.");
}

public void print()
{
base.print();
Console.WriteLine("I'm a Child Class.");
}

public static void Main()
{
Child child = new Child();
child.print();
((Parent)child).print();
}
}

Output:
From Derived
Child Constructor.
I'm a Parent Class.
I'm a Child Class.
I'm a Parent Class.

كلاس فرزند با كلاس والد در هنگام instantiation مي تواند تبادل اطلاعات كند. همانطور كه در مثال فوق بارز است با استفاده از كلمه ي كليدي base ، كلاس فرزند تابع سازنده ي كلاس والد را فراخواني كرده است. اولين خط خروجي بيانگر اين موضوع است.

گاهي از اوقات ما مي خواهيم تابعي را كه در كلاس والد تعريف شده است را در كلاس فرزند با تعريف ديگري و مخصوص به خودمان ارائه دهيم. در اينصورت تابع تعريف شده در كلاس فرزند ، تابع هم نام والد را مخفي خواهد كرد و ديگر آن تابع والد فراخواني نخواهد گرديد. در اين حالت تنها يك راه براي دسترسي به تابع اصلي والد وجود دارد و آن استفاده از base. مي باشد كه در كد فوق پياده سازي شده است.
با استفاده از base. مي توان به تمام اعضاي public و يا protected كلاس والد از درون كلاس فرزند دسترسي داشت.
راه ديگري كه براي اين منظور وجود دارد در آخرين خط كد فوق در متد Main پياده سازي شده است :

((Parent)child).print();

براي تبديل نوع هاي مختلف در سي شارپ مي توان از پرانتز و سپس ذكر نوع اصلي استفاده كرد به اين عمل casting و يا boxing هم مي گويند. در كد فوق درحقيقت child به نوعي از parent تبديل شده است. بنابراين مانند اين است كه يك نمونه از كلاس والد متد print همان كلاس را فراخواني مي كند.
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
مقدمه اي بر سي شارپ : قسمت بيستم | c-sharp
مقدمه اي بر سي شارپ : قسمت نوزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هجدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت شانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت پانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهاردهم | c-sharp
مقدمه اي بر سي شارپ : قسمت سيزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت يازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دهم | c-sharp
مقدمه اي بر سي شارپ : قسمت نهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هشتم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفتم | c-sharp
مقدمه اي بر سي شارپ : قسمت ششم | c-sharp
مقدمه اي بر سي شارپ : قسمت پنجم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهارم | c-sharp
مقدمه اي بر سي شارپ : قسمت سوم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوم | c-sharp
مقدمه اي بر سي شارپ : قسمت اول | c-sharp
آشنائی با زبان #C | c-sharp

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


مقدمه اي بر سي شارپ : قسمت پانزدهم
پلي مرفيسم (Polymorphism)

يكي ديگر از مفاهيم اوليه ي شيء گرايي پلي مرفيسم ( چند ريختي ) مي باشد. پلي مرفيسم به معناي توانايي استفاده كردن از فرم هاي مختلف يك نوع است بدون توجه به جزئيات آن .
براي مثال هنگاميكه سيگنال تلفني شما فرستاده مي شود ، از نوع تلفني كه در انتهاي خط موجود است خبري ندارد. تلفن انتهاي خط ، مي خواهد يكي از تلفن هاي عهد عتيق باشد و يا تلفني با آخرين امكانات روز .
شركت مخابرات (!) تنها از نوع پايه اي به نام phone خبر دارد و فرض مي كند كه هر instance از اين نوع مي داند كه چگونه صداي زنگ تلفن شما را به صدا در آورد. بنابراين شركت مخابرات از تلفن شما به صورت پلي مرف استفاده مي كند.
در عمل پلي مرفيسم هنگامي مفيد خواهد بود كه بخواهيم گروهي از اشياء را به يك آرايه نسبت دهيم و سپس متدهاي هر يك را فراخواني كنيم. الزاما اين اشياء از يك نوع نخواهند بود.

نحوه ي ايجاد متدهاي پلي مرفيك :
براي ايجاد متدي كه نياز است تا پلي مرفيسم را پشتيباني نمايد ، تنها كافي است آنرا از نوع virtual در كلاس پايه تعريف كنيم. مثال :
فرض كنيد تابع DrawWindow در كلاس Window تعريف شده است. براي ايجاد قابليت پلي مرفيسم در آن به صورت زير عمل مي شود :

public virtual void DrawWindow( )

در اين حالت هر كلاسي كه از Window مشتق شود ، مجاز است نگارش خاص خودش را از DrawWindow ارائه كند. در اين صورت در كلاسي كه از كلاس پايه ي ما ارث مي برد ، تنها كافي است كه كلمه ي كليدي override را قبل از نام تابع مذكور ذكر نماييم.

يك مثال كامل :

using System;

public class DrawingObject
{
public virtual void Draw()
{
Console.WriteLine("I'm just a generic drawing object.");
}
}
public class Line : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Line.");
}
}

public class Circle : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Circle.");
}
}

public class Square : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Square.");
}
}
public class DrawDemo
{
public static int Main(string[] args)
{
DrawingObject[] dObj = new DrawingObject[4];

dObj[0] = new Line();
dObj[1] = new Circle();
dObj[2] = new Square();
dObj[3] = new DrawingObject();

foreach (DrawingObject drawObj in dObj)
{
drawObj.Draw();
}

return 0;
}
}

كلاس DrawingObject ، كلاسي پايه براي تمام كد ما كه از آن به ارث مي برد ، مي باشد. متد Draw در آن با كلمه ي كليدي virtual معرفي شده است. يعني تمام كلاس هاي فرزند اين كلاس والد مي توانند اين متد را override كنند ( تحريف كردن و يا تحت الشعاع قرار دادن هم ترجمه شده است! ).
در ادامه سه كلاس تعريف شده اند كه تمامي آنها از كلاس مبنا ارث مي برند و تابع Draw را تحريف كرده اند (!). با استفاده از كلمه ي كليدي override مي توان تابع مجازي كلاس مبنا را با تعريفي جديد در زمان اجراي برنامه ارائه داد. تحريف شدن تنها زماني رخ مي دهد كه كلاس ، توسط ريفرنس كلاس مبنا مورد ارجاع واقع شده باشد.
و در متد Main برنامه از اين كلاس ها در عمل استفاده گرديده است. در متد Main ، آرايه اي از نوع DrawingObject تعريف و مقدار دهي اوليه شده است تا بتواند 4 شيء از نوع اين كلاس را در خودش ذخيره كند.
بدليل رابطه ي ارث بري موجود مي توان آرايه ي dObj را با نوع هايي از كلاس هاي Line ، Circle و Square مقدار دهي كرد (همانند كدهاي بعدي متد Main ) . اگر ارث بري در اينجا وجود نمي داشت مي بايست به ازاي هر كلاس يك آرايه تعريف مي شد.
سپس از حلقه ي زيباي foreach براي حركت در بين اعضاي اين آرايه استفاده گرديده است. در اينجا هر شيء متد خاص خودش را در مورد Draw فراخواني مي كند و نتيجه را روي صفحه نمايش خواهد داد.
خروجي نهايي به صورت زير خواهد بود :

Output:
I'm a Line.
I'm a Circle.
I'm a Square.
I'm just a generic drawing object.
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
مقدمه اي بر سي شارپ : قسمت بيستم | c-sharp
مقدمه اي بر سي شارپ : قسمت نوزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هجدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت شانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت پانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهاردهم | c-sharp
مقدمه اي بر سي شارپ : قسمت سيزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت يازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دهم | c-sharp
مقدمه اي بر سي شارپ : قسمت نهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هشتم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفتم | c-sharp
مقدمه اي بر سي شارپ : قسمت ششم | c-sharp
مقدمه اي بر سي شارپ : قسمت پنجم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهارم | c-sharp
مقدمه اي بر سي شارپ : قسمت سوم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوم | c-sharp
مقدمه اي بر سي شارپ : قسمت اول | c-sharp
آشنائی با زبان #C | c-sharp

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


مقدمه اي بر سي شارپ : قسمت شانزدهم
كلاس ها ي abstract
كلاس ها را همچنين مي توان به صورت abstract تعريف كرد. از اين نوع كلاس ها نمي توان instance ايي را ايجاد نمود. در اين كلاس هاي پايه ، صرفا تعريف متدها و خواص هايي عنوان گرديده و در آينده در كلاس هاي فرزند توسعه داده خواهند شد. براي مثال :

public abstract class Named
{
public abstract String Name {get; set;} // property
public abstract void PrintName(); // method
}
public class B : Named
{
private String name = "empty";
public override String Name
{
get{return name;}
set{name=value;}
}
public override void PrintName()
{
Console.WriteLine("Name is {0}", name);
}
}

والي كه شايد پيش بيايد اين است كه اگر interface ها صرفا تعريف توابع و خواص را مي توانند در خود جاي دهند پس چه دليلي براي بكار بردن آنها و طولاني كردن كار كد نويسي وجود دارد؟
كاربردهاي زيادي را مي توان براي اينترفيس ها برشمرد. اينترفيس يك رفتار را تعريف مي كند. فرض كنيد در حال توسعه ي برنامه ايي هستيد كه بر روي دو كامپيوتر مختلف بايد با هم در ارتباط مستقيم بوده و برهم كنش داشته باشند و هر برنامه از ماژولي به نام CCommObj communication object استفاده مي نمايد. يكي از متدهاي اين شيء ، SendData() مي باشد كه رشته اي را دريافت كرده و به برنامه ي ديگر مي فرستد. اين فراخواني از نوع asynchronous است زيرا ما نمي خواهيم اگر خطايي در شبكه رخ داد، برنامه براي هميشه منتظر باقي بماند. اما چگونه برنامه ي A كه تابع ذكر شده را فراخواني كرده است مي تواند تشخيص دهد كه پيغام به مقصد رسيده است يا خير و يا آيا خطايي در شبكه مانع رسيدن پيغام گشته است يا خير؟ جواب بدين صورت است كه CCommObj هنگام دريافت پيغام ، رخدادي را سبب خواهد شد و اگر خطايي رخ داده باشد خير. در اين حالت نياز به يك ماژول logging نيز احساس مي گردد تا خطاهاي رخ داده را ثبت نمايد. يك روش انجام آن اين است كه CCommObj پياده سازي اين امكان را نيز بعهده گرفته و اگر فردا نيز خواستيم ماژول ديگري را به برنامه اضافه كنيم هر روز بايد CCommObj را تغيير دهيم. تمام اين كارها را به سادگي مي توان در يك اينترفيس مدل كرد. روش آن نيز در ادامه بيان مي گردد:
در ابتدا يك اينترفيس ايجاد مي كنيم تا ليست تمام امكانات ممكن را "منتشر" كند:

interface ICommObjEvents
{
void OnDataSent();
void OnError();
}

شي ء CCommObj ما از اين توابع كه بعدا توسعه داده خواهند شد براي با خبر سازي كلاينت ها استفاده مي نمايد. تمام متدها در يك اينترفيس ذاتا پابليك هستند بنابراين نيازي به ذكر صريح اين مطلب نمي باشد و اگر اينكار را انجام دهيد كامپايلر خطاي زير را گوشزد خواهد كرد :

The modifier 'public' is not valid for this item

در ادامه كلاينت CClientApp_A را پياده سازي خواهيم كرد :

class CClientApp_A:ICommObjEvents
{
public void OnDataSent()
{
Console.WriteLine("OnDataSent");
}
public void OnError()
{
Console.WriteLine("OnError");
}
private CCommObj m_Server;
public void Init(CCommObj theSource)
{
m_Server = theSource;
theSource.Advise (this);
string strAdd = ("N450:1");
m_Server.read (strAdd,10);
}
}

در كد فوق كلاس CClientApp_A از ICommObjEvents ارث برده و تمام متدهاي اين اينترفيس را پياده سازي نموده است. هنگامي كه CCommObj تابع OnDataSent را فراخواني مي كند اين كلاينت پيغام را دريافت خواهد كرد. لازم به ذكر است كه كلاس كلاينت ما چون از يك اينترفيس ارث بري مي نمايد پس بايد تمام توابع و خواص كلاس پايه را پياده سازي كند در غير اينصورت هر چند برنامه كامپايل خواهد شد اما هنگامي كه شيء CCommObj هر كدام از توابع اين كلاس را فراخواني كد ، خطاي زمان اجرا رخ خواهد داد.
متد Init كلاس فوق آرگوماني را از نوع CCommObj دريافت نموده و در يك متغير private آنرا ذخيره مي نمايد. همچنين در اين متد ، متد Advise از كلاس CCommObj نيز فراخواني گشته است.

public class CCommObj
{
private int m_nIndex;
public ICommObjEvents [] m_arSinkColl;
public CCommObj()
{
m_arSinkColl = new ICommObjEvents[10];
m_nIndex = 0;
}
public int Advise(ICommObjEvents theSink)
{
m_arSinkColl[m_nIndex] = theSink;
int lCookie = m_nIndex;
m_nIndex++;
return lCookie
}
public void SendData(string strData)
{
foreach ( ICommObjEvents theSink in m_arSinkColl)
if(theSink != null )
theSink.OnDataSent ();
}
}
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
مقدمه اي بر سي شارپ : قسمت بيستم | c-sharp
مقدمه اي بر سي شارپ : قسمت نوزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هجدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت شانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت پانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهاردهم | c-sharp
مقدمه اي بر سي شارپ : قسمت سيزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت يازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دهم | c-sharp
مقدمه اي بر سي شارپ : قسمت نهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هشتم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفتم | c-sharp
مقدمه اي بر سي شارپ : قسمت ششم | c-sharp
مقدمه اي بر سي شارپ : قسمت پنجم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهارم | c-sharp
مقدمه اي بر سي شارپ : قسمت سوم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوم | c-sharp
مقدمه اي بر سي شارپ : قسمت اول | c-sharp
آشنائی با زبان #C | c-sharp

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


مقدمه اي بر سي شارپ : قسمت هفدهم
در كلاس CCommObj كه با آن آشنا شديم ، آرايه اي Private از نوع ICommObjEvents به نام m_arSinkColl وجود دارد. اين آرايه تمام اينترفيس هاي sink شده را ذخيره مي كند. واژه ي sink در اينجا به كلاسي گفته مي شود كه دريافت كننده ي رخدادها است. متد Advise تنها sink وارده به آنرا در يك آرايه ذخيره مي كند و سپس انديس آرايه را كه در اينجا cookie ناميده شده است بر مي گرداند. اين كوكي توسط كلاينتي كه ديگر نمي خواهد از آن آيتم هيچونه رخدادي را دريافت كند به سرور فرستاده مي شود و سپس سرور اين آيتم را از ليست خودش حذف خواهد كرد.

نحوه ي فراخواني متد advise توسط كلاينت نيز جالب است.

public void Init(CCommObj theSource)
{
m_Server = theSource;
theSource.Advise (this);
string strAdd = ("Hello");
m_Server.read (strAdd,10);
}

در اينجا تنها يك this بعنوان آرگومان به متد advice فرستاده شده است در حاليكه انتظار مي رفت آرگوماني از نوع ICommObjEvents به تابع فرستاده شود. دليل صحت اين عمل بدين صورت است كه كلاس ClientApp_A از اينترفيس ICommObjEvents ارث برده است و آنرا پياده سازي نموده است.
در ادامه ليست كامل برنامه ي نوشته شده را در حالت Console ملاحظه مي فرماييد.

namespace CSharpCenter
{

using System;

public interface ICommObjEvents
{
void OnDataSent();
void OnError();
}
public class CCommObj
{
private int m_nIndex;
public ICommObjEvents [] m_arSinkColl;
public CCommObj()
{
m_arSinkColl = new ICommObjEvents[10];
m_nIndex = 0;
}

public void Advise(ICommObjEvents theSink)
{

m_arSinkColl[m_nIndex] = theSink;
m_nIndex++;
}
public void SendData(string strData)
{
foreach ( ICommObjEvents theSink in m_arSinkColl)
{
if(theSink != null )
{
theSink.OnDataSent ();
}
}
}
}
class CClientApp_A:ICommObjEvents
{
public void OnDataSent()
{
Console.WriteLine("OnDataSent Client App A");
}
public void OnError()
{
Console.WriteLine("OnError");
}
public void Read()
{
string strAdd = ("Hello");
m_Server.SendData (strAdd);

}
private CCommObj m_Server;
public void Init(CCommObj theSource)
{
m_Server = theSource;
theSource.Advise (this);
}
}
class CClientApp_B:ICommObjEvents
{
public void OnDataSent()
{
Console.WriteLine("OnDataSent Client App B");
}
public void OnError()
{
Console.WriteLine("OnError");
}
private CCommObj m_Server;
public void Init(CCommObj theSource)
{
m_Server = theSource;
theSource.Advise (this);
}
}
class ConsoleApp
{
public static void Main()
{
CClientApp_A theClient = new CClientApp_A ();
CClientApp_B theClient2 = new CClientApp_B ();
CCommObj theComm = new CCommObj ();
theClient.Init (theComm);
theClient2.Init (theComm);
theClient.Read();

}
}

}

در متد Main برنامه ي فوق ، ما دو كلاينت تعريف كرده ايم و يك نمونه از CCommObj را. دو كلاينت instance هاي CCommObj را بعنوان آرگومان دريافت كرده اند. در هنگام فراخواني init توسط هر كلاينت متد advise فراخواني مي گردد. در خاتمه Read مربوط به كلاينت 1 فراخواني شده است كه سبب مي شود تا رخداد OnDataSend شيء CCommObj اجرا شود و به تمام كلاينت ها فرستاده شود.

هدف از اين مثال ارائه ي بعضي از جنبه هاي اينترفيس ها و نحوه ي استفاده از آنها بود. دو مطلب ديگر در مورد اينترفيس ها باقي مانده اند تا به پايان بحث مربوط به آنها برسيم:

چگونه مي توان متوجه شد كه يك شيء واقعا يك اينترفيس را پياده سازي كرده است؟
دو روش براي فهميدن اين موضوع وجود دارد:
- استفاده از كلمه ي كليدي is
- استفاده از كلمه ي كليدي as

اولين مثال زير از كلمه ي كليدي is استفاده مي كند :

CClientApp_C theClient3 = new CClientApp_C ();
if(theClient3 is ICommObjEvents)
Console.WriteLine ("theClient3 implements ICommObjEvents");
else
Console.WriteLine ("theClient3 doesnot implement ICommObjEvents");

كلمه ي كليدي is مقدار true را بر مي گرداند اگر اپراتور سمت چپ ، اينترفيس سمت راست را پياده سازي كرده باشد.

ICommObjEvents theClient5 = theClient3 as ICommObjEvents;
if(theClient5 != null )
Console.WriteLine ("Yes theClient implements interface");

else
Console.WriteLine ("NO,Yes theClient doesn't implements interface");

در مثال فوق اپراتور as در حال casting شيء theClient5 به ICommObjEvents مي باشد. چون CClientApp_C اينترفيس را پياده سازي نمي كند حاصل خط اول نال خواهد بود.

به صورت خلاصه :
يك اينترفيس قراردادي است كه به كلاينت گارانتي مي دهد يك كلاس خاص چگونه رفتار خواهد كرد. هنگاميكه كلاسي يك اينترفيس را پياده سازي مي كند به تمام كلاينت ها مي گويد كه : من تمام موارد ذكر شده در اينترفيس را ارائه و پياده سازي خواهم كرد. نمونه ي عملي استفاده از اينترفيس ها بحث dot net remoting است.
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
مقدمه اي بر سي شارپ : قسمت بيستم | c-sharp
مقدمه اي بر سي شارپ : قسمت نوزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هجدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت شانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت پانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهاردهم | c-sharp
مقدمه اي بر سي شارپ : قسمت سيزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت يازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دهم | c-sharp
مقدمه اي بر سي شارپ : قسمت نهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هشتم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفتم | c-sharp
مقدمه اي بر سي شارپ : قسمت ششم | c-sharp
مقدمه اي بر سي شارپ : قسمت پنجم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهارم | c-sharp
مقدمه اي بر سي شارپ : قسمت سوم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوم | c-sharp
مقدمه اي بر سي شارپ : قسمت اول | c-sharp
آشنائی با زبان #C | c-sharp

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


مقدمه اي بر سي شارپ : قسمت هجدهم
مقابله با خطاها در سي شارپ (Exception Handling in C#)

EXCEPTION يك خطاي زمان اجر است كه بدليل شرايطي غيرنرمال در برنامه ايجاد مي شود. در سي شارپ exeption كلاسي است در فضاي نام سيستم. شيء ايي از نوع exception بيانگر شرايطي است كه سبب رخ دادن خطا در كد شده است. سي شارپ از exception ها به صورتي بسيار شبيه به جاوا و سي پلاس پلاس استفاده مي نمايد.

دلايلي كه بايد در برنامه exception handling حتما صورت گيرد به شرح زير است:
- قابل صرفنظر كردن نيستند و اگر كدي اين موضوع را در نظر نگيرد با يك خطاي زمان اجرا خاتمه پيدا خواهد كرد.
- سبب مشخص شدن خطا در يك نقطه از برنامه شده و ما را به اصلاح آن سوق مي دهد.

بوسيله ي عبارات try...catch مي توان مديريت خطاها را انجام داد. كدي كه احتمال دارد خطايي در آن رخ دهد درون try قرار گرفته و سپس بوسيله ي يك يا چند قطعه ي catch مي توان آنرا مديريت كرد. و اگر از اين قطعات خطايابي استفاده نشود برنامه به صورتهاي زير متوقف خواهد شد :

class A {static void Main() {catch {}}}
TEMP.cs(3,5): error CS1003: Syntax error, 'try' expected

class A {static void Main() {finally {}}}
TEMP.cs(3,5): error CS1003: Syntax error, 'try' expected

class A {static void Main() {try {}}}
TEMP.cs(6,3): error CS1524: Expected catch or finally

بهتر است يك مثال ساده را در اين زمينه مرور كنيم:

int a, b = 0 ;
Console.WriteLine( "My program starts " ) ;
try
{
a = 10 / b;
}
catch ( Exception e )
{
Console.WriteLine ( e ) ;
}
Console.WriteLine ( "Remaining program" ) ;
The output of the program is:
My program starts
System.DivideByZeroException: Attempted to divide by zero.
at ConsoleApplication4.Class1.Main(String[] args) in
d:\dont delete\consoleapplication4\class1.cs:line 51
Remaining program

برنامه شروع به اجرا مي كند. سپس وارد بلوك و يا قطعه ي try مي گردد. اگر هيچ خطايي هنگام اجراي دستورات داخل آن رخ ندهد ، برنامه به خط آخر جهش خواهد كرد و كاري به قطعات catch ندارد.
اما در اينجا در اولين try عددي بر صفر تقسيم شده است بنابراين كنترل برنامه به بلوك catch منتقل مي شود و صرفا نوع خطاي رخ داده شده نوشته و نمايش داده مي شود. سپس برنامه به كار عادي خودش ادامه مي دهد.

تعدادي از كلاس هاي exception در سي شارپ كه از كلاس System.Exception ارث برده اند به شرح زير هستند :

• Exception Class - - Cause
• SystemException - A failed run-time check;used as a base class for other.
• AccessException - Failure to access a type member, such as a method or field.
• ArgumentException - An argument to a method was invalid.
• ArgumentNullException - A null argument was passed to a method that doesn't accept it.
• ArgumentOutOfRangeException - Argument value is out of range.
• ArithmeticException - Arithmetic over - or underflow has occurred.
• ArrayTypeMismatchException - Attempt to store the wrong type of object in an array.
• BadImageFormatException - Image is in the wrong format.
• CoreException - Base class for exceptions thrown by the runtime.
• DivideByZeroException - An attempt was made to divide by zero.
• FormatException - The format of an argument is wrong.
• IndexOutOfRangeException - An array index is out of bounds.
• InvalidCastExpression - An attempt was made to cast to an invalid class.
• InvalidOperationException - A method was called at an invalid time.
• MissingMemberException - An invalid version of a DLL was accessed.
• NotFiniteNumberException - A number is not valid.
• NotSupportedException - Indicates sthat a method is not implemented by a class.
• NullReferenceException - Attempt to use an unassigned reference.
• OutOfMemoryException - Not enough memory to continue execution.
• StackOverflowException - A stack has overflown.

در كد فوق صرفا عمومي ترين نوع از اين كلاس ها كه شامل تمامي اين موارد مي شود مورد استفاده قرار گرفت يعني :

catch ( Exception e )

اگر نيازي به خطايابي دقيقتر باشد مي توان از كلاس هاي فوق براي اهداف مورد نظر استفاده نمود.

مثالي ديگر: ( در اين مثال خطايابي دقيق تر با استفاده از كلاس هاي فوق و همچنين مفهوم finally نيز گنجانده شده است )

int a, b = 0 ;
Console.WriteLine( "My program starts" ) ;
try
{
a = 10 / b;
}
catch ( InvalidOperationException e )
{
Console.WriteLine ( e ) ;
}
catch ( DivideByZeroException e)
{
Console.WriteLine ( e ) ;
}
finally
{
Console.WriteLine ( "finally" ) ;
}
Console.WriteLine ( "Remaining program" ) ;
The output here is:
My program starts
System.DivideByZeroException: Attempted to divide by zero.
at ConsoleApplication4.Class1.Main(String[] args) in
d:\dont delete\consoleapplication4\class1.cs:line 51
finally
Remaining program

قسمت موجود در قطعه ي فاينالي همواره صرفنظر از قسمت هاي ديگر اجرا مي شود.

به مثال زير دقت كنيد :

int a, b = 0 ;
Console.WriteLine( "My program starts" )
try
{
a = 10 / b;
}
finally
{
Console.WriteLine ( "finally" ) ;
}
Console.WriteLine ( "Remaining program" ) ;
Here the output is
My program starts
Exception occurred: System.DivideByZeroException:
Attempted to divide by zero.at ConsoleApplication4.Class1.
Main(String[] args) in d:\dont delete\consoleapplication4
\class1.cs:line 51
finally

قسمت چاپ Remaining program اجرا نشده است.

عبارت throw :

اين عبارت سبب ايجاد يك خطا در برنامه مي شود.

مثال :

int a, b = 0 ;
Console.WriteLine( "My program starts" ) ;
try
{
a = 10 / b;
}
catch ( Exception e)
{
throw
}
finally
{
Console.WriteLine ( "finally" ) ;
}

در اين حالت قسمت فاينالي اجرا شده و برنامه بلافاصله خاتمه پيدا مي كند
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
مقدمه اي بر سي شارپ : قسمت بيستم | c-sharp
مقدمه اي بر سي شارپ : قسمت نوزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هجدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت شانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت پانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهاردهم | c-sharp
مقدمه اي بر سي شارپ : قسمت سيزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت يازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دهم | c-sharp
مقدمه اي بر سي شارپ : قسمت نهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هشتم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفتم | c-sharp
مقدمه اي بر سي شارپ : قسمت ششم | c-sharp
مقدمه اي بر سي شارپ : قسمت پنجم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهارم | c-sharp
مقدمه اي بر سي شارپ : قسمت سوم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوم | c-sharp
مقدمه اي بر سي شارپ : قسمت اول | c-sharp
آشنائی با زبان #C | c-sharp

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


مقدمه اي بر سي شارپ : قسمت نوزدهم

سربارگذاري عملگر ها (Operator OverLoading)

به تعريف مجدد راه و روش اجراي عملگر ها توسط ما ، سربارگذاري عملگرها گفته مي شود. فرض كنيد مي خواهيد عدد 2 را به يك مقدار datetime اضافه كنيد. خطاي زير حاصل خواهد شد:

CS0019: Operator '+' cannot be applied to operands of type 'System.DateTime' and 'int'

جالب بود اگر مي توانستيم عدد 2 را به datetime اضافه كنيم و نتيجه ي آن تعداد روزهاي مشخص بعلاوه ي دو مي بود. اينگونه توانايي ها را مي توان بوسيله ي operator overloading ايجاد كرد.

تنها عملگر هاي زير را مي توان overload كرد:

Unary Operators
+ - ! ~ ++ -- true false

Binary Operators
+ - * / % & | ^ << >> == != > < >= <=

نحوه ي انجام اينكار نيز در حالت كلي به صورت زير است:

return_datatype operator operator_to_be_overloaded (agruments)
{
}

به مثال زير توجه كنيد:

using System;
class MyDate
{
public DateTime tempDate;
public MyDate(int year,int month,int day)
{
tempDate=new DateTime(year,month,day);
}
public static DateTime operator + (MyDate D,int noOfDays)
{
return D.tempDate.AddDays(noOfDays);
}
public static DateTime operator + (int noOfDays,MyDate D)
{
return D.tempDate.AddDays(noOfDays);
}
}

class Test
{
static void Main()
{
MyDate MD=new MyDate(2001,7,16);
Console.WriteLine(MD + 10 );
}
}

output:
2001-07-26

در مثال فوق عملگر + دوبار overload شده است. يكبار توسط آن مي توان يك عدد صحيح را به يك تاريخ اضافه كرد و بار ديگر يك يك تاريخ را مي توان به عدد صحيح افزود.

موارد زير را هنگام سربارگذاري عملگرها به خاطر داشته باشيد:

1- تنها اپراتورهاي ذكر شده را مي توان overload كرد. اپراتورهايي مانند new,typeof, sizeof و غيره را نمي توان سربارگذاري نمود.
2- خروجي متدهاي بكار گرفته شده در سربارگذاري عملگر ها نمي تواند void باشد.
3- حداقل يكي از آرگومانهاي بكار گرفته شده در متدي كه براي overloading عملگرها بكار مي رود بايد از نوع كلاس حاوي متد باشد.
4- متدهاي مربوطه بايد به صورت public و static تعريف شوند.
5- هنگامي كه اپراتور < را سربارگذاري مي كنيد بايد جفت متناظر آن يعني > را هم سربارگذاري نماييد.
6- هنگاميكه براي مثال + را overload مي كنيد خودبخود =+ نيز overload شده است و نيازي به كدنويسي براي آن نيست.

يكي از موارد جالب بكار گيري سربارگذاري عملگرها در برنامه نويسي سه بعدي و ساختن كلاسي براي انجام عمليات ماتريسي و برداري مي باشد
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
مقدمه اي بر سي شارپ : قسمت بيستم | c-sharp
مقدمه اي بر سي شارپ : قسمت نوزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هجدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت شانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت پانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهاردهم | c-sharp
مقدمه اي بر سي شارپ : قسمت سيزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت يازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دهم | c-sharp
مقدمه اي بر سي شارپ : قسمت نهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هشتم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفتم | c-sharp
مقدمه اي بر سي شارپ : قسمت ششم | c-sharp
مقدمه اي بر سي شارپ : قسمت پنجم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهارم | c-sharp
مقدمه اي بر سي شارپ : قسمت سوم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوم | c-sharp
مقدمه اي بر سي شارپ : قسمت اول | c-sharp
آشنائی با زبان #C | c-sharp

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


مقدمه اي بر سي شارپ : قسمت بيستم
Delegates

Delegates در سي شارپ روشي مطمئن و typesafe را براي بكار گيري مفهوم function pointer ارائه مي دهند. يكي از ابتدايي ترين استفاده هاي function pointers پياده سازي callback مي باشد. اما در ابتدا لازم است تا با اصول اوليه ي كاري آن آشنا شويم.

مثال يك :
يك delegate چگونه تعريف و استفاده مي شود؟
Delegate يك شيء است كه بيانگر يك تابع مي باشد بنابراين مي تواند بعنوان آرگومان ورودي يك تابع ديگر و يا عضوي از يك كلاس بكار رود.
در زبان "function-pointer" ، Func1() اشاره گري به Func2() را بعنوان پارامتر دريافت كرده و نهايتا آنرا فراخواني مي كند.
در زبان "delegate" ، Func1() يك شيء delegate از Func2() را دريافت كرده و سپس آنرا فراخواني مي كند.
در مثال زير از دو تابع براي شرح اين مطلب سود جسته شده است:
Func1() از delegate استفاده مي كند.
Func2() يك delegate است.

( شماره گذاري خطوط ، در كد زير ، صرفا براي راحت تر شدن توضيحات در مورد آنها است و لزومي به تايپ آنها در برنامه ي اصلي نيست. )

01 using System;
02 delegate void Delg(string sTry);
03 public class Example1{

// function which uses the delegate object
04 private static void Func1(Delg d){
05 d("Passed from Func1");
06 }

// function which is passed as an object
07 private static void Func2(string sToPrint){
08 Console.WriteLine("{0}",sToPrint);
09 }

// Main execution starts here
10 public static void Main(){
11 Delg d = new Delg(Func2);
12 Func1(d);
13 }
14 }

LINE 02
يك شيء delegate را براي Func2 تعريف مي كند.

LINE 04-06
تابعي را تعريف كرده است كه آرگومان ورودي آن از نوع Delg است.

LINE 07-09
تابعي را تعريف مي كند كه بايد به صورت delegate به تابع ديگر فرستاده شود.

LINE 10-14
تابع Main اجراي برنامه را با ايجاد يك شيء delegate براي Func2 آغاز كرده و سپس تابع Func1 را فراخواني مي كند.

مثال 2:
چگونه مي توان از delegates در كارهاي عملي استفاده كرد؟

طرح يك مساله:
شخصي تقاضاي ثبت نام در يك مؤسسه ي آموزشي و همچنين تقاضاي كاريابي در يك شركت را داده است. هر كدام از اين نهادها روشي خاص خود را براي ارزيابي شخص دارند.

راه حل (با روشي شيء گرا):
شخص مشخصاتي همچون سن / جنس / ميزان تحصيلات قبلي / تجربيات كاري و مدارك مرتبط دارد.
مؤسسه ي آموزشي تعدادي از اين مشخصات را براي ارزيابي شخص استفاده مي كند و اين امر در مورد شركت ياد شده نيز صادق است.
شيء شركت و شيء آموزشگاه هر كدام توابع ارزيابي خاص خودشان را پياده سازي مي كنند.
شخص ، اينترفيسي واحدي را در اختيار شركت / آموزشگاه براي ارزيابي خود قرار مي دهد.

پياده سازي (با استفاده از سي شارپ):
ما delegate‌ايي را تعريف مي كنيم كه بيانگر اينترفيسي است كه به شركت و آموزشگاه اجازه ي چك كردن شخص را مي دهد.
سه كلاس school و company و person را تعريف مي نماييم.
كلاس test را براي آزمودن اين موارد ايجاد مي كنيم.

01 using System;
02 using System.Collections;

03 public delegate bool GetChecker(Person p);

// Person has his information with him as he
// applies for School and Company
04 public class Person
05 {
06 public string Name;
07 public int Age;
08 public bool Graduate;
09 public int YearsOfExp;
10 public bool Certified;

11 public Person(string name,
int age,
bool graduate,
int yearsOfExp,
bool certified)
12 {
13 Name=name;
14 Age=age;
15 Graduate=graduate;
16 YearsOfExp=yearsOfExp;
17 Certified=certified;
18 }
19 public bool CheckMe(GetChecker checker)
20 {
21 return(checker(this));
22 }
23 }

// A school, the person applied for higher studies
24 public class School
25 {
26 public static bool SchoolCheck(Person p)
27 {
28 return (p.Age>10 && p.Graduate);
29 }
30 }

// A Company, the person wants to work for
31 public class Company
32 {
33 public static bool CompanyCheck(Person p)
34 {
35 return (p.YearsOfExp>5 && p.Certified);
36 }
37 }

// A Test class, displays delegation in action
38 public class Test
39 {
40 public static void Main()
41 {
42 Person p1 = new Person("Jack",20,true,6,false);
43 Console.WriteLine("{0} School Check : {1}",
p1.Name,
p1.CheckMe(new GetChecker(School.SchoolCheck)));
44 Console.WriteLine("{0} Company Check : {1}",
p1.Name,
p1.CheckMe(new GetChecker(Company.CompanyCheck)));
45 }
46 }

LINE 03
Delegate مورد نياز را تعريف مي كند.

LINE 04-23
كلاس person را تعريف مي كند. اين كلاس تابعي پابليك را ارائه مي دهد كه آرگومان ورودي آن از نوع GetChecker مي باشد.

LINE 24-30
كلاس school را تعريف مي كند و سپس تابعي را كه delegate است ارائه مي دهد.

LINE 31-37
كلاس company را تعريف مي كند و سپس تابعي را كه delegate است ارائه مي دهد.

LINE 38-36
كلاس test را پياده سازي مي نمايد. سپس يك شيء شخص ساخته مي شود. در ادامه new GetChecker(School.SchoolCheck) و new GetChecker(Company.CompanyCheck) شيء ايي را ايجاد مي كند از نوع delegate مورد نياز و آنرا به تابع CheckMe مي فرستد. خروجي نتيجه ي ارزيابي اين شخص مي باشد.

اگر چك كردن اشخاص بيشتري نياز باشد به اين صورت عمل مي شود:

Person p1 = new Person("Jack",20,true,6,false);
Person p2 = new Person("Daniel",25,true,10,true);
GetChecker checker1= new GetChecker(School.SchoolCheck);
GetChecker checker2= new GetChecker(School.CompanyCheck);

Console.WriteLine("{0} School Check : {1}",
p1.Name,p1.CheckMe(checker1));
Console.WriteLine("{0} Company Check : {1}",
p1.Name,p1.CheckMe(checker2));
Console.WriteLine("{0} School Check : {1}",
p2.Name,p2.CheckMe(checker1));
Console.WriteLine("{0} Company Check : {1}",
p2.Name,p2.CheckMe(checker2));

مثال 3 :
Delegates در تعامل بين دات نت فريم ورك و سي شارپ چه نقشي دارد؟

طرح يك مساله:
نمايش دادن ميزان پيشرفت خواندن يك فايل هنگامي كه حجم فايل بسيار زياد است.

راه حل ( با استفاده از سي شارپ):
در مثال زير از كلاس FileReader براي خواندن يك فايل حجيم استفاده شده است. هنگاميكه برنامه مشغول خواندن فايل است 'Still reading.. را نمايش مي دهد و در پايان 'Finished reading..'. را عرضه مي كند.
براي اينكار از فضاي نام System.IO استفاده شده است. اين فضاي نام حاوي delegate ايي مهيا شده براي ما مي باشد. بدين ترتيب مي توانيم به دات نت فريم ورك بگوييم كه ما تابعي را تعريف كرده ايم كه او مي تواند آنرا فراخواني كند.
سؤال: چه نيازي وجود دارد تا دات نت فريم ورك تابع ما را فراخواني و اجرا كند؟ با استفاده از تابع ما كه دات نت فريم آنرا صدا خواهد زد در طول خواندن فايل به ما گفته مي شود كه بله! من هنوز مشغول خواندن هستم! به اين عمليات Callback نيز گفته مي شود. به اينكار پردازش asynchronous نيز مي گويند!

01 using System;
02 using System.IO;

03 public class FileReader{
04 private Stream sInput;
05 private byte[] arrByte;
06 private AsyncCallback callbackOnFinish;

07 public FileReader(){
08 arrByte=new byte[256];
09 callbackOnFinish = new AsyncCallback(this.readFinished);
10 }

11 public void readFinished(IAsyncResult result){

12 if(sInput.EndRead(result)>0){
13 sInput.BeginRead(arrByte,
0,
arrByte.Length,
callbackOnFinish,
null);
14 Console.WriteLine("Still reading..");
15 }
16 else Console.WriteLine("Finished reading..");
17 }

18 public void readFile(){
19 sInput = File.OpenRead(@"C:\big.dat");
20 sInput.BeginRead(arrByte,
0,
arrByte.Length,
callbackOnFinish,
null);
21 for(long i=0;i<=1000000000;i++){
// just to introduce some delay
22 }
23 }

24 public static void Main(){
25 FileReader asynctest=new FileReader();
26 asynctest.readFile();
27 }
28 }

LINE 02
فضاي نام System.IO را به برنامه ملحق مي كند. اين فضاي نام به صورت خودكار حاوي تعريف delegate زير مي باشد:

public delegate void AsyncCallback (IAsyncResult ar);

LINE 03-10
تعريف كلاس

LINE 06
شيء delegate را تعريف مي كند.

LINE 07-10
سازنده ي كلاس را پياده سازي مي كنند. در اينجا ما تصميم گرفته ايم كه بافري حاوي 256 بايت را در هر لحظه بخوانيم.

LINE 09
شيء delegate نمونه سازي شده است.

LINE 18-23
readFile را پياده سازي مي كند.

LINE 12-16
نحوه ي استفاده از شيء IAsyncResult را بيان مي كند.

LINE 12
sInput.EndRead(result) تعداد بايتهاي خوانده شده را بر مي گرداند. اين خواندن تاجايي كه تعداد بايتهاي خوانده شده صفر است ادامه پيدا مي كند و در اينجا 'Finished reading..' اعلام مي گردد.
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
مقدمه اي بر سي شارپ : قسمت بيستم | c-sharp
مقدمه اي بر سي شارپ : قسمت نوزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هجدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت شانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت پانزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهاردهم | c-sharp
مقدمه اي بر سي شارپ : قسمت سيزدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت يازدهم | c-sharp
مقدمه اي بر سي شارپ : قسمت دهم | c-sharp
مقدمه اي بر سي شارپ : قسمت نهم | c-sharp
مقدمه اي بر سي شارپ : قسمت هشتم | c-sharp
مقدمه اي بر سي شارپ : قسمت هفتم | c-sharp
مقدمه اي بر سي شارپ : قسمت ششم | c-sharp
مقدمه اي بر سي شارپ : قسمت پنجم | c-sharp
مقدمه اي بر سي شارپ : قسمت چهارم | c-sharp
مقدمه اي بر سي شارپ : قسمت سوم | c-sharp
مقدمه اي بر سي شارپ : قسمت دوم | c-sharp
مقدمه اي بر سي شارپ : قسمت اول | c-sharp
آشنائی با زبان #C | c-sharp

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک
فرض کنيد يک image غير مستطيلي داريد که مي خواهيد از آن بعنوان فرم برنامه تان استفاده کنيد
۱ - تصوير فرم مورد نظرتان را طراحي کرده و با فرمت bmp ذخيره کنيد . دقت نماييد که بايستي image خود را درون يک کادر مستطيلي قرار دهيد که با يک رنگ با RGB مشخص رنگ آميزي شده است :

۲ - يک فرم ويژوال بيسيک ايجاد کنيد و خاصيت BorderStyle آنرا صفر نماييد .
3 - در متد Form Load بايستي image مورد نظر را به فرمتان assign کنيد :

Me.picture=loadpicture(yourimagename)x
Me.width=Me.picture.width
Me.height=Me.picture.height

4 - سپس بايستي يک ناحيه از اين image بسازيد که نسبت به رنگ RGB اي که در بالا به آن اشاره کردم transparent باشد . اگر فرض کنيم اين رنگ ، رنگ سياه باشد ( r=0 , g=0, b=0 ) :

LRegion=MakeRgn(yourimagename,0,0,0)x

5 - حال بايستي ناحيه مشخص شده را بعنوان فرم برنامه تان قرار دهيد :

call SetWindowRgn(Me.hwnd,LRegion,True)x

6 - يک ماژوال ايجاد کنيد و خطوط زير را در آن بنويسيد :

Public Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Public Declare Function MakeRgn Lib "Region.dll" (ByVal FileName As String, ByVal R As Integer, ByVal g As Integer, ByVal b As Integer) As Long
Public Declare Function DeleteRgn Lib "Region.dll" (ByVal Region As Long)x

Global lRegion As Long

7 - در متد Form Unload عبارت زير را قرار دهيد :

Call DeleteRgn(LRegion)x

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

Sub CenterForm(frm As Form)
frm.Left = (Screen.Width - frm.Width) / 2
frm.Top = (Screen.Height - frm.Height) / 2
End Sub

نکته ۲ : براي دريافت Region.dll با من تماس بگيريد .
لينک مقاله
http://sheidaian.persianblog.com :منبع

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲
براي قرار دادن آيکون برنامه در system tray ابتدا يک ماژول تعريف کرده و اطلاعات زير را در آن قرار دهيد :
ابتدا تعريف constant هاي مورد نياز :

Public Const WM_RBUTTONUP = &H205
Global Const WM_MOUSEMOVE = &H200
Global Const NIM_ADD = 0
Global Const NIM_DELETE = 2
Global Const NIM_MODIFY = 1
Global Const NIF_ICON = 2
Global Const NIF_MESSAGE = 1
Global Const ABM_GETTASKBARPOS = &H5

سپس تعريف يک type با نام RECT براي نشان دادن يک مستطيل :

Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type

سپس تعريف يک type با نام NOTIFYICONDATA براي توصيف آيکون :

Type NOTIFYICONDATA
cbSize As Long
hwnd As Long
uID As Long
uFlags As Long
uCallbackMessage As Long
hIcon As Long
szTip As String * 64
End Type

حال تعريف يک type با نام APPBARDATA براي توصيف اطلاعات application bar :

Type APPBARDATA
cbSize As Long
hwnd As Long
uCallbackMessage As Long
uEdge As Long
rc As RECT
lParam As Long
End Type

دو متغير را بصورت زير تعريف مي کنيم :

Global Notify As NOTIFYICONDATA
Global BarData As APPBARDATA

حال نياز به declare کردن توابع Shell_NotifyIcon و SHAppBarMessage از کتابخانه shell32 داريم :

Private Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long
Private Declare Function SHAppBarMessage Lib "shell32.dll" (ByVal dwMessage As Long, pData As APPBARDATA) As Long

روتين قراردادن آيکون بصورت زير است :

Sub AddIcon(Form1 As Form, IconID As Long, Icon As Object, ToolTip As String)x
Dim Result As Long
BarData.cbSize = 36&
Result = SHAppBarMessage(ABM_GETTASKBARPOS, BarData)x
Notify.cbSize = 88&
Notify.hwnd = Form1.hwnd
Notify.uID = IconID
Notify.uFlags = NIF_ICON Or NIF_MESSAGE Or NIF_TIP
Notify.uCallbackMessage = WM_MOUSEMOVE
Notify.hIcon = Icon
Notify.szTip = ToolTip & Chr$(0)x
Result = Shell_NotifyIcon(NIM_ADD, Notify)x
End Sub

روتين حذف آيکون بصورا زير است :

Sub delIcon(IconID As Long)
Dim Result As Long
Notify.uID = IconID
Result = Shell_NotifyIcon(NIM_DELETE, Notify)
End Sub

در فرم مورد نظرتان ابتدا يک متغير از نوع object تعريف کنيد :

Public IconObject As Object

در Form load عبارات زير را بنويسيد :

Set IconObject = Form.Icon
AddIcon Form, IconObject.Handle, IconObject, "TrayIcon"x

در Form unload عبارات زير را بنويسيد :

delIcon IconObject.Handle
delIcon Form.Icon.Handle

فرض کنيد يک منو با نام popmenu در فرم داريد و مي خواهيد با کليک راست روي آيکون برنامه در system tray ، آن منو باز شود . ابتدا visible اين منو را false کنيد و سپس متد زير را براي mousemove بنويسيد :

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Static Message As Long
Message = X / Screen.TwipsPerPixelX
Select Case Message
Case WM_RBUTTONUP:
Me.PopupMenu Popup
End Select
End Sub

لينک مقاله
http://sheidaian.persianblog.com :منبع

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


اضافه کردن آيکون به منو
براي اضافه آيکون به منوهاي موجود در يک برنامه visual basic بايستي از توابع زير که موجود در کتابخانه User32 هستند استفاده کنيد :
۱ - GetMenu
۲ - GetSubMenu
۳ - GetMenuItemID
۴ - SetMenuIcon
ابتدا يک ماژول ايجاد کنيد و توابع فوق را در آن declare کنيد :

Public Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long

Public Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long

Public Declare Function GetMenuItemID Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long

Public Declare Function SetMenuItemBitmaps Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, ByVal hBitmapUnchecked As Long, ByVal hBitmapChecked As Long) As Long

براي قرار دادن يک آيکون در کنار يکي از آيتمهاي منو نياز به handle فرم ، شماره منو ، شماره آيتم مورد نظر و نيز يک picture داريم :

Public Function SetMenuIcon(FrmHwnd As Long, MainMenuNumber As Long, MenuItemNumber As Long, Flags As Long, BitmapUncheckedHandle As Long, BitmapCheckedHandle As Long)x
Dim lngMenu As Long
Dim lngSubMenu As Long
Dim lngMenuItemID As Long
lngMenu = GetMenu(FrmHwnd)x
lngSubMenu = GetSubMenu(lngMenu, MainMenuNumber)x
lngMenuItemID = GetMenuItemID(lngSubMenu, MenuItemNumber)x
,SetMenuIcon = SetMenuItemBitmaps(lngMenu, lngMenuItemID, Flags
BitmapUncheckedHandle, BitmapCheckedHandle)x
End Function

image هاي مورد نظر خود را با ابعادي حدود 16*16 پيکسل و بصورت PictureBox در فرم خود قرار دهيد و خاصيت Visible مربوط به PictureBox ها را False کنيد .
سپس منوهاي خود را توسط Menu Editor طراحي کنيد .

File و Edit منوهاي اصلي هستند . پارامتر MainMenuNumber در تابع فوق شماره منوي اصلي است که براي File برابر صفر و براي Edit برابر يک مي باشد . پارامتر MenuItemNumber شماره هر آيتم در يک منو است که اين پارامتر نيز از صفر شروع مي شود .
اکنون براي اضافه کردن سه آيکون به سه آيتم منوي File کدهاي زير را در Form_Load بنويسيد :

Private Sub Form_Load()x
SetMenuIcon Me.hwnd, 0, 0, 0, pic1.Picture, pic1.Picture
SetMenuIcon Me.hwnd, 0, 1, 0, pic2.Picture, pic2.Picture
SetMenuIcon Me.hwnd, 0, 2, 0, pic3.Picture, pic3.Picture
لينک مقاله
http://sheidaian.persianblog.com :منبع

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


کنترل WinSock - قسمت 1,2
مقدمه :
کنترل 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 قرار دهيد .
-------------------

بررسی خواص کنترل WinSock :
ByteReceived : مقدار داده دريافت شده ( موجود در بافر receive ) را نشان مي دهد . توسط متد GetData مي توان اين داده را دريافت نمود .
LocalHostName : نام ماشين محلي را نشان مي دهد . اين پارامتر فقط خواندني است .
LocalIP : آدرس IP ماشين محلي را بصورت يک string برمي گرداند . اين پارامتر فقط خواندني است .
LocalPort : براي خواندن و يا تنظيم شماره پورت محلي بکار مي رود .
Protocol : براي خواندن و يا تنظيم پروتوکل مورد استفاده توسط کنترل WinSock بکار مي رود .
RemoteHost : براي خواندن و يا تنظيم نام يا آدرس IP ماشين راه دور بکار مي رود .
RemoteHostIP : آدرس IP ماشين راه دور را برمي گرداند :
۱- براي برنامه هاي Client بعد از زمانيکه يک اتصال توسط متد Connect پذيرفته شد ، اين خاصيت حاوي آدرس IP ماشين راه دور است .
۲ - براي برنامه Server ، بعد از آمدن يک Connection Request اين خاصيت شامل آدرس IP ماشين راه دور است .
۳ - در زمان استفاده از پروتکل UDP بعد از اينکه رويداد Data Arrival رخ داد اين خاصيت حاوي آدرس IP ماشيني است که داده را فرستاده .
RemotePort : براي خواندن و يا تنظيم شماره پورت ماشين راه دوري که مي خواهيد به آن متصل شويد بکار مي رود .
SocketHandle : مقداري را برمي گرداند که مرتبط با سوکتي است که کنترل WinSock را مديريت مي کند و براي ارتباط با لايه WinSock بکار مي رود . اين پارامتر فقط خواندني است و تنها براي ارسال به API هاي WinSock طراحي شده است .
State : وضعيت کنترل WinSock را نشان مي دهد . وضعيتهاي ممکن براي State عبارتند از :
۱ - sckClosed : اتصال بسته است .
۲ - sckOpen : اتصال باز است .
۳ - sckListening : حالت گوش دادن به پورت
4 - sckConnectionPending : معلق شدن اتصال
۵ - sckResolvingHost : تصميم گيري در مورد ميزبان
۶ - sckHostResolved : در مورد ميزبان تصميم گيري شد .
۷ - sckConnecting : حالت برقراري ارتباط
۸ - sckConnected : ارتباط برقرار شد .
۹ - sckClosing : حالت قطع اتصال
۱۰ - sckError : حالت خطا

بررسی متدهای کنترل WinSock :
متد Accept : تنها براي برنامه هاي TCP Server بکار مي رود . اين متد براي پذيرفتن يک اتصال در زمان مديريت رويداد ConnectionRequest استفاده مي شود .
متد Bind : اين پارامتر LocalPort و LocalIP يک اتصال را مشخص مي کند .
متد Close : براي بستن يک اتصال TCP و يا بستن يک listening socket بکار مي رود .
متد GetData : بلوک جاري داده دريافت شده را گرفته و آنرا در متغيري از نوع Variant ذخيره مي کند . شکل کلي اين متد بصورت زير است :

WinSock.GetData data[,type][,maxlen]x

که data داده دريافتي است . اگر داده کافي موجود نباشد data برابر empty خواهد بود .
type نوع داده دريافتي است که مي تواند مقادير زير باشد :
vbByte - vbInteger - vbLong - vbSingle - vbDouble - vbDate - vbBoolean - vbError - vbString - vbArray+vbByte
maxlen حداکثر سايز را در زمان دريافت يک byte Array و يا يک string مشخص مي کند .
متد Getdata در رويداد Data Arrival استفاده مي شود که اين رويداد يک پارامتر با نام TotalBytes دارد . اگر maxlen اي که شما تعيين کرده ايد کمتر از TotalBytes باشد پيغام هشدار شماره ۱۰۰۴۰ دريافت مي کنيد بدين معني که بايتهاي باقيمانده گم خواهند شد .
متد Listen : يک سوکت مي سازد و آنرا در حالت Listen قرار مي دهد . اين متد تنها در اتصالات TCP بکار ميرود .
متد PeekData : مشابه GetData است با اين تفاوت که داده را از صف ورودي حذف نمي کند . اين متد تنها براي اتصالات TCP بکار مي رود .
متد SendData : براي ارسال داده به کامپيوتر راه دور بکار مي رود .
بررسي event هاي کنترل WinSock :
رويداد Close : زماني رخ مي دهد که کامپيوتر راه دور اتصال را ببندد .
رويداد Connect : بعد از اينکه يک اتصال به Server ايجاد شد روي مي دهد . شکل کلي آن بصورت زير است :

Private Sub WinSock_Connect(ErrorOccurred As Boolean)x

که پارامتر ErrorOccurred دو مقدار دارد : اگر True باشد يعني اتصال Fail شده است و اگر False باشد يعني اتصال با موفقيت انجام شده است .
با رويداد Connect مي توانيد error هايي که در زمان فرايند باز کردن اتصال برگردانده شده را چک کنيد .
رويداد ConnectionRequest : زماني رخ مي دهد که يک کامپيوتر راه دور تقاضاي يک اتصال را بدهد . اين رويداد فقط براي برنامه هاي TCP Server بکار مي رود .
رويداد DataArrival : زماني رخ مي دهد که داده جديدي بيايد .
رويداد Error : زماني رخ مي دهد که يک خطا در فرايند ارتباط رخ دهد ( مثلاً Failed to Connect و يا Failed to Send ) . شکل کلي آن بصورت زير است :

Private WinSock_Error(number as Integer,description as String,scode as Long,source as String,helpfile as String,helpcontext as Long,canceldisplay as Boolean)x

number شماره کد خطا است .
description توضيحي در مورد خطا است .
source توصيف منبع خطا
canceldisplay : مشخص مي کند آيا پيغام خطاي پيش فرض نشان داده شود يا نه
رويداد SendComplete : زماني رخ مي دهد که يک عمل Send تکميل شده باشد .
رويداد SendProgress : زماني رخ مي دهد که کنترل شروع به ارسال داده نمايد . شکل کلي آن بصورت زير است :

WinSock_SendProgress (bytesSent As Long, bytesRemaining As Long)x

که bytesSent تعداد بايتهاي ارسال شده و bytesRemaining تعداد بايتهاي باقيمانده است .

نکته ۱ : براي دريافت جدول خطاهاي WinSock با من تماس بگيريد .

نکته ۲ : موضوع بعدي : آشنايي با الگوريتم Collision Detection در ساخت انيميشن هاي دوبعدي
لينک مقاله
http://sheidaian.persianblog.com :منبع

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی

موضوع : مروري بر مباحث قبلي - ساخت يک موتور گرافيکي سه بعدي

قبل از شروع مباحث جديد برنامه نويسي Direct3D ، با هم مروري بر مباحث قبلي خواهيم داشت . ( مباحث قبلي در آرشيو موجود مي باشند ) .
در اين درس با استفاده از مطالب قبلي يک Engine سه بعدي ساخته و از امکانات آن در يک برنامه نمونه استفاده خواهيم کرد .
اين engine داراي دو کلاس است :
1 – کلاس MainD3D
2 – کلاس D3Dobject
در کلاس MainD3D متغيرها و توابع لازم براي ساخت يک device سه بعدي ، تنظيمات ماتريسي ، تابع رندر و غيره موجود مي باشد .
متغيرهاي عمومي اين کلاس عبارتند از :
Public g_DX As New DirectX8
Public g_D3D As Direct3D8
Public g_D3DX As New D3DX8
Public g_D3DDevice As Direct3DDevice8
Public NTextures As Long
روتين ها و توابع اين کلاس عبارتند از :
1 - InitD3D : اين روتين ، اشيا D3D و D3Ddevice را مي سازد و پارامترهاي آنها را تنظيم مي کند .
2 – ApplyCameraChanges : روتين ايجاد ماتريس View
3 – SetupMatrices : روتين ايجاد ماتريس Projection
4 – StartRender : در اين روتين عمليات لازم براي شروع عمل رندر صورت مي گيرد .
5 – RenderObject : اين تابع ، يک شي سه بعدي از نوع کلاس D3Dobject را مي گيرد و بردارهاي مورد نياز و نيز بافت شي را تنظيم مي کند و در پايان شي را ترسيم مي کند .
6 – FinishRender : در اين روتين به عمليات رندر پايان داده مي شود .
7 – Cleanup: روتين از بين بردن اشيا Direct3D
8 – CreateVector : تابع ساخت يک بردار سه بعدي
9 – CreateTextures : روتين ساخت يک بافت جديد
10 – InitTexture: تابع مقداردهي به يک بافت
در کلاس D3Dobject متغيرها و توابع لازم براي ايجاد يک شي سه بعدي و اختصاص بافت به آن موجود مي باشد .
در اين کلاس دو type عمومي تعريف شده است :
1 - NormalVERTEX
2 - TeturedVERTEX
همچنين روتين ها و توابع اين کلاس عبارتند از :
1 – InitObject : تابعي که تنظيمات اوليه vertex ها و بافت شي را انجام مي دهد .
2 – Vertex : روتين ايجاد vertex هاي مورد نياز
3 – GetRenderingMode: تابعي که مد رندر را مشخص مي کند .
و نيز يکسري تابع ساخت vertex نرمال و ساخت vertex داراي بافت و غيره

اين دو کلاس در يک پروژه ويژوال بيسيک قرارداده شده و پروژه با نام D3Dengine.dll کامپايل شده است .
حال با استفاده از اين engine مي خواهيم يک منظره سه بعدي را ايجاد کنيم :
اين منظره شامل سه object است : ديوار ، آسمان و زمين.

ابتدا بايد يک شي از کلاس MainD3D تعريف کنيم :

Dim D3D8Main As MainD3D8

در متد Form Load نيز سه شي Floor ، Sky و Wall را بصورت زير تعريف مي کنيم :

Dim Floor As D3DObject
Dim Sky As D3DObject
Dim Walls As D3Dobject

سپس اين سه شي را به اضافه شي D3D8Main ، ايجاد مي کنيم :

Set D3D8Main = New D3DEngine.MainD3D8
Set Floor = New D3DEngine.D3DObject
Set Sky = New D3DEngine.D3DObject
Set Walls = New D3DEngine.D3Dobject

در ابتدا شي MainD3D را Initial مي کنيم و سپس بافتهاي مورد نيز خود را مي سازيم :

D3D8Main.InitD3D True, Me.hWnd
D3D8Main.CreateTextures 3
D3D8Main.InitTexture 1, App.Path + "\floor.jpg"
D3D8Main.InitTexture 2, App.Path + "\sky.bmp"
D3D8Main.InitTexture 3, App.Path + "\wall.bmp"

حال به سراغ ايجاد و مقداردهي vertex هاي floor مي رويم . floor شامل شش vertex مي باشد و بنابراين دو face مثلثي دارد :

Floor.InitObject 6, 2, TriangleList, True, 1

Floor.Vertex 0, -55, -2, -55, vbWhite, 0, 10
Floor.Vertex 1, 55, -2, -55, vbWhite, 10, 10
Floor.Vertex 2, 55, -2, 55, vbWhite, 10, 0
Floor.Vertex 3, -55, -2, -55, vbWhite, 0, 10
Floor.Vertex 4, 55, -2, 55, vbWhite, 10, 0
Floor.Vertex 5, -55, -2, 55, vbWhite, 0, 0

سپس به سراغ ايجاد و مقداردهي vertex هاي wall مي رويم . wall شامل بيست و چهار vertex مي باشد و بنابراين هشت face مثلثي دارد :

Walls.InitObject 24, 8, TriangleList, True, 3

Walls.Vertex 0, -55, -2, -55, &HBCE8FC, 0, 1
Walls.Vertex 1, 55, -2, -55, &HBCE8FC, 5, 1
Walls.Vertex 2, 55, 8, -55, &HBCE8FC, 5, 0
Walls.Vertex 3, -55, -2, -55, &HBCE8FC, 0, 1
Walls.Vertex 4, 55, 8, -55, &HBCE8FC, 5, 0
Walls.Vertex 5, -55, 8, -55, &HBCE8FC, 0, 0

Walls.Vertex 6, -55, -2, 55, &HBCE8FC, 0, 1
Walls.Vertex 7, 55, -2, 55, &HBCE8FC, 5, 1
Walls.Vertex 8, 55, 8, 55, &HBCE8FC, 5, 0
Walls.Vertex 9, -55, -2, 55, &HBCE8FC, 0, 1
Walls.Vertex 10, 55, 8, 55, &HBCE8FC, 5, 0
Walls.Vertex 11, -55, 8, 55, &HBCE8FC, 0, 0

Walls.Vertex 12, -55, -2, 55, &HBCE8FC, 0, 1
Walls.Vertex 13, -55, -2, -55, &HBCE8FC, 5, 1
Walls.Vertex 14, -55, 8, -55, &HBCE8FC, 5, 0
Walls.Vertex 15, -55, -2, 55, &HBCE8FC, 0, 1
Walls.Vertex 16, -55, 8, -55, &HBCE8FC, 5, 0
Walls.Vertex 17, -55, 8, 55, &HBCE8FC, 0, 0

Walls.Vertex 18, 55, -2, 55, &HBCE8FC, 0, 1
Walls.Vertex 19, 55, -2, -55, &HBCE8FC, 5, 1
Walls.Vertex 20, 55, 8, -55, &HBCE8FC, 5, 0
Walls.Vertex 21, 55, -2, 55, &HBCE8FC, 0, 1
Walls.Vertex 22, 55, 8, -55, &HBCE8FC, 5, 0
Walls.Vertex 23, 55, 8, 55, &HBCE8FC, 0, 0

حال به سراغ ايجاد و مقداردهي vertex هاي sky مي رويم . sky شامل شش vertex مي باشد و بنابراين دو face مثلثي دارد :

Sky.InitObject 6, 2, TriangleList, True, 2

Sky.Vertex 0, -55, 8, -55, &HBCE8FC, 0, 1
Sky.Vertex 1, 55, 8, -55, &HBCE8FC, 0, 1
Sky.Vertex 2, 55, 8, 55, &HBCE8FC, 0, 1
Sky.Vertex 3, -55, 8, -55, &HBCE8FC, 0, 1
Sky.Vertex 4, 55, 8, 55, &HBCE8FC, 0, 1
Sky.Vertex 5, -55, 8, 55, &HBCE8FC, 0, 1

در پايان تابع رندر را صدا مي کنيم . البته در هر بار عمل رندر کردن ، دوربين يک درجه در صفحه X-Z دوران مي کند تا کل ديوار قابل مشاهده باشد :

Dim Angle As Double
PI = 3.1415
Angle = 0
Do
DoEvents
D3D8Main.StartRender vbBlack
D3D8Main.RenderObject Sky
D3D8Main.RenderObject Floor
D3D8Main.RenderObject Walls
D3D8Main.FinishRender
If Sqr(Angle ^ 2) = 360 Then Angle = 0
Angle = Angle + 1
D3D8Main.CamLookAtX = Sin((Angle * 2 * PI) / 360)
D3D8Main.CamLookAtZ = Cos((Angle * 2 * PI) / 360)
D3D8Main.ApplyCameraChanges
Loop

موضوع : استفاده از object هاي 3D Studio Max در Direct3D
تا بحال ما هر شيي را که مي خواستيم در Direct3D بسازيم خودمان بوسيله کد نويسي آنرا توصيف کرده ايم . ممکنست اين سوال برايتان پيش آمده باشد که بازيهاي تجاري براي توليد کاراکترهاي و اشيا پيچيده سه بعدي چگونه عمل مي کنند ؟
منطقي بنظر نمي رسد که اينگونه مدلهاي پيچيده بصورت کد وارد برنامه شده اند زيرا نياز به هزاران خط برنامه براي هر فريم خواهد بود . بجاي اينکار ما object هاي خود را توسط برنامه هاي ديگري مي سازيم و آنها را در برنامه خودمان load مي کنيم سپس بافتها و material هاي مورد نظر را به آنها اختصاص داده و در پايان آنها را رندر مي کنيم . مزيت ديگر اينکار اينست که شما مي توانيد براحتي فايل object خود را تغيير دهيد و مدلهايي با جزئيات متفاوت براي برنامه خود قرار دهيد .
مراحل ساخت چنين برنامه هايي بصورت زير است :

۱ - ساخت object سه بعدي :
اولين چيزي که بايستي بدانيد داشتن دانش پايه اي از چگونگي مدلسازي سه بعدي است . همچنين نياز به يک نرم افزار مدلسازي مثل 3D Studio Max داريد .

بعد از ساخت مدل خود در Max نياز به يک Convertor داريد تا فايلهاي Max را به فايلهاي Direct3D که با فرمت "X." هستند تبديل کنيد .
Convertor هاي زيادي براي تبديل فايلهاي نرم افزارهاي مدلسازي به فايلهاي "X." وجود دارند که برخي از آنها عبارتند از :
- برنامه PolyTrans3D System Translation
- برنامه Deep Exploration 2.0
- برنامه Quick3D
- برنامه 3DWin
- DirectX Explorer Plugin
- ابزارهاي موجود در DirectX 8.0 SDK که عبارتند از :
برنامه Conv3DS براي تبديل فايلهاي 3DS به فايلهاي X
DX SDK Exporter Plugin براي تبديل فايلهاي 3DS و Max به فايلهاي X
از بين اين برنامه ها و plugin ها من برنامه Deep Exploration را به شما پيشنهاد مي کنم .

در آدرس زير مي توانيد اطلاعات بيشتري در مورد اين برنامه بدست آوريد و همچنين آنرا Download کنيد :
 Deep Exploration 2.0
s/n: 0XE2A0000000000
Authorization s/n: REJ1HYXSR1A77Q10

2 - Load کردن يک Object ساخته شده :
زمانيکه فايل X شي مورد نظر را ساختيد ، load کردن آن در direct3D ساده است . براي اينکار نياز به يک مش داريم که اطلاعات شي ما را نگهداري کند :

Dim Mesh As D3DXMesh

همچنين براي اختصاص material و texture به شي ، نياز به تعريف متغيرهاي زير داريم :

Dim MeshMaterial As D3DMATERIAL8
Dim MeshTexture As Direct3DTexture8

حال به سراغ بازنويسي روتين InitGeometry مي رويم :
- تعريف متغيرهاي مورد نياز :

Dim mtrlBuffer as D3DXBuffer
Dim TextureFile as String
Dim n as Long

- گرفتن داده هاي شي از فايل X :

Set Mesh=D3DX.LoadMeshFromX app.path&"\"&"yourfilename",D3DMESH_MANAGED,D3DDevice,Nothing,mtrlBuffer,n

- استخراج اطلاعات materiasl شي و تنظيم پارامتر Ambient :

D3DX.BufferGetMaterial mtrlBuffer,0,MeshMaterial
MeshMaterial.Ambient=MeshMaterial.Diffuse

- استخراج نام بافت بکار رفته براي شي :

TextureFile=D3DX.BufferGetTextureName(mtrlBuffer,0)x

- ساخت بافت :

If TextureFile<>"" Then
Set MeshTexture=D3DX.CreateTextureFromFile D3DDevice,app.path&"\"&TextureFile,128,128,D3DX_DEFAULT,0,
D3DFMT_UNKNOWN,D3DPOOL_MANAGED,D3DX_FILTER_LINEAR,D3DX_FILTER_LINEAR,0,Byval 0,Byval 0
End If

۳ - رندر نمودن شي : رندر نمودن شي چندان مشکل نيست اما همچنان بايد ماتريسها و تبديلاتي را که مي خواهيد ، خودتان مديريت کنيد .

D3DDevice.SetMaterial MeshMaterial
D3DDevice.SetTexture 0,MeshTexture
Mesh.DrawSubset 0

موضوع : مباحث تکميلي نورپردازي در Direct3D

در بخش اول آموزش Direct3D با مباني نورپردازي آشنا شديد . در اين درس قصد دارم آن مباحث را کاملتر برايتان مطرح کنم .
نورپردازي يکي از بخشهاي مهم طراحي يک بازي و يا يک انيميشن سه بعدي است . بمنظور پياده سازي نورپردازي يک صحنه ابتدا بايد با تئوري آن آشنا شويد .
تئوري نورپردازي : نورپردازي در Direct3D تخميني از چگونگي عملکرد نور در دنياي واقعي مي باشد . چهار نوع اصلي نور در Direct3D قابل استفاده است ( همچنين شما مي توانيد خودتان انواع جديدي از نور ايجاد کنيد که موضوع ما نيست ) :
۱ - Point Light : توسط يک نقطه در فضاي سه بعدي ايجاد مي شود و داراي سه پارامتر رنگ ، دامنه و تضعيف مي باشد . دامنه يک نور مسافتي است که نور مي تواند طي کند . تضعيف ، مقدار کاهش نور در اثر افزايش مسافت مي باشد . نور نقطه اي در تمام جهات تششع مي کند - شبيه يک لامپ حبابي و يا يک شمع
۲ - Spot Light : داراي يک موقعيت و يک جهت است و تنها نور را در يک جهت خاص مي تاباند - شبيه يک چراغ قوه . اين نور داراي يک زاويه مخروطي و يک دامنه است .
۳ - Directional Light : داراي موقعيت نيست و براي پياده سازي نورهايي که از فاصله بسيار دور مي آيند - مثل خورشيد - مناسب است .
۴ - Ambient Light : اين نور تضمين مي کند که تمام vertex هاي يک صحنه تاريکتر از يک رنگ خاص نباشند .
عملي کردن نورپردازي : ضمن اينکه اغلب کارت هاي گرافيک سه بعدي از نورپردازي پشتيباني مي کنند اما اين نکته بايد مورد توجه قرار گيرد که با افزايش تعداد نور در يک صحنه محاسبات Direct3D بيشتر مي شود و اين باعث کند شدن رندر صحنه خواهد شد و بنابراين کارت هاي گرافيکي سه بعدي نيز داراي يک ماکزيمم تعداد نور هستند - مثلاً ۱۶ نور در GeForce 2 - همچنين توجه داشته باشيد که نورهاي مختلف داراي زمان پردازشي متفاوتي هستند . نور ambient سريعترين زمان پردازشي را دارد ، سپس نورdirectional ، سپس نور point و کندترين آنها Spot Light است .
همچنين نکته ديگري که بايد توجه کنيد دامنه نور است . اگر نور ، يک منطقه بزرگي را پوشش دهد بر تعداد زيادي از vertex ها تاثير مي گذارد و اين باعث افزايش محاسبات مي شود .
نورپردازي Specular - که در درسهاي بعدي در مورد آن صحبت مي کنم و براي ايجاد اشيا درخشان استفاده مي شود - نيز زمان پردازشي زيادي دارد و بهتر است کمتر از آن استفاده شود .
پارامتر ديگري که بايد در نظر بگيريد جزئيات هندسه شما مي باشد . هر چه پيچيدگي صحنه بيشتر باشد ، نورپردازي نيز زمان بيشتري را مصرف مي کند .
سايه زني نيز يک بخش بسيار پيچيده در مدل سازي نور است و محاسبات آن بسيار زمان گير خواهد بود بنابراين Direct3D مستقيماً محاسبات سايه زني را انجام نمي دهد بلکه رنگ نور را بر مبناي جهت هر مثلث scale مي کند بنابراين قسمت پشتي يک شي که رو به نور نيست ، هيچ نوري را دريافت نمي کند .

بردار نرمال : Direct3D هر vertex را بر مبناي بک بردار نرمال نورپردازي مي کند و نوري که يک vertex دريافت مي کند به زاويه بين نور و بردار نرمال آن vertex بستگي دارد . بردار نرمال توسط سه vertex يک face مثلثي ايجاد مي شود و اين بردار نرمال ساخته شده به vertex ها اختصاص مي يابد . بردار نرمال در واقع سمت يک مثلث را مشخص مي کند بنابراين اگر نور پشت مثلث باشد ، مثلث هيچ نوري را دريافت نميکند . بردار نرمال بايستي داراي طول ۱ باشد .
مراحل توليد بردار نرمال يک face مثلثي :
۱ - مطمئن شويد که face در جهت عقربه هاي ساعت ساخته شده است .
۲ - يک بردار از vertex شماره صفر به vertex شماره يک بسازيد .
۳ - يک بردار از vertex شماره صفر به vertex شماره دو بسازيد .
۴ - حاصلضرب برداري ( cross droduct ) اين دو بردار را بدست آوريد .
۵ - نتيجه حاصلضرب را نرمال کنيد .

Private Function GenerateTriangleNormals(p0 As UnlitVertex, p1 As UnlitVertex, p2 As UnlitVertex) As D3DVECTOR
Dim v01 As D3DVECTOR
Dim v02 As D3DVECTOR
Dim vNorm As D3DVECTOR
D3DXVec3Subtract v01, MakeVector(p1.X, p1.Y, p1.Z), MakeVector(p0.X, p0.Y, p0.Z)x
D3DXVec3Subtract v02, MakeVector(p2.X, p2.Y, p2.Z), MakeVector(p0.X, p0.Y, p0.Z)x
D3DXVec3Cross vNorm, v01, v02
D3DXVec3Normalize vNorm, vNorm
GenerateTriangleNormals.X = vNorm.X
GenerateTriangleNormals.Y = vNorm.Y
GenerateTriangleNormals.Z = vNorm.Z
End Function

اگر دو face در يک vertex مشترک باشند ( مثل گوشه دو ديوار ) براي توليد نرمال اين vertex ابتدا نرمال دو face را با روش فوق بدست آوريد سپس دو بردار نرمال را با هم جمع کنيد و در پايان بردار حاصلجمع را نرمال کنيد .

برپاسازي نورپردازي : اولين چيزي که قبل از برپاسازي نورپردازي بايستي اعمال کنيم تغيير ساختار vertex است . براي اينکار بايد پارامتر color را از ساختار vertex حذف و سه پارامتر را براي نگهداري نرمال اضافه کنيم :

Private Type UnlitVertex
X As Single
Y As Single
Z As Single
nx As Single
ny As Single
nz As Single
tu As Single
tv As Single
End Type
Const Unlit_FVF = (D3DFVF_XYZ Or D3DFVF_NORMAL Or D3DFVF_TEX1)x

همچنين بايد براي تمام vertex هاي شي خود بردار نرمال را محاسبه کنيد براي مثال اگر شي شما يک مکعب است براي هر ۱۲ face آن بردار نرمال را بدست آوريد . در زير من کد لازم براي ساخت نرمال يکي از اين face ها را نوشته ام :

Cube2(0) = CreateVertex(-1, -1, 1, 0, 0, 0, 0, 0)x
Cube2(1) = CreateVertex(1, 1, 1, 0, 0, 0, 1, 1)x
Cube2(2) = CreateVertex(-1, 1, 1, 0, 0, 0, 0, 1)x
vN = GenerateTriangleNormals(Cube2(0), Cube2(1), Cube2(2))x
Cube2(0).nx = vN.X: Cube2(0).ny = vN.Y: Cube2(0).nz = vN.Z
Cube2(1).nx = vN.X: Cube2(1).ny = vN.Y: Cube2(1).nz = vN.Z
Cube2(2).nx = vN.X: Cube2(2).ny = vN.Y: Cube2(2).nz = vN.Z

براي برپا سازي نور ابتدا بايستي يک material به device خود اضافه کنيد :

Dim Mtrl As D3DMATERIAL8, Col As D3DCOLORVALUE
Col.a = 1: Col.r = 1: Col.g = 1: Col.b = 1
Mtrl.Ambient = Col
Mtrl.diffuse = Col
D3DDevice.SetMaterial Mtrl

سپس بايستي طوري device خود را تنظيم کنيد که نور شما را بشناسد - lights يک شي از نوع D3DLight8 است - يکبار که اين خط را بنويسيد مي توانيد از نور استفاده کنيد اما اگر خصوصيات نور را تغيير دهيد بايستي دوباره اين دستور را فراخواني کنيد :

D3DDevice.SetLight 0, Lights

حال بايد نور را روشن کنيد :

D3DDevice.LightEnable 0, 1

و در پايان بايد به Direct3D بگوئيد که نورپردازي را براي شما انجام دهد :

D3DDevice.SetRenderState D3DRS_LIGHTING, 1

چگونگي ايجاد يک نور : براي ايجاد هر يک از ۴ نوع اصلي نور بايد به روشي خاص عمل کنيد :
۱ - نورپردازي Ambient : اين نوع نورپردازي بسيار ساده است و تنها با فراخواني تابع SetRenderState ايجاد مي شود . رنگ ambient يک عدد هگزادسيمال بصورت RRGGBB است :

D3DDevice.SetRenderState D3DRS_AMBIENT, &H202020

۲ - نورپردازي Directional : داراي دو پارامتر رنگ و جهت مي باشد :

Lights.Type = D3DLIGHT_DIRECTIONAL
Lights.diffuse.r = 1
Lights.diffuse.g = 1
Lights.diffuse.b = 1
Lights.Direction = MakeVector(0, -1, 0)x

3 - نورپردازي Point : داراي سه پارامتر موقعيت ، رنگ و تضعيف مي باشد :

Lights.Type = D3DLIGHT_POINT
Lights.position = MakeVector(5, 0, 2)x
Lights.diffuse.b = 1
Lights.Range = 100
Lights.Attenuation1 = 0.05

۴ - نورپردازي Spot : اين نور داراي دو مخروط است که نقاط خارج مخروط اول روشنتر از نقاط داخل آن هستند . دو زاويه براي مخروط وجود دارد - زاويه داخلي theta و زاويه خارجي phi - که برحسب راديان هستند :

Lights.Type = D3DLIGHT_SPOT
Lights.position = MakeVector(-4, 0, 0)x
Lights.Range = 100
Lights.Direction = MakeVector(1, 0, 0)x
Lights.Theta = 30 * (Pi / 180)x
Lights.Phi = 50 * (Pi / 180)x
Lights.diffuse.g = 1
Lights.Attenuation1 = 0.05

موضوع : استفاده از Index Buffer براي ذخيره سازي اشکال سه بعدي

مقدمه : مکعبي که در درسهاي قبلي ساختيم را درنظر بگيريد . با دانشي که اکنون داريد ، دو راه براي ساخت يک مکعب داريم : ۱ - استفاده از 36 عدد vertex براي تعريف face هاي مکعب ۲ - ساخت مکعب با استفاده از يک مدلساز و ذخيره آن با فرمت X
روش اول غيرکارامد است زيرا شما بايستي از تعداد زيادي vertex براي يک شکل بسيار ساده استفاده کنيد . روش دوم مناسب است اما زمانيکه بخواهيم رنگها و بافتها را تغيير دهيم دچار مشکل خواهيم شد . روش جديدي که امروز در مورد آن صحبت مي کنم استفاده ار Index Buffer است .
Index Buffer شامل يکسري عدد integer است که اين اعداد مرجعي براي vertex هاي ذخيره شده در يک Vertex Buffer هستند . براي مثال فرض کنيد يک Vertex Buffer شامل 8 عدد vertex داريم که يک مکعب را براي ما توصيف مي کند . ما مي توانيم يک Index Buffer با ۳۶ عضو بسازيم بطوريکه ترتيب اتصال vertex ها را براي ما مشخص کنند . مثلاً Index هاي ۰ و ۱و ۳ براي مشخص کردن face شماره ۱ مکعب بکار مي روند . بنابراين بجاي استفاده از ۳۶ عدد vertex مي توانيم مکعب را با ۸ عدد vertex و يک Index Buffer بسازيم .
گرچه استفاده از Index Buffer بسيار کارامد است اما چندين محدوديت در استفاده از آن وجود دارد . مهمترين آنها اينست که تمام انديسهايي که يک vertex مشابه را share مي کنند بايستي خصوصيات مشابهي داشته باشند - موقعيت ، رنگ ، بافت و نرمال يکسان - براي مثال نمي توانيد مکعبي بسازيد که هر face آن يک رنگ داشته باشد .

ساخت Index Buffer : ابتدا به متغيرهاي زير نياز داريم :

Dim VBuffer as Direct3DVertexBuffer8
Dim IBuffer as Direct3DIndexBuffer8
Dim Vlist(0 to 7) as LITVERTEX
Dim Ilist(0 to 35) as Integer

تابع InitGeometry بصورت زير بازنويسي مي شود:
۱- توليد هشت vertex براي مکعب :

Vlist(0) = CreateLitVertex(-1, -1, -1, &HFF0000, 0, 0, 0)x
Vlist(1) = CreateLitVertex(-1, 1, -1, &HFF00&, 0, 0, 0)x
Vlist(2) = CreateLitVertex(1, -1, -1, &HFF&, 0, 0, 0)x
Vlist(3) = CreateLitVertex(1, 1, -1, &HFF00FF, 0, 0, 0)x
Vlist(4) = CreateLitVertex(-1, -1, 1, &HFFFF00, 0, 0, 0)x
Vlist(5) = CreateLitVertex(-1, 1, 1, &HFFFF, 0, 0, 0)x
Vlist(6) = CreateLitVertex(1, -1, 1, &HFFCC00, 0, 0, 0)x
Vlist(7) = CreateLitVertex(1, 1, 1, &HFFFFFF, 0, 0, 0)x

۲ - ايجاد Vertex Buffer توسط تابع CreateVertexBuffer :

Set VBuffer = D3DDevice.CreateVertexBuffer(Len(Vlist(0)) * 8, 0, Lit_FVF, D3DPOOL_DEFAULT)x
D3DVertexBuffer8SetData VBuffer, 0, Len(Vlist(0)) * 8, 0, Vlist(0)x

۳ - توليد index ها :

front '
Ilist(0) = 0: Ilist(1) = 1: Ilist(2) = 2
Ilist(3) = 1: Ilist(4) = 3: Ilist(5) = 2
Right '
Ilist(6) = 2: Ilist(7) = 3: Ilist(8) = 6
Ilist(9) = 3: Ilist(10) = 7: Ilist(11) = 6
Back '
Ilist(12) = 6: Ilist(13) = 7: Ilist(14) = 4
Ilist(15) = 7: Ilist(16) = 5: Ilist(17) = 4
Left '
Ilist(18) = 4: Ilist(19) = 5: Ilist(20) = 0
Ilist(21) = 5: Ilist(22) = 1: Ilist(23) = 0
Top '
Ilist(24) = 1: Ilist(25) = 5: Ilist(26) = 3
Ilist(27) = 5: Ilist(28) = 7: Ilist(29) = 3
Bottom '
Ilist(30) = 2: Ilist(31) = 6: Ilist(32) = 0
Ilist(33) = 6: Ilist(34) = 4: Ilist(35) = 0

۴ - ايجاد Index Buffer توسط تابع CreateIndexBuffer :

Set IBuffer = D3DDevice.CreateIndexBuffer(Len(Ilist(0)) * 36, 0, D3DFMT_INDEX16, D3DPOOL_DEFAULT)x
D3DIndexBuffer8SetData IBuffer, 0, Len(Ilist(0)) * 36, 0, Ilist(0)x

تابع Render : براي رندر کردن اين مکعب دو روش وجود دارد :
۱ - استفاده از تابع DrawIndexedPrimitive : در اين روش از VBuffer و IBUffer و آرايه vertex ها استفاده مي شود :

Public Sub Render()x
D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, 0, 1#, 0
D3DDevice.BeginScene
D3DDevice.SetStreamSource 0, VBuffer, Len(Vlist(0))x
D3DDevice.SetIndices IBuffer, 0
D3DDevice.DrawIndexedPrimitive D3DPT_TRIANGLELIST, 0, 36, 0, 12
D3DDevice.EndScene
D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal 0
End Sub

۲ - استفاده از تابع DrawIndexedPrimitiveUP : در اين روش از آرايه هاي vertex و index استفاده مي شود :

Public Sub Render()x
D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, 0, 1#, 0
D3DDevice.BeginScene
D3DDevice.DrawIndexedPrimitiveUP D3DPT_TRIANGLELIST, 0, 8, 12, Ilist(0), D3DFMT_INDEX16, Vlist(0), Len(Vlist(0))x
D3DDevice.EndScene
D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal 0
End Sub

موضوع : Vertex/Mesh Animation
در اين درس در مورد روشهاي ساخت انيميشن در Direct3D صحبت خواهيم کرد . انيميشن در فضاي سه بعدي در حالتهاي مختلفي مي تواند ايجاد شود که بسته به engine گرافيکي شما و ابزارهايي که ايجاد کرده ايد ، دارد . سه روش اصلي ساخت انيميشن وجود دارد که عبارتند از :
- Tween سازي دستي / درون يابي خطي ( manual tweening/linear interpolation )
- درون بابي برداري ( vector interpolation )
- درون يابي بر اساس فريم کليدي ( keyframe interpolation )

1 – روش اول يکي از ساده ترين راههاي ساخت انيميشن است . اين روش در زمانيکه با مدلهاي پيچيده سر و کار داريد مناسب نيست – و يا مدلهايي با تعداد زيادي vertex – اين روش نوعي tween کردن است که از مزيت index buffer ها استفاده مي کند .
درون يابي ، چگونگي تغييرات شيي در طول يک زمان مشخص مي باشد . در درسهاي قبلي شما درون يابي رنگ را روي يک شي ديديد که در آن يک رنگ بطور ملايم به رنگ ديگري تبديل مي شد ( fadeشدن ( . درون يابي خطي نيز مشابه آن است . براي درون يابي خطي از موقعيت A به موقعيت B از فرمول زير استفاده مي شود :
(B*V)+A*(1-V)
که A و B مختصاتهاي مبدا و مقصد هستند و V ضريب درون يابي است که عددي بين صفر و يک مي باشد . اين فرمول مختصات نقطه tween را در هر لحظه مشخص مي کند .
همانطور که مي بينيد بکار بردن اين فرمول براي يک شي با تعداد زيادي vertex بسيار وقت گير بوده و fram rate را پايين مي آورد .
تابع زير دو vertex و يک مقدار ضريب درون يابي را مي گيرد تا نقطه tween را محاسبه کند :

Private Function TweenVertices(Source As LITVERTEX, Dest As LITVERTEX, TweenAmount As Single) As LITVERTEX
TweenVertices.X = (Dest.X * TweenAmount) + Source.X * (1# - TweenAmount)x
TweenVertices.Y = (Dest.Y * TweenAmount) + Source.Y * (1# - TweenAmount)x
TweenVertices.Z = (Dest.Z * TweenAmount) + Source.Z * (1# - TweenAmount)x
TweenVertices.color = Source.color
End Function

اگر شما از vertex هاي UNLIT استفاده کنيد – vertex هايي با بردار نرمال – در اينصورت بايد کد فوق را تغيير دهيد و بايد tween را از نرمال مبدا به نرمال مقصد نيز انجام دهيد .
همانطور که مي بينيد رنگ tween vertex نيز تنظيم شده است . در يک تابع tweening مناسبتر مي توانيد رنگها ، مختصات بافت و مقادير specular را نيز tween کنيد .
محدوديتي که اين روش دارد اينست که خطي است و براي مدل کردن حرکتهاي غير خطي درست کار نمي کند .
حال مي خواهيم از تابع tween استفاده کنيم تا يک مکعب را در يک انيميشن به يک هرم تبديل کنيم . ابتدا سه شي را بصورت زير تعريف مي کنيم :

در ابتداي انيميشن ، شي current cube همان source cube است’
CubeVertices(0) = CreateLitVertex(-1, -1, -1, &HFF0000, 0, 0, 0)x
CubeVertices(1) = CreateLitVertex(-1, 1, -1, &HFF00&, 0, 0, 0)x
CubeVertices(2) = CreateLitVertex(1, -1, -1, &HFF&, 0, 0, 0)x
CubeVertices(3) = CreateLitVertex(1, 1, -1, &HFF00FF, 0, 0, 0)x
CubeVertices(4) = CreateLitVertex(-1, -1, 1, &HFFFF00, 0, 0, 0)x
CubeVertices(5) = CreateLitVertex(-1, 1, 1, &HFFFF, 0, 0, 0)x
CubeVertices(6) = CreateLitVertex(1, -1, 1, &HFFCC00, 0, 0, 0)x
CubeVertices(7) = CreateLitVertex(1, 1, 1, &HFFFFFF, 0, 0, 0)x
مکعب اوليه’
CubeVerticesSource(0) = CreateLitVertex(-1, -1, -1, &HFF0000, 0, 0, 0)x
CubeVerticesSource(1) = CreateLitVertex(-1, 1, -1, &HFF00&, 0, 0, 0)x
CubeVerticesSource(2) = CreateLitVertex(1, -1, -1, &HFF&, 0, 0, 0)x
CubeVerticesSource(3) = CreateLitVertex(1, 1, -1, &HFF00FF, 0, 0, 0)x
CubeVerticesSource(4) = CreateLitVertex(-1, -1, 1, &HFFFF00, 0, 0, 0)x
CubeVerticesSource(5) = CreateLitVertex(-1, 1, 1, &HFFFF, 0, 0, 0)x
CubeVerticesSource(6) = CreateLitVertex(1, -1, 1, &HFFCC00, 0, 0, 0)x
CubeVerticesSource(7) = CreateLitVertex(1, 1, 1, &HFFFFFF, 0, 0, 0)x
هرم مقصد’
CubeVerticesDest(0) = CreateLitVertex(-1, -1, -1, &HFF0000, 0, 0, 0)x
CubeVerticesDest(1) = CreateLitVertex(-0.1, 1, -0.1, &HFF00&, 0, 0, 0)x
CubeVerticesDest(2) = CreateLitVertex(1, -1, -1, &HFF&, 0, 0, 0)x
CubeVerticesDest(3) = CreateLitVertex(0.1, 1, -0.1, &HFF00FF, 0, 0, 0)x
CubeVerticesDest(4) = CreateLitVertex(-1, -1, 1, &HFFFF00, 0, 0, 0)x
CubeVerticesDest(5) = CreateLitVertex(-0.1, 1, 0.1, &HFFFF, 0, 0, 0)x
CubeVerticesDest(6) = CreateLitVertex(1, -1, 1, &HFFCC00, 0, 0, 0)x
CubeVerticesDest(7) = CreateLitVertex(0.1, 1, 0.1, &HFFFFFF, 0, 0, 0)x

حال بايد در يک حلقه با استفاده از تابع twen پيکسلهاي CubeVertices را update کنيم :

Private Sub UpdateAnimation()x
Dim I As Integer
به روز کردن پارامترهاي زمان و جهت'
If AnimTweenDir = True Then
AnimTweenFactor = AnimTweenFactor + (((GetTickCount() - LastTimeTweened) / 1000)*1#)
LastTimeTweened = GetTickCount
If AnimTweenFactor >= 1# Then
AnimTweenFactor = 1#
AnimTweenDir = False
End If
Else
AnimTweenFactor = AnimTweenFactor - (((GetTickCount() - LastTimeTweened) / 1000)*1#)
LastTimeTweened = GetTickCount
If AnimTweenFactor <= 0# Then
AnimTweenFactor = 0#
AnimTweenDir = True
End If
End If
به روز کردن اطلاعات vertex ها '
For I = 0 To 7
CubeVertices(I) = TweenVertices(CubeVerticesSource(I), CubeVerticesDest(I), AnimTweenFactor)x
Next I
به روز کردن بافر vertex’
If D3DVertexBuffer8SetData(VBuffer, 0, Len(CubeVertices(0)) * 8, 0, CubeVertices(0)) = D3DERR_INVALIDCALL Then GoTo Error:
Exit Sub
Error:
Debug.Print “Error occured whilst updating the animation…”x
End Sub

زمان پايه انيميشن توسط عبارت زير تنظيم مي شود :
(((GetTickCount() - LastTimeTweened) / 1000) * 1#)
همانطور که مي دانيد دو نوع انيميشن وجود دارد : انيميشن بر مبناي frame و انيميشن بر مبناي زمان . در انيميشن بر مبناي frame شماره فريم با يک مقدار ثابت در زمان افزايش مي يابد اما اگر اينکار باعث مي شود کيفيت انيميشن در کامپيوترهاي با سرعت متفاوت تغيير کند . بنابراين انيميشن را بر مبناي زمان توليد کرده ايم . انيميشن هاي بر مبناي زمان بجاي " 1 فريم در هر سيکل " ، " 30 فريم در هر ثانيه " هستند .

2 – روش دوم از توابع کتابخانه D3DX براي انجام عمل tweening استفاده مي کند و بنابراين بهبودي در سرعت انيميشن نسبت به روش بالا حاصل مي شود . با استفاده از کتابخانه D3DX مي توانيم عمل درون يابي خطي را براي تمام اجزا اصلي يک vertex انجام دهيم . ليست زير توابعي را براي اينکار نشان مي دهد :
- تابع D3DXVec3Lerp : انجام درون يابي براي موقعيت و نرمال :

D3DXVec3Lerp( VOut as D3DVECTOR, V1 as D3DVECTOR, V2 as D3DVECTOR, S as Single)x
- VOut = The result of the interpolation
- V1 = The source coordinates
- V2 = The destination coordinates
- S = The interpolation amount - between, but not limited to, 0.0 - 1.0 scale; where 0 is the source and 1 is the destination

- تابع D3DXColorLerp : انجام درون يابي براي رنگهاي vertex :

D3DXColorLerp( COut as D3DCOLORVALUE, C1 as D3DCOLORVALUE, C2 as D3DCOLORVALUE, S as Single)x
- COut = The resulting colour
- C1 = The source colour
- C2 = The destination colour
- S = The interpolant,

on a 0.0 to 1.0 scale
- تابع D3DXVec2Lerp : انجام درون يابي براي مختصاتهاي دوبعدي :

- VOut = The result of this interpolation
- V1 = The source coordinates
- V2 = The destination coordinates
- S = The interpolant on a 0.0 to 1.0 scale

- تابع D3DXVec3Hermite : توليد يک مسير منحني که از دو نقطه کنترل عبور مي کند :

D3DXVec3Hermite( VOut as D3DVECTOR, V1 as D3DVECTOR, T1 as D3DVECTOR, V2 as D3DVECTOR, T2 as D3DVECTOR, S as Single)x
- VOut = The Result
- V1 = The Source Coordinate
- T1 = The Tangent at the Source coordinate, this is the direction and speed the line will leave the source point.
- V2 = The Destination Coordinate
- T2 = The Tangent at the Destination coordinate, this is the direction and speed the line will enter the destination point.
- S = The Interpolant Value

براي اينکه بتوانيم از کتابخانه D3DX استفاده کنيم بايد توصيف vertex هايمان را تغيير دهيم و بايستي يکسري مقادير ARGB اضافي را به ساختار vertex اضافه کنيم :

Private Type LITVERTEX
X As Single
Y As Single
Z As Single
color As Long
specular As Long
tu As Single
tv As Single
ColorEx As D3DCOLORVALUE
End Type

حال تابع tween را بصورت زير مي نويسيم :

Private Function TweenVertices(Source As LITVERTEX, Dest As LITVERTEX, TweenAmount As Single) As LITVERTEX
Dim vResult As D3DVECTOR
Dim vResult2 As D3DVECTOR2
Tween کردن موقعيت vertex ها ‘
D3DXVec3Lerp vResult, MakeVector(Source.X, Source.Y, Source.Z), MakeVector(Dest.X, Dest.Y, Dest.Z), TweenAmount
TweenVertices.X = vResult.X
TweenVertices.Y = vResult.Y
TweenVertices.Z = vResult.Z
Tween کردن اطلاعات texture ’
D3DXVec2Lerp vResult2, MakeVector2D(Source.tu, Source.tv), MakeVector2D(Dest.tu, Dest.tv), TweenAmount
TweenVertices.tu = vResult2.X
TweenVertices.tv = vResult2.Y
Tween کردن اطلاعات رنگ ‘
D3DXColorLerp TweenVertices.ColorEx, Source.ColorEx, Dest.ColorEx, TweenAmount
With TweenVertices.ColorEx
TweenVertices.color = RGB(.B * 255, .G * 255, .R * 255)x
End With
End Function

نکته اي که بايد به آن توجه کنيد اينست که در تابع فوق براي اشاره به vertex ، يک بردار ساخته شده است ( توسط تابع MakeVector ) .

3 – روش سوم پر استفاده ترين روش انيميشن سازي است . اگر شما انيميشن هاي پيچيده با تعداد زيادي شي در آن داشته باشيد و اگر بخواهيد تغييرات اشيا را در هر فريم ذخيره کنيد ، به حجم بالايي از منابع ذخيره سازي نياز است . بجاي آن ما با استفاده از يکسري فريم کليدي ، فريمهاي مياني را پيش بيني مي کنيم .
براي انجام درون يابي فريم کليدي ، بايستي مقدار vertex را در هر فريم کليدي بدانيم و نيز بدانيم هر فريم کليدي در چه زماني ظاهر مي شود . بنابراين بايد براي هر انيميشن چند فايل را بعنوان فريم کليدي ذخيره کنيم .
در اين درس ما داده هاي کليدي انيميشن را از يکسري فايل load مي کنيم بنابراين تمام ثابتهاي زمان keyframe درون برنامه قرار داده مي شود ( شما مي توانيد خودتان يک ماژول بنويسيد که انيميشن هاي عمومي تر را نيز مديريت کند . اين ماژول بايد قادر باشد که يک فرمت استاندارد فايل را import کند ، اشيا و texture هاي مربوطه را load نمايد و سپس خودش ساخت انيميشن را بطور اتوماتيک انجام دهد و برنامه اصلي فقط روتين render و يا update را فراخواني کند ) . پس از جمع آوري اطلاعات فريم هاي کليدي ، بايد در هر زمان محاسبه کنيم که چه مدتي از شروع انيميشن گذشته است و بنابراين انيميشن در چه موقعيتي قرار دارد . سپس محاسبه مي کنيم که فريم کليدي قبلي و فريم کليدي بعدي چيست همچنين حساب مي کنيم در چه فاصله زماني از ايندو قرار داريم . سرانجام يک درون يابي نرمال را انجام مي دهيم تا اطلاعات فريم جاري بدست آيد و اين اطلاعات را درون يک شي Mesh مي گذاريم و آنرا رندر مي کنيم .
در درسهاي قبلي در مورد load کردن اشيا از يک فايل X صحبت کردم اما در مورد چگونگي گرفتن اطلاعات vertex از يک شي Mesh صحبت نشد . کتابخانه D3DX براي اينکار دو تابع دارد :
- تابع D3DXMeshVertexBuffer8GetData : اطلاعات يک شي D3DXMesh را گرفته و در يک آرايه از D3DVERTEX ذخيره مي کند :

D3DXMeshVertexBuffer8GetData( D3DXMeshobj As Unknown, Offset As Long, Size As Long, Flags As Long, Data As Any) As Long
- D3DXMeshobj As Unknown = A D3DXMESH object that you want to extract the data from.
- Offset As Long = How far into the vertex buffer we want to start reading, 0 is the beginning
- Size As Long = Size of the vertex buffer, this will be Len(D3DVERTEX) * Mesh.GetNumVertices
- Flags As Long = A combination of the CONST_D3DLOCKFLAGS, leave as 0.
- Data As Any = The first element in the array that you want the data to be read into, should be an array of D3DVERTEX vertices
- Return Code As Long = Returns D3D_OK for success, or either of D3DERR_INVALIDCALL or E_INVALIDARG for an error

- تابع D3DXMeshVertexBuffer8SetData : اطلاعات يک بافر vertex را در يک شي D3DXMesh قرار مي دهد :

D3DXMeshVertexBuffer8SetData( D3DXMeshobj As Unknown, Offset As Long, Size As Long, Flags As Long, Data As Any) As Long
- D3DXMeshobj As Unknown = The D3DXMESH object that defines where you want the data to be placed
- Offset As Long = How far into the Destination vertex buffer you want to place the data
- Size As Long = The Size of the buffer in bytes, this will be Len(D3DVERTEX) * Mesh.GetNumVertices
- Flags As Long = A Combination of the CONST_D3DLOCKFLAGS, leave as 0
- Data As Any = The first element in the array of data you want placed in the mesh's vertex buffer
- Return Code As Long = D3D_OK for success or D3DERR_INVALIDCALL or E_INVALIDARG for failure

عمليات انجام انيميشن فريم کليدي بصورت زير است :
- load کردن اشيا از فايلهاي X به درون شي D3DXMesh
- استخراج اطلاعات vertex از اين شي
- انجام درون يابي بين فريمهاي کليدي
- قرار دادن اطلاعات vertex هاي درون يابي در يک شي D3DXMesh
فرض مي کنيم که انيميشن ما هميشه از زمان صفر تا زمان n باشد – برحيب ميلي ثانيه – بنابراين مي توانيم از GetTickCount براي توابع زماني خود استفاده کنيم . همچنين يک ساختار را براي هر فريم کليدي بصورت زير تعريف مي کنيم :

Private Type KeyFrame
شي load شده از يک فايل’ Mesh As D3DXMesh
آرايه material براي هر شي’ MatList() As D3DMATERIAL8
آرايه Texture’ TexList() As Direct3DTexture8
تعداد material ها و texture هايي که استفاده مي کنيم’ nMaterials As Long
داده هاي vertex براي اين فريم کليدي’ VertexList() As D3DVERTEX
موقعيت اين فريم کليدي در انيميشن’ TimeIndex As Long
End Type

حال بايد تابعي بنويسيم که اطلاعات را از يک فايل X استخراج کرده و درون فريم کليدي قرار دهد :

Private Function CreateKeyFrameFromFile(Filename As String, TexturePrefix As String, Time As Long) As KeyFrame
نام فايل X براي شي سه بعدي: Filename ’
پوشه اي که اطلاعات texture اين شي در آن قرار دارد : TexturePrefix ’
انديس زمان براي اين فريم کليدي : Time '
Dim I As Long
Dim XBuffer As D3DXBuffer
Dim TextureFile As String
Dim hResult As Long
'خواندن اطلاعات از فايل ورودي به حافظه
Set CreateKeyFrameFromFile.Mesh = D3DX.LoadMeshFromX(Filename, D3DXMESH_MANAGED, D3DDevice, Nothing, XBuffer, CreateKeyFrameFromFile.nMaterials)x
توليد material ها و texture ها ‘
ReDim CreateKeyFrameFromFile.MatList(CreateKeyFrameFromFile.nMaterials) As D3DMATERIAL8
ReDim CreateKeyFrameFromFile.TexList(CreateKeyFrameFromFile.nMaterials) As Direct3DTexture8
For I = 0 To CreateKeyFrameFromFile.nMaterials - 1
D3DX.BufferGetMaterial XBuffer, I, CreateKeyFrameFromFile.MatList(I)x
CreateKeyFrameFromFile.MatList(I).Ambient = CreateKeyFrameFromFile.MatList (I).diffuse
TextureFile = D3DX.BufferGetTextureName(XBuffer, I)x
If TextureFile <> "" Then
Set CreateKeyFrameFromFile.TexList(I) = D3DX.CreateTextureFromFileEx(D3DDevice, TexturePrefix & TextureFile, D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED,
D3DX_FILTER_LINEAR, D3DX_FILTER_LINEAR, 0, ByVal 0, ByVal 0)x
End If
Next I
استخراج داده هاي vertex’
ReDim CreateKeyFrameFromFile.VertexList(CreateKeyFrameFromFile.Mesh.GetNumVertices) As D3DVERTEX
hResult = D3DXMeshVertexBuffer8GetData(CreateKeyFrameFromFile.Mesh, 0, Len(CreateKeyFrameFromFile.VertexList(0)) * reateKeyFrameFromFile.Mesh.GetNumVertices, 0, CreateKeyFrameFromFile.VertexList(0))
CreateKeyFrameFromFile.TimeIndex = Time
End Function

در تابع Initialize خطوط زير را براي ساخت فريم هاي کليدي اضافه مي کنيم :

nKeyFrames = 4
kfAnimLength = 2500
AnimLastStartAt = GetTickCount()x
ReDim kfAnim(nKeyFrames - 1) As KeyFrame
kfAnim(0) = CreateKeyFrameFromFile(App.Path & "\frame0.x", App.Path & "\", 0)x
kfAnim(1) = CreateKeyFrameFromFile(App.Path & "\frame1.x", App.Path & "\", kfAnimLength * (1 / 3))x
kfAnim(2) = CreateKeyFrameFromFile(App.Path & "\frame2.x", App.Path & "\", kfAnimLength * (2 / 3))x
kfAnim(3) = CreateKeyFrameFromFile(App.Path & "\frame3.x", App.Path & "\", kfAnimLength)x
kfCurrent = CreateKeyFrameFromFile(App.Path & "\frame0.x", App.Path & "\", 0)

دقت کنيد که از يک انديس زمان براي ساخت فريم هاي کليدي استفاده شده است .
حال بايد کدي براي نمايش دادن انيميشن بنويسيم . ابتدا بايد به روشي تغييرات فريمها را کنترل کنيم :

For I = 0 To nKeyFrames - 2
If CurrentTimeIndex >= kfAnim(I).TimeIndex Then
PrevFrame = I
NextFrame = I + 1
End If
Next I

سپس بايد با توجه به زمان index دو فريم کليدي و زمان جاري ، پارامتر درون يابي را محاسبه کنيم :

sTime = kfAnim(PrevFrame).TimeIndex
eTime = kfAnim(NextFrame).TimeIndex
cTime = CurrentTimeIndex
eTime = eTime - sTime
cTime = cTime - sTime
sTime = sTime - sTime
InterpolateAmount = cTime / eTime

سپس بايد بر اساس اين پارامتر عمل درون يابي را روي داده هاي vertex انجام دهيم :

For I = 0 To kfCurrent.Mesh.GetNumVertices
'درون يابي مختصاتها
D3DXVec3Lerp vTemp3D, MakeVector(kfAnim(PrevFrame).VertexList(I).X, kfAnim(PrevFrame).VertexList(I).Y, _
kfAnim(PrevFrame).VertexList(I).Z), MakeVector(kfAnim(NextFrame).VertexList(I).X, kfAnim(NextFrame).VertexList(I).Y, _
kfAnim(NextFrame).VertexList(I).Z), InterpolateAmount
kfCurrent.VertexList(I).X = vTemp3D.X
kfCurrent.VertexList(I).Y = vTemp3D.Y
kfCurrent.VertexList(I).Z = vTemp3D.Z

'درون يابي نرمالها
D3DXVec3Lerp vTemp3D, MakeVector(kfAnim(PrevFrame).VertexList(I).nx, kfAnim(PrevFrame).VertexList(I).ny, _
kfAnim(PrevFrame).VertexList(I).nz), MakeVector(kfAnim(NextFrame).VertexList(I).nx, kfAnim(NextFrame).VertexList(I).ny, _
kfAnim(NextFrame).VertexList(I).nz), InterpolateAmount
kfCurrent.VertexList(I).nx = vTemp3D.X
kfCurrent.VertexList(I).ny = vTemp3D.Y
kfCurrent.VertexList(I).nz = vTemp3D.Z

'درون يابي اطلاعات بافت
D3DXVec2Lerp vTemp2D, MakeVector2D(kfAnim(PrevFrame).VertexList(I).tu, kfAnim(PrevFrame).VertexList(I).tv), _
MakeVector2D(kfAnim(NextFrame).VertexList(I).tu, kfAnim(NextFrame).VertexList(I).tv), InterpolateAmount
kfCurrent.VertexList(I).tu = vTemp2D.X
kfCurrent.VertexList(I).tv = vTemp2D.Y
Next I

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

hResult = D3DXMeshVertexBuffer8SetData(kfCurrent.Mesh, 0, Len(kfCurrent.VertexList(0)) * kfCurrent.Mesh.GetNumVertices, 0, kfCurrent.VertexList(0))x

با استفاده از روش فوق مي توانيد هر تعداد فريم کليدي را به انيميشنتان اضافه کنيد . اشکالي که روش فوق دارد اينست که اطلاعات texture براي تمام فريمهاي کليدي جداگانه ذخيره شده است در حاليکه texture در تمام فريمها ثابت است . در درسهاي بعدي از روشي بنام texture pooling استفاده مي کنيم تا تنها يک کپي از texture ها نگهداري کنيم .

لينک مقاله
http://sheidaian.persianblog.com :منبع

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


API هاي ويندوز و طرز استفاده آنها در وی بی
امروز قصد دارم در مورد API هاي ويندوز و چگونگي استفاده از آنها در ويژوال بيسيک بطور خلاصه توضيح دهم و همچنين دو مثال پراستفاده را نيز در اين زمينه بيان کنم که عبارتند از چگونگي پخش فايلهاي Wav و ساخت يک تايمر با دقت بالا :

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

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

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

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

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

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

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

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

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

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

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

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

همچنين از تابع GetTickCount مي توان براي benchmark برنامه ها استفاده کرد . بعبارت ديگر مي توان زمان اجراي يکسري دستورات خاص را بدست آورد .
لينک مقاله
http://sheidaian.persianblog.com :منبع

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4

رجيستري چيست ؟
سيستم عامل ويندوز تنظيمات سخت افزاري و نرم افزاري خود را بطور مرکزي در يک بانک اطلاعاتي با ساختار سلسله مراتبي ذخيره مي کند که رجيستري نام دارد . رجيستري جايگزيني براي بسياري از فايلهاي پيکربندي 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 وارد کنيد .
---------------------

براي کار با رجيستري در ويژوال بيسيک کلاس Registery.bas را مطابق مطالب زير ايجاد کرده و در پروژه هاي خود از آن استفاده کنيد :

1 - تعريف ثابتهاي مورد نياز : براي نوشتن اين کلاس نياز به تعريف چهار دسته ثابت داريم :

- ثابتهاي مربوط به تعريف data type هاي entry هاي رجيستري :

Global Const REG_SZ As Long = 1
Global Const REG_DWORD As Long = 4

- ثابتهاي مربوط به تعريف key هاي رجيستري

Global Const HKEY_CLASSES_ROOT = &H80000000
Global Const HKEY_CURRENT_USER = &H80000001
Global Const HKEY_LOCAL_MACHINE = &H80000002
Global Const HKEY_USERS = &H80000003

- ثابتهاي مربوط به خطاهاي کار با رجيستري

Global Const ERROR_NONE = 0
Global Const ERROR_BADDB = 1
Global Const ERROR_BADKEY = 2
Global Const ERROR_CANTOPEN = 3
Global Const ERROR_CANTREAD = 4
Global Const ERROR_CANTWRITE = 5
Global Const ERROR_OUTOFMEMORY = 6
Global Const ERROR_INVALID_PARAMETER = 7
Global Const ERROR_ACCESS_DENIED = 8
Global Const ERROR_INVALID_PARAMETERS = 87
Global Const ERROR_NO_MORE_ITEMS = 259

- ثابتهاي متفرقه

Global Const KEY_ALL_ACCESS = &H3F
Global Const REG_OPTION_NON_VOLATILE = 0

2 - Declare کردن Api هاي مورد نياز : براي کار با رجيستري از توابع کتابخانه Advapi32.dll استفاده مي کنيم . اين توابع عبارتند از :

- تابع RegCloseKey : آزاد کردن handle مربوط به يک key

Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long

- تابع RegCreateKeyEx : ساخت يک key در رجيستري ( اگر key قبلاً وجود داشته باشد ، اين تابع آنرا باز مي کند ) :

Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias "RegCreateKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, ByVal lpClass As String, ByVal dwOptions As Long, ByVal samDesired As Long, ByVal lpSecurityAttributes As Long, phkResult As Long, lpdwDisposition As Long) As Long

- تابع RegOpenKeyEx : باز کردن يک key

Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long

- تابع RegQueryValueExLong : استخراج type و data ي يک نام متناظر با يک key باز شده

Declare Function RegQueryValueExString Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, ByVal lpData As String, lpcbData As Long) As Long

Declare Function RegQueryValueExLong Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Long, lpcbData As Long) As Long

Declare Function RegQueryValueExNULL Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, ByVal lpData As Long, lpcbData As Long) As Long

- تابع RegSetValueEx : ذخيره يک مقدار در فيلد value يک کليد باز

Declare Function RegSetValueExString Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, ByVal lpValue As String, ByVal cbData As Long) As Long

Declare Function RegSetValueExLong Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpValue As Long, ByVal cbData As Long) As Long

- تابع RegDeleteKey : پاک کردن يک کليد و کليه اطلاعات مرتبط با آن

Private Declare Function RegDeleteKey& Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String)

- تابع RegDeleteValue : حذف مقدار يک key

Private Declare Function RegDeleteValue& Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String)

3 - توابع کمکي : براي نوشتن توابع اصلي کار با رجيستري نياز به نوشتن توابع کمکي زير است :

- تابع SetValueEx : با توجه به نوع داده يک کليد ، مقدار موجود در آنرا در يک متغير ذخيره مي کند :

Public Function SetValueEx(ByVal hKey As Long, sValueName As String, lType As Long, vValue As Variant) As Long
Dim lValue As Long
Dim sValue As String
Select Case lType
Case REG_SZ ' type of value is string
sValue = vValue
SetValueEx = RegSetValueExString(hKey, sValueName, 0&, lType, sValue, Len(sValue))x
Case REG_DWORD ' type of value is Double word
lValue = vValue
SetValueEx = RegSetValueExLong(hKey, sValueName, 0&, lType, lValue, 4)x
End Select
End Function

- تابع QueryValueEx : سايز و نوع داده اي يک داده را که بايد خوانده شود مشخص مي کند .

Function QueryValueEx(ByVal lhKey As Long, ByVal szValueName As String, vValue As Variant) As Long
Dim cch As Long
Dim lrc As Long
Dim lType As Long
Dim lValue As Long
Dim sValue As String
lrc = RegQueryValueExNULL(lhKey, szValueName, 0&, lType, 0&, cch)x
Select Case lType
' For strings
Case REG_SZ:
sValue = String(cch, 0)x
lrc = RegQueryValueExString(lhKey, szValueName, 0&, lType, sValue, cch)x
If lrc = ERROR_NONE Then
vValue = Left$(sValue, cch)x
Else
vValue = Empty
End If
' For DWORDS
Case REG_DWORD:
lrc = RegQueryValueExLong(lhKey, szValueName, 0&, lType, lValue, cch)x
If lrc = ERROR_NONE Then vValue = lValue
Case Else
'all other data types not supported
lrc = -1
End Select
QueryValueExExit:
QueryValueEx = lrc
Exit Function
QueryValueExError:
Resume QueryValueExExit
End Function

4 - توابع اصلي : توابع مربوط به پاک کردن يک کليد از رجيستري ، ساخت يک کليد جديد در رجيستري و مقداردهي به يک کليد :

- تابع DeleteKey : اين تابع يک کليد از رجيستري را حذف مي کند . داراي دو پارامتر ورودي است :
Location که يکي از مقادير HKEY_CLASSES_ROOT ، HKEY_CURRENT_USER
، HKEY_LOCAL_MACHINE و يا HKEY_USERS است .
KeyName که نام کليدي است که بايد از رجيستري حذف شود . اين کليد ممکنست شامل subkey هايي نيز باشد مثلاً Key1\SubKey1

Public Function DeleteKey(lPredefinedKey As Long, sKeyName As String)x
Dim lRetVal As Long
lRetVal = RegDeleteKey(lPredefinedKey, sKeyName)x
DeleteKey = lRetVal ' return function value
End Function

- تابع DeleteValue : اين تابع يک entry را از کليد حذف مي کند . داراي سه پارامتر ورودي است : Location ، KeyName و ValueName که نام آن value را مشخص مي کند .

Public Function DeleteValue(lPredefinedKey As Long, sKeyName As String, sValueName As String)x
Dim lRetVal As Long
Dim hKey As Long
lRetVal = RegOpenKeyEx(lPredefinedKey, sKeyName, 0, KEY_ALL_ACCESS, hKey)x
lRetVal = RegDeleteValue(hKey, sValueName)x
RegCloseKey (hKey)x
DeleteValue = lRetVal
End Function

- تابع CreateNewKey : اين تابع يک کليد جديد ايجاد مي کند . داراي دو پارامتر ورودي است : Location و KeyName

Public Function CreateNewKey(lPredefinedKey As Long, sNewKeyName As String)x
Dim hNewKey As Long
Dim lRetVal As Long
lRetVal = RegCreateKeyEx(lPredefinedKey, sNewKeyName, 0&, vbNullString, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, 0&, hNewKey, lRetVal)x
RegCloseKey (hNewKey)x
CreateNewKey = lRetVal
End Function

- تابع SetKeyValue : اين تابع پارامتر data يک entry را تنظيم مي کند . داراي 5 پارامتر ورودي است : Location ، KeyName ، ValueName ، ValueSetting و ValueType

Public Function SetKeyValue(lPredefinedKey As Long, sKeyName As String, sValueName As String, vValueSetting As Variant, lValueType As Long)x
Dim lRetVal As Long
Dim hKey As Long
lRetVal = RegOpenKeyEx(lPredefinedKey, sKeyName, 0, KEY_ALL_ACCESS, hKey)x
lRetVal = SetValueEx(hKey, sValueName, lValueType, vValueSetting)x
RegCloseKey (hKey)x
SetKeyValue = lRetVal
End Function

- تابع QueryValue : اين تابع فيلد داده يک entry را برمي گرداند . داراي سه پارامتر ورودي است : Location ، KeyName و ValueName

Public Function QueryValue(lPredefinedKey As Long, sKeyName As String, sValueName As String)x
Dim lRetVal As Long
Dim hKey As Long
Dim vValue As Variant
lRetVal = RegOpenKeyEx(lPredefinedKey, sKeyName, 0, KEY_ALL_ACCESS, hKey)x
lRetVal = QueryValueEx(hKey, sValueName, vValue)x
QueryValue = vValue
RegCloseKey (hKey)x
End Function

--------------------------
ساخت يک انتصاب فايل يا File Association به يک برنامه

در اين درس می خواهم با استفاده از کلاسی که در درس قبل معرفی شد تابعی بسازيم که توسط آن بتوانيم فايلهای با پسوندی مشخص را به يک برنامه اختصاص دهيم . بعبارت ديگر تابعی بنويسيم که اطلاعات لازم برای باز شدن فايلهايی با پسوند xxx را توسط برنامه MyApp.exe در رجيستری ثبت کند .

Public Sub CreateAssociation(sExtension As String, sApplication As String, sAppPath As String)x
Dim sPath, sAppExe As String
CreateNewKey "." & sExtension, HKEY_CLASSES_ROOT
SetKeyValue HKEY_CLASSES_ROOT, "." & sExtension, "", sApplication & ".Document", REG_SZ
CreateNewKey sApplication & ".Document\shell\open\command", HKEY_CLASSES_ROOT
SetKeyValue HKEY_CLASSES_ROOT, sApplication & ".Document", "", sApplication & " Document", REG_SZ
sPath = sAppPath & " %1"x
sAppExe = sApplication & ".exe"x
SetKeyValue HKEY_CLASSES_ROOT, sApplication& ".Document\shell\open\command", "", sPath, REG_SZ
CreateNewKey "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\." & sExtension, HKEY_CURRENT_USER
SetKeyValue HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\." & sExtension, "Application", sAppExe, REG_SZ
CreateNewKey "Applications\" & sAppExe & "\shell\open\command", HKEY_CLASSES_ROOT
SetKeyValue HKEY_CLASSES_ROOT, "Applications\" & sAppExe & "\shell\open\command", "", sPath, REG_SZ
End Sub

کاربرد اين تابع بصورت زير است :

CreateAssociation("xxx","MyApp","c:\MyApp.exe")x

اجرا شدن يک برنامه در هنگام راه اندازی سيستم

فرض کنيد می خواهيم برنامه ای بنويسيم که هر بار در هنگام راه اندازي سيستم بطور خودكار اجرا شود. البته نمي خواهم در startup ويندوز ديده شود .
براي اين كار بايد برنامه موردنظر را در StartUp رجيستري قرار دهيم . به اين ترتيب كه در يكي از كليدهاي زير يك مقدار رشته اي جديد(String Value) ايجاد کنيم و آدرس برنامه را در آن وارد كنيم :

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

براي مثال اگه اسم برنامه مورد نظر MyApp و مسيرش C:\Windows\MyApp.exe است بايد بصورت زير عمل کرد :

SetKeyValue HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion\Run", "MyApp", "C:\MyApp.exe", REG_SZ

نکته : البته دو تا راه ديگر برای اينکار وجود دارد که برخی تروجان ها هم از اين روشها استفاده می کنند تا روی سيستم باقی بمانند :
يكي استفاده از win.ini و نوشتن نام فايل جلوي = run و ديگري استفاده از system.ini و نوشتن نام برنامه جلوي خط explorer.exe .
لينک مقاله
http://sheidaian.persianblog.com :منبع

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آموزش DirectXAudio - بخش 1و2و3و4
موضوع : پخش افکتهاي صوتی در برنامه هاي مالتي مديا

مقدمه : در سلسله مباحث DirectXAudio شما تکنيکهاي لازم براي اضافه کردن موزيک و افکتهاي صوتي سريع و ديناميک را به بازيها و برنامه هاي مالتي مديا خواهيد آموخت . DirectXAudio جايگزيني براي بخشهاي DirectSound ، DirectSound3D و DirectMusic موجود در DirectX 7 مي باشد و داراي امکانات بهتر و سريعتری بوده و برنامه نويسي آن نيز ساده تر است .
در اولين درس از DirectXAudio چگونگي پخش افکتهاي صوتي را در برنامه هايتان خواهيد آموخت .

Initial کردن DirectSound :
DirectSound اولين مبحثي است که آنرا توضيح خواهم داد . گرچه DirectXAudio يک نام عمومي براي امکانات صوتي DirectX8 مي باشد اما بين Sound و Music تفاوت وجود دارد .
DirectSound با پخش افکتهاي صوتي ارتباط دارد . DirectSound همانند Direct3D از يکسري device سخت افزاري و نرم افزاري استفاده مي کند و افکتهاي صوتي در يکسري بافر ذخيره مي شوند .
اولين قدم براي برپاسازي DirectSound ، اضافه کردن کتابخانه DirectX8 به پروژه تان مي باشد . قدم بعدي تعريف متغيرها و object هاي موردنياز است . براي استفاده از DirectSound به متغيرهاي زير نياز داريم :

Private DX As DirectX8
Private DS As DirectSound8
Private DSBuffer As DirectSoundSecondaryBuffer8
Private DSEnum As DirectSoundEnum8
Private bLoaded As Boolean

DirectX شي کنترل کننده مرکزي است . DirectSound8 واسط مراقب براي تمام interface هاي پخش صدا است . DirectSoundSecondaryBuffer8 داده audio واقعي را براي پخش ذخيره مي کند . DirectSoundEnum8 اجازه مي دهد که اطلاعاتي را در مورد device هاي سخت افزاري/نرم افزاري استخراج کنيد و متغير bLoaded يک flag وضعيت مي باشد .
حال در برنامه بايد ليست تمام device هاي در دسترس را مشخص کنيم . ( اين امر کاملاً امکان پذير است که يک کامپيوتر بيش از يک device براي DirectSound داشته باشد ) :

Private Sub Form_Load()x
bLoaded = False
Dim I As Long
Set DX = New DirectX8
Set DSEnum = DX.GetDSEnum
For I = 1 To DSEnum.GetCount
MsgBox(DSEnum.GetDescription(I))x
Next I
End Sub

فرض کنيم که يکي از device هاي شناخته شده را انتخاب کرديم . حال بايستي device را واقعاً برپا کنيم :

If bLoaded Then
Set DSBuffer = Nothing
Set DS = Nothing
Set DX = Nothing
End If
Dim DSBDesc As DSBUFFERDESC
Set DX = New DirectX8
Set DS = DX.DirectSoundCreate(DSEnum.GetGuid(devicenumber))x
DS.SetCooperativeLevel frmMain.hWnd, DSSCL_NORMAL

متغير devicenumber شماره device اي است که شما مي خواهيد با آن کار کنيد . DSBDesc فايل صوتي شما را توصيف مي کند .
--------------------------------

موضوع : پخش افکتهاي صوتی در برنامه هاي مالتي مديا

ساخت بافر و play کردن آن : تاکنون ما توانستيم DirectSound را initial کنيم . همانطور که می دانيد در تمام component های DirectX داده ها در يکسری بافر ذخيره می شوند . در مورد DirectSound نيز ما يک بافر با نام DirectSoundSecondaryBuffer8 می سازيم و داده های صوتی را در آن قرار می دهيم . برخی پارامتر ها هستند که بايد برای بافر تنظيم شوند مثل : stereo يا mono بودن بافر ، ۸ بيتی يا ۱۶ بيتی بودن بافر ، فرکانس صوتی ( 22khz ، 44khz و غيره ) . اگر اين پارامترها را مشخص نکنيم DirectSound از اطلاعات فايل صوتی استفاده می کند .
در يک کاربرد ساده ، ما تنها يک بافر صوتی از يک فايل ايجاد می کنيم اما امکان ايجاد چندين بافر بطور همزمان و نيز پخش چندين صدا بطور همزمان نيز وجود دارد :

DSBDesc.lFlags = DSBCAPS_CTRLFREQUENCY Or DSBCAPS_CTRLPAN Or DSBCAPS_CTRLVOLUME
Set DSBuffer = DS.CreateSoundBufferFromFile(App.Path & "\Sample.wav", DSBDesc)x
MsgBox "SOUND BUFFER CREATED:"x
MsgBox "Buffer Size: " & DSBDesc.lBufferBytes & "bytes (" & Round(DSBDesc.lBufferBytes / 1024, 3) & "kb)"x
MsgBox "Buffer Channel Count:" & DSBDesc.fxFormat.nChannelsIIf(DSBDesc.fxFormat.nChannels = 1, " (Mono)", " (Stereo)")x
MsgBox "Buffer Bits per channel: " & DSBDesc.fxFormat.nBitsPerSample & " bits"x

در بالا يک بافر صوتی ايجاد شده و اطلاعات صدا از فايل به بافر load شده است .
حال بايستی داده صوتی موجود در بافر را play کنيم :
دستور لازم برای Play کردن بافر بصورت loop :

DSBuffer.Play DSBPLAY_LOOPING

دستور لازم برای Play کردن بافر بدون loop :

DSBuffer.Play DSBPLAY_DEFAULT

دستورات لازم برای Stop کردن بافر :

DSBuffer.Stop
DSBuffer.SetCurrentPosition 0

دستور لازم برای Pause کردن بافر :

DSBuffer.Stop

تنظيم خصوصيات بافر : سه خصوصيت وجود دارد که در مورد بافر تنظيم می شود pannig ، volume و frequency
محدوده مقادير pannig بين اعداد زير است :
DSBPAN_LEFT = -10,000
DSBPAN_CENTER = 0
DSBPAN_RIGHT = 10,000
توسط متد SetPan می توان pannig بافر را تنظيم کرد :

DSBuffer.SetPan yourValue

DirectSound صدا را تقويت نمی کند بلکه آنرا تضعيف می نمايد بنابراين ماکزيمم volume عبارت است از volume ای که فايل صوتی با آن ضبط شده است . بعبارت ديگر محدود مقادير volume بين اعداد زير است :
DSBVOLUME_MAX = 0
DSBVOLUME_MIN = -10000
توسط متد SetVolume می توان volume بافر را تنظيم کرد :

DSBuffer.SetVolume yourValue

محدود فرکانسی DirectSound عبارت است از :
DSBFREQUENCY_MIN = 100 (hz)x
DSBFREQUENCY_MAX = 100000 (hz) = 100khz x
توسط متد SetFrequency می توان فرکانس بافر را تنظيم کرد :

DSBuffer.SetFrequency yourValue

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

موضوع : پخش موزيک توسط DirectMusic

مقدمه :

در اولين درس از آموزش DirectXAudio با چگونگي پخش افکتهاي صوتي آشنا شديد . اکنون اين توانايي را داريد که يک engine ساده صوتي بنويسيد . در اين بخش مباني پخش موزيک را فرا خواهيد گرفت . پس از اين درس شما مي توانيد يک ماژوال براي پخش موزيکهاي پس زمينه و افکتهاي صوتي براي برنامه هايتان ايجاد کنيد .

Initil کردن DirectMusic8 :

قبل از هر کار بايستي ماژول DirectMusic8 را مقداردهي اوليه کنيد . اينکار بصورت زير انجام مي شود :

Option ExplicitImplements DirectXEvent8
Private oDX As DirectX8
Private oDMPerf As DirectMusicPerformance8
Private oDMLoader As DirectMusicLoader8
Private oDMSeg As DirectMusicSegment8

Dim dmParams As DMUS_AUDIOPARAMS
Set oDX = New DirectX8
Set oDMPerf = oDX.DirectMusicPerformanceCreate
Set oDMLoader = oDX.DirectMusicLoaderCreate
oDMPerf.InitAudio frmMain.hWnd, DMUS_AUDIOF_ALL, dmParams, Nothing, DMUS_APATH_DYNAMIC_STEREO, 128
oDMPerf.SetMasterAutoDownload True

شي DirectMusicLoader8 کمک مي کند تا موزيک درون بافر load شود .
شي DirectMusicSegment8 مموزيکي را که بايد پخش شود ذخيره مي کند .
کد فوق کافي است يکبار زمانيکه برنامه آغاز مي شود ، اجرا گردد .
اکنون ما يک واسط مقدار دهي شده از DirectMusic داريم اما قبل از اينکه موزيک را Load کرده و پخش کنيم چگونگي terminate کردن DirectMusic را در زير مي بينيد :

If ObjPtr(oDMSeg)Then Set oDMSeg = Nothing
If ObjPtr(oDMLoader)Then Set oDMLoader = Nothing
If Not (oDMPerf Is Nothing) Then
oDMPerf.CloseDown
Set oDMPerf = Nothing
End If
If ObjPtr(oDX) Then Set oDX = Nothing

پيغامها :

در برخي از component هاي DirectX8 مثل Input , Sound , Music و Play برنامه شما بايستي يک سيستم messaging را برپا کند تا DirectX زمان وقوع برخي رخدادهاي خاص را بشما گزارش دهد . اين مطلب بخصوص زمانيکه يک موزيک را پخش مي کنيد مفيد است براي مثال مي تواند زمان خاتمه يافتن موزيک را به شما اطلاع دهد و آنگاه شما مي توانيد قطعه موزيک بعدي را پخش کنيد .
پيغامها توسط يک سيستم callback انجام مي شوند . کد زير را در تابع InitDMusic تان پس از initial کردن DirectMusic8 قرار دهيد :

oDMPerf.AddNotificationType DMUS_NOTIFY_ON_SEGMENT
hEvent = oDX.CreateEvent(Me)x
oDMPerf.SetNotificationHandle hEvent

اولين سطر به DirectMusic مي گويد چه نوع پيغامهايي را مي خواهيد به برنامه تان بفرستد . چندين نوع پيغام وجود دارد :
DMUS_NOTIFY_ON_SEGMENT = اطلاعات موزيک فعلي ( شروع پخش ، پايان پخش و غيره )
DMUS_NOTIFY_ON_CHORD = اطلاعات تغيير chord موزيک
DMUS_NOTIFY_ON_COMMAND = زمانيکه يک event فرماني صدا زده شود .
DMUS_NOTIFY_ON_MEASUREANDBEAT = اطلاعات beat/measure مربوط به موزيک فعلي
DMUS_NOTIFY_ON_PERFORMANCE = که event مربوط به سطح performance می باشد .
DMUS_NOTIFY_ON_RECOMPOSE = که recomposition event می باشد .
آخرين بخش از پيغام دهي ، تابع اصلي آن مي باشد . همانطور که در بخش Initial کردن DirectMusic ديديد يک توصيف بصورت Implements DirectXEvent8 داشتيم . بخش اصلي تابع callback مربوط به DirectXEvent8 ، شامل يک select case است که بين پيغامهاي مختلف سوئيچ می کند :

Private Sub DirectXEvent8_DXCallback(ByVal eventid As Long)x
If eventid = hEvent Then
Dim dmMSG As DMUS_NOTIFICATION_PMSG
If Not oDMPerf.GetNotificationPMSG(dmMSG) Then
Else
Select Case dmMSG.lNotificationOption
Case DMUS_NOTIFICATION_SEGABORT
Case DMUS_NOTIFICATION_SEGALMOSTEND
Case DMUS_NOTIFICATION_SEGEND
Case DMUS_NOTIFICATION_SEGLOOP
Case DMUS_NOTIFICATION_SEGSTART
Case Else
End Select
End If
End If
End Sub

پخش موزيک / متوقف کردن موزيک :

براي پخش يک موزيک ابتدا بايستي آنرا load کنيد . اينکار توسط کد زير انجام مي شود :

oDMLoader.SetSearchDirectory App.Path & "\"x
Set oDMSeg = oDMLoader.LoadSegment(App.Path & FILENAME)oDMSeg.SetStandardMidiFile

DirectMusic تنها چهار نوع فرمت صوتي را مي پذيرد : WAV ، MID ، RMI و SEG .
براي پخش فايلهاي MP3 بايستي از DirectXShow استفاده کنيد که آنرا در درسهاي بعدي خواهيد ديد .
اکنون که داده هاي فايل صوتي درون بافر load شد مي توانيد آنرا پخش کنيد :

oDMSeg.SetRepeats 0
oDMPerf.PlaySegmentEx oDMSeg, DMUS_SEGF_DEFAULT, 0

تعداد پخش شدن فايل را با متد SetRepets تنظيم کنيد . اگر اين مقدار صفر باشد ، آهنگ تنها يکبار پخش مي شود و اگر 1- باشد بطور ممتد پخش خواهد شد .
براي متوقف کردن موزيک از کد زير استفاده کنيد :

oDMPerf.StopEx oDMSeg, 0, DMUS_SEGF_DEFAULT

براي تنظيم ميزان صدا از متد SetMasterVolume استقاده کنيد :

oDMPerf.SetMasterVolume yourvalue

رنج صدا بين 20+ دسی بل تا 200- دسي بل است .
براي تنظيم Tempo از متد SetMasterTempo استفاده کنيد :

oDMPerf.SetMasterTempo yourvalue/ 100

بطور نرمال tempo برابر 1 مي باشد . عدد 2 سرعت را دو برابر مي کند و عدد 0 موزيک را قطع مي کند .
-------------------------------

موضوع : ايجاد صدای سه بعدی توسط DirectSound3D

مقدمه

تاکنون با چگونگي پخش افکتهاي صوتي و موسيقي پس زمينه توسط DirectXAudiuo آشنا شديد . اين مطالب براي کاربردهاي ساده مناسبند اما اينکه فقط ما صداي استريو داشته باشيم کافي نيست و در کاربردهاب حرفه اي بايستي از صداهاي کاملاً سه بعدي استفاده کنيم .
با استفاده از افکتهاي صوتي سه بعدي مي توانيم صدا را در تمام جهتها براي کاربر شبيه سازي کنيم اما با همه مزاياي صداي سه بعدي ، دو اشکال براي آن وجود دارد : اول اينکه پخش صداي سه بعدي پيچيده تر از پخش صداي عادي است و تنها کارت هاي سخت افزاري جديد بطور کاملاً واقعي از آن پشتيباني مي کنند و دوم اينکه صداي سه بعدي با 4 بلندگو يا بيشتر حاصل مي شود – کيفيت حالت 2 بلندگو بد نيست اما در مقايسه با حالت 4 بلندگو ، بسيار کيفيت صداي سه بعدي پايين است .

برپاسازي DirectSound3D

برپاسازي صداي سه بعدي چندان پيچيده نيست اما هر بافر صوتي که براي يک صداي سه بعدي مي سازيد ، يک overhead را به سيستم تان اضافه مي کند . همچنين برخي درايورها هستند که تنها اجازه ايجاد تعداد محدودي بافر سه بعدي را در يک لحظه مي دهند و نيز اغلب درايورها تعداد بافرهاي سه بعدي که مي توان در يک لحظه پخش کرد را محدود مي کنند ( معمولاً 8 تا 16 بافر ) .
اولين قدم در استفاده از صداي سه بعدي تعريف متغيرها و اشيا زير است :

Dim DSBuffer As DirectSoundSecondaryBuffer8
Dim DSBuffer3D As DirectSound3DBuffer8
Dim DSBListener As DirectSound3DListener8

تنها دو شي آخر براي شما جديد هستند . شي DirectSound3dBuffer8 يک ارائه سه بعدي از بافرهاي عادي است . ما همچنان از DirectSoundSecondaryBuffer8 براي نگهداري داده صوتي استفاده مي کنيم و از DirectSound3Dbuffer8 براي نگهداري پارامترهاي سه بعدي و تنظيمات سه بعدي استفاده مي کنيم . شي DirectSound3Dlistener8 نيز يک listener است و براي تنظيم کردن سرعت و جهت صدا و برخي پارامترهاي ديگر استفاده مي شود .
مرحله دوم ، ساخت بافر صوتي است . اين کار در دو بخش انجام مي شود . اول ما يک بافر صوتي نرمال مي سازيم و سپس يک واسط بافر صوتي سه بعدي را از آن بدست مي آوريم :

If Not (DSBuffer Is Nothing) Then DSBuffer.Stop
Set DSBuffer = Nothing
DSBDesc.lFlags = DSBCAPS_CTRL3D Or DSBCAPS_CTRLVOLUME
Set DSBuffer = DS.CreateSoundBufferFromFile(App.Path & "\blip.wav", DSBDesc)x
If DSBDesc.fxFormat.nChannels > 1 Then
MsgBox "You can only use mono (1 channel) sounds with DirectSound3D"x
End If
If optLow.Value Then DSBDesc.guid3DAlgorithm = GUID_DS3DALG_NO_VIRTUALIZATION
If optMedium.Value Then DSBDesc.guid3DAlgorithm = GUID_DS3DALG_HRTF_LIGHT
If optHigh.Value Then DSBDesc.guid3DAlgorithm = GUID_DS3DALG_HRTF_FULL
Set DSBuffer = DS.CreateSoundBufferFromFile(App.Path & "\blip.wav", DSBDesc)x
Set DSBuffer3D = DSBuffer.GetDirectSound3DBuffer()x

سه نکته است که بايد به آن دقت شود :
1 – اضافه کردن DSBCAPS_CTRL3D بسيار مهم است . شما اگر اين پارامتر را بکار نبريد ، قادر نخواهيد بود که واسط سه بعدي را بدست آوريد .
2 – ما بايستي تنها از افکتهاي صوتي Mono ( تک کاناله ) استفاده کنيم زيرا افکت صوتي استريو در صداي سه بعدي معنا ندارد زيرا صدا از يک نقطه در فضاي سه بعدي مي آيد .
3 – سطح الگوريتم سه بعدي – که در پارامتر DSBDesc.guid3Dalgorhthm آمده . حالت NO VIRTULIZATION تنها از CPU استفاده مي کند و روي تمام سيستم ها کار مي کند اما افکتها مينيمم هستند . حالت HRTF LIGHT هم از CPU و هم سخت افزار کارت صوتي استفاده مي کند و کيفيت بهتري را نسبت به خالت اول ارائه مي دهد . حالت HRTF FULL بهترين حالت است اما در صورتي درست کار مي کند که يک سخت افزار سه بعدي داشته باشيد .
آخرين پارامتري که بايد تنظيم کنيم شي listener است :

DSBDesc_2.lFlags = DSBCAPS_CTRL3D Or DSBCAPS_PRIMARYBUFFER
Set DSBPrimary = DS.CreatePrimarySoundBuffer(DSBDesc_2) x
Set DSBListener = DSBPrimary.GetDirectSound3Dlistener
DSBListener.SetOrientation 0#, 0#, 1#, 0#, 1#, 0#, DS3D_IMMEDIATE

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

چند پارامتر وجود دارد که مي توان آنها را تغيير داد :
1 – Volume : عدد 0 بيشترين ميزان صدا و عدد 3000 - کمترين ميزان صدا را دارد :

If DSBuffer Is Nothing Then Exit Sub
DSBuffer.SetVolume scrlVolume.Value

2 – Position : تنظيم محل listener :

DSBuffer3D.SetPosition Src_X, 0, Src_Y, DS3D_IMMEDIATE
DSBListener.SetPosition Src_X, 0, Src_Y, DS3D_IMMEDIATE

3 – Velocity : تنظيم سرعت و جهت منبع صدا :

DSBuffer3D.SetVelocity X, Y, Z, DS3D_IMMEDIATE
DSBListener.SetVelocity X, Y, Z, DS3D_IMMEDIATE

4 – Dppler Effect : انحراف صدا از مسيري که مي پيمايد انحراف سرعت حرکت صدا :

DSBListener.SetDopplerFactor CSng(scrlDoppler.Value), DS3D_IMMEDIATE

5 – Rolloff Effect : rolloff چگونگي تضعيف صدا با تغيير فاصله است .

DSBListener.SetRolloffFactor CSng(scrlRolloff.Value), DS3D_IMMEDIATE

6 – Distance : ماکزيمم فاصله اي که يک صدا مي تواند شنيده شود :

DSBuffer3D.SetMaxDistance 250, DS3D_IMMEDIATE
DSBuffer3D.SetMinDistance 0.01, DS3D_IMMEDIATE

--------------------------
لينک مقاله
http://sheidaian.persianblog.com :منبع

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4

مقدمه :

برای آشنايي با مبانی شبکه های 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

=================

پاسخ به سوالاتی در مورد کتابخانه WinPcap :

۱ - WinPcap چگونه روی سيستم نصب می شود ؟
در صورت اجرای فايل نصب ، فايل درايور و Dll های مربوطه در دايرکتوری سيستم شما کپی می شوند . همچنين در Control Panel بخش Add/Remove Program می توانيد عبارت WinPcap را مشاهده کنيد .

۲ - آيا WinPcap 2.2 آخرين نسخه WinPcap است ؟
خير . آخرين نسخه WinPcap نسخه ۲.۳ می باشد که از آدرس زير قابل دريافت است :
Support Windows 95/98/ME/NT/2000/XP
 WinPcap auto-installer:driver +DLLs
Developer's pack
WinPcap source code
همچنين WinPcap 3.0 Alpha 4 را می توانيد از آدرس زير دريافت کنيد :
 WinPcap auto-installer:driver +DLLs

۳ - چگونه می توان فهميد که WinPcap در حال اجرا روی يک کامپيوتر Win2k/XP است ؟
در بخش Run دستور msinfo32 را وارد کنيد . سپس در بخش Software Environment و سپس بخش System Drivers بايستی عبارت NPF را ببينيد .

۴ - برنامه های بر مبنای WinPcap ( مثل Windump که بعداً در مورد آن صحبت خواهم کرد ) بدرستی اجرا نمی شوند . آيا اشکال از WinPcap است ؟
برنامه Windump را نصب کنيد . دستور windump -D ليست آداپتورهای مجاز را گزارش می دهد و همچنين نشان می دهد که آيا WinPcap قادر به شناسايی درست سخت افزار شما بوده است يا نه . اگر Windump درست کار کند ، اشکال از برنامه شماست نه از WinPcap .

۵ - آيا می توان از WinPcap در اتصالات PPP (‌ اتصالات مودمی ) استفاده کرد ؟
در ويندوز ۹۵ بخاطر باگی که در NDIS است WinPcap گاهی اوقات اتصال PPP را reset می کند . در ويندوزهای ۹۸ و ME اين مشکل وجود ندارد اما گاهی اوقات قادر به ارسال packet نيست . در ويندوزهای NT/2k/XP نيز برخی مشکلات در فرايند binding وجود دارد که مانع از درست کار کردن درايور پروتکل روی آداپتور WAN می شود . اين مشکل بخاطر درايور PPP با نام ndiswan است که يک واسط استاندارد را برای capture کردن مهيا نمی کند .

۶ - Security در WinPcap چگونه است ؟
مدل Security اين برنامه ضعيف است و نويسندگان اين برنامه درحال کار روی آن هستند .

۷ - آيا از WinPcap می توان در محيطهای برنامه نويسی Borland استفاده کرد ؟
برای اينکه بتوان از امکانات WinPcap در C++ Builder استفاده کرد بايستی توسط برنامه COFF2OMF.EXE که در دايرکتوری Borland وجود دارد ، کتابخانه های Packet.lib و wpcap.lib که بر اساس استانداردهای مايکروسافت ( استاندارد COFF ) هستند را به استاندارد OMF تبديل کنيد مثال : COFF2OMF input.lib output.lib

۸ - آيا می توان از WinPcap در ويژوال بيسيک استفاده کرد ؟
بطور مستقيم نمی توان از اين کتابخانه در VB استفاده کرد . شرکت BeeSync يک کنترل ActiveX با نام PacketX ايجاد کرده که بوسيله آن می توان از تواناييهای WinPcap در ويژوال بيسک يا هر محيط ديگری که Microsoft ActiveX technology را پشتيبانی کند استفاده کرد .

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

۹ - آيا WinPcap می تواند با فايروال کار می کند ؟
ممکنست گاهی اوقات کار نکند .

۱۰ - آيا می توان از WinPcap در جاوا استفاده کرد ؟
WinPcap بطور مستقيم از جاوا پشتيبانی نمی کند اما در اين آدرس می توانيد يک Java wrapper را برای اينکار دريافت کنيد .

۱۱ - آيا WinPcap از device های loopback پشتيبانی می کند ؟
خير و علت آن بخاطر محدوديتهای ويندوز است .

۱۲ - WinPcap از چه سخت افزارهايي پشتيبانی می کند ؟
NPF device driver طوری توسعه يافته که بتواند با آداپتورهای اترنت درست کار کند اما نمی تواند بدرستی با آداپتورهای PPP WAN ( مودمها ) کار کند . همچنين نبايستی با کارتهای FDDI, ARCNET, ATM و Token Ring مشکلی داشته باشد اما اين امر بطور قطعی تائيد شده نيست . با آداپتورهای Wireless نيز نمی تواند درست کار کند و در بهترين حالت قادرست يک Ethernet emulation را ببيند .

۱۳ - آيا می توان توسط WinPcap ، بسته های اطلاعاتی ورودی را Drop کرد ؟
خير فقط می توان بسته ها را capture کرد .

۱۴ - آيا می توان توسط امکانات WinPcap يک Firewall ساخت ؟
همانطور که در بالا گقته شد WinPcap قابليت Drop کردن بسته ها را ندارد و تواناييهای Filtering در WinPcap تنها روی بسته های sniff شده است . برای جلوگيری کردن از ورود يک بسته به پشته TCP/IP بايستی خودتان يک درايور ميانی ايجاد کنيد .

۱۵ - چگونه می توان کاری کرد که WinPcap بطور اتوماتيک در زمان بوت سيستم فعال گردد ؟
مقدار کليد زير را در رجيستری از 0x3 به 0x2 تغيير دهيد . اين کار فقط در ويندوزهای NTx جواب می دهد :
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NPF\Start

۱۶ - آيا با کامپايل مجدد سورس WinPcap نتيجه درستی حاصل می شود ؟
بله اما ابتدا بايستی Service Pack 5 برنامه Microsoft Visual Studio را از سايت مايکروسافت دريافت و آنرا نصب کنيد .

۱۷ - آيا درايورهای ديگری بجز WinPcap برای کار با packet های TCP/IPوجود دارد ؟
بله . برای مثال برنامه Zx Sniffer يک کتابخانه capture کردن packet دارد که مشابه WinPcap است .

۱۸ - آيا Document ها و Tutorial های کاملی برای کار با Packet Driver API و Packet.dll و wpcap.dll در ويژوال سی وجود دارد ؟
بله . برای اينکار می توانيد از مطالب زير استفاده کنيد :
 How to use wpcap.dll
wpcap specific extensions
Packet Driver API. How to use the low level capture library
Instructions and examples of how to write and compile a capture application using libpcap calls or packet driver's (PACKET.DLL) calls
Compiling WinPcap
========================

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

مقدمه :

برنامه WinDump نسخه تحت ويندوز برنامه مشهور TcpDump می باشد که در سيستم عامل UNIX وجود دارد . اين برنامه يکی از بهترين ابزارهای Network Sniffer/Analyzer می باشد .
WinDump کاملاً با TcpDump سازگار می باشد و می توان از آن برای مانيتور کردن ترافيک شبکه بر اساس قوانين مختلف و پيچيده ای که قابل تنظيم هستند ، استفاده کرد .
WinDump روی سيستم عاملهای 95/98/ME و نيز NT/2000/XP قابل استفاده می باشد .
WinDump از کتابخانه libpcap موجود در WinPcap استفاده می کند .

دريافت برنامه :

برای دريافت نسخه 3.6.2 به آدرس زير مراجعه کنيد :
 WinDump.exe
WinDump source code
نکته : قبل از اجرای اين برنامه بايستی برنامه 2.3 WinPcap را روی سيستم خود نصب کنيد .
برای دريافت نسخه 3.8 alpha به آدرس زير مراجعه کنيد :
 WinDump.exe
WinDump source code
نکته : قبل از اجرای اين برنامه بايستی برنامه 3.0 WinPcap را روی سيستم خود نصب کنيد .

پاسخ به سوالاتی در مورد برنامه WinDump :

۱ - چگونه می توان با استفاده از WinDump ليست آداپتورهای شبکه را بدست آورد ؟
با اجرای دستور WinDump –D
توسط دستور WinDump –i adaptername می توان WinDump را روی آداپتور خاصی اجرا کرد .

۲ - آيا می توان از WinDump روی اتصالات PPP ( اتصالات مودمی ) استفاده کرد ؟
WinDump از همان device هايي پشتيبانی می کند که WinPcap می کند . به بخش قبل مراجعه کنيد .

۳ - چگونه می توان اطلاعاتی در مورد TcpDump بدست آورد ؟
به آدرس زير مراجعه کنيد :
 www.tcpdump.org

۴ - با وجود نصب آخرين نسخه برنامه WinDump ، چرا اين برنامه قادر به capture کردن همه packet ها نيست ؟
توسط سوئيچ B می توانيد سايز بافر درايور را افزايش دهيد برای مثال دستور Windump –B 5000 سايز بافر را ۵ مگابايت می کند . سايز بافر برنامه در حالت عادی 1 مگابايت است .

۵ - آيا می توان چندين WinDump را روی يک ماشين اجرا کرد ؟
بله

۶ - چرا WinDump در زمان capture کردن برای مدتی hang می کند ؟
علت آن فراخوانی تابع gethostbyaddr در برنامه می باشد که برای استخراج host name ها بکار می رود . می توان توسط سوئيچ n- از name resolution جلوگيری کرد .

۷ - آيا اطلاعات کاملی در مورد برنامه WinDump وجود دارد ؟
به آدرس زير مراجعه کنيد :
 WinDump Manual

==========================

مقدمه

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

دريافت PacketX

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

استفاده از PacketX

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

اين ActiveX را در فرمتان قرار دهيد و سپس در قسمت properties آن روی Custom کليک نموده و نوع آداپتور را مشخص نمائيد .
پس از انتخاب آداپتور با کليک روی دکمه Edit می توانيد اطلاعاتی از قبيل مد کاری و ساير بافر و نوع فيلترينگ را مشخص نمائيد .
نام اين شی را نيز PacketX1 می گذاريم .
در فرمتان دو دکمه به نامهای Start و Stop قرار دهيد . همچنين يک listBox با نام IPList در فرمتان قرار دهيد .
در کد مربوط به Form_load عبارت زير را بنويسيد :

PacketX1.Adapter.BPFilter = "port 80"x

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

PacketX1.start

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

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

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

PacketX1.stop

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

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

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

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

برای مشاهده اطلاعات کامل در مورد ساختار PacketX و ماژولهای آن به آدرس زير مراجعه کنيد :
 PacketX Documentation
لينک مقاله
http://sheidaian.persianblog.com :منبع

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آموزش DirectX Input - بخش 1,2,3
گرفتن اطلاعات ورودی از کيبرد - ۱

مقدمه

Direct Input 8 همانطور که از نامش مشخص است به شما اجازه می دهد که بتوانيد برنامه هايي بنويسيد که توسط هر نوع دستگاه ورودی کنترل شود .
Direct Input 8 دارای چندين مزيت نسبت به استفاده از کنترلهای ورودی خود ويژوال بيسيک دارد – کنترلهايي مثل Form_KeyUp, Form_KeyDown, Form_MouseMove - و همچنين قابليت کنترل بيشتری نسبت به توابع استاندارد Win32 از قبيل GetCursorPos, GetKeyState دارد .
Direct Input 8 سريعتر ، کاراتر و قدرتمند تر بوده و برای ساخت بازيها طراحی شده بنابراين باعث کندی برنامه ها نخواهد شد .

چگونگی کار با Direct Input 8 برای گرفتن ورودی از کيبرد

دو روش برای استفاده از کيبرد در DirectX8 وجود دارد : روش polling و روش event-based که هر دو دارای مزايا و معايبی هستند .
بطور کلی در اغلب طراحيها از روش event-based استفاده می شود زيرا کار با آن راحت تر اسن . در اين روش هر پيغام فرستاده شده ازطرف دستگاه ورودی log می شود و برنامه نيازی به هيچگونه پردازشی بمنظور منتظر ماندن برای يک پيغام از طرف ورودی ندارد ، بنابر اين کاراتر است . در روش polling کنترل کمی دقيقتر و راحتر است .
اگر در مورد برنامه نويسی بر مبنای polling و بر مبنای event اطلاعات کافی نداريد می توانيد از منابع موجود در سايتهايي چون Gamasutra و GameDev استفاده کنيد .

روش Polling

مراحل اين روش عبارتند از :

1 – تعريفات Declerations : يک فرم ايجاد کرده و يک TextBox به نام txtOutput با خصوصيات Multiline ، Locked و Vertical Scroll Bar در آن قرار دهيد . کدهای زير را در بخش کدنويسی اين فرم بنويسيد :

Private Const UsePollingMethod As Boolean = True
Private Const UseEventMethod As Boolean = False
‘نکته مهم اينست که تنها يکی از دو ثابت فوق بايستی True باشد .
Private bRunning As Boolean
‘اين متغير برای polling استفاده می شود
Private DX As DirectX8
Private DI As DirectInput8
‘تعريف شی اصلی DirectX و شی DirectInput
Private DIDevice As DirectInputDevice8
Private DIState As DIKEYBOARDSTATE
‘اين دو شی برای دسترسی به دستگاه ورودی ( کيبرد ) استفاده می شوند
Private KeyState(0 To 255) As Boolean
‘آرايه ای برای تشخيص فشرده شدن کليد
Private Const BufferSize As Long = 10
‘ سايز بافر نگهدارنده event ها . در روش event-based اين مقدار برابر يک و در روش polling برابر 10 تا 20 است ( بسته به سرعت حلقه بازی )
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)x
‘ تابع Sleep برای متوقف کردن حلقه polling در صورت بالا بودن نرخ ورودی

2- مقدار دهی اوليه Initialisation : اين بخش سه مرحله دارد :
در مرحله اول اشيا و Device ها ساخته می شوند .
در مرحله دوم تنظيمات مربوط به Device انجام می شود .
در مرحله سوم به Device می گوئيم که می خواهيم شروع به استفاده از آن کنيم .

در Form_Load کدهای زير را بنويسيد :

Me.Show
Dim I As Long
Dim DevProp As DIPROPLONG
Dim DevInfo As DirectInputDeviceInstance8
Dim pBuffer(0 To BufferSize) As DIDEVICEOBJECTDATA
If UsePollingMethod And UseEventMethod Then
MsgBox "You must select only one of the constants before running"x
Unload Me
End
End If

If UsePollingMethod Then txtOutput.Text = "Using Polling Method" & vbCrLf
If UseEventMethod Then txtOutput.Text = "Using Event Based Method" & vbCrLf

‘مقداردهی اوليه روش انتخاب شده
Set DX = New DirectX8
Set DI = DX.DirectInputCreate
Set DIDevice = DI.CreateDevice("GUID_SysKeyboard")x

DIDevice.SetCommonDataFormat DIFORMAT_KEYBOARD
DIDevice.SetCooperativeLevel frmMain.hWnd, DISCL_BACKGROUND Or ISCL_NONEXCLUSIVE

‘برپاسازی بافر
DevProp.lHow = DIPH_DEVICE
DevProp.lData = BufferSize
DIDevice.SetProperty DIPROP_BUFFERSIZE, DevProp

‘ به دايرکت ايکس می گوئيم که می خواهيم از دستگاه ورودی استفاده کنيم
DIDevice.Acquire

‘استخراج اطلاعاتی در مورد دستگاه ورودی
Set DevInfo = DIDevice.GetDeviceInfo()x
txtOutput.Text = txtOutput.Text & "Product Name: " & DevInfo.GetProductName & vbCrLf
txtOutput.Text = txtOutput.Text & "Device Type: " & DevInfo.GetDevType & vbCrLf
txtOutput.Text = txtOutput.Text & "GUID: " & DevInfo.GetGuidInstance & vbCrLf

‘در صورتی که بخواهيم به برنامه خاتمه بدهيم کدهای زير را می نويسيم
DIDevice.Unacquire
Set DIDevice = Nothing
Set DI = Nothing
Set DX = Nothing
Unload Me
End

3 – گرفتن ورودی از کيبرد : در اين بخش فرض کنيد بخواهيم يک بازی را در يک حلقه Do-Loop شبيه سازی کنيم . در اين حلقه هر بار فشرده شدن کليدهای کيبرد را چک می کنيم :

If Not Err.Number Then bRunning = True

Do While bRunning

‘دريافت اطلاعات شامل خواندن وضعيت کيبرد ، خواندن اطلاعات بافر و سپس خطا
DIDevice.GetDeviceStateKeyboard DIState
DIDevice.GetDeviceData pBuffer, DIGDD_DEFAULT
If Err.Number = DI_BUFFEROVERFLOW Then
Msgbox(“BUFFER OVERFLOW (Compensating)...")x
GoTo ENDOFLOOP:
End If
‘بررسی فشرده شدن کليدها
For I = 0 To 255
If DIState.Key(I) = 128 And (Not KeyState(I) = True) Then
txtOutput.Text = txtOutput.Text & "{ DOWN } " & KeyNames(CInt(I))& vbCrLf
txtOutput.SelStart = Len(txtOutput.Text)x
KeyState(I) = True
End If
Next I

‘بررسی رها شدن کليد
For I = 0 To BufferSize
If KeyState(pBuffer(I).lOfs) = True And pBuffer(I).lData = 0 Then
KeyState(pBuffer(I).lOfs) = False
txtOutput.Text = txtOutput.Text & "{ UP } " & KeyNames(CInt(pBuffer(I).lOfs)) & vbCrLf
txtOutput.SelStart = Len(txtOutput.Text)x
End If
Next I

Sleep (50)x
DoEvents
ENDOFLOOP:
Loop

در کد فوق يک تابع KeyName وجود دارد که نام کليد فشارداده شده را بر می گرداند . بخشی از اين تابع را در زير می بينيد :

Function KeyNames(iNum As Integer) As String

Dim aKeys(0 To 255) As String

aKeys(1) = "DIK_ESCAPE"
aKeys(2) = "DIK_1 On main keyboard"x
aKeys(3) = "DIK_2 On main keyboard"x
aKeys(4) = "DIK_3 On main keyboard"x
aKeys(5) = "DIK_4 On main keyboard"x
aKeys(6) = "DIK_5 On main keyboard"x
aKeys(7) = "DIK_6 On main keyboard"x
aKeys(8) = "DIK_7 On main keyboard"x
aKeys(9) = "DIK_8 On main keyboard"x
aKeys(10) = "DIK_9 On main keyboard"x
aKeys(11) = "DIK_0 On main keyboard"x
aKeys(12) = "DIK_MINUS On main keyboard"x
aKeys(13) = "DIK_EQUALS On main keyboard"x
aKeys(14) = "DIK_BACK BACKSPACE"x
aKeys(15) = "DIK_TAB"x
aKeys(16) = "DIK_Q"x
aKeys(17) = "DIK_W"x
aKeys(18) = "DIK_E"x
aKeys(19) = "DIK_R"x
aKeys(20) = "DIK_T"x
.
.
.
KeyNames = aKeys(iNum)x

End Function

=======================

موضوع : کنترل کيبرد با روش Event-Based

مقداردهی اوليه و مفاهيم اصلی در روش Event-Based مشابه روش Polling است و تنها بايستی ساختار بخش جمع آوری داده و حلقه پردازشی را تغيير دهيم . مراحل کار با روش Event-Based بصورت زير می باشد :

۱ - تعاريف و مقداردهی اوليه : در بخش تعاريف دو تعريف جديد بصورت زير داريم :

Dim hEvent As Long
Implements DirectXEvent8

hEvent يک پارامتر هندل برای يک می باشد .
نکته : زمانی که کليدی فشرده يا رها می شود ، DirectX اين امر با فراخوانی تابعی به اسم DirectXEvent8_DXCallback به برنامه شما اطلاع می دهد . ( اين نوع توابع را Call Back Function گويند ) . اين تابع به برنامه شما می گويد که يک رويداد اتفق افتاده است و بايستی بافرها را چک کند .

تنها تغييری که در بخش مقداردهی اوليه نياز است ، برپاسازی يک event می باشد :

If UseEventMethod Then
hEvent = DX.CreateEvent(frmMain)x
DIDevice.SetEventNotification hEvent
End If

در انتهای برنامه نيز کد زير را برای از بين بردن event اضافه کنيد :

If hEvent <> 0 Then DX.DestroyEvent hEvent

۲ - استفاده از event : برای اين بخش کدهايي را در داخل تابع DirectXEvent8_DXCallback می نويسيم :

Private Sub DirectXEvent8_DXCallback(ByVal eventid As Long)x
'متغيرهای موردنياز
Dim I As Long
Dim pBuffer(0 To BufferSize) As DIDEVICEOBJECTDATA
If eventid = hEvent Then
If DIDevice Is Nothing Then Exit Sub
'درصورت رخ دادن event داده را از کيبرد می گيريم
DIDevice.GetDeviceStateKeyboard DIState
DIDevice.GetDeviceData pBuffer, DIGDD_DEFAULT
'چک کردن تمام کليدها برای اينکه متوجه شويم چه اتفاقی افتاده است
For I = 0 To 255
'عدد ۱۲۸ نشان دهنده key_down event است .
If DIState.Key(I) = 128 Then
If pBuffer(0).lData = 128 Then
txtOutput.Text = txtOutput.Text & "{ DOWN } " & KeyNames(CInt(I)) & vbCrLf
End If
End If
'کد فوق برای بررسی فشرده شدن يک کليد بود . کد زير رها شدن کليد را بررسی می کند
If (pBuffer(0).lData = 0 And pBuffer(0).lOfs = I) Then
txtOutput.Text = txtOutput.Text & "{ UP }" & KeyNames(CInt(I)) & vbCrLf
End If

txtOutput.SelStart = Len(txtOutput.Text)x
Next I
End If
End Sub

=====================

موضوع : کنترل ماوس با DirectX Input

مقدمه :

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

برپاسازی Device :

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

Private Const mSpeed As Single = 2
Private Const BufferSize As Long = 10
Private mPosition As Point

mSpeed مقدار سرعت حرکت کرسر ماوس را مشخص می کند .
BufferSize سايز بافر DI می باشد .
mPosition موقعيت جاری کرسر ماوس را نشان می دهد .

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

Set DIDevice = DI.CreateDevice("guid_SysMouse")x
Call DIDevice.SetCommonDataFormat(DIFORMAT_MOUSE)x
Call DIDevice.SetCooperativeLevel(frmMain.hWnd, DISCL_FOREGROUND Or DISCL_EXCLUSIVE)x

تفاوت عمده کدهای فوق با کدهای مقداردهی اوليه در بخش کی برد آنست که cooperativelevel تغيير کرده است . در اينجا گفته شده که ما می خواهيم از ماوس بصورت انحصاری در برنامه استفاده کنيم . اين حالت برای برنامه های window-base مناسب نيست و بهترست از آن در بازيهايي که بصورت full screan هستند استفاده کنيد .

خواندن ورودی از ماوس :

در اين بخش می توانيد هم از روش polling و هم event-based استفاده کنيد . نکته مهمی که در اينجا وجود دارد آنست که Direct Input فقط حرکت داده شدن ماوس و کليک شدن يک دکمه را به شما اطلاع می دهد و برای تشخيص حالتهای double click و single click خودتان بايستی کد بنويسيد برای مثال اگر فاصله زمانی بين دو کليک کمتر از ۴۰ ميلی ثانيه باشد آنگاه اين يک double click بوده است .
کد زير حرکت داده شدن ماوس و کليک يکی از سه دکمه آنرا اطلاع می دهد :

Dim DevData(1 To BufferSize) As DIDEVICEOBJECTDATA
Dim nEvents As Long
Dim I As Long
nEvents = DIDevice.GetDeviceData(DevData, DIGDD_DEFAULT)x
For I = 1 To nEvents
Select Case DevData(I).lOfs
Case DIMOFS_X
mPosition.x = mPosition.x + (DevData(I).lData * mSpeed)x
If mPosition.x < 0 Then mPosition.x = 0
If mPosition.x > frmMain.ScaleWidth Then mPosition.x = frmMain.ScaleWidth
imgCursor.Top = mPosition.y
imgCursor.Left = mPosition.x
lablel(1).Caption = "Mouse Coordinates: [" & mPosition.x & ", " & mPosition.y & "]"x
Case DIMOFS_Y
mPosition.y = mPosition.y + (DevData(I).lData * mSpeed)x
If mPosition.y < 0 Then mPosition.y = 0
If mPosition.y > frmMain.ScaleHeight Then mPosition.y = frmMain.ScaleHeight
imgCursor.Top = mPosition.y
imgCursor.Left = mPosition.x
lablel(1).Caption = "Mouse Coordinates: [" & mPosition.x & ", " & mPosition.y & "]"x
Case DIMOFS_BUTTON0
label(2).Caption = "Button 0 State: " & IIf(DevData(I).lData = 0, "Up", "Down")x
Case DIMOFS_BUTTON1
label(3).Caption = "Button 1 State: " & IIf(DevData(I).lData = 0, "Up", "Down")x
Case DIMOFS_BUTTON2
label(4).Caption = "Button 2 State: " & IIf(DevData(I).lData = 0, "Up", "Down")x
Case DIMOFS_BUTTON3
label(5).Caption = "Button 3 State: " & IIf(DevData(I).lData = 0, "Up", "Down")x
End Select
Next I

برای استفاده از کد فوق در روش Polling ، بايستی آنرا در يک حلقه Do while-Loop قرار دهيد .
برای استفاده از کد فوق در روش Event-Based ، بايستی آنرا درون روتين DirectXEvent8_DXCallback قرار دهيد .
لينک مقاله
http://sheidaian.persianblog.com :منبع

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7
TAPI چيست ؟

TAPI يا Telephony API يک کتابخانه استاندارد برای کار با مودم و نوشتن برنامه های تلفنی می باشد . برای نمونه می توان از برنامه های Phone Dialer ( شماره گير تلفن ) ، برنامه شبکه سازی تلفنی ( Dialup Networking ) ، برنامه تشخيص پالس مودم برای ضبط اطلاعات وارد شده از طرف کاربران و کاربردهای ديگر در اين زمينه نام برد . اين کتابخانه به شما کمک کمک می کند تا بدون درگير شدن با برنامه نويسی سخت افزار مودم و درايور آن بطور مستقيم بتوانيد برنامه های کاربردیي در اين زمينه بنويسيد .
مروری بر Microsoft Telephony :

Telephony امکان مجتمع سازی کامپيوترها با دستگاههای ارتباطی و شبکه ها را فراهم نموده است . معمولاً دستگاه ارتباطی يک مودم و خط ارتباطی نيز شبکه PSTN ( شبکه عمومی تلفن سوئيچينگ ) می باشد . برخی از کاربردهای Telephony عبارتند از :

۱ - کنفرانسهای مالتی مديا بصورت Multicast
۲ - VoIP
۳ - مرکز پاسخ گويي اتوماتيک
۴ - تماس تلفنی از طريق کامپيوتر روی شبکه PSTN

دياگرام زير معماری Microsoft Telephony را نشان می دهد :
برنامه های TAPI :

برای نوشتن برنامه های کاربردی با استفاده از TAPI بايستی ابتدا در مورد سطح سرويسی که می خواهيم ارائه دهيم تصميم گيری کنيم . برای مثال برای نوشتن يک برنامه شماره گير تلفن نياز به استفاده کامل از TAPI نيست و می توان از قابليتهای خود ويندوز در اين زمينه استفاده کرد ( Assisted Telephony ) . در بخشهای بعدی در مورد سطوح مختلف سرويس در TAPI بيشتر صحبت خواهم کرد .
دومين مطلبی که بايد مورد توجه قرار داد اينست که می خواهيم از TAPI 2.x استفاده کنيم يا از TAPI 3.x . تفاوت ايندو آنست که TAPI ورژن ۲ يک API برمبنای C است در حاليکه ورژن ۳ آن بر مبنای تکنولوژی COM می باشد . در بخشهای بعدی مطالب بيشتری در مورد تفاوتهای اين دو نسخه بيان خواهم کرد .
بخشهای اصلی يک برنامه کامل TAPI عبارتند از :

۱ - TAPI Initialization : شامل load کردن TAPI dll ، اتصال به TAPI Server ، مذاکره در مورد ورژن TAPI و برپاسازی سيستم اطلاع رسانی event می باشد .

۲ - Session Control : مقداردهی اوليه ، دريافت و کنترل تماسها

۳ - Device Control : دريافت و تنظيم اطلاعات دستگاه

۴ - Media Control : تشخيص و يا توليد تونها و ارقام ، کنترل stream

۵ - TAPI Shutdown : آزاد سازی منابع
مقداردهی اوليه TAPI :

عملکرد درست اجزای TAPI نياز به برپاسازی محيط ارتباطی روی کامپيوتر مورد نظر دارد . مراحل اين امر عبارتند از :

۱ - نصب TAPI : زمانيکه سخت افزار و يا نرم افزار برای اولين بار به کامپيوتر اضافه می شود انجام می گيرد . جزئيات کار به سيستم عامل و نرم افزار بستگی دارد .

۲ - مقداردهی ابتدائی : ساخت اشيا و مسيرهای ارتباطی

۳ - مذاکره در مورد ورژن TAPI : برای اطمينان از اينکه اجزای TAPI قادر به تبادل داده ها باشند .

۴ - استخراج اطلاعات منابع : بدست آوردن اطلاعاتی در مورد دستگاهی که می توان از آن در برنامه TAPI مورد نظرمان استفاده نمود .

۵ - Event notification : برپاسازی سيستم اطلاع رسانی event
مقداردهی اوليه TAPI در ويژوال بيسيک :

از منوی Project گزينه References را انتخاب کرده و از ليست مربوطه مورد Microsoft TAPI 3.0 Type Library را انتخاب کنيد .
حال وارد بخش کد نويسی فرمتان شويد و متغير objTAPI را بصورت زير تعريف کنيد :

Dim objTapi As TAPI

سپس در بخش مربوط به Form Load شی objTAPI را بصورت زير ايجاد می کنيم :

Set objTapi = New TAPI

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

Call objTapi.Initialize

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

نکته : در کد زير عمل error checking انجام نگرفته است و برای استفاده از کد زير در برنامه های واقعی بايستی بخش بررسی خطا را به آن اضافه کنيد .
۱ - تعريف يک شی آدرس و يک شی مجموعه آدرس :

Dim gobjAddress As ITAddress
Dim objCollAddresses As ITCollection

۲ - تنظيم شی objCollAddress بعنوان يک مجموعه آدرس از شی objTapi :

Set objCollAddresses = objTapi.Addresses

۳ - پيدا کردن آدرسی که بتواند از واسط مورد نظر ما پشتيبانی کند :

bFound = False
For indexAddr = 1 To objCollAddresses.Count
Set objCrtAddress = objCollAddresses.Item(indexAddr)x
Set objMediaSupport = objCrtAddress
Set objAddressCapabilities = objCrtAddress

If objMediaSupport.QueryMediaType( nSelectedType ) x
bFound = True
End If

Set objAddressCapabilities = Nothing
Set objMediaSupport = Nothing
Set objCrtAddress = Nothing

If bFound = True Then Exit For
Next indexAddr

در صورتيکه آدرس مورد نظزر پيدا شود برنامه از حلقه خارج شده و gobjAddress يک آدرس قابل استفاده خواهد بود :

Set gobjAddress = objcollAddresses.Item(indexAddr)x

انجام Event Handling در TAPI :

کد زير شامل يک event handler ساده برای TAPI ، رجيستر کردن واسط event ، تنظيم فيلتر event و رجيستر کردن تمام فراخوانيهای دادن اخطار است . هدف اصلی از اين کد اينست که مطمئن شويم بخشی از TAPI که event ها را دريافت می کند پردازشی را قبل از انتقال به بخشهای ديگر انجام دهد .

تعاريفها :

Dim WithEvents gobjTapiWithEvents As TAPI
Attribute gobjTapiWithEvents.VB_VarHelpID = -1
Dim glRegistrationToken As Long

Const TAPI3_CALL_EVENTS =TE_CALLMEDIA Or
TE_CALLNOTIFICATION Or TE_CALLSTATE

تنظيم eventfilter بصورتيکه تمام event های تعريف شده برای TAPI را بپذيرد :

objTapi.EventFilter = TAPI3_CALL_EVENTS

رجيستر کردن event ها :

Set gobjTapiWithEvents = objTapi
Dim fOwner As Boolean, fMonitor As Boolean
Dim lMediaTypes As Long, lCallbackInstance As Long

fOwner = True
fOwner = True
fMonitor = False
lMediaTypes = TAPIMEDIATYPE_AUDIO
lCallbackInstance = 1

glRegistrationToken = gobjTapi.RegisterCallNotifications(gobjAddress,fMonitor,
fOwner,lMediaTypes,lCallbackInstance)x

انتخاب يک ترمينال :

+ قبل از اينکه يک ترمينال را برای برقراری ارتباط انتخاب کنيد بايستی TAPI Initialization و عمل انتخاب آدرس را انجام داده باشيد .

ابتدا يک متغير از نوع ITBasicCallControl ( واسط کنترل تماس ) تعريف می کنيم :

Dim objCallControl As ITBasicCallControl
Set objCallControl = gobjReceivedCallInfo

سپس يک متغير از نوع ITTerminalSupport ( کوئری از شی آدرس ) تعريف می کنيم :

Dim objTerminalSupport As ITTerminalSupport
Set objTerminalSupport = gobjAddress

سپس متغير ترمينال را تعريف کرده و توسط شی objTerminalSupport يک ترمينال را برای آن استخراج می کنيم :

Dim objTerminal As ITTerminal
Set objTerminal = objTerminalSupport.GetDefaultStaticTerminal(lMediaType, dir)x

در اينجا ديگر نيازی به شی objTerminalSupport نيست بنابراين آنرا آزاد می کنيم :

Set objTerminalSupport = Nothing

سپس نياز به تعريف شی objStreamControl برای کنترل ترمينال است :

Dim objStreamControl As ITStreamControl
Set objStreamControl = objCallControl

در صورتيکه اين شی ايجاد شود ، به ازای استريم های موجود در ITCollection امکان ايجاد ترمينال در يک حلقه for بررسی می شود و ترمينال مناسب انتخاب می گردد :

If Not (objStreamControl Is Nothing) Then
Dim objITCollStreams As ITCollection

Set objITCollStreams = objStreamControl.Streams

Dim nIndex As Long, objCrtStream As ITStream

For nIndex = 1 To objITCollStreams.Count
Set objCrtStream = objITCollStreams.Item(nIndex)x
If objCrtStream.MediaType = lMediaType Then
If objCrtStream.Direction = dir Then
Call objCrtStream.SelectTerminal(objTerminal)x
End If
End If
Set objCrtStream = Nothing
Next nIndex

Set objITCollStreams = Nothing
Set objStreamControl = Nothing
End If

ايجاد يک تماس ( Make a Call ) :
+ قبل از اين بخش بايستی مراحل TAPI Initialization و عمل انتخاب آدرس انجام شده باشد .
اين بخش برای ايجاد يک شی تماس ، بررسی و مشخص کردن استريمی که با اين تماس در ارتباط است ، انتخاب و ايجاد ترمينالهای مناسب و کامل کردن ارتباط استفاده می شود .
قبل TAPI Initialization و عمل انتخاب آدرس و انتخاب ترمينال انجام شده باشد .
در ابتدا با استفاده از متد CreateCall يک شی تماس ساخته می شود :

Set gobjCall = gobjOrigAddress.CreateCall(strDestAddress, nSelectedType,lMediaTypes)x

سپس در اينجا بايستی کدی که در بخش اول اين درس برای انتخاب ترمينال نوشته شد آورده شود :

}
Select Terminal Code
{

سپس بايستی دستور Connect اجرا شود :

gobjCall.Connect (False)x

False بدين معناست که ارتباط بصورت آسنکرون برقرار می شود .
دريافت يک تماس :

کد زير برای يافتن و يا ايجاد يک ترمينال مناسب برای دريافت يک تماس بکار می رود . بايستی توجه داشته باشيد که قبل از اجرای کد زير بايستی مراحل مقداردهی اوليه ، انتخاب يک آدرس و رجيسر کردن event ها را انجام دهيد . همچنين در کد زير بايستی مرحله انتخاب ترمينال را نيز انجام دهيد . توجه داشته باشيد که در کد زير متغير pEvent يک اشاره گر برای واسط ITCallNotificationEvent است که توسط TAPI به event Handler داده می شود :

If TapiEvent = TE_CALLNOTIFICATION Then
Dim objCallNotificationEvent As ITCallNotificationEvent
Set objCallNotificationEvent = pEvent
Dim gobjReceivedCallInfo As ITCallInfo
Set gobjReceivedCallInfo = objCallNotificationEvent.Call
Dim objCallControl As ITBasicCallControl
Set objCallControl = gobjReceivedCallInfo
objCallControl.Answer
End If

+ بخاطر طولانی شدن اين سری مطالب و نيز تخصصی بودن آن که باعث می شود مخاطبين کمتری داشته باشد بحث TAPI را به همين جا خاتمه می دهم . اما برای دوستان علاقمند که بخواهند مطالب بيشتری در اين زمينه آموخته و نيز مثالهای عملی از نوشتن برنامه های TAPI را در اختيار داشته باشند لينکهای زير را معرفی می کنم :
 آموزش TAPI در سايت MSDN
سوالات مختلف در مورد TAPI
سوالات مختلف در مورد TAPI
Active Call Center
يک کنترل ActiveX برای استفاده از TAPI
نمونه ای از يک برنامه کامل TAPI در ويژوال بيسيک
TAPI در ويژوال بيسيک
کتابی در مورد برنامه نويسی TAPI در ويژوال بيسيک
لينک مقاله
http://sheidaian.persianblog.com :منبع

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آشنايي با RAS API و WinInet API – کامل

مقدمه

ويندوز برای برقراری ارتباط با Internet Service Provide- ISP- شما از طريق مودم و خط تلفن در اتصالات dial-up networking ، از سرويسی خاص به اسم RAS (Remote Access Service) استفاده می کند . اين سرويس دارای يک واسط برنامه نويسی است که RAS API نام دارد . اين واسط شامل مجموعه ای از توابع است که شما می توانيد آنها را در برنامه خود صدا بزنيد . RAS API ابزاری بسيار قدرتمند و قابل انعطاف است همچنين بسيار پيچيده می باشد .
خوشبختانه برای استفاده راحتتر ، مايکروسافت تعدادی تابع را در مجموعه ای به اسم WinInet API قرار داده تا بتوان از آنها برای برقراری ارتباط و کنترل اتصال استفاده کرد .

آشنايي با WinInet API :

WinInet API مجموعه ای از توابع است که امکان ايجاد و توسعه برنامه های اينترنتی را بصورتی ساده ، سريع و کارآمد برای برنامه نويسان مهيا می کند . با استفاده از اين مجموعه توابع شما می توانيد برنامه هايي بنويسيد که از منابع اينترنتی با استفاده از پروتکلهايي چون HTTP و FTP استفاده کنند . همچنين WinInet به شما اجازه می دهد تا بتوانيد ارتباطی dial-up با يک ISP ايجاد نموده و آنرا کنترل کنيد .
مزيـت اصلی توابع WinInet آينست که شما نيازی به دانستن ساختار پروتکلهای ارتباطی و نيز برنامه نويسی Socket نخواهيد داشت . بعبارت ديگر WinInet يک واسط سطح بالا را برای کار با منابع اينترنتی ارائه می دهد .

امکانات Dial-Up موجود در WinInet :

تا قبل از ارائه اينترنت اکسپلورر ورژن 4 ، WinInet تنها دارای دو تابع dial-up بود :

تابع InternetAttemptConnect : برای بررسی اينکه آيا يک ارتباط به اينترنت وجود دارد يا نه استفاده می شد . اگر هيچ اتصالی به اينترنت وجود نداشت اين برنامه کادر تبادلی dial-up networking را نمايش می داد و کاربر اجازه داشت تا يک اتصال را برای وصل شدن به اينترنت انتخاب کند .

تابع InternetCheckConnection : تابع با استفاده از انجام يک دستور ping به url ای که به تابع داده شده ، بررسی می کرد که آيا ارتباطی به اينترنت وجود دارد يا نه .

اين دو تابع دارای محدوديتهای فراوانی بودند . برای مثال تابع اول نمی تواند بطور اتوماتيک اتصال به اينترنت را برقرار کند و تابع دوم نيز نمی تواند هيچ اطلاعاتی در مورد نوع ارتباط به ما بدهد .

IE نسخه 4 ، تعدادی تابع جديد برای WinInet معرفی کرد که برخی از آنها عبارتند از :

تابع InternetGetConnectedState : اطلاعاتی در مورد نوع ارتباط استفاده شده را بيان می کند . برای مثال اين تابع اطلاع می دهد که نوع ارتباط به اينترنت از طريق مودم است يا شبکه LAN و يا از طريق پروکسی .

تابع InternetAutodial : اين امکان را فراهم می سازد تا يک ارتباط اينترنتی اتوماتيک از طريق مودم را با استفاده از مدخل اتصال پيش فرض که کاربر آنرا در dial-up networking مشخص کرده ايجاد کنيد .

تابع InternetDial : اين تابع کارآمدتر از تابع InternetAutodial است و کادری را نمايش می دهد که کاربر می تواند نوع مدخل مورد نظر خود برای ارتباط تلفنی با اينترنت را انتخاب کند .

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

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

تابع InternetSetDialState : برای تنظيم کردن وضعيت جاری ارتباط اينترنتی استفاده می شود .

در قسمت بعدی اين سلسه مباحث جزئيات اين توابع را بررسی کرده و نهايتاً برنامه ای کاربردی برای کار با اين توابع در ويژوال بيسيک ارائه خواهم داد .

اطلاعات بيشتری در مورد WinInet :

در اين بخش ما تنها توابع dial-up موجود در WinInet API را بررسی کرديم اما همانطور که در ابتدا گفته شد WinInet دارای امکانات فراوانی در زمينه کار با اينترنت است . برای آشنايي بيشتر با اين امکانات در زير جداولی ارائه شده که به اختصار امکانات مختلف اين مجموعه تابع را نشان می دهد :

توابع Dial-Up :

Name | Description
InternetGetConnectedState | Retrieves the current state of the Internet connection
InternetAutodial | Initiates an unattended dial-up connection
InternetAutodialHangup | Disconnects a modem connection initiated by
InternetDial | Initiates a dial-up connection
InternetHangUp | Disconnects a modem connection initiated by InternetDial
InternetGoOnline | Prompts the user for permission to initiate a dial-up connection to the given URL
InternetSetDialState | Sets the current state of the Internet connection

توابع عمومی اينترنت :

Name | Description
InternetOpen | Initializes the Win32 Internet functions
InternetConnect | Opens an FTP, Gopher, or HTTP session for a given site
InternetCloseHandle | Closes a single Internet handle or a subtree of Internet handles
InternetErrorDlg | Displays a dialog box for the error that is passed to InternetErrorDlg
InternetFindNextFile | Continues a file search started as a result of a previous call to FtpFindFirstFile or GopherFindFirstFile
InternetGetLastResponseInfo | Retrieves the last Win32 Internet function error description or server response on the thread calling this function
InternetLockRequestFile | Allows the user to place a lock on the file being used
InternetQueryDataAvailable | Queries the amount of data available
InternetQueryOption | Queries an Internet option on the specified handle
InternetReadFile | Reads data from a handle opened by the InternetOpenURL, FtpOpenFile, GopherOpenFile, or HttpOpenRequest function
InternetReadFileEx | Reads data from a handle opened by the InternetOpenURL, FtpOpenFile, GopherOpenFile, or HttpOpenRequest function
InternetSetFilePointer | Sets a file position for InternetReadFile
InternetSetOption | Sets an Internet option
InternetSetStatusCallback | Sets up a callback function that Win32 Internet functions can call as progress is made during an operation
InternetStatusCallback | Placeholder for the application-defined status callback function
InternetTimeFromSystemTime | Formats a date and time according to the specified RFC format (as specified in the HTTP version 1.0 specification)
InternetTimeToSystemTime | Takes an HTTP time/date string and converts it to a SYSTEMTIME structure
InternetUnlockRequestFile | Unlocks a file that was locked using InternetLockRequestFile
InternetWriteFile | Writes data to an open Internet file
InternetConfirmZoneCrossing | Checks for changes between secure and nonsecure URLs

توابع URL :

Name | Description
InternetCanonicalizeUrl | Canonicalizes a URL, which includes converting unsafe characters and spaces into escape sequences.
InternetCombineUrl | Combines a base and relative URL into a single URL. The resultant URL will be canonicalized.
InternetCrackUrl | Cracks a URL into its component parts.
InternetCreateUrl | Creates a URL from its component parts.
InternetOpenUrl | Begins reading a complete FTP, Gopher, or HTTP URL.

توابع FTP :

Name | Description
FtpCreateDirectory | Creates a new directory on the FTP server
FtpDeleteFile | Deletes a file stored on the FTP server
FtpFindFirstFile | Searches the specified directory of the given FTP session
FtpGetCurrentDirectory | Retrieves the current directory for the given FTP session
FtpGetFile | Retrieves a file from the FTP server and stores it under the specified file name, creating a new local file in the process
FtpPutFile | Stores a file on the FTP server
FtpRemoveDirectory | Removes the specified directory on the FTP server
FtpRenameFile | Renames a file stored on the FTP server
FtpSetCurrentDirectory | Changes to a different working directory on the FTP server

توابع HTTP :

Name | Description
HttpAddRequestHeaders | Adds one or more HTTP request headers to the HTTP request handle
HttpEndRequest | Ends an HTTP request
HttpOpenRequest | Opens an HTTP request handle
HttpQueryInfo | Queries for information about an HTTP request
HttpSendRequest | Sends the specified request to the HTTP server
HttpSendRequestEx | Sends the specified request to the HTTP server

بررسی جزئيات توابع Dial-Up موجود در WinInet :

1 – تابع InternetAutodial : بطور اتوماتيک باعث شماره گيری اتصال پيش فرض اينترنت توسط مودم می شود . اگر اتصال با موفقيت انجام شود تابع مقدار true و در غير اينصورت false بر می گرداند .
پارامترهای ورودی تابع :
dwFlags : فلگ کنترل کننده عمليات اتصال می باشد و يکی از مقادير زير را می تواند داشته باشد :
- INTERNET_AUTODIAL_FORCE_ONLINE
- INTERNET_AUTODIAL_FORCE_UNATTENDED
dwReserved : پارامتری رزرو شده است و بايستی صفر باشد .

چگونگی declare کردن تابع :

Public Declare Function InternetAutodial Lib "wininet.dll" (ByVal dwFlags As Long, ByVal dwReserved As Long) As Long

2 – تابع InternetAutodialHangup : باعث قطع کردن يک اتصال dial-up اتوماتيک می شود . اگر قطع اتصال با موفقيت انجام شود تابع مقدار true و در غير اينصورت false برمی گرداند . تابع دارای يک پارامتر ورودی به اسم dwReserved است که رزرو شده بود و بايستی صفر باشد .

چگونگی declare کردن تابع :

Public Declare Function InternetAutodialHangup Lib "wininet.dll" (ByVal dwReserved As Long) As Long

3 – تابع InternetDial : يک اتصال به اينترنت را با استفاده از يک ارتباط مودم مقداردهی اوليه می کند . پارامترهای ورودی آن عبارتند از :
hwndParent : هندل مربوط به پنجره parent
lpszConnectoid : نام ارتباط dial-up مورد استفاده
dwFlags : فلگ کنترل اتصال که يکی از مقادير زير را می تواند داشته باشد :
- INTERNET_AUTODIAL_FORCE_ONLINE
- INTERNET_AUTODIAL_FORCE_UNATTENDED
- INTERNET_DIAL_UNATTENDED : اتصال به اينترنت از طريق مودم بدون نمايش واسط کاربر
lpdwConnection : آدرس داده ای که شامل عدد متناظر با اتصال است .
dwReserved : پارامتری رزرو شده است و بايستی صفر باشد .

چگونگی declare کردن تابع :

Public Declare Function InternetDial Lib "wininet.dll" (ByVal hwndParent As Long, ByVal lpszConnectoid As String, ByVal dwFlags As Long, lpdwConnection As Long, ByVal dwReserved As Long) As Long

4 – تابع InternetGetConnectedState : اين تابع وضعيت اتصال جاری به اينترنت را بر می گرداند . اگر اتصال برقرار باشد تابع مقدار true و در غير اينصورت false برمی گرداند .
پارامترهای ورودی تابع عبارتند از :
lpdwFlags : توصيف وضعيت اتصال . اين پارامتر يکی از مقادير زير را می تواند داشته باشد :
- INTERNET_CONNECTION_MODEM
- INTERNET_CONNECTION_LAN
- INTERNET_CONNECTION_PROXY
- INTERNET_CONNECTION_MODEM_BUSY
dwReserved : پارامتری رزرو شده است و بايستی صفر باشد .

چگونگی declare کردن تابع :

Public Declare Function InternetGetConnectedState Lib "wininet.dll" (ByRef lpdwFlags As Long, ByVal dwReserved As Long) As Long

5 – تابع InternetGoOnline : پيغامی به کاربر برای دادن مجوز برای مقداردهی اوليه اتصال به يک URL را می دهد . اگر اينکار موفقيت آميز باشد مقدار true و در غير اينصورت false برمی گرداند . پارامترهای ورودی تابع عبارتند از :
lpszURL : URL وب سايت مورد نظر برای اتصال
hwndParent : هندل پنجره parent
dwReserved : پارامتری رزرو شده است و بايستی صفر باشد .

چگونگی declare کردن تابع :

Public Declare Function InternetGoOnline Lib "wininet.dll" (ByVal lpszURL As String, ByVal hwndParent As Long, ByVal dwReserved As Long) As Long

6 – تابع InyernetHangUp : به مودم می گويد که اتصال به اينترنت را قطع کند . پارامترهای اين تابع عبارتند از :
dwConnection : شماره مربوط به اتصالی که می خواهيم آنرا قطع کنيم .
dwReserved : پارامتری رزرو شده است و بايستی صفر باشد .

چگونگی declare کردن تابع :

Public Declare Function InternetHangUp Lib "wininet.dll" (ByVal dwConnection As Long, ByVal dwReserved As Long) As Long

7 – تابع InternetSetDialState : تنظيم نمودن وضعيت شماره گيری مودم . اگر تنظيم با موفقيت انجام شود تابع true و در غيراينصورت false برمی گرداند . پارامترهای ورودی تابع عبارتند از :

lpszConnectoid : نام اتصال dial-up
dwState : وضعيت مربوط به اتصال dial-up . در حال حاضر اين پارامتر تنها مقدار INTERNET_DIALSTATE_DISCONNECTED را می تواند داشته باشد .

dwReserved : پارامتری رزرو شده است و بايستی صفر باشد .

چگونگی declare کردن تابع :

Public Declare Function InternetSetDialState Lib "wininet.dll" (ByVal lpszConnectoid As String, ByVal dwState As Long, ByVal dwReserved As Long) As Long

بررسی فلگهای مورد استفاده در توابع dial-up :

1 – فلگهای تابع InternetDial :

Public Const INTERNET_DIAL_UNATTENDED = &H8000& '0x8000
Public Const INTERENT_GOONLINE_REFRESH = &H1 '0x00000001
Public Const INTERENT_GOONLINE_MASK = &H1 '0x00000001

2 – فلگهای تابع InternetAutoDial :

Public Const INTERNET_AUTODIAL_FORCE_ONLINE = 1
Public Const INTERNET_AUTODIAL_FORCE_UNATTENDED = 2
Public Const INTERNET_AUTODIAL_FAILIFSECURITYCHECK = 4

3 – فلگهای تابع InternetGetConnectedState :

Public Const INTERNET_CONNECTION_MODEM = 1
Public Const INTERNET_CONNECTION_LAN = 2
Public Const INTERNET_CONNECTION_PROXY = 4
Public Const INTERNET_CONNECTION_MODEM_BUSY = 8

4 - فلگهای مربوط به dial handler اختصاصی :

Public Const INTERNET_CUSTOMDIAL_CONNECT = 0
Public Const INTERNET_CUSTOMDIAL_UNATTENDED = 1
Public Const INTERNET_CUSTOMDIAL_DISCONNECT = 2

5 – فلگهای عملياتی پشتيبانی شده برای dial handler اختصاصی :
Public Const INTERNET_CUSTOMDIAL_SAFE_FOR_UNATTENDED = 1
Public Const INTERNET_CUSTOMDIAL_WILL_SUPPLY_STATE = 2
Public Const INTERNET_CUSTOMDIAL_CAN_HANGUP = 4

6 - وضعيتهای مربوط به InternetSetDialState :

Public Const INTERNET_DIALSTATE_DISCONNECTED = 1

در اين بخش که آخرين بخش از مباحث WinInet API است برنامه ای نمونه برای کار با توابع مودمی اين کتابخانه ارائه خواهيم داد :

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

Private Declare Function InternetDial Lib "wininet.dll" Alias "InternetDialA" (ByVal hwndParent As Long, ByVal lpszConnectoid As String, ByVal dwFlags As Long, lpdwConnection As Long, ByVal dwReserved As Long) As Long

سپس وضعيت شماره گيری را در متغيری به اسم lOption قرار می دهيم . اين متغير می تواند مقادير زير را داشته باشد :
- DF_FORCE_ONLINE
- DF_FORCE_UNATTENDED
- DF_DIAL_FORCE_PROMPT
- DF_DIAL_UNATTENDED
حال نام اتصالی را که می خواهيم از آن استفاده شود در متغيری به اسم ConnectionName قرار می دهيم .
همچنين دو متغير به اسم ConnectionID و RetVal را از نوع long تعريف می کنيم .

حال تابع InternetDial را بصورت زير صدا می کنيم :

RetVal = InternetDial(Me.hwnd, ConnectionName, lOption, ConnectionID, 0)

اگر RetVal مخالف صفر باشد عمل Dial بدرستی انجام شده است .

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

Private Declare Function InternetHangUp Lib "wininet.dll" (ByVal dwConnection As Long, ByVal dwReserved As Long) As Long

سپس اين تابع را بصورت زير فراخوانی می کنيم :

RetVal = InternetHangUp(ConnectionID, 0)

برای اينکه مودم را مجبور کنيم تا بطور اتوماتيک از اتصال پيش فرض سيستم برای شماره گيری استفاده کند از تابع InternetAutodial استفاده می کنيم .
برای اينکار ابتدا تابع را Declare می کنيم :

Private Declare Function InternetAutodial Lib "wininet.dll" (ByVal dwFlags As Long, ByVal hwndParent As Long) As Long

سپس تابع را بصورت زير فراخوانی می کنيم :

RetVal = InternetAutodial(ADF_FORCE_UNATTENDED, Me.hwnd)

اگر RetVal مخالف صفر باشد عمل AutoDial بدرستی انجام شده است .

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

Private Declare Function InternetAutodialHangup Lib "wininet.dll" (ByVal dwReserved As Long) As Long

فراخوانی اين تابع بصورت زير است :

Call InternetAutodialHangup(0)

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

Private Declare Function InternetGetConnectedStateEx Lib "wininet.dll" Alias "InternetGetConnectedStateExA" (lpdwFlags As Long, lpszConnectionName As Long, dwNameLen As Long, ByVal dwReserved As Long) As Long

سپس تابع را بصورت زير فراخوانی می کنيم :

strConnectionName = Space(256)
lNameLen = 256
lPtr = StrPtr(strConnectionName)
lNameLenPtr = VarPtr(lNameLen)
RetVal = InternetGetConnectedStateEx(lConnectionFlags, ByVal lPtr, ByVal lNameLen, 0)

که strConnectionName از نوع String و بقيه متغيرها از نوع Long هستند .

اگر RetVal مخالف صفر باشد اتصال برقرار است .

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

Private Const INTERNET_AUTODIAL_FORCE_ONLINE = 1&
Private Const INTERNET_AUTODIAL_FORCE_UNATTENDED = 2&
Private Const INTERNET_AUTODIAL_FAILIFSECURITYCHECK = 4&

Private Const INTERNET_DIAL_FORCE_PROMPT = &H2000
Private Const INTERNET_DIAL_SHOW_OFFLINE = &H4000
Private Const INTERNET_DIAL_UNATTENDED = &H8000
لينک مقاله
http://sheidaian.persianblog.com :منبع

مقالات مرتبط با اين موضوع
آشنايي با RAS API و WinInet API – کامل | vb
TAPI در ويژوال بيسيک - درس 1و 2و 3و 4و 5و 6و 7 | vb
آموزش DirectX Input - بخش 1,2,3 | vb
آشنايي با کتابخانه Windows Packet Capture - بخش 1,2,3,4 | vb
آموزش DirectXAudio - بخش 1و2و3و4 | vb
کار با رجيستری در ويژوال بيسيک - قسمت 1و2و3و4 | vb
API هاي ويندوز و طرز استفاده آنها در وی بی | vb
مباحث پيشرفته Direct3D -از مقدمه تا دروس پایانی | vb
کنترل WinSock - قسمت 1,2 | vb
اضافه کردن آيکون به منو | vb
قرار دادن آيکون برنامه در کنار ساعت ويندوز ۲ | vb
طراحي فرم هاي دلخواه براي برنامه هاي ويژوال بيسيک | vb
رويدادها در ويژوال بيسيک | vb
آشنايي با شی پرينتر در ويژوال بيسيک ۶ | vb
توابع رياضی و ويژوال بيسيک | vb
مديريت رشته ها در ويژوال بيسيک ۶ | vb
Server-Side ActiveX Dll Programming - بخش 1,2,3,4,5,6 | vb
ايجاد کلاسی برای کار با فايلهای XML | vb
کار با فايل در ويژوال بيسيک - بخش اول و دوم و سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش 7 پايانی | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش ششم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش پنجم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش چهارم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش سوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش دوم | vb
ايجاد ساختارهاي داده اي در ويژوال بيسيک - بخش اول | vb
API هاي ويندوز | vb
مباحث پيشرفته Direct3D - مقدمه | vb
کنترل Internet Transfer - قسمت دوم | vb
کنترل Internet Transfer - قسمت اول | vb
آشنايي با BitBlt | vb
کنترل Web Browser – ساخت مرورگر صفحات وب | vb
آموزشDirectX-Graphic قسمت دهم | vb
آموزش DirectX-Graphic قسمت نهم | vb
آموزشDirectX-Graphic قسمت هشتم | vb
آموزشDirectX-Graphic قسمت هفتم | vb
آموزشDirectX-Graphic قسمت ششم | vb
آموزشDirectX-Graphic قسمت پنجم | vb
آموزشDirectX-Graphic قسمت چهارم | vb
آموزش DirectX-Graphic قسمت سوم | vb
آموزش DirectX-Graphic قسمت دوم | vb
آموزش DirectX-Graphic قسمت اول | vb

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


بررسی شیئ DataView در ASP.NET

یکی از اعمال مورد نیاز در کار با داده‌های یک بانک اطلاعاتی، جستجو، مرتب سازی و فیلتر کردن داده‌ها بر حسب نیازمندیهای برنامه کاربردی می باشد. در ADO.NET برای انجام این اعمال روی داده‌ها در یک DataTable دو روش وجود دارد: یکی استفاده از متد Select از شیئ DataTable و دیگری استفاده از شی DataView. شیئ DataView دارای توانایی بیشتری نسبت به متد Select از شیئ DataTable می‌باشد و کار با آن نیز ساده‌تر است. در این مقاله سعی شده به اختصار درباره خصوصیتها، متدها و نحوه کار با شیئ DataView اطلاعاتی ارائه شود.

شیئ DataView به مانند یک منبع برای اتصال کنترلهای دیگر به آن مورد استفاده قرار می گیرد. این شیئ نمایی از یک شیئ DataTable می‌باشد که برای جستجو، فیلتر، مرتب سازی و حتی دستکاری داده‌های آن شیئ DataTable مورد استفاده قرار می‌گیرد. هر شیئ DataView شامل یک مجموعه DataRowView می باشد که مشابه شیئ DataRow در DataTable هستند. این اشیاء دارای ویژگیهایی هستند که در زیر به اختصار توضیح داده شده‌اند:

DataView: شیئ DataView که سطر جاری به آن تعلق دارد را بر میگرداند.
Item: مقدار یک ستون از سطر فعلی را بر میگرداند.
Row: شیئ DataRow که در حال حاضر در حال بررسی است را بر میگرداند.

اشیاء DataView در داخل یک شیئ دیگر به نام DataViewManager قرار می گیرند. رابطه بین این دو شیئ مانند رابطه بین DataTable و DataSet می باشد. با این تفاوت که امکان دارد یک شیئ DataTable دارای چند شیئ DataView باشد که برای انجام جستجو و فیلتراسیونهای مختلف روی داده‌های آن استفاده می‌شوند. در حقیقت در زمان اتصال یک کنترل به یک شیئ DataSet، در پروسه Data-Binding آن، کنترل به شیئ DataView مربوط به آن DataSet متصل می‌شود که با خصوصیت DefaultViewManager شیئ DataSet مشخص می‌شود.

برای ساخت یک شی DataView از متد New استفاده می شود. در مثال زیر یک شی DataView می‌سازیم:

Dim myDataView As New DataView
myDataView.Table = myDataSet.myTable
myDataGrid.DataSource = myDataView
myDataGrid.DataBind()

در مثال بالا ابتدا یک شیئ DataView جدید به نام myDataView ایجاد شده است. سپس خصوصیت Table آن برابر با MyDataTable از myDataSet که در برنامه کابردی ما موجود است قرار داده می‌شود. شی DataView دارای خصوصیتهایی می‌باشد که در زیر به اختصار توضیح داده شده‌اند:

AllowDelete ،AllowEdit و AllowNew: با تنظیم این مقادیر Boolean می توان با دستکاری، اضافه و حذف مقادیر در DataView، مقادیر متناظر آنها را در شیئ DataTable مربوط تغییر داد.
Count: تعداد اشیاء RowView موجود در DataView جاری را بر می گرداند. (مشابه خصوصیت Count از شیئ DataTable)
Item: شیئ DataRowView که توسط اندیس به وسیله پارامتر به آن ارسال شده است را بر میگرداند.
RowFilter: عبارتی که برای فیلتر کردن سطرهای درون DataView استفاده می شود را مشخص می‌کند.
Sort: عبارتی که برای مرتب کردن سطرهای درون DataView به کار می رود را مشخص می‌کند.
Table: شیئ DataTable متناظر با DataView را مشخص می کند.

برای استفاده از خصوصیات RowFilter و Sort عبارتهایی هستند که مشابه عبارتهای محاسباتی برای متد Select از شی DataTable مورد استفاده قرار می‌گیرند. برای تنظیم مقادیر خصوصیت Sort که مربوط به روش مرتب سازی سطرهای DataRow است، لازم است مقادیر ستونهای مورد نظر جهت مرتب سازی را به ترتیب در داخل علامت "" قرار دهیم. برای مثال برای مرتب سازی یک DataView به ترتیب بر حسب ستونهای Date و Author به روش زیر عمل می‌کنیم:

myDataView.Sort = "Date, Author"

با قرار دادن عبارتهای ASC و DESC بعد از نام ستونها با یک فاصله می‌توان سطرها را به ترتیب صعودی یا نزولی مرتب کرد. (حالت پیش فرض صعودی ASC است)

myDataView.Sort = "Date DESC, Author ASC"

برای تنظیم مقدار RowFilter می توان از عبارات DataColumn استفاده کرد. این عبارات شامل یک سری توابع، عملگرها، عبارات و نام ستونها می‌باشند که جهت انجام فیلتراسیون مورد استفاده قرار می گیرند. در این عبارتها می توان از تمام عملیات دستکاری روی رشته‌ها و متغیرهای رشته‌ای استفاده کرد. به علاوه برای استفاده از مقادیر تاریخ باید آنها را در بین علامات ## قرار داد. برای استفاده از یک ستون خاص در این عبارات تنها کافیست از نام آن ستون استفاده کنید. برای استفاده ز سطرهای فرزند از عبارت .Child قبل از آنها و برای استفاده از سطر مادر نیز از عبارت .Parent قبل از آنها استفاده کنید.

بعضی از توابع قابل استفاده در این عبارات عبارتند از: Sum ،Avg ،Min ،Max و Count. و هچنین بعضی از عملگرهای منطقی مورد استفاده عبارتند از: And Or Not < > <= >= <> In و Like. عملگر In مشخص می کند که آیا مقدار مورد نظر در محدوده تعیین شده قرار دارد یا نه؟ مقادیر مربوط به حدود باید توسط علامات '' از هم جدا شوند. برای مثال:

Command = "Author In ('K', 'M', 'N’)”

برخی عملگرهای محاسباتی مانند + – * / % نیز در عبارات DataColumn قابل استفاده هستند. تعدادی تابع نیز در این عبارات مورد استفاده قرار می گیرند که برخی از آنها عبارتند از: Convert ،Len و ISNull.

در پایان نیز سه متد مهم شیئ DataView را به اختصار مورد بررسی قرار می‌دهیم:
AddNew: اضافه کردن یک سطر جدید به DataView.
Delete: پاک کردن یک سطر از DataView.
Find: سطرهایی که شامل پارامتر ارسالی به این متد هستند را پیدا می کند.
لينک مقاله
http://www.idevcenter.com :منبع

مقالات مرتبط با اين موضوع
ارتباط به منابع داده در ADO.NET | ado
ASP.NET و پايگاه داده | ado
مقايسه ADO و ADO.NET | ado
بررسی شیئ DataView در ASP.NET | ado
معرفی ADO و کاربرد آن در ASP بخش 1 و2 | ado

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


مقايسه ADO و ADO.NET

شركت مايكروسافت در ويژوال بيسيك ورژن 3 كه در سال 1993 ارائه داد از Jet كه هسته اصلي MS Access بود براي ايجاد ارتباط با بانكهاي اطلاعاتي استفاده نمود البته براي استفاده بهتر برنامه نويسان ، Jet را در غالب مجموعه Object هائي تحت عنوان (Data Access Object ) آورد. در نسخه 4 و 5 ويژوال بيسك ، ماكروسافت روشي ديگر براي ارتباط با بانكهاي اطلاعاتي تحت عنوان Remote Data Object = RDO را مطرح ساخت اين روش براي برنامه نويسي Client / Server روش مناسبي بود.

در دوم سپتامبر سال 1998 وقتي ماكروسافت ويژوال بيسيك ورژن 6 را ارائه داد روش جديدي تحت عنوان ( Activex Data Object ) ADO را مطرح ساخت در اين روش كه پايه و اساس آن OLEDB بود ماكروسافت بر خلاف DAO و RDO كه ساختاري پيچيده و سلسله مراتبي داشتند، از ساختاري ساده و مجزا ( غير سلسله مراتبي ) استفاده كرد و در واقع ADO هم شامل Object هائي است كه برنامه نويس بتواند از آنها براي ايجاد ارتباط با بانكهاي اطلاعاتي و انجام عمليات روي آنها استفاده كند و در تاريخ 13 February سال 2002 كه ماكروسافت نسخه نهائي Visual Basic.Net را ارائه داده روشي جديد براي كار با بانكهاي اطلاعاتي تحت عنوان ADO.Net را آورده است. اين نسخه از ويژوال بيسيك برخلاف نسخه‎هاي قبل بطور كامل مباحث OOP را پشتيباني مي‎كند ( FULL OOP ) در واقع ADO.Net هم مانند ADO و RDO و ADO شامل ساختاري براي ارتباط و انجام عمليات روي بانكهاي اطلاعاتي است. ADO.net همانند RDO و DAO و برخلاف ADO داراي ساختار سلسله مراتبي مي‎باشد. در اين مقاله مي‎خواهيم به مقايسه ADO و ADO.net بپردازيم. ADO در ورژنهاي مختلفي در اين چند سال اخير به بازار آمده است با آمدن SQL Server 2000 ورژن جديد ADO يعني ورژن 2.6 از اين محصول ارائه شد و اكنون هم ADO 2.6 در سايت ماكروسافت قابل Download مي‎باشد.

آخرين ورژن ADO شامل 9 تا Object است كه عبارتند از :

Connection
Command
Recordset
Parameter
Field
Error
Property
Record
Stream

آبجكت Connection امكان ارتباط با Data Source كه شامل بانك اطلاعاتي است را فراهم مي‎سازد. بعنوان مثال اگر بخواهيم از آبجكت Recordset براي اضافه و يا حذف و يا تغيير در محتواي ركوردي استفاده كنيم اين آبجكت از Connection براي ايجاد ارتباط با بانك اطلاعاتي مثلاً SQL Server استفاده مي‎كند اما همانطور كه گفته شد و در شكل ملاحظه مي‎شود ساختار آبجكتهاي ADO بصورت سلسله مراتبي نيست و مي‎‎توان مثلا Recordset اي ايجاد نمود كه مستقل از آبجكت Connection بتواند با بانك اطلاعاتي ارتباط برقرار نمايد.

در ADO علاوه بر آبجكتها، چهار Collection هم ديده مي‎شود كه عبارتند از :

Parameters
Fields
Properties
Errors

كه هركدام از آنها شامل آبجكتهائي از همان نوع هستند بعنوان مثال ساختاري كه براي Recordset كشيده شده بيان كننده آن است كه اين آبجكت شامل Collection هاي Fields و Properties بوده و مثلاً Collection مربوط به Fields شامل آبجكتهاي فيلد است.

آبجكت فيلد اطلاعاتي را راجع به يك ستون از Recordset در خود نگه داشته است.

در ADO آبجكت Command هم وجود دارد كه از آن مي‎توان براي اجراي يك فرمان SQL استفاده نمود البته بهترين روش براي اجراي Stored Procedure نيز استفاده از متد Execute مربوط به همين آبجكت است .

بعنوان مثال :

Dim cn As New ADODB.Connection
Dim cmd As New ADODB.Command
Dim rs As New ADODB.Recordset

cn.Open " Provider = sqloledb ; Data Source=serverName ; Initial Catalog = northwind ", "sa" , "password"
cmd.ActiveConnection = cn
cmd.CommandText = "sp_who"
cmd.CommandType = adCmdStoredProc

Set rs = cmd.Execute
Debug.Print rs(0)
rs.Close

از آبجكت Parameter هم براي مشخص كردن مقادير پارامترهاي ورودي يك ‌ Stored Procedure استفاده مي‎كنيم.

آبجكت Property براي استفاده از Dynamic Property استفاده مي‎شود كه Property هايي هستند كه وابسته به Provider بوده و استاندارد نيستند .

از Record براي دسترسي به يك سطر از Recordset و ويژگيهاي مربوط به آن سطر استفاده مي‎كنيم .و آبجكت Stream هم به منظور ذخيره و بازيابي اطلاعات بصورت باينري در يك فيلد از Record در نظر گرفته شده است.

تا اينجا باساختار ADO آشنا شديم حال به تشريح ADO.net مي‎پردازيم .

ADO.Net مجموعه‎اي از Class هاي Interface ها و دستوراتي جهت مديريت و كار با بانكهاي اطلاعاتي است. در بحث Net . مجموعه‎اي از Class هاي مربوط به هم در يك غالب تحت عنوان ‌ Name Space ارائه شده است Net. شامل تعدادي Name Space است كه در غالب .Net Framework قرار دارد. تمام ساختار ‌ ADO.net در چهار NameSpace قرار دارد كه عبارتند از :

System.Data.SqlClient.
System.Data.OleDb.
System.Data.Odbc.
System.Data.

اگر بخواهيم از بانكهاي SQL Server استفاده كنيم System.Data.SqlClient بهترين انتخاب است در اين NameSpace امكاناتي فراهم شده تا بتوانيم Application هاي بنوسيم و در آنها با SQL Server ارتباط برقرار نمائيم بطوريكه برنامه‎ها از Performance بالائي برخوردار باشند.

در صورتي كه كاربر بخواهد از بانكهاي رابطه ‎اي ديگر نظير Oracle استفاده كند ميتواند از System.Data.OleDb بهره گيرد.

System.Data.Odbc براي ارتباط با بانكهاي اطلاعاتي از طريق ODBC ميباشد System.Data هم شامل Provider هاي خاص نظير DataSet و DataTable است. ADO.net نيز شامل Object ها و Collection هائي است كه از مهمترين آنها مي‎توان موارد ذيل را شمرد:

OleDBConnection
OleDBCommand
OledbDataReader
OleDBDataAdapter
SelectCommand
InsertCommand
UpdateCommand
DeleteCommand
DataTable
DataRelation

OleDBConnection آبجكتي است شبيه به آبجكت Connection در ‌ ADO ، كه امكان ايجاد ارتباط با بانك را فراهم مي‎سازد اين آبجكت متدهايي براي اجراي فرامين SQL نيز داراست .OleDBCommand هم مشابه آبجكت Command در ‌ ADO مي‎باشد.

از اين آبجكت نيز براي اجراي Stored Procedure و اجراي فرامين SQL استفاده مي‎شود. آبجكت بعد OledbDataReader است كه براي گرفتن اطلاعات از ‌Database استفاده مي‎شود. البته لازم به ذكر است Resultset اي كه با اين روش ساخته مي‎شود بصورت ReadOnly و Forwardonly مي‎باشد. OleDBDataAdapter آبجكت جديدي در Ado.net است كه خود شامل چهار آبجكت براي انجام فرامين SQL مي‎باشد كه عبارتند از :

SelectCommand
InsertCommand
UpdateCommand
DeleteCommand

كه به ترتيب براي واكشي اطلاعات، اضافه نمودن اطلاعات جديد به داخل بانك ، به هنگام سازي اطلاعات و حذف اطلاعات استفاده مي‎شود. اين آبجكت به همراه آبجكت Dataset استفاده مي‎شود و براي پركردن Recordset موجود در Dataset بكار مي‎رود.

آبجكت بعدي Dataset است كه مهمترين آبجكت در Ado.net مي‎باشد اين آبجكت شامل دو Collection به نام هاي ‌ DataTables و DataRelations است. همانطور كه مي‎دانيد در ADO هم آبجكت Recordset داشتيم اينجا مجموعه‎اي از Recordset ها در داخل يك DataTables نگه داشته مي‎شود و مي‎توان بين DataTable هاي مختلف رابطه نيز ايجاد نمود كه اين روابط هم داخل يك مجموعه‎اي با نام DataRelations نگه داشته مي‎شود. در واقع DataTable در ADO.net معادل همان RecordSet در ADO مي‎باشد.
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
ارتباط به منابع داده در ADO.NET | ado
ASP.NET و پايگاه داده | ado
مقايسه ADO و ADO.NET | ado
بررسی شیئ DataView در ASP.NET | ado
معرفی ADO و کاربرد آن در ASP بخش 1 و2 | ado

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


ASP.NET و پايگاه داده

در اين مقاله شما در مورد کار با با پايگاه داده در ASP.NET آشنا خواهيد شد. بدين معنا که در صدد هستيم تا رويه ای کلی از مفاهيم، روشها وابزارهای مورد استفاده در ASP.NET جهت برقراری ارتباط با پايگاه داده، نشان دادن داده ها، دستکاری داده ها، بهنگام سازی و... توسط اشيايی چون مهيا کننده های بانک های اطلاعاتی، DataSetها XML، و ... معرفی می شود.

اگر تا بحال با پايگاه داده کار نکرده ايد شايد provider يک پايگاه داده برای شما نامفهوم باشـد. بطور خلاصه راهی را که بايد طی کرد تا به پايگاه داده متصل شده، آنرا باز کرده و داده ها را دستکاری کرده و دستورات را اجرا نمود، بوسيله يک تهيه کننده اطلاعات مشخص می شود. در ASP.NET معمولا از دو روش برای اين کار استفاده می شود. روش اول اينکه اگر پايگاه داده شما از نوع SQL Server باشد بايستی با مدل SQLClient کار کرد و اگر پايگاه داده شما غير از SQL Server باشد (در حال حاضر) بايد از روش ديگر يعنی مدل OleDb استفاده نمود. بعنوان مثال اگر پايگاه داده شما Oracle ،Sybase و يا Access باشد بايد از روش OleDb استفاده کنيد.

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

<% @ Import NameSpace="System.Data" %>
<% @ Import NameSpace="System.Data.OleDb" %>

برای برقراری ارتباط با پايگاه معمولا از عبارت زير استفاده می شود:

Dim ObjConn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; DataSource=e:\db\users.mdb”)

که قسمت DataSource آدرس فايل پايگاه داده است که در اينجا يک بانک Access است. همانگونه که ملاحظه می کنيد از رشته ارتباطی يا Connection String بعنوان پارامتر استفاده شده است و بوسيله متد Open ارتباط باز می شود:

objConn.Open()

لازم به توضيح است که در پايان کار بوسيله متد Close ارتباط را خاتمه می دهيم.

بمحض ارتباط با پايگاه داده می توان دستورات را به آن فرستاد. اين کار معمولا بوسيله شی OleDbCommand انجام می شود. جهت انجام اين کار می توان يک دستور SQL يا نام يک روال ذخيره شده (Stored Procedure) را مشخص نمود و بنا به مقتضيات می توان اعمال مختلفی را روی پايگاه پياده نمود:

Dim objCommand As New OleDbCommand ( "Select * From users", objConn )

ملاحظه می کنيد که کلاس Command از دو پارامتر رشته SQL و نام رشته ارتباطی برای فرستادن دستورات به پايگاه داده استفاده می کند. برای مثال آنچه را که در عبارت فوق ديديد می توان به بخشهای کوچکتر زير تقسيم کرد.

ابتدا تعريف شي:

Dim objCommand As New OleDbCommand()

سپس نسبت دادن آن به رشته ارتباطی جهت برقراری ارتباط پايگاه:

objCommand.Connection= objConn

مشخص کردن عمليات مورد نظر بوسيله دستورات SQL:

objCommand.CommandText="Select * From Users"

حتی می توانيد عمليات فوق را بصورت ذيل انجام دهيد:

Dim objCommand As New OleDbCommand( SQL string, Connection string )

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

- از ExecuteNonQuery زمانی استفاده می شود که قصد برگرداندن داده ها از پايگاه مورد نظر نباشد مثلا در مواقعی که از دستورات SQL جهت درج (Insert) و بهنگام سازی (Update) استفاده شود.

objCommand.ExecuteNonQuery

- از ExecuteReader برای خواندن و برگرداندن اطلاعات از پايگاه استفاده می کنيم.

Dim ObjRead As OleDbDataReader
objRead=objCommand.ExecuteReader

- برای دستکاری يک تک مقدار مشخص و مورد نظر از متد ExecuteScalar استفاده می شود.

برای خواندن داده ها معمولا از کلاس DataReader استفاده می شود -برای خواندن نه برای اضافه کردن يا بروز کردن- اين شئ بصورت مستقيم به پايگاه داده دسترسی دارد و فقط خواندنی (Read Only) است. البته اين خاصيت محدوديتی برای آن است اما برای خواندن ساده داده روشی کامل بشمار می رود.

Dim objReadaer As OleDbDataReader
objReader=objCommand.ExecuteReader
Whlie objReader.Read
Response.write(objReader.GetString(0)& " <br> " )
End While

عبارت فوق جهت نمايش و چاپ داده ها بکار می رود. متد Read خواندن را تا زمانيکه به پايان نتايج نرسد ادامه می دهد و عبارت objReader.GetString(0) برای برگرداندن نسخه رشته ای ستونهای رکورد کاربرد دارد. در ليست زير چند متد ديگر برای برگرداندن مقادير داده ای متغيرها آمده است:

GetBoolean(x) مقدار منطقی را بر می گرداند.
GetChar(x) مقدار کاراکتری را برمی گرداند.
Get DataTypeColumn(x) نوع داده را در ستون برميگرداند.
GetString(x) مقداررشته ای را برمی گرداند.

در اين بخش شما به دانسته های بخش اول نياز داريد. شئ بعدی که مورد بحث قرار می گيرد کلاس Data Adapter است. OleDBDataAdapter اطلاعات را می گيرد و يک ارتباط منطقی بين داده ها و کلاس Dataset ايجاد ميکند. بطور کلی ميتوان گفت Data Adapter در نظر اول معادل Data Command می باشد. روش استفاده از Data Adapter ها بطور معمول بصورت زير تعريف می شود:

Dim objAdapter As New OleDBDataAdapter("Select * From Users",objConn)

ملاحظه می کنيد که شئ Adapter از دو پارامتر- يکی رشته دستورات SQL و ديگری رشته ارتباطی - برای فرستادن دستورات به پايگاه داده استفاده می کند. بطور معمول DataAdapter برای پرکردن DataSetها و بروز کردن پايگاه بوسيله يک DataSet و اجرا کردن دستورات بکار می رود. اکنون نمای کلی از کاربرد فوق را در زير می بينيد:

Dim ds As DataSet = New DataSet()
objAdapter.Fill(ds,"Users")

متد Fill جهت اجرای دستور تنظيم شده در Data Adapter بکار می رود. بعبارت ديگر اطلاعات واکشی شده از پايگاه داده در يک جدول با نامی که ما تعيين می کنيم (Users) ذخيره می شود.
نکته ضروری اينست که تکنيک Mappings در اکثر مواقع کارساز است. Mappings عبارت است از ساختن يک نام مستعار (Alias) برای نام جداول در يک Dataset. اين aliasها هيچگونه تاثيری در منبع داده ندارد و وقتی که بوسيله DataAdapter فرستاده می شود بصورت خودکار بنام پيش فرض تبديل ميشود. اين تکنيک باعث خوانايی کد و راهنمايی برنامه نويس در ارجاع های بعدی وتشخيص جداول فراخوانی شده ميشود.

objAdapter.TableMappings.Add("adbtable","Users")

with objAdapter.tableMapping(0).ColumnMappings

.Add("PID","ID"

.Add("LAstName","Lnam"(

.Add("StreetAddress","Addy"(

End with

objAdapter.Fill(ds

در تکنيک فوق بجای استفاده از عبارت ds.Tables("adbtable") ميتوانيم Ds.Tables("Users") را بکار ببريم. در بخشهای آينده ديگر فوايد استفاده از Mappings آمده است. همچنين کلاس CommandBuilder برای بهنگام کردن يک بانک که بوسيله Dataset صورت گرفته يک شيوه صحيح بشمار ميرود:

Dim cmdBLD As New OleDBCommandBuilder(objAdapter)

که در عبارت فوق شئ objAdapter بعنوان پارامتر به دستور CommandBuilder فرستاده شده و سپس بوسيله متد Update منبع داده بهنگام می شود:

objAdapter.Update(ds,"Users")

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

<%@ Import NameSpace="System.data" %>

<%@ Import NameSpace="System.Data.OleDB" %>

<Script Language="VB" Runat="Server">

Sub Page_Load( Sender As Object, E As EventArgs)

Dim objConn As New OleDBConnection("PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA Source=e:\db\users.mdb")

objConn.Open()

Dim ds As DataSet=New DataSet

Dim objAdapter As New OleDBDataAdapter("Select * From Users",objConn)

Dim objcmdBLD As New OleDBCommandBuilder(objAdapter)

Obj.Adapter.Fill(ds,"Users")

End Sub

</Script>
لينک مقاله
http://www.iranasp.net :منبع

مقالات مرتبط با اين موضوع
ارتباط به منابع داده در ADO.NET | ado
ASP.NET و پايگاه داده | ado
مقايسه ADO و ADO.NET | ado
بررسی شیئ DataView در ASP.NET | ado
معرفی ADO و کاربرد آن در ASP بخش 1 و2 | ado

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


ارتباط به منابع داده در ADO.NET
بمنظوراتصال به يک منبع داده ، مي بايست در ابتدا يک Net Data Provider . ، انتخاب گردد . Data Provider ، کلاس هاي لازم بمنظور اتصال به يک منبع داده ، خواندن اطلاعات ، ويرايش ، بهنگام سازي و انجام عمليات متفاوت بر روي داده ها را ارائه مي نمايد . در اين مقاله به تشريح انواع Data Provider پرداخته و با نحوه انتخاب مناسب آنان بمنظور استفاده در برنامه ها ، آشنا خواهيم شد .

NET Data Provider . چيست؟
NET Data Provider .، يک Component کليدي ارائه شده بهمراه معماري ADO.NET بوده که امکان ارتباط بين يک منبع داده و يک Component ، يک سرويس وب XML و يا يک برنامه را فراهم مي نمايد. يک NET Data Provider .، امکان اتصال به منبع داده ، بازيابي داده ها ، انجام عمليات بر روي داده ها و بهنگام سازي منبع داده را فراهم مي نمايد. بهمراه فريمورک دات نت ، Provider هاي زير ارائه شده است :

SQL Server .NET Data Provider

OLE DB .NET Data Provider

در آينده براي ساير منابع داده ، NET Data Provider . مربوطه ايجاد و در دسترس عموم برنامه نويسان قرار خواهد گرفت. هر Provider ، مسئوليت پياده سازي کلاس هاي عمومي ADO.NET را برعهده خواهد داشت . دستاورد رويکرد فوق ، ارتباط با منابع داده متفاوت با استفاده از يک روش يکسان از طريق محيط هاي برنامه نويسي خواهد بود .

کلاس هاي NET Data Provider .
ADO.NET ، از NET Data Provider . ، بمنظور ارتباط به منبع داده ، بازيابي ، عمليات برروي داده ها و بهنگام سازي منبع داده استفاده مي نمايد . هر Provider ، بگونه اي طراحي مي گردد که داراي حجم اندکي بوده و يک لايه حداقل بين کد هاي نوشته شده و منبع داده را ايجاد نمايند . ( افزايش کارائي بدون قرباني نمودن پتانسيل ها !)

فريمورک دات نت ، داراي دو Data Provider است :

SQL Server .NET . امکان دستيابي بهينه به SQL Server 2000 و بانک هاي اطلاعاتي SQL Server 7.0 را فراهم مي نمايد. بدين منظور مي بايست از namespace با نام System.Data.Sqlclient بهمراه برنامه ها، استفاده گردد . Provider فوق، نسبت به OLE DB .NET Data Provider ، داراي کارآئي بمراتب بيشتري است (براي ارتباط با منبع داده از لايه هاي اضافه ديگر نظير: OLE DB و يا ODBC استفاده نمي گردد ).

OLE DB .NET . امکان دستيابي به SQL Server 6.5 و يا نسخه هاي قبل از آن ، بانک هاي اطلاعاتي نظير اوراکل ، Sybase ، DB2/400 و اکسس ماکروسافت را فراهم مي نمايد . بمنظور استفاده از Provider فوق ، مي بايست از namespace با نام System.Data.OleDb بهمراه برنامه ها ، استفاده گردد .

علاوه بر موارد فوق ، ماکروسافت در صدد ارائه يک ODBC .NET Data Provider براي دستيابي به ساير منابع داده است .
ADO.NET ، از يک مدل شي گراء در رابطه با NET Data Providers . استفاده مي نمايد . در SQL Server .NET Data Provider ، اسامي کلاس ها با پيشوند Sql آغاز مي گردد . مثلا" کلاس Connection ، SqlConnection ناميده مي شود. در OLE DB .NET Data Provider ، اسامي کلاس ها با پيشوند OleDb ، آغاز مي گردد . مثلا" کلاس Connection داراي نام OleDbConnection ، مي باشد. چهار کلاس اساسي زير، سهم عمده اي در شکل دهي يک NET Data Provider . را برعهده دارند .

XxxConnection . کلاس فوق ، بمنظور ايجاد يک Connection به يک منبع داده خاص استفاده مي گردد . مثلا" کلاس SqlConnection ، باعث اتصال به منابع داده SQL Server ، مي گردد .

XxxCommand . کلاس فوق ، بمنظور اجراي يک دستور از طريق يک منبع داده ، استفاده مي گردد . مثلا" کلاس SqlCommand ، امکان اجراي Stored Procedure و عبارات SQL در رابطه با يک منبع داده SQL Server ، را فراهم مي نمايد .

XxxDataReader . از کلاس فوق ، بمنظور خواندن اطلاعات از يک منبع داده بصورت فقط خواندني و Forward-only ، استفاده مي گردد . مثلا" کلاس SqlDataReader ، امکان خواندن سطرهائي از جداول در رابطه با يک منبع داده SQL Server را فراهم مي نمايد . کلاس فوق، بعنوان خروجي متد ExecuteReader از کلاس XxxCommand ، برگردانده مي شود. ( اغلب بعنوان ماحصل اجراي يک عبارت SELECT SQL )

XxxDataAdapter . کلاس فوق ، از اشياء XxxCommand استفاده تا يک DataSet را حاوي داده هاي مورد نظر نمايد. در اين راستا ، امکان بهنگام سازي اطلاعات نيز فراهم مي گردد . مثلا" کلاس SqlDataAdapter ، امکان مديريت ارتباط بين يک Dataset و داده هاي ذيربط در يک منبع داده SQL Server را فراهم مي نمايد.

نحوه انتخاب يک Data Provider
انتخاب يک NET Data Provider . مناسب براي يک برنامه، بستگي به نوع منبع داده ئي دارد که قصد ارتباط با آن وجود دارد.

نحوه مراجعه به يک NET Data Provider .
با استفاده از Solution Explorer در ويژوال استوديو دات نت ، مي توان مديريت مراجعات به اسمبلي هائي که مسئوليت NET Data Provider . را بر عهده دارند ، انجام داد . اسمبلي System.Data.dll ( بصورت فيزيکي يک فايل DLL است ) مسئوليت پياده سازي SQL Server .NET Data Provider و OLE DB .NET Data Provider را از طريق Namespace هاي System.Data.SqlClient و System.Data.OleDb ، بر عهده داشته و اسمبلي System.Data.Odbc.dll چنين رسالتي را در رابطه با ODBC .NET Data Provider ، انجام خواهد داد . اسمبلي فوق ، در زمان نصب ويژوال استوديو دات نت ، نصب نخواهد شد . براي دريافت اسمبلي فوق ، مي توان از طريق آدرس : http://msdn.microsoft.com/download ، اقدام و پس از کليک نمودن بر روي NET Framework .، گزينه ODBC .NET Data Provider را انتخاب کرد . بدين ترتيب، زمينه دريافت فايل فوق فراهم مي گردد . پس از دريافت اسمبلي فوق ، مي توان بصورت دستي (Manaually) در يک پروژه به آن مراجعه و از ODBC .NET Data Provider فوق ، استفاده کرد .

SQL Server .NET Data Provider
Provider فوق ، لايه اي نازک بين يک برنامه و SQL Server ايجاد مي نمايد. با توجه به اينکه اين Provider ، از پروتکل اختصاصي خود ( TDS: Tabular Data Stream ) بمنظور ارتباط با يک سرويس دهنده SQL استفاده مي نمايد ، حجم آن اندک و دستيابي به سرويس دهنده SQL مستقيما" و بدون استفاده از لايه هاي اضافه ديگر ، انجام مي گيرد . بدين ترتيب کارائي و قابليت توسعه سيستم ، بهبود پيدا خواهد کرد .

OLE DB .NET Data Provider
Provider فوق ، بمنظور اتصال به يک منبع داده از OLE DB و COM بصورت ذاتي استفاده مي نمايد . بنابراين مي بايست از يک OLE DB Provider استفاده گردد که خود از OLE DB .NET Data Provider استفاده مي نمايد . بمنظور استفاده از OLE DB .NET Data Provider ، مي بايست نوع Provider بصورت يک رشته ، مشخص گردد . واژه Provider در رشته فوق بيانگر نوع OLE DB منبع داده ئي است که به آن متصل مي گرديم .
مثلا" "Provider = MSDAORA" ، شما را به يک بانک اطلاعاتي اوراکل متصل مي نمايد . در زمانيکه از SQL Server .NET Data Provider ، استفاده مي شود ، نيازي به استفاده از واژه Provider نخواهد بود ( فرض مي شود که SQL Server 7.0 و يا قبل از آن باشد) . جدول زير نمونه هائي در اين زمينه را نشان مي دهد :

مثال
منبع داده

Provider = SQLOLEDB;Data Source = Tehran ;Initial
Catalog = pubs;User ID = sa ; Password = 999; SQL Server 6.5

Provider = MSDAORA ; Data Source = ORACLE817 ; User
ID = OLEDB ; Password = OLEDB ; Oracle server

Provider = Microsoft.Jet.OLEDB.4.0;
Data Source = C:\Mydb\Firstdb.mdb ;
Microsoft Access database

ODBC .NET Data Provider
Provider فوق ، بمنظور اتصال به يک منبع داده از توابع API مربوط به ODBC بصورت ذاتي استفاده مي نمايد. اين Provider ، بصورت يک اسمبلي مجزاء و با نام System.Data.Odbc.dll ، پياده سازي شده و بصورت پيش فرض در تمپليت هاي پروژه در ويژوال استوديو دات نت ، انتخاب نشده و مي بايست بصورت دستي به آن مراجعه گردد .

مثال
Provider/Driver
منبع داده

Driver ={Microsoft ODBC for Oracle };
Server = ORACLE817;UID=OLEDB;
PWD = OLEDB; ORA ODBC Oracle Server

Driver = {Microsoft Access Driver (*.mdb)};
DBQ = C:\Mydb\Firstdb.mdb ; Jet ODBC Microsoft Access database

خلاصه
براي انتخاب يک NET Data Provider . ، موارد زير پيشنهاد مي گردد :

اگر منبع داده از نوع SQL Server 7.0 و يا SQL Sever 2000 مي باشد ، SQL Server .NET Data Provider انتخاب گردد .
اگر منبع داده از نوع SQL Server 6.5 و قبل از آن باشد ، OLE DB .NET Data Provider انتخاب گردد .
اگر منبع داده شامل هر نوع منبع داده نامتجانس باشد که امکان دستيابي به آن از طريق OLE DB Provider ، وجود داشته باشد ،
از OLE DB .NET Data Provider استفاده گردد .

اگر منبع داده شامل هر نوع منبع داده نامتجانس باشد که امکان دستيابي به آن از طريق ODBC driver ، وجود داشته باشد ،
از ODBC .NET Data Provider استفاده گردد .

در بخش دوم اين مقاله به بررسي نحوه تعريف يک Connection خواهيم پرداخت .
لينک مقاله
http://www.srco.ir :منبع

مقالات مرتبط با اين موضوع
ارتباط به منابع داده در ADO.NET | ado
ASP.NET و پايگاه داده | ado
مقايسه ADO و ADO.NET | ado
بررسی شیئ DataView در ASP.NET | ado
معرفی ADO و کاربرد آن در ASP بخش 1 و2 | ado

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


نحوه پردازش صفحات ASP.NET بر روي سرويس دهنده وب
برنامه هاي وب از معماري سرويس گيرنده - سرويس دهنده تبعيت نموده و بر روي سرويس دهنده وب مستقر و مسئوليت پاسخگوئي به درخواست هاي ارسالي توسط سرويس گيرندگان را برعهده خواهند داشت .در سمت سرويس گيرنده ، مرورگر و در سمت سرويس دهنده ، سرويس دهنده وب داراي جايگاهي خاص مي باشند . مرورگر ، ميزبان برنامه وب بوده و مهمترين وظيفه آن ارائه بخش رابط کاربر يک برنامه وب است . در اين راستا ، مرورگر داراي پتانسيل لازم به منظور تفسير و نمايش تگ هاي HTML مي باشد .در سمت سرويس دهنده ، برنامه هاي وب با نظارت و مديريت يک سرويس دهنده وب ( مثلا" IIS ) اجراء مي گردند . سرويس دهنده وب ، مسئوليت مديريت برنامه ، پردازش درخواست هاي ارسالي توسط سرويس گيرندگان و ارائه پاسخ لازم به سرويس گيرندگان را بر عهده دارد .به منظور قانونمند کردن ارسال درخواست سرويس گيرندگان و ارائه پاسخ سرويس دهنده ، مي بايست از يک پروتکل ارتباطي خاص استفاده گردد. پروتکل ، مجموعه اي از قوانين لازم بمنظور تشريح نحوه ارتباط دو و يا چندين آيتم از طريق يک محيط انتقال ( زير ساخت انتقال داده ) نظير اينترنت است . در برنامه هاي وب ( ارسال درخواست توسط سرويس گيرنده و پاسخ به درخواست توسط سرويس دهنده ) از پروتکل ارتباطي HTTP)Hypertext Transport Protocol) ، استفاده مي گردد.
ASP.NET پلات فرم مايکروسافت براي طراحي و پياده سازي برنامه هاي وب در دات نت مي باشد . پس از درخواست يک صفحه ASP.NET توسط مرورگر سرويس گيرنده ، پردازش هاي متعددي بر روي سرويس دهنده وب به منظور ارائه پاسخ لازم ، انجام خواهد شد.شايد تاکنون سوالات مختلفي در رابطه با نحوه پردازش صفحات ASP.NET بر روي سرويس دهنده ، براي شما مطرح شده باشد :

پس از درخواست يک صفحه ASP.NET ، بر روي سرويس دهنده وب چه اتفاقي مي افتد ؟
نحوه برخورد سرويس دهنده وب با درخواست ارسالي توسط سرويس گيرنده چگونه است ؟
تگ هاي HTML چگونه توليد و براي مرورگر ارسال مي گردد؟
و شايد سوالات ديگر!
در اين مقاله قصد داريم با نحوه پردازش صفحات ASP.NET بر روي سرويس دهنده بيشتر آشنا شويم . بديهي است تشريح تمامي مراحل با ذکر جزئيات از حوصله يک مقاله خارج بوده و هدف آشنائي با کليات موضوع با يک روند مشخص و سيستماتيک است .

مرحله اول : ايجاد يک درخواست HTTP براي يک صفحه ASP.NET توسط مرورگر
پردازش با درخواست يک صفحه ASP.NET که توسط مرورگر ايجاد مي شود ، آغاز مي گردد .مثلا" يک کاربر ممکن است در بخش آدرس مرورگر کامپيوتر خود آدرس www.srco.ir//Articles/DocView.asp?ID=210 را به منظور دريافت اين مقاله وارد نمايد . مرورگر در ادامه يک درخواست HTTP را از سرويس دهنده وب محل استقرار سايت Srco.ir ايجاد و درخواست فايل حاوي مقاله را مي نمايد .

مرحله دوم : دريافت درخواست HTTP ، توسط سرويس دهنده وب
مهمترين وظيفه سرويس دهنده وب ، دريافت درخواست ارسالي HTTP و ارائه منبع درخواست شده درقالب يک پاسخ HTTP است . سرويس دهنده وب ( مثلا" IIS ) ، پس از دريافت درخواست ارسال شده توسط سرويس گيرنده ، تصميم لازم در رابطه با نحوه برخورد با آن را اتخاذ مي نمايد. محور تصميم گيري فوق بر پايه نوع انشعاب فايل درخواستي استوار مي باشد. مثلا" در صورتيکه فايل درخواستي داراي انشعاب asp. ، باشد ، IIS درخواست را به سمت asp.dll هدايت تا عمليات مرتبط با آن انجام شود . انشعابات فايل متعددي به موتور ASP.NET ، مپ مي گردند . برخي از آنان شامل موارد زير مي باشد :

انشعاب aspx . ، براي صفحات وب ASP.NET
انشعاب asmx . ، براي سرويس هاي وب ASP.NET
انشعاب config . ، براي فايل هاي پيکربندي ASP.NET
انشعاب ashx . ، براي هندلرهاي سفارشي ASP.NET HTTP
انشعاب rem . ، براي منابع راه دور
و ساير انشعابات ديگر

پس از دريافت درخواست ارسالي توسط سرويس گيرنده ، سرويس دهنده وب آن را در اختيار مسئول مربوطه قرار خواهد داد . مثلا" در صورتيکه درخواست دريافتي مربوط به يک صفحه ASP کلاسيک باشد ، درخواست در اخـتيار asp.dll گذاشته شده و يا در صورتيکه درخواست در ارتباط با يک صفحه ASP.NET باشد ، درخواست در اختيار موتور ASP.NET قرار داده مي شود . همانگونه که اشاره گرديد ، معيار اصلي در اين تصميم گيري ، نوع انشعاب فايل درخواست شده توسط سرويس گيرنده مي باشد . شکل زير مراحل اول و دوم اشاره شده را نشان مي دهد .

منبع : http://www.4guysfromrolla.com

مرحله سوم : عملکرد موتور ASP.NET
پس از درخواست يک صفحه ASP.NET توسط سرويس گيرنده و دريافت آن توسط سرويس دهنده وب ، درخواست دريافتي در اختيار موتور ASP.NET قرار داده مي شود . از موتور ASP.NET ، اغلب با نام ASP.NET HTTP pipeline ياد مي گردد. علت نامگذاري فوق ، بدين دليل است که درخواست دريافتي از بين تعداد متغيري از HTTP modules در بين مسير خود براي رسيدن به يک HTTP handler عبور مي نمايد . HTTP modules ، کلاس هائي مي باشند که امکان دستيابي به درخواست دريافتي را دارا مي باشند. اين ماژول ها قادر به بازبيني و بررسي درخواست دريافتي و اتخاد تصميماتي مي باشند که مستقيما" بر نحوه گردش داخلي ( روند برخورد با درخواست ) تاثير خواهد گذاشت . درخواست دريافتي پس از عبور از ماژول هاي مسخص شده HTTP ، به يک HTTP Handler خواهد رسيد . HTTP Handler مسئوليت ايجاد خروجي لازم به منظور ارسال براي مرورگر متقاصي ( ارسال کننده درخواست ) را برعهده دارد. شکل زير ، pipline يک درخواست ASP.NET را نشان مي دهد .

منبع : http://www.4guysfromrolla.com

تعداد زيادي از ماژول هاي HTTP از قبل ايجاد شده، بصورت پيش فرض در HTTP pipline وجود دارد:

OutputCache ، مسئوليت برگرداندن و Caching خروجي صفحات HTML در صورت نياز ، برعهده دارد .

Session ، ماژول فوق ، مسئوليت لود Session state را بر اساس درخواست دريافتي کاربر و روش Session که در فايل Web.config مشخص شده است ، برعهده دارد .

FormsAuthentication ، ماژول فوق ، مسئوليت تائيد کاربران بر اساس مدل تعريف شده Forms Authentication را در صورت ضرورت برعهده دارد .

و موارد ديگر

به منظورآشنائي با ماژول هاي پيش فرض، مي توان مقادير نسبت داده شده به عنصر <httpModules> در فايل machine.config را مشاهده نمود. جدول زير مقدار پيش فرض عنصر <httpModules> را نشان مي دهد .

machine.Config: httpModules Section
Path : $WINDOWS$\Microsoft.NET\Framework\$VERSION$\CONFIG

<httpModules>
<add name="OutputCache" type="System.Web.Caching.OutputCacheModule"/>
<add name="Session" type="System.Web.SessionState.SessionStateModule"/>
<add name="WindowsAuthentication" type="System.Web.Security.WindowsAuthenticationModule"/>
<add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule"/>
<add name="PassportAuthentication" type="System.Web.Security.PassportAuthenticationModule"/>
<add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule"/>
<add name="FileAuthorization" type="System.Web.Security.FileAuthorizationModule"/>
<add name="ErrorHandlerModule" type="System.Web.Mobile.ErrorHandlerModule, System.Web.Mobile,
Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</httpModules>

هندلرهاي HTTP ، نقطه پايان در ASP.NET HTTP pipeline مي باشند . مسئوليت HTTP handler ، توليد خروجي براي منبع درخواست شده است . براي صفحات ASP.NET ، اين به معني Rendering ، کنترل هاي وب به HTML و برگرداندن HTML مي باشد. براي يک سرويس وب ، مسئوليت فوق ، شامل اجراي متد مشخص شده و Wrapping مقاير برگردانده شده به يک پاسخ مناسب و با فرمت SOAP مي باشد . منابع متفاوت ASP.NET از هندلرهاي متفاوت HTTP استفاده مي نمايند.هندلرهاي پيش فرص استفاده شده ، توسط بخش <httpHandlers> فايل machine.config مشخص شده اند. بخش فوق، شامل کلاس هائي است که يا خود HTTP handler بوده و يا HTTP handler factories ، مي باشند. يک HTTP handler factory ، صرفا" يک نمونه از يک HTTP handler را پس از فراخواني ، برمي گرداند . جدول زير ، اطلاعات عنصر <httpHandlers> در فايل machine.config را نشان مي دهد .
machine.Config: httpHandlers Section
Path : $WINDOWS$\Microsoft.NET\Framework\$VERSION$\CONFIG

<httpHandlers>
<add verb="*" path="trace.axd" type="System.Web.Handlers.TraceHandler"/>
<add verb="*" path="*.aspx" type="System.Web.UI.PageHandlerFactory"/>
<add verb="*" path="*.ashx" type="System.Web.UI.SimpleHandlerFactory"/>
. ...
<add verb="*" path="*.resources" type="System.Web.HttpForbiddenHandler"/>
<add verb="GET,HEAD" path="*" type="System.Web.StaticFileHandler"/>
<add verb="*" path="*" type="System.Web.HttpMethodNotAllowedHandler"/>
</httpHandlers>

لازم است به اين نکته اشاره گردد که امکان ايجاد HTTP modules و HTTP handler اختصاصي ، توسط طراحان وپياده کنندگان برنامه هاي وب ASP.NET نيز وجود دارد . پس از ايجاد ماژول ها و هندلرهاي HTTP ، مي توان آنان را به pipeline ملحق تا براي تمامي سايت هاي وب موجود بر سرويس دهنده وب ، قابل استفاده گردند. بدين منظور، مي توان تغييرات لازم را در فايل machine.config اعمال تا زمينه استفاده از آنان توسط تمامي برنامه هاي وب فراهم گردد . در اين رابطه مي توان تغييرات را در فايل Web.config نيز اعمال نمود، در چنين مواردي امکان استفاده از ماژول ها و هندلرهاي HTTP ايجاد شده ، صرفا" براي يک برنامه وب وجود خواهد داشت .

مرحله چهارم : توليد خروجي
آخرين مرحله درارتباط با پردازش يک صفحه ASP.NET بر روي سرويس دهنده وب ، شامل ايجاد خروجي مناسب است . خروجي فوق ، در ادامه از طريق ماژول هاي HTTP عبور داده شده تا مجددا" به IIS برسد . در نهايت IIS ، خروجي توليد شده را براي سرويس گيرنده متقاصي ارسال مي نمايد .مراحل لازم به منظور توليد خروجي با توجه به HTTP handler متفاوت بوده و در ادامه صرفا" يک حالت خاص آن را بررسي مي نمائيم ( هندلر HTTP که از آن به منظور rendering صفحات ASP.NET استفاده مي گردد).
سرويس دهنده وب (IIS) پس از دريافت درخواستي براي يک صفحه ASP.NET ( انشعاب فايل aspx.) ، آن را در اختيار موتور ASP.NET ، قرار خواهد داد. درخواست دريافتي در ادامه از بين ماژول ها عبور داده شده تا به PageHandlerFactory برسد ( در بخش <httpHandlers> فايل machin.config که قبلا" mapping آن انجام شده است ) .
machine.Config: httpHandlers Section :PageHandlerFactory
Path : $WINDOWS$\Microsoft.NET\Framework\$VERSION$\CONFIG

<httpHandlers>
...
<add verb="*" path="*.aspx" type="System.Web.UI.PageHandlerFactory"/>
. ...
</httpHandlers>

کلاس PageHandlerFactory ، يک HTTP handler factory است که وظيفه آن ارائه نمونه اي از يک HTTP handlerبوده که قادر به برخورد مناسب با درخواست ارسالي است.مهمترين رسالت PageHandlerFactory ، يافتن کلاس ترجمه شده اي است که نشاندهنده صفحه ASP.NET درخواستي مي باشد. در صورتيکه از ويژوال استوديو دات نت به منظور ايجاد صفحات ASP.NET استفاده مي گردد ، صفحات وب از دو فايل جداگانه ( يک فايل با انشعاب aspx . ، شامل صرفا" کنترل هاي وب و تگ هاي HTML و يک فايل aspx.vb و يا aspx.cs شامل کلاس code-behind ( کد سمت سرويس دهنده ) ) ، تشکيل مي گردند. در صورتيکه از ويژوال استوديو دات نت استفاده نمي گردد ، مي توان از يک بلاک سمت سرويس دهنده <Script> استفاده تا کد سمت سرويس دهنده را درخود نگهداري نمايد . صرفنظر از اينکه از کدام رويکرد استفاده مي گردد ، زمانيکه صفحه ASP.NET اولين مرتبه و پس از ايجاد تغيير در تگ هاي HTML و يا محتوي کنترل وب ، مشاهده مي گردد ، موتور ASP.NET يک کلاس که مشتق شده از کلاس System.Web.UI.Page مي باشد را ايجاد مي نمايد . کلاس فوق بصورت اتوماتيک ايجاد و کمپايل مي گردد .
Page Class ، عمليات پياده سازي IhttpHandler را انجام خواهد داد. PageHandlerFactory ، در ادامه بررسي لازم در خصوص وجود يک نسخه کمپايل شده از صفحه ASP.NET درخواستي را انجام خواهد داد. در صورتيکه صفحه ترجمه شده وجود نداشته باشد ، PageHandlerFactory آن را بصورت پويا ايجاد و ترجمه خواهد کرد . کلاس فوق ، در ادامه متد خاصي را به منظور توليد HTML ، فرا مي خواند . اطلاعات توليد شده به فرمت HTML ، در نهايـت براي سرويس گيرنده ارسال مي گردد.وجود تاخير در مشاهده صفحات ASP.NET که بر روي آنان تغييراتي اعمال شده است ( HTML و يا محتوي کنترل وب) ، بدين دليل است که موتور ASP.NET نيازمند ايجاد و ترجمه مجدد کلاس مرتبط با صفحه ASP.NET مي باشد.

منبع : http://www.4guysfromrolla.com

پس از ايجاد و ترجمه کلاس توسط PageHandlerFactory ، امکان فراخواني کلاس ايجاد شده به منظور توليد HTML ، فراهم مي گردد . فرآيند Rendering که شامل بدست آوردن HTML لازم براي صفحه ASP.NET درخواست شده مي باشد از حوصله اين مقاله خارج بوده و مي توان در اين رابطه از مقاله The ASP.NET Page Object Model استفاده نمود .
لينک مقاله
http://www.srco.ir :منبع

مقالات مرتبط با اين موضوع
upload کردن فايل به سرور در ASP.NET | aspdotnet
Namespace چيست؟ | aspdotnet
Smart Navigation چيست؟ | aspdotnet
چرا به دات نت احتياج داريم؟ | aspdotnet
نشان دادن قابليتهای مرورگر در ASP.NET | aspdotnet
آشنائی با ASP.NET | aspdotnet
نحوه پردازش صفحات ASP.NET بر روي سرويس دهنده وب | aspdotnet
ارسال ایمیل در ASP.NET با استفاده از HTML Template | aspdotnet
اضافه کردن تصویر به پایگاه داده | aspdotnet
برسی کوکی‌ها (Cookies) و جلسات (Sessions) در ASP.NET | aspdotnet
باز کردن پنجره Popup در ASP.NET با استفاده از Code Behind | aspdotnet
آشنائی با فرم‌های وب در ASP.NET | aspdotnet

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


امنيت برنامه هاي وب ( بخش اول )
هر برنامه کامپيوتري که براي اجراء در محيط شبکه، طراحي و پياده سازي مي گردد ، مي بايست توجه خاصي به مقوله امنيت داشته باشد .برنامه هاي وب از زيرساخت شبکه ( اينترانت ، اينترانت ) براي ارائه خدمات خود به کاربران استفاده نموده و لازم است نحوه دستيابي کاربران به اين نوع از برنامه ها ، کنترل و با توجه به سياست هاي موجود ، امکان دستيابي فراهم گردد .در ابتدا مي بايست کاربران شناسائي و پس از تائيد هويت آنان ، امکان دستيابي به برنامه با توجه به مجوزهاي تعريف شده ، فراهم گردد. ASP.NET ( پلات فرم مايکروسافت براي طراحي و پياده سازي برنامه هاي وب ) ، از سه روش عمده به منظور شناسائي کاربران و اعطاي مجوزهاي لازم در جهت دستيابي و استفاده از يک برنامه وب ، استفاده مي نمايد :

Windows Authentication

Forms Authentication

Passport Authentication

در مجموعه مقالاتي که ارائه خواهد شد به بررسي هر يک از روش هاي فوق در جهت پياده سازي امنيت در برنامه هاي وب خواهيم پرداخت . در بخش اول اين مقاله ، به بررسي نحوه برخورد ASP.NET با کاربران ناشناس ( Anonymous ) ، روش هاي متفاوت شناسائي کاربران و پارامترهاي لازم در خصوص انتخاب يک استراتژي به منظور شناسائي کاربران با توجه به نوع برنامه ها ، خواهيم پرداخت .

شناسائي و تائيد کاربران
Authentication ، فرآيندي است که بر اساس آن کاربران شناسائي مي گردند . Authorization ، فرآيند اعطاي دستيابي به کاربران با توجه به هويت آنان مي باشد . با تلفيق Authentication و Authorization، امکان ايمن سازي برنامه هاي وب در مقابل افراد مزاحم و غير مجاز ، فراهم مي گردد .

دستيابي از طريق کاربران ناشناس ( Anonymous )
اغلب سايت هاي وب از روش دستيابي "Anonymous" ، استفاده مي نمايند . در چنين مواردي ، اطلاعات موجود بر روي سايت جنبه عمومي داشته و امکان دستيابي تمامي کاربران به اطلاعات وجود خواهد داشت . اين نوع سايت ها ، ضرورتي به بررسي مجاز بودن کاربران براي استفاده از منابع موجود ، نخواهند داشت . برنامه هاي وب ASP.NET ، امکان دستيابي Anonymous را به منابع موجود بر روي سرويس دهنده توسط Impersonation ارائه مي نمايند . Impersonation ، فرآيند نسبت دهي يک Account به يک کاربر ناشناس است . Account دستيابي Anonymous بصورت پيش فرض ، IUSER_computername ، مي باشد. با استفاده از Account فوق ، امکان کنترل کاربران ناشناس که به منابع موجود بر سرويس دهنده دستيابي دارند ، وجود خواهد داشت . به منظور مشاهده و تغيير مجوزهاي دستيابي در نظر گرفته شده براي Account فوق از برنامه Computer Management استفاده مي گردد :

ورود به شبکه ( Logon ) به عنوان مديريت شبکه

اجراي Computer Management ( از طريق : Start | Programs | Administrator Tools )

انتخاب فولدر Users به منظور نمايش ليست کاربران

مشاهده گروههائي که Account فوق به عنوان عضوي از آنان مي باشد( کليک بر روي Member of ) . کاربران Anonymous ، بصورت پيش فرض ، عضوي از گروه Guests بوده که داراي مجوزهاي اندکي مي باشد. ASP.NET از ASP.NET Account ( با توجه به تنظيمات پيش فرض) ، به منظور اجراي برنامه وب استفاده مي نمايد . بدين ترتيب ، در صورتيکه برنامه اي سعي در انجام عملياتي نمايد که در ليست مجوزهاي ASP.NET Account وجود نداشته باشد ، يک مورد خاص امنيتي بوجود آمده و امکان دستيابي آن تائيد نخواهد شد.

به منظور اعمال محدوديت در دستيابي کاربران ناشناس مي توان از تنظيمات مربوط به مجوزهاي فايل ويندوز استفاده نمود . براي ايمن سازي ، سرويس دهنده مي بايست داراي سيستم فايل NTFS باشد . سيستم هاي فايل FAT و يا FAT32 ، ايمن سازي در سطح فايل را ارائه نمي نمايند .

دستيابي از طريق کاربران تائيد شده
دستيابي Anonymous ، گزينه اي مناسب براي دستيابي به اطلاعات عمومي و عام است . در صورتيکه برنامه هاي وب شامل اطلاعاتي خاص و خصوصي باشند ، مي بايست در ابتدا کاربران شناسائي و در ادامه با توجه به مجوزهاي تعريف شده ، امکان دستيابي فراهم گردد. در برنامه هاي وب ASP.NET از سه روش عمده به منظور Authentication و Authorization کاربران استفاده مي گردد :

Windows integrated authentication : در روش فوق ، شناسائي و تائيد کاربران بر اساس ليست کاربران تعريف شده بر روي سرويس دهنده انجام خواهد شد. در ادامه با توجه به مجوزها و امتيازات نسبت داده شده به هر Account ، امکان دستيابي و يا عدم دستيابي به منابع موجود بر روي سرويس دهنده ، فراهم مي گردد.

Forms authentication : در روش فوق ، کاربران به يک فرم وب Logon ، هدايت مي گردند . در ادامه ، اطلاعات مربوط به نام و رمز عبور آنان اخذ و فرآيند شناسائي و تائيد بر اساس يک لسيت کاربران و يا از طريق يک بانک اطلاعاتي که برنامه حمايت مي نمايد ، انجام خواهد شد.

Passport authentication : در روش فوق ، کاربران جديد به يک سايت که توسط مايکروسافت ميزبان شده است ، هدايت مي گردند .پس از ريجستر شدن کاربران ، امکان دستيابي آنان به چندين سايت ، فراهم خواهد شد( تمرکز در شناسائي کاربران و استفاده از سايت هاي متعدد با توجه به تائيد بعمل آمده ) .

هر يک از رويکردهاي فوق ، به همراه روش دستيابي Anonymous ، داراي مزاياي مختص به خود بوده و براي نوع خاصي از برنامه هاي وب ، مناسب مي باشند :

نوع برنامه : برنامه وب عمومي اينترنت
روش تائيد کاربران : Anonymous
توضيحات : روش عمومي دستيابي براي اغلب سايت هاي وب ، مي باشد. در اين روش ، ضرورتي به Logon وجود نداشته و با استفاده از مجوزهاي سيستم فايل NTFS ، مي توان ايمن سازي منابعي را که قصد اعمال محدوديت در رابطه با دستيابي به آنان وجود دارد را انجام داد .

نوع برنامه : برنامه وب اينترانت
روش تائيد کاربران : Windows integrated
توضيحات : در روش فوق ، سيستم معتبر سازي ويندوز ، کاربران شبکه را از طريق کنترل کننده Domain ، تائيد مي نمايد. امکان دستيابي به منابع برنامه هاي وب بر اساس مجوزهاي تعريف شده بر روي سرويس دهنده ، براي هر يک از کاربران فراهم مي گردد .

نوع برنامه : برنامه هاي وب تجاري
روش تائيد کاربران : Forms
توضيحات : برنامه هائي که نيازمند دريافت اطلاعات مالي مي باشند ، مي بايست از روش فوق به منظور اخذ و ذخيره سازي اطلاعات ، استفاده نمايند .

نوع برنامه : برنامه هاي متعدد تجاري
روش تائيد کاربران : Passport
توضيحات : در روش فوق ، کاربران يک مرتبه Sign in نموده ( از طريق يک مرکز تائيد کاربران ) و امکان دستيابي و استفاده آنان از تمامي برنامه هائي که از Passport SDK استفاده مي نمايند ، وجود خواهد داشت . اطلاعات کاربران در يک Passport profile نگهداري خواهدشد ( در مقابل استفاده از يک بانک اطلاعاتي محلي ) .

استفاده از Authentication در فايل هاي HTM و يا HTML
سه روش تائيد کاربران که توسط ASP.NET ارائه شده است ، صرفا" در رابطه با فايل هائي که به عنوان بخشي از برنامه وب مي باشند ، بکار گرفته مي شود .فرم هاي وب ( فايل هائي با انشعاب aspx . ) ، ماژول ها ( فايل هائي با انشعاب asax . ) ، نمونه هائي در اين زمينه مي باشند. فرآيند فوق ، صفحات HTML ( فايل هائي با انشعاب HTM و يا HTML ) را شامل نمي گردد و مسئوليت آن بصورت پيش فرض به IIS ( در مقابل ASP.NET ) واگذار شده است. در صورتيکه فصد تائيد کاربراني ( استفاده از يکي از روش هاي Windows,Forms و Passport ) را داشته باشيم که به صفحات HTML از طريق برنامه وب دستيابي دارند ، مي بايست اين نوع فايل ها به ASP.NET executable ، مپ گردند .به منظور مپ نمودن فايل هاي html به ASP.NET executable ، پس از اجراي IIS مراحل زير را دنبال مي نمائيم :

انتخاب فولدر شامل برنامه وب و Properties از طريق Action Menu . در ادامه برنامه IIS ، جعبه محاوره اي Properties را نمايش خواهد داد .

بر روي Directory Tab کليک نموده و در ادامه گزينه Configuration را انتخاب مي نمائيم . IIS در ادامه جعبه محاوره اي Application Configuration را نمايش خواهد داد

بر روي دکمه Add کليک نموده و در ادامه IIS جعبه محاوره اي Add/Edit Application Extension Mapping را نمايش خواهد داد .

بر دکمه Browse کليک نموده و فايل aspnet_isapi.dll را انتخاب مي نمائيم .فايل فوق در دايرکتوري Windows Microsoft .Net Framework قرار داشته و مسير آن مشابه زير است :

Path for aspnet_isapi.dll

C:\windows\Microsoft.NET\Framework\versionnumber\aspnet_isapi.dll

htm. را در فيلد File Extension تايپ مي نمائيم .

مراحل فوق ، براي فايل هاي با انشعاب html ، تکرار مي گردد.
لينک مقاله
http://www.srco.ir :منبع

مقالات مرتبط با اين موضوع
استراتژي حفاظت از اطلاعات در شبکه هاي کامپيوتري ( بخش دوم ) | security
استراتژي حفاظت از اطلاعات در شبکه هاي کامپيوتري ( بخش اول ) | security
نقش عوامل انساني در امنيت شبکه هاي کامپيوتري | security
ايمن سازي سرويس دهنده FTP | security
امنيت برنامه های وب ( بخش سوم ) | security
امنيت برنامه هاي وب ( بخش دوم ) | security
امنيت برنامه هاي وب ( بخش اول ) | security

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


امنيت برنامه هاي وب ( بخش دوم )
در اين مقاله به بررسي Windows Authentication خواهيم پرداخت .
همانگونه که در بخش اول اين مقاله اشاره گرديد ، برنامه هاي وب ASP.NET از سه روش عمده به منظور تائيد کاربران استفاده مي نمايند :

Windows Authentication

Forms Authentication

Passport Authentication

در Windows Authentication ، برنامه هاي وب مسئوليتي را در ارتباط با تائيد کاربران برعهده نگرفته و اين وظيفه تماما" به سيستم عامل ويندوز ، واگذار مي گردد. فرآيند تائيد کاربران در روش فوق، بصورت زير است :

کاربر درخواستي مبني بر دريافت يک صفحه وب ايمن را از برنامه وب ، مي نمايد .

پس از دريافت درخواست توسط سرويس دهنده وب ، IIS عمليات بررسي صلاحيت کاربر را انجام خواهد داد . در اين راستا ، اطلاعات ارائه شده توسط کاربر در زمان logon ( نام و رمز عبور) ، با اطلاعات موجود بر روي سرويس دهنده وب و يا Domain ، مقايسه مي گردد .

در صورتيکه پس از بررسي مدارک ارائه شده توسط کاربر ( نام و رمز عبور ) ، وي به عنوان کاربر غير مجاز تشخيص داده شود ، درخواست وي ناديده گرفته خواهد شد .

کامپيوتر سرويس گيرنده ، يک جعبه محاوره اي Logon را توليد و از کاربر درخواست درج اطلاعات مورد نياز ( نام و رمز عبور ) ، مي گردد . پس از درج اطلاعات درخواستي توسط کاربر و ارسال آنان براي سرويس دهنده ، مجددا" IIS بررسي لازم در خصوص صحت آنان را انجام خواهد داد . در صورتيکه صحت اطلاعات ارسالي کاربر ( نام و رمز عبور ) تائيد گردد ، IIS درخواست اوليه کاربر را به سمت برنامه وب هدايت مي نمايد .

در آخرين مرحله و پس از بررسي و تائيد صلاحيت کاربر ، صفحه وب درخواستي براي کاربر ارسال مي گردد .

مهمترين مزيت روش Windows Authentication ، استفاده مشترک از يک مدل امنيتي به منظور دستيابي به منابع موجود در شبکه و برنامه هاي وب است . پس از تعريف و اعطاي مجوزهاي لازم به کاربر ، امکان دستيابي وي به منابع موجود در شبکه و برنامه هاي وب بر اساس يک سيستم امنيتي مشابه و يکسان ، فراهم مي گردد .
در زمان ايجاد يک پروژه جديد برنامه وب توسط ويژوال استوديو دات نت ، از روش Windows Authentication بصورت پيش فرض به منظور تائيد کاربران استفاده مي گردد .پس از ايجاد يک پروژه جديد برنامه وب در ويژوال استوديو دات نت ، فايل Web.Config بصورت اتوماتيک ايجاد مي گردد . ( يک فايل XML که اطلاعات متفاوتي را در ارتباط با پيکربندي رنامه وب در خود ذخيره مي نمايد ) . محتوي پيش فرض اين فايل بصورت زير است ( صرفا" بخشي که با موضوع اين مقاله ارتباط دارد ، منعکس مي گردد ) :
Web.Config default setting

<authentication mode="Windows" />
<authorization>
<allow users="*" /> <!-- تمامي کاربران -->
</authorization>

در بخش مربوط به عنصر authentication ، سياست تائيد کاربران برنامه هاي وب مخشص مي گردد . براي مشخص نمودن سياست فوق از خصلت mode مربوط به عنصر authentication ، استفاده شده که مي تواند يکي از مقادير : Windows , Forms ,Passport و يا None را دارا باشد . در بخش authorization ، سياست هاي مربوط به کاربران مجاز برنامه وب مشخص مي گردد . در اين رابطه مي توان ، امکان دستيابي و يا عدم دستيابي به برنامه هاي وب را با مشخص نمودن کاربران و يا با توجه به وظايف آنان ، فراهم نمود. ( استفاده از کاراکتر " * " ، به معني همه کاربران بوده و کاراکتر "؟" به منزله کاربران ناشناس و غيرمجاز است) . براي آشنائي با عملکرد روش Windows Authentication ، مراحل زير را دنبال مي نمائيم :

بخش authorization در فايل Web.Config را بصورت زير تغيير مي نمائيم :

Authorization element

<authorization>
<deny users="?" />
</authorization>

تگ هاي زير را که يک جدول HTML را تعريف مي نمايند ، در فرم وب شروع برنامه وب ، قرار مي دهيم :
HTML Table in Startup web form

<TABLE id="tblUser">
<tr>
<TD><STRONG>آيا کاربر تائيد شده است ؟</STRONG></TD>
<TD><Span runat="server" id="spnAuthenticated"></Span></TD>
</tr>
<tr>
<TD><STRONG>نام کاربر </STRONG></TD>
<TD><Span runat="server" id="spnUserName"></Span></TD>
</tr>
<tr>
<TD><STRONG>نوع تائيد کاربر</STRONG></TD>
<TD><Span runat="server" id="spnAuthenticationtype"></Span></TD>
</tr>
</TABLE>

به حالت Design view سوئيچ نموده و کد زير را در فايل Code Behind فرم وب شروع برنامه ، قرار مي دهيم :

Web form's code-behind file

Private Sub Page_Load( ByVal sender As System.Object,ByVal e As System.EventArgs ) Handles Mybase.Load
spnAuthenticated.InnerText = User.Identity.IsAuthenticated
spnUserName .InnerText = User.Identity.Name
spnAuthenticationType.InnerText = User.Identity.AuthenticationType
End Sub

پس از اجراي پروژه بصورت محلي ، ASP.NET تائيد کاربر را بر اساس نام و رمز عبوري که براي ورود به ويندوز استفاده شده است ، انجام خواهد د اد .

پس از اجراي پروژه از راه دور ( مثلا" دستيابي از طريق اينترنت ) ، ASP.NET يک جعبه محاوره اي رادر مرورگر نمايش داده تا از طريق آن نام و رمز عبور کاربر دريافت گردد .

در صورتيکه نام و رمز عبور درج شده توسط کاربر با تعاريف انجام شده در Domain شبکه ، مطابقت نمايد ، ASP.NET کاربر را تائيد و مجوز لازم به منظور استفاده از برنامه وب صادر خواهد شد . در اين رابطه ASP.NET ، يک authorization certificate را به شکل يک کوکي صادر که در حين Session کاربر ، نگهداري و از آن استفاده مي گردد. Session کاربر، پس از اتمام زمان Time out و يا بستن مرورگر ، خاتمه مي يابد . برنامه وب اجراي خود را متناسب با مجوزهاي تعريف شده در ارتباط با Account آغاز مي نمايد .
روش Windows integrated authentication در يک شبکه مبتني بر Domain بهتر کار خواهد کرد . شبکه هائي که از Workgroup استفاده مي نمايند ( در مقابل استفاده از Domain ) داراي محدوديت هاي خاص خود به منظور استفاده از ويژگي هاي امنيتي ، مي باشند. شبکه هاي مبتني بر Domain ، از يک کنترل کننده Domain به منظور تائيد و معتبرسازي کاربران شبکه ، استفاده مي نمايد .
با استفاده از امکانات ارائه شده در فايل Web.Config مي توان يک لايه امنيتي مضاعف را ايجاد نمود . دراين راستا ، مي توان تنظيمات لازم به منظور دستيابي و يا عدم دستيابي کاربران و يا گروه هاي خاصي از کاربران را نيز انجام داد .

اعمال محدوديت براي کاربران خاص ( دستيابي و يا عدم دستيابي )
در موارديکه از روش Windows integrated authentication استفاده مي گردد ، ASP.NET ، ليست تائيد موجود در فايل Web.Config را به منظور آگاهي از صلاحيت کاربران شبکه براي استفاده ازبرنامه وب ، بررسي مي نمايد. کاراکترهاي "*" و "؟" داراي معاني خاصي در ليست تائيد مي باشند : کاراکتر "* " ، نشاندهنده تمامي کاربران و کاراکتر "؟"، نشاندهنده کاربران غير مجاز( ناشناس) مي باشد . مثلا" ليست تائيد زير در Web.Config ، امکان دسـتيابي تمامي کاربران ناشناس به برنامه وب را حذف و مي بايست تمامي کاربران به منظور استفاده از برنامه وب ،تائيد گردند .

Authorization element

<authorization>
<deny users="?" />
</authorization>

به منظور اعمال محدوديت در دستيابي کاربراني خاص ،مي توان از عنصر <allow> استفاده و اسامي تمامي کاربران مجاز را با صراحت مشخص نمود (اسامي توسط ويرگول از يکديگر تفکيک مي گردند) . پس از معرفي کاربران مجاز با استفاده از عنصر <allow> ، مي بايست با بکارگيري عنصر <deny> ، امکان دستيابي به برنامه توسط کاربران غير مجاز، سلب مي گردد .
Authorization element

<authorization>
<allow users="Ali Reaz , Reza Ali " />
<deny users="*" />
</authorization>

ليست مجاز فوق ، امکان دستيابي دو کاربر که اسامي آنان با صراحت مشخص شده است را به برنامه وب خواهد داد. ساير کاربران ، امکان دستيابي به برنامه وب را دارا نخواهند بود ( نقش عنصر deny در مثال فوق ) علاوه بر ليست مجاز فوق که اسامي دو کاربر را مشخص و آنان را براي استفاده از برنامه وب مجاز مي نمايد ، دو کاربر فوق ، مي بايست داراي Account لازم در Domain شبکه نيز باشند .

تائيد کاربران بر اساس نوع وظيفه
براي تائيد کاربران به منظور استفاده از يک برنامه مي توان ، مجوزهاي لازم را بر اساس وظيفه آنان در سازمان ، صادر و امکان دستيابي و يا عدم دستيابي را براي آنان فراهم نمود. در ويندوز NT و XP ، وظايف به اسامي مپ شده تا از اين طريق امکان شناسائي گروه هاي کاربران ، فراهم گردد. ويندوز، چندين گروه را بصورت اتوماتيک از قبل ايجاد مي نمايد : Administrators ,Users و Guests . در اين رابطه مي توان از عنصر <roles> در ليست استفاده کنندگان مجاز برنامه وب در فايل Web.Config استفاده و امکان دستيابي به يک برنامه را با توجه به وظايف کاربر ، فراهم نمود. مثلا" ليست زير، امکان دستيابي به برنامه وب را صرفا" براي کاربراني که به عنوان Administrator به شبکه وارد مي شوند ، فراهم مي نمايد.
Authorization element

<authorization>
<allow roles ="Administrators" />
<deny users="*" />
</authorization>

پس از تائيد کاربر و صدور مجوز لازم به منظور استفاده از برنامه وب ، مي توان با استفاده از خصلت Identity مربوط به شي User ، هويت کاربر ( نام و نوع وظيفه ) را از طريق برنامه شناسائي نمود.خصلت فوق، يک شي را که شامل اطلاعات مربوط به نام و وظيفه کاربراست را برمي گرداند .

Web form's code-behind file

Private Sub Page_Load( ByVal sender As System.Object,ByVal e As System.EventArgs ) Handles Mybase.Load
spnAuthenticated.InnerText = User.Identity.IsAuthenticated
spnUserName .InnerText = User.Identity.Name
spnAuthenticationType.InnerText = User.Identity.AuthenticationType
End Sub

به منظور آگاهي و انجام عمليات لازم با توجه به نوع وظيفه کاربر که از برنامه وب استفاده مي نمايد ، مي توان از متد IsInRole شي User ، استفاده نمود .

IsInRole method

If User.IsInRole("Administrators") Then
'انجام عمليات دلخواه
End If

استفاده از تنظيمات IIS به همراه Windows Authentication
تنظيمات Authorization در فايل Web.Config با تنظيمات انجام شده در IIS با يکديگر Overlap مي شوند . در صورتيکه Authorization هم در فايل Web.Config و هم توسط IIS تنظيم شده باشد ، در ابتدا تنظيمات IIS بررسي و در ادامه تنظيمات موجود در فايل Web.Config ، مورد توجه قرار خواهند گرفت. به منظور مشاهده تنظيمات authorization در IIS مراحل زير را دنبال مي نمائيم :

در IIS بر روي فولدر برنامه وب کليک سمت راست نموده و در ادامه گزينه Properties را انتخاب مي نمائيم . برنامه IIS در ادامه جعبه محاوره اي Properties مربوط به فولدر را نمايش خواهد داد .

بر روي Directory Security Tab کليک و در ادامه دکمه Edit را در گروه Anonymous Access And Authentication Control کليک مي نمائيم . IIS ، جعبه محاوره اي Authentication Methods را نمايش خواهد داد .

اولين گروه از تنظيمات در جعبه محاوره اي ، کنترل دستيابي Anonymous را انجام مي دهد ( همه کاربران ). غير فعال نمودن گزينه فوق ، معادل <"?" = deny User > در فايل Web.config است.

Check Box هاي موجود در قسمت دوم جعبه محاوره اي ، مجاز بودن برنامه به منظور استفاده از Basic و يا Digest Authentication را علاوه بر Windows Authentication ، مشخص مي نمايد. روش هاي فوق ، ايمني بمراتب کمتري را نسبت به Windows Integrated ارائه مي نمايند .مي توان چندين روش authentication را در IIS فعال نمود . در صورتيکه چندين روش فعال شده باشد ، مي توان با استفاده از متد AuthenticationType مربوط به شي Identity ، از روش استفاده شده به منظور تائيد کاربر ، آگاهي يافت .

AuthenticationType method

Response.Write(User.Identity.AuthenticationType)
لينک مقاله
http://www.srco.ir :منبع

مقالات مرتبط با اين موضوع
استراتژي حفاظت از اطلاعات در شبکه هاي کامپيوتري ( بخش دوم ) | security
استراتژي حفاظت از اطلاعات در شبکه هاي کامپيوتري ( بخش اول ) | security
نقش عوامل انساني در امنيت شبکه هاي کامپيوتري | security
ايمن سازي سرويس دهنده FTP | security
امنيت برنامه های وب ( بخش سوم ) | security
امنيت برنامه هاي وب ( بخش دوم ) | security
امنيت برنامه هاي وب ( بخش اول ) | security

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


امنيت برنامه های وب ( بخش سوم )
در اين مقاله به بررسي Forms Authentication خواهيم پرداخت .
همانگونه که در بخش اول اين مقاله اشاره گرديد ، برنامه هاي وب ASP.NET از سه روش عمده به منظور تائيد کاربران استفاده مي نمايند :

Windows Authentication

Forms Authentication

Passport Authentication

در Forms Authentication ، برنامه IIS مسئوليتي را در ارتباط با تائيد کاربران برعهده نگرفته و تنظيمات امنيتي IIS در رابطه با برنامه وب ، دستيابي Anonymous مي باشد . فرآيند تائيد کاربران در روش فوق، بصورت زير است :

زمانيکه سرويس گيرنده درخواست يک صفحه ايمن را مي نمايد ، IIS کاربر را به عنوان Anonymous، تائيد و در ادامه درخواست وي را براي ASP.NET ارسال مي نمايد .

ASP.NET ، بررسي لازم در خصوص وجود يک کوکي خاص بر روي کامپيوتر سرويس گيرنده را انجام خواهد داد .

در صورتيکه کوکي ، موجود نبوده و يا غيرمعتبر باشد ، ASP.NET درخواست کاربر را ناديده گرفته و براي وي يک صفحه Logon را ارسال مي نمايد ( مثلا" Login.aspx ).

کاربر اطلاعات لازم ( نام و رمز عبور ) را در صفحه Logon.aspx ( به عنوان نمونه ) درج و در ادامه دکمه Submit موجود بر روي فرم را به منظور ارسال اطلاعات براي سرويس دهنده ، فعال مي نمايد.

IIS ، مجددا" کاربر را به عنوان Anonymous، تائيد و درخواست وي را براي ASP.NET ارسال مي نمايد .

ASP.NET ، تائيد کاربر را بر اساس اطلاعات ارسالي ( نام و رمز عبور ) انجام و يک کوکي را ايجاد مي نمايد .

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

فرآيند فوق را مي توان به دو حالت متفاوت تعميم و مورد توجه قرار داد :

حالت اول : درخواست يک صفحه ايمن از سرويس دهنده ، توسط يک کاربر غيرمجاز و تائيد نشده
مرحله اول : پس از درخواست يک سرويس گيرنده براي دستيابي به يک صفحه ايمن ، درخواست ارسالي وي در ابتدا توسط IIS بررسي و با توجه به اينکه تنظيمات IIS بصورت Anonymous پيکربندي شده تا امکان استفاده از Forms Authentication فراهم گردد ، درخواست کاربر ، مستقيما" براي ماژول ASP.NET Forms Authentication ارسال مي گردد .
مرحله دوم : ASP.NET ، بررسي لازم در خصوص وجود ( داشتن ) يک کوکي Authentication را انجام خواهد داد . با توجه به اينکه کاربر اولين مرتبه است که درخواست اطلاعاتي را نموده و داراي يک کوکي نمي باشد ، سرويس گيرنده به صفحه Logon ، هدايت مي گردد .
مرحله سوم : کاربراطلاعات ضروري ( نام و رمز عبور ) خود را در صفحه Logon درج و پس ازارسال آنان ،فرآيند بررسي اطلاعات ارسالي آغاز مي گردد. در يک برنامه بزرگ ، بررسي اطلاعات کاربر از طريق يک بانک اطلاعاتي شامل مشخصات کاربران انجام مي شود .
مرحله چهارم : در صورتيکه اطلاعات ارسالي کاربر ( نام و رمز عبور ) ، پس از بررسي توسط برنامه وب ، معتبر شناخته نگردند ، مجوز دستيابي براي کاربر صادر نشده و امکان دستيابي وي سلب مي گردد .
مرحله پنجم : در صورتيکه پس از بررسي اطلاعات ارسالي، اعتبار وصحت آنان تائيد گردد ، يک کوکي تائيد ايجاد و در ادامه به کاربر مجوز لازم به منظور دستيابي به صفحه ، اعطاء مي گردد .(هدايت کاربر به صفحه درخواست اوليه ) .

حالت دوم : درخواست يک صفحه ايمن از سرويس دهنده ، توسط يک کاربر مجاز و تائيد شده
مرحله اول : پس از درخواست يک صفحه ايمن توسط سرويس گيرنده ، کوکي Authentication بهمراه درخواست وي براي سرويس دهنده ، ارسال مي گردد.
مرحله دوم :درخواست ارسالي توسط سرويس گيرنده در ابتدا توسط IIS دريافت و با توجه به تنظيمات انجام شده ( دسيتابي Anonymous ) ، درخواست وي مستقيما" براي ASP.NET Forms Authentication ارسال مي گردد .
مرحله سوم : ماژول ASP.NET Forms Authentication ، بررسي لازم در خصوص کوکي را انجام و در صورتيکه کوکي معتبر باشد ، سرويس گيرنده تائيد و امکان دستيابي و مشاهده صفحه وب درخواستي براي وي ، فراهم مي گردد .

در روش Forms Authentication ، بصورت اتوماتيک يک فرم وب طراحي شده به منظور اخذ اطلاعات مربوط به نام و رمز عبور کاربران ، نمايش داده مي شود . کد مرتبط با فرم وب ، عمليات تائيد و معتبرسازي کاربر را بر اساس ليست ذخيره شده در فايل Web.Config برنامه و يا از طريق يک بانک اطلاعاتي جداگانه ، انجام مي دهد. مزيت مهم Forms Authentication ، عدم ضرورت عضويت کاربران در Domain شبکه به منظور دستيابي به برنامه وب ، مي باشد .

فعال نمودن Forms Authentication
به منظور استفاده از روش فوق ، مي بايست مراحل زير را دنبال نمود :

مقداردهي Authentication mode در فايل Web.config به Forms

ايجاد يک فرم وب به منظور اخذ اطلاعات کاربران ( Logon Page )

ايجاد يک فايل و يا بانک اطلاعاتي به منظور ذخيره نام و رمز عبور کاربران

نوشتن کد لازم به منظور افزودن کاربر جديد به فايل و يا بانک اطلاعاتي کاربران

نوشتن کد لازم به منظور تائيد کاربران با استناد به فايل و يا بانک اطلاعاتي کاربران

Forms Authentication ، از کلاس هاي موجود در namespace با نام System.Web.Security استفاده مي نمايد . به منظور استفاده از کلاس هاي فوق، مي بايست در ويژوال بيسک دات نت از عبارت Imports و در ويژوال سي شارپ از Using استفاده گردد ( در ابتداي هر ماژول که عمليات تائيد را انجام خواهد داد : Imports System.Web.Security ) .

مقداردهي Authentication mode
نوع تائيد کاربران در يک برنامه وب ، مي بايست با استفاده از عنصر <authentication> در فايل Web.config مشخص گردد. به منظور تنظيم برنامه مورد نظر خود براي استفاده از Forms Authentication ، تغييرات زير را در فايل Web.Config ، اعمال مي نمائيم :

Web.Config setting for Forms Authentication

<authentication mode="Forms">
<forms loginUrl = Login.aspx" >
<credentials passwordFormat = "Clear" >
<user name = "Ali" Password ="110" />
<user name = "Kaveh" Password ="111" />
</credentials>
</forms>
</authentication>

کد فوق، يک نوع ساده از تائيد کاربران به روش Forms را نشان مي دهد . در اين رابطه ، اغلب از تعاريف و تنظيمات پيش فرض و يک ليست کاربران مجاز، استفاده شده است. از عناصر متفاوتي در ارتباط با Forms Authentication در فايل Web.Config استفاده مي گردد.هر يک از عناصر داراي خصلت هاي خاص خود مي باشند :

عنصر <authentication>
خصلت Mode ، با استفاده از خصلت فوق ، روش تائيد و شناسائي کاربران مشخص مي گردد. با مقدار دهي خصلت فوق به Forms ، روش Forms Authentication انتخاب خواهد شد.

عنصر <forms>
خصلت name . از خصلت فوق به منظور مشخص نمودن نام کوکي که اطلاعات مربوط به نام و رمز عبور را ذخيره مي نمايد ، استفاده مي شود . مقدار پيش فرض ، authaspx . مي باشد . در صورتيکه بيش از يک برنامه بر روي سرويس دهنده از روش Forms Authentication استفاده مي نمايند ، مي بايست براي هر يک از آنان نام منحصربفردي در نظر گرفته شود .
خصلت loginUrl .از خصلت فوق به منظور مشخص نمودن نام فرم وب Login براي کاربران تائيد نشده ، استفاده مي گردد . مقدار پيش فرض خصلت فوق، Default.aspx است .
خصلت protection . با استفاده از خصلت فوق روش حفاظت کوکي Authentication که بر روي کامپيوتر سرويس گيرنده ذخيره مي گردد ، مشخص خواهد شد. مقدار پيش فرض خصلت فوق ، All بوده که عمليات رمزنگاري و بررسي اعتبار و صحت داده در رابطه با آن اعمال مي گردد. ساير گزينه هاي موجود در اين راستا ، Encryption,Validation و None مي باشد .
خصلت timeout . با استفاده از خصلت فوق ، مدت زمان نگهداري کوکي Authentication بر روي ماشين کاربر مشخص مي گردد . مقدار پيش فرض 30 دقيقه است . ASP.NET ، پس از دريافت يک درخواست جديد توسط کاربر و مشروط به گذشت بيش از نصف زمان تعريف شده ، کوکي را تجديد ( Renew ) خواهد کرد .
خصلت path . با استفاده از خصلت فوق ، مسير مورد نظر به منظور ذخيره سازي کوکي بر روي ماشين کاربر مشخص مي گردد . مقدار پيش فرض ، "\" است .

عنصر <credentials>
خصلت passwordFormat ، با استفاده از خصلت فوق ، الگوريتم لازم به منظور رمزنگاري رمز عبور کاربر ، مشخص مي گردد . مقدار پيش فرض ، SHA1 مي باشد . ساير گزينه هاي موجود در اين رابطه ، MD5 و Clear ( بدون رمزنگاري ) مي باشد .

عنصر <users>
خصلت name ، با استفاده از خصلت فوق ، نام کاربر مشخص مي گردد.
خصلت password ، با استفاده از خصلت فوق ، رمز عبور کاربر مشخص مي گردد.

عنصر <credentilas> ، امکان ذخيره سازي ليست کاربران را در Web.Config فراهم مي نمايد . رويکرد فوق ، روشي ساده به منظور تعريف کاربران مجاز يک برنامه وب مي باشد . در چنين مواردي ، مديريت سيستم مي تواند بسادگي و در صورت لزوم نام و رمز عبور کاربران ديگري را به ليست مجاز کاربران ، اضافه نمايد . مکانيزم فوق ، در مواردي که قصد داشته باشيم ، امکان تعريف نام و رمز عبور را در اختيار کاربران قرار دهيم ، گزينه مناسبي نبوده و مي بايست از يک فايل و يا بانک اطلاعاتي به منظور ذخيره سازي اطلاعات کاربران ، استفاده گردد.
لينک مقاله
http://www.srco.ir :منبع

مقالات مرتبط با اين موضوع
استراتژي حفاظت از اطلاعات در شبکه هاي کامپيوتري ( بخش دوم ) | security
استراتژي حفاظت از اطلاعات در شبکه هاي کامپيوتري ( بخش اول ) | security
نقش عوامل انساني در امنيت شبکه هاي کامپيوتري | security
ايمن سازي سرويس دهنده FTP | security
امنيت برنامه های وب ( بخش سوم ) | security
امنيت برنامه هاي وب ( بخش دوم ) | security
امنيت برنامه هاي وب ( بخش اول ) | security

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


ايمن سازي سرويس دهنده FTP
سرويس FTP)File Transfer Protocol) يکي از قديمي ترين و متداولترين سرويس هاي موجود بر روي اينترنت است . از سرويس فوق ، بمنظور ارسال و دريافت فايل در يک شبکه استفاده مي گردد. سرويس FTP ، توسط عموم کاربران اينترنت استفاده و بعنوان استانداردي براي ارسال و دريافت فايل در شبکه ( اينترانت ، اينترنت ) توسط اکثر سيستم هاي عامل پذيرفته شده است
ويندوز 2000 بهمراه خود از يک سرويس دهنده FTP استفاده مي نمايد که بعنوان بخشي از IIS در نظر گرفته مي شود. مديران سيستم با استفاده از سرويس فوق و ترکيب آن با ساير امکانات ارائه شده توسط ويندوز ، قادر به ايجاد و پيکربندي يک سايت FTP با ضريب امنيتي مناسبي خواهند بود.در ادامه و بمنظور ايمن سازي يک سايت FTP ، پيشنهادات متعددي ارائه مي گردد.

نکته اول : دستيابي از طريق Anonymous account را غير فعال نمائيد . دستيابي از نوع Anonymouse، بصورت پيش فرض و پس از نصب اولين سرويس دهنده FTP فعال مي گردد. روش فوق ، امکان دستيابي به سايت FTP را بدون نياز به يک account خاص فراهم مي نمايد. بدين ترتيب استفاده کنندگان بصورت کاملا" ناشناس قادر به استفاده از منابع موجود بر روي سرويس دهنده FTP بوده و امکان مشاهده سودمند ترافيک سايت و در صورت ضرورت، رديابي آنان وجود نخواهد داشت . با حذف قابليت دستيابي Anonymous ، امکان دستيابي به سايت FTP صرفا" در اختيار کاربراني قرار خواهد گرفت که داراي يک account معتبر باشند.
پس از تعريف هر يک از account هاي مورد نظر، مي توان در ادامه با استفاده از ACL)Access Control List) کنترل ها و مجوزهاي مربوط به دستيابي به دايرکتوري FTP ( محل فيزيکي استقرار سايت FTP بر روي ديسک ) را تعريف و مشخص نمود . در اين رابطه مي توان از مجوزهاي NTFS استفاده کرد. به منظور غير فعال نمودن Anonymous account ، مي توان از طريق صفحه Property مربوط به سايت FTP ( برنامه Internet Information Service ) عمليات مورد نظر را انجام داد .

نکته دوم : فعال نمودن Logging . با فعال نمودن Logging بمنظور اتصال به سايت FTP ، اين اطمينان بوجود خواهد آمد که اطلاعات لازم ( آدرس هاي IP و يا نام کاربران ) در خصوص کاربراني که بصورت موفقيت آميز به سايت متصل شده اند ، ثبت خواهد شد.با استفاده از فايل هاي لاگ که در اين رابطه ايجاد خواهد شد ، مي توان ترافيک موجود بر روي سايت را مشاهده و در صورت يک تهاجم ، امکان رديابي اوليه آن فراهم گردد. بمنظور فعال نمودن ويژگي فوق، کافي است که Chex box مربوطه از طريق صفحه Property مربوط به سايت FTP انتخاب گردد .در ادامه ، فايل هاي لاگ بر اساس فرمتي که مشخص شده است ، ايجاد خواهند شد . استفاده از فايل هاي لاگ ، بمنظور مشاهده و آناليز ترافيک سايت بسيار مفيد خواهد بود.

نکته سوم : تنظيم و پيکربندي مناسب ليست ACL ( ليست کنترل دستيابي ) .دستيتابي به دايرکتوري FTP مي بايست با استفاده از مجوزهاي NTFS و بکارگيري محدوديت هاي ACL ، کنترل گردد . دايرکتوري FTP نبايد داراي گروه Everyone با تمامي امتيازات و مجوزها باشد ( امکان کنترل مجوزها و کاربراني که سايت FTP متصل شده اند وجود نخواهد داشت ) .بدين منظور لازم است بر روي دايرکتوري مربوط به سايت FTP مستقر و با انتخاب گزينه Property و Security Option ، اسامي موجود را حذف و با انتخاب دکمه Add از ليست موجود، Authenticated user را انتخاب کرد . در ادامه مي توان با توجه به سياست هاي موجود مجوز Read,Write و List Folder contents را در اختيار گروه مربوطه قرار داد . در صورتيکه سياست موجود اقتضاء مي کند ، مي توان صرفا" امکان دستيابي Write را در اختيار گروه مربوطه قرار و مجوزهاي Read وList Folder Contents را از آنها سلب نمود .

نکته چهارم : پيکربندي سايت بعنوان دريافت کننده نه ارسال کننده . در صورتيکه صرفا" نياز است که کاربران فايل هائي را براي سرويس دهنده ، ارسال و امکان دريافت فايل از سرويس دهنده را نداشته باشند ، مي توان سايت FTP را بصورت Blind put پيکربندي نمود. بدين ترتيب به کاربران امکان ارسال ( نوشتن ) فايل بر روي سرويس دهنده داده خواهد شد .( امکان خواندن از دايرکتوري FTP وجود نخواهد داشت ) . بدين منظور مي توان پس از انتخاب سايت FTP از طريق Home Directory ، اقدام به تنظيمات مورد نظر نمود.

نکته پنجم : فعال نمودن Disk Quotas. با استفاده از امکانات ارائه شده توسط ويندوز 2000 ، مي توان اقدام به تعيين ظرفيت و يا سهيه ذخيره سازي بر روي ديسک براي هر يک از کاربران نمود..ويژگي فوق ، باعث اعمال محدوديت در رابطه با ميزان فضاي ذخيره سازي مربوط به يک کاربر مي گردد.بصورت پيش فرض ، مالکيت به هر کاربر که در فايلي مي نويسد اعطاء مي گردد . با فعال نمودن و انجام تنظيمات مورد نظر، مي توان پيشگيري لازم در ارتباط با تهاجم به يک سايت FTP را انجام داد ( پر نمودن ظرفيت ديسک ). در صورت تحقق وضعيت فوق ، دامنه اشکال بوجود آمده به ساير سرويس هائي که از فضاي ذخيره سازي ديسک استفاده مي نمايند نيز سرايت خواهد کرد. براي فعال نمودن Quota Management ، بر روي درايو موردنظر مستقر و با کليک سمت راست گزينه Property را انتخاب و در نهايت گزينه Quota Tab انتخاب شود .امکان فوق ، صرفا" در ارتبا ط با پارتيشن هاي NTFS قابل استفاده خواهد بود.استفاده از Disk Quota ، محدود به پارتيش هاي NTFS بوده و علاوه بر اين صرفا" مي تواند در رابطه با يک کاربر استفاده شده وامکان بکارگيري آن در ارتباط با گروه ها وجود نخواهد داشت . با انتخاب دکمه Quota Entries مي توان اقدام به تعريف يک Entry جديد و تعريف محدوديت هاي مورد نظر نمود.

نکته ششم : استفاده از محدوديت زماني براي Logon . با استفاده از امکانات ارائه شده همراه ويندوز 2000 ، مي توان زمان خاصي را براي ورود به شبکه کا ربران تعريف نمود. بدين ترتيب کاربران صرفا" قادر به استفاده از سرويس دهنده در ساعات مشخص شده خواهند بود.ويژگي فوق ، بطرز محسوسي باعث کنترل دستيابي به سايت FTP خواهد شد. براي پيکربندي زمان logon ، از برنامه Active Directory Users and Computers استفاده مي گردد . پس از فعال شدن برنامه فوق ، کاربر مورد نظر را انتخاب و پس از مشاهده صفحه Property مربوطه، با انتخاب دکمه Logon hours از طريق Account Tab ، مي توان اقدام به مشخص نمودن زمان مورد نظر کاربر براي استفاده ازسرويس دهنده نمود.

نکته هفتم : محدوديت دستيابي بر اساس آدرس IP . بمنظور دستيابي به سايت FTP مي توان معيار دستيابي را بر اساس آدرس هاي IP خاصي در نظر گرفت . با اعمال محدوديت فوق ، اقدامات مناسبي بمنظور کنترل دستيابي به سايت در نظر گرفته خواهد شد . بمنظور فعال نمودن ويژگي فوق ، پس از انتخاب سايت FTP از طريق برنامهInternet Information Services و مشاهده صفحه Property ، گزينه Directory Security Tab انتخاب گردد. در ادامه، Denied Access فعال و مي توان با استفاده از دکمه Add آدرس هاي IP تائيد شده را معرفي کرد.

نکته هشتم :ثبت رويدادهاي Audit logon . با فعال نمودن Auditing ( مميزي ) مربوط به رويدادهاي Account Logon ، مي توان تمامي تلاش هاي موفقيت آميز و يا با شکست مواجه شده جهت اتصال به سايت FTP را با استفاده از Security log مربوط به Event Viewer ، مشاهده نمود. مشاهده ادواري اين لاگ مي تواند عامل موثري در کشف ، تشخيص و رديابي تهاجم به يک سايت باشد. (تشخيص مزاحمين و مهاجمين اطلاعاتي ). بمنظور فعال نمودن ويژگي فوق ، از برنامه Local Security Policy و يا Group Policy استفاده مي گردد (Programs|Administrative Tools ) . پس از فعال شدن برنامه فوق و استقرار در Local Policies/audit policy ، مي توان اقدام به تغيير Local Setting به Success و Failure نمود.

نکته نهم : فعال نمودن Strong Password . استفاده از رمزهاي عبور پيچيده ،روشي مناسب بمنظور افزايش امنيت در خصوص ارائه يک سرويس خاص براي کاربران تائيد شده است . با توجه به جايگاه سرويس دهنده FTP ، استفاده از رمزهاي عبور قدرتمند مي تواند عاملي موثر در جهت افزايش امنيت سايت هاي FTP باشد . با استفاده از امکانات ارائه شده در ويندوز 2000 ، مديران سيستم مي توانند کاربران را مجبور به استفاده از رمزهاي عبور مستحکم و قوي نمايند. بمنظور فعال نمودن ويژگي فوق ، از برنامه Local Security Policy و يا Group Policy استفاده مي گردد (Programs|Administrative Tools ) . پس از فعال شدن برنامه فوق و استقرار در Account Policy/Password Policy ، مي توان گزينه Passwords Must Meet Complexity Requirements را فعال نمود . پس از فعال شدن ويژگي فوق ، هر يک از account هاي تعريف شده تابع شرايط و محدوديت هاي زير خواهند بود :

رمز عبور تعريف شده نمي تواند شامل تمام و يا بخشي از نام Account کاربر باشد .
رمز عبور تعريف شده مي بايست داراي طولي به اندازه حداقل شش باشد .
رمز عبور تعريف شده مي تواند شامل کاراکترها ئي از سه گروه از چهار گروه زير باشد :
- حروف الفبائي A-Z
- حروف الفبائي a-z
- ارقام صفر تا نه
- کاراکترهاي خاص ( %,#,$,!)

نکته دهم : فعال نمودن Account Lockout و Account Lockout Threshold .آگاهي و تشخيص رمزهاي عبور يکي از موضوعات مورد علاقه اکثر مهاجمان و برنامه هاي تشخيص دهنده رمز عبوراست .با استفاده از امکانات ارائه شده بهمراه ويندوز 2000 ، مديران شبکه مي توانند تعداد دفعاتي را که يک کاربرسعي در ورود به شبکه مي نمايد و عمليات وي با موفقيت همراه نمي گردد را مشخص و در صورت تحقق شرايط فوق ، account مربوطه غير فعال گردد. با فعال نمودن ويژگي فوق و پيکربندي ميزان آستانه ، مديران شبکه مي توانند عماکرد برنامه هاي تشخييص دهنده رمز هاي عبور و يا مهاجمان اطلاعاتي را محدود و ضريب ايمني را افزايش دهند. بمنظور فعال نمودن ويژگي فوق ، از برنامه Local Security Policy و يا Group Policy استفاده مي گردد (Programs|Administrative Tools ) . پس از فعال شدن برنامه فوق و استقرار در Account Policy/Account Lockout Policy ، مي توان تنظيمات لازم در خصوص Account Lockout duration , Account lockout threshold و Reset account lockout counter after را انجام داد .

لينک مقاله
http://www.srco.ir :منبع

مقالات مرتبط با اين موضوع
استراتژي حفاظت از اطلاعات در شبکه هاي کامپيوتري ( بخش دوم ) | security
استراتژي حفاظت از اطلاعات در شبکه هاي کامپيوتري ( بخش اول ) | security
نقش عوامل انساني در امنيت شبکه هاي کامپيوتري | security
ايمن سازي سرويس دهنده FTP | security
امنيت برنامه های وب ( بخش سوم ) | security
امنيت برنامه هاي وب ( بخش دوم ) | security
امنيت برنامه هاي وب ( بخش اول ) | security

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


نقش عوامل انساني در امنيت شبکه هاي کامپيوتري
يک سيستم کامپيوتري از چهار عنصر : سخت افزار ، سيستم عامل ، برنامه هاي کاربردي و کاربران ، تشکيل مي گردد. سخت افزار شامل حافظه ، دستگاههاي ورودي ، خروجي و پردازشگر بوده که بعنوان منابع اصلي پردازش اطلاعات ، استفاده مي گردند. برنامه هاي کاربردي شامل کمپايلرها ، سيستم هاي بانک اطلاعاتي ، برنامه هاي تجاري و بازرگاني ، بازي هاي کامپيوتري و موارد متنوع ديگري بوده که روش بخدمت گرفتن سخت افزار جهت نيل به اهداف از قبل تعريف شده را مشخص مي نمايند. کاربران ، شا مل انسان ، ماشين و ديگر کامپيوترها مي باشد . هر يک از کاربران سعي در حل مشکلات تعريف شده خود از طريق بکارگيري نرم افزارهاي کاربردي در محيط سخت افزار مي نمايند. سيستم عامل ، نحوه استفاده از سخت افزار را در ارتباط با برنامه هاي کاربردي متفاوتي که توسط کاربران گوناگون نوشته و اجراء مي گردند ، کنترل و هدايت مي نمايد. بمنظور بررسي امنيت در يک سيستم کامپيوتري ، مي بايست به تشريح و تبين جايگاه هر يک از عناصر موجود در يک سيستم کامپيوتري پرداخته گردد.
در اين راستا ، قصد داريم به بررسي نقش عوامل انساني دررابطه با امنيت اطلاعات پرداخته و جايگاه هر يک از مولفه هاي موجود را تبين و تشريح نما ئيم . اگر ما بهترين سيستم سخت افزاري و يا سيستم عامل را بخدمت بگيريم ولي کاربران و يا عوامل انساني درگير در يک سيستم کامپوتري، پارامترهاي امنيتي را رعايت ننمايند ، کاري را از پيش نخواهيم برد. وضعيت فوق مشابه اين است که شما بهترين اتومبيل با درجه بالاي امنيت را طراحي و يا تهيه نمائيد ولي آن را در اختيار افرادي قرار دهيد که نسبت به اصول اوليه رانندگي توجيه نباشند ( عدم رعايت اصول ايمني ) .
ما مي بايست به مقوله امنيت اطلاعات در عصر اطلاعات نه بصورت يک کالا و يا محصول بلکه بصورت يک فرآيند نگاه کرده و امنيت را در حد يک محصول خواه نرم افزاري و يا سخت افزاري تنزل ندهيم .هر يک از موارد فوق ، جايگاه خاص خود را با وزن مشخص شده اي دارند و نبايد به بهانه پرداختن به امنيت اطلاعات وزن يک پارامتر را بيش از آنچيزي که هست در نظر گرفت و پارامتر ديگري را ناديده گرفته و يا وزن غير قابل قبولي براي آن مشخص نمائيم . بهرحال ظهور و عرضه شگفت انگيز تکنولوژي هاي نو در عصر حاضر ، تهديدات خاص خود را نيز بدنبال خواهد داشت . ما چه کار مي بايست بکنيم که از تکنولوژي ها استفاده مفيدي را داشته و در عين حال از تهديدات مستقيم و يا غير مستقيم آنان نيز مصون بمانيم ؟ قطعا" نقش عوامل انساني که استقاده کنندگان مستقيم اين نوع تکنولوژي ها مي باشند ، بسيار محسوس و مهم است .
با گسترش اينترنت و استفاده از آن در ابعاد متفاوت ، سازمانها و موسسات با مسائل جديدي در رابطه با امنيت اطلاعات و تهاجم به شبکه هاي کامپيوتري مواجه مي باشند. صرفنظر از موفقيت و يا عدم موفقيت مهاجمان و عليرغم آخرين اصلاحات انجام شده در رابطه با تکنولوژي هاي امنيتي ، عدم وجود دانش و اطلاعات لازم ( سواد عمومي ايمني ) کاربران شبکه هاي کامپيوتري و استفاده کنندگان اطلاعات حساس در يک سازمان ، همواره بعنوان مهمترين تهديد امنيتي مطرح و عدم پايبندي و رعايت اصول امنيتي تدوين شده ، مي تواند زمينه ايجاد پتانسيل هائي شود که توسط مهاجمين استفاده و باعث بروز مشکل در سازمان گردد. مهاجمان همواره بدنبال چنين فرصت هائي بوده تا با اتکاء به آنان به اهداف خود نائل گردند. در برخي حالات اشتباه ما زمينه موفقيت ديگران! را فراهم مي نمايد . اگر سعي نمائيم بر اساس يک روش مناسب درصد بروز اشتباهات خود را کاهش دهيم به همان نسبت نيز شانس موفقيت مهاجمان کاهش پيدا خواهد کرد.
مديران شبکه ( سيستم ) ، مديران سازمان و کاربران معمولي جملگي عوامل انساني در يک سازمان مي باشند که حرکت و يا حرکات اشتباه هر يک مي تواند پيامدهاي منفي در ارتباط با امنيت اطلاعات را بدنبال داشته باشد . در ادامه به بررسي اشتباهات متداولي خواهيم پرداخت که مي تواند توسط سه گروه ياد شده انجام و زمينه بروز يک مشکل امنيتي در رابطه با اطلاعات حساس در يک سازمان را باعث گردد.

اشتباهات متداول مديران سيستم
مديران سيستم ، به افرادي اطلاق مي گردد که مسئوليت نگهداري و نظارت بر عملکرد صحيح و عملياتي سيستم ها و شبکه موجود در يک سازمان را برعهده دارند.در اغلب سازمانها افراد فوق ، مسئوليت امنيت دستگاهها ، ايمن سازي شبکه و تشخيص ضعف هاي امنيـتي موجود در رابطه با اطلاعات حساس را نيز برعهده دارند. بديهي است واگذاري مسئوليت هاي متعدد به يک فرد، افزايش تعداد خطاء و اشتباه را بدنبال خواهد داشت . فشار عصبي در زمان انجام کار مستمر بر روي چندين موضوع متفاوت و بصورت همزمان ، قطعا" احتمال بروز اشتباهات فردي را افزايش خواهد داد. در ادامه با برخي از خطاهاي متداولي که ممکن است توسط مديران سيستم انجام و سازمان مربوطه را با تهديد امنيتي مواجه سازد ، آشنا خواهيم شد.

مورديک : عدم وجود يک سياست امنيتي شخصي
اکثر قريب به اتفاق مديران سيستم داراي يک سياست امنيتي شخصي بمنظور انجام فعاليت هاي مهمي نظير امنيت فيزيکي سيستم ها ، روش هاي بهنگام سازي يک نرم افزار و روشي بمنظور بکارگيري patch هاي جديد در زمان مربوطه نمي باشند .حتي شرکت هاي بزرگ و شناخته شده به اين موضوع اذعان دارند که برخي از سيستم هاي آنان با همان سرعت که يک باگ و يا اشکال تشخيص و شناسائي مي گردد ، توسط patch مربوطه اصلاح نشده است .در برخي حالات ، مديران سيستم حتي نسبت به آخرين نقاط آسيب پذيرتشخييص داده شده نيز آگاهي بهنگام شده اي را نداشته و قطعا" در چنين مواردي انتظار نصب patch مربوطه نيز توقعي بي مورد است . وجود نقاط آسيب پذير در شبکه مي تواند يک سازمان را در معرض تهديدات جدي قرار دهد . امنيت فرآيندي است که مي بايست بصورت مستمر به آن پرداخته شود و هرگز به اتمام نمي رسد.در اين راستا لازم است، بصورت مستمرنسبت به آخرين حملات بهمراه تکنولوژي ها ي مربوطه ، آگاهي لازم کسب و دانش خود را بهنگام نمائيم .اکثر مديران سيستم ، کارشناسان حرفه اي و خبره امنيتي نمي باشند ، در اين رابطه لازم است ، بمنظور افزايش حفاظت و ايمن سازي شبکه ، اطلاعات و دانش مربوطه بصورت مستمر ارتقاء يايد .افراديکه داراي گواهينامه هاي خاصي امنيتي و يا دانش و اطلاعات اضافه در رابطه با امنيت اطلاعات مي باشند ، همواره يک قدم از کساني مهارت آنان صرفا" محدود به شبکه است ، جلوتر مي باشند . در ادامه ، پيشنهاداتي بمنظور بهبود وضعيت امنيتي سازمان و افزايش و ارتقاء سطح معلومات مديران سيستم ، ارائه مي گردد :

بصورت فيزيکي محل کار و سيستم خود را ايمن سازيد .زمينه استفاده از سيستم توسط افراديکه در محدوده کاري شما فعاليت دارند ، مي بايست کاملا" کنترل شده و تحت نظارت باشد .

هر مرتبه که سيستم خود را ترک مي کنيد ، عمليات logout را فراموش نکنيد .در اين رابطه مي توان يک زمان time out را تنظيم تا در صورت فراموش نمودن عمليات logout ، سيستم قادر به حفاظت خود گردد.

خود را عضو خبرنامه ها ي متفاوت امنيتي کرده تا شما را با آخرين نقاط آسيب پذير آشنا نمايند. درحقيقت آنان چشم شما در اين معرکه خواهند بود( استفاده مفيد از تجارب ديگران ) .

سعي گردد بصورت مستمر از سايت هاي مرتبط با مسائل امنيتي ديدن تا درزمان مناسب با پيام هاي هشداردهنده امنيتي در رابطه با نرم افزارهاي خارج از رده و يا نرم افزارهاي غير اصلاح شده ( unpatched ) آشنا گرديد.

مطالعه آخرين مقالات مرتبط با مسائل امنيتي يکي از مراحل ضروري و مهم در فرآيند خود آموزشي ( فراگيري ) مديران شبکه است . بدين ترتيب اين اطمينان بوجود خواهد آمد که مدير مربوطه نسبت به آخرين اطلاعات و مسائل مربوطه امنيتي در کميته هاي موجود ، توجيه است .

استفاده از ياداشت ها و مقالات در ارتباط با هر نوع اطلاعات حساس نظير رمزهاي عبور وI هر چيزي که ممکن است زمينه ساز ايجاد يک پتانسيل آسيب پذير و دستيابي به سيستم مطرح گردد را محدود نمائيد. در صورتيکه از اين نوع اطلاعات استفاده مي شود، قبل ازترک محل کار ، آنها را از بين ببريد. افراديکه داراي سوء نيت بوده در محدوده کاري شما مي باشند ، مي توانند ازمزاياي ضعف هاي شناخته شده استفاده نمايند، بنابراين ضروري است استفاده از چنين ياداشت هائي محدود و يا بصورت کامل حذف گردد .

مورد دو : اتصال سيستم هاي فاقد پيکربندي مناسب به اينترنت
همزمان با گسترش نيازهاي سازمان، سيستم ها و سرويس دهندگان جديدي بر اساس يک روال معمول به اينترنت متصل مي گردند. قطعا" توسعه سيستم با هدف افزايش بهره وري در يک سازمان دنبال خواهد شد.اکثر اينچنين سيستمهائي بدون تنظيمات امنيتي خاص به اينترنت متصل شده و مي تواند زمينه بروز آسيب و حملات اطلاعاتي توسط مهاجمان را باعث گردد ( در بازه زماني که سيستم از لحاظ امنيتي بدرستي مميزي نشده باشد ، اين امر امکان پذير خواهد بود).
مديران سيستم ممکن است به اين موضوع استناد نمايند که سيستم جديد بوده و هنوز کسي آن را نمي شناسد و آدرس IP آن شناخته شده نيست ، بنابراين امکان شناسائي و حمله به آن وجود نخواهد داشت .طرز فکر فوق ، يک تهديد براي هر سازمان بشمار مي رود . افراد و يا اسکريپت هاي پويش اتوماتيک در اينترنت ، بسرعت عمليات يافتن و تخريب اين نوع سيستم هاي آسيب پذير را دنبال مي نمايند. در اين راستا ، شرکت هائي خاصي وجود دارد که موضوع فعاليت آنان شبکه بوده و براي تست سيستم هاي توليدي خود بدنبال سيستم هاي ضعيف و آسيب پذير مي گردند.( سيستم آسيب پذير ما ابزار تست ديگران خواهد شد). بهرحال همواره ممکن است افرادي بصورت مخفيانه شبکه سازمان شما را پويش تا در صورت وجود يک نقطه آسيب پذير، از آن براي اهداف خود استفاده نمايند. لازم است در اين راستا تهديدات و خطرات را جدي گرفته و پيگري لازم در اين خصوص انجام شود. در اين رابطه موارد زير پيشنهاد مي گردد :

قبل از اتصال فيزيکي يک کامپيوتر به شبکه ، مجوز امنيتي لازم با توجه به سياست هاي تدوين شده امنيتي براي آن صادر گردد ( بررسي سيستم و صدور مجوز اتصال )

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

در صورتيکه لازم است بر روي سيستم مورد نظر تست هاي شبکه اي خاصي صورت پذيرد ، سعي گردد امکان دستيابي به سيستم فوق از طريق اينترنت در زمان تست ، بلاک گردد.

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

سيستم مورد نظر را تحت برنامه هاي موسوم به Intrusion Detection System قرار داده تا نرم افزارهاي فوق بسرعت نقاط آسيب پذير و ضعف هاي امنيتي را شناسائي نمايند.

مورد سه : اعتماد بيش از اندازه به ابزارها
برنامه هاي پويش و بررسي نقاط آسيب پذير،اغلب بمنظور اخذ اطلاعات در رابطه وضعيت جاري امنيتي شبکه استفاده مي گردد . پويشگرهاي تشخيص نقاط آسيب پذير ، اطلاعات مفيدي را در ارتباط با امنيت سيستم نظير : مجوزهاي فايل ، سياستهاي رمز عبور و ساير مسائل موجود، ارائه مي نمايند . بعبارت ديگر پويشگران نقاط آسيب پذير شبکه ، امکان نگرش از ديد يک مهاجم را به مديريت شبکه خواهند داد. پويشگرها ي فوق ، عموما" نيمي از مسائل امنيتي مرتبط را به سيستم واگذار نموده و نمي توان به تمامي نتايج بدست آمده توسط آنان بسنده و محور عمليات خود را بر اساس يافته هاي آنان قرار دهيم . در اين رابطه لازم است متناسب با نوع سيستم عامل نصب شده بر روي سيستم ها از پويشگران متعدد و مختص سيستم عامل مربوطه استفاده گردد( اخذ نتايج مطلوبتر) . بهرحال استفاده از اين نوع نرم افزارها قطعا" باعث شناسائي سريع نقاط آسيب پذير و صرفه جوئي زمان مي گردد ولي نمي بايست اين تصور وجود داشته باشد که استفاده از آنان بمنزله يک راه حل جامع امنيتي است . تاکيد صرف بر نتايج بدست آمده توسط آنان ، مي تواند نتايج نامطلوب امنيتي را بدنبال داشته باشد . در برخي موارد ممکن است لازم باشد ، بمنظور تشخيص نقاط آسيب پذير يک سيستم ،عمليات دستي انجام و يا حتي تاسکريپت هاي خاصي در اين رابطه نوشته گردد .

مورد چهار : عدم مشاهده لاگ ها ( Logs )
مشاهده لاگ هاي سيستم، يکي از مراحل ضروري در تشخيص مستمر و يا قريب الوقوع تهديدات است . لاگ ها، امکان شناسائي نقاط آسيب پذير متداول و حملات مربوطه را فراهم مي نمايند. بنابراين مي توان تمامي سيستم را بررسي و آن را در مقابل حملات مشخص شده ، مجهز و ايمن نمود. در صورت بروز يک تهاجم ، با استفاده از لاگ هاي سيستم ، تسهيلات لازم بمنظور رديابي مهاجمان فراهم مي گردد.( البته بشرطي که آنان اصلاح نشده باشند ) . لاگ ها را بصورت ادواري بررسي و آنها را در يک مکان ايمن ذخيره نمائيد.

مورد پنج : اجراي سرويس ها و يا اسکريپت هاي اضافه و غير ضروري
استفاده از منابع و شبکه سازمان ، بعنوان يک زمين بازي شخصي براي تست اسکريپت ها و سرويس هاي متفاوت ، يکي ديگر از اشتباهات متداولي است که توسط اکثريت قريب به اتفاق مديران سيستم انجام مي شود . داشتن اينچنين اسکريپت ها و سرويس هاي اضافه اي که بر روي سيستم اجراء مي گردند ، باعث ايجاد مجموعه اي از پتانسيل ها و نفاط ورود جديد براي يک مهاجم مي گردد ( در صورتيکه سرويس هاي اضافه و يا اسکريپت ها بر روي سرويس دهنده اصلي نصب و تست گردند ، مشکلات مي تواند مضاعف گردد ). در صورت نياز به تست اسکريپت ها و يا اجراي سرويس هاي اضافه ، مي بايست عمليات مورد نظر خود را از طريق يک کامپيوتر ايزوله شده انجام داد (هرگز از کامپيوتري که به شبکه متصل است در اين راستا استفاده نگردد ) .

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

مورد يک : استخدام کارشناسان آموزش نديده و غيرخبره
بدون ترديد ، کارشناسان آموزش ديده و خبره ، يکي از منابع ارزشمند درهر سازمان محسوب مي گردند. همواره مي بايست از کارشناسان ورزيده در ارتباط با امنيت در يک سازمان استفاده گردد. فرصت سعي و خطاء نيست و ممکن است در اين محدوده زماني چيزي را که يک سازمان از دست مي دهد بمراتب بيشتر از چيزي است که مي خواهد بدست آورد. امنيت اطلاعات از جمله مقولاتي است که براي يک سازمان داراي جايگاهي است و همواره مي بايست بهترين تصميم دررابطه با استفاده از منابع انساني ماهر ، اتخاذ گردد. استفاده از يک کارشناس غير ماهر در امور امنيت اطلاعات و شبکه در يک سازمان ، خود تهديدي امنيتي است که بر ساير تهديدات موجود اضافه خواهد شد . ( ما نمي توانيم مسئوليت پياده سازي استراتژي امنيتي در سازمان را به افرادي واگذار نمائيم که در اين رابطه اطلاعات و دانش لازم را ندارند ) .

مورد دوم : فقدان آگاهي لازم در رابطه با تاثير يک ضعف امنيتي بر عملکرد سازمان
بسياري از مديران سازمان بر اين باور مي باشند که " اين مسئله براي ما اتفاق نخواهد افتاد " و بر همين اساس و طرز فکر به مقوله امنيت نگاه مي نمايند . بديهي است در صورت بروز مشکل در سازمان ، امکان عکس العمل مناسب در مقابل خطرات و تهديدات احتمالي وجود نخواهد داشت . اين مسئله مي تواند بدليل عدم آشنائي با ابعاد و اثرات يک ضعف امنيتي در سازمان باشد . در اين رابطه لازم است به اين نکته اشاره گردد که همواره مشکل براي ديگران بوجود نمي آيد و ما نيز در معرض مشکلات فراواني قرار خواهيم داشت .بنابراين لازم است همواره و بصورت مستمر مديران سازمان نسبت به اثرات احتمالي يک ضعف امنيتي توجيه و دانش لازم در اختيار آنان قرار گيرد . در صورت بروز يک مشکل امنيتي در سازمان ، مسئله بوجود آمده محدود به خود سازمان نشده و مي تواند اثرات منفي متعددي در ارتباط با ادامه فعاليت سازمان را بدنبال داشته باشد. در عصر اطلاعات و دنياي شديد رقابت ، کافي است سازماني لحظاتي آنچيزي باشد که نمي بايست باشد ، همين امر کافي است که تلاش چندين ساله يک سازمان هرز و در برخي حالات فرصت جبران آن نيز وجود نخواهد داشت .

تاثير منفي بر ساير فعاليت هاي تجاري online سازمان
عاملي براي توزيع اطلاعات غير مفيد و غير قابل استفاده در يک چرخه تجاري
عرضه اطلاعات حساس مشتريان به يک مهاجم و بمخاطره افتادن اطلاعات خصوصي مشتريان
آسيب جدي وجهه سازمان و بدنبال آن از دست دادن مشتريان و همکاران تجاري
مورد سوم : عدم تخصيص بودجه مناسب براي پرداختن به امنيت اطلاعات
مجاب نمودن يک مدير سازمان مبني بر اختصاص بودجه مناسب براي پرداختن به مقوله امنيت اطلاعات در سازمان از حمله مواردي است که چالش هاي خاص خود را خواهد داشت .مديران، تمايل دارند بودجه را به حداقل مقدار خود برسانند، چراکه آنان يا اطلاعات محدودي در رابطه با تاثير وجود ضعف هاي امنيتي در عملکرد سازمان را دارند و يا در برخي حالات بودجه ، آنان را براي اتخاذ تصميم مناسب محدود مي نمايد.اينترنت يک شبکه جهاني است که فرصت هاي جذاب و نامحدود تجاري را براي هر بنگاه تجاري فراهم مي نمايد، با رعايت امنيت اطلاعات و حفا ظت مناسب از داده هاي حساس ،امکان استفاده از فرصت هاي تجاري بيشتري براي يک سازمان فراهم خواهد شد. با اختصاص يک بودجه مناسب براي پرداختن و بهاء دادن به مقوله امنيت اطلاعات در يک سازمان ، پيشگيري هاي لازم انجام ودر صورت بروز مسائل بحراني ، امکان تشخيص سريع آنان و انجام واکنش هاي مناسب فراهم مي گردد . بعبارت ديگر با در نظر گرفتن بودجه مناسب براي ايمن سازي سازمان ، بستر مناسب براي حفاظت سيستم ها و داده هاي حساس در يک سازمان فراهم خواهد شد . قطعا" توليد و عرضه سريع اطلاعات در سازمان هاي مدرن و مبتني بر اطلاعات ، يکي از مهمترين شاخص هاي رشد در عصر حاضر بوده و هر آنچيزي که مي تواند خللي در فرآيند فوق ايجاد نمايد ، باعث توقف و گاها" برگشت به عقب يک سازمان ، مي گردد.

مورد چهارم : اتکاء کامل به ابزارها و محصولات تجاري
اگر از يک سازمان سوال شود که چگونه خود را در مقابل حملات حفاظت نموده ايد ؟ اغلب آنان در پاسخ خواهند گفت :" ما از يک فايروال شناخته شده و يک برنامه ويروس ياب بر روي سرويس دهنده استفاده مي کنيم ، بنابراين ما در مقابل حملات ايمن خواهيم بود " . توجه داشته باشيد که امنيت يک فرآيند است نه يک محصول که با خريداري آن خيال خود را در ارتباط با امنيت راحت نمائيم . مديران سازمان لازم است شناخت مناسب و اوليه اي از پتانسل هاي عمومي يک فايروال و يا برنامه هاي ويروس ياب داشته باشند ( قادر به انجام چه کاري مي باشند و چه کاري را نمي توانند انجام دهند. مثلا" اگر ويروس جديدي نوشته و در شبکه توزيع گردد ، برنامه هاي ويروس ياب موجود قادر به تشخيص و برخورد با آن نخواهند بود.اين نوع برنامه ها صرفا" پس از مطرح شدن يک ويروس و آناليز نحوه عملکرد آن مي بايست بهنگام شده تا بتوانند در صورت بروز وضعيتي مشابه با آن برخورد نمايند) . ابزارهائي همچون فايروال و يا برنامه هاي ويروس ياب ، بخشي از فرآيند مربوط به ايمن سازي اطلاعات حساس در يک سازمان بوده و با بکارگيري آنان نمي توان اين ادعا را داشت که آنان سازمان را بطور کامل در مقابل تهاجمات ، حفاظت خواهند نمود .

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

اشتباهات متداول کاربران معمولي
کاربران ، به افرادي اطلاق مي گردد که طي روز با داده ها ي حساس در يک سازمان سروکار داشته و تصميمات و فعاليت هاي آنان، داده ها ي حساس و مقوله امنيت و حفاظت از اطلاعات را تحت تاثير مستقيم قرار خواهد داد. در ادامه با برخي از اشتباهات متداولي که اين نوع استفاده کنندگان از سيستم و شبکه مرتکب مي شوند ، اشاره مي گردد.

مورد يک : تخطي از سياست امنيني سازمان
سياست امنيتي سازمان ، اعلاميه اي است که بصورت جامع ، مسئوليت هر يک از پرسنل سازمان ( افراديکه به اطلاعات و سيستم هاي حساس در سازمان دستيابي دارند ) در ارتباط با امنيت اطلاعات و شبکه را تعريف و مشخص مي نمايد. سند و يا اعلاميه مورد نظر ، بعنوان بخش لاينفک در هر مدل امنيتي بکارگرفته شده در سازمان محسوب مي گردد.هدف عمده اعلاميه فوق ، ارائه روشي آسان بمنظور شناخت و درک ساده نحوه حفاظت سيستم هاي سازمان در زمان استفاده است . کاربران معمولي ، عموما" تمايل به تخطي از سياست هاي تدوين شده امنيتي در يک سازمان را داشته و اين موضوع مي تواند عاملي مهم براي تحت تاثير قراردادن سيستم هاي حساس و اطلاعات مهم سازمان در مواجهه با يک تهديد باشد. پيامد اين نوع عمليات ، بروز اشکال و خرابي در رابطه با اطلاعات ارزشمند در يک سازمان خواهد بود.بهمين دليل است که اکيدا" توصيه مي گردد که اطلاعات لازم در رابطه با نقش کاربران در تبعيت از سياست هاي امنيتي در سازمان به آنان يادآوري و بر آن تاکيد گردد .

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

مورد سوم : ياداشت داده هاي حساس و ذخيره غيرايمن آنان
ايجاد و نگهداري رمزهاي عبور قدرتمند ، فرآيندي مستمر است که همواره مي بايست مورد توجه قرار گيرد. کاربران همواره از اين موضوع نفرت دارند که رمزعبورهائي را ايجاد نمايند که قادر به بخاطرآوردن آن نمي باشند. سياست امنيتي تدوين شده سازمان مي بايست تعيين نمايد که يک رمز عبور چگونه مي بايست ايجاد و نگهداري گردد. بخاطر سپردن چنين رمزعبوري همواره مسائل خاص خود را خواهد داشت . بمنظور حل اينچنين مشکلي ، کاربران تمايل دارند که ياداشت هاي مخفي را نوشته و آنها را زير صفحه کليد ، کيف جيبي و يا هر مکان ديگر در محل کار خود نگهداري نمايند. ياداشت ها ي فوق ، شامل اطلاعات حساس در ارتباط با داده هاي مربوط به رمزعبور و ساير موارد مرتبط است .استفاده از روشهاي فوق براي نگهداري اطلاعات ، يک تخطي امنيتي است .دراين راستا لازم است ،کاربران توجيه و به آنان آگاهي لازم داده شود که با عدم رعايت موارد مشخص شده امنيتي ،پتانسيل هاي لازم بمنظور بروز مشکل در سيستم افزايش خواهد يافت . لازم است به کاربران ، روش ها و تکنيک هاي متفاوت بخاطر
لينک مقاله
http://www.srco.ir :منبع

مقالات مرتبط با اين موضوع
استراتژي حفاظت از اطلاعات در شبکه هاي کامپيوتري ( بخش دوم ) | security
استراتژي حفاظت از اطلاعات در شبکه هاي کامپيوتري ( بخش اول ) | security
نقش عوامل انساني در امنيت شبکه هاي کامپيوتري | security
ايمن سازي سرويس دهنده FTP | security
امنيت برنامه های وب ( بخش سوم ) | security
امنيت برنامه هاي وب ( بخش دوم ) | security
امنيت برنامه هاي وب ( بخش اول ) | security

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


استراتژي حفاظت از اطلاعات در شبکه هاي کامپيوتري ( بخش اول )
مقدمه
اطلاعات در سازمان ها و موسسات مدرن، بمنزله شاهرگ حياتي محسوب مي گردد . دستيابي به اطلاعات و عرضه مناسب و سريع آن، همواره مورد توجه سازمان هائي است که اطلاعات در آنها داراي نقشي محوري و سرنوشت ساز است . سازمان ها و موسسات مي بايست يک زير ساخت مناسب اطلاعاتي را براي خود ايجاد و در جهت انظباط اطلاعاتي در سازمان خود حرکت نمايند . اگر مي خواهيم ارائه دهنده اطلاعات در عصر اطلاعات بوده و صرفا" مصرف کننده اطلاعات نباشيم ، در مرحله نخست مي بايست فرآيندهاي توليد ،عرضه و استفاده از اطلاعات را در سازمان خود قانونمد نموده و در مراحل بعد ، امکان استفاده از اطلاعات ذيربط را براي متقاضيان ( محلي،جهاني ) در سريعترين زمان ممکن فراهم نمائيم . سرعت در توليد و عرضه اطلاعات ارزشمند ، يکي از رموز موفقيت سازمان ها و موسسات در عصر اطلاعات است . پس از ايجاد انظباط اطلاعاتي، مي بايست با بهره گيري از شبکه هاي کامپيوتري زمينه استفاده قانومند و هدفمند از اطلاعات را براي سايرين فراهم کرد . اطلاعات ارائه شده مي تواند بصورت محلي ( اينترانت ) و يا جهاني ( اينترنت ) مورد استفاده قرار گيرد . فراموش نکنيم در اين هنگامه اطلاعاتي، مصرف کنندگان اطلاعات داراي حق مسلم انتخاب مي باشند و در صورتيکه سازمان و يا موسسه اي در ارائه اطلاعات سهوا" و يا تعمدا" دچار اختلال و يا مشکل گردد ، دليلي بر توقف عملکرد مصرف کنندگان اطلاعات تا بر طرف نمودن مشکل ما ، وجود نخواهد داشت . سازمان ها و موسسات مي بايست خود را براي نبردي سخت در عرضه و ارائه اطلاعات آماده نمايند و در اين راستا علاوه بر پتانسيل هاي سخت افزاري و نرم افزاري استفاده شده ، از تدبير و دورانديشي فاصله نگيرند . در ميدان عرضه و ارائه اطلاعات ، کسب موفقيت نه بدليل ضعف ديگران بلکه بر توانمندي ما استوار خواهد بود. مصرف کنندگان اطلاعات، قطعا" ارائه دهندگان اطلاعاتي را برمي گزيند که نسبت به توان و پتانسيل آنان اطمينان حاصل کرده باشند . آيا سازمان ما در عصر اطلاعات به پتانسيل هاي لازم در اين خصوص دست پيدا کرده است ؟ آيا در سازمان ما بستر و ساختار مناسب اطلاعاتي ايجاد شده است ؟ آيا گردش امور در سازمان ما مبتني بر يک سيستم اطلاعاتي مدرن است ؟ آيا سازمان ما قادر به تعامل اطلاعاتي با ساير سازمان ها است ؟ آيا در سازمان ما نقاط تماس اطلاعاتي با دنياي خارج از سازمان تدوين شده است ؟ آيا فاصله توليد و استفاده از اطلاعات در سازمان ما به حداقل مقدار خود رسيده است ؟ آيا اطلاعات قابل عرضه سازمان ما ، در سريعترين زمان و با کيفيتي مناسب در اختيار مصرف کنندگان متقاضي قرار مي گيرد ؟ حضور يک سازمان در عرصه جهاني ، صرفا" داشتن يک وب سايت با اطلاعات ايستا نخواهد بود . امروزه ميليون ها وب سايت بر روي اينترنت وجود داشته که هر روز نيز به تعداد آنان افزوده مي گردد . کاربران اينترنت براي پذيرش سايت سازمان ما ، دلايل موجه اي را دنبال خواهند کرد . در اين هنگامه سايت داشتن و راه اندازي سايت ، اصل موضوع که همانا ايجاد يک سازمان مدرن اطلاعاتي است ، فراموش نگردد. سازمان ما در اين راستا چگونه حرکت کرده و مختصات آن در نقشه اطلاعاتي يک سازمان مدرن چيست ؟
بديهي است ارائه دهندگان اطلاعات خود در سطوحي ديگر به مصرف کنندگان اطلاعات تبديل و مصرف کنندگان اطلاعات ، در حالات ديگر، خود مي تواند بعنوان ارائه دهنده اطلاعات مطرح گردند. مصرف بهينه و هدفمند اطلاعات در صورتيکه به افزايش آگاهي ، توليد و ارائه اطلاعات ختم شود، امري بسيار پسنديده خواهد بود . در غير اينصورت، مصرف مطلق و هميشگي اطلاعات بدون جهت گيري خاص ، بدترين نوع استفاده از اطلاعات بوده که قطعا" به سرانجام مطلوبي ختم نخواهد شد .

شبکه هاي کامپيوتري
در صورتيکه قصد ارائه و يا حتي مصرف بهينه و سريع اطلاعات را داشته باشيم، مي بايست زير ساخت مناسب را در اين جهت ايجاد کنيم . شبکه هاي کامپيوتري ، بستري مناسب براي عرضه ، ارائه و مصرف اطلاعات مي باشند( دقيقا" مشابه نقش جاده ها در يک سيستم حمل و نقل) . عرضه ، ارائه و مصرف يک کالا نيازمند وجود يک سيستم حمل و نقل مطلوب خواهد بود. در صورتيکه سازمان و يا موسسه اي محصولي را توليد ولي قادر به عرضه آن در زمان مناسب ( قبل از اتمام تاريخ مصرف ) براي متقاضيان نباشد، قطعا" از سازمان ها ئي که توليدات خود را با بهره گيري از يک زير ساخت مناسب ، بسرعت در اختيار متقاضيان قرار مي دهند ، عقب خواهند افتاد . شايد بهمين دليل باشد که وجود جاده ها و زير ساخت هاي مناسب ارتباطي، بعنوان يکي از دلايل موفقيت برخي از کشورها در عصر انقلاب صنعتي ، ذکر مي گردد. فراموش نکنيم که امروزه زمان کهنه شدن اطلاعات از زمان توليد اطلاعات بسيار سريعتر بوده و مي بايست قبل از اتمام تاريخ مصرف اطلاعات با استفاده از زير ساخت مناسب ( شبکه هاي ارتباطي ) اقدام به عرضه آنان نمود. براي عرضه اطلاعات مي توان از امکاناتي ديگر نيز استفاده کرد ولي قطعا" شبکه هاي کامپيوتري بدليل سرعت ارتباطي بسيار بالا داراي نقشي کليدي و منحصر بفرد مي باشند . مثلا" مي توان مشخصات کالا و يا محصول توليد شده در يک سازمان را از طريق يک نامه به متقاضيان اعلام نمود ولي در صورتيکه سازماني در اين راستا از گزينه پست الکترونيکي استفاده نمايد ، قطعا" متقاضيان مربوطه در زماني بسيار سريعتر نسبت به مشخصات کالاي توليده شده ، آگاهي پيدا خواهند کرد .

امنيت اطلاعات در شبکه هاي کامپيوتري
بموازات حرکت بسمت يک سازمان مدرن و مبتني بر تکنولوژي اطلاعات، مي بايست تدابير لازم در رابطه با حفاظت از اطلاعات نيز انديشيده گردد. مهمترين مزيت و رسالت شبکه هاي کامپيوتري ، اشتراک منابع سخت افزاري و نرم افزاري است . کنترل دستيابي و نحوه استفاده از منابع به اشتراک گذاشته شده ، از مهمترين اهداف يک سيستم امنيتي در شبکه است . با گسترش شبکه هاي کامپيوتري خصوصا" اينترنت ، نگرش نسبت به امنيت اطلاعات و ساير منابع به اشتراک گذاشته شده ، وارد مرحله جديدي شده است . در اين راستا ، لازم است که هر سازمان براي حفاظت از اطلاعات ارزشمند ، پايبند به يک استراتژي خاص بوده و بر اساس آن سيستم امنيتي را اجراء و پياده سازي نمايد . عدم ايجاد سيستم مناسب امنيتي ، مي تواند پيامدهاي منفي و دور از انتظاري را بدنبال داشته باشد . استراتژي سازمان ما براي حفاظت و دفاع از اطلاعات چيست؟ در صورت بروز مشکل امنيتي در رابطه با اطلاعات در سازمان ، بدنبال کدامين مقصر مي گرديم ؟ شايد اگر در چنين مواردي ، همه مسائل امنيتي و مشکلات بوجود آمده را به خود کامپيوتر نسبت دهيم ، بهترين امکان برون رفت از مشکل بوجود آمده است ، چراکه کامپيوتر توان دفاع کردن از خود را ندارد . آيا واقعا" روش و نحوه برخورد با مشکل بوجود آمده چنين است ؟ در حاليکه يک سازمان براي خريد سخت افزار نگراني هاي خاص خود را داشته و سعي در برطرف نمودن معقول آنها دارد ، آيا براي امنيت و حفاظت از اطلاعات نبايد نگراني بمراتب بيشتري در سازمان وجود داشته باشد ؟

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

دشمنان، انگيزه ها ، انواع حملات اطلاعاتي
بمنظور دفاع موثر و مطلوب در مقابل حملات به اطلاعات و سيستم هاي اطلاعاتي ، يک سازمان مي بايست دشمنان، پتانسيل و انگيزه هاي آنان و انواع حملات را بدرستي براي خود آناليز تا از اين طريق ديدگاهي منطقي نسبت به موارد فوق ايجاد و در ادامه امکان برخورد مناسب با آنان فراهم گردد .اگر قصد تجويز دارو براي بيماري وجود داشته باشد ، قطعا" قبل از معاينه و آناليز وضعيت بيمار، اقدام به تجويز دارو براي وي نخواهد شد. در چنين مواري نمي توان براي برخورد با مسائل پويا از راه حل هاي مشابه و ايستا استفاده کرد .بمنظور ارائه راهکارهاي پويا و متناسب با مسائل متغير، لازم است در ابتدا نسبت به کالبد شکافي دشمنان ، انگيزه ها و انواع حملات ، شناخت مناسبي ايجاد گردد.

دشمنان ، شامل سارقين اطلاعاتي ، مجرمان ،دزدان کامپيوتري ، شرکت هاي رقيب و ... مي باشد.

انگيزه ها ي موجود شامل : جمع آوري هوشمندانه، دستبرد فکري ( عقلاني ) ،عدم پذيرش سرويس ها ، کنف کردن ،احساس غرور و مورد توجه واقع شدن ، با شد .

انواع حملات شامل : مشاهده غيرفعال ارتباطات ، حملات به شبکه هاي فعال، حملات از نزديک( مجاورت سيستم ها ) ، سوء استفاده و بهره برداري خوديان ( محرمان ) و حملات مربوط به ارائه دهندگان صنعتي يکي از منابع تکنولوژي اطلاعات ، است .

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

غيرفعال
فعال
نزديک ( مجاور)
خودي ها ( محرمان )
عرضه ( توزيع )

ويژگي هر يک از انواع حملات فوق ، بشرح زير مي باشد :

غير فعال (Passive) . اين نوع حملات شامل: آناليزترافيک شبکه ،شنود ارتباطات حفاظت نشده، رمزگشائي ترافيک هاي رمز شده ضعيف و بدست آوردن اطلاعات معتبري همچون رمز عبور مي باشد . ره گيري غيرفعال عمليات شبکه ، مي تواند به مهاجمان، هشدارها و اطلاعات لازم را در خصوص عمليات قريب الوقوعي که قرار است در شبکه اتفاق افتند بدهد( قرار است از مسير فوق در آينده محموله اي ارزشمند عبور داده شود !) ، را خواهد داد .پيامدهاي اين نوع حملات ، آشکارشدن اطلاعات و يا فايل هاي اطلاعاتي براي يک مهاجم ، بدون رضايت و آگاهي کاربر خواهد بود .

فعال (Active) .اين نوع حملات شامل : تلاش در جهت خنثي نمودن و يا حذف ويژگي هاي امنيتي ، معرفي کدهاي مخرب ، سرقت و يا تغيير دادن اطلاعات مي باشد . حملات فوق ، مي تواند از طريق ستون فقرات يک شبکه ، سوء استفاده موقت اطلاعاتي ، نفوذ الکترونيکي در يک قلمرو بسته و حفاظت شده و يا حمله به يک کاربر تاييد شده در زمان اتصال به يک ناحيه بسته و حفاظت شده ، بروز نمايد . پيامد حملات فوق ، افشاي اطلاعات ، اشاعه فايل هاي اطلاعاتي ، عدم پذيرش سرويس و يا تغيير در داده ها ، خواهد بود.

مجاور (Close-in) .اين نوع حملات توسط افراديکه در مجاورت ( نزديکي ) سيستم ها قرار دارند با استفاده از تسهيلات موجود ، با يک ترفندي خاص بمنظور نيل به اهدافي نظير : اصلاح ، جمع آوري و انکار دستيابي به اطلاعات باشد، صورت مي پذيرد . حملات مبتني بر مجاورت فيزيکي ، از طريق ورود مخفيانه ، دستيابي باز و يا هردو انجام مي شود .

خودي (Insider) . حملات خودي ها ، مي تواند بصورت مخرب و يا غير مخرب جلوه نمايد . حملات مخرب از اين نوع شامل استراق سمع تعمدي ، سرقت و يا آسيب رساني به اطلاعات ، استفاده از اطلاعات بطرزي کاملا" شيادانه و فريب آميز و يا رد دستيابي ساير کاربران تاييد شده باشد . حملات غير مخرب از اين نوع ، عموما" بدليل سهل انگاري ( حواس پرتي ) ، فقدان دانش لازم و يا سرپيچي عمدي از سياست هاي امنيتي صورت پذيرد.

توزيع (Distribution) . حملات از اين نوع شامل کدهاي مخربي است که در زمان تغيير سخت افزار و يا نرم افزار در محل مربوطه ( کارخانه ، شرکت ) و يا در زمان توزيع آنها ( سخت افزار ، نرم افزار) جلوه مي نمايد . اين نوع حملات مي تواند، کدهاي مخربي را در بطن يک محصول جاسازي نمايد . نظير يک درب از عقب که امکان دستيابي غيرمجاز به اطلاعات و يا عمليات سيستم در زمان آتي را بمنظور سوء استفاده اطلاعاتي ، فراهم مي نمايد .

در اين رابطه لازم است ، به ساير موارد نظير آتس سوزي ، سيل ، قطع برق و خطاي کاربران نيز توجه خاصي صورت پذيرد . در بخش دوم اين مقاله ، به بررسي روش هاي ايمن سازي اطلاعات بمنظور نيل به يک استراتژي خاص امنيتي ، خواهيم پرداخت .
لينک مقاله
http://www.srco.ir :منبع

مقالات مرتبط با اين موضوع
استراتژي حفاظت از اطلاعات در شبکه هاي کامپيوتري ( بخش دوم ) | security
استراتژي حفاظت از اطلاعات در شبکه هاي کامپيوتري ( بخش اول ) | security
نقش عوامل انساني در امنيت شبکه هاي کامپيوتري | security
ايمن سازي سرويس دهنده FTP | security
امنيت برنامه های وب ( بخش سوم ) | security
امنيت برنامه هاي وب ( بخش دوم ) | security
امنيت برنامه هاي وب ( بخش اول ) | security

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


استراتژي حفاظت از اطلاعات در شبکه هاي کامپيوتري ( بخش دوم )
در بخش اول اين مقاله به چالش هاي سازمانها و موسسات براي حرکت بسمت يک سازمان مدرن اطلاعاتي اشاره و پس از بررسي اهميت ايمن سازي اطلاعات بر لزوم تدوين يک استراتژي امنيتي تاکيد گرديد . در اين زمينه به انواع حملات اطلاعاتي نيز اشاره و مشخصات هر يک از آنان توضيح داده شد . در اين بخش ، به بررسي عناصر اساسي در استراتژي پيشنهادي يعني انسان ، تکنولوژي و عمليات خواهيم پرداخت .

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

انسان
موفقيت در ايمن سازي اطلاعات با پذيرش مسئوليت و حمايت مديريت عالي يک سازمان ( معمولا" در سطح مديريت ارشد اطلاعات ) و بر اساس شناخت مناسب از تهاجمات ، حاصل مي گردد. نيل به موفقيت با پيگيري سياست ها و روتين هاي مربوطه ، تعيين وظايف و مسئوليت ها ، آموزش منابع انساني حساس ( کاربران، مديران سيستم ) و توجيه مسئوليت هاي شخصي کارکنان ، حاصل مي گردد.در اين راستا لازم است يک سيستم امنيتي فيزيکي و شخصي بمنظور کنترل و هماهنگي در دستيابي به هر يک از عناصر حياتي در محيط هاي مبتني بر تکنولوژي اطلاعات ، نيز ايجاد گردد . ايمن سازي اطلاعات از جمله مواردي است که مي بايست موفقيت خود را در عمل و نه در حرف نشان دهد . بنابراين لازم است که پس از تدوين سياست ها و دستورالعمل هاي مربوطه ، پيگيري مستمر و هدفمند جهت اجراي سياست ها و دستورالعمل ها ، دنبال گردد. بهترين استراتژي تدوين شده در صورتيکه امکان تحقق عملي آن فراهم نگردد ، ( سهوا" و يا عمدا") ، هرگز امتياز مثبتي را در کارنامه خود ثبت نخواهد کرد .
با توجه به جايگاه خاص منابع انساني در ايجاد يک محيط ايمن مبتني بر تکنولوژي اطلاعات ، لازم است به موارد زير توجه گردد :

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

دفاع در چندين محل . مهاجمان اطلاعاتي( داخلي و يا خارجي ) ممکن است ، يک هدف را از چندين نفطه مورد تهاجم قرار دهند. در اين راستا لازم است سازمان ها و موسسات از روش هاي حفاظتي متفاوت در چندين محل ( سطح ) استفاده ، تا زمينه عکس العمل لازم در مقابل انواع متفاوت حملات ، فراهم گردد . در اين رابطه مي بايست به موارد زير توجه گردد :
? دفاع از شبکه ها و زير ساخت . در اين رابطه لازم است شبکه هاي محلي و يا سراسري حفاظت گردند . ( حفاظت در مقابل حملات اطلاعاتي از نوع عدم پذيرش خدمات )
? حفاظت يکپارچه و محرمانه براي ارسال اطلاعات در شبکه ( استفاده از رمزنگاري و کنترل ترافيک بمنظور واکنش در مقابل مشاهده غيرفعال )
? دفاع در محدوده هاي مرزي . ( بکارگيري فايروال ها و سيستم هاي تشخيص مزاحمين بمنظور واکنش در مقابل حملات اطلاعاتي از نوع فعال )
? دفاع در محيط هاي محاسباتي ( کنترل هاي لازم بمنظور دستيابي به ميزبان ها و سرويس دهنده بمنظور واکنش لازم در مقابل حملات از نوع خودي، توزيع و مجاور ) .

دفاع لايه اي . بهترين محصولات مربوط به ايمن سازي اطلاعات داراي نقاط ضعف ذاتي ، مربوط به خود مي باشند. بنابراين همواره زمان لازم در اختيار مهاجمان اطلاعاتي براي نفوذ در سيستم هاي اطلاعاتي وجود خواهد داشت.بدين ترتيب لازم است قبل از سوءاستفاده اطلاعاتي متجاوزان، اقدامات مناسبي صورت پذيرد. يکي از روش هاي موثر پيشگيري در اين خصوص ، استفاده از دفاع لايه اي در مکان هاي بين مهاجمان و اهداف مورد نظر آنان ،مي باشد . هر يک از مکانيزم هاي انتخابي ، مي بايست قادر به ايجاد موانع لازم در ارتباط با مهاجمان اطلاعاتي ( حفاظت ) و تشخيص بموقع حملات باشد . بدين ترتيب امکان تشخيص مهاجمان اطلاعاتي افزايش و از طرف ديگر شانس آنها بمنظور نفوذ در سيستم و کسب موفقيت، کاهش خواهد يافت . استفاده از فايروال هاي تودرتو ( هر فايروال در کنار خود از يک سيستم تشخيص مزاحمين ، نيز استفاده مي نمايد) در محدوده هاي داخلي و خارجي شبکه ، نمونه اي از رويکرد دفاع لايه اي است . فايروال هاي داخلي ممکن است امکانات بيشتري را در رابطه با فيلتر سازي داده ها و کنترل دستيابي به منابع موجود ارائه نمايند

تعيين ميزان اقتدار امنيتي هر يک از عناصر موجود در ايمن سازي اطلاعات (چه چيزي حفاظت شده و نحوه برخورد با تهاجم اطلاعاتي در محلي که از عنصر مربوطه استفاده شده ، به چه صورت است ؟) . پس از سنجش ميزان اقتدار امنيتي هر يک از عناصر مربوطه ، مي توان از آنان در جايگاهي که داراي حداکثر کارآئي باشند ، استفاده کرد . مثلا" مي بايست از مکانيزم هاي امنيتي مقتدر در محدوده هاي مرزي شبکه استفاده گردد .

استفاده از مديريت کليد مقتدر و زير ساخت کليد عمومي، که قادر به حمايت از تمام تکنولوژي هاي مرتبط با ايمن سازي اطلاعات بوده و داراي مقاومت مطلوب در مقابل يک تهاجم اطلاعاتي باشد.

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

عمليات
منظور از عمليات ، مجموعه فعاليت هاي لازم بمنظور نگهداري وضعيت امنيتي يک سازمان است . در اين رابطه لازم است ، به موارد زير توجه گردد :

پشتيباني ملموس و بهنگام سازي سياست هاي امنيتي
اعمال تغييرات لازم با توجه به روند تحولات مرتبط با تکنولوژي اطلاعات. در اين رابطه مي بايست داده هاي مورد نظر جمع آوري تا زمينه تصميم سازي مناسب براي مديريت فراهم گردد ( تامين اطلاعات ضروري براي مديريت ريسک ) .

مديريت وضعيت امنيتي با توجه به تکنولوژي هاي استفاده شده در رابطه ايمن سازي اطلاعات ( نصب Patch امنيتي، بهنگام سازي ويروس ها ، پشتيباني ليست هاي کنترل دستيابي )
ارائه سرويس هاي مديريتي اساسي و حفاظت از زيرساخت هاي مهم ( خصوصا" زير ساخت هائي که براي يک سازمان ختم به درآمد مي گردد ) .
ارزيابي سيستم امنيتي
هماهنگي و واکنش در مقابل حملات جاري
تشخيص حملات و ارائه هشدار و پاسخ مناسب بمنظور ايزوله نمودن حملات و پيشگيري از موارد مشابه
بازيافت و برگرداندن امور به حالت اوليه (بازسازي )
لينک مقاله
http://www.srco.ir :منبع

مقالات مرتبط با اين موضوع
استراتژي حفاظت از اطلاعات در شبکه هاي کامپيوتري ( بخش دوم ) | security
استراتژي حفاظت از اطلاعات در شبکه هاي کامپيوتري ( بخش اول ) | security
نقش عوامل انساني در امنيت شبکه هاي کامپيوتري | security
ايمن سازي سرويس دهنده FTP | security
امنيت برنامه های وب ( بخش سوم ) | security
امنيت برنامه هاي وب ( بخش دوم ) | security
امنيت برنامه هاي وب ( بخش اول ) | security

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آموزش پاسکال قسمت اول
Pascal

زبان پاسكال يكي از زبانهاي برنامه سازي است كه ويژگيهاي آموزشي آن بسيار بالاست يعني زبان خوبي براي آموزش برنامه نويسي منظم و دقيق است.قابليت خوانايي و درك برنامه هاي اين زبان بالاست وميتوان برنامه هايي نوشت كه احتمال خطاهاي آنها بسيار اندك باشد علتش اين است كه يك زبان ساختار يافته (structed) است .

ساختار كلي برنامه چيست؟
1-تعريف
2-به وسيله procedure و functionقسمتهاي تكراري را از بين ببريم
3-بدنه
فرم كلي پاسكال:

اسم Program
; تعريف ثابت const
; تعريف نوع type
; تعريف متغيرها var
)پارامترها ) نام procedure

begin
____
____
____
end ;

; ( پارامترها ) نا م نوع تابع function
begin
____
____
____
end ;
begin
____
____
____
end .

متغير : محلي است كه داراي يك اسم مي باشد و مي توان مقداري را در آن ذخيره كرد

انواع متغيرها در پاسكال:
Integer :انواع عددي صحيح شامل اعداد بدون نقطه مميز است
نوع مقاديري كه مي پذيرند طول(بايت)
byte 0 تا 255 1
Shortint 128- تا 127 1
integer 32768- تا 32767 2
Word 0 تا 65535 2
Longint 2147483648- تا 2147483647 4

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

نوع مقاديري كه ميپذيرند ارقام با معني طول(بايت)
single 1.5e-45 تا3.4e38 7 تا 8 4
real 2.9e-39 تا 1.7e38 11 تا 12 6
Double 5.0e-324تا 1.7e308 15 تا 16 8
extended 1.9e-4951تا 1.1e493 19 تا 20 10
انواع داده هاي اعشاري

-Char :
نوع داده كاراكتري كه با كلمه char مشخص مي شود ميتواند يك كاراكتر را در خود نگهداري كند بنابراين كاراكترها در يك بايت از حافظه كامپيوتر ذخيره مي شوند

String - :
اين نوع داده ها براي ذخيره رشته ها مثل اسامي افراد به كار مي رود و با كلمه كليدي string مشخص ي گردد
براي هر رشته بايد طول معلوم كنيم اگر طولي تعريف نشود به طور پيش فرض 80 در نظر گرفته ميشود(مقدار طول حداكثر 255 است)
- Boolean :
نوع ديگري از داده ها در پاسكال وجود دارند كه داده هاي بولي خوانده مي شوند مقادير بولي داراي دو ارزش درستي يا نادرستي اند كه در پاسكال با صفر و يك نمايش داده مي شوند صفر به معني نادرستي و يك به معني درستي به كار ميرود اين نوع داده ها با كلمه Boolean تعريف ميشوند.
دستورات ورودي در پاسكال:
دستور Readlnبراي خواندن اطلاعات از ورودي به كار ميرود.
فرمت آن به صورت مقابل است:
(اسامي متغيرها)read/ln
اسامي متغيرها بايد با كاما از يكديگر جدا شوند..
براي چاپ اطلاعات در خروجي از دستور write/ln استفاده ميكنيم.
فرمت آن به صورت مقابل است:
' يك پيام '
( متغير ) write/ln
عبارت محاسباتي
انتساب متغيرها:
مقدار ثابت
( متغير )=: متغير
عبارت محاسباتي

مثال : برنامه اي بنويسيد كه دو عدد را از ورودي دريافت و حاصلجمع آن دو را چاپ كند .
Program add;
Var
a,b:integer;
begin
writeln('enter 2 num');
readln(a,b);
c:=a+b;
writeln('result is =',c);
end.

تكليف : چرا برنامه بايد ادب داشته باشد ؟
مثال : برنامه اي بنويسيد كه حقوق پايه وتعداد فرزندان يك كارگر را از ورودي دريافت و مبلغ حقوق وي را بر اساس فرمول زير حساب كنيد.
10*تعداد فرزندان + حقوق پايه =حقوق كل
Program test;
Var
Salary:longint;
Child:byte;
kole:integer
Begin
Writeln('enter salary and number of child);
Readln(salary,child);
Kole := salary + child *10
Writeln('kole is ',kole);
END.
اولويت عملگرها:
/ *
- +
شرط:
then شرط if
Begin
____
____
____
end
else
begin
____
____
____
end;
نكته : دستورالعمل قبل از IF سمي كالن نمي گيرد
عناصر شرط:
< > <= >= = <>
اپراتورها :
AND OR NOT XOR
NOT A
1 0
0 1

XOR OR AND B A
0 1 1 1 1
1 1 0 0 1
1 1 0 1 0
0 0 0 0 0

مثال : برنامه اي بنويسيد كه با دريافت دو عدد بزرگترين آنها را چاپ كند.
Program test;
Var
a,b:integer;
if a>b then
begin
writeln(a);
end
else
writeln(b);
end.

مثال : برنامه اي بنويسيد كه با دريافت سه عدد به عنوان ضرايب y=ax2+bx+c معادله درجه دو را حل كند(اين برنامه را با يك If بنويسيد).
Var
A,b,c:integer;
D,x1,x2:real;
Begin
Writeln('enter a,b,c');
Readln(a,b,c);
D:=b*b-4*a*c;
If (d >=0 ) then
Begin
X1:=(-b+sqrt(d))/2*a);
X1:=(-b-sqrt(d))/2*a);

مثال : برنامه اي بنويسيد كه تعداد فرزندان وحقوق پايه و رتبه يك كارگر را از ورودي دريافت و حقوق كل وي را بر اساس فرمول زير حساب كند.
كسريها - مزايا +بيمه = حقوق كل
5*رتبه +1000* تعداد فرزند = مزايا
ماليات + بيمه = كسريها

بيشتر كمتر يا مساوي 2 تعداد فرزند
تعداد فرزندان 1000 بيمه
هر چيزي ديگر 20 تا 0 رتبه
حقوق پايه حقوق پايه*100/10 ماليات
begin
writeln('enter salary and grade and number of child');
readln(salary ,num,grade);
if num<=2 then
bimeh:=100
else
bimeh :=num*500;
if (grade>=0) and (grade<=20)then
net := 10/100*salary
else
if grade >20 then
begin
net:=20/100*salary;
mazaya:=num*1000+grade*50;
kasry:=bimeh+net;
kol :=salary + mazaya-kasry;
end;
writeln(kol);
end.

تكليف : در يك تركيب شيميايي 4 عنصر شركت دارند مقدار مجاز براي تهيه ماده اي به نام asxd به اين صورت است.
A 0 ~ 50
S 0.5 ~ 0.83
X 81 ~ 92 or 824 ~ 901
D -100 ~ 100
با دريافت مقادير a,s,x,d از ورودي به ما بگويد كه آيا مي توان اين ماده را توليد كرد يا نه ؟
Begin
Num:=0;
Writeln('please enter a s x d');
Readln(a,s,x,d);
If (a>0) and(a<50) then
Num:=num+1;
If (s>0.5)and (s<0.83) then
Num:=num+1;
If ((x>81)and(x<92))or ((x>824)and(x<901))then
Num:=num+1;
If (d>-100) and (d<100) then
Num:=num+1;
If num=4 then
Writeln('yes can')
Else
Writeln('you can not');
End.
تكليف : برنامه اي بنويسيد كه با دريافت سه عدد و با فرض اينكه عدد دوم وتر ميباشد به ما بگوييد كه آيا اين سه عدد تشكيل يك مثلث قايم الزاويه مي دهد يا خير؟

CASE:
CASE ميتواند تعداداي شرط را بگيرد و انتخاب كند.
مقاديري كه دستور CASE ميپذيرد ORDINAL است مقاديري كهORDINAL هستند داراي تركيب نيستند و همچنين قابل شمارش هم هستند مثل INTEGER,CHARACTER,BYTE,BOOLEAN,LONGINT,…
پسREAL,STRING ORDINAL<---- نيستند
CASE تنها دستوري است كه BEGIN ندارد ولي END دارد
مقدارها ميتوانند شامل يك مقدار يا چند مقدار كه از يكديگر با كاما جدا شده اند باشند و يا يگ سري شمارشي باشند مثل:
1:------
1,10,28:------
1..100,150..243:---------
'A'..'Z':---------

Of متغير Case
Begin : مقدار1
-------
-------
End;
Begin : مقدار2
-------
-------
End;
Begin :Else
-------
-------
End;
End.
مثال : برنامه اي بنويسيد كه يك عدد را از ورودي دريافت ( (0<=x<3وتلفظ آنها را چاپ كند.
BEGIN
READLN(X);
CASE X OF
0:WRITELN('ZERO');
1:WRITELN('ONE');
2:WRITELN('TWO')
ELSE
WRITELN('ERROR');
END;
END.
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
آموزش پاسکال قسمت چهارم | pascal
آموزش پاسکال قسمت سوم | pascal
آموزش پاسکال قسمت دوم | pascal
آموزش پاسکال قسمت اول | pascal

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آموزش پاسکال قسمت دوم
مثال : برنامه اي بنويسيد كه دو عدد را از ورودي دريافت و چنانچه عدد اول در بازه 0 تا 5 بود توان دوم عدد دوم را چاپ كند چنانچه 68 بود حاصلضرب دو عدد را چاپ كند و در غير اينصورت مقادير مجاز را چاپ كند.
BEGIN
WRITELN('ENTER TWO NUMBER');
READLN(A,B);
CASE A OF
0..5 :WRITELN(B*B);
68:WRITELN(A*B)
ELSE
WRITELN('ENTER 0..5 OR 68');
END;
END.
- معادل برنامه بالا با دستور If :
Begin
Writeln('enter 2 number');
Readln(a,b);
If (a>=0)and(a<=5) then
Writeln(b*b)
Else
If a=68 then
Writeln(a*b)
Else
Writeln('enter 0..5 or68');
End.
تكليف : روشي براي تلفظ اعداد پيدا كنيد.

حلقه تكرار :
1- تعداد معين
2- تعداد معين
Do مقدار نهايي to { مقدار شروع=: متغير for
downto
begin
___
___
___
end;
توجه مهم : در برخي از حلقه ها دستورات داخل حلقه به متغير حلقه مرتبط مي باشند و در برخي موارد هيچگونه ارتباطي وجود ندارد.
حلقه for براي تعداد تكرار معين به كار ميرود
Downto : در مواردي به كار ميرود كه مقدار اوليه از مقدار نهايي بيشتر باشد

مثال : برنامه اي بنويسيد كه توان دوم اعداد 100 تا 200 را چاپ كند.
Begin
For i:=100 to 200 do
Begin
Writeln(i*i);
End;
End.
نكته : اجازه نداريد مقدار متغير حلقه را در داخل بدنه عوض كنيد .
مثال : برنامه اي بنويسيد كه حاصلجمع اعداد 100..1 را چاپ كند.
Begin
Sum:=0;
For i:=1 to 10 do
Begin
Sum:=sum+i
End;
Write(sum);
End.

مثال : برنامه اي بنويسيد كه حاصلجمع مضارب 5 بين 0 تا 100را به دست آورد.
Begin
Sum:=0;
For I:=1 to 20 do
Begin
Sum:=sum+i*5;
End;
Writeln(sum);
End.
مثال : برنامه اي بنويسيد كه دو عدد را از ورودي دريافت و اعداد ما بين اين دو عدد را چاپ كند (a
Begin
Writeln('enter a,b');
Readln(a,b);
For I:= a to b do
Writeln(i);
End.

مثال : برنامه اي بنويسيد كه با يك حلقه for اعداد بين100..1 و738..353و 950..940 را چاپ كند
Begin
For i:=1 to 950 do
Begin
If ( i>=1) and (i<=100) then
Writeln(i);
If (i>353) and (i<=738) then
Writeln(i);
If (i>=940) and (i<=950) then
Writeln(i);
End;
End.
معادل برنامه بالا با استفاده از دستور case :
Begin
For i:=1 to 950 do
Case I of
1..100,353..738,940..950: writeln(i);
end;
end.

باقيمانده mod
مثال :
X mod y
مثال : برنامه اي بنويسيد كه مضارب 7 بين 1 تا 100 را چاپ كند
Begin
For i:= 1 to 100 do
Begin
If I mod 7 = 0 then
Writeln(i);
End;
End.
مثال : برنامه اي بنويسيد كه تعداد مضارب 5و7 را در بازه 231~846 چاپ كند.
Begin
K:=0;
C:=0;
For i:=846 downto 231 do
Begin
If I mod 5 = 0 then
C:=c+1;
If I mod 7 = 0 then
K:=k+1;
End;
Writeln('5=',c,'7=',k);
End;
End.
مثال : برنامه اي بنويسيد كه حقوق پايه وتعداد فرزندان 100 كارگر را از ورودي دريافت و مبلغ حقوق آنها را بر اساس فرمول زير حساب كند0
1000*تعداد فرزند + حقوق پايه = حقوق كل
Begin
For i:=1 to 100 do
Begin
Writeln('enter salary and number of children');
readln(salary,num);
kol := salary + num * 1000;
writeln(kol);
end;
end.

مثال : برنامه اي بنويسيد كه 100 عدد را از ورودي دريافت و ميانگين و حاصلجمع آنها را به ما بدهد.
Begin
Sum:=0;
For i:= 1 to 100 do
Begin
Writeln('enter num');
Readln(num);
Sum:=sum+num;
End;
Ave:=ave/100;
Writeln(sum,ave);
End.

تعداد تكرار نامعين :
Do شرط while
begin
___
___
___
end;
مثال : برنامه اي بنويسيد كه اعداد 100..1 را چاپ كند
Begin
I:=1;
While i<=100 do
Begin
Write(i);
I:=i+1;
End;
مثال : برنامه اي بنويسيد كه تعدادي اسم را از ورودي دريافت و به ما بگويد چند بار اسم ali تكرار شده است(آخرين اسم end است).
Var
S:integer;
St:string;
Begin
Read(st);
While st<> 'end' do
Begin
If st='ali' then
S:=s+1;
Read(st);
End;write(s);
End.

مثال : برنامه اي بنويسيد كه تعدادي عدد كه آخرين آنها صفر است را از ورودي دريافت و حاصلجمع آنها را چاپ كند.
Begin
Readln(num);
T:=1;
While num<>0 do
Begin
Sum:=sum+num;
Readln(num);
T:=t+1;
End;
Writeln('s=',s,'average',s/t);
End;
تكليف : براي دانش آموزان يك كلاس برنامه اي بنويسيد كه نام آنها به همراه تعداد نمرات و سپس نمرات آنها را به فرم زير از ورودي دريافت كند.تعداد دانش آموزان كلاس نامعين است ولي آخرين نفر نامش end است .برنامه ميبايستي پس از دريافت هر يك از اطلاعات پيامي به شكل زير چاپ كند.

Average: Sum: Ali Name:
3
18
20
13.5
program test;
var
name:string[10];
ave,sum,nomreh:real;
num,i:integer;
begin
writeln('enter name ' );
readln(name);
while name <> 'end' do
begin
writeln('enter num:');
readln(num);
for i:=1 to num do
begin
writeln('enter nomreh: ');
readln(nomreh);
sum:=sum+nomreh;
end;
ave:=sum/num;
writeln('name:',name,'sum:',sum,'ave:',ave);
writeln('enter name ');
readln(name);
end;
end.

تكليف : ميخواهيم براي برنامه هاي خود يك منو تهيه كنيم اين منو شامل موارد زير است
1) load
2) save
3) edit
4) exit
please select a number :
program test;
var
num:integer;
begin
writeln(' 1) load');
writeln(' 2) save');
writeln(' 3) edit');
writeln(' 4) exit');
writeln(please select a number : ');
readln(num);
while num<>4 do
begin
case num of
1:writeln('loading');
2:writeln('saving');
3:writeln('editing');
end;
end;
end.
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
آموزش پاسکال قسمت چهارم | pascal
آموزش پاسکال قسمت سوم | pascal
آموزش پاسکال قسمت دوم | pascal
آموزش پاسکال قسمت اول | pascal

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آموزش پاسکال قسمت سوم
مثال : برنامه اي بنويسيد كه دو عدد را از ورودي دريافت و طبق جدول زير نسبت به مقدار آن واكنش نشان دهد

3 2 1 a
B+...+3+2+1 1..b b..1 واكنش
Begin
Writeln (' enter a,b :');
Readln(a,b);
Case a of
1:begin
for i:=1 to b do
write(i);
end;
2:begin
or I;=b downto 1 do
write(i);
end;
3:begin
sum:=0;
for i:=1 to b do
sum:=sum+I;
write(sum);
end;
end.
آرايه ها :
آرايه ها به عناصري اتلاق ميشود كه با يك نام تعدادي محل از حافظه را كنترل كند براي تشخيص محلها از انديس استفاده ميشود
انواع آرايه ها :
1- آرايه هاي يك بعدي
2- عناصر دو بعدي
3- آرايه هاي سه بعدي

تعريف آرايه ها :
var
نوع of ]انديس پايان..انديس شروع: array [ نام آرايه
نوع متغير آرايه : متغير آرايه
خواندن آرايه :
مثال : برنامه اي بنويسيد كه نمرات 100 دانش آموز را از ورودي دريافت و در يك آرايه بريزد.
Var
A:array[1..100] of real;
Begin
For i:=1 to 100 do
Readln(a[i]);

مثال : برنامه اي بنويسيد كه نمرات 100 دانش آموز را از ورودي دريافت و 50 تاي اول را چاپ كند سپس تعداد نمرات 20 را مشخص كند.
Var
A:array[1..100] of real;
Begin
For I;=1 to 100 do
Writeln('enter no(',I,')');
Readln(a[i]);
For i:=1 to 50 do
Writeln(a[i]);
S:=0;
For i:=1 to 100 do
If i:=1 to 100 do
If a[i]=20 then
S:=s+1;
Writeln(s);
End.

پيدا كردن max,min
عنصر اول =min
حلقه براي گردش در آرايه
Min < عنصر فعلي if
عنصر فعلي min :=
Write(min);
مثال : برنامه اي بنويسيد كه با دريافت نمرات 100 دانش آموز بالاترين و پايين ترين نمره را در بين اين 100 نفر پيدا كند.

Var
A:array[1..100] of real;
I:integer;
Begin
For i:=1 to 100 do
Readln(a[i]);
Min:=a[1];
Max:=a[1];
For i:=2 to 100 do
Begin
If a[1]< min then
Min:=a[i];
If a[i]>max then
Max := a[i];
End;
Writeln('max is :',max,'min is :',min);
End.
مثال : برنامه اي بنويسيد كه با دريافت 100 اسم به ما بگويد تعداد تكرار اسم ali چند بار است وآيا اسم hassan بيشتر ذكر شده يا اسم reza ؟
Var
A:array [1..100] of string;
Begin
For i:=1 to 100 do
Readln(a[i]);
Ali:=0;
Reza:=0;
Hassan:=0;
For i:=1 to 100 do
Begin
If a[i]='ali' then
Ali:=ali+1;
If a[i]='reza' then
Reza:=reza+1;
If a[i]='hassan' then
Hassan:=hassan+1;
Endd
Writeln(ali is :',ali);
If reza>hassan then
Writeln('reza')
Else
Writeln('hassan');
End.
مثال : برنامه اي بنويسيد كه با دريافت نام و نمره 100 دانش آموز تنبل ترين فرد كلاس را مشخص كند.
Var
Name:array[1..100] of string;
No:array[1..100] of real;
Begin
For i:=1 to 100 do
Begin
Readln(name[i]);
Readln(no[i]);
End;
Min:=no[1];
Namemin:=name[1];
For i:=2 to 100 do begin
If no[i] Begin
Min:=no[i];
Namemin:=name[i];
Writeln(namemin);
End.
آرايه هاي دو بعدي:
وقتي از آرايه دوبعدي استفاده ميكنيم بايد از دو حقه for استفاده كنيم.
مثال : برنامه اي بنويسيد كه نمرات 4 كلاس كه هر يك 20 دانش آموز دارد را از ورودي دريافت وتنبل ترين فرد را در اين 4 كلاس مشخص كند.
Var
A:array[1..20,1..4] of real;
Begin
For i:=1 to 4 do
Begin
For j:=1 to 20 do
Readln(a[j,i]);
End;
Min:=a[1,1];
For i:=1 to 4 do
For j:=1 to 20 do
If a[j,i]< min then
Min:=a[j,i];
Writeln(min);
End.
مثال : در يك آرايه 100*20دوهزار كاراكتر نگهداري ميشود برنامه اي بنويسيد كه تعداد تكرار حرف A را با a مقايسه كند و همچنين به ما بگويد آيا كاراكتر z در اين ماتريس وجود دارد ؟
Var
A:array[1..20,1..100] of character;
Bool:Boolean;
B,b1:integer;
Begin
For i:=1 to 100 do
For j:=1 to 20 do
If a[I,j]='A' then
B:=b+1;
If a[I,j]='a' then
B1:=b1+1;
If a[I,j]='z' then
Bool:=true;
End;
If b>b1 then writeln('A>a');
If b If b=b1 then writeln('A=a');
If true then writeln('''z''exist');
End.

تكليف : ميخواهيم نام و نمره تعدادي دانش آموز يك كلاس را از ورودي دريافت كنيم و مشخص كنيم كه تنبل ترين و زرنگ ترين فرد كلاس كيست.چند نفر نمره زير 10 گرفتند؟نام كساني كه نمره آنها در بازه 17 تا 15 مي باشد ب همراه نمره آنها چاپ شود آخرين نفر نامش end است حداكثر تعداد دانش آموزان 100 نفر است.
Var

a:array [1..100] of string ;
b:array[1..100] of real;
begin
i:=1;
read(a[i]);
while a[i]<>'end' do begin
readln(b[i]);
i:=i+1;
readln(a[i]);
end;
j:=i-1;
min:=a[1];
max:=a[1];
for i:= 2 to j do
begin
if b[i] >max then
begin
max:=b[i];
name:a[i];
end;
end
writeln(name);
count:=0;
for i:=1 to j do
if b[i]<=10 then
count:=count+1;
writeln(count);
for i:=1 to j do
if (b[i]<17) and (b[i]>15) then
write(b[i],a[i]);
end.
تكليف : برنامه اي بنويسيد كه حاصل اين عبارت را حساب كند.
i/i!=1/1!+2/2!+3/3!+4/4!+5/5!
N!= 1*2*3*4*…*n
Begin
Sum:=0;
For n:=1 to 5 do
Begin
For m:=1 to n do
F:=f*m;
Sum:=sum+n/f;
End;
Writeln(sum);
End.
تكليف : برنامه اي بنويسيد كه نمرات 80 دانش آموز را كه در چهار كلاس دسته بنده شده اند را از ورودي دريافت كند سپس به سوالات زير جواب دهد.
1- معدل هر يك از كلاسها
2- نمره تنبل ترين و زرنگترين شخص در هر كلاس به طور جداگانه
Var
A:array [1..4,1..20] of real;
Begin
For i:=1 to 4 do
For j:=1 to 20 do
Begin
Writeln('please enter nomreh');
Readln(a[I,j]);
End;
For i:=1 to 4 do
Begin
Sum:=0 ;
For j:=1 to 20 do
Begin
Sum:=a[I,j]+sum;
End;
Writeln(sum/20,'average of this class');
End;
For i:=1 to 4 do
Begin
Max :=a[1,1];
Min:=a[1,1];
For j:=2 to 20 do
Begin
If a[I,j]>max then
Max :=a[I,j];
End;
Writeln(I,min,max);
End;
End.
- String :
String آرايه اي از كاراكترهاست .اغلب لازم است كاراكترهايي در رشته موجود درج شوندو يا كاراكترهايي به جاي بخشي از رشته نوشته شوند , زيررشته اي در رشته جستجو گردد و يا دو رشته با هم الحاق شوند.
رشته تهي : طول رشته ثابت نيست و با داداه هايي كه در آن ذخيره شده است مشخص مي گردد.كاراكترهايي كه در رشته قرار مي گيرد از حداكثر طولي كه براي آن تعيين ميشود بيشتر نخواهد بود. اگر name رشته كاراكتري باشد دستور زير name را به رشته تهي تبديل ميكند:
Name:='';
تبديل رشته به اعداد :
در پاسكال زير برنامه هايي وجود دارند كه به آساني ميتوانند رشته ها را پردازش كنند. زيربرنامه val رشته عددي را گرفته به مقدار عددي تبديل ميكند.
رشته عددي رشته اي است كه حاوي كاراترهاي '0' تا '9' و نقطه مميز باشد مثل '12.5' و'13.5' زيربرنامه val به صورت زير به كار ميرود.
Val (st,number,error)
St رشته اي است كه بايد به عدد تبديل شود و number متغيري است كه رشته تبديل شده به عدد در آن قرار ميگيرد. چنانچه در رشته st كاراكتر نا معتبري (كاراكترهاي غير از( '0' تا '9' و'.' ) , محل وجود آن كاراكتر در پارامتر error قرار ميگيرد. اگر error برابر با صفر باشد معنايش اينست كه كاراكتر نا معتبري وجود ندارد. اگر number از نوع صحيح باشد st به مقدار صحيح و اگر number از نوع اعشاري باشد st به مقدار اعشاري تبديل ميشود .
مثال زير را در نظر بگيريد:
Var st :string;
Num,e:integer;
St:='352';
Val (st,num,e);
مقدار 352 در متغير num ومقدار صفر در متغير e قرار ميگيرد اكنون دستورات زير را در نظر بگيريد :
St:='35#'2;
Val (st,num,e);
با اجراي دستور val به دليل وجود كاراكتر' # ' كه كاراكتر نامعتبري در اعداد است عدد 2 در متغير e قرار ميگيرد و معنايش اينست كه كاراكتر شماره 2 ( شماره گذاري از صفر شروع ميشود) نامعتبر است و عمل تبديل صورت نميگيرد و مقدار num تعريف نشده است.
تبديل عدد به رشته :
براي تبديل مقدار عددي به رشته عددي از زيربرنامهstr استفادهميشود و به صورت زير به كار ميرود:
Str (number : format,numstring)
با اين دستور مقداري كه در number قرار دارد به رشته اي به طول format تبديل ميشود و در رشته numstring قرار ميگيرد . دستورات زير را در نظر بگيريد:
Var x:integer;
St:string;
X=352;
Str(x:5,st);
با اجراي اين دستور مقدار 352 به رشته '352' تبديل شده در st قرار ميگيرد
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
آموزش پاسکال قسمت چهارم | pascal
آموزش پاسکال قسمت سوم | pascal
آموزش پاسکال قسمت دوم | pascal
آموزش پاسکال قسمت اول | pascal

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آموزش پاسکال قسمت چهارم
دستورات زير را در نظر بگيريد:
Var y1,y2:real;
St1,st2 : string;
Y1:=352.768
Y2:=476.395
Str(y1:7:2,st1);
Str(y2:3:1,st2);
با اجراي دستور str اول مقدار 352.768 به رشته '352.768' تبديل ميشود و در st1 قرار ميگيرد و با اجراي دستورstr دوم مقدار 476.395 به رشته '476.395'تبديل ميشود و در st2 قرار ميگيرد.
جدا كردن زيررشته اي از رشته:
زيررشته بخشي از رشته است و براي جدا كردن زيررشته از رشته از تابع copy استفاده ميشودتابع copy به صورت زير به كار ميرود.
Copy (source,index,size)
S:='I am learning pascal ';
S1:=copy(s,15,6);
دستور copy باعث ميگردد تا با شروع از محل 15 تعداد 6 كاراكتر از رشته s استخراج شود و در s1 قرار گيرد. بنابراين محتويات رشته s1 برابر است با 'pascal'.
الحاق رشته ها :
منظور از الحاق رشته ها اتصال رشته ها به يكديگر است به عنوان مثال اگرs1:='ab' و s2:='cde' الحاق دو رشته (s1,s2) به صورت 'abcde' خواهد بود براي الحاق رشته ها از تابع concat استفاده ميشود:
(اسامي رشته ها)concat
دستورات زير را در نظر بگيريد:
S1:='pascal';
S2:='is a ;
S3:='language';
S4:=concat(s1,s2,s3);
با اجراي اين دستور s3 به انتهاي s2 متصل ميشود و رشته نتيجه به انتهاي s1 متصل ميگردد و در نتيجه رشته s4 عبارت است از'pascal is a language': . اگر طول رشته حاصل بيش از 255 باشد بقيه كاراكترها حذف ميشوند.
جستجوي رشته اي در رشته ديگر:
براي اين كار از تابع pos استفاده ميشود كاربرذ اين تابع به صورت زير است:
Pos(s1,s2)
S1 رشته اي است كه بايد در s2 وجود داشته باشد محل اولين وقوع آن برگردانده ميشود و گر نه مقدار صفر برگردانده ميشود دستورات زير را در نظر بگيريد:
S1:='learning'
S2:='I am learning pascal';
S3:='english'
X:=pos(s1,s2)
y:=pos(s3,s2)
چون رشته s1 در s2 وجود دارد دستور pos اول مقدار 6 را در x قرار ميدهد و معنايش اين است كه رشته 'learning' در محل 6 رشته s2 وجود ندارد مقدار صفر در y قرار ميگيرد.
محاسبه طول رشته :
براي محاسبه طول رشته از تابع length به صورت زير استفاده ميشود:
(رشته)length
دستورات زير را در نظر بگيريد:
S1:='xymn'
X:=length(s1)
چون طول رشته s1 برابر 4 است مقدار x برابر 4 خواهد بود.
حذف و درج زيررشته:
زير رشته اي را ميتوان از رشته اي حذف كرد و يا زيررشته اي را ميتوان در رشته اي درج كرد براي حذف زير رشته از زيربرنامه ها به صورت زير به كار ميروند:
Delete(source,index,size)
Insert(pattern,destination,index)
در زيربرنامه delete زيررشته اي به طول size با شروع از محل index از رشته source حذف ميشود و در زيربرنامه insert زيررشته pattern با شروع از محل index در رشته destination درج ميشوددستورات زير را در نظر بگيريد:
S1:=pas***cal
Delete(s1,4,3)
S2:='paal';
S3:='sc';
Insert(s3,s2,);
دستور delete باعث ميشود تا با شروع از محل 4 رشته s1 حذف شده و رشته s1 به pascalتبديل شود دستور insert موجب ميشود تا رشته s3 در s2 درج شود و در نتيجه رشته s2 به 'pascal' تبديل شود.
مثال : برنامه اي بنويسيد كه يك اسم را از ورودي دريافت و آنرا بر عكس چاپ كند
Readln(name);
For i:=length(name) downto 1 do
Write (name[i])
مثال : برنامه اي بنويسيد كه كه يك نام را از ورودي دريافت و به ما بگويد كه آيا اين نام با حرف a شروع ميشود يا خير؟
Readln(name);
If name[1]='a' then
Writeln('ok')
Else
Writeln('not ok');
مثال : برنامه اي بنويسيد كه يك نام را از ورودي دريافت و حروف آنرا يك در ميان چاپ كند.
Readln(name);
For i:=1 to length(name) do
If I mod 2 = 0 then
Writeln(name[i]);

روش ديگر:"
For i:=1 to int(length(name)/2) do
Writeln(name[i*2]);
مثال : برنامه اي بنويسيد كه يك رشته را از ورودي دريافت و متقارن بودن آنرا چك كند.
1 2 3 4 5 5 4 3 2 1
var
N:string;
Begin
Readln(n);
For i:=1 to int(length(n)/2) do
Begin
If n[i] <> n[length(n)-i+1] then
K:=0;
End;
If k=1 then
Writeln ('ok')
Else
Writeln('no');
End.
مثال : برنامه اي بنويسيد كه تعداد حروف a موجود در يك رشته ورودي را بشمارد.
Var st:string;
Begin
Readln(st);
C:=0;
For i:=1 to length(st) do
If st[i]='a' then ?if st[i] in ['a','A'] then
C:=c+1;
Writeln(c)
مثال : برنامه اي بنويسيد كه تعداد اسامي alireza موجود در رشته را بشمارد.
Begin
Readln(st);
C:=0;
While pos('alireza',st) <> 0 do
Begin
C:=c+1;
J:=pos('alireza',st);
Delete(st,pos('ali',st),3);
End;
Write ( c );
End.
مثال : برنامه اي بنويسيد كه دو رشته را از ورودي دريافت و بعد از كاراكترمساوي كه در رشته اول وجود دارد رشته دوم را چاپ كند.
Readln(st,st1);
J:=pos('=',st);
Writeln(copy ((st,1 j) , st1, copy (st,j+1,100));

تكليف : برنامه اي بنويسيد كه با دريافت سه حرف و قرار دادن آنها در يك آرايه سه تايي كليه تركيبات ممكن را كه سه حرف تركيباتشان به هم نخورد چاپ كند.
W a x
A x w
W a x
مثال : برنامه اي بنويسيد كه يك رشته را از ورودي دريافت و كليه كلمات موجود در آن را بشمارد.
Readln(st);
S:=0;
St:=st+' '
While pos(' ',st) <> 0 do
Begin
S;=s+1;
Delete(st,1,pos(' ',st));
While st[1]=' 'do
Delet (st,1,1);
End;
End.
تكليف : برنامه اي بنويسيد كه 100 رسته را از ورودي دريافت و در يك آرايه به طول 100 از نوع string بريزيد و به سؤالات زير جواب دهد.
1- تعداد كل كلمات
1- تعداد كل حروف
2- تعداد حروف صدا دار

ذخيره اطلاعات :
Log file : فايلي است كه تمام تغييرات مربوط به يك محيط را ثبت ميكند
فايلها :
1- متني text
2- ركوردي typed
3-بدون نوع
4-untyped

معرفي فايلهاي متني :
Var

Text : نام فايل

نسبت دادن فايل :
; ('نام خارجي ,'نام فايل ) assign
مثال :
Assign(f,'c:\a1.dat.ddd');
باز كردن جهت خواندن
;( نام فايل)reset
باز كردن جهت نوشتن
; ( نام فايل)rewrite
) ___,نام فايل)readln
) ___,نام فايل)writeln
) نام فايل)close
تا close انجام نشود data ذخيره نميشود .
نكته بسيار مهم : در هر يك از مسائلي كه در مورد فايلها مطرح ميشود مي بايستي به نحوي از يكي از تكنيكهاي نگهداري اطلاعات در حافظه اصلي استفاده نمود اين تكنيكها ممكن است استفاده از متغيرها و آرايه ها و ماتريسها و ودرختهاو...استفاده نمود ولي تنها با دو عمل خواندن و نوشتن به روي فايل كار انجام ميشود
Update : ميخوانيم ولي دوباره ميريزيم سر جاش
Append : بهش يك چيزي اضافه ميكنيم
نكته : عمل rewrite باعث ميگردد چنانچه فايل وجود نداشته باشد ايجاد و چنانچه وجود دارد اطلاعاتش به طور كامل پاك شود.
مثال : برنامه اي بنويسيد كه100 اسم را از ورودي دريافت و آنها را در يك فايل به نام a1.dat))بنويسد.
Var
F:text;a:string;
Begin
Assign(f,'a1.dat');
Rewrite(f);
For i:=1 to 100 do
Readln(a);
Writeln(f,a);
End;
Close(f);
End.
مثال : برنامه اي بنويسيد كه فايل a1.dat را خوانده و به ما بگويد چند بار اسم ali تكرار شده است؟
Var
A:text;
B:string;
Begin
Assign(a,'a1.dat');
Reset(a);
Sum:=0;
For i:=1 to 00 do
Begin
Readln(a,b);
If b='ali' then
Sum:=sum+1;
End;
Close(a,b);
End;
مثال : برنامه اي بنويسيد كه تعدادي اسم را كه آخرين آنها end است از ورودي دريافت و در يك فايل به نام aa.dat بريزد آنگاه فايل را بسته و قسمتهاي زير را به طور جداگانه انجام دهد.
1- تعداد حسنها بيستر است يا علي ها
2- چند اسم وجود دارد كه با حرف z شروع ميشود.

Var
f:text;
Name:string;
Begin
Assign(f,'aa.dat');
Rewrite(f);
Readln(name);
While name<> 'end' do
Begin
Writeln(f,name);
Readln(name);
End;
Close(f);
H:=1;
A:=1;
Z:=1;
Reset(f);
While not eof (f) do
Begin
Readln(f,name);
If name='ali' then
A:=a+1;
If name ='hassan' then
H:=h+1;
End;
Close(a);
If h>a then writeln('h>a');
If h If h=a then writeln('h=a');
End;
Close(f);
Reset(f);
While not eof (f) do
Begin
Readln(f,name);
If name[i]='z' then
Z;=z+1;
End;
Close(f);
Writeln('sum of z is :'z);
End.
تكليف : برنامه اي بنويسيد كه تعدادي نام را از ورودي دريافت و در يك فايل بريزد سپس فايل تشكيل شده را باز كرده و از روي اين فايل دو فايل ديگر تشكيل دهيد كه در يكي از آنها اسامي كه بين a تا z قرار گرفته اند ريخته و در فايل دوم كليه اسامي كه از v تا z هستند را بريزد.
Program test;
Var
Name : string;
F,f1,f2:text;
Begin
Assign(f,'a.dat');
Rewrite(f);
Writeln('enter a name ');
Readln(name);
While length(name)>0 do
Begin
Writeln(f,name);
Writeln('enter a name');
Readln(name);
End;
Close(f);
Reset(f);
Assign(f1,'a1.dat');
Assign(f2,'a2.dat');
Rewrite(f1);
Rewrite(f2);
While not eof (f) do
begin
Readln(f,name);
Case name[1] of
'a'..'u':writeln(f1,name);
'v'..'z':writeln(f2,name);
end;
end;
close(f2);
close(f1);
close(f);
end.
تكليف : برنامه اي بنويسيد كه نام دو فايل را از ورودي دريافت و از اطلاعات داخل اين دو فايل فايل سومي تشكيل دهد كه حاصل تركيب دو فايل قبل باشد.
var
h,f,g:text;
a:string;
begin

writeln('enter first filename') ;
readln(a);
assign(h,a);
writeln('enter second filename') ;
readln(a);
assign(f,a);
reset(h);
reset(f);
assign(g,'out.dat');
rewrite(g);
while not eof(h) do
begin
readln(h,a);
writeln(g,a);
end;
while not eof(f) do
begin
readln(f,a);
writeln(g,a);
end;
close(f);
close(h);
close(g);
End.
تكليف :برنامه اي بنويسيد كه در ضمن عمل merge دو فايل مرتب شده را با يكديگر تركيب و يك فايل مرتب شده به دست آوريم.
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
آموزش پاسکال قسمت چهارم | pascal
آموزش پاسکال قسمت سوم | pascal
آموزش پاسکال قسمت دوم | pascal
آموزش پاسکال قسمت اول | pascal

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آموزش جاوا - integers ( اعداد صحيح )
جاوا چهار نوع عدد صحيح تعريف مي كند : byte، short،، int،، long، . كليه
اين اعداد داراي علامات مثبت و منفي هستند . جاوا از اعداد صحيح غير علامت دار و
فقط مثبت پشتيباني نمي كند . بسياري از زبانهاي برنامه نويسي شامل Cو C++و هم
از اعداد صحيح علامت دار و هم از اعداد صحيح فاقد علامت پشتيباني مي كنند . اما
طراحان جاوا احساس مي كردند كه اعداد صحيح فاقد علامت غير ضروري است . بويژه
آنها احساس كردند كه مفهوم فاقد علامت (unsigned) بيشتر براي مشخص كردن رفتار
بيت بالاتر از حد مجاز (high-order bit) استفاده مي شود كه علامت يك int را
هنگاميكه بعنوان يك رقم عنوان مي شود ، مشخص مي كند . بعدا" خواهيد ديد كه
جاوا مفهوم بيت بالاتر از حد مجاز (high-order bit) را بگونه اي متفاوت مديريت
مي كند ، يعني با اضافه كردن يك عملگر ويژه حركت به راست فاقد علامت unsigned)
(right shift . بدين ترتيب نياز به يك نوع عدد صحيح فاقد علامت منتفي شده است .
پهناي (widit) يك نوع عدد صحيح را نبايد با ميزان حافظه اي كه مصرف مي كند
اشتباه گرفت ، بلكه نشانه رفتاري است كه براي متغيرها و عبارات آن نوع تعريف
مي شود . محيط حين اجراي جاوا از هر اندازه اي كه نياز داشته باشد ، استفاده
مي كند ، البته تا آن اندازه اي كه انواع براساس اعلام قبلي شما رفتار كنند . در
حقيقت ، حداقل يك پياده سازي byte وجود دارد كه ، short را بعنوان مقادير 32
بيتي ذخيره مي كند تا عملكرد را توسعه دهد. زيرا آنچه درحال حاضر مورد استفاده
قرار مي گيرد ، اندازه كلمه (word size) اكثر كامپيوترهاست .
پهنا و دامنه اين انواع اعداد صحيح همانطوريكه در جدول زير مشاهده مي كنيد
طيف وسيعي دارند :
دامنه پهنا نام
long 64- 9/ 223/ 372/ 036/ 845/ 775/ 808 to 9/ 223/ 372
/036/ 854/ 775/ 807
int 32- 2/ 147/ 483/ 648 to 2/ 147/ 483/ 647
short 16- 32/ 768 to 32/ 767
byte 8- 128 to 127

اكنون نگاه دقيقتري به هر يك از انواع عدد صحيح خواهيم داشت .
byte

كوچكترين نوع عدد صحيح byte است . اين يك نوع علامت دار 8 بيتي است كه دامنه
آن از 128- تا 127 مي باشد . متغيرهاي نوع byte بويژه هنگاميكه با يك جريان
داده از يك شبكه يا يك فايل كار ميكنيد ، سودمند خواهند بود . همچنين هنگاميكه
با داده دودويي ( باينري ) خام مشغول كار هستيد كه ممكن است بطور مستقيم با
ساير انواع توكار جاوا سازگاري نداشته باشند ، بسيار سودمند هستند .
متغيرهاي byte را با استفاده از واژه كليدي byte اعلام مي كنيم . بعنوان
مثال ، در زير دو متغير byte با اسامي bو cو را اعلام كرده ايم : + byte b/ c;

short

يك نوع 16 بيتي علامت داراست . دامنه آن از 768 32/- تا 767 32/ است . short
در اصل كم استفاده ترين نوع در جاوا مي باشد ، چون طوري تعريف شده كه بايت بالاي
آن اول مي آيد ( آن را big-endian format ميگويند ). اين نوع براي كامپيوترهاي 16
بيتي كه بسرعت از رده خارج شده اند ، كاربري دارد .
در زير مثالهايي از چگونگي اعلان متغيرهاي short را مشاهده مي كنيد : + short s;
+ short t;

نكته : Endiannes توصيف كننده چگونگي ذخيره شدن انواع داده چند بايتي short int
و longو در حافظه است . اگر 2 بايت براي معرفي يك نوع short استفاده
شود ، آن بايتي كه ابتدا قرار مي گيرد ( مهمترين يا كم اهميت ترين ? )
مي گويد كه يك ماشين big-endian است ، بدان معني كه مهمترين بايت اول
آمده و بعد از آن بايت كم اهميت تر قرار دارد . ماشينهايي نظير SPARC و power pc
از نوع big-endian و ماشينهاي سري lntelx86نوع little-endianع
هستند .
int

رايجترين نوع عدد صحيح int است . اين يك نوع 32 بيتي علامت دار است كه دامنه
آن از 2/147/483/648- تا 2/147/483/647 گسترده است . علاوه بر كاربردهاي ديگر
متغيرهاي از نوع int براي كنترل حلقه ها و نمايه سازي آرايه ها مورد استفاده قرار
مي گيرند . هر بار كه يك عبارت عدد صحيح شامل byte، short،و intو و ارقام لفظي
(literal) داشته باشيد، كل عبارت قبل از انجام محاسبات به int ارتقائ مي يابد.
نوع int روان ترين و كاراترين نوع است و اكثر اوقات هنگاميكه ميخواهيد رقمي
را براي شمارش يا نمايه سازي آرايه ها يا انجام محاسبات عدد صحيح بوجود آوريد
بايد از آن استفاده نماييد . شايد بنظر آيد كه استفاده از انواع shortو byteو
سبب صرفه جويي در فضا شود ، اما هيچ تضميني وجود ندارد كه جاوا اين انواع را
بطرق داخلي به int ارتقائ ندهد . همواره بياد داشته باشيد كه نوع ، مشخص كننده
رفتار است نه اندازه . ( تنها استثنائ در اين مورد، آرايه است كه در آنجا byte
بصورت تضميني براي هر عضو آرايه فقط يك بايت ، short دو بايت و int از چهار
بايت استفاده مي كند . )
long

يك نوع 64 بيتي علامت دار است و براي مواردي مفيد است كه يك نوع int طول
كافي براي دربرگرفتن مقدار مورد نظر نداشته باشد. دامنه long كاملا" وسيع است .
اين نوع ، براي كار با اعداد خيلي بزرگ مناسب است . بعنوان مثال ، در زير
برنامه اي را مشاهده مي كنيد كه مسافت طي شده توسط نور در تعداد مشخص روز را بر
حسب مايل محاسبه مي كند .

+ // Compute distance light travels using long variables.
+ class Light {
+ public static void main(String args[] ){
+ int lightspeed;
+ long days;
+ long seconds;
+ long distance;
+
+ // approximate speed of light in miles per second
+ lightspeed = 86000;
+
+ days = 1000; // specify number of days here
+
+ seconds = days * 24 * 60 * 60; // convert to seconds
+
+ distance = lightspeed * seconds; // compute distance
+
+ System.out.print("In " + days);
+ System.out.print(" days light will travel about ");
+ System.out.println(distance + " miles .");
+ }
+ }

خروجي اين برنامه بقرار زير خواهد بود : ln 1000 days light will travel about 4730400000000 miles.
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
بنيادهاي كلاس java | java
دستورات انتخاب در جاوا | java
استفاده از پرانتزها | java
عملگر ? | java
عملگر انتساب The Assignment Operator | java
عملگرهاي منطقي بولي Boolean | java
عملگرهاي رابطه اي | java
عملگرها ی ریاضی و بیتی | java
اولين برنامه ساده java | java
آرايه ها در جاوا | java
متغيرها و اعمال روی آنها | java
انواع اعداد اعشاري جاوا | java
آموزش جاوا - integers ( اعداد صحيح ) | java
جاوا را بشناسیم | java

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


انواع اعداد اعشاري جاوا

اعداد اعشاري يا همان اعداد حقيقي براي ارزش گذاري عبارتهايي كه نيازمند
دقت بيشتري هستند ، استفاده مي شوند . بعنوان نمونه ، محاسباتي نظير ريشه دوم
و محاسبات مثلثاتي نظير سينوس و كسينوس منجربه جوابهايي مي شوند كه براي تعيين
دقت آن نياز به نوع عدد اعشاري مي باشد . جاوا يك مجموعه استاندارد (IEEE-754)
از انواع عدد اعشاري و عملگرها را پياده سازي مي كند. دو نوع عدد اعشاري تعريف
شده يعني floatو doubleو هستند كه بترتيب معرف دقت معمولي و مضاعف مي باشند .
پهنا و دامنه آنها را در زير نشان داده ايم :
دامنه پهنا بر حسب تعداد بيت نام
double 64 1.7e-308 to 1.7e+308
float 32 3.4e-038 to 3.4e+038

هر يك از انواع اعشاري را متعاقبا" مورد بررسي قرار مي دهيم .
float

اين نوع مشخص كننده يك مقدار با دقت معمولي بوده كه از 32 بايت حافظه
استفاده مي كند . دقت معمول روي بعضي پردازنده ها سريعتر بوده و نسبت به دقت
مضاعف نيمي از فضا را اشغال مي كند ، اما هنگاميكه مقادير خيلي بزرگ يا خيلي
كوچك باشند ، دقت خود را از دست ميدهد . متغيرهاي نوع float براي زماني مناسب
هستند كه از يك عضو كسري استفاده مي كنيد اما نيازي به دقت خيلي زياد نداريد .
بعنوان مثال ، نوع float براي معرفي دلار و سنت بسيار مناسب است . + float hightemp/ lowtemp;

double

دقت مضاعف كه با واژه كليدي double معين مي شود براي ذخيره كردن يك مقدار 64
بيت فضا را اشغال مي كند . دقت مضاعف روي برخي پردازنده هاي جديد كه براي
محاسبات رياضي با سرعت زياد بهينه شده اند ، واقعا" سريعتر از دقت معمولي عمل
مي كند . كليه توابع مثلثاتي نظير ()sin ، ()cos و ()sqrt مقادير مضاعف را
برمي گردانند . هنگام اجراي محاسبات مكرر كه نياز به حفظ دقت داريد و يا هنگام
كار با ارقام خيلي بزرگ double بهترين انتخاب است .
در زير برنامه اي را مشاهده مي كنيد كه از double استفاده نمود تا محيط يك
دايره را محاسبه كند :

+ // Compute the area of a circle.
+ class Area {
+ public static void main(String args[] ){
+ double pi/ r/ a;
+
+ r = 10.8; // radius of circle
+ pi = 3.1416; // pi/ approximately
+ a = pi * r * r; // compute area
+
+ System.out.println("Area of circle is " + a);
+ }
+ }

كاراكترها
در جاوا از نوع داده char براي ذخيره كردن كاراكترها استفاده مي شود . اما
برنامه نويسان Cو C++و آگاه باشند كه char در جاوا مشابه char در زبانهاي C و C++
نيست . در زبانهاي Cو C++و ، نوع char يك نوع عدد صحيح با پهناي 8 بيت
است . اما جاوا متفاوت عمل مي كند . جاوا از كدهاي جهاني (unicode) براي معرفي
كاراكترها استفاده مي كند . كدهاي جهاني يك مجموعه كاملا" جهاني از كاراكترها
هستند كه مي توانند همه كاراكترها را معرفي نمايند . اين مجموعه شامل دهها
مجموعه كوچك تر كاراكتري نظير Latin، Greek،، Arabic،، Cyrillic،، Hebrew، Katakana
، Hangul، و امثال آن است .
براي اين منظور ، 16 بيت مورد نياز است . بنابراين char در جاوا يك نوع 16
بيتي است . دامنه charاز 0ز تا 65/536 مي باشد . در نوع char مقدار منفي وجود
ندارد . مجموعه استاندارد كاراكترها موسوم به ASCII همچون گذشته داراي دامنه
از 0 تا 127 و مجموعه كاراكترهاي 8 بيتي توسعه يافته موسوم به lso-Latin-1
داراي دامنه از 0 تا 255 مي باشند .
چون در جاوا امكان نوشتن ريز برنامه ها براي كاربري جهاني وجود دارد ، بنظر
مي رسد كه بهتر است جاوا از كدهاي جهاني براي معرفي كاراكترها استفاده نمايد .
البته بكار بردن كدهاي جهاني درمورد زبانهايي نظير انگليسي ،آلماني ،اسپانيايي
يا فرانسوي كه كاراكترهاي آنها را مي توان براحتي داخل 8 بيت جاي داد ، تا حدي
سبب نزول كارآيي خواهد شد . اما اين بهايي است كه براي رسيدن به قابليت حمل
جهاني در برنامه ها بايد پرداخت .
نكته : اطلاعات بيشتر درباره كدهاي جهاني را در آدرسهاي وب زير پيدا خواهيد
نمود : http://www .unicode .org
http://www .stonehand .com/unicode .html

در زير برنامه اي را مشاهده مي كنيد كه متغيرهاي char را نشان مي دهد :

+ // Demonstrate char data type.
+ class CharDemo {
+ public static void main(String args[] ){
+ char ch1/ ch2;
+
+ ch1 = 88; // code for X
+ ch2 = 'Y';
+
+ System.out.print("ch1 and ch2 :");
+ System.out.println(ch1 + " " + ch2);
+ }
+ }

اين برنامه خروجي زير را نشان خواهد داد : ch1 and ch2 :xy

دقت كنيد كه مقدار 88به ch1 نسبت داده شده ، كه مقدار متناظر با حرف x در
كد ASCII ( و كد جهاني ) است . قبلا" هم گفتيم كه مجموعه كاراكتري ASCII َ127
مقدار اوليه در مجموعه كاراكتري كدهاي جهاني را اشغال كرده است . بهمين دليل
كليه فوت و فنهاي قديمي كه قبلا" با كاراكترها پياده كرده ايد ، در جاوا نيز به
خوبي جواب مي دهند .
اگر چه انواع char عدد صحيح محسوب نمي شوند ، اما در بسياري از شرايط
مي توانيد مشابه عدد صحيح با آنها رفتار كنيد . بدين ترتيب قادريد دو كاراكتر
را با هم جمع نموده و يا اينكه مقدار يك متغير كاركتري را كاهش دهيد . بعنوان
مثال ، برنامه زير را در نظر بگيريد :

+ // char variables behave like integers.
+ class CharDemo2 {
+ public static void main(String args[] ){
+ char ch1;
+
+ ch1 = 'X';
+ System.out.println("ch1 contains " + ch1);
+
+ ch1++; // increment ch1
+ System.out.println("ch1 is now " + ch1);
+ }
+ }

خروجي اين برنامه بشرح زير خواهد بود : ch1 contains x
ch1 is now y

در برنامه ابتدا مقدار xبه ch1 داده ميشود . سپس ch1 افزايش مي يابد . اين
روال باعث مي شود تا ch1 حرف y را اختيار كند، كه كاراكتر بعدي در ترتيب ASCII
( و كدهاي جهاني ) مي باشد .
Boolean

جاوا يك نوع ساده موسوم به boolean براي مقادير منطقي دارد . اين نوع فقط
يكي از مقادير ممكن trueيا falseا را اختيار مي كند . اين نوعي است كه توسط
كليه عملگرهاي رابطه اي نظير b
شرطي كه دستورهاي كنترلي نظير ifو forو را مديريت مي كنند ، استفاده مي شود .
در زير برنامه اي مشاهده مي كنيد كه نوع boolean را نشان مي دهد :

+ // Demonstrate boolean values.
+ class BoolTest {
+ public static void main(String args[] ){
+ boolean b;
+
+ b = false;
+ System.out.println("b is " + b);
+ b = true;
+ System.out.println("b is " + b);
+
+ // a boolean value can control the if statement
+ if(b )System.out.println("This is executed.");
+
+ b = false;
+ if(b )System.out.println("This is not executed.");
+
+ // outcome of a relational operator is a boolean value
+ System.out.println("10 > 9 is " +( 10 > 9));
+ }
+ }

خروجي برنامه فوق بقرار زير خواهد بود :

b is false
b is true
This is executed.
10>9 is true

درباره اين برنامه سه نكته جالب توجه وجود دارد . اول اينكه وقتي كه مقدار boolean
توسط ()println خارج مي شود ، مي بينيد كه "true"يا "false"ا بنمايش
درمي آيد . دوم اينكه يك متغير boolean بتنهايي براي كنترل دستور if كفايت
مي كند . ديگر نيازي به نوشتن يك دستور if بقرار زير نخواهد بود : + if(b == true... )

سوم اينكه ، پي آمد يك عملگر رابطه اي نظيربولين يک مقدار است .
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
بنيادهاي كلاس java | java
دستورات انتخاب در جاوا | java
استفاده از پرانتزها | java
عملگر ? | java
عملگر انتساب The Assignment Operator | java
عملگرهاي منطقي بولي Boolean | java
عملگرهاي رابطه اي | java
عملگرها ی ریاضی و بیتی | java
اولين برنامه ساده java | java
آرايه ها در جاوا | java
متغيرها و اعمال روی آنها | java
انواع اعداد اعشاري جاوا | java
آموزش جاوا - integers ( اعداد صحيح ) | java
جاوا را بشناسیم | java

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


متغيرها و اعمال روی آنها
در يك برنامه جاوا ، متغير ، اساسي ترين واحد ذخيره سازي است . يك متغير به
وسيله تركيبي از يك شناسه ، يك نوع و يك مقدار ده اوليه اختياري تعريف خواهد
شد . علاوه بر اين ، كليه متغيرها داراي يك قلمرو هستند كه رويت پذيري آنها را
تعريف مي كند و يك زمان حيات نيز دارند. متعاقبا" اين اجزائ را مورد بررسي
قرار مي دهيم .

اعلان يك متغير Declaring a variable
در جاوا كليه متغيرها قبل از استفاده بايد اعلان شوند . شكل اصلي اعلان متغير
بقرار زير مي باشد : type identifier [=value] [/identifier[=value]...];

مقدار شناسه مقدار شناسه نوع
نوع (type) يكي از انواع اتمي جاوا يا نام يك كلاس يا رابط است . ( انواع
كلاس و رابط بعدا" بررسي خواهد شد . ) شناسه نام متغير است . مي توانيد با
گذاشتن يك علامت تساوي و يك مقدار ، متغير را مقدار دهي اوليه نماييد . در ذهن
بسپاريد كه عبارت مقدار دهي اوليه بايد منتج به يك مقدار از همان نوعي ( يا
سازگار با آن نوع ) كه براي متغير مشخص شده ، گردد . براي اعلان بيش از يك نوع
مشخص شده ، از فهرست كاماهاي (') جدا كننده استفاده نماييد .
در زير مثالهايي از اعلان متغير از انواع گوناگون را مشاهده مي كنيد . دقت
كنيد كه برخي از آنها شامل يك مقدار دهي اوليه هستند .

+ int a/ b/ c; // declares three ints/ a/ b/ and c.
+ int d = 3/ e/ f = 5; // declares three more ints/ initializing
+ // d and f.
+ byte z = 22; // initializes z.
+ double pi = 3.14159; // declares an approximation of pi.
+ char x = 'x'; // the variable x has the value 'x'.

شناسه هايي كه انتخاب مي كنيد هيچ عامل ذاتي در نام خود ندارند كه نوع آنها
را مشخص نمايد . بسياري از خوانندگان بياد مي آورند زماني را كه FORTRAN كليه
شناسه هاي از Iتا Nا را پيش تعريف نمود تا از نوع INTEGER باشند ، در حاليكه
ساير شناسه ها از نوع REAL بودند . جاوا به هر يك از شناسه هاي متناسب شكل گرفته
امكان اختيار هر نوع اعلان شده را داده است .

مقدار دهي اوليه پويا Dynamic intialization
اگر چه مثالهاي قبلي از ثابت ها بعنوان مقدار ده اوليه استفاده كرده اند
اما جاوا امكان مقداردهي اوليه بصورت پويا را نيز فراهم آورده است . اين موضوع
با استفاده از هر عبارتي كه در زمان اعلان متغير باشد ، انجام مي گيرد .
بعنوان مثال ، در زير برنامه كوتاهي را مشاهده مي كنيد كه طول ضلع يك مثلث
قائم الزاويه را با داشتن طول دو ضلع مقابل محاسبه مي كند :

+ // Demonstrate dynamic initialization.
+ class DynInit {
+ public static void main(String args[] ){
+ double a = 3.0/ b = 4.0;
+ // c is dynamically initialized
+ double c = Math.sqrt(a * a + b * b);
+
+ System.out.println("Hypotenuse is " + c);
+ }
+ }

در اينجا سه متغير محلي a، b،، c، اعلان شده اند . دو تاي اولي توسط
ثابت ها مقدار دهي اوليه شده اند . اما متغير C بصورت پويا و بر حسب طول اضلاع
مثلث قائم الزاويه ( بنابر قانون فيثاغورث ) مقدار دهي اوليه مي شود . اين
برنامه از يكي از روشهاي توكار جاوا يعني ()sqrt كه عضوي از كلاس Math بوده و
ريشه دوم آرگومانهاي خود را محاسبه ميكند استفاده كرده است . نكته كليدي اينجا
است كه عبارت مقدار دهي اوليه ممكن است از هر يك از اجزائ معتبر در زمان مقدار
دهي اوليه ، شامل فراخواني روشها ، ساير متغيرها يا الفاظ استفاده نمايد .

قلمرو زمان حيات متغيرها
تابحال كليه متغيرهاي استفاده شده ، در زمان شروع روش ()main اعلان مي شدند.
اما جاوا همچنين به متغيرها امكان مي دهد تا درون يك بلوك نيز اعلام شوند .
همانطوريكه قبلا" توضيح داديم ، يك بلوك با يك ابرو باز و يك ابرو بسته محصور
مي شود : يك بلوك تعريف كننده يك قلمرو است . بدين ترتيب هر بار كه يك بلوك
جديد را شروع ميكنيد ، يك قلمرو جديد نيز بوجود مي آوريد . همانطوريكه احتمالا"
از تجربيات برنامه نويسي قبلي بياد داريد ، يك قلمرو (scope) تعيين كننده آن
است كه چه اشيائي براي ساير بخشهاي برنامه قابل رويت هستند . اين قلمرو همچنين
زمان حيات (lifetime) آن اشيائ را تعيين مي كند .
اكثر زبانهاي كامپيوتري دو طبقه بندي از قلمروها را تعريف مي كنند : سراسري
(global) و محلي (local) . اما اين قلمروهاي سنتي بخوبي با مدل موكد شي ئ گرايي
جاوا مطابقت ندارند . اگر چه در جاوا هم مي توان مقاديري را بعنوان قلمرو
سراسري ايجاد نمود ، اما اين فقط يك نوع استثنائ است و عموميت ندارد . در جاوا
قلمرو اصلي همانهايي هستند كه توسط يك كلاس يا يك روش تعريف مي شوند . حتي همين
تمايز نيز تا حدي ساختگي و مصنوعي است . اما از آنجاييكه قلمرو كلاس داراي
مشخصات و خصلتهاي منحصر بفردي است كه قابل استفاده در قلمرو تعريف شده توسط
روش نيست ، اين تمايز تا حدي محسوس خواهد بود . بخاطر تفاوتهاي موجود ، بحث
قلمرو كلاس ( و متغيرهاي اعلان شده داخل آن ) اين مبحث بتعوق افتاده است . در حال
حاضر فقط قلمروهاي تعريف شده توسط يك روش يا داخل يك روش را بررسي مي كنيم .
قلمرو تعريف شده توسط يك روش با يك ابروي باز شروع مي شود. اما اگر آن روش
داراي پارامترهايي باشد ، آنها نيز داخل قلمرو روش گنجانده خواهند شد . بعدا"
نگاه دقيقتري به پارامترها خواهيم داشت و فعلا" كافي است بدانيم كه پارامترها
مشابه هر متغير ديگري در يك روش كار مي كنند .
بعنوان يك قانون عمومي ، متغيرهاي اعلان شده داخل يك قلمرو براي كدهايي كه
خارج از قلمرو تعريف مي شوند ، قابل رويت نخواهند بود ( قابل دسترسي نيستند ).
بدين ترتيب ، هنگاميكه يك متغير را درون يك قلمرو اعلان مي كنيد ، در حقيقت آن
متغير را محلي دانسته و آن را در مقابل دستيابيها و تغييرات غير مجاز محافظت
مي كنيد . در حقيقت ، قوانين قلمرو اساس كپسول سازي را فراهم مي كنند .
قلمروها را مي توان بصورت تودرتو (nesting) محفوظ داشت . بعنوان مثال ، هر
زمان يك بلوك كد ايجاد كنيد ، يك قلمرو جديد تودرتو ايجاد نموده ايد . هنگاميكه
اين واقعه روي مي دهد ، قلمرو بيروني ، قلمرو دروني را دربرمي گيرد . اين بدان
معني است كه اشيائ اعلان شده در قلمرو بيروني براي كدهاي داخل قلمرو دروني قابل
رويت هستند اما عكس اين قضيه صادق نيست . اشيائاعلان شده داخل قلمرو دروني براي
بيرون قلمرو قابل رويت نخواهند بود .
براي درك تاثير قلمروهاي تودرتو ، برناه ريز را در نظر بگيريد :

+ // Demonstrate block scope.
+ class Scope {
+ public static void main(String args[] ){
+ int x; // known to all code within main
+
+ x = 10;
+ if(x == 10 ){ // start new scope
+ int y = 20; // known only to this bock
+
+ // x and y both known here.
+ System.out.println("x and y :" + x + " " + y);
+ x = y * 2;
+ }
+ // y = 100 :// Error! y not known here
+
+ // x is still known here.
+ System.out.println("x is " + x);
+ }
+ }

همانطوريكه توضيحات نشان مي دهند ، متغير x در ابتداي قلمروي ()main اعلان
شده و براي كليه كدهاي متعاقب داخل ()main قابل دسترسي مي باشد . داخل بلوك if
متغير y اعلان شده است . از آنجاييكه يك بلوك معرف يك قلمرو است ، y فقط براي
ساير كدهاي داخل بلوك خود قابل رويت است . اين دليل آن است كه خارج بلوك
مربوطه ، خط y=100 در خارج توضيح داده شده است . اگر نشانه توضيح راهنمايي را
تغيير مكان دهيد ، يك خطاي زمان كامپايل (compile-time error) اتفاق مي افتد
چون y براي بيرون از بلوك خود قابل رويت نيست . داخل بلوك if متغير x قابل
استفاده است زيرا كدهاي داخل يك بلوك ( منظور يك قلمرو تودرتو شده است ) به
متغيرهاي اعلان شده در يك قلمرو دربرگيرنده دسترسي دارند .
داخل يك بلوك ، در هر لحظه اي مي توان متغيرها را اعلان نمود ، اما فقط زماني
معتبر مي شوند كه اعلان شده باشند . بدين ترتيب اگر يك متغير را در ابتداي يك
روش اعلان مي كنيد، براي كليه كدهاي داخل آن روش قابل دسترس خواهد بود. بالعكس
اگر يك متغير را در انتهاي يك بلوك اعلان كنيد ، هيچ فايده اي ندارد چون هيچيك
از كدها به آن دسترسي ندارند . بعنوان مثال اين قطعه از برنامه غير معتبر است
چون نمي توان از count قبل از اعلان آن استفاده نمود :

+ // This fragment is wrong!
+ count = 100; // oops! cannot use count before it is declared!
+ int count;

يك نكته مهم ديگر در اينجا وجود دارد كه بايد بخاطر بسپاريد: متغيرها زماني
ايجاد مي شوند كه قلمرو آن ها وارد شده باشد ، و زماني خراب مي شوند كه قلمرو
آنها ترك شده باشد . يعني يك متغير هربار كه خارج از قلمروش برود ، ديگر مقدار
خود را نگهداري نخواهد كرد . بنابراين ، متغيرهاي اعلان شده داخل يك روش مقادير
خود را بين فراخواني هاي آن روش نگهداري نمي كنند . همچنين يك متغير اعلان شده
داخل يك بلوك ، وقتي كه بلوك ترك شده باشد ، مقدار خود را از دست خواهد داد .
بنابراين ، زمان حيات (lifetime) يك متغير محدود به قلمرو آن مي باشد .
اگر اعلان يك متغير شامل مقدار دهي اوليه آن باشد ، آنگاه هر زمان كه به
بلوك مربوطه وارد شويم ، آن متغير مجددا" مقدار دهي اوليه خواهد شد . بعنوان
مثال برنامه زير را در نظر بگيريد :

+ // Demonstrate lifetime of a variable.
+ class LifeTime {
+ public static void main(String args[] ){
+ int x;
+
+ for(x = 0; x < 3; x++ ){
+ int y =- 1; // y is initialized each time block is entered
+ System.out.println("y is :" + y); // this always prints- 1
+ y = 100;
+ System.out.println("y is now :" + y);
+ }
+ }
+ }

خروجي توليد شده توسط اين برنامه بقرار زير است :

y is- :1
y is now:100
y is- :1
y is now:100
y is- :1
y is now:100

همانطوريكه مشاهده مي كنيد ، هر بار كه به حلقه for داخلي وارد مي شويم ، y
همواره بطور مكرر مقدار اوليه 1- را اختيار مي كند . اگر چه بلافاصله به اين
متغير مقدار 100 نسبت داده مي شود، اما هر بار نيز مقدار خود را از دست ميدهد.
و بالاخره آخرين نكته : اگر چه ميتوان بلوكها را تودرتو نمود، اما نميتوانيد
متغيري را اعلان كنيد كه اسم آن مشابه اسم متغيري در قلمرو بيروني باشد. از اين
نظر جاوا با زبانهاي Cو C++و متفاوت است . در زير مثالي را مشاهده مي كنيد كه
در آن تلاش شده تا دو متغير جدا از هم با اسم اعلان شوند . در جاوا اينكار مجاز
نيست . در Cو C++و اين امر مجاز بوده و دو bar كاملا" جدا خواهند ماند .

+ // This program will not compile
+ class ScopeErr {
+ public static void main(String args[] ){
+ int bar = 1;
+ { // creates a new scope
+ int bar = 2; // Compile-time error -- bar already defined!
+ }
+ }
+ }

تبديل خودكار و تبديل غير خودكار انواع
اگر تجربه قبلي برنامه نويسي داشته ايد ، پس مي دانيد كه كاملا" طبيعي است كه
مقداري از يك نوع را به متغيري از نوع ديگر نسبت دهيم . اگر اين دو نوع سازگار
باشند ، آنگاه جاوا بطور خودكار اين تبديل (conversion) را انجام مي دهد .
بعنوان مثال ، همواره امكان دارد كه مقدار int را به يك متغير long نسبت داد .
اما همه انواع با يكديگر سازگاري ندارند ، بنابراين هر گونه تبديل انواع مجاز
نخواهد بود . بعنوان نمونه ، هيچ تبديلي از doubleبه byte تعريف نشده است .
خوشبختانه ، امكان انجام تبديلات بين انواع غير سازگار هم وجود دارد . براي
انجام اينكار ، بايد از تبديل cast استفاده كنيد كه امكان يك تبديل صريح بين
انواع غير سازگار را بوجود مي آورد . اجازه دهيد تا نگاه دقيقتري به تبديل
خودكار انواع و تبديل cast داشته باشيم .

تبديل خودكار در جاوا Java's Automatic conyersions
هنگاميكه يك نوع داده به يك متغير از نوع ديگر نسبت داده مي شود ، اگر دو
شرط زير فراهم باشد ، يك تبديل خودكار نوع انجام خواهد شد :
ؤ دو نوع با يكديگر سازگار باشند .
ؤ نوع مقصد بزرگتر از نوع منبع باشد .
هنگاميكه اين دو شرط برقرار باشد ، يك تبديل پهن كننده (widening) اتفاق
مي افتد . براي مثال نوع int همواره باندازه كافي بزرگ است تا كليه مقادير
معتبر byte را دربرگيرد، بنابراين نيازي به دستور صريح تبديل cast وجود ندارد.
در تبديلات پهن كننده ، انواع رقمي شامل انواع عدد صحيح و عدد اعشاري با هر
يك از انواع سازگاري دارند . اما انواع رقمي با انواع charو booleanو سازگار
نيستند . همچنين انواع charو booleanو با يكديگر سازگار نيستند .
همانطوريكه قبلا" ذكر شد ، جاوا هنگام ذخيره سازي يك ثابت عدد صحيح لفظي
(Literal integer constant) به متغيرهاي از انواع byte، short،و longو ، يك
تبديل خودكار نوع را انجام مي دهد .

تبديل غير خودكار انواع ناسازگار
اگر چه تبديلات خودكار انواع بسيار سودمند هستند ، اما جوابگوي همه نيازها
نيستند . بعنوان مثال ، ممكن است بخواهيد يك مقدار int را به يك متغير byte
نسبت دهيد. اين تبديل بطور خودكار انجام نمي گيرد، زيرا يك byteاز intز كوچكتر
است .اين نوع خاص از تبديلات را گاهي تبديل باريك كننده (narrowing conversions)
مي نامند ، زيرا بطور صريح مقدار را آنقدر باريك تر و كم عرض تر مي كنيد تا با
نوع هدف سازگاري يابد .
براي ايجاد يك تبديل بين دو نوع ناسازگار ، بايد از cast استفاده نماييد . cast
يك تبديل نوع كاملا" صريح است . شكل عمومي آن بقرار زير مي باشد : ( target - type )value

نوع نوع مقصد يا هدف
در اينجا نوع هدف ، همان نوعي است كه مايليم مقدار مشخص شده را به آن تبديل
كنيم . بعنوان مثال ، قطعه زير از يك برنامه تبديل غير خودكار از intبه byte
را اجرا مي كند . اگر مقدار integer بزرگتر از دامنه يك byte باشد ، اين مقدار
به مدول ( باقيمانده تقسيم يك integer بر دامنه ) byte كاهش خواهد يافت . + int a;
+ byte b;
+ //...
+ b =( byte )a;

هر گاه كه يك مقدار اعشاري به يك عدد صحيح نسبت داده شود ، شكل ديگري از
تبديل اتفاق مي افتد : بريدن ، truncation . همانطوريكه مي دانيد ، اعداد صحيح
داراي قسمت اعشاري نيستند . بنابراين هنگاميكه يك مقدار اعشاري به يك نوع عدد
صحيح نسبت داده مي شود ، جزئ اعشاري از بين خواهد رفت ( بريده خواهد شد ) .
بعنوان مثال ، اگر مقدار 1.23 را به يك عدد صحيح نسبت دهيم ، مقدار حاصله فقط
عدد 1 مي باشد . مقدار 0.23 بريده (truncated) خواهد شد . البته اگر اندازه
اجزائ عدد كلي آنچنان بزرگ باشد كه در نوع عدد صحيح مقصد نگنجد ، آنگاه مقدار
فوق به مدول دامنه نوع هدف كاهش خواهد يافت .
برنامه زير نشان دهنده برخي از تبديلات انواع است كه مستلزم تبديل cast
مي باشند :

+ // Demonstrate casts.
+ class Conversion {
+ public static void main(String args[] ){
+ bytt b;
+ int i = 257;
+ double d = 323.142;
+
+ System.out.println("\nConversion of int to byte.");
+ b =( byte )i;
+ System.out.println("i and b " + i + " " + b);
+
+ System.out.println("\nConversion of double to int.");
+ i =( int )d;
+ System.out.println("d and i " + d + " " + i);
+
+ System.out.println("\nConversion of double to byte.");
+ b =( byte )d;
+ System.out/println("d and b " + d + " " + b);
+ }
+ }

خروجي اين برنامه بقرار زير مي باشد :

Conversion of int to byte.
i and b 257 1

Conversion of double to int.
d and i 323.142 323

Conversion of double to byte.
d and b 323.142 67
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
بنيادهاي كلاس java | java
دستورات انتخاب در جاوا | java
استفاده از پرانتزها | java
عملگر ? | java
عملگر انتساب The Assignment Operator | java
عملگرهاي منطقي بولي Boolean | java
عملگرهاي رابطه اي | java
عملگرها ی ریاضی و بیتی | java
اولين برنامه ساده java | java
آرايه ها در جاوا | java
متغيرها و اعمال روی آنها | java
انواع اعداد اعشاري جاوا | java
آموزش جاوا - integers ( اعداد صحيح ) | java
جاوا را بشناسیم | java

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آرايه ها در جاوا
يك آرايه گروهي از متغيرهاي يك نوع است كه با يك نام مشترك به آنها ارجاع
مي شود . مي توان آرايه ها را براي هر يك از انواع ايجاد نمود و ممكن است اين
آرايه ها داراي يك يا چندين بعد باشند . براي دسترسي به يك عضو آرايه از نمايه
(index) آن آرايه استفاده مي شود . آرايه ها يك وسيله مناسب براي گروه بندي
اطلاعات مرتبط با هم هستند .
نكته : اگر با Cو C++و آشنايي داريد ، آگاه باشيد . آرايه ها در جاوا بطور
متفاوتي نسبت به زبانهاي ديگر كار مي كنند .

آرايه هاي يك بعدي
آرايه يك بعدي بطور ضروري فهرستي از متغيرهاي يكنوع است . براي ايجاد يك
آرايه ، بايد يك متغير آرايه از نوع مورد نظرتان ايجاد كنيد . فرم عمومي اعلان
يك آرايه يك بعدي بقرار زير است :

type var-name [];

نام متغير نوع
در اينجا type اعلان كننده نوع اصلي آرايه است . نوع اصلي تعيين كننده نوع
داده براي هر يك از اعضائ داخل در آرايه است . بنابراين ، نوع اصلي آرايه تعيين
مي كند كه آرايه چه نوعي از داده را نگهداري مي كند . بعنوان مثال ، در زير
يك آرايه با نام month-days با نوع آرايه اي از عدد صحيح اعلان شده است .

+ int month_days[];

اگر چه اين اعلان تثبيت مي كند كه month-days يك متغير آرايه است ، اما بطور
واقعي آرايه اي وجود ندارد . در حقيقت ، مقدار month-days برابر تهي (null)
مي باشد كه يك آرايه بدون مقدار را معرفي مي كند . براي پيوند دادن month-days
با يك آرايه واقعي و فيزيكي از اعداد صحيح ، بايد از يك عملگر new استفاده
نموده و به month-days منتسب كنيد. new يك عملگراست كه حافظه را اختصاص ميدهد.
بعداnew " را با دقت بيشتري بررسي مي كنيم ، اما لازم است كه هم اكنون از آن
استفاده نموده و حافظه را براي آرايه ها تخصيص دهيد . فرم عمومي new آنگونه كه
براي آرايه هاي يك بعدي بكار مي رود بقرار زير ظاهر خواهد شد :

array-var=new type [size];

اندازه نوع متغير آرايه
در اينجا type مشخص كننده نوع داده اي است كه تخصيص داده مي شود، size مشخص
كننده تعداد اعضائ آرايه است و array-var متغير آرايه است كه به آرايه پيوند
مي يابد . يعني براي استفاده از new در تخصيص يك آرايه ، بايد نوع و تعداد
اعضايي كه تخصيص مي يابند را مشخص نماييد . اعضائ آرايه كه توسط new تخصيص
مي يابند بطور خودكار با مقدار صفر مقدار دهي اوليه مي شوند . اين مثال يك
آرايه 12 عضوي از اعداد صحيح را تخصيص داده و آنها را به month-days پيوند
مي دهد .

+ month_days = new int[12];

بعد از اجراي اين دستور ، month-days به يك آرايه 12 تايي از اعداد صحيح
ارجاع خواهد نمود . بعلاوه كليه اجزائ در آرايه با عدد صفر مقدار دهي اوليه
خواهند شد .
اجازه دهيد مرور كنيم : بدست آوردن يك آرايه مستلزم پردازش دو مرحله اي است .
اول بايد يك متغير با نوع آرايه مورد نظرتان اعلان كنيد . دوم بايد حافظه اي كه
آرايه را نگهداري مي كند ، با استفاده از new تخصيص دهيد و آن را به متغير
آرايه نسبت دهيد . بنابراين در جاوا كليه آرايه ها بطور پويا تخصيص مي يابند .
اگر مفهوم تخصيص پويا براي شما ناآشناست نگران نباشيد . اين مفهوم را بعدا"
تشريح خواهيم كرد .
هر بار كه يك آرايه را تخصيص مي دهيد ، مي توانيد بوسيله مشخص نمودن نمايه
آن داخل كروشه [] به يك عضو مشخص در آرايه دسترسي پيدا كنيد . كليه نمايه هاي
آرايه ها با عدد صفر شروع مي شوند. بعنوان مثال اين دستور مقدار 28 را به دومين
عضو month-days نسبت مي دهد .

+ month_days[1] = 28;

خط بعدي مقدار ذخيره شده در نمايه 3 را نمايش مي دهد .

+ System.out.println(month_days[3]);

با كنار هم قرار دادن كليه قطعات ، در اينجا برنامه اي خواهيم داشت كه يك
آرايه براي تعداد روزهاي هر ماه ايجاد مي كند .

+ // Demonstrate a one-dimensional array.
+ class Array {
+ public static void main(String args[] ){
+ int month_days[];
+ month_days = new int[12];
+ month_days [0] = 31;
+ month_days [1] = 28;
+ month_days [2] = 31;
+ month_days [3] = 30;
+ month_days [4] = 31;
+ month_days [5] = 30;
+ month_days [6] = 31;
+ month_days [7] = 31;
+ month_days [8] = 30;
+ month_days [9] = 31;
+ month_days [10] = 30;
+ month_days [11] = 31;
+ System.out.println("April has " + month_days[3] + " days .");
+ }
+ }

وقتي اين برنامه را اجرا ميكنيد ، برنامه ، تعداد روزهاي ماه آوريل را چاپ
ميكند. همانطوريكه ذكر شد، نمايه هاي آرايه جاوا با صفر شروع مي شوند، بنابراين
تعداد روزهاي ماه آوريل در month-days[3] برابر 30 مي باشد .
اين امكان وجود دارد كه اعلان متغير آرايه را با تخصيص خود آرايه بصورت زير
تركيب نمود : + int month_days[] = new int[12];

اين همان روشي است كه معمولا" در برنامه هاي حرفه اي نوشته شده با جاوا مشاهده
مي كنيد .
مي توان آرايه ها را زمان اعلانشان ، مقدار دهي اوليه نمود . پردازش آن بسيار
مشابه پردازشي است كه براي مقدار دهي اوليه انواع ساده استفاده مي شود . يك
مقدار ده اوليه آرايه فهرستي از عبارات جدا شده بوسيله كاما و محصور شده بين
ابروهاي باز و بسته مي باشد . كاماها مقادير اجزائ آرايه را از يكديگر جدا
مي كنند . آرايه بطور خودكار آنقدر بزرگ ايجاد مي شود تا بتواند ارقام اجزايي
را كه در مقدار ده اوليه آرايه مشخص كرده ايد ، دربرگيرد . نيازي به استفاده از new
وجود ندارد . بعنوان مثال ، براي ذخيره نمودن تعداد روزهاي هر ماه ، كد
بعدي يك آرايه مقدار دهي اوليه شده از اعداد صحيح را بوجود مي آورد :

+ // An improved version of the previous program.
+ class AutoArray {
+ public static void main(String args[] ){
+ int month_days[] = { 31/ 28/ 31/ 30/ 31/ 30/ 31/ 31/ 30/ 31/ 30/ 31 };
+ System.out.println("April has " + month_days[3] + " days .");
+ }
+ }

وقتي اين برنامه را اجرا كنيد ، همان خروجي برنامه قبلي را خواهيد ديد .
جاوا بشدت كنترل مي كند تا مطمئن شود كه بطور تصادفي تلاشي براي ذخيره نمودن
يا ارجاع مقاديري خارج از دامنه آرايه انجام ندهيد . سيستم حين اجراي جاوا
كنترل مي كند كه كليه نمايه هاي آرايه ها در دامنه صحيح قرار داشته باشند . ( از
اين نظر جاوا كاملا"با Cاو C++و متفاوت است كه هيچ كنترل محدوده اي در حين اجرا
انجام نمي دهند . ) بعنوان مثال ، سيستم حين اجرا ، مقدار هر يك از نمايه ها به month-days
را كنترل مي كند تا مطمئن شود كه بين ارقام 0 و 11 داخل قرار داشته
باشند . اگر تلاش كنيد تا به اجزائ خارج از دامنه آرايه ( اعداد منفي يا اعدادي
بزرگتر از طول آرايه ) دسترسي يابيد، يك خطاي حين اجرا (run-time error) توليد
خواهد شد .
در زير يك مثال پيچيده تر مشاهده مي كنيد كه از يك آرايه يك بعدي استفاده
مي كند . اين برنامه ميانگين يك مجموعه از ارقام را بدست مي آورد .

+ // Average an array of values.
+ class Average {
+ public static void main(String args[] ){
+ double nums[] = {10.1/ 11.2/ 12.3/ 13.4/ 14.5};
+ double result = 0;
+ int i;
+
+ for(i=0; i<5; i++)
+ result = result + nums[i];
+
+ System.out.println("Average is " + result / 5);
+ }
+ }

آرايه هاي چند بعدي
در جاوا آرايه هاي چند بعدي در واقع آرايه اي از آرايه ها هستند . اين قضيه
همانطوريكه انتظار داريد ظاهر و عملكردي مشابه آرايه هاي چندبعدي منظم (regular)
دارد . اما خواهيد ديد كه تاوتهاي ظريفي هم وجود دارند . براي اعلان يك متغير
آرايه چند بعدي ، با استفاده از مجموعه ديگري از كروشه ها هر يك از نمايه هاي
اضافي را مشخص مي كنيد. بعنوان مثال ، عبارت زيرر يك متغير آرايه دو بعدي بنام twoD
را اعلان مي كند .

+ int twoD[][] = new int[4][5];

اين عبارت يك آرايه 4در 5ر را تخصيص داده و آن را به twoD نسبت مي دهد . از
نظر داخلي اين ماتريس بعنوان يك آرايه از آرايه نوع int پياده سازي خواهد شد .
بطور فرضي ، اين آرايه را مي توان بصورت شكل زير نمايش داد .

Right index determines column.

|| || || || ||
\/ \/ \/ \/ \/

|
| [0][4] | [0][3] | [0][2] | [0][1] | [0][0] >
|
| |
| [1][4] | [1][3] | [1][2] | [1][1] | [1][0] >
Left index
determines |
| [2][4] | [2][3] | [2][2] | [2][1] | [2][0] .> row
|
| |
| [3][4] | [3][3] | [3][2] | [3][1] | [3][0] >
Given :int twoD[][] = new int [4][5];

برنامه بعدي هر عضو آرايه را از چپ به راست ، و از بالا به پايين شماره داده
و سپس مقادير آنها را نمايش مي دهد :

+ // Demonstrate a two-dimensional array.
+ class TwoDArray {
+ public static void main(String args[] ){
+ int twoD[][] = new int[4][5];
+ int i/ j/ k = 0;
+
+ for(i=0; i<4; i++)
+ for(j=0; j<5; j++ ){
+ twoD[i][j] = k;
+ k++;
+
+ }
+
+ for(i=0; i<4; i++ ){
+ for(j=0; j<5; j++)
+ System.out.print(twoD[i][j] + " ");
+ System.out.println)(;
+ }
+ }
+ }

خروجي اين برنامه بقرار زير خواهد بود : 0 1 2 3 4

5 6 7 8 9
10 11 12 13 14
15 16 17 18 19

هنگام تخصيص حافظه به يك آرايه چند بعدي ، كافي است فقط حافظه براي اولين
بعد را مشخص نماييد . مي توانيد ابعاد ديگر را جداگانه تخصيص دهيد . بعنوان
مثال ، كد زير حافظه اولين بعد twoD را هنگام اعلان آن تخصيص مي دهد . اين كد
حافظه دومين بعد را بصورت دستي اختصاص مي دهد .

+ int twoD[][] = new int[4][];
+ twoD[0] = new int[5];
+ twoD[1] = new int[5];
+ twoD[2] = new int[5];
+ twoD[3] = new int[5];

اگرچه در اين حالت اختصاص انفرادي حافظه به دومين بعد هيچ مزيتي ندارد، اما
احتمال چنين مزيتهايي وجود دارد . بعنوان مثال ، هنگاميكه ابعاد را بصورت دستي
اختصاص مي دهيد ، نيازي نيست كه همان ارقام براي اجزائ هر بعد را تخصيص دهيد .
همانطوريكه قبلا" گفتيم ، از آنجاييكه آرايه هاي چند بعدي واقعا" آرايه اي از
آرايه ها هستند ، طول هر يك از آرايه ها تحت كنترل شما قرار مي گيرند . بعنوان
مثال ، برنامه بعدي يك آرايه دو بعدي ايجاد مي كند كه در آن اندازه هاي دومين
بعد نامساوي هستند .

+ // Manually allocate differing size second dimension.
+ class TwoDAgain {
+ public static void main(String args[] ){
+
+
+ int twoD[][] = new int[4][];
+ twoD[0] = new int[1];
+ twoD[1] = new int[2];
+ twoD[2] = new int[3];
+ twoD[3] = new int[4];
+
+ int i/ j/ k = 0;
+
+ for(i=0; i<4; i++)
+ for(j=0; j + towD[i][j] = k;
+ k++;
+ }
+
+ for(i=0; i<4; i++ ){
+ for(j=0; j + System.out.print(twoD[i][j] + " ");
+ System.out.println)(;
+ }
+ }
+ }

خروجي اين برنامه بقرار زير مي باشد : 0

1 2
3 4 5
6 7 8 9

آرايه اي كه توسط اين برنامه ايجاد مي شود ، بصورت زير خواهد بود :

| [0][0] |

| [1][0] | [1][1] |

| [2][0] | [2][1] | [2][2] |

| [3][0] | [3][1] | [3][2] | [3][3] |

از آرايه هاي چند بعدي ناجور ( يا نامنظم ) در اكثر برنامه ها استفاده نميشود
زيرا برخلاف آنچه مردم هنگام مواجه شدن با يك آرايه چند بعدي انتظار دارند
رفتار مي كنند . اما اين آرايه ها در برخي شرايط بسيار كارا هستند . بعنوان
مثال ، اگر نياز به يك آرايه دو بعدي خيلي بزرگ داريد كه داراي تجمع پراكنده
باشد ( يعني كه يكي و نه همه اجزائ آن مورد استفاده قرار مي گيرند ) ، آنگاه
آرايه بي قاعده احتمالا" يك راه حل كامل خواهد بود .
اين امكان وجود دارد كه آرايه هاي چند بعدي را مقدار دهي اوليه نمود . براي
اينكار ، فقط كافي است هر يك از مقدار ده اوليه ابعاد را داخل مجموعه ابروهاي
ختص خودش قرار دهيد . برنامه بعدي يك ماتريس ايجاد مي كند كه هر يك از اجزائ
آن شامل حاصلضرب نمايه هاي سطرها و ستونها هستند. همچنين دقت نماييد كه مي توان
از عبارات همچون مقادير لفظي داخل مقدار ده اوليه آرايه استفاده نمود .

+ // Initialize a two-dimensional array.
+ class Matrix {
+ public static void main(String args[] ){
+ double m[][] = {
+ { 0*0/ 1*0/ 2*0/ 3*0 };
+ { 0*1/ 1*1/ 2*1/ 3*1 };
+ { 0*2/ 1*2/ 2*2/ 3*2 };
+ { 0*3/ 1*3/ 2*3/ 3*3 };
+ };
+ int i/ j;
+
+ for(i=0; i<4; i++ ){
+ for(j=0 j<4; j++)
+ System.out.print(m[i][j] + " ");
+ System.out.println)(;
+ }
+ }
+ }

پس از اجراي اين برنامه ، خروجي آن بقرار زير خواهد بود : 0 0 0 0

0 1 2 3
0 2 4 6
0 3 6 9

همانطوريكه مشاهده مي كنيد، هر سطر در آرايه همانگونه كه در فهرستهاي مقدار
دهي اوليه مشخص شده ، مقدار دهي اوليه شده است .
مثالهاي بيشتري درباره استفاده از آرايه چند بعدي بررسي مي كنيم . برنامه
بعدي يك آرايه سه بعدي 3x4x5 ايجاد مي كند . سپس حاصل نمايه هاي مربوطه را براي
هر عضو بارگذاري مي كند . در نهايت اين حاصل ها را نمايش خواهد داد :

+ // Demonstrate a three-dimensional array.
+ class threeDDatrix {
+ public static void main(String args[] ){
+ int threeD[][][] = new int[3][4][5];
+ int i/ j/ k;
+ for(i=0; i<3; i++)
+ for(j=0; j<4; j++)
+ for(k=0; k<5; k++)
+ threeD[i][j][k] = i * j * k;
+
+ for(i=0; i<3; i++ ){
+ for(j=0; j<4; j++ ){
+ for(k=0; k<5; k++)
+ System.out.print(threeD[i][j][k] + " ");
+ System.out.println)(;
+ }
+ System.out.println)(;
+ }
+ }
+ }

خروجي اين برنامه بقرار زير خواهد بود : 0 0 0 0 0

0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

0 0 0 0 0
0 1 2 3 4
0 2 4 6 8
0 3 6 9 12

0 0 0 0 0
0 2 4 6 8
0 4 8 12 16
0 6 12 18 24

دستور زبان جايگزين اعلان آرايه
يك شكل دوم براي اعلان يك آرايه بصورت زير وجود دارد :

type [] var-name;

نام متغير نوع
در اينجا كروشه ها بعداز مشخص كننده نوع مي آيند نه بعداز نام متغير آرايه .
بعنوان مثال دو شكل اعلان زير يكسان عمل مي كنند :

+ int a1[] = new int[3];
+ int[] a2 = new int[3];

دو شكل اعلان زير هم يكسان عمل مي كنند :

+ char twod1[][] = n
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
بنيادهاي كلاس java | java
دستورات انتخاب در جاوا | java
استفاده از پرانتزها | java
عملگر ? | java
عملگر انتساب The Assignment Operator | java
عملگرهاي منطقي بولي Boolean | java
عملگرهاي رابطه اي | java
عملگرها ی ریاضی و بیتی | java
اولين برنامه ساده java | java
آرايه ها در جاوا | java
متغيرها و اعمال روی آنها | java
انواع اعداد اعشاري جاوا | java
آموزش جاوا - integers ( اعداد صحيح ) | java
جاوا را بشناسیم | java

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


اولين برنامه ساده java
اكنون كه اصول اساسي شي ئ گرايي جاوا مورد بررسي قرار گرفته ، به برخي از
برنامه هاي واقعي جاوا نگاه خواهيم كرد. كار را با كامپايل كردن و اجراي برنامه
كوتاه زير شروع مي كنيم . خواهيم ديد كه اين برنامه بيشتر از حد تصور شما كار
لازم دارد .

+ /*
+ This is a simple Java program.
+ Call this file "Example.java".
+ /*
+ class Exaample {
+ // Your program begins with a call to main.)(
+ public static void main( String args [] ){
+ System.out.println( "This is a simple Java program.");
+ }
+ }

نكته : در توصيف زيرين از JDK(JAVA Developer's Kit() استاندارد استفاده شده
است كه توسط خود شركت Sun Microsystems عرضه شده است . اگر از يك محيط
توسعه يافته ديگر براي جاوا استفاده مي كنيد ، آنگاه بايد از رويه
متفاوتي براي كامپايل كردن و اجراي برنامه استفاده كنيد . در اين مورد
به راهنماي كاربران كامپايلر خود مراجعه نماييد .

وارد نمودن برنامه Entering the program
در بسياري از زبانهاي كامپيوتري ، نام فايلي كه كد منبع (Source code) يك
برنامه را نگهداري مي كند بصورت اختياري انتخاب مي شود . اما در جاوا اينگونه
نيست . اولين چيزي كه بايد درباره جاوا بدانيد اين است كه نامي را كه براي
فايل منبع انتخاب مي كنيد ، بسيار اهميت دارد . در اين مثال ، نام فايل منبع
بايد Example JJAVA باشد . چرا ?
در جاوا يك فايل منبع را بطور رسمي واحد كامپايل سازي (Compilation unit)
مي گويند . اين فايل يك فايل متني است كه دربرگيرنده يك يا چندين تعريف كلاس
(class definition) است . در كامپايلر جاوا بايد از فايل منبعي استفاده نمود
كه داراي پسوند فايل JAVA باشد . دقت كنيد كه اين پسوند داراي چهار كاراكتر
است . حتما" مي دانيد كه سيستم عامل شما بايد توانايي حمايت از پسوندهاي
طولاني تر را داشته باشد . بدين ترتيب Dos و ويندوز 3.1 توانايي حمايت از جاوا
( لااقل تاكنون ) را ندارند. اما ويندوز NT و95 بخوبي ازعهده اينكار برمي آيند.
يكبار ديگر به برنامه فوق نگاه كنيد، نام كلاس تعريف شده توسط برنامه ،Example
مي باشد ، اين يك تصادف يا اتفاق نيست . در جاوا كليه كدها بايد داخل يك كلاس
جاي بگيرند . براساس آيين نامه ، نام آن كلاس بايد با نام فايلي كه برنامه را
نگهداري مي كند ، مطابقت داشته باشد . همچنين بايد مطمئن شويد كه حروف بزرگ در
نام فايل با نام كلاس مطابقت و هماهنگي داشته باشند . دليل اين است كه جاوا
بسيار حساس نسبت به مورد است . از اين نظر آيين نامه اي كه نامهاي فايل را به
نامهاي كلاس مرتبط مي كند ، ممكن است اختياري بنظر رسد . اما ، اين آيين نامه
سبب شده تا نگهداري و سازماندهي برنامه ها آسان تر انجام شود .

كامپايل نمودن برنامه Compiling the program
براي كامپايل نمودن برنامه Example ، كامپايلر javac را اجرا نموده و نام
فايل منبع را روي خط فرمان (command line) بصورت زير مشخص نماييد :

+ c:\>javac Example.java

كامپايلر javac فايلي تحت نام Example.class ايجاد مي كند كه شامل روايت كد
بايتي از برنامه است . همانگونه كه قبلا" بحث شد ، كد بايتي جاوا نوعي معرفي
مياني از برنامه شماست كه دربرگيرنده دستورالعملهايي است كه مفسر جاوا آنها را
اجرا مي كند . بنابراين خروجي javac كدي كه مستقيما" قابل اجرا باشد ، نخواهد
بود .
براي اجراي واقعي برنامه ، بايد از مفسر (interpreter) جاوا تحت نام java
استفاده نماييد . بدين منظور نام كلاس Example را بعنوان يك آرگومان (argument)
خط فرمان بصورت زير وارد نماييد .

+ c:\>java Example

پس از اجراي اين برنامه ، خروجي بصورت زير بنمايش درمي آيد : This is a simple Java program.

هنگاميكه كد منبع جاوا كامپايل شود ، هر كلاس بتنهايي در فايل خروجي مخصوص
خود كه فايل آن بعد از كلاس و پسوند class ذكر مي شود، قرار خواهد گرفت . بهمين
دليل است كه بايد نام فايلهاي منبع جاوا را مطابق همان كلاسي كه آن را در بر
مي گيرد انتخاب نمود تا نام فايل منبع با نام فايل class. مطابقت داشته باشد .
وقتي كه مفسر جاوا را همانگونه كه نشان داديم اجرا مي كنيد ، شما در حقيقت نام
كلاسي كه مايليد مفسر آن را اجرا كند ، مشخص مي نماييد . مفسر بطور خودكار به
دنبال يك فايل مي گردد كه داراي پسوند class. باشد . اگر آن را پيدا كند ، كدي
را كه در آن كلاس مشخص شده وجود دارد ، اجرا خواهد نمود .

نگاهي دقيقتر به برنامه نمونه اول
اگر چه عبارت Example jjava بسيار كوتاه است ، اما دربرگيرنده چندين جنبه
كليدي است كه در همه برنامه هاي جاوا وجود خواهند داشت . اجازه دهيد تا هر يك
از بخشهاي برنامه را با دقت بيشتري بررسي كنيم .
برنامه با خط زير شروع مي شود :

+ /*
+ This is a simple Java program.
+ Call this file "Example .java".
+ /*

اين يك " توضيح "(Comment() است . مثل بسياري از زبانهاي برنامه نويسي ،جاوا
به شما امكان وارد نمودن يك ملاحظه (Remark) در فايل منبع برنامه را مي دهد .
محتوي يك " توضيح " توسط كامپايلر ناديده گرفته خواهد شد . در عوض ، يك "
توضيح " ، توصيف كننده يا شرح دهنده عملكرد برنامه است به هر كسي كه كد منبع
را مطالعه نمايد . در اين مثال ، " توضيح " ، توصيف كننده برنامه بوده و بياد
شما مي اندازد كه فايل منبع را بايدExample.java بناميد . البته ، در برنامه هاي
واقعي ،" توضيحات " بطور كلي توصيف مي كنند كه چگونه برخي از بخشهاي يك برنامه
كار كرده و يا اينكه يك جنبه خاص از برنامه چكاري انجام خواهد داد .
جاوا از سه روش براي " توضيحات " پشتيباني مي كند. اول آن چيزي است كه بالاي
برنامه مشاهده مي كنيد كه آن را توضيح چند خطي (multiline comment) مي گويند .
اين نوع از " توضيح " بايد با علامت /* و با علامت */ پايان يابد . هر چيزي كه
بين اين دو علامت قرار گيرد توسط كامپايلر ناديده گرفته خواهد شد . همانطوريكه
از نام اين روش پيداست ، يك توضيح ، چند خطي ممكن است چندين خط دراز داشته
باشد .
خط بعدي كد برنامه بصورت زير مي باشد :

+ class Exaple {

اين خط از واژه كليدي class استفاده مي كند تا اعلان نمايد كه يك كلاس جديد
در حال تعريف شدن است . Example شناسه اي (identifier) است كه نام كلاس مي باشد.
كل تعريف كلاس ، شامل : كليه اعضائ خود ، بين علامات ابروباز ({) و ابروبسته (})
قرار مي گيرد . استفاده از علامات فوق در جاوا مشابه روش استفاده از آنها در C
و C++ است . فعلا" درباره جزئيات مربوط به يك كلاس نگران نباشيد مگر دقت به اينكه
در جاوا ، كليه فعاليت برنامه اي داخل يك علامت اتفاق مي افتد . اين امر يكي از
دلايلي است كه كليه برنامه هاي جاوا شي ئ گرا هستند .
خط بعدي برنامه يك " توضيح يك خطي "(single-line comment() بصورت زير است :

+ // Your program begins with a call to main.)(

اين نوع دوم " توضيحي " است كه توسط جاوا پشتيباني مي شود. يك توضيح يك خطي
با علامت // شروع شده و در انتهاي خط پايان مي يابد . بعنوان يك قانون عمومي
برنامه نويسان از توضيحات چند خطي براي ملاحظات طولاني تر و از توضيحات يك خطي
براي توضيحات كوتاه و خط به خط استفاده مي كنند .
خط بعدي كد بقرار زير مي باشد :

+ public static void main( String args [] ){

اين خط شروع كننده روش ()main است . همانطوريكه توضيح متعاقب آن پيشنهاد
مي كند ، اين خطي است كه برنامه در آن شروع به اجرا مي نمايد . كليه برنامه هاي
كاربردي جاوا با فراخواني ()main شروع به اجرا مي كنند. ( درست شبيه C++/C. ).
معناي دقيق بخشهاي مختلف اين خط را فعلا" نمي توان توضيح داد ، زيرا درك آن
مستلزم آگاهي از روش Java براي كپسول سازي است . اما از آنجاييكه اكثر مثالهاي
موجود در بيشتر قسمتهاي اين بحث از اين خط از كط استفاده مي كنند ، بهتر است
مرور كوتاهي بر بخشهاي مختلف آن داشته باشيم .
واژه كليدي public يك توصيفگر دسترسي (access specifier) است كه به برنامه
نويس امكان داده تا قابليت و سطح مشاهده اعضائ كلاس را كنترل نمايد . وقتي كه
عبارت public قبل از يك عضو كلاس قرار مي گيرد ، آنگاه آن عضو را مي توان با
كدهاي خارج از كلاس كه اعلان شده ، مورد دسترسي قرار داد . ( مخالف اين عبارت
عبارت .private است كه از دسترسي به يك عضو توسط كدهاي تعريف شده در خارج كلاس
جلوگيري مي نمايد . ) در اين حالت ()main بايد بعنوان public اعلام شود ، زيرا
بايد توسط كدهاي خارج از كلاس هنگاميكه برنامه آغاز مي شود ، فراخواني شود .
واژه كليدي Static به ()main امكان داده تا بدون معرفي شدن توسط يك كلاس نمونه
فراخواني شود . اين امر ضروري است چون ()main قبل از اينكه هر يك از اشيائ
ساخته شوند توسط مفسر جاوا فراخواني خواهد شد . واژه كليدي Void بسادگي به
كامپايلر مي گويد كه ()main مقداري را بازگردان نمي كند . همانطوريكه خواهيد
ديد ، ممكن است روشها (methods) نيز مقادير را بازگردان كنند . اگر اين مطالب
تا حدي گيج كننده است ، نگران نباشيد . كليه اين مطالب با جزئيات بيشتري در
قسمتهاي بعد بررسي خواهد شد .
همانطوريكه بيان شده ()main روشي است كه هنگام شروع يك برنامه كاربردي جاوا
فراخواني مي شود . بياد آوريد كه جاوا بسيار حساس نسبت به مورد است . بنابراين
براي جاوا Mainو mainو دو مفهوم متفاوت دارند . نكته مهم اين است كه كامپايلر
جاوا فقط كلاسهايي را كه شامل روش ()main نباشند ، كامپايل خواهد نمود . اما
مفسر جاوا راهي براي اجراي اين كلاسها ندارد . بنابراين اگر بجاي main عبارت Main
را تايپ كرده باشيد ، كامپايلر همچنان برنامه شما را كامپايل خواهد كرد .
اما مفسر جاوا يك گزارش خطا مي دهد زيرا توانايي يافتن روش ()main را ندارد .
اطلاعاتي كه لازم است به يك روش ارسال كنيد ، توسط متغيرهاي مشخص شده بين
مجموعه پرانتزهايي كه بعد از نام روش قرار مي گيرند ، دريافت خواهد شد . اين
متغيرها را پارامترها (parameters) مي نامند . اگر براي يك روش داده شده نياز
به پارامتري نباشد ، از پرانتزهاي خالي استفاده مي كنيد . در حال حاضر ()main
فقط يك پارامتر دارد ، كه البته بسيار پيچيده هم هست . String args [] يك
پارامتر با نام args را اعلان ميكند كه يك آرايه از نمونه هاي string كلاس ميباشد.
( آرايه مجموعه اي از اشيائ مشابه هم هستند . ) اشيائ از نوع string ، رشته هاي
كاراكترها را ذخيره مي كنند . در اين حالت ، args هر نوع آرگومان خط فرمان
حاضر در هنگام اجراي برنامه را دريافت مي كند . اين برنامه از اين اطلاعات
استفاده نمي كند ، اما برنامه هاي ديگر چنين استفاده اي را انجام مي دهند .
آخرين كاراكتر روي خط ، علامت { است . اين علامت نشان دهنده شروع بدنه ()main
است . تمامي كدهايي كه يك روش را تشكيل مي دهند بين ابرو باز و ابرو بسته همان
روش قرار مي گيرند .
يك نكته ديگر : ()main نقطه شروع بكار مفسر است . يك برنامه پيچيده شامل
دهها كلاس است كه فقط يكي از آنها لازم است يك روش ()main داشته باشد تا كارها
را شروع نمايد . هنگاميكه ريز برنامه ها (applets) برنامه هاي جاوا كه در
مرورگرهاي وب تعبيه مي شوند را ايجاد مي كنيد ، بهيچوجه از ()main استفاده
نخواهيد كرد، زيرا مرورگرهاي وب از وسائل متفاوتي براي شروع اجراي ريزبرنامه ها
استفاده مي كنند .
خط بعدي كد بقرار زير ميباشد. دقت كنيد كه اين خط داخل ()main قرار ميگيرد.

+ System.out.println("This is a simple Java program.");

اين خط رشته "This is a simple Java program" را بعنوان خروجي ارائه مي دهد
كه بعد از آن يك خط جديد روي صفحه ظاهر خواهد شد . خروجي بطور واقعي با روش
توكار ()println همراه است . در اين حالت ، ()println نمايش دهنده رشته اي است
كه در آن ثبت شده . خواهيد ديد كه از ()println براي نمايش ساير انواع اطلاعات
نيز استفاده مي شود . خط بالا با system.out شروع مي شود . اگر چه در اين مرحله
توضيح اين مطلب بسيار دشواراست ، اما بطور اختصار system يك كلاس از پيش تعريف
شده است كه دسترسي به سيستم را فراهم آورده و out نيز جريان خروجي است كه به
كنسول (console) مرتبط شده است .
همانطوريكه احتمالا" حدس زده ايد ، خروجي ( و نيز ورودي ) كنسول بندرت در
برنامه ها و ريز برنامه هاي جاوا مورد استفاده قرار مي گيرند . از آنجاييكه اكثر
محيط هاي جديد كامپيوتري داراي طبيعت پنجره اي و گرافيكي هستند ، كنسول l/o
اكثرا" براي برنامه هاي كمكي ساده و برنامه هاي نمايشي استفاده مي شود . بعدا"
شيوه هاي ديگري براي ايجاد خروجي با استفاده از جاوا ر خواهيد آموخت . اما فعلا"
ما استفاده از روشهاي l/o كنسول را ادامه مي دهيم .
دقت كنيد كه ()println با يك علامت ويرگول نقطه (;)(semicolon) پايان ميگيرد.
كليه دستورات (statements) در جاوا با همين علامت پايان مي گيرند . دليل اينكه
ساير خطوط برنامه با اين علامت پايان نمي گيرند اين است كه آنها را از نظر ند .
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
بنيادهاي كلاس java | java
دستورات انتخاب در جاوا | java
استفاده از پرانتزها | java
عملگر ? | java
عملگر انتساب The Assignment Operator | java
عملگرهاي منطقي بولي Boolean | java
عملگرهاي رابطه اي | java
عملگرها ی ریاضی و بیتی | java
اولين برنامه ساده java | java
آرايه ها در جاوا | java
متغيرها و اعمال روی آنها | java
انواع اعداد اعشاري جاوا | java
آموزش جاوا - integers ( اعداد صحيح ) | java
جاوا را بشناسیم | java

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


عملگرها ی ریاضی و بیتی
جاوا يك محيط عملگر غني را فراهم كرده است . اكثر عملگرهاي آن را مي توان
در چهار گروه طبقه بندي نمود : حسابي arithmetic رفتار بيتي bitwise رابطه اي ralational
و منطقي logical جاوا همچنين برخي عملگرهاي اضافي براي اداره
حالتهاي خاص و مشخص تعريف كرده است .
نكته : اگر با C++/C آشنايي داريد ، حتما" خوشحال مي شويد كه بدانيد كاركرد
عملگرها در جاوا دقيقا"مشابه با C++/C است . اما همچنان تفاوتهاي ظريفي
وجود دارد .

عملگرهاي حسابي Arithmetic operators
عملگرهاي حسابي در عبارات رياضي استفاده مي شوند و طريقه استفاده از آنها
بهمان روش جبري است . جدول بعدي فهرست عملگرهاي حسابي را نشان مي دهد :
|
نتيجه آن | عملگر |
|
اضافه نمودن | + | |
تفريق نمودن ( همچنين منهاي يكاني ) | - | |
ضرب | * | |
تقسيم | / | |
تعيين باقيمانده | % | |
افزايش | ++ | |
انتساب اضافه نمودن | += | |
انتساب تفرق نمودن | =- | |
انتساب ضرب نمودن | *= | |
انتساب تقسيم نمودن | /= | |
انتساب تعيين باقيمانده | %= | |
كاهش | - - |

عملوندهاي مربوط به عملگرهاي حسابي بايد از نوع عددي باشند . نمي توانيد از
اين عملگرها روي نوع boolean استفاده كنيد ، اما روي انواع char قابل استفاده
هستند ، زيرا نوع char در جاوا بطور ضروري زير مجموعه اي از int است .

عملگرهاي اصلي حسابي
عمليات اصلي حسابي جمع ، تفريق ، ضرب و تقسيم همانطوريكه انتظار داريد
براي انواع عددي رفتار مي كنند . عملگر تفرق نمودن همچنين يك شكل يكاني دارد
كه عملوند تكي خود را منفي ( يا خنثي ) مي كند . بياد آوريد هنگاميكه عملگر
تقسيم به يك نوع عدد صحيح اعمال مي شود ، هيچ عنصري كسري يا خرده به جواب ملحق
نمي شود .
برنامه ساده بعدي نشاندهنده عملگرهاي حسابي است . اين برنامه همچنين تفاوت
بين تقسيم اعشاري و تقسيم عدد صحيح را توضيح مي دهد .

+ // Demonstrate the basic arithmetic operators.
+ class BasicMath {
+ public static void main(String args[] ){
+ // arithmetic using integers
+ System.out.println("Integer Arithmetic");
+ int a = 1 + 1;
+ int a = a * 3;
+ int a = b / 4;
+ int a = c - a;
+ int a =- d;
+ System.out.println("a = " + a);
+ System.out.println("a = " + b);
+ System.out.println("a = " + c);
+ System.out.println("a = " + d);
+ System.out.println("a = " + e);
+
+ // arithmetic using doubles
+ System.out.println("\nFloating Point Arithmetic");
+ double da = 1 + 1;
+ double db = da * 3;
+ double dc = db / 4;
+ double dd = dc - a;
+ double de =- dd;
+ System.out.println("da = " + da);
+ System.out.println("db = " + db);
+ System.out.println("dc = " + dc);
+ System.out.println("dd = " + dd);
+ System.out.println("de = " + de);
+ }
+ }

خروجي اين برنامه بقرار زير مي باشد :

integer Arithmetic
a=2
b=6
c=1
d=-1
e=1
floating point arithmetic
da=2
db=6
dc=1.5
dd=-0.5
de=0.5

عملگر تعيين باقيمانده The Modulus operator
عملگر تعيين باقيمانده يعني % ، باقيمانده يك عمليات تقسيم را برمي گرداند.
اين عملگر براي انواع عدد اعشاري و انواع عدد صحيح قابل استفاده است . ( اما
در C++/C اين عملگر فقط در مورد انواع عدد صحيح كاربرد دارد . ) برنامه بعدي
نشان دهنده عملگر % مي باشد :

+ // Demonstrate the % operator.
+ class Modulus {
+ public static void main(String args[] ){
+ int x = 42;
+ double y = 42.3;
+
+ System.out.println("x mod 10 = " + x % 10);
+ System.out.println("y mod 10 = " + y % 10);
+ }
+ }

هنگاميكه اين برنامه را اجرا مي كنيد ، خروجي زير حاصل مي شود :

x mod 10=2
y mod 10=2.3

عملگرهاي انتساب حسابي Arithmetic Assignment operators
جاوا عملگرهاي ويژه اي را تدارك ديده كه با استفاده از آنها مي توان يك
عمليات حسابي را با يك انتساب تركيب نمود . احتمالا" مي دانيد كه دستوراتي نظير
مورد زير در برنامه نويسي كاملا" رايج هستند :

+ a = a + 4;

در جاوا ، مي توانيد اين دستور را بصورت ديگري دوباره نويسي نماييد :

+ a += 4;

اين روايت جديد از عملگر انتساب += استفاده مي كند هر دو دستورات يك عمل
واحد را انجام مي دهند : آنها مقدار aرا 4ا واحد افزايش مي دهند .
اكنون مثال ديگري را مشاهده نماييد :

+ a = a % 2;

كه مي توان آن را بصورت زير نوشت :

+ a %= 2;

در اين حالت %= باقيمانده a/2 را گرفته و حاصل را مجددا"در aر قرار مي دهد.
عملگرهاي انتسابي براي كليه عملگرهاي حسابي و دودوئي ( باينري ) وجود دارند .
بنابراين هر دستور با شكل :

Var = var op expression;

عبارت عملگر متغير متغير
را مي توان بصورت زير دوباره نويسي نمود :

var op = expression;

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

+ // Demonstrate several assignment operators.
+ class OpEquals {
+ public static void main(String args[] ){
+ int a = 1;
+ int b = 2;
+ int c = 3;
+
+ a += 5;
+ b *= 4;
+ c += a * b;
+ c %= 6;
+ System.out.println("a = " + a);
+ System.out.println("b = " + b);
+ System.out.println("c = " + c);
+ }
+ }

خروجي اين برنامه بقرار زير مي باشد :

a=6
b=8
c=3

افزايش و كاهش Increment and Decrement
علامات ++ و -- عملگرهاي افزايشي و كاهشي جاوا هستند . اين عملگرها را قبلا"
معرفي كرده ايم . در اينجا آنها را با دقت بيشتري بررسي مي كنيم . همانگونه كه
خواهيد ديد ، اين عملگرها خصلتهاي ويژه اي دارند كه بسيار جالب توجه است . بحث
درباره اين عملگرها را از نحوه كار آنها شروع مي كنيم .
عملگر افزايشي ، عملوند خود را يك واحد افزايش مي دهد . عملگر كاهشي نيز
عملوند خود را يك واحد كاهش مي دهد . بعنوان مثال ، دستور زير را

+ x = x + 1;

مي توان با استفاده از عملگر افزايشي بصورت زير دوباره نويسي نمود :

+ x++;

بطور مشابهي ، دستور زير را

+ x = x - 1;

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

+ x--;

اين عملگرها از آن جهت كه هم بشكل پسوند جايي كه بعد از عملوند قرار
مي گيرند و هم بشكل پيشوند جايي كه قبل از عملوند قرار مي گيرند ظاهر
مي شوند كاملا" منحصر بفرد هستند. در مثالهاي بعدي هيچ تفاوتي بين اشكال پسوندي
و پيشوندي وجود ندارد . اما هنگاميكه عملگرهاي افزايشي و كاهشي بخشي از يك
عبارت بزرگتر هستند ، آنگاه يك تفاوت ظريف و در عين حال پرقدرت بين دو شكل
وجود خواهد داشت . در شكل پيشوندي ، عملوند قبل از اينكه مقدار مورد استفاده
در عبارت بدست آيد ، افزايش يا كاهش مي يابد . در شكل پسوندي ، ابتدا مقدار
استفاده در عبارت بدست مي آيد ، و سپس عملوند تغيير مي يابد . بعنوان مثال :

+ x = 42;
+ y = ++x;

در اين حالت ، همانطوريكه انتظار داريد y معادل 43 مي شود ، چون افزايش قبل
از اينكه xبه y منتسب شود ، اتفاق مي افتد . بدين ترتيب خط y=++ معادل دو
دستور زير است :

+ x = x + 1;
+ y = x;

اما وقتي كه بصورت زير نوشته مي شوند :

+ x = 42;
+ y = x++;

مقدار x قبل از اينكه عملگر افزايشي اجرا شود ، بدست مي آيد ، بنابراين
مقدار y معادل 42 مي شود . البته در هر دو حالت x معادل 43 قرار مي گيرد . در
در اينجا ، خط y=x++ معادل دو دستور زير است :

+ y = x;
+ x = x + 1;

برنامه بعدي نشان دهنده عملگر افزايشي است .

+ // Demonstrate ++.
+ class IncDec {
+ public static void main(String args[] ){
+ int a = 1;
+ int b = 2;
+ int c;
+ int d;
+
+ c = ++b;
+ d = a++;
+ c++;
+ System.out.println("a = " + a);
+ System.out.println("b = " + b);
+ System.out.println("c = " + c);
+ System.out.println("d = " + d);
+ }
+ }

خروجي اين برنامه بقرار زير مي باشد :

a=2
b=3
c=4
d=1

عملگرهاي رفتار بيتي The Bitwise operators
جاوا چندين عملگر رفتار بيتي تعريف نموده كه قابل اعمال روي انواع عدد صحيح
شامل long، int،، short،، char،و byteو مي باشند . اين عملگرها روي بيت هاي
تكي عملوندهاي خود عمل مي كنند . اين عملگرها را در جدول زير خلاصه نموده ايم :
نتيجه آن عملگر
Bitwise unary Not
Not يكاني رفتار بيتي ~ Bitwise AND
AND رفتار بيتي & Bitwise OR
OR رفتار بيتي | Bitwise exclusive OR
OR خارج رفتار بيتي ^ shift right
>> حركت براست shift right zero fill
>>> حركت براست پر شده با صفر shift left
<< حركت به چپ Bitwise AND assignment
انتساب AND رفتار بيتي &= Bitwise OR assignment
انتساب OR رفتار بيتي |= Bitwise exclusive OR assignment
انتساب OR خارج رفتار بيتي ^= shift right assignment
انتساب حركت راست = >>shift right zero fill assignment
انتساب حركت براست پر شده با صفر = >>>shift left assignment
انتساب حركت به چپ = <<
از آنجاييكه عملگرهاي رفتار بيتي با بيت هاي داخل يك عدد صحيح سر و كار
دارند ، بسيار مهم است بدانيم كه اين سر و كار داشتن چه تاثيري ممكن است روي
يك مقدار داشته باشد . بخصوص بسيار سودمند است بدانيم كه جاوا چگونه مقادير
عدد صحيح را ذخيره نموده و چگونه اعداد منفي را معرفي مي كند . بنابراين ، قبل
از ادامه بحث ، بهتر است اين دو موضوع را باختصار بررسي نماييم .
كليه انواع صحيح بوسيله ارقام دودوئي ( باينري ) داراي پهناي بيتي گوناگون
معرفي ميشوند. بعنوان مثال ، مقدار byte عدد 42 در سيستم باينري معادل 00101010
است ، كه هر يك از اين نشانه ها يك توان دو را نشان مي دهند كه با 2 به توان 0
در بيت سمت راست شروع شده است . يا موقعيت بعدي بيت بطرف چپ 2'يا 2ا است و به
طرف چپ بيت بعدي 2 به توان 2يا 4ا است ، بعدي 8 ، 16 ، 32 و همينطور الي آخر
هستند . بنابراين عدد 42 بيت 1 را در موقعيتهاي اول ، سوم و پنجم ( از سمت
راست درنظربگيريد ) دارد. بدين ترتيب 42 معادل جمع 5 بتوان 3+2 بتوان 1+2 بتوان 2
يعني 2+8+32 مي باشد .
كليه انواع عدد صحيح ( باستثنائ char ) اعداد صحيح علامت دار هستند . يعني
كه اين انواع مقادير منفي را همچون مقادير مثبت مي توانند معرفي كنند . جاوا
از يك روش رمزبندي موسوم به مكمل دو (two's complement) استفاده مي كند كه در
آن ارقام منفي با تبديل ( تغيير 1به 0 و بالعكس ) كليه بيت هاي يك مقدار و
سپس اضافه نمودن 1 به آن معرفي مي شوند . بعنوان مثال براي معرفي 42 ، ابتدا
كليه بيت هاي عدد 42 (00101010) را تبديل مي نماييم كه 11010101 حاصل مي شود
آنگاه 1 را به آن اضافه مي كنيم . كه حاصل نهايي يعني 11010110 معرف عدد 42
خواهد بود . براي رمز گشايي يك عدد منفي ، كافي است ابتدا كليه بيت هاي آن را
تبديل نموده ، آنگاه 1 را به آن اضافه نماييم . 42- يعني 11010110 پس از تبديل
برابر 00101001 يا 41 شده و پس از اضافه نمودن 1 به آن برابر 42 خواهد شد .
دليل اينكه جاوا( واكثر زبانهاي برنامه نويسي )از روش مكمل دو(two's complement)
استفاده مي كنند ، مسئله تقاطع صفرها (Zero crossing) است . فرض كنيد يك مقدار byte
براي صفر با 00000000 معرفي شده باشد. در روش مكمل يك (one's complement)
تبديل ساده كليه بيت ها منجر به 11111111 شده كه صفر منفي را توليد مي كند .
اما مشكل اين است كه صفر منفي در رياضيات عدد صحيح غير معتبر است . اين مشكل
بااستفاده از روش مكمل دو (two's complement) براي معرفي مقادير منفي حل خواهد
شد . هنگام استفاده از روش مكمل دو ، 1 به مكمل اضافه شده و عدد 100000000
توليد مي شود . اين روش بيت 1 را در منتهي اليه سمت چپ مقدار byte قرار داده
تا رفتار مورد نظر انجام گيرد، جايي كه 0با 0ا يكسان بوده و 11111111 رمزبندي
شده 1 است . اگر چه در اين مثال از يك مقدار byte استفاده كرديم ، اما همين
اصول براي كليه انواع عدد صحيح جاوا صدق مي كنند .
از آنجاييكه جاوا از روش مكمل دو براي ذخيره سازي ارقام منفي استفاده ميكند
و چون كليه اعداد صحيح در جاوا مقادير علامت دار هستند بكار بردن عملگرهاي
رفتار بيتي براحتي نتايج غير منتظره اي توليد مي كند . بعنوان مثال برگرداندن
بيت بالاتر از حد مجاز (high-order) سبب مي شود تا مقدار حاصله بعنوان يك رقم
منفي تفسير شود ، خواه چنين قصدي داشته باشيد يا نداشته باشيد . براي جلوگيري
از موارد ناخواسته ، فقط بياد آوريد كه بيت بالاتر از حد مجاز (high-order)
علامت يك عدد صحيح را تعيين مي كند، صرفنظر از اينكه بيت فوق چگونه مقدار گرفته
باشد .

عملگرهاي منطقي رفتار بيتي
عملگرهاي منطقي رفتار بيتي شامل &، |،، ^،، ~، هستند. جدول زير حاصل هر يك
از اين عمليات را نشان مي دهد . در بحث بعدي بياد داشته باشيد كه عملگرهاي
رفتار بيتي به بيت هاي منفرد داخل هر عملوند اعمال مي شوند .

A B A|B A&B A^B ~A
0 0 0 0 0 1
1 0 1 0 1 0
0 1 1 0 1 1
1 1 1 1 0 0

NOT

رفتار بيتي
عملگر NOT يكاني يعني ~ كه آن را مكمل رفتار بيتي (bitwise complement) هم
مي نامند ، كليه بيت هاي عملوند خود را تبديل مي كند . بعنوان مثال ، عدد 42
كه مطابق الگوي بيتي زير است : 00101010

پس از اعمال عملگر NOT بصورت زير تبديل مي شود : 11010101

AND
رفتار بيتي
عملگر AND يعني & اگر هر دو عملوند 1 باشند ، يك بيت 1 توليد مي كند . در
كليه شرايط ديگر يك صفر توليد مي شود . مثال زير را نگاه كنيد : 00101010 42
& 00001111 15

00001010 10

OR
رفتار بيتي
عملگر OR يعني | بيت ها را بگونه اي تركيب مي كند كه اگر هر يك از بيت هاي
عملوندها 1 باشد ، آنگاه بيت حاصله نيز 1 خواهد بود . به مثال زير نگاه كنيد : 00102010 42
| 00001111 15

00101111 47

XOR
رفتار بيتي
عملگر XOR يعني ^ بيت ها را بگونه اي تركيب مي كند كه اگر دقيقا" يك عملوند 1
باشد ، حاصل برابر 1 خواهد شد . در غير اينصورت ، حاصل 0 مي شود .
مثال بعدي چگونگي كار اين عملگر را نشان مي دهد . اين مثال همچنين يكي از
خصلتهاي سودمند عملگر XOR را نمايش مي دهد . دقت كنيد كه هر جا عملوند دوم يك
بيت 1 داشته باشد ، چگونه الگوي بيتي عدد 42 تبديل مي شود . هر جا كه عملوند
دوم بيت 0 داشته باشد ، عملوند اول بدون تغيير مي ماند . هنگام انجام برخي از
انواع عملكردهاي بيتي ، اين خصلت بسيار سودمند است . 00101010 42
^ 00001111 15

00100101 37

استفاده از عملگرهاي منطقي رفتار بيتي
برنامه بعدي نشان دهنده عملگرهاي منطقي رفتار بيتي است :

+ // Demonstrate the bitwise logical operators.
+ class BitLogic {
+ public static void main(String args[] ){
+ String binary[] = {
+ "0000"/ "0001"/ "0010"/ "0011"/ "0100"/ "0101"/ "0110"/ "0111"/
+ "1000"/ "1001"/ "1010"/ "1011"/ "1100"/ "1101"/ "1110"/ "1111"
+ };
+ int a = 3; // 0 + 2 + 1 or 0011 in binary
+ int b = 6; // 4 + 2 + 0 or 0110 in binary
+ int c = a | b;
+ int d = a & b;
+ int e = a ^ b;
+ int f =( ~a & b )|( a & ~b);
+ int g = ~a & 0x0f;
+
+ System.out.println(" a = " + binary[a]);
+ System.out.println(" b = " + binary[b]);
+ System.out.println(" a|b = " + binary[c]);
+ System.out.println(" a&b = " + binary[d]);
+ System.out.println(" a^b = " + binary[e]);
+ System.out.println("~a&b|a&~b = " + binary[f]);
+ System.out.println(" ~a = " + binary[g]);
+ }
+ }

در اين مثال ، aو bو الگوهاي بيتي دارند كه كليه چهار احتمال براي ارقام
دو تايي باينري را معرفي مي كنند . 0-0، 0-1،، 1-0،و 1-1و . مي توانيد مشاهده
كنيد چگونه |و &و روي هر يك از بيت ها با توجه به نتايج در cو dو عمل مي كنند.
مقادير نسبت داده شده به eو fو مشابه بوده و نشان دهنده چگونگي كار عملگر ^
مي باشند . آرايه رشته اي با نام binary معرفي ارقام 0 تا 15 را بصورت باينري و
قابل خواندن براي انسان نگهداري مي كند . در اين مثال ، آرايه فوق طوري نمايه
سازي شده تا معرفي باينري هر يك از نتايج را نشان دهد . آرايه طوري ساخته شده
كه معرفي رشته اي صحيح يك مقدار باينري n را در binary[n] ذخيره مي كند . مقدار ~a
بوسيله عملگر ANDبا oxofا( 00001111 باينري ) عمل شده تا مقدار آن را به
كمتر از 16 كاهش دهد تا بتوان با استفاده از آرايه binary از آن چاپ گرفت .
اكنون خروجي اين برنامه بصورت زير مي باشد :

a=1011
b=0110
a^Eb=0111
a&b=0010
a&b=0101
~a&b^Ea&~b=0101
~a=1100

حركت به چپ
كليه بيت هاي موجود در يك مقدار را به تعداد <<عملگر حركت به چپ يعني
دفعات مشخص بطرف چپ منتقل مي كند . شكل كلي آن بقرار زير است :

Value << num

تعداد دفعات مقدار
در ايجا num مشخص كننده تعداد مكانهايي است كه بيت هاي موجود در value بايد
كليه بيت هاي موجود در يك مقدار مشخص را <<به چپ انتقال يابند . بدين ترتيب
بتعداد مكانهايي كه در num مشخص شده بطرف چپ حركت مي دهد . براي هر بار حركت
به چپ ، بيت high-order ( بيش از حد مجاز ) منتقل شده و از دست خواهد رفت و
يك صفر در طرف راست مقدار ، جايگزين مي شود . بدين ترتيب هنگاميكه يك حركت به
چپ روي يك عملوند int عمل مي كند ، بيت هاي گذشته از مكان 31 از دست خواهند
رفت . اگر عملوند يك long باشد، بيت ها پس از گذشتن از مكان 63 از دست ميروند.
هنگاميكه مقادير byteو shortو را انتقال مي دهيد ، ارتقائ خودكار انواع در
جاوا نتايج غير منتظره اي ايجاد مي كند . حتما" مي دانيد كه هنگام ارزشيابي
عبارات ، مقادير byteو shortوبه int ارتقائ مي يابند. بعلاوه جواب چنين عبارتي
از نوع int خواهد بود . بنابراين حاصل يك حركت به چپ روي مقادير byteو shortو
يك int خواهد بود و بيت هاي انتقال يافته به چپ تا زمانيكه از مكان بيت 31
نگذرند ، از دست نمي روند . علاوه براين ، يك مقدار منفي byteو shortو هنگاميكه
به int ارتقائ مي يابد ، بسط علامت پيدا مي كند . بنابراين بيت هاي بيش از حد
مجاز با بيت 1 پر مي شوند . بخاطر اين دلايل ، انجام يك حركت به چپ روي byte و short
مستلزم آن است كه از بايت هاي بيش از حد مجاز در جواب int دست بكشيد .
بعنوان مثال ، اگر يك مقدار byte را حركت به چپ بدهيد ، آن مقدار ابتدا به نوع int
تبديل شده و سپس انتقال خواهد يافت . بايد سه بايت بالايي حاصل را از دست
بدهيد . اگر بخواهيد حاصل يك مقدار byte انتقال يافته را بدست آوريد . بايد سه
بايت بالايي حاصل را از دست بدهيد . آسان ترين روش براي انجام اينكار استفاده
از تبديل cast و تبديل جواب به نوع byte است . مثال بعدي همين مفهوم را براي
شما آشكار مي سازد :

+ // Left shifting a byte value.
+ class ByteShift {
+ public static void main(String args[] ){
+ byte a = 64/ b;
+ int i;
+
+ i = a << 2;
+ b =( byte( )a << 2);
+
+ System.out.println("Original value of a :" + a);
+ System.out.println("i and b :" + i + " " + b);
+ }
+ }

خروجي توليد شده توسط اين برنامه بقرار زير مي باشد :

original value of a:64
i and b :256 0

چون براي اهداف ارزشيابي ، a به نوع int ارتقائ يافته ، دوبار حركت به چپ
مقدار 64 (0000 َ0100) منجر به i مي گردد كه شامل مقدار 256 (0000 َ1 0000)
مي باشد . اما مقدار b دربرگيرنده صفر است زيرا پس از انتقال ، بايت كمتر از
حد مجاز (loworder) اكنون شامل صفر است . تنها بيت دربرگيرنده 1 به بيرون
انتقال يافته است .
از آنجاييكه هر بار حركت به چپ تاثير دو برابر سازي مقدار اصلي را دارد
برنامه نويسان اغلب از اين خاصيت بجاي دو برابر كردن استفاده مي كنند . اما
بايد مراقب باشيد . اگر يك بيت 1 را به مكان بيت بيش از حد مجاز (31 يا 63)
منتقل كنيد ، مقدار فوق منفي خواهد شد . برنامه بعدي همين نكته را نشان ميدهد.

+ // Left shifting as a quick way to multiply by 2.
+ class MultByTwo {
+ public static void main(String args[] ){
+ int i;
+ int num = 0xFFFFFFE;
+
+ for(i=0; i<4; i++ ){
+ num = num << 1;
+ System.out.println(num);
+ }
+ }
+ }

خروجي اين برنامه بقرار زير خواهد بود : 536870908

1073741816
2147483632
- 32

مقدار آغازين را با دقت انتخاب كرده ايم بطوريكه بيت بعد از چهار مكان حركت
بطرف چپ ، مقدار 32- را توليد نمايد . همانطوريكه مي بينيد ، هنگاميكه بيت 1
به بيت 31 منتقل مي شود ، رقم بعنوان منفي تفسير خواهد شد .

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

value >> num

تعداد دفعات مقدار
در اينجا ، num مشخص كننده تعداد مكانهايي است كه بيت هاي value بايد بطرف
كليه بيت هاي يك مقدار مشخص شده را به تعداد >>راست انتقال يابند . يعني
مكانهاي بيتي مشخص شده توسط num بطرف راست انتقال مي دهد .
كد قطعه اي زير مقدار 32 را دو مكان بطرف راست منتقل مي كند و آنگاه جواب
آن در a معادل 8 قرار مي گيرد :

+ int a = 32;
+ a = a >> 2; // a now contains 8

اگر بيت هايي از يك مقدار به بيرون منتقل شوند ، آن بيت ها از دست خواهند
رفت . بعنوان مثال كد قطعه اي بعدي مقدار 35 را دو مكان بطرف راست منتقل نموده
و باعث مي شود تا دو بيت كمتر از حد مجاز از دست رفته و مجددا" جواب آن در a
معادل 8 قرار گيرد .

+ int a = 35;
+ a = a >> 2; // a still contains 8

همين عمليات را در شكل باينري نگاه مي كنيم تا اتفاقي كه مي افتد ، روشن تر
شود : 00100011 35
>> 2
00001000 8

هر بار كه يك مقدار را به طرف راست منتقل مي كنيد ، آن مقدار تقسيم بر دو
مي شود و باقيمانده آن از دست خواهد رفت . مي توانيد از مزاياي اين روش در
تقسيم بر دو اعداد صحيح با عملكرد سطح بالا استفاده نماييد . البته ، بايد مطمئن
شويد كه بيت هاي انتهايي سمت راست را به بيرون منتقل نكنيد .
هنگاميكه حركت بطرف راست را انجام مي دهيد ، بيت هاي بالايي ( از سمت چپ )
در معرض حركت بطرف راست قرار گرفته ، با محتوي قبلي بيت بالايي پر مي شوند .
اين حالت را بسط علامت (sign extension) ناميده و براي محفوظ نگهداشتن علامت
ارقام منفي هنگام حركت بطرف راست استفاده مي شوند. بعنوان مثال 1>>8- معادل 4-
است كه به شكل باينري زير مي باشد : 11111000- 8
>> 1
11111100- 4

جالب است بدانيد كه اگر 1- را بطرف راست حركت دهيد، حاصل آن همواره 1- باقي
مي ماند ، چون بسط علامت ، مراقب آوردن يك بيت ديگر در بيت هاي بيش از حد مجاز
خواهد بود .
گاهي هنگام حركت بطرف راست مقادير ، مايل نيستيم تا بسط علامت اجرا شود .
بعنوان مثال ، برنامه بعدي يك مقدار نوع byte را به معرفي رشته اي در مبناي 16
تبديل مي كند . دقت كنيد كه مقدار منتقل شده با استفاده از عملگر ANDيا oxofا
پوشانده شده تا هر گونه بيت هاي بسط يافته علامت را بدور اندازد بطوريكه مقدار
فوق را بتوان بعنوان يك نمايه به آرايه اي از كاراكترهاي در مبناي 16 استفاده
نمود .

+ // Masking sign extension.
+ class HexByte {
+ static public void main(String args[] ){
+ char hex[] = {
+ '0'/ '1'/ '2'/ '3'/ '4'/ '5'/ '6'/ '7'/
+ '8'/ '9'/ 'a'/ 'b'/ 'c'/ 'd'/ 'e'/ 'f'
+ };
+ byte b =( byte )oxf1
+
+ System.out.println("b = ox" + hex[(b >> 4 )& oxof] + hex[b & oxof]);
+ }
+ }

خروجي اين برنامه بقرار زير مي باشد :

b=oxf1

حركت به راست فاقد علامت
بطور خودكار >>اكنون مي دانيد كه هر بار يك انتقال اتفاق مي افتد ، عملگر
جاي خالي بيت بيش از حد مجاز را با محتوي قبلي اش پر مي كند . اين عمل سبب حفظ
علامت آن مقدار مي گردد . اما گاهي تمايلي براي اينكار نداريم . بعنوان مثال
مي خواهيد چيزي را منتقل كنيد كه معرف يك مقدار عددي نيست . بالطبع نمي خواهيد
عمل بسط علامت انجام گيرد . اين حالت هنگام كار با مقادير براساس پيكسل (pixel)
و گرافيك اغلب وجود دارد . در چنين شرايطي لازم است تا مقدار صفر در بيت بيش از
حد مجاز قرار گيرد ، صرفنظر از اينكه مقدار قبلي در آن بيت چه بوده است . اين
حالت را انتقال فاقد علامت (usigned shift) مي گويند. براي اين منظور، از عملگر
استفاده كنيد كه صفرها را در بيت بيش >>>حركت به راست فاقد علامت در جاوا يعني
از حد مجاز منتقل مي كند .
مي باشد . در اينجا >>>كد قطعه اي زير نشان دهنده عملگر a معادل 1- است كه
كليه 32 بيت را در باينري روي 1 تنظيم مي كند . اين مقدار سپس 24 بيت بطرف
راست انتقال مي يابد، و 24 بيت بالايي را با صفرها پر مي كند و بسط علامت معمولي
را ناديده مي گيرد . بدين ترتيب a معادل 255 مي باشد . + int a =- 1;
+ a = a >>> 24;

اينجا همان عمليات را در شكل باينري مشاهده مي كنيد تا بهتر بفهميد چه
اتفاقي افتاده است : 1
در باينري بعنوان يك int 11111111 11111111 11111111 11111111 >>>24
255
در باينري بعنوان يك int َ11111111 00000000 00000000 00000000
اغلب اوقات آنچنان سودمند كه بنظر مي رسد ، نبوده چون فقط براي >>>عملگر
مقادير 32 بيتي و 64 بيتي معني دارد . بياد آوريد كه مقادير كوچكتر در عبارات
بطور خودكار به int ارتقائ مي يابند . بدين ترتيب بسط علامت اتفاق افتاده و
حركت بجاي مقادير 8 بيتي و 16 بيتي روي مقادير 32 بيتي انجام مي شود . يعني
بايد انتظار يك حركت به راست فاقد علامت روي يك مقدار byte داشته باشيم كه در
بيت 7 ، صفر را قرار مي دهد . اما واقعا" اينطور نيست ، چون در واقع مقدار 32
بيتي است كه منتقل مي شود . برنامه بعدي اين تاثيري را نشان مي دهد .

+ // Unsigned shifting a byte value.
+ class ByteUShift {
+ static public void main(String args[] ){
+ char hex[] = {
+ '0'/ '1'/ '2'/ '3'/ '4'/ '5'/ '6'/ '7'/
+ '8'/ '9'/ 'a'/ 'b'/ 'c'/ 'd'/ 'e'/ 'f'
+ };
+ byte b =( byte )oxf1
+ byte c =( byte( )b >> 4);
+ byte d =( byte( )b >>> 4);
+ byte e =( byte(( )b & oxff )>> 4);
+
+ System.out.println(" b = ox"
+ + hex[(b >> 4 )& oxof] + hex[b & oxof]);
+ System.out.println(" b >> 4 = ox"
+ + hex[(c >> 4 )& oxof] + hex[c & oxof]);
+ System.out.println(" b >>> 4 = ox"
+ + hex[(d >> 4 )& oxof] + hex[d & oxof]);
+ System.out.println("(b & oxof )>> 4 = ox"
+ + hex[(e >> 4 )& oxof] + hex[e & oxof]);
+ }
+ }

چگونه هنگام كار با بايت ها عملي >>>خروجي اين برنامه نشان ميدهد كه عملگر
انجام نمي دهد . متغير b بعنوان يك مقدار byte منفي قراردادي در اين نمايش
تنظيم شده است . سپس مقدار byteدر bر كه چهار مكان بطرف راست انتقال بافته به C
منتسب مي شود كه بخاطر بسط علامت مورد انتظار oxff است . سپس مقدار byteدر bر
كه چهار مكان بطرف راست و فاقد علامت منتقل شده به d منتسب مي شود كه انتظار
داريد oxof باشد ، اما در حقيقت oxff است چون بسط علامت هنگاميكه b به نوع int
قبل از انتقال ارتقائ يافته اتفاق افتاده است . آخرين عبارت ، e را در مقدار byte
متغير b كه با استفاده از عملگر ANDبا 8ا بيت پوشانده شده تنظيم نموده و
سپس چهار مكان بطرف راست منتقل مي كند كه مقدار مورد انتظار oxof را توليد
مي كند . دقت كنيد كه عملگر حركت به راست فاقد علامت براي d استفاده نشد ، چون
حالت بيت علامت بعد از AND شناخته شده است .

b=oxf1
b>>4=oxff
b>>>4=oxff
( b&oxff)>>4=oxof

انتسابهاي عملگر رفتار بيتي
كليه عملگرهاي رفتار بيتي باينري يك شكل مختصر مشابه باعملگرهاي جبري دارند
كه عمل انتساب را با عمليات رفتار بيتي تركيب مي كنند. بعنوان مثال ، دو دستور
بعدي كه مقدار a را چهار بيت به راست حركت مي دهند ، معادل يكديگرند :

+ a = a >> 4;
+ a >>= 4;

بطور مشابه ، دو دستور زير كه a را به عبارت روش بيتي aoRb منتسب مي كنند
معادل يكديگرند :

+ a = a | b;
+ a |= b;

برنامه بعدي تعدادي از متغيرهاي عدد صحيح را بوجود آورده آنگاه از شكل
مختصر انتسابهاي عملگر رفتار بيتي براي كار كردن بااين متغيرها استفاده ميكند:

+ class OpBitEquals {
+ public static void main(String args[] ){
+ int a = 1;
+ int b = 2;
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
بنيادهاي كلاس java | java
دستورات انتخاب در جاوا | java
استفاده از پرانتزها | java
عملگر ? | java
عملگر انتساب The Assignment Operator | java
عملگرهاي منطقي بولي Boolean | java
عملگرهاي رابطه اي | java
عملگرها ی ریاضی و بیتی | java
اولين برنامه ساده java | java
آرايه ها در جاوا | java
متغيرها و اعمال روی آنها | java
انواع اعداد اعشاري جاوا | java
آموزش جاوا - integers ( اعداد صحيح ) | java
جاوا را بشناسیم | java

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


عملگرهاي رابطه اي
اين عملگرها تعيين كننده رابطه ها بين يك عملوند با عملوند ديگر هستند. بطور
مشخص ، آنها تساوي يا ترتيب بندي (ordering) را معين ميكنند. عملگرهاي رابطه اي
را در زير نشان داده ايم :
نتيجه آن عملگر

مساوي با ==
نامساوي با !=
>بزرگتر از
<كوچكتر از
بزرگتر از يا مساوي با = >
كوچكتر از يا مساوي با = <

حاصل اين عمليات يك مقدار boolean است . از عملگرهاي رابطه اي بخصوص در
عباراتي كه دستور if و انواع دستورات حلقه اي را كنترل مي كنند ، زياد استفاده
مي شوند .
هر نوعي در جاوا شامل اعداد صحيح ، ارقام اعشاري ، كاراكترها و عبارات بولي
را مي توان بوسيله آزمون تساوي == و آزمون عدم تساوي != مقايسه نمود . دقت
نماييد كه در جاوا ( نظير Cو C++و ) تساوي توسط دو علامت تساوي و نه يك علامت
نشان داده مي شود . ( بياد آوريد كه علامت تكي تساوي يك عملگر انتساب است . )
عملگرهاي ترتيب بندي فقط براي مقايسه انواع عددي بكار مي روند . يعني فقط
عملوندهاي اعداد صحيح ، اعداد اعشاري و كاراكترها را مي توان مقايسه نمود و
و تعيين كرد كه كداميك از ديگري بزرگتر يا كوچكتر است .
گفتيم كه نتيجه توليد شده توسط يك عملگر رابطه اي ، يك مقدار boolean است .
بعنوان مثال ، كد قطعه اي زير كاملا" معتبر است :

+ int a = 4;
+ int b = 1;
+ boolean c = a < b;

در اين حالت ، جواب b اگر سابق برنامه نويسي C++/C داريد ، به نكته زير توجه نماييد . در C++/C
اين نوع از دستورات بسيار رايج است .

+ int done;
+ //...
+ if(!done ... )// Valid in C/C++
+ if(done ... )// but not in Java.

در جاوا ، آن دستورات بايد بصورت زير دوباره نويسي شوند :

+ if(done == 0 ... )// This is Java-style.
+ if(done != 0... )

علت آن است كه در جاوا صحيح و ناصحيح (true and false) مشابه C++/C تعريف
نشده است . در C++/C صحيح هر مقدار غير صفر و ناصحيح معادل صفر است . در جاوا true
و falseو مقادير غيرعادي هستند كه ربطي با صفر يا غيرصفر ندارند. بنابراين
براي آزمون صفر و غير صفر، بايد بطور صريح يك يا چند عملگر رابطه اي را استخدام
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
بنيادهاي كلاس java | java
دستورات انتخاب در جاوا | java
استفاده از پرانتزها | java
عملگر ? | java
عملگر انتساب The Assignment Operator | java
عملگرهاي منطقي بولي Boolean | java
عملگرهاي رابطه اي | java
عملگرها ی ریاضی و بیتی | java
اولين برنامه ساده java | java
آرايه ها در جاوا | java
متغيرها و اعمال روی آنها | java
انواع اعداد اعشاري جاوا | java
آموزش جاوا - integers ( اعداد صحيح ) | java
جاوا را بشناسیم | java

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


عملگرهاي منطقي بولي Boolean
عملگرهاي منطقي بولي كه در زير نشان داده ايم فقط روي عملوندهاي بولي عمل مي كنند . كليه عملگرهاي منطقي باينري دو مقدار boolean را تركيب مي كنند تا يك مقدار منتج boolean ايجاد نمايند .
نتيجه آن عملگر
AND
منطقي & OR
منطقي | XOR
منطقي ( خارج ) ^ OR
مدار كوتاه || AND
مدار كوتاه && NOT
يكاني منطقي !
انتساب AND &=
انتساب OR |=
انتساب XOR ^=
مساوي با ==
نامساوي با !=
سه تايي if-tethen-eselse :?
عملگرهاي بولي منطقي &، |،، ^، روي مقادير Boolean همانطوري كه روي بيت هاي
يك عدد صحيح رفتار مي كنند ، عمل خواهند كرد . عملگر منطقي ! حالت بولي را
معكوس مي كند :

!false=true t!true=false

جدول بعدي تاثيرات هر يك از عمليات منطقي را نشان مي دهد :

A B A|B A&B A^B !A
False False False False False True
True False True False True False
False True True False True True
True True True True False False

در زير برنامه اي را مشاهده مي كنيد كه تقريبا" با مثال Bitlogic قبلي برابر
است ، اما در اينجا بجاي بيت هاي باينري روي مقادير منطقي بولي عمل مي كند :

+ // Demonstrate the boolean logical operators.
+ class BoolLogic {
+ public static void main(String args[] ){
+ boolean a = true;
+ boolean b = false;
+ boolean c = a | b;
+ boolean d = a & b;
+ boolean e = a ^ b;
+ boolean f =( !a & b )|( a & !b);
+ boolean g = !a;
+ System.out.println(" a = " + a);
+ System.out.println(" b = " + b);
+ System.out.println(" a|b = " + c);
+ System.out.println(" a&b = " + d);
+ System.out.println(" a^b = " + e);
+ System.out.println("!a&b|a&!b = " + f);
+ System.out.println(" !a = " + g);
+ }
+ }

پس از اجراي اين برنامه ، شما همان قوانين منطقي كه براي بيت ها صادق بود
در مورد مقادير boolean مشاهده مي كنيد . در خروجي اين برنامه مشاهده مي كنيد
كه معرفي رشته اي يك مقدار بولي درجاوا يكي از مقادير لفظي trueيا falseا است .

a = true
b = false
a|b = true
a&b = false
a^b = true
!a&b|a&!b = true
!a = false

عملگرهاي منطقي مدار كوتاه
جاوا دو عملگر بولي بسيار جالب دارد كه در اكثر زبانهاي ديگر برنامه نويسي
وجود ندارند . اين ها روايت ثانويه عملگرهاي ANDو ORو بولي هستند و بعنوان
عملگرهاي منطقي مدار كوتاه معرفي شده اند. در جدول قبلي مي بينيد كه عملگر OR
هرگاه كه A معادل true باشد، منجر به true مي شود، صرفنظر از اينكه B چه باشد.
بطور مشابه ، عملگر AND هرگاه A معادل false باشد منجر به false مي شود. صرفنظر
از اينكه B چه باشد . اگر از اشكال ||و &&و بجاي |و &و استفاده كنيد، هنگاميكه
حاصل يك عبارت مي تواند توسط عملوند چپ بتنهايي تعيين شود ، جاوا ديگر به
ارزيابي عملوند راست نخواهد پرداخت . اين حالت بسيار سودمند است بخصوص وقتي كه
عملوند سمت راست بستگي به عملوند سمت چپ و trueيا falseا بودن آن براي درست
عمل كردن داشته باشد . بعنوان مثال ، كد قطعه اي زير به شما نشان مي دهد چگونه
مي توانيد مزاياي ارزيابي منطقي مدار كوتاه را استفاده نموده تا مطمئن شويد
كه عمليات تقسيم قبل از ارزيابي آن معتبر است .

+ if(denom != 0 && num / denom > 10)

از آنجاييكه شكل مدار كوتاه AND يعني && استفاده شده است ، هنگاميكه denom
صفر باشد ، خطر ايجاد يك استثنائ حين اجرا منتفي است . اگر همين خط از كد را
با استفاده از رايت تكي AND يعني & بنويسيم ، هر دو عملوند بايد مورد ارزيابي
قرار گيرند و هنگاميكه denom صفر باشد يك استثنائ حين اجرا بوجود مي آيد .
در حالتهايي كه شامل منطق بولي باشند : استفاده از ارزيابيهاي مدار كوتاه AND
و ORو يك روش استاندارد است كه روايتهاي تك كاراكتري عملگرها را منحصرا"
براي عمليات رفتار بيتي قرار مي دهد . اما استثنائاتي بر اين قوانين وجود
دارند . بعنوان مثال ، دستور زير را در نظر بگيريد :

+ if(c==1 & e++ < 100 )d = 100;
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
بنيادهاي كلاس java | java
دستورات انتخاب در جاوا | java
استفاده از پرانتزها | java
عملگر ? | java
عملگر انتساب The Assignment Operator | java
عملگرهاي منطقي بولي Boolean | java
عملگرهاي رابطه اي | java
عملگرها ی ریاضی و بیتی | java
اولين برنامه ساده java | java
آرايه ها در جاوا | java
متغيرها و اعمال روی آنها | java
انواع اعداد اعشاري جاوا | java
آموزش جاوا - integers ( اعداد صحيح ) | java
جاوا را بشناسیم | java

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


عملگر انتساب The Assignment Operator
عملگر انتساب علامت تكي تساوي = مي باشد . عملگر انتساب در جاوا مشابه ساير زبانهاي برنامه نويسي كار مي كند . شكل كلي آن بصورت زير است :

Var = expression;

عبارت متغير
در اينجا نوع var ( متغير ) بايد با نوع experssion ( عبارت ) سازگار باشد.
عملگر انتساب يك خصلت جالب دارد كه ممكن است با آن آشنايي نداشته باشيد :
به شما امكان مي دهد تا زنجيره اي از انتسابها بوجود آوريد . بعنوان مثال ، اين قطعه از يك برنامه را در نظر بگيريد :

+ int x/ y/ z;
+
+ x = y = z = 100; // set x/ y/ and z to 100

اين قطعه از برنامه مقدار 100 را با استفاده از يك دستور در متغيرهاي x، y، و z قرار مي دهد . زيرا = عملگري است كه مقدار عبارت سمت راست را جذب مي كند .
بنابراين مقدار Z=100 برابر 100 است كه اين مقدار به y منتسب شده و نيز به x منتسب خواهد شد . استفاده از " زنجيره اي از انتسابها " يك راه آسان براي قرار ادن يك مقدار مشترك در گروهي از متغيرهاست .
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
بنيادهاي كلاس java | java
دستورات انتخاب در جاوا | java
استفاده از پرانتزها | java
عملگر ? | java
عملگر انتساب The Assignment Operator | java
عملگرهاي منطقي بولي Boolean | java
عملگرهاي رابطه اي | java
عملگرها ی ریاضی و بیتی | java
اولين برنامه ساده java | java
آرايه ها در جاوا | java
متغيرها و اعمال روی آنها | java
انواع اعداد اعشاري جاوا | java
آموزش جاوا - integers ( اعداد صحيح ) | java
جاوا را بشناسیم | java

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


عملگر ?
جاوا شامل يك عملگر سه تايي ويژه است كه مي تواند جايگزين انواع مشخصي از دستورات if-then-else باشد. اين عملگر علامت ? است و نحوه كار آن در جاوا مشابه با Cو C++و است . ابتدا كمي گيج كننده است ، اما مي توان از ? براحتي و با كارايي استفاده نمود شكل كلي اين عملگر بصورت زير است :

experssion 1? experssion2 :experssion3

در اينجا experssion1 مي تواند هر عبارتي باشد كه با يك مقدار بولي سنجيده مي شود . اگر experssion1 صحيح true باشد ، آنگاه experssion2 سنجيده مي شود در غير اينصورت experssion3 ارزيابي خواهد شد . نتيجه عمليات ? همان عبارت ارزيابي شده است . هر دو عبارت experssion2و experssion3و بايد از يك نوع باشند كه البته void نمي تواند باشد . در اينجا مثالي براي استفاده از عملگر ? مشاهده مي كنيد :

+ ratio = denom == 0 ? 0 : num / denom;

هنگاميكه جاوا اين عبارت انتساب را ارزيابي مي كند ، ابتدا به عبارتي كه
سمت چپ علامت سئوال قرار دارد ، نگاه مي كند. اگر denom مساوي صفر باشد ، آنگاه
عبارت بين علامت سئوال و علامت (colon) ارزيابي شده و بعنوان مقدار كل عبارت ?
استفاده مي شود . اگر denom مساوي صفر نباشد ، آنگاه عبارت بعد از (colon)
ارزيابي شده و براي مقدار كل عبارت ? استفاده مي شود . نتيجه توليد شده توسط
عملگر ? سپس به ratio نسبت داده مي شود .
در زير برنامه اي مشاهده مي كنيد كه عملگر ? را نشان مي دهد . اين برنامه از
عملگر فوق براي نگهداري مقدار مطلق يك متغير استفاده مي كند .

+ // Demonstrate ?.
+ class Ternary {
+ public static void main(String args[] ){
+ int i/ k;
+
+ i = 10;
+ k = i < 0 ?- i : i; // get absolute value of i
+ System.out.print("Absolute value of ");
+ System.out.println(i + " is " + k);
+ }
+ }

خروجي اين برنامه بصورت زير مي باشد :

Absolute value of 10 is 10
Absolute value of- 10 is 10

حق تقدم عملگر
جدول زير ترتيب حق تقدم عملگرهاي جاوا را از بالاترين اولويت تا پايين ترين
نشان مي دهد . دقت كنيد كه در سطر اول اقلامي وجود دارد كه معمولا" بعنوان عملگر
درباره آنها فكر نمي كنيد : پرانتزها ، كروشه ها و عملگر نقطه .

Highest
)( [].
++ -- ~ !
* / %
+-
>> >>> <<
> >= < <=
== !=
&
^
|
&&
||
?:
= op=
Lowest

از پرانتزها براي تغيير حق تقدم يك عمليات استفاده مي شود . قبلا" خوانده ايد
كه كروشه هاي دوتايي نمايه سازي آرايه ها را فراهم مي سازند
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
بنيادهاي كلاس java | java
دستورات انتخاب در جاوا | java
استفاده از پرانتزها | java
عملگر ? | java
عملگر انتساب The Assignment Operator | java
عملگرهاي منطقي بولي Boolean | java
عملگرهاي رابطه اي | java
عملگرها ی ریاضی و بیتی | java
اولين برنامه ساده java | java
آرايه ها در جاوا | java
متغيرها و اعمال روی آنها | java
انواع اعداد اعشاري جاوا | java
آموزش جاوا - integers ( اعداد صحيح ) | java
جاوا را بشناسیم | java

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


استفاده از پرانتزها
پرانتزها حق تقدم عملياتي را كه دربرگرفته اند ، افزايش مي دهند . اينكار اغلب براي نگهداري نتيجه دلخواهتان ضروري است . بعنوان مثال ، عبارت زير را در نظر بگيريد :

+ a >> b + 3

اين عبارت ابتدا 3 را به b اضافه نموده و سپس a را مطابق آن نتيجه بطرف راست حركت مي دهد. اين عبارت را مي توان با استفاده از پرانتزهاي اضافي بصورت زير دوباره نويسي نمود :

+ a >>( b + 3)

اما ، اگر بخواهيد ابتدا a را با مكانهاي b بطرف راست حركت داده و سپس 3 را به نتيجه آن اضافه كنيد ، بايد عبارت را بصورت زير در پرانتز قرار دهيد : +( a >> b )+ 3 علاوه بر تغيير حق تقدم عادي يك عملگر ، پرانتزها را مي توان گاهي براي روشن نمودن مفهوم يك عبارت نيز بكار برد . براي هر كسي كه كد شما را مي خواند، درك يك عبارت پيچيده بسيار مشكل است . اضافه نمودن پرانتزهاي اضافي و روشنگر به عبارات پيچيده مي تواند از ابهامات بعدي جلوگيري نمايد. بعنوان مثال ، كداميك از عبارات زير راحت تر خوانده و درك مي شوند ؟

+ a | 4 + c >> b & 7 || b > a % 3
+( a |((( 4 + c )>> b )& 7 ))||( b >( a % 3))

يك نكته ديگر : پرانتزها ( بطور كلي خواه اضافي باشند يا نه ) سطح عملكرد برنامه شما را كاهش نمي دهند. بنابراين ، اضافه كردن پرانتزها براي كاهش ابهام نفي روي برنامه شما نخواهد داشت .
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
بنيادهاي كلاس java | java
دستورات انتخاب در جاوا | java
استفاده از پرانتزها | java
عملگر ? | java
عملگر انتساب The Assignment Operator | java
عملگرهاي منطقي بولي Boolean | java
عملگرهاي رابطه اي | java
عملگرها ی ریاضی و بیتی | java
اولين برنامه ساده java | java
آرايه ها در جاوا | java
متغيرها و اعمال روی آنها | java
انواع اعداد اعشاري جاوا | java
آموزش جاوا - integers ( اعداد صحيح ) | java
جاوا را بشناسیم | java

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


دستورات انتخاب در جاوا

جاوا از دو دستور انتخاب پشتيباني مي كنند : ifو switchو . با اين دستورات شما اجراي برنامه را براساس شرايطي كه فقط حين اجراي برنامه اتفاق مي افتند كنترل مي كنيد. اگر سابقه برنامه نويسي با C++/C را نداريد، از قدرت و انعطاف پذيري موجود در اين دو دستور متعجب و شگفت زده خواهيد شد .

if

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

if( condition )statement 1;
else statement 2;

دراينجا هر statement ممكن است يك دستور منفرد يا يك دستور مركب قرار گرفته
در ابروها ( يعني يك بلوك ) باشد . condition ( شرط ) هر عبارتي است كه يك
مقدار boolean را برمي گرداند . جمله else اختياري است . if
بصورت زير كار مي كند : اگر شرايط محقق باشد ، آنگاه statement 1 اجرا
مي شود . در غير اينصورت statement 2 ( در صورت وجود ) اجرا خواهد شد .
تحت هيچ شرايطي هر دو دستور با هم اجرا نخواهند شد . بعنوان مثال ، در نظر
بگيريد :

+ int a/ b;
+ //...
+ if(a < b )a = 0;
+ else b = 0;

در اينجا اگر a كوچكتر از b باشد ، آنگاه a برابر صفر مي شود . در غير
اينصورت b برابر صفر قرار مي گيرد . در هيچ شرايطي اين دو متغير در آن واحد
برابر صفر نمي شوند .
غالب اوقات ، عبارتي كه براي كنترل if استفاده ميشود شامل عملگرهاي رابطه اي
است . اما از نظر تكنيكي ضرورتي وجود ندارد . مي توان با استفاده از يك متغير boolean
تكي ، if را همانطوريكه در بخش زير مشاهده مي كنيد ، كنترل نمود .

+ boolean dataAvailable;
+ //...
+ if( dataAvailable)
+ ProcessData)(;
+ else
+ waitForMoreData)(;

بياد آوريد كه فقط يك دستور مي تواند مستقيما" بعداز ifيا elseا قرار گيرد.
اگر بخواهيد دستورات بيشتري داخل نماييد ، نيازي به ايجاد يك بلوك نداريد
نظير اين قطعه كه در زير آمده است :

+ int bytesAvailable;
+ //...
+ if( bytesAvailable > 0 ){
+ ProcessData)(;
+ bytesAvailable- = n;
+ } else
+ waitForMoreData)(;

در اينجا ، هر دو دستور داخل بلوك if اجرا خواهند شد اگر bytes Available
بزرگتر از صفر باشد .
برخي از برنامه نويسان راحت ترند تا هنگام استفاده از if ، از ابروهاي باز
و بسته استفاده نمايند، حتي زمانيكه فقط يك دستور در هر جمله وجود داشته باشد.
اين امر سبب مي شود تا بعدا" بتوان براحتي دستور ديگري را اضافه نمود و نگراني
از فراموش كردن ابروها نخواهيد داشت . در حقيقت ، فراموش كردن تعريف يك بلوك
هنگامي كه نياز است ، يكي از دلايل رايج بروز خطاها مي باشد . بعنوان مثال قطعه
زير از يك كد را در نظر بگيريد :

+ int bytesAvailable;
+ //...
+ if( bytesAvailable > 0 ){
+ ProcessData)(;
+ bytesAvailable- = n;
+ } else
+ waitForMoreData)(;
+ bytesAvailable = n;

بنظر خيلي روشن است كه دستور bytes Available=n طوري طراحي شده تا داخل جمله else اجرا گردد ، و اين بخاطر سطح طراحي آن است . اما حتما" بياد داريد كه فضاي خالي براي جاوا اهميتي ندارد و راهي وجود ندارد كه كامپايلر بفهمد چه مقصودي وجود دارد . اين كد بدون مشكل كامپايل خواهد شد ، اما هنگام اجرا بطور ناصحيح اجرا خواهد شد . مثال بعدي داخل كدي كه مشاهده مي كنيد تثبيت شده است :

+ int bytesAvailable;
+ //...
+ if( bytesAvailable > 0 ){
+ ProcessData)(;
+ bytesAvailable- = n;
+ } else {
+ waitForMoreData)(;
+ bytesAvailable = n;
+ }
if

Nested ifs هاي تودرتو شده
يك nested if يك دستور if است كه هدف ifيا elseا ديگري باشد. if هاي تودرتو
در برنامه نويسي بسيار رايج هستند. هنگاميكه if ها را تودرتو مي كنيد، مهمترين
چيزي كه بايد بخاطر بسپاريد اين است كه يك دستورelse هميشه به نزديكترين دستور if
خود كه داخل همان بلوك else است و قبلا" با يك else همراه نشده ، مراجعه
خواهد نمود . مثالي را مشاهده نماييد :

+ if(i == 10 ){
+ if(j < 20 )a = b;
+ if(k > 100 )c = d; // this if is
+ else a = c; // associated with this else
+ }
+ else a = d; // this else refers to if(i == 10)

همانگونه كه توضيحات نشان مي دهند ، else نهايي با (20
چون داخل همان بلوك قرار ندارد ( اگر چه نزديكترين if بدون else است ) . بجاي
آن ، else نهايي با (i==10)if همراه مي شود . else داخلي به (100>k)if ارجاع
مي كند ، زيرا نزديكترين if در داخل همان بلوك است .

نردبان if-else-if
يك ساختار برنامه نويسي رايج براساس يك ترتيب از ifهاي تودرتو شده يا نردبان if-else-if
است . اين ساختار بصورت زير است :

if(condition)
statement;
else if(condition)

statement;
else if(condition)
statement;
.
.
.
else
statement;

دستورات if از بالا به پايين اجرا مي شوند . ماداميكه يكي از شرايط كنترل
كننده if صحيح باشد (true)، دستور همراه با آن if اجرا مي شود ، و بقيه نردبان
رد خواهد شد . اگر هيچكدام از شرايط صحيح نباشند، آنگاه دستور else نهايي اجرا
خواهد شد . else نهايي بعنوان شرط پيش فرض عمل مي كند ، يعني اگر كليه شرايط
ديگر صحيح نباشند ، آنگاه آخرين دستور else انجام خواهد شد . اگر else نهايي
وجود نداشته باشد و ساير شرايط ناصحيح باشند ، آنگاه هيچ عملي انجام نخواهد
گرفت .
در زير ، برنامه اي را مشاهده مي كنيد كه از نردبان if-else-if استفاده كرده
تا تعيين كند كه يك ماه مشخص در كدام فصل واقع شده است .

+ // Demonstrate if-else-if statement.
+ class IfElse {
+ public static void main(String args[] ){
+ int month = 4; // April
+ String season;
+
+ if(month == 12 || month == 1 || month == 2)
+ season = "Winter";
+ else if(month == 3 || month == 4 || month == 5)
+ season = "Spring";
+ else if(month == 6 || month == 7 || month == 8)
+ season = "Summer";
+ else if(month == 9 || month == 10 || month == 11)
+ season = "Autumn";
+ else
+ season = "Bogus Month";
+
+ System.out.println("April is in the" + season + ".");
+ }
+ }

خروجي اين برنامه بقرار زير مي باشد :

April is in the Spring.

ممكن است بخواهيد اين برنامه را تجربه نماييد . خواهيد ديد كه هيچ فرقي
ندارد كه چه مقداري به month بدهيد ، يك و فقط يك دستور انتساب داخل نردبان
اجرا خواهد شد .

switch

دستور switch ، دستور انشعاب چند راهه در جاوا است . اين دستور راه ساده اي
است براي تغيير مسير اجراي بخشهاي مختلف يك كد براساس مقدار يك عبارت . اين
روش يك جايگزين مناسب تر براي مجموعه هاي بزرگتر از دستورات if-else-if است .
شكل كلي دستور switch بقرار زير مي باشد :

switch(expression){
case value1:
// statement sequence
break;
case value2:
// statement sequence
break;
.
.
.
case valueN:
// statement sequence
break;
default:
// default statement sequence
}
expression

مي تواند هر نوع ساده اي را برگرداند ، هر يك از مقادير (values)
در دستورات case بايد از نوع سازگار با عبارت باشند . هر يك از مقادير case
بايد يك مقدار لفظي منحصر بفرد باشد ( يعني بايد يك ثابت ، نه متغير ، باشد ).
دو برابر سازي مقادير case مجاز نيست .
دستور switch بشرح فوق عمل مي كند : مقدار عبارت با هر يك از مقادير لفظي
در دستورات case مقايسه مي شوند. اگر تطابق پيدا شود ، كد سلسله اي تعقيب كننده
آن دستور case اجرا خواهد شد . اگر هيچيك از ثابت ها با مقدار عبارت تطابق
نيابند ، آنگاه دستور پيش فرض (default) اجرا خواهد شد ، اما دستور default
اختياري است . اگر هيچيك از case ها تطابق نيابد و default وجود نداشته باشد
آنگاه عمل اضافي ديگري انجام نخواهد شد .
از دستور break داخل دستور switch استفاده شده تا سلسله يك دستور را پايان
دهد . هنگاميكه با يك دستور break مواجه مي شويم ، اجرا به خط اول برنامه كه
بعد از كل دستور switch قرار گرفته ، منشعب خواهد شد . اين حالت تاثير پريدن switch
است .
در زير مثال ساده اي را مشاهده مي كنيد كه از دستور switch استفاده نموده
است :

+ // A simple example of the switch.
+ class SampleSwitch {
+ public static void main(String args[] ){
+ for(int i=0; i<6; i++)
+ switch(i ){
+ case 0:
+ System.out.println("i is zero.");
+ break;
+ case 1:
+ System.out.println("i is one.");
+ break;
+ case 2:
+ System.out.println("i is two.");
+ break;
+ case 3:
+ System.out.println("i is three.");
+ break;
+ default:
+ System.out.println("i is greater then 3.");
+ }
+ }
+ }

خروجي اين برنامه بقرار زير مي باشد :

i is zero.
i is one.
i is two.
i is three.
i is greater than 3.
i is greater than 3.

همانطوريكه مشاهده مي كنيد ، داخل حلقه ، دستوراتي كه همراه ثابت case بوده
و با i مطابقت داشته باشند ، اجرا خواهند شد . ساير دستورات پشت سر گذاشته
مي شوند (bypassed) . بعد از اينكه i بزرگتر از 3 بشود ، هيچ دستور همراه case
مطابقت نداشته ، بنابراين دستور پيش فرض (default) اجرا خواهد شد .
دستور break اختياري است . اگر break را حذف كنيد ، اجراي برنامه با case
بعدي ادامه خواهد يافت . گاهي بهتر است چندين case بدون دستورات break در بين
آنها داشته باشيم . بعنوان مثال ، برنامه بعدي را در نظر بگيريد :

+ // In a switch/ break statements are optional.
+ class MissingBreak {
+ public static void main(String args[] ){
+ for(int i=0; i<12; i++)
+ switch(i ){
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ System.out.println("i is less than 5");
+ break;
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ case 9:
+ System.out.println("i is less than 10");
+ break;
+ default:
+ System.out.println("i is 10 or more");
+ }
+ }
+ }

خروجي اين برنامه بقرار زير خواهد بود :

i is less than 5
i is less than 5
i is less than 5
i is less than 5
i is less than 5
i is less than 10
i is less than 10
i is less than 10
i is less than 10
i is less than 10
i is 10 or more
i is 10 or more

همانطوريكه مشاهده مي كنيد، اجرا طي هر case، بمحض رسيدن به يك دستور break
( يا انتهاي switch ) متوقف مي شود .
در حاليكه مثال قبلي براي توصيف نظر خاصي طراحي شده بود ، اما بهر حال حذف
دستور break كاربردهاي عملي زيادي در برنامه هاي واقعي دارد . براي نشان دادن
كاربردهاي واقعي تر اين موضوع ، دوباره نويسي برنامه نمونه مربوط به فصول سال
را مشاهده نماييد . اين روايت جديد همان برنامه قبلي از switch استفاده مي كند
تا پياده سازي موثرتري را ارائه دهد .

+ // An improved version of the season program.
+ class Switch {
+ public static void main(String args[] ){
+ int month = 4;
+ String season;
+ switch( month ){
+ case 12:
+ case 1:
+ case 2:
+ season = "Winter";
+ break;
+ case 3:
+ case 4:
+ case 5:
+ season = "Spring";
+ break;
+ case 6:
+ case 7:
+ case 8:
+ season = "Summer";
+ break;
+ case 9:
+ case 10:
+ case 11:
+ season = "Autumn";
+ break;
+ default:
+ season = "Bogus Month";
+ }
+ System.out.println("April is in the" + season + ".");
+
+ }
+ }

تودرتو كردن دستورات switch
مي توانيد از يك switch بعنوان بخشي از ترتيب يك دستور switch خارجي تر
استفاده نماييد. اين حالت را switch تودرتو مينامند. از آنجاييكه دستور switch
تعريف كننده بلوك مربوط به خودش مي باشد، هيچ تلاقي بين ثابتهاي caseدر switchر
داخلي و آنهايي كه در switch خارجي قرار گرفته اند ، بوجود نخواهد آمد . بعنوان
مثال ، قطعه بعدي كاملا" معتبر است .

+ switch(count ){
+ case 1:
+ switch(target ){ // nested switch
+ case 0:
+ System.out.println("target is zero");
+ break;
+ case 1 :// no conflicts with outer switch
+ System.out.println("target is one");
+ break;
+ }
+ break;
+ case 2 ://...

در اينجا دستور :case 1در switchر داخلي با دستور :case 1در switchر خارجي
تلاقي نخواهد داشت . متغير count فقط با فهرست case ها در سطح خارجي مقايسه
مي شود. اگر count برابر 1 باشد، آنگاه target با فهرست case هاي داخلي مقايسه
خواهد شد .
بطور خلاصه ، سه جنبه مهم از دستور switch قابل توجه هستند :
ؤ switchبا ifا متفاوت است چون switch فقط آزمايش كيفيت انجام مي دهد ، در
حاليكه if هر نوع عبارت بولي را ارزيابي مي كند . يعني كه switch فقط بدنبال
يك تطابق بين مقدار عبارت و يكي از ثابت هاي case خودش مي گردد .
ؤ دو ثابت caseدر switchر مشابه نمي توانند مقادير يكسان داشته باشند .
البته ، يك دستور switch قرار گرفته داخل يك switch خارجي تر مي تواند ثابتهاي case
مشترك داشته باشد .
ؤ يك دستور switch معمولا" بسيار كاراتر از يك مجموعه از if هاي تودرتو شده
است . آخرين نكته بخصوص جالب توجه است زيرا روشنگر نحوه كار كامپايلر جاوا
مي باشد . كامپايلر جاوا هنگاميكه يك دستور switch را كامپايل مي كند ، به هر
يك از ثابتهاي case سركشي نموده و يك جدول jump table مي سازد كه براي انتخاب
مسير اجرا براساس مقدار موجود در عبارت استفاده مي شود . بنابراين ، اگر بايد
از ميان گروه بزرگي از مقادير انتخاب نماييد ، يك دستور switch نسبت به يك
ترتيب از if-else ها كه بطور معادل و منطقي كد بندي شده باشد ، بسيار سريعتر
اجرا خواهد شد. كامپايلر قادر است اينكار را انجام دهد چون مي داند كه ثابتهاي case
همه از يك نوع بوده و بايد خيلي ساده با عبارت switch براي كيفيت مقايسه
شوند . كامپايلر چنين شناسايي را نسبت به يك فهرست طولاني از عبارات if ندارد .

دستورات تكرار iteration statements
دستورات تكرار در جاوا عبارتند از for، while،و do-whileو . اين دستورات آن
چه را ما " حلقه " مي ناميم ، ايجاد مي كنند . احتمالا" مي دانيد كه حلقه يك
مجموعه از دستورالعملها را بطور تكراري اجرا مي كند . تا اينكه يك شرط پاياني
را ملاقات نمايد . همانطوريكه بعدا" خواهيد ديد، جاوا حلقه اي دارد كه براي كليه
نيازهاي برنامه نويسي مناسب است .

while

حلقه while اساسي ترين دستور حلقه سازي (looping) در جاوا است . اين دستور
ماداميكه عبارت كنترل كننده ، صحيح (true) باشد، يك دستور يا يك بلوك را تكرار
مي كند . شكل كلي اين دستور بقرار زير است :

while(condition ){
// body of loop
}

شرط يا condition ممكن است هر عبارت بولي باشد . ماداميكه عبارت شرطي صحت
داشته باشد ، بدنه حلقه اجرا خواهد شد . هنگاميكه شرط صحت نداشته باشد ، كنترل
بلافاصله به خط بعدي كدي كه بلافاصله پس از حلقه جاري قرار دارد ، منتقل خواهد
شد . اگر فقط يك دستور منفرد در حال تكرار باشد ، استفاده از ابروها غير ضروري
است .
در اينجا يك حلقه while وجود دارد كه تا 10 را محاسبه كرده و دقيقا" ده خط "tick"
را چاپ مي كند .

+ // Demonstrate the while loop.
+ class While {
+ public static void main(String args[] ){
+ int n = 10;
+
+ while(n > 0 ){
+ System.out.println("tick" + n);
+ n--;
+ }
+ }
+ }

هنگاميكه اين برنامه را اجرا مي كنيد، ده مرتبه "tick" را انجام خواهد داد:

tick 10
tick 9
tick 8
tick 7
tick 6
tick 5
tick 4
tick 3
tick 2
tick 1

از آنجاييكه حلقه while عبارت شرطي خود را در بالاي حلقه ارزيابي ميكند، اگر
شرط ابتدايي ناصحيح باشد ، بدنه حلقه اجرا نخواهد شد . بعنوان مثال ، در قطعه
زير ، فراخواني ()println هرگز اجرا نخواهد شد .

+ int a = 10/ b = 20;
+
+ while(a < b)
+ System.out.println("This will not be displayed");

بدنه while يا هر حلقه ديگر در جاوا ) ممكن است تهي باشد. زيرا دستور تهي دستوري كه فقط شامل ; باشد ) از نظر قواعد تركيبي در جاوا معتبراست . بعنوان مثال ، برنامه زير را در نظر بگيريد :

+ // The target of a loop can be empty.
+ class NoBody {
+ public static void main(String args[] ){
+ int i/ j;
+
+ i = 100;
+ j = 200;
+
+ // find midpoint between i and j
+ while(++i <-- j); // no body in this loop
+
+ System.out.println("Midpoint is" + i);
+ }
+ }

اين برنامه نقطه مياني (midpoint) بين iو jو را پيدا مي كند و خروجي زير را
توليد خواهد كرد :

Midpoint is 150

در اينجا چگونگي كار حلقه while را مي بينيد . مقدار i افزايش و مقدار j
كاهش مي يابد . سپس اين دو مقدار با يكديگر مقايسه مي شوند . اگر مقدار جديد i
همچنان كمتر از مقدار جديد j باشد ، آنگاه حلقه تكرار خواهد شد . اگر i مساوي
با يا بزرگتر از j بشود ، حلقه متوقف خواهد شد . تا هنگام خروج از حلقه ، i
مقداري را مي گيرد كه بين مقادير اوليه iو jو مي باشد . ( بديهي است كه اين
رويه هنگامي كار مي كند كه i كوچكتر از مقدار اوليه j باشد . ) همانطوريكه
مي بينيد ، نيازي به بدنه حلقه نيست ، كليه عمليات داخل خود عبارت شرطي اتفاق
مي افتد . در كدهاي حرفه اي نوشته شده ديگر جاوا ، وقتي كه عبارت كنترل كننده
توانايي مديريت كليه جزئيات خود را داشته باشد ، حلقه هاي كوتاه غالبا" بدون
بدنه كد بندي مي شوند .

do-while

گفتيم اگر عبارت شرطي كنترل كننده يك حلقه while در ابتدا ناصحيح باشد
آنگاه بدنه حلقه اصلا" اجرا نمي شود . اما گاهي مايليم در چنين شرايطي ، بدنه
حلقه حداقل يكبار اجرا شود . بعبارت ديگر، در حالات خاصي مايليد تا عبارت پايان
دهنده در انتهاي حلقه را آزمايش كنيد. خوشبختانه ، جاوا حلقه اي را عرضه مي كند
كه دقيقا" همين كار را انجام مي دهد : do-while . حلقه do-while همواره حداقل
يكبار بدنه خود را اجرا مي كند، زيرا عبارت شرطي آن در انتهاي حلقه قرار گرفته
است . شكل كلي آن بصورت زير است :

do{
// body of loop
} while(condition);

هر تكرار از حلقه do-while ابتدا بدنه حلقه را اجرا نموده ، سپس به ارزيابي
عبارت شرطي خود مي پردازد . اگر اين عبارت صحيح (true) باشد ، حلقه اجرا خواهد
شد . در غير اينصورت حلقه پايان مي گيرد . نظير كليه حلقه هاي جاوا ، شرط بايد
يك عبارت بولي باشد .
اينجا يك روايت ديگر از برنامه (tick) وجود دارد كه حلقه do-while را نشان
مي دهد . خروجي اين برنامه مشابه برنامه قبلي خواهد بود :

+ // Demonstrate the do-while loop.
+ class DoWhile {
+ public static void main(String args[] ){
+ int n = 10;
+
+ do {
+ System.out.println("tick" + n);
+ n--;
+ } while(n > 0);
+ }
+ }

حلقه موجود در برنامه قبلي ، اگر چه از نظر تكنيكي صحيح است ، اما مي توان
آن را به شكل كاراتري بصورت زير دوباره نويسي نمود : + do {
+ System.out.println("tick " + n);
+ } while--(n > 0);

در اين مثال ، عبارت (0>n) عمل كاهش n و آزمايش براي صفر را در يك عبارت
گنجانده است . عملكرد آن بقرار بعدي است . ابتدا دستور n اجرا مي شود و n
را كاهش داده و مقدار جديد را به n برمي گرداند . اين مقدار سپس با صفر مقايسه
مي شود . اگر بزرگتر از صفر باشد ، حلقه ادامه مي يابد . در غير اينصورت حلقه
پايان مي گيرد .
حلقه do-while بويژه هنگام پردازش انتخاب منو بسيار سودمند است ، زيرا
معمولا" مايليد تا بدنه يك حلقه منو حداقل يكبار اجرا شود . برنامه بعدي را كه
يك سيستم Help ساده را براي دستورات تكرار و انتخاب در جاوا پياده سازي مي كند
در نظر بگيريد :

+ // Using a do-while to process a menu selection -- a simple help system.
+ class Menu {
+ public static void main(String args[])
+ throws java.io.IOException {
+ char choice;
+
+ do {
+ System.out.prinln("Help on:");
+ System.out.prinln(" 1 .if");
+ System.out.prinln(" 2 .switch");
+ System.out.prinln(" 3 .while");
+ System.out.prinln(" 4 .do-while");
+ System.out.prinln(" 5 .for\n");
+ System.out.prinln("Choose one:");
+ choice =( char )System.in.read)(;
+ } while(choice < '1' || choice > '5');
+
+ System.out.println("\n");
+ switch(choice ){
+ case '1':
+ System.out.println("The if:\n");
+ System.out.println("if(condition )statement;");
+ System.out.println("else statement;");
+ break;
+ case '2':
+
+ System.out.println("The switch:\n");
+ System.out.println("switch(expression ){");
+ System.out.println(" case constant:");
+ System.out.println(" statement sequence");
+ System.out.println(" break;");
+ System.out.println(" //... ");
+ System.out.println("}");
+ break;
+ case '3':
+ System.out.println("The switch:\n");
+ System.out.println(while(condition )statement;");
+ break;
+ case '4':
+ System.out.println("The do-while:\n");
+ System.out.println("do {");
+ System.out.println(" statement;");
+ System.out.println("} while( condition);");
+ break;
+ case '5':
+ System.out.println("The for:\n");
+ System.out.print("for(init; condition; iteration)");
+ System.out.println(" statement;");
+ break;
+ }
+ }
+ }

اكنون يك اجراي نمونه توليد شده توسط اين برنامه را مشاهده مي كنيد :

Help on:
1 .if
2 .switch
3 .while
4 .do-while
5 .for
Choos one:
4

The do-while:

do {
statement;
} while( condition);

در برنامه ، از حلقه do-while براي تصديق اينكه كاربر يك گزينه معتبر را
وارد كرده باشد ، استفاده مي شود . در غير اينصورت ، به كاربر مجددا" اعلان
خواهد شد . از آنجاييكه منو بايد حداقل يكبار بنمايش درآيد ، do-while حلقه
كاملي براي انجام اين مقصود است .
چند نكته ديگر درباره اين مثال : دقت كنيد كه كاراكترهااز صفحه كليد بوسيله
فراخواني ()system.in.read خوانده مي شوند . اين يكي از توابع ورودي كنسول در
جاوا است .
اگر چه بررسي تفصيلي روشهاي l/o جاوا به بحثهاي بعدي موكول شده ، اما از
()system.in.read در اينجا براي بدست آوردن گزينه كاربر استفاده شده است . اين
تابع كاراكترها را از ورودي استاندارد مي خواند ( كه بعنوان عدد صحيح برگردان
شد ، اين دليلي است كه چرا مقدار برگردان از طريق تبديل (cast) به char تبديل
شده است ). بصورت پيش فرض ، ورودي استاندارد، بافر شده خطي است (line buffered)
بنابراين قبل از اينكه كاراكترهايي را كه تايپ كرده ايد به برنامه اتان ارسال
كنيد ، بايد كليد ENTER را فشار دهيد . ( اين حالت مشابه C++/C است و احتمالا"
از قبل با آن آشنايي داريد ) .
ورودي كنسول در جاوا كاملا" محدود شده و كار با آن بسيار مشكل است . بعلاوه
اكثر برنامه و ريز برنامه هاي واقعي نوشته شده با جاوا گرافيكي و پنجره اي
هستند. از سوي ديگر : چون از ()system.in.read استفاده شده ، برنامه بايد جمله throwsjava.io.loException
را كاملا" توصيف نمايد . اين خط براي مديريت خطاهاي
ورودي ضروري است . اين بخشي از جنبه هاي مختلف اداره استثنائ در جاوا است كه
بعدا" بررسي خواهد شد .

for

خواهيد ديد كه حلقه for يك ساختار قدرتمند و بسيار روان است .شكل كلي دستور for
بصورت زير است :

for(initialization; condition; iteration; ){
// body
}

اگر فقط يك دستور بايد تكرار شود ، نيازي به ابروها نيست .
عملكرد حلقه for بشرح بعدي است . وقتي كه حلقه براي اولين بار شروع مي شود
بخض مقدار دهي اوليه در حلقه اجرا مي شود . معمولا" ، اين بخش يك عبارت است كه
مقدار متغير كنترل حلقه را تعيين مي كند ، كه بعنوان يك شمارشگر ، كنترل حلقه
را انجام خواهد داد . مهم است بدانيم كه عبارت مقدار دهي اوليه فقط يكبار اجرا
مي شود . سپس شرط مورد ارزيابي قرار مي گيرد . اين شرط بايد يك عبارت بولي
باشد . اين بخش معمولا" مقدار متغير كنترل حلقه را با مقدار هدف مقايسه مي كند.
اگر عبارت صحيح (true) باشد، آنگاه بدنه حلقه اجرا خواهد شد . اگر ناصحيح باشد
حلقه پايان مي گيرد . بعد، بخش تكرار (iteration) حلقه اجرا مي شود . اين بخش
معمولا" عبارتي است كه مقدار متغير كنترل را افزايش يا كاهش مي دهد. آنگاه حلقه
تكرار خواهد شد ، ابتدا عبارت شرطي را ارزيابي مي كند ، سپس بدنه حلقه را اجرا
مي كند و سرانجام عبارت تكرار را در هر گذر (pass) اجرا ميكند. اين روال آنقدر
دادمه مي يابد تا عبارت شرطي ناصحيح (false) گردد .
در زير روايت جديدي از برنامه "tick" را مي بينيد كه از يك حلقه for استفاده
كرده است :

+ // Demonstrate the for loop.
+ class ForTick {
+ public static void main(String args[] ){
+ int n;
+ for(n=10; n>0; n)--
+ System.out.println("tick" + n);
+ }
+ }

اعلان متغيرهاي كنترل حلقه داخل حلقه for
غالبا" متغيري كه يك حلقه for را كنترل مي كند ، فقط براي همان حلقه مورد
نياز بوده و كاربري ديگري ندارد . در چنين حالتي ، مي توان آن متغير را داخل
بخش مقدار دهي اوليه حلقه for اعلان نمود . بعنوان مثال در اينجا همان برنامه
قبلي را مشاهده مي كنيد كه متغير كنترل حلقه يعني n بعنوان يك int در داخل
حلقه for اعلان شده است .

+ // Declare a loop control variable inside the for.
+ class ForTick {
+ public static void main(String args[] ){
+
+ // here/ n is declared inside of the for loop
+ for(int n=10; n>0; n)--
+ System.out.println("tick" + n);
+ }
+ }

هنگاميكه يك متغير را داخل يك حلقه for اعلان مي كنيد ، يك نكته مهم را بايد
بياد داشته باشيد : قلمرو آن متغير هنگاميكه دستور for انجام مي شود ، پايان
مي يابد . ( يعني قلمرو متغير محدود به حلقه for است . ) خارج از حلقه for
حيات آن متغير متوقف مي شود . اگر بخواهيد از اين متغير كنترل حلقه در جاي
ديگري از برنامه اتان استفاده كنيد ، نبايد آن متغير را داخل حلقه for اعلان
نماييد .
درشرايطي كه متغير كنترل حلقه جاي ديگري موردنياز نباشد، اكثر برنامه نويسان
جاوا آن متغير را داخل for اعلان مي كنند . بعنوان مثال ، در اينجا يك برنامه
ساده را مشاهده مي كنيد كه بدنبال اعداد اول مي گردد. دقت كنيد كه متغير كنترل
حلقه ، چون جاي ديگري مورد نياز نيست ، داخل for اعلان شده است .

+ // Test for primes.
+ class FindPrime {
+ public static void main(String args[] ){
+ int num;
+ boolean isPrime = true;
+
+ num = 14;
+ for(int i=2; i < num/2; i++ ){
+ if((num % i )== 0 ){
+ isPrime = false;
+ break;
+ }
+ }
+ if(isPrime )System.out.println("Prime");
+ else System.out.println("Not Prime");
+ }
+ }

استفاده از كاما Comma
شرايطي پيش مي آيد كه مايليد بيش از يك دستور در بخش مقدار دهي اوليه
(initalization) و تكرار (iteration) بگنجانيد . بعنوان مثال ، حلقه موجود در
برنامه بعدي را در نظر بگيريد :

+ class Sample {
+ public static void main(String args[] ){
+ int a/ b;
+
+ b = 4;
+ for(a=1; a
+ System.out.println("a = " + a);
+ System.out.println("b = " + b);
+ b--;
+ }
+ }
+ }

همانطوريكه مي بينيد ، حلقه توسط ارتباط متقابل دو متغير كنترل مي شود . از
آنجاييكه حلقه توسط دو متغير اداره مي شود ، بجاي اينكه b را بصورت دستي اداره
كنيم ، بهتر است تا هر دو را در دستور for بگنجانيم . خوشبختانه جاوا راهي
براي اينكار دارد . براي اينكه دو يا چند متغير بتوانند يك حلقه for را كنترل
كنند ، جاوا به شما امكان مي دهد تا چندين دستور را در بخشهاي مقدار دهي اوليه
و تكرار حلقه for قرار دهيد . هر دستور را بوسيله يك كاما از دستور بعدي جدا
مي كنيم .
حلقه for قبلي را با استفاده از كاما ، خيلي كاراتر از قبل مي توان بصورت
زير كد بندي نمود :

+ // Using the comma.
+ class Comma {
+ public static void main(String args[] ){
+ int a/ b;
+
+ for(a=1/ b=4; a
+ System.out.println("a = " + a);
+ System.out.println("b = " + b);
+ }
+ }
+ }

در اين مثال ، بخش مقدار دهي اوليه ، مقادير aو bو را تعيين مي كند . هربار
كه حلقه تكرار مي شود ، دو دستور جدا شده توسط كاما در بخش تكرار (itration)
اجرا خواهند شد . خروجي اين برنامه بقرار زير مي باشد :

a=1
b=4
a=2
b=3

نكته : اگر با C++/C آشنايي داريد ، حتما" مي دانيد كه در اين زبانها ، علامت
كاما يك عملگر است كه در هر عبارت معتبري قابل استفاده است . اما در
جاوا اينطور نيست . در جاوا ، علامت كاما يك جدا كننده است كه فقط در
حلقه for قابل اعمال مي باشد .

برخي گوناگونيهاي حلقه for
حلقه for از تعدادي گوناگونيها پشتيباني مي كند كه قدرت و كاربري آن را
افزايش مي دهند . دليل انعطاف پذيري آن است كه لزومي ندارد كه سه بخش مقداردهي
اوليه ، آزمون شرط و تكرار ، فقط براي همان اهداف مورد استفاده قرار گيرند .
در حقيقت ، سه بخش حلقه for براي هر هدف مورد نظر شما قابل استفاده هستند . به
چند مثال توجه فرمائيد .
يكي از رايجترين گوناگونيها مربوط به عبارت شرطي است . بطور مشخص ، لزومي
ندارد اين عبارت ، متغير كنترل حلقه را با برخي مقادير هدف آزمايش نمايد . در
حقيقت ، شرط كنترل كننده حلقه for ممكن است هر نوع عبارت بولي باشد . بعنوان
مثال ، قطعه زير را در نظر بگيريد :

+ boolean done = false;
+
+ for(int i=1; !done; i++ ){
+ //...
+ if(intettupted ))(done = true;
+ }

در اين مثال ، حلقه for تا زمانيكه متغير بولي done معادل true بشود ، اجرا
را ادامه خواهد داد . اين مثال مقدار i را بررسي نمي كند .
اكنون يكي ديگر از گوناگونيهاي جالب حلقه for را مشاهده مي كنيد. ممكن است
يكي يا هر دو عبارت مقدار دهي اوليه و تكرار غايت باشند ، نظير برنامه بعدي :

+ // Parts of the for loop can be empty.
+ class ForVar {
+ public static void main(String args[] ){
+ int i;
+ boolean done = false;
+
+ i = 0;
+ for (; !done; ) {
+ System.out.println("i is" + i);
+ if(i == 10 )done = true;
+ i++;
+ }
+ }
+ }

در اينجا عبارتهاي مقدار دهي اوليه و تكرار به خارج ازfor انتقال يافته اند.
برخي از بخشهاي حلقه for تهي هستند . اگر چه در اين مثال ساده چنين حالتي هيچ
ارزشي ندارد ، اما در حقيقت شرايطي وجود دارد كه اين روش بسيار كارا و سودمند
خواهد بود. بعنوان مثال ، اگر شرط اوليه بصورت يك عبارت پيچيده و در جاي ديگري
از برنامه قرار گرفته باشد و يا تغييرات متغير كنترل حلقه بصورت غير ترتيبي و
توسط اعمال اتفاق افتاده در داخل بدنه حلقه تعيين شود ، پس بهتر است كه اين
بخشها را در حلقه for تهي بگذاريم .
اكنون يكي ديگر از گوناگونيهاي حلقه for را مشاهده مي كنيد. اگر هر سه بخش
حلقه for را تهي بگذاريد ، آنگاه بعمد يك حلقه نامحدود ( حلقه اي كه هرگز پايان
نمي گيرد ) ايجاد كرده ايد . بعنوان مثال :

+ for (; ; ) {
+ //...
+ }

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

حلقه هاي تودرتو
نظير كليه زبانهاي برنامه نويسي ، جاوا نيز امكان تودرتو كردن حلقه ها را
دارد . يعني يك حلقه داخل حلقه ديگري قرار خواهد گرفت . بعنوان مثال ، در
برنامه بعدي حلقه هاي for تودرتو نشده اند :

+ // Loops may be nested.
+ class Nested {
+ public static void main(String args[] ){
+ int i/ j;
+
+ for(i=0; i<10; i++ ){
+ for(j=i; j<10; j++)
+ System.out.print(".");
+ System.out.println)(;
+ }
+ }
+ }
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
بنيادهاي كلاس java | java
دستورات انتخاب در جاوا | java
استفاده از پرانتزها | java
عملگر ? | java
عملگر انتساب The Assignment Operator | java
عملگرهاي منطقي بولي Boolean | java
عملگرهاي رابطه اي | java
عملگرها ی ریاضی و بیتی | java
اولين برنامه ساده java | java
آرايه ها در جاوا | java
متغيرها و اعمال روی آنها | java
انواع اعداد اعشاري جاوا | java
آموزش جاوا - integers ( اعداد صحيح ) | java
جاوا را بشناسیم | java

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


بنيادهاي كلاس java
كلاسهاي توليد شده در بحثهاي گذشته فقط براي كپسول سازي روش ()main استفاده
مي شد ، كه براي نشان دادن اصول دستور زبان جاوا مناسب بودند . شايد بهترين
چيزي كه بايد درباره يك كلاس بدانيد اين است كه كلاس يك نوع جديد داده را تعريف
مي كند . هربار كه اين نوع تعريف شود ، مي توان از آن براي ايجاد اشيائي از
همان نوع استفاده نمود . بنابراين ، يك كلاس قالبي (template) براي يك شي ئ است
و يك شي ئ نمونه اي (instance) از يك كلاس است . چون شي ئ يك نمونه از يك كلاس است
غالبا" كلمات شي ئ (object) و نمونه (instance) را بصورت مترادف بكار مي بريم .

شكل عمومي يك كلاس
هنگاميكه يك كلاس را تعريف مي كنيد ، در حقيقت شكل و طبيعت دقيق آن كلاس را
اعلان مي كنيد . ابتكار را با توصيف داده هاي موجود در آن كلاس و كدهايي كه روي
آن داده ها عمل مي كنند ، انجام مي دهيد . در حاليكه كلاسها ممكن است خيلي ساده
فقط شامل داده يا فقط كد باشند، اكثر كلاسهاي واقعي هردو موضوع را دربرميگيرند.
بعدا" خواهيد ديد كه كد يك كلاس ، رابط آن به داده هاي همان كلاس را توصيف ميكند.
يك كلاس را با واژه كليدي class اعلان مي كنند . كلاسهايي كه تا بحال استفاده
شده اند ، نوع بسيار محدود از شكل كامل كلاسها بوده اند . خواهيد ديد كه كلاسها
مي توانند ( و معمولا" هم ) بسيار پيچيده تر باشند . شكل عمومي توصيف يك كلاس به
شرح زير است :

type methodname2(parameter-list ){
// body of method
}
//...
type methodnameN(parameter-list ){
// body of method
}
}

داده يا متغيرهايي كه داخل يك كلاس تعريف شده اند را متغيرهاي نمونه instance)
(variables مي نامند . كدها ، داخل روشها (methods) قرار مي گيرند . روشها و
متغيرهاي تعريف شده داخل يك كلاس را اعضائ (members) يك كلاس مي نامند . در اكثر
كلاسها ، متغيرهاي نمونه يا روي روشهاي تعريف شده براي آن كلاس عمل كرده يا توسط
اين روشها مورد دسترسي قرار مي گيرند . بنابراين ، روشها تعيين كننده چگونگي
استفاده از داده هاي يك كلاس هستند .
متغيرهاي تعريف شده داخل يك كلاس ، متغيرهاي نمونه خوانده شده زيرا هر نمونه
از كلاس ( يعني هر شي ئ يك كلاس ) شامل كپي خاص خودش از اين متغيرهاست . بنابراين
داده مربوط به يك شي ئ ، جدا و منحصر بفرد از داده مربوط به شي ئ ديگري است . ما
بزودي اين نكته را بررسي خواهيم نمود ، اما فعلا" بايد اين نكته بسيار مهم را
بياد داشته باشيد .
كليه روشها نظير()main همان شكل عمومي را دارند كه تاكنون استفاده كرده ايم .
اما ، اكثر روشها را بعنوان staticيا publicا توصيف نمي كنند . توجه داشته
باشيد كه شكل عمومي يك كلاس ، يك روش ()main را توصيف نمي كند . كلاسهاي جاوا
لزومي ندارد كه يك روش ()main داشته باشند . فقط اگر كلاس ، نقطه شروع برنامه
شما باشد ، بايد يك روش ()main را توصيف نماييد . علاوه بر اين ، ريز برنامه ها
(applets) اصولا" نيازي به روش ()main ندارند .
نكته : برنامه نويسان C++ آگاه باشند كه اعلان كلاس و پياده سازي روشها در يك
مكان ذخيره شده و بصورت جداگانه تعريف نمي شوند. اين حالت گاهي فايلهاي
خيلي بزرگ java ايجاد مي كند ، زيرا هر كلاس بايد كاملا" در يك فايل منبع
تكي تعريف شود . اين طرح در جاوا رعايت شد زيرا احساس مي شد كه در بلند
مدت ، در اختيار داشتن مشخصات ، اعلانها و پياده سازي در يك مكان ، امكان
دسترسي آسانتر كد را بوجود مي آورد .

يك كلاس ساده
بررسي خود را با يك نمونه ساده از كلاسها شروع مي كنيم . در اينجا كلاسي تحت
غنوان Box وجود دارد كه سه متغير نمونه را تعريف مي كند : width، height، و depth
و فعلا" ، كلاس Box دربرگيرنده روشها نيست .

+ class Box {
+ double width;
+ double height;
+ double depth;
+ }

قبلا" هم گفتيم كه يك كلاس نوع جديدي از داده را توصيف مي كند . در اين مثال
نوع جديد داده را Box ناميده ايم . از اين نام براي اعلان اشيائ از نوع Box
استفاده مي كنيد . نكته مهم اين است كه اعلان يك كلاس فقط يك الگو يا قالب را
ايجاد مي كند ، اما يك شي ئ واقعي بوجود نمي آورد . بنابراين ، كد قبلي ، شيئي
از نوع Box را بوجود نمي آورد .
براي اينكه واقعا" يك شي ئ Box را بوجود آوريد ، بايد از دستوري نظير مورد
زير استفاده نماييد :

+ Box mybox = new Box)(; // create a Box object called mybox

پس از اجراي اين دستور ، mybox نمونه اي از Box خواهد بود. و بدين ترتيب اين
شي ئ وجود فيزيكي و واقعي پيدا مي كند .
مجددا" بياد داشته باشيد كه هر بار يك نمونه از كلاسي ايجاد مي كنيد ، شيئي
ايجاد كرده ايد كه دربرگيرنده كپي ( نسخه خاص ) خود از هر متغير نمونه تعريف
شده توسط كلاس خواهد بود . بدين ترتيب ، هر شي ئ Box دربرگيرنده كپي هاي خود از
متغيرهاي نمونه width، heidht،و depthو مي باشد . براي دسترسي به اين متغيرها
از عملگر نقطه (.) استفاده مي كنيد . عملگر نقطه اي ، نام يك شي ئ را با نام يك
متغير نمونه پيوند مي دهد . بعنوان مثال ، براي منتسب كردن مقدار 100 به متغير width
در myboxر ، از دستور زير استفاده نماييد :

+ mybox.width = 100;

اين دستور به كامپايلر مي گويد كه كپي width كه داخل شي ئ mybox قرار گرفته
را معادل عدد 100 قرار دهد . بطور كلي ، از عملگر نقطه اي براي دسترسي هم به
متغيرهاي نمونه و هم به روشهاي موجود در يك شي ئ استفاده مي شود .
دراينجا يك برنامه كامل را مشاهده ميكنيد كه از كلاس Box استفاده كرده است :

+ /* A program that uses the Box class.
+
+ Call this file BoxDemo.java
+ /*
+ class Box {
+ double width;
+ double height;
+ double depth;
+ }
+
+ // This class declares an object of type Box.
+ class BoxDemo {
+ public static void main(String args[] ){
+ Box mybox = new Box)(;
+ double vol;
+
+ // assign values to mybox's instance variables
+ mybox.width = 10;
+ mybox.height = 20;
+ mybox.depth = 15;
+
+ // compute volume of box
+ vol = mybox.width * mybox.height * mybox.depth;
+
+ System.out.println("Volume is " + vol);
+ }
+ }

فايلي را كه دربرگيرنده اين برنامه است بايد با نام BoxDemo.java بخوانيد
زيرا روش ()main در كلاس BoxDemo و نه در كلاس Box قرار گرفته است . هنگاميكه اين
برنامه را كامپايل مي كنيد ، مي بينيد كه دو فايل class. ايجاد شده اند ، يكي
براي Box و ديگري براي BoxDemo . كامپايلر جاوا بطور خودكار هر كلاس را در فايل class
. مربوط به خودش قرار مي دهد . ضرورتي ندارد كه كلاس Boxو BoxDemoو هر دو
در يك فايل منبع قرار گيرند . مي توانيد هر كلاس را در فايل خاص خودش گذاشته و
آنها را بترتيب Box.javaو BoxDemo.javaو بناميد .
براي اجراي اين برنامه بايد BoxDemo.class را اجرا كنيد . پس از اينكار
حاصل زير را بدست مي آوريد :

Volume is 3000

قبلا" هم گفتيم كه هر شي ئ داراي كپي هاي خاص خودش از متغيرهاي نمونه است .
يعني اگر دو شي ئ Box داشته باشيد، هركدام بتنهايي كپي ( يا نسخه اي ) از lenght width
و heightو خواهند داشت . مهم است بدانيد كه تغييرات در متغيرهاي نمونه يك
شي ئ تاثيري روي متغيرهاي نمونه كلاس ديگر نخواهد داشت . بعنوان مثال ، برنامه
بعدي دو شي ئ Box را اعلان مي كند :

+ // This program declares two Box objects.
+
+ class Box {
+ double width;
+ double height;
+ double depth;
+ }
+
+ class BoxDemo2 {
+ public static void main(String args[] ){
+
+ Box mybox1 = new Box)(;
+ Box mybox2 = new Box)(;
+ double vol;
+
+ // assign values to mybox1's instance variables
+ mybox1.width = 10;
+ mybox1.height = 20;
+ mybox1.depth = 15;
+
+ /* assign different values to mybox2's
+ instance variables */
+ mybox2.width = 3;
+ mybox2.height = 6;
+ mybox2.depth = 9;
+
+ // compute volume of first box
+ vol = mybox1.width * mybox1.height * mybox1.depth;
+ System.out.println("Volume is " + vol);
+
+ // compute volume of second box
+ vol = mybox2.width * mybox2.height * mybox2.depth;
+ System.out.println("Volume is " + vol);
+ }
+ }

خروجي توليد شده توسط اين برنامه بقرار زير مي باشد :

Volume is 3000
Volume is 162
لينک مقاله
http://www.irandevelopers.com :منبع

مقالات مرتبط با اين موضوع
بنيادهاي كلاس java | java
دستورات انتخاب در جاوا | java
استفاده از پرانتزها | java
عملگر ? | java
عملگر انتساب The Assignment Operator | java
عملگرهاي منطقي بولي Boolean | java
عملگرهاي رابطه اي | java
عملگرها ی ریاضی و بیتی | java
اولين برنامه ساده java | java
آرايه ها در جاوا | java
متغيرها و اعمال روی آنها | java
انواع اعداد اعشاري جاوا | java
آموزش جاوا - integers ( اعداد صحيح ) | java
جاوا را بشناسیم | java

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


جاوا را بشناسیم

چرا جاوا زباني جالب است ؟

در يكي از مقالات در باره ي زبان شركتSun جاوا را با اين خصوصيات شرح مي دهد :

جاوا يك زبان ساده ، شي گرا ،‌توزيع شده ، تفسير شده ، قدرتمند ، ايمن ، با معماري خنثي ، قابل حمل ، با عملكرد سطح بالا چند نخ كشي شده و پويا است .

Sun تصديق ميكند كه به طور قطع اين كلمات رشته هايي از واژه هاي متداول در زبان برنامه نويسي هستند ، اما حقيقت اين است كه اين واژه ها به طور ماهرانه اي خصوصيات اين زبان را شرح ميدهند .

حال به برخي از خصلت هاي جاوا در پشت اين واژه ها ميپردازيم .

شي گرا :Object Oriented

جاوا يك زبان برنامه نويسي شي گرا است . براي يك برنامه نويس اين به اين معنا است كه به جاي فكر كردن به قسمت هاي رويه برنامه ، بايد به كاربرد داده ها و روش هايي كه روي آن داده ها عمل ميكنند ، توجه شود.

اگر شما به برنامه نويسي با اعلان رويه در C عادت كرده ايد ،ممكن است دريابيد كه به هنگام استفاده از جاوا مجبور به تغيير در روش و چگونگي برنامه تان هستيد . هنگامي كه فهميديد اين الگوي جديد چقدر قدرتمند است ، به سرعت با آن هماهنگ ميشويد .

در يك سيستم شي گرا ، يك كلاس مجموعه اي از داده ها و روش هايي است كه روي آن داده عمل ميكنند. همراه بودن داده ها و متد ها رفتار و حالت يك شي را بيان مي دارد . كلاس ها به صورت سلسله مراتبي مرتب شده اند ، بنابر اين يك زير كلاس ميتواند رفتار هايي را از كلاس بالاتر به ارث ببرد . يك كلاس سلسله مراتبي هميشه يك كلاس ريشه دارد كه كلاسي است با رفتار هاي كاملا عمومي .

جاوا به همراه دسته ي گسترده اي از كلاس هايي است كه در بسته هايي مرتب شده اند و شما مي توانيد از آنها در برنامه ي خود استفاده كنيد . براي مثال جاوا كلاس هايي را ايجاد ميكند كه :

بخش هاي رابط گرافيكي را ميسازند (the java.awt package) ،كلاس هايي كه عمليات ورودي و خروجي را به عهده دارند(the java.io package) و كلاس هايي كه از شبكه پشتيباني ميكنند (the java.net package ) .

يك شي كلاس(in the java.lang package) به عنوان ريشه كلاس سلسله مراتبي جاوا انجام وظيفه ميكند .

جاوا بر خلاف C++ طوري طراحي شده است كه از همان ابتدا به صورت شي گرا باشد . اكثر چيز ها در جاوا اشيا هستند . ارقام ابتدايي ، كاراكترها و مدل هاي منطقي تنها استثناء ها هستند . حتي رشته ها هم در جاوا به وسيله اشيا حاضر ميشوند ،همان طور كه ساختمان هاي مهم ديگر اين زبان ، مثل نخ ها احضار ميشوند . يك كلاس يك واحد پايه براي كامپايل و اجرا شدن در جاوا است . تمام برنامه هاي جاوا متشكل از كلاس ها است .

درست است كه جاوا طوري طراحي شده است كه مثل C++ باشد و خاصيت هاي آن را داشته باشد ، اما هنگامي كه با آن كار كنيد خواهيد فهميد كه بسياري از پيچيده گي هاي آن زبان را از بين برده است .

اگر شما يك برنامه نويس C++ هستيد حتما لازم است كه ساختار هاي شي گرايي در جاوا را به دقت مطالعه كنيد . اگرچه تركيب و نحوه دستورات آن تقريبا شبيه C++ است ،‌اما رفتار هاي آن خيلي مشابه نيست .

تفسير شده :Interpreted

جاوا يك زبان تفسير شده است . كامپايلر جاوا به جاي ايجاد كد محلي ماشين ، كد بايتي براي ماشين مجازي جاوا ايجاد ميكند . براي اجراي دقيق برنامه ، از مفسر جاوا براي اجراي كد هاي بايتي كامپايل شده استفاده ميشود . به دليل اينكه كد هاي بايتي جاوا به نوع كامپيوتر بستگي ندارند ، برنامه هاي جاوا ميتوانند روي هر نوع كامپيوتري كه JVM (Java Virtual Machine) را دارند ، اجرا شوند .

در محيط تفسير شده ، مرحله لينك استاندارد توسعه برنامه از ديد كاربر پنهان است . اگر جاوا تنها يك مرحله لينك داشت ، فقط بارگذاري كلاس جديد به محيط پردازش ميشد كه يك پردازش نموي سبك وزن است كه در زمان اجرا مشاهده ميشود . كه اين خصوصيت با چرخه كامپايل-لينك-اجرا ي آرام و طاقت فرساي زبان هايي مانند C يا C++ در تضاد است .

معماري خنثي و قابل حمل :

Architecture Neutral and Portable

به دليل اينكه برنامه هاي جاوا در فرمت كد بايتي با معماري خنثي كامپايل شده اند ، برنامه كاربردي جاوا ميتواند در هر سيستمي اجرا شود.

البته با اين شرط كه آن سيستم توانايي پياده سازي ماشين مجازي جاوا را داشته باشد . اين مسئله تقريبا براي كاربرد هاي توزيع سده روي اينترنت و يا ديگر شبكه هاي ناهمگن مهم است . اما روش معماري خنثي براي كاربرد هاي بر مبناي شبكه مفيد است .

به عنوان يك توسعه دهنده برنامه هاي كاربردي در بازار نرم افزاري امروز ممكن است بخواهيد مدل هاي كاربردي خود را توسعه دهيد ، به طوري كه بتواند روي Pc ، مكينتاش و سيستم عامل Unix اجرا شود .با وجود گونه هاي مختلف Unix ، Windows روي Pc و مكينتاش قوي جديد ، رفته رفته توليد نرم افزار براي همه انواع اين كامپيوتر ها سخت مي شود . اگر شما برنامه تان را در جاوا بنويسيد ميتواند روي همه ي اين كامپيوترها اجرا شود .

در حقيقت تفسير شده بودن جاوا وتعريف يك استاندارد ، معماري خنثي داشتن و فورمت كد بايتي آن از بزرگترين دلايل قابل حمل بودن آن به شمار مي آيند .

اما جاوا باز از اين هم بيشتر گام برميدارد ،‌ با اطمينان حاصل كردن از اينكه هيچيك از جنبه هاي وابستگي اجرايي زبان را ندارد . براي مثال جاوا به طور صريح اندازه هريك از انواع داده را تعريف ميكند كه اين با C تفاوت دارد ، برای مثال هريک از انواع صحيح می تواند بسته به نوع کامپيوتر16-32 يا 64 بيت طول داشته باشد .

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

يك برنامه جاوا به توليد كنندگان نرم افزار كمك ميكند تا از قابل حمل بودن كد هايشان اطمينان حاصل كنند . برنامه نويسان فقط براي پرهيز از دام غير قابل حمل بودن برنامه احتياج به يك تلاش ساده دارند كه شعار تجارتي شركتSun را زنده نگهدارند و آن شعار اين است :

« يك بار بنويس ، همه جا اجرا كن » .

پويا و توزيع شده :Dynamic and Distributed

جاوا يك زبان پويا است . هر كلاس جاوا ميتواند در هر زماني روي مفسر جاوا بارگذاري شود . سپس اين كلاس هاي بارگذاري شده ي پويا ميتوانند به صورت پويا معرفي شوند . حتي كتابخانه كد هاي محلي ميتواند به طور پويا بارگذاري شود .كلاس ها در جاوا با كلاس Class فراخواني ميشوند ؛ شما ميتوانيد به طور پويا در مورد يك كلاس در زمان اجرا اطلاعاتي بدست بياوريد . اين خصوصيت در جاوا 1-1 به طور درستي موجود است . با وجود بازتاب API اضافه شده (Application Program Interface ) كه به برنامه ساز امكان ميدهد كه با برنامه از طريق يك برنامه كاربردي ديگر ارتباط برقرار كند .

جاوا حتي با نام زبان توزيع شده نيز خوانده ميشود . به طور ساده اين به اين معنا است كه اين زبان پشتيباني سطح بالايي براي شبكه به وجود مي آورد . براي مثال كلاس URL و كلاس هاي مرتبط با آن در بسته ي Java.net ، خواندن فايل هاي دوردست را به همان سادگي خواندن فايل هاي محلي كرده است . به طور مشابه در جاوا 1-1 ، احضار روش كنترلي RMI

(Remote Method Invocation ) ، API به يك برنامه جاوا اجازه ميدهد كه روش هايي از اشياء دور دست جاوا را به همان صورتي كه اگر آن اشياء محلي بدند آنها را ميخواند ، بخواند .( جاوا حتي از سيستم شبكه اي سطح پايين كه شامل آدرس مقصد و مسير جرياني كه توسط سوكت ها متصل شده است ، نيز پشتيباني ميكند .)

طبيعت توزيع شده ي جاوا زمانيكه با امكانات پوياي بارگذاري كلاس همراه ميشود ، واقعا درخشنده است . اين خصوصيات با هم اين امكان را براي مفسر جاوا به وجود مي آورند كه كد ها را از اينترنت بارگذاري و اجرا كند . ( همان طور كه بعدا خواهيم ديد جاوا باعث ميشود كه با وجود ابزار قدرتمند و ايمن اين كار به طور مطمئن انجام شود .) اين چيزي است كه در هنگام بارگذاري و اجراي يك برنامه كاربردي از اينترنت توسط مرورگر وب ، اتفاق مي افتد . اما داستان پيچيده تر از اين هم ميتواند باشد . تصور كنيد يك پردازشگر كلمه چند رسانه اي در جاوا نوشته شده است . وقتي از اين برنامه پرسيده ميشود كه چند نوع از داده هايي را كه قبلا هرگز وارد نشده را نمايش دهد ، ممكن است به طور ديناميكي يك كلاس را كه ميتواند داده را شناسايي كند ، از شبكه بارگذاري كند و بعد كلاس ديگري را كه بتواند داده را از درون يك پوشه تركيبي بخواند ، باز به طور ديناميكي بارگذاري ميكند . برنامه اي مانند اين از منابع توزيع شده در شبكه براي رشد و سازگاري خودكار كاربران استفاده ميكند .

ساده :Simple

جاوا يك زبان ساده است . طراحان جاوا سعي در اين داشتند تا زباني بوجود بياورند كه برنامه نويسان بتوانند به سرعت آن را ياد بگيرند . بنابراين تعداد ساختار هاي اين زبان تقريبا كم است . هدف ديگر طراحي اين زبان اين بود كه به منظور راحتي انتقال آن ، آن را طوري طراحي كنند كه براي عده ي زيادي از برنامه نويسان آشنا باشد . اگر شما يك برنامه نويس C يا C++ هستيد ، خواهيد فهميد كه جاوا از بسياري از ساختار هاي C و ‍ C++ ا ستفاده ميكند .

براي اينكه اين زبان را هم به طور ساده و هم آشنا و ملموس و هم كوچك نگه دارند بسياري از خصوصيات C و C++ را در آن حذف كردند . اينها خصوصياتي بودند كه باعث مي شدند برنامه نويسي ضعيفي صورت بگيرد يا آنهايي بودند كه به ندرت در برنامه استفاده مي شدند . براي مثال جاوا از دستور goto استفاده نمي كند ، در عوض از دستورهاي break , continue در مواقع نياز استفاده مي كند .

جاوا از سر فايل ها(header files) استفاده نمي كند و پردازشگر C را هم حذف كرده است . به اين دليل كه جاوا يك زبان شي گرا است ، ساختار هاي C مثل struct , union از آن برداشته شده است . جاوا حتي بارگذاري مجدد و خواص چندگانه ارث بري از C++ را هم حذف كرده است . شايد مهمترين پارامتر ساده بودن جاوا عدم استفاده اين زبان از اشاره گر ها باشد . اشاره گر ها يكي از بيشترين موجوديت هاي دردسرساز در C , C++ هستند . چون جاوا ساختمان ندارد و آرايه ها و رشته ها اشياء آن هستند ، بنابراين احتياجي به اشاره گر نيست .جاوا به طور خودكار آدرس دهي و دستذسي به محتواي موجود در يك آدرس را براي شما انجام ميدهد .

جاوا حتي زباله هاي حافظه اي را هم به طور خودكار جمع آوري ميكند .(Garbage Collectin) (* جمع آوري آشغال فرايندي است براي ترميم خودكار حافظه انباشته شده . بلوك هايي از حافظه كه زماني به فايل ها اختصاص داشتند اما مدتي است كه از آنها استفاده نمي شود و بلوك هايي از حافظه كه هنوز مورد استفاده قرار ميگيرند ممكن است حركت داده شوند تا از به هم پيوستن فضاهاي خالي حافظه بلوك هاي خالي بزرگتري بدست آيد .

[ از كتاب : Microsoft computer dictionary] * ) بنابراين لازم نيست كه نسبت به موضوع مديريت حافظه نگران باشيد ، همه اينها شما را از نگراني در مورد اشاره گر هاي بي ارزش ، خطرناك و هرز هاي حافظه رها ميكنند . بنابر اين شما ميتوانيد وقت خود را صرف بهبود برنامه تان كنيد .

قدرتمند :Robust

جاوا براي نوشتن نرم افزارهاي قدرتمند و بسيار ايمن ساخته شده است . جاوا هنوز هم به طور قطع نرم افزار ها را تضمين نميكند . تقريبا هنوز هم امكان نوشتن برنامه هاي مشكل ساز در جاوا وجود دارد ، هرچند كه جاوا برخي از انواع مشخص خطاهاي برنامه نويسي را حذف كرده كه به طرز چشمگيري نوشتن نرم افزار هاي ايمن را آسان تر كرده است .

جاوا يك زبان تايپ شده قدرتمند است ،‌ كه اجازه چك شدن مشكلات و خطاهاي تايپي را در زمان كامپايل مي دهد . جاوا بسيار قويتر از C++ تايپ شده است كه بسياري از خصوصيات انعطاف پذير در زمان كامپايل را از C به ارث برده است . مخصوصا هنگام اعلان توابع .جاوا به مدل اعلان صريح احتياج دارد ، زيرا كه از مدل اعلان صريح C پشتيباني نميكند . اين مسئله مارا از اينكه كامپايلر ميتواند خطاهاي زمان اعلان را بدست آورد ، مطمئن ميكند . مسئله اي كه منجر به ايجاد برنامه هاي ايمن تري ميشود .

يكي از چيزهايي كه باعث شده كه جاوا ساده باشد عدم وجود اشاره گر ها ومحاسبات بر روي آنها است . اين ويژگي حتي قدرت جاوا را هم با از ميان بردن يك كلاس سراسري اشاره گر افزايش ميدهد .

به طور مشابه تمام دسترسي به آرايه ها و رشته ها در زمان اجرا چك مي شوند تا از قطعي بودن آنها اطمينان حاصل شود .با از بين بردن امكان دوباره نويسي حافظه و داده هاي هرزه ، تعويض نقش اشياء از نوعي به نوع ديگر هم در زمان اجرا كنترل ميشود تا از مجاز بودن آن اطمينان حاصل شود .

سرانجام زباله جمع كن خودكار جاوا بسياري از عمليات پاكسازي مرتبط با معماري حافظه را راه اندازي ميكند . چيزي كه از خطاهاي خطر ساز مرتبط با تخصيص و آزاد سازي حافظه جلوگيري ميكند .

ايمن : Secure

يكي از دلايل پرطرفدار بودن جاوا اين است كه يك زبان ايمن است . اين ويژگي مخصوصا به خاطر طبيعت توزيع شده ي آن بسيار مهم است .بدون وجود امنيت شما قطعا نميخواهيد كه يك كد را از يك سايت تصادفي اينترنت بارگذاري كنيد و به آن اجازه اجرا شدن روي كامپيوتر خودتان را هم بدهيد . اين دقيقا همان چيزي است كه مردم هرروز با يك كد جاوا انجام ميدهند . جاوا به صورت ايمن طراحي شده و چندين لايه كنترل امنيت به وجود مي آورد كه شما را در برابر كد هاي خطرساز محافظت مي كنند و به كاربر اجازه ميدهد كه برنامه هاي ناشناخته را با خيال راحت اجرا كند .

همان طور كه ديديم ، برنامه جاوا نميتواند اشاره گر ها را به حافظه يا آرايه هاي سرريز يا حافظه خواندني خارج از محدوده يك آرايه يا رشته اشاره ، اشاره دهد. اين خصوصيت يكي از اصلي ترين وسايل دفاع جاوا در برابر كدهاي خطرساز است . دومين راه دفاع در برابر كد هاي خطرساز ، پردازش كدهاي بايتي به صورت قابل تصديق و تاييد است كه مفسر جاوا به روي هر كدي كه در حال بار گذاري باشد اعمال ميكند . اين مراحل تاييد از اينكه كد به صورت درستي ساخته شده اطمينان حاصل ميكنند ، كه براي مثال پشته سرريزي يا زيرريزي نداشته باشد ، يا شامل كد هاي بايتي غير مجاز نباشد .

كدهاي بايتي خراب يا خطرساز ممكن است از ضعف هاي اجرايي در مفسر جاوا سوء‌ استفاده كنند . لايه اي كه در اينجا ما را به طور ايمن محافظت ميكند ، مدل جعبه شني (Sand box) است : كدهاي ناشناخته در يك جعبه شني قرار ميگيرند جايي كه ميتوانند به صورت ايمن اجرا شوند ، بدون اينكه هيچ صدمه اي به بقيه اجزاء يا محيط جاوا بزنند .

وقتي يك برنامه كاربردي يا ديگر كدهاي ناشناخته در جعبه شني در حال اجرا است ،‌ چند محدوديت در مورد كاري كه ميتواند انجام دهد ، وجود دارد . واضح ترين اين محدوديت ها اين است كه هيچ دسترسي به هيچ يك از فايل هاي محلي سيستم وجود ندارد . در جعبه شني محدوديت ديگري هم وجود دارد كه به وسيله كلاس مديريت امنيت اعمال ميشود . اين مدل در ابتدا از اينكه سيستم هاي امنيتي را نصب كرده ايد يا نه ، مطمئن ميشود ، چرا كه همه كلاس هاي جاوا نياز به عمليات حساسي مانند دسترسي به سيستم فايل را دارند . اگر فراخواني به وسيله يك كد ناشناخته به صورت مستقيم يا غير مستقيم انجام شد ،‌ مدير امنيت مورد استثناء‌ را مي فرستد و عمليات صورت نمي گيرد .

و سرانجام در جاوا 1-1 يك راه حل ممكن ديگر براي مشكلات امنيتي وجود دارد ، به وسيله ضميمه كردن يك امضاء ديجيتالي به كد جاوا كه اصل آن كد ميتواند به صورت پنهاني و نهفته ساخته شود . اگر شما اعتماد خود را به يك شخص يا يك سازمان مشخص كرده باشيد ، كدي كه امضاء آن هويت مورد اعتماد روي آن قرار دارد ،‌ ايمن و مطمئن است . حتي زمانيكه در حال بارگذاري شدن در شبكه است و ممكن است حتي بدون جلوگيري توسط جعبه شني اجرا شود .

عملكرد سطح بالا :High Performance

جاوا يك زبان تفسير شده است ، بنابر اين هرگز به سرعت زبان كامپايل شده اي مثل C نخواهد بود . گفته ميشود كه جاوا 0-1 به اندازه 20 برابر از C كند تر است . جاوا 1-1 تقريبا سرعتي دو برابر جاوا 1-1 دارد . بنابراين ممكن است عاقلانه باشد اينكه بگوييم كد C كامپايل شده 10 برابر سريع تر از كد هاي تفسير شده ي جاوا اجرا ميشود . اما قبل از اينكه به خاطر اين موضوع مايوس شويد ، آگاه باشيد كه اين سرعت بيشتر از آن چيزي است كه براي برنامه هاي پرسرعت ، كاربردهاي GUI (Graphical User Interface ) ، برنامه هاي برمبناي شبكه ، جايي كه برنامه كاربردي معمولا آماده براي اجرا شدن است ، انتظار براي كاربر كه يك دستوري اعمال كند و يا انتظار براي دريافت از شبكه ، لازم است .

به علاوه قسمت هايي كه به سرعت هاي بالا نياز دارند ، كه كارهايي از قبيل الحاق رشته ها و مقايسه را انجام ميدهند ، با كد محلي جاوا اجرا ميشوند .

علاوه بر اين كارايي ، بسياري از مفسر هاي جاوا اكنون شامل كامپايلر هاي فقط در زمان " just in time " نيز هستند كه ميتواند كدهاي بايتي جاوا را براي هر نوعCPU در زمان اجرا به كد ماشين ترجمه كند . فرمت كد بايتي جاوا با اين كامپايلر هاي در زمان در مركز كافي و مناسب است و انصافا كدهاي خوبي توليد ميكند . در حقيقت Sun ادعا ميكند كه كارايي كد هاي بايتي كه به كد ماشين تبديل شده اند ، تقريبا به خوبي كارآيي آن در C و C++ است .

اگر شما خواهان اين هستيد كه قابل حمل بودن كد ها را قرباني بهبود در سرعت آن كنيد ، ميتوانيد بخش قابل توجهي از برنامه خود را در C و C++ بنويسيد و از روش هاي مخصوص جاوا براي مشترك كردن با اين كد محلي جاوا استفاده كنيد .

چند نخ كشي شده :Multitbreaded

در يك برنامه كاربردي بر مبناي GUI شبكه اي ، مثل مرورگر وب ، تصور اينكه چند چيز بتوانند به طور همزمان اجرا شوند ، آسان است . يك كاربر ميتواند همزمان با اينكه دارد يك صفحه وب را ميخواند به يك كليپ صوتي گوش دهد و همزمان در پس زمينه مرورگر يك عكس را بارگذاري كند .

جاوا يك زبان چندنخ كشي شده است ، كه از چندين رشته اجرايي (گاهي پردازش سبك وزن خوانده ميشود) پشتيباني ميكند و ميتواند چندين كار را انجام دهد . يكي از مزيت هاي چندنخ كشي شده اين است كه عملكرد سطح بالايي براي كاربردهاي گرافيكي براي كاربر فراهم ميكند .

اگر شما سعي كرده ايد كه با نخ ها در C و C++ كار كنيد ، ميدانيد كه كمي مشكل است . جاوا برنامه نويسي با نخ ها را بسيار آسان تر كرده است ، با به وجود آوردن زبان درون ساخته شده اي كه از نخ ها پشتيباني ميكند . بسته jana.lang يك كلاس بوجود آورده است كه از روش هايي براي شروع و پايان يك نخ ، و مرتب كردن ترتيب گره ها در ميان چيز هاي ديگر ، پشتيباني ميكند .

حتي دستورات زبان جاوا از نخ ها پشتيباني ميكنند ، كه با استفاده از كلمات كليدي مطابق شده . اين كلمات كليدي علامت گذاري بخش هاي كد يا تمامي روش هايي را كه بايد فقط با يك نخ در يك زمان اجرا شوند را به شدت آسان كرده است .

به دليل اينكه جاوا استفاده از نخ ها را بسيار ساده ميكند ، كلاس جاوا در شماري از جاها از اين نخ ها استفاده ميكند . براي مثال هر برنامه كاربردي كه انيميشن اجرا ميكند ، از نخ ها استفاده كرده است .

به طور مشابه جاوا از برنامه هاي نا همگام ، ورودي ها و خروجي هاي بلاك نشده با اخطاري به وسيله سيگنال ها يا وقفه ها پشتيباني نميكند ، در اين صورت شما بايد يك نخ بسازيد كه روي هر كانال ورودي خروجي كه با آن كار ميكنيد بلاك شده باشد .

هاله مردانیان

ترجمه شده از كتاب : JAVA IN A NUTSHELL

By: O' Reilly
لينک مقاله
http://www.macromediax.com :منبع

مقالات مرتبط با اين موضوع
بنيادهاي كلاس java | java
دستورات انتخاب در جاوا | java
استفاده از پرانتزها | java
عملگر ? | java
عملگر انتساب The Assignment Operator | java
عملگرهاي منطقي بولي Boolean | java
عملگرهاي رابطه اي | java
عملگرها ی ریاضی و بیتی | java
اولين برنامه ساده java | java
آرايه ها در جاوا | java
متغيرها و اعمال روی آنها | java
انواع اعداد اعشاري جاوا | java
آموزش جاوا - integers ( اعداد صحيح ) | java
جاوا را بشناسیم | java

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


آموزش زبان صفحات وب HTML

مقدمه :

همانطور كه ميدانيد صفحات وب صفحاتي هستند كه در اينترنت به كاربرده مي شوند.HTML يك زبان برنامه نويسي براي طراحي صفحات وب مي باشد. در حقيقت تمامي صفحات وب با اين زبان برنامه نويسي نوشته ميشوند. كلمه HTML مخفف كلمات Hyper Text Markup Language است.زبان برنامه نويسي HTML به شما توانايي فرمت متن ، اضافه كردن تصوير ، صدا و ويدئو و ... را در صفحات اينترنتي ميدهد.

تگها در HTML :

تگ در زبان برنامه نويسي HTML به كليدهاي مربوط به برنامه نويسي توسط HTML گفته ميشود تگها داخل دو علامت كوچكتر "<" و بزرگتر ">" قرار مي گيرند.

تگها در HTML به سه صورت مورد استفاده قرار مي گيرند دسته اول اين تگها تگهايي هستند كه به سادگي در هر جايي نوشته ميشوند مانند تگ <HR> كه باعث رسم خط ميشود.

مثال :

<html>

<body>

welcome to our website

<HR>

</body>

</html>

دسته دوم تگهايي هستند كه بايد ابتدا و انتهاي مشخصي داشته باشند مثلا اگر تگ <B> در قسمتي از كد HTML مورد استفاده قرار گرفت ، بايد انتهاي اين تگ توسط </B> مشخص گردد توجه نماييد متني كه بين اين دو تگ قرار ميگيرد درشت نشان داده ميشود.

مثال:

<html>

<body>

<b>Welcome to our website</b>

</body>

</html>

دسته سوم تگهايي هستند كه ضمن آنكه بايد ابتدا و انتهاي مشخصي داشته باشند شامل چند پارامتر نيز مي باشند. به عنوان مثال تگ FONT :

<Font Face="Arial"></Font>

در مثال بالا نام تگ FONT ميباشد و Face از پارامترهاي اين تگ است."Arial" هم مقدار انتخاب شده براي پارامتر Face است.

مثال :

<html>

<body>

<font face="arial" size=12>

<b>welcome to our website</b>

</body>

</html>

در درسهاي آينده با انواع بيشتر تگها آشنا خواهيد شد.

ويرايشگر HTML:

براي ويرايش يا ايجاد صفحات وب ساده ترين برنامه ممكن برنامه Notepad ويندوز است البته برنامه هاي ديگري نظير Frontpage نيز وجود دارند ولي براي آغاز كار استفاده از Notepad ميتواند بهتر باشد. بايد توجه داشته باشيد كه پس از نوشتن كدهاي HTML در داخل برنامه Notepad در آخر بايد آنها را با پسوندهاي *.htm - *.html ذخيره نماييد.

ساختار صفحات وب :

يك صفحه وب شامل دو بخش كلي سر و بدنه ميباشد در قسمت سر يا <Head> تيتر صفحه وب كه در كاوشگر اينترنت نمايش داده ميشود نوشته ميشود همچنين در اين قسمت علاوه بر تيتر صفحه فرمتها و اسكريپتهاي برنامه نويسي نيز نوشته ميشوند.

اما در بخش بدنه يا <Body> قسمتي كه توسط بينندگان صفحه مشاهده مي گردد نوشته مي شود . اگر متني در اين قسمت نوشته شود توسط كاوشگر اينترنت نشان داده خواهد شد.

مثال :

<Html>

<head>

</Head>

<Body>

</Body>

</Html>

ايجاد يك فايل HTML :

براي ايجاد يك فايل HTML شما بايد در ابتدا ، ابتدا و انتهاي آنرا مشخص نماييد. براي اين كار از دو تگ <html></html> استفاده مي گردد. بقيه كدها و عبارات HTML‌ بايد داخل اين دو تگ قرار گيرد.

براي مشخص كردن قسمت سر فايل از دو تگ <Head></Head> استفاده مي گردد كه اين دوتگ بايد بين دو تگ قبلي قرار گيرد.

و در نهايت براي مشخص كردن قسمت بدنه از دو تگ <Body></Body> استفده مي گردد. با استفاده از اين تگ ميتوان مشخصات ظاهر صفحه وب مانند رنگ متن ، رنگ زمينه و ... انتخاب نمود.

پارامترهاي تگ <Body> :

اين تگ جزء دسته سوم تگها ميباشد يعني علاوه بر مشخص بودن آغاز و پايان داراي چند پارامتر نيز مي باشد يكي از اين پارامترها پارامتر TEXT مي باشد كه با استفاده از آن شما مي توانيد رنگ متن صفحه را تعيين نماييد پارامتر ديگر اين تگ پارامتر BGColor است با استفاده از اين پارامتر شما ميتوانيد رنگ زمينه را مشخص نماييد.

مثال:در مثال زير ما يك فايل HTML ايجاد كرده ايم و همانطور كه مي بينيد براي تگ Body پرامترهايي نيز قرار داده ايم.

<html>

<head>

</head>

<body text=white bgcolor=black>

</body>

</html>

تگ <Title> :

هر كدام از صفحات وب مي توانند يك تيتر داشته باشند.كه اين تيتر در قسمت نوار عنوان كاوشگر اينترنت نشان داده مي شود.براي ايجاد تيتر صفحه وب از تگ <Title> استفاده ميشود اين تگ بين دو تگ <head></head> قرار داده مي شود.

مثال:

<html>

<head>

<Title>Computer Site</Title>

</head>

<Body>

</Body>

</Html>

نويسنده : فرهاد شريفيان

لينک مقاله
http://dev.ir :منبع

مقالات مرتبط با اين موضوع
دریم ویور : رویاباف طراحان وب | html
سایت خود را مطابق تکنولوژی جستجوگر ها طراحی کنید | html
متاتگ چیست ؟ | html
نمايش عكسي به دنبال نشانگر ماوس | html
تگ Anchor و شناسه href | html
دو نکته بسيار مهم در مورد فارسی نويسی | html
تگ های اچتمل | html
مقده اي بر وب و زبان html | html
قرار دادن تصوير در صفحات و کد جدول | html
معرفي تگ هاي اوليه در اچ تي ام ال | html
آموزش زبان صفحات وب HTML | html

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


معرفي تگ هاي اوليه در اچ تي ام ال

تگ <BR> :

این تگ در زبان برنامه نویسی HTML مانند کلید ENTER عمل میکند یعنی باعث میشود که متن یا هر چیز دیگری به سطر بعد منتقل شود.به مثال زیر توجه نمایید.

<Html>

<Body>

Welcome to our WebSite<BR>

Thank you for this visit <BR>

</Body>

</Html>

تگ <CENTER> :

این تگ موجب این میشود که متن یا موارد دیگر برنامه نویسی مانند تصاویر ، کلیدها و ... در وسط صفحه قرار گیرد برای درک بهتر این موضوع به مثال زیر توجه نمایید.

<Html>

<Body>

<Center>

Welcome to our website

</Center>

</Body>

</Html>

تگ <IMG> :

میتوان گفت که این تگ یکی از تگهای پرکاربرد میباشد از این تگ به منظور قرار دادن تصاویر در صفحه وب استفاده میشود.این تگ دارای پارامترهای بسیاری میباشد که برای بهتر عمل کردن این تگ مورد استفاده قرار می گیرند.

اولین پارامتر این تگ پارامتر Src میباشد که محل قرار گیری آدرس فایل تصویری میباشد.

<Img Src="/Image/Cat.jpg">

پارامتر دیگر این Border میباشد . بوسیله این پارامتر میتوان حاشیه دور تصویر موردنظر را تنظیم نمود.در مثال زیر N مقدار یک عدد دلخواه شما میباشد.

<Img Src="/Image/Cat.jpg" Border=N>

و در نهایت بوسیله پارامترهای Width و Height میتوان طول و عرض تصویر را تنظیم نمود.در مثال زیر N مقدار عدد دلخواه شما برای تنظیم تصویر میباشد.

<Img Src="/Image/Cat.jpg" Border=N Width=N Height=N>

یک مثال کلی :

<Html>

<Body>

<Center>

Welcome to our Website<BR><BR>

<Img Src="/Image/1.Gif " Border=2 width=200 height=200>

</Center>

</Body>

</Html>

تگ <A> :

از این تگ برای ایجاد ÷یوند یا همان لینک در صفحات وب استفاده میشود.بوسیله پیوندها یا همان لینکها میتوان به صفحات دیگر رفت و یا کارهای دیگری را انجام داد. به مثال زیر توجه نمایید.بوسیله کد زیر شما یک پیوند ایجاد میکنید در قسمت مقابل پارامتر Herf آدرس فایل مقصد یا هر چیز دیگر نوشته میشود و در قسمت بعد همانطور که میبینید متن پیوند نوشته میشود.

<A Herf="/Html/Contact.asp> Click Here </A>

نویسنده : فرهاد شریفیان
لينک مقاله
http://html1985.blogfa.com :منبع

مقالات مرتبط با اين موضوع
دریم ویور : رویاباف طراحان وب | html
سایت خود را مطابق تکنولوژی جستجوگر ها طراحی کنید | html
متاتگ چیست ؟ | html
نمايش عكسي به دنبال نشانگر ماوس | html
تگ Anchor و شناسه href | html
دو نکته بسيار مهم در مورد فارسی نويسی | html
تگ های اچتمل | html
مقده اي بر وب و زبان html | html
قرار دادن تصوير در صفحات و کد جدول | html
معرفي تگ هاي اوليه در اچ تي ام ال | html
آموزش زبان صفحات وب HTML | html

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security


قرار دادن تصوير در صفحات و کد جدول

پیوند دادن یک تصویر:

امروز یک کدی رو به شما معرفی کنم که بوسیله اون میتونید از ترکیب کردن دو تگ <A> و <IMG> برای یک تصویر ÷یوند ایجاد کنید یعنی با کلیک کردن روی تصویر به صفحه دلخواه برید یا کار دلخواه خودتون رو انجام بدید.

<A Herf="/html/about.htm"><Img Src="/image/01.gif"></A>

اگر کد بالا رو درون طراحی خودتون قرار بدید و آدرس صفحه و همچنین آدرس تصویر رو درست تنظیم بکنید تصویری که انتخاب کردید به یک لینک تصویری تبدیل میشه.

تگ <Table> :

این تگ یکی از مهمترین تگهای زبان HTML میباشد که بوسیله این تگ و پارامترهایی که داره شما میتونید در صفحات وب خودتون جدول نیز رسم کنید.ابتدا تگ و پارامترهاش رو معرفی میکنم بعد یک مثال میزنم.

حالت کلی:

<Table>

</Table>

پارامترها :

از پارامتر اول جهت رسم ردیف استفاده میشود و از پارامتر دوم جهت رسم یک ستون مورد استفاده قرار می گیرد.

پرامتر سوم مشخص میکند که خطهای جدول چه مقدار ضخامتی داشته باشند که N برابر با یک عدد میشود.

نهایت پارامترچهارم برای تعیین اندازه سطر یا ستونهای جدول استفاده میشود.

در نهایت پارامتر آخر جهت قرار دادن جدول در یک سمت از صفحه نمایش مورد استفاده قرار میگیرد.

<TR></TR>

<TD></TD>

Border = N

Width – Heigh

Align = "Left – Right – Center"

یک مثال کلی :

<Html>

<Body>

<center><h1><b>Create The table</Center></b></h1><Br>

<"Table border=1 align="center>

<Tr>

<td>Part-1</td>

<Td>Click</Td>

<Td>Register</Td>

</Tr>

<Tr>

<td>Part-2</td>

<Td>Click</Td>

<Td>Register</Td>

</Tr>

<Tr>

<td>Part-3</td>

<Td>Click</Td>

<Td>Register</Td>

</Tr>

<Tr>

<Td>Part-4</tdT

<Td>Click</Td>

<Td>Register</Td>

</Tr>

<Table/>

</Body>

</Html>

در این قسمت شما با یکی دیگه از تگهای زبان HTML آشنا شدید که کار اون رسم جدول بود که فکر کنم خیلی در طراحی صفحات وب کاربرد داشته باشه.فکر کنم طریقه دیدن مثال بالا رو هم بلد باشید.اول اون رو تو محیط NOTEPAD کپی کنید بعد اون رو با پسوند *.HTM ذخیره کنید بعدش هم ببینید.
لينک مقاله
http://HTML1985.blogfa.com :منبع

مقالات مرتبط با اين موضوع
دریم ویور : رویاباف طراحان وب | html
سایت خود را مطابق تکنولوژی جستجوگر ها طراحی کنید | html
متاتگ چیست ؟ | html
نمايش عكسي به دنبال نشانگر ماوس | html
تگ Anchor و شناسه href | html
دو نکته بسيار مهم در مورد فارسی نويسی | html
تگ های اچتمل | html
مقده اي بر وب و زبان html | html
قرار دادن تصوير در صفحات و کد جدول | html
معرفي تگ هاي اوليه در اچ تي ام ال | html
آموزش زبان صفحات وب HTML | html

کتابخانه مقالات

ASP

ASP.net

PHP

ColdFusion

XML

HTML

CSS

JavaScript

ActionScript

Visual Basic

VB.net

C / C++ / VC++

C#

Pascal

Delphi

JAVA

SQL Server

Access

ADO / ADO.net

Security