404: Location Cannot Be Found

MSDN
Search Microsoft.com for:
Home > Location Cannot Be Found

Location Cannot Be Found

We apologize for the inconvenience, but the location you are seeking cannot be found. If you are looking for a particular document, please try one of the following areas:

MSDN Visual Studio 2005 Information

  • Visual Studio 2005 Developer Center
  • Express Product Family Home Page
  • Visual Studio 2005 Beta Documentation
  • Product Feedback Center
  • Search MSDN Visual Studio 2005 Content

General MSDN Information

  • MSDN Library
  • Serach All Of MSDN With Advanced Search

MSDN Developer Centers

  • Longhorn Developer Center
  • Mobile and Embedded Applications Developer Center
  • Office Developer Center
  • Security Developer Center
  • Visual Basic Developer Center
  • Visual C++ Developer Center
  • Visual C# Developer Center
  • Visual Studio Developer Center
  • Web Services Developer Center
Top of Page Top of Page

Manage Your Profile |Legal |Contact Us |MSDN Flash Newsletter
©2005 Microsoft Corporation. All rights reserved. Terms of Use |Privacy Statement
 Microsoft


MSDN Product Feedback Center
Sign in with your .NET Passport

Product Feedback Home
Search for Suggestion/Bug
Help
FAQ

Suggestion Details: Iran Localization Info for Microsoft .NET Framework (CultureInfo for fa-IR)

Voting (7 voters)
Average voter rating: 4.29
Vote on this suggestion
Workarounds
1 workarounds posted
Post a workaround
Tracking
Sign in to enable suggestion tracking

Suggestion ID: | FDBK17288
Problem Type: | Suggestion
Status: | Closed
Resolution: | Won't Fix
Microsoft Status: | Reviewed
Opened Date: | 2004-10-30 04:54:22
Opened By: | not half buff

Product/Technology: | .NET Framework
Version: | Visual Studio 2005 Beta 1
Product Language: | English
Category: | Globalization & Localization
OS: | Windows XP Professional
OS Language: | US English
Submission Language: | English
Problem Statement:
Opened by not half buff on 2004-10-30 at 04:54:22
 | There is a lot of mistakes in the locale information of "fa-IR" outputted by ‎the CultureInfo class.
Resolved as Won't Fix by Microsoft on 2004-11-01 at 14:55:22
 | We've already updated some culture data. We can't do the calendar for Whidbey. Any other remaining discrepencies can be overridden by the user by using Whidbey's Custom Cultures feature. (See CultureAndRegionInfoBuilder.) Thanks for the feedback!
Edited by Microsoft on 2004-11-01 at 18:06:33
 | Updated MS reply : Thank you for this information. As it turns out, we had already updated several properties, including the values for EnglishName, DisplayName and Nativename. Those changes should be visible in Beta2. In terms of calendar support, there is a Jalaali converter-calendar in Whidbey. Unfortunately, we aren’t unable to add full Jalaali calendar support (including parsing as well as formatting) in Whidbey. However, we are tracking this request for possible inclusion in a later release. We also encourage you to take a look at another Whidbey feature, custom cultures (CultureAndRegionInfoBuilder API), which enables one to tailor a culture definition. Many thanks for the feedback.
Edited by not half buff on 2005-02-04 at 13:58:24
 | Isn't it better that the user receives the correct cultural properties as default instead of having to override them himself?<BR/><BR/>Please take a look at the Number Format Info, DateTime Format Info, and DateTime Naming and Patterns sections in the following draft and update your data as much as possible, since all these data will surely be reflected on Windows regional settings and that would affect a lot of people. Thank you.
Proposed Solution: We prepared a draft of the correct information for this ‎locale. We hope Microsoft takes it into consideration for the next releases.

Please follow the link:
http://www.idevcenter.com/projects/iranl10ninfo/draft

Thank you,
Omid K. Rad
Attachments:
Workarounds:
  • FDBK17288#1: Solve problem
    • Benefits: Faster Development
    Improved Reliability
    Improved User Interface
    Primary:
    Duplicates:

    ©2005 Microsoft Corporation. All rights reserved. Terms of Use | Privacy Statement


iDevCenter
Softtool

روش پیاده‌سازی برنامه نویسی فوق العاده
XPDM روشی است بر اساس متدلوژی XP که توجه زیادی به مسائل مهم کاربردهای تجارت الکترونیک دارد و راهکارهای سریع و بهینه‌ای برای تغییرات محیط‌های تجاری ارائه می‌نماید.

مقالات RSS
  • روش پیاده‌سازی برنامه نویسی فوق العاده
    XPDM روشی است بر اساس متدلوژی XP که توجه زیادی به مسائل مهم کاربردهای تجارت الکترونیک دارد و راهکارهای سریع و بهینه‌ای برای تغییرات محیط‌های تجاری ارائه می‌نماید.
  • برنامه نویسی شیئ گرا در VB.NET
    این مقاله به شما کمک می‌کند تا با مفاهیم پایه‌ای برنامه نویسی شیئ گرا مانند کلاسها، اشیاء، اینترفیس‌ها، چند ریختی و وراثت و همچنین چگونگی استفاده از آشنا شوید.
  • ده نکته برای افزایش سرعت بارگزاری صفحات وب
    افزایش سرعت بارگزاری صفحات یکی از روش‌های موثر برای جلب رضایت بازدیدکنندگان یک سایت است که در این مقاله با 10 نکته برای انجام این کار آشنا خواهید شد.
  • بررسی معماری Applet-to-Servlet در جاوا
    در این مقاله پس از معرفی Appletها و Servletها، چندین معماری Applet-to-Servlet بررسی می‌شود.
  • نحوه ایجاد یک Wizard برای Visual Studio .NET
    در این مقاله با نحوه ساخت یک Wizard برای Visual Studio .NET توسط VB.NET آشنا خواهید شد.

همه مقالات »
یک نکته RSS
  • بدست آوردن نام جدول‌های یک دیتابیس Access

همه نکته‌ها »
مقالات دیگر سایتها RSS
  • آشنایی با انواع جداول موجود در MySQL
  • اصول طراحی پایگاه‌های اطلاعاتی
  • کدنویسی استاندارد در PHP
  • مقدمه‌ای بر توسعه وب توسط MySQL ،Apache و PHP
  • نگاهی به الگوریتم RSA (قسمت دوم)
  • نگاهی به الگوریتم RSA (قسمت اول)
  • ایجاد Watermark محو روی تصاویر
  • عکسهای سایه دار و CSS
  • تابع ()Mail در PHP
  • استانداردهای وب: Width در مرورگرهای مختلف

همه مقالات »

زمینه‌ها

جهت مشاهده تمام مطالب سایت درباره یک موضوع خاص، یک زمینه را انتخاب کنید:

  • .NET
  • ASP.NET
  • C#
  • VB.NET
  • ADO.NET
  • Visual Basic
  • DirectX
  • Delphi
  • PHP
  • Java
  • Databases
  • HTML/CSS
  • XML
  • Misc
جستجوگر iDevCenter.com را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in
Powered by ASP.JET تمام حقوق برای سایت iDevCenter.com محفوظ است.
XHTML | CSS | Copyright 2002-2005


iDevCenter - مقالات

Softtool

مقالات

این بخش شامل مقالاتی در مورد موضوعات گوناگون برنامه‌نویسی و طراحی وب است که تماما" توسط اعضای سایت تهیه و ارسال شده است. شما نیز می‌توانید مطالب خود را برای این بخش ارسال کنید و دانش خود را با دیگران سهیم شوید.

عنوان | مشاهده | تاریخ
روش پیاده‌سازی برنامه نویسی فوق العاده | 1,523 | 1384-04-05
XPDM روشی است بر اساس متدلوژی XP که توجه زیادی به مسائل مهم کاربردهای تجارت الکترونیک دارد و راهکارهای سریع و بهینه‌ای برای تغییرات محیط‌های تجاری ارائه می‌نماید.
برنامه نویسی شیئ گرا در VB.NET | 1,765 | 1384-03-20
این مقاله به شما کمک می‌کند تا با مفاهیم پایه‌ای برنامه نویسی شیئ گرا مانند کلاسها، اشیاء، اینترفیس‌ها، چند ریختی و وراثت و همچنین چگونگی استفاده از آشنا شوید.
ده نکته برای افزایش سرعت بارگزاری صفحات وب | 9,272 | 1383-06-20
افزایش سرعت بارگزاری صفحات یکی از روش‌های موثر برای جلب رضایت بازدیدکنندگان یک سایت است که در این مقاله با 10 نکته برای انجام این کار آشنا خواهید شد.
بررسی معماری Applet-to-Servlet در جاوا | 3,192 | 1383-05-22
در این مقاله پس از معرفی Appletها و Servletها، چندین معماری Applet-to-Servlet بررسی می‌شود.
نحوه ایجاد یک Wizard برای Visual Studio .NET | 3,207 | 1383-05-10
در این مقاله با نحوه ساخت یک Wizard برای Visual Studio .NET توسط VB.NET آشنا خواهید شد.
چگونه یک سیستم عضوگیری ساده توسط PHP بسازیم؟ | 5,862 | 1383-04-18
در این مقاله شما طرز ساختن یک سیستم عضویت ساده (Membership Sytem) برای وب سایتتان بوسیله PHP و MySQL را یاد خواهید گرفت.
بدست آوردن اطلاعاتی محیطی از سیستم در VB.NET | 3,674 | 1383-03-05
در این مقاله روش بدست آوردن اطلاعات محیطی از سیستم مانند نام کاربر، نام کامپیوتر، اندازه آیکون‌ها، تعداد مانیتور، اندازه قاب پنجره، درایوهای موجود و آدرس پوشه‌های مخصوص سیستم در زبان Visual Basic .NET بررسی می‌شود.
چگونگی ارسال ایمیل در PHP | 6,712 | 1383-01-15
در این مقاله با تابع Mail در PHP آشنا شده و روش ارسال یک ایمیل از طریق آن را یاد خواهید گرفت.
آشنایی با شیئ پرینتر در ویژوال بیسیک | 4,193 | 1382-12-20
شیئ پرینتر، شیی است که پرینتر پیش فرض سیستم را کنترل می‌کند. در این مقاله با برخی از خواص و متدهای این شیئ آشنا خواهید شد.
توابع ریاضی در ویژوال بیسیک | 7,896 | 1382-12-08
ویژوال بیسیک 6 دارای مجموعه‌ای از توابع است که برای انجام محاسبات عددی پیش بینی شده اند. در این مقاله ابتدا با این توابع آشنا شده و سپس چگونگی ایجاد سایر توابع ریاضی را یاد خواهید گرفت.
بررسی رکوردها در دلفی | 4,937 | 1382-11-29
در این مقاله به مبحث رکوردها در دلفی و چگونگی ساخت و استفاده از آنها می‌پردازیم.
NET. به جای API: یک مثال کاربردی | 3,546 | 1382-11-20
در این مقاله سعی شده تا با یک مثال پرکاربرد، امکانات NET Framework. در مقابل توابع API بررسی گردد.
ساخت یک Screen Saver در VB.NET | 4,874 | 1382-11-14
Screen Saverها یکی از جذاب ترین و سرگرم کننده ترین برنامه‌های کامپیوتری هستند که از تاریخچه‌ای طولانی برخوردار هستند. در این مقاله نحوه ساخت یک محافظ صفحه نمایش ساده با زبان Visual Basic .NET توضیح داده میشود.
باز کردن پنجره Popup در ASP.NET با استفاده از Code Behind | 3,935 | 1382-11-12
قطعا در بسیاری از Applicationها برای شما مواردی پیش آمده است که نیاز داشته‌اید صفحه‌ای خاص را در یک پنجره Popup باز کنید. اما آیا راهی برای انجام این کار با استفاده از کدنویسی در Code Behind وجود دارد؟ پاسخ مثبت است.
عمومی سازی و بومی سازی در جاوا | 3,935 | 1382-10-21
در این مقاله دو مبحث عمومی سازی (Internationalization) و بومی سازی (Localization) در جاوا مورد برررسی قرار می‌گیرد.
دستیابی به رجیستری در VB.NET | 4,151 | 1382-09-15
احتمالا تاکنون مطالب زیادی در مورد رجیستری ویندوز شنیده‌اید. اما آیا تابحال فکر کرده‌اید که چگونه میتوانید از این ویژگی ویندوز در برنامه‌های خودتان استفاده کنید؟
بررسی توابع مدیریت رشته‌ها در ویژوال بیسیک | 4,168 | 1382-08-13
در این مقاله توابعی که در کار با رشته‌ها (Strings) در ویژوال بیسیک می‌توان از آنها استفاده کرد بهمراه مثال‌هایی از کاربرد هر تابع معرفی شده است.
بررسی شیئ DataView در ASP.NET | 2,488 | 1382-08-03
در این مقاله سعی شده به اختصار درباره خصوصیتها، متدها و نحوه کار با شیئ DataView اطلاعاتی ارائه شود.
ساختن فرم جمع آوری اطلاعات به صورت پویا بر پایه XML | 3,635 | 1382-07-18
در این مقاله به چگونگی ساخت یک فرم ویندوز جهت جمع آوری اطلاعات و قرار دادن کنترلها بر روی آن به صورت پویا از طریق یک فایل XML می‌پردازیم.
حفظ وضعیت فرمهای وب هنگام استفاده از Server.Transfer | 2,415 | 1382-07-10
شاید شما هم این تصور غلط را داشته باشید که متد Server.Transfer نمیتواند برای ارسال وضعیت فرم به فرمی دیگر به کار رود! اما با اعمال مقداری تغییرات میتوان این کار را به آسانی انجام داد.

1 2 3 صفحه بعد »
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - مقالات

مقالات

این بخش شامل مقالاتی در مورد موضوعات گوناگون برنامه‌نویسی و طراحی وب است که تماما" توسط اعضای سایت تهیه و ارسال شده است. شما نیز می‌توانید مطالب خود را برای این بخش ارسال کنید و دانش خود را با دیگران سهیم شوید.

عنوان | مشاهده | تاریخ
نشان دادن تصاویر در DataGrid بر اساس داده‌های پایگاه داده | 3,770 | 1382-07-10
با استفاده از این مقاله خواهید توانست در کنترل‌های DataGrid خود علاوه بر متون و لینک‌ها تصاویر را نیز نمایش دهید.
نگاهی به فیلترهای CSS در HTML | 4,754 | 1382-07-04
یكی از امكانات جالبی كه CSS در اختیار ما میگذارد، خصوصیتی بنام Filter میباشد كه بوسیله آن میتوان به تصاویر و متن‌های درون صفحه وب افكتهای ویژه‌ای را اضافه كرد.
ذخیره کردن Connection String در فایل Web.Config | 2,871 | 1382-06-18
با استفاده از فایل Web.Config در ASP.NET میتوانید مقادیر عمومی مانند رشته اتصال (ConnectionString) را بین تمام صفحات خود به اشتراک بگذارید.
انواع روشهای انتقال مقادیر بین فرمهای وب در ASP.NET | 3,381 | 1382-06-18
در این مقاله با سه روش QueryString، متغیرهای Session و متد Server.Transform برای انتقال مقادیر بین فرم‌های وب آشنا خواهید شد.
برسی کوکی‌ها (Cookies) و جلسات (Sessions) در ASP.NET | 3,432 | 1382-06-12
در این مقاله با کوکی‌ها و جلسات آشنا شده و نحوه عمل و بکارگیری آنها در ASP.NET را یاد خواهید گرفت.
بدست آوردن مشخصات سیستم در VB.NET | 3,725 | 1382-06-05
این مقاله شامل ترفندهایی جهت بدست آوردن مشخصات سیستم مانند نام ماشین، ورژن سیستم عامل و همچنین کاربردهای آنهاست.
مدیریت حافظه در دلفی | 3,785 | 1382-05-27
گاهی مواقع شاید شما احتیاج داشته باشید خوتان مستقیما به حافطه دسترسی داشته باشید و آنرا کنترل کنید. در این مقاله نگاهی به مدیریت حافظه در دلفی و همچنین حافظه‌های Heap و Stack خواهیم داشت.
اضافه کردن تصویر به پایگاه داده | 4,291 | 1382-05-17
در این مقاله سعی بر آن است که توضیح کوتاهی در رابطه با اضافه کردن تصاویر به پایگاه داده SQL Server 2000 داده شود.
آرایه‌ها در دلفی | 2,551 | 1382-05-11
در این مقاله شما با ساختارهای مختلف آرایه‌ها، فضادهی آرایه‌های چند بعدی و فشرده سازی آرایه‌ها در پاسکال شیئ آشنا می‌شوید.
ایجاد کلاسی برای کار با فایلهای XML در ویژوال بیسیک | 2,679 | 1382-04-14
هدف از این مبحث ایجاد یک کلاس مقدماتی برای خواندن داده ها از فایلهای XML می باشد. توجه داشته باشید که کلاسی که در این بخش معرفی می شود کلاسی ساده می باشد که فقط با آن می توان مقدار یک گره (Node) از در فایل XML را خواند.
نكات مفید كار در محیط دلفی | 5,299 | 1382-03-17
شما هر چقدر كه با دلفی كار كرده باشید و برنامه نویسی حرفه‌ای باشید باز هم در این مقاله نكات جدیدی خواهید یافت كه كار شما را در كد نویسی و كار در محیط دلفی آسان خواهد كرد.
استفاده از +COM در ساخت صفحات ASP | 2,628 | 1382-03-09
در این مقاله با تکنولوژی +COM آشنا شده و روش بکارگیری این تکنولوژی در صفحات ASP را خواهید آموخت.
استفاده از اکتیوایکس‌های server-side در ساخت صفحات ASP | 3,274 | 1382-02-17
در این درس روش ایجاد کلاسهای ActiveX که بتوان از آنها در صفحات ASP استفاده نمود، آموزش داده می شود.
موارد استفاده از DataReader و DataSet در ASP.NET | 2,820 | 1382-02-17
شاید تا به حال بارها با این مسئله که در برنامه تحت وب نوشته شده خود با ASP.NET برای دستیابی به اطلاعات یک Database از DataSet استفاده کنید یا DataReader مواجه شده باشید. ولی براستی کدام انتخاب بهتر است؟
تاریخچه زبان دلفی | 5,780 | 1382-02-11
تاریخچه مختصری از زبان دلفی از زمان پیدایش تا دلفی 6 به تفکیک نسخه‌های مختلف آن.
ارسال ایمیل در ASP.NET با استفاده از HTML Template | 4,270 | 1382-01-30
شاید شما تاکنون مقالات بسیاری در خصوص ارسال Email در ASP.NET دیده باشید. ضعف اغلب این مقالات در این است که تنها به ذکر ساده ترین نوع ارسال Email بسنده میکنند. در این مقاله شما روش ساختن یک خبرنامه HTML ساده را خواهید آموخت.
جلوگیری از حملات SQL Injection در ASP.NET | 3,263 | 1382-01-22
در قسمت اول این مقاله به توضیح SQL Injection و نحوه مقابله با آن در ASP.NET و در پایگاه داده Access پرداخته می شود.
نشان دادن قابلیت‌های مرورگر در ASP.NET | 1,572 | 1382-01-05
در این مقاله با چگونگی تشخیص قابلیت‌های مرورگر توسط ASP.NET آشنا خواهید شد.
ارسال (Upload) فایل به سرور در ASP.NET | 3,086 | 1381-12-23
چگونگی ارسال فایل به سرور از طریق ASP.NET.
تغییر Hint برای هر ستون از DBGrid در دلفی | 3,102 | 1381-12-07
در DBGrid كار كردن بر روی هر سلول كاری مشكل و پردرد سر است چون انعطاف TGrid را ندارد. در این مقاله سعی کرده‌ام شما را با راه حل این مشل آشنا كنم.

« صفحه قبل 1 2 3 صفحه بعد »
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - مقالات

Softtool

مقالات

این بخش شامل مقالاتی در مورد موضوعات گوناگون برنامه‌نویسی و طراحی وب است که تماما" توسط اعضای سایت تهیه و ارسال شده است. شما نیز می‌توانید مطالب خود را برای این بخش ارسال کنید و دانش خود را با دیگران سهیم شوید.

عنوان | مشاهده | تاریخ
نحوه تهیه نسخه پشتیبان (Backup) در SQL Server 2000 | 2,969 | 1381-11-28
در این مقاله روشهای مختلف تهیه نسخه پشتیبان (Backup) و همچنین تعریف برنامه زمانبندی جهت Backup گیری اتوماتیک در زمانهای معین شرح داده شده است.
نمایش میزان كپی شدن فایل با ProgressBar در دلفی | 2,639 | 1381-11-24
شما در این روش ابتدا فایلی را باز كرده، اندازه آن را محاسبه و قسمت بندی می‌كنید و سپس با استفاده از آن میزان پیشرفت كار را نمایش می دهید.
نصب ProgressBar روی StatusBar در دلفی | 2,502 | 1381-11-24
گاهی اوقات علاقه داریم كه ProgressBar روی StatusBar قرارگیرد. مانند كاری كه در Internet Explorer انجام میشود. راههای مختلفی برای این كار وجود دارد اما شاید این روش یكی از ساده ترین آنها باشد.
استفاده از DLL‌ها در دلفی | 2,923 | 1381-11-08
برای استاندارد نمودن برنامه و استفاده بهینه از حافظه، استفاده از DLLها بصورت دینامیكی پیشنهاد می‌شود. در این خودآموز سعی شده در كمال سادگی مطلب عنوان شود.
محدودكردن تغییر اندازه فرم در دلفی | 2,173 | 1381-11-04
گاهی اوقات لازم است كه اندازه فرم بیش از حد مشخصی تغییر نكند؛ این یك پیشنهاد برای برطرف كردن این مشكل است.
استفاده از Microsoft Agent در ویژوال بیسیک | 3,291 | 1381-11-04
در این مقاله آموزشی من قصد دارم یك سری مطالب مختصر و مفید در مورد Microsoft Agent و همچنین طریقه كار كردن با آن را با استفاده از زبان VB برای شما توضیح بدم.
برنامه نویسی Direct3D در ویژوال بیسیک | 5,192 | 1381-10-20
راهنمای استفاده از کتابخانه Direct3D در ویژوال بیسیک برای ساخت برنامه های مالتی مدیا و بازیهای سه بعدی.
استفاده از Microsoft Agent در برنامه های خودتان | 7,119 | 1381-10-14
Microsoft Agent یکی از سرگرم کننده ترین فن آوریهای Microsoft می باشد که تا کنون توانسته بسیار مورد علاقه کاربران قرار بگیرد. Agentها به برنامه های شما جذابیت زیادی می دهند و امکان ارتباط بهتر و جالبتری را با کاربر ایجاد میکنند.
ارث بری فرم ویژوال در دلفی | 2,327 | 1381-10-05
اگر بتوانید در برنامه هایتان به طور گسترده از ارث بری فرم ویژوال (Visual Form Inheritance) استفاده کنید، مدت زمانی که صرف توسعهء نرم افزارتان می کنید کاهش یافته، ایرادات آن کمتر شده و رابط کاربر آن ظاهر پایدار و با ثبات تری پیدا می کند.
آشنائی با فرم‌های وب در ASP.NET | 5,687 | 1381-09-28
اگر مایل هستید از پایه با ASP.NET آشنا شوید و به طور عملی ساخت یک برنامه وب را تجربه کنید، این خودآموز بهترین راهنمای شما است.
آشنایی با کنترل DataGrid در ASP.NET | 2,099 | 1381-09-21
کنترل DataGrid یکی از پر استفاده‌ترین کنترل‌های دات نت است. در این مقاله به شرح امکانات این کنترل پرداخته میشود.
آشنایی با کنترل XML در ASP.NET | 2,324 | 1381-09-20
با استفاده از این کنترل، برای نمایش و استفاده از سندهای XML در سایت خود به هیچ چیز دیگری احتیاج نخواهید داشت.
ساخت یک برنامه نصب توسط InstallShield | 4,967 | 1381-09-08
هر برنامه‌ای به هر زبانی که نوشته شده باشد به یک برنامه نصب احتیاج دارد تا روی کامپیوترهای دیگر اجرا شود. در این مقاله نحوه ساخت یک برنامه نصب توسط InstallShield را یاد خواهید گرفت.
آیکونی برای سایت شما | 4,455 | 1381-09-08
با اضافه کردن یک آیکون به سایتتان برای نمایش در منوی Favorites میتوانید به سایت خود ظاهری حرفه‌ای‌تر ببخشید و توجه کاربران را به آن جلب کنید.
ایجاد تصاویر بصورت دینامیک در ASP.NET | 2,841 | 1381-09-08
اگر نیاز دارید برای سایت خود تصاویری را بصورت دینامیک ایجاد کنید، ASP.NET سریعترین و آسان‌ترین راه را برای شما فراهم کرده است.
ایجاد یک الگوی سفارشی برای Web Formها | 2,883 | 1381-09-08
با ایجاد یک الگو (Template) میتوانید زمان لازم برای ساخت یک سایت وب که دارای صفحات مشابه زیادی است را به حداقل برسانید.
استفاده از ظاهر جدید Windows XP در برنامه‌ها | 3,788 | 1381-09-08
با کمک این مقاله خواهید توانست از ظاهر جدید کنترل‌های Windows XP در برنامه‌های خود استفاده کنید.

« صفحه قبل 1 2 3
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - مقالات

Softtool

مقالات

این بخش شامل مقالاتی در مورد موضوعات گوناگون برنامه‌نویسی و طراحی وب است که تماما" توسط اعضای سایت تهیه و ارسال شده است. شما نیز می‌توانید مطالب خود را برای این بخش ارسال کنید و دانش خود را با دیگران سهیم شوید.

عنوان | مشاهده | تاریخ
روش پیاده‌سازی برنامه نویسی فوق العاده | 1,522 | 1384-04-05
XPDM روشی است بر اساس متدلوژی XP که توجه زیادی به مسائل مهم کاربردهای تجارت الکترونیک دارد و راهکارهای سریع و بهینه‌ای برای تغییرات محیط‌های تجاری ارائه می‌نماید.
برنامه نویسی شیئ گرا در VB.NET | 1,764 | 1384-03-20
این مقاله به شما کمک می‌کند تا با مفاهیم پایه‌ای برنامه نویسی شیئ گرا مانند کلاسها، اشیاء، اینترفیس‌ها، چند ریختی و وراثت و همچنین چگونگی استفاده از آشنا شوید.
ده نکته برای افزایش سرعت بارگزاری صفحات وب | 9,271 | 1383-06-20
افزایش سرعت بارگزاری صفحات یکی از روش‌های موثر برای جلب رضایت بازدیدکنندگان یک سایت است که در این مقاله با 10 نکته برای انجام این کار آشنا خواهید شد.
بررسی معماری Applet-to-Servlet در جاوا | 3,191 | 1383-05-22
در این مقاله پس از معرفی Appletها و Servletها، چندین معماری Applet-to-Servlet بررسی می‌شود.
نحوه ایجاد یک Wizard برای Visual Studio .NET | 3,206 | 1383-05-10
در این مقاله با نحوه ساخت یک Wizard برای Visual Studio .NET توسط VB.NET آشنا خواهید شد.
چگونه یک سیستم عضوگیری ساده توسط PHP بسازیم؟ | 5,861 | 1383-04-18
در این مقاله شما طرز ساختن یک سیستم عضویت ساده (Membership Sytem) برای وب سایتتان بوسیله PHP و MySQL را یاد خواهید گرفت.
بدست آوردن اطلاعاتی محیطی از سیستم در VB.NET | 3,673 | 1383-03-05
در این مقاله روش بدست آوردن اطلاعات محیطی از سیستم مانند نام کاربر، نام کامپیوتر، اندازه آیکون‌ها، تعداد مانیتور، اندازه قاب پنجره، درایوهای موجود و آدرس پوشه‌های مخصوص سیستم در زبان Visual Basic .NET بررسی می‌شود.
چگونگی ارسال ایمیل در PHP | 6,711 | 1383-01-15
در این مقاله با تابع Mail در PHP آشنا شده و روش ارسال یک ایمیل از طریق آن را یاد خواهید گرفت.
آشنایی با شیئ پرینتر در ویژوال بیسیک | 4,192 | 1382-12-20
شیئ پرینتر، شیی است که پرینتر پیش فرض سیستم را کنترل می‌کند. در این مقاله با برخی از خواص و متدهای این شیئ آشنا خواهید شد.
توابع ریاضی در ویژوال بیسیک | 7,895 | 1382-12-08
ویژوال بیسیک 6 دارای مجموعه‌ای از توابع است که برای انجام محاسبات عددی پیش بینی شده اند. در این مقاله ابتدا با این توابع آشنا شده و سپس چگونگی ایجاد سایر توابع ریاضی را یاد خواهید گرفت.
بررسی رکوردها در دلفی | 4,936 | 1382-11-29
در این مقاله به مبحث رکوردها در دلفی و چگونگی ساخت و استفاده از آنها می‌پردازیم.
NET. به جای API: یک مثال کاربردی | 3,545 | 1382-11-20
در این مقاله سعی شده تا با یک مثال پرکاربرد، امکانات NET Framework. در مقابل توابع API بررسی گردد.
ساخت یک Screen Saver در VB.NET | 4,873 | 1382-11-14
Screen Saverها یکی از جذاب ترین و سرگرم کننده ترین برنامه‌های کامپیوتری هستند که از تاریخچه‌ای طولانی برخوردار هستند. در این مقاله نحوه ساخت یک محافظ صفحه نمایش ساده با زبان Visual Basic .NET توضیح داده میشود.
باز کردن پنجره Popup در ASP.NET با استفاده از Code Behind | 3,934 | 1382-11-12
قطعا در بسیاری از Applicationها برای شما مواردی پیش آمده است که نیاز داشته‌اید صفحه‌ای خاص را در یک پنجره Popup باز کنید. اما آیا راهی برای انجام این کار با استفاده از کدنویسی در Code Behind وجود دارد؟ پاسخ مثبت است.
عمومی سازی و بومی سازی در جاوا | 3,934 | 1382-10-21
در این مقاله دو مبحث عمومی سازی (Internationalization) و بومی سازی (Localization) در جاوا مورد برررسی قرار می‌گیرد.
دستیابی به رجیستری در VB.NET | 4,150 | 1382-09-15
احتمالا تاکنون مطالب زیادی در مورد رجیستری ویندوز شنیده‌اید. اما آیا تابحال فکر کرده‌اید که چگونه میتوانید از این ویژگی ویندوز در برنامه‌های خودتان استفاده کنید؟
بررسی توابع مدیریت رشته‌ها در ویژوال بیسیک | 4,167 | 1382-08-13
در این مقاله توابعی که در کار با رشته‌ها (Strings) در ویژوال بیسیک می‌توان از آنها استفاده کرد بهمراه مثال‌هایی از کاربرد هر تابع معرفی شده است.
بررسی شیئ DataView در ASP.NET | 2,487 | 1382-08-03
در این مقاله سعی شده به اختصار درباره خصوصیتها، متدها و نحوه کار با شیئ DataView اطلاعاتی ارائه شود.
ساختن فرم جمع آوری اطلاعات به صورت پویا بر پایه XML | 3,634 | 1382-07-18
در این مقاله به چگونگی ساخت یک فرم ویندوز جهت جمع آوری اطلاعات و قرار دادن کنترلها بر روی آن به صورت پویا از طریق یک فایل XML می‌پردازیم.
حفظ وضعیت فرمهای وب هنگام استفاده از Server.Transfer | 2,414 | 1382-07-10
شاید شما هم این تصور غلط را داشته باشید که متد Server.Transfer نمیتواند برای ارسال وضعیت فرم به فرمی دیگر به کار رود! اما با اعمال مقداری تغییرات میتوان این کار را به آسانی انجام داد.

1 2 3 صفحه بعد »
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫استفاده از ظاهر جدید Windows XP در برنامه‌ها

استفاده از ظاهر جدید Windows XP در برنامه‌ها

توسط: SoheilPro
تاریخ انتشار: 8 آذر 1381

با کمک این مقاله خواهید توانست از ظاهر جدید کنترل‌های Windows XP در برنامه‌های خود استفاده کنید. 		iDevCenter

با عرضه سیتم عامل Windows XP بعد از مدتها تغییری اساسی در واسط کاربر خانواده سیستم عامل‌های ویندوز ایجاد شد. این ظاهر جدید که Luna نام دارد دکمه‌ها و بقیه کنترل‌های استاندارد ویندوز را از حالت خشک قدیمی خارج کرده و به آنها جلوه‌ای تازه می‌بخشد. اما این ویژگی جدید به طور خودکار برای برنامه‌های قدیمی فعال نیست و باید تغییراتی در این برنامه‌ها ایجاد شود تا بتوانند از این امکان بهره بگیرند.

اولین قدم برای فعال کردن این ویژگی در برنامه‌ها فراخواندن تابع InitCommonControls است. این تابع باید در اولین نقطه اجرای برنامه فراخوانده شود. با انجام این کار ویندوز هنگام ساختن کنترل‌های برنامه از کنترل‌های جدید استفاده خواهد کرد. انجام این کار در ویژوال بیسیک بصورت زیر است:

Public Declare Function InitCommonControls Lib "comctl32.dll" () As Long

Private Sub Form_Initialize()
    InitCommonControls
End Sub

قدم بعد اضافه کردن فایل manifest به برنامه است. این فایل یک فایل متنی با فرمت XML است که شامل اطلاعات لازم درباره کنترل‌های جدید برای ویندوز می‌باشد. برای ساختن این فایل متن زیر را کپی کرده و با نام <Filename>.manifest در همان دایرکتوری که برنامه شما قرار دارد ذخیره کنید. برای مثال اگر نام فایل اجرایی برنامه شما Test.exe است نام فایل manifest باید Test.exe.manifest باشد.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly
    xmlns="urn:schemas-microsoft-com:asm.v1"
    manifestVersion="1.0"
>
<assemblyIdentity
    type="win32"
    processorArchitecture="*"
    version="6.0.0.0"
    name="mash"
/>
<description>Enter your Description Here</description>
<dependency>
   <dependentAssembly>
      <assemblyIdentity
           type="win32"
           name="Microsoft.Windows.Common-Controls" version="6.0.0.0"
           language="*"
           processorArchitecture="*"
         publicKeyToken="6595b64144ccf1df"
      />
   </dependentAssembly>
</dependency>
</assembly>

اکنون برنامه‌های شما هم قادر خواهند بود تا از جدیدترین رابط کاربر ارائه شده توسط Windows XP استفاده کنند.

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫ایجاد یک الگوی سفارشی برای Web Formها

ایجاد یک الگوی سفارشی برای Web Formها

توسط: SoheilPro
تاریخ انتشار: 8 آذر 1381

با ایجاد یک الگو (Template) میتوانید زمان لازم برای ساخت یک سایت وب که دارای صفحات مشابه زیادی است را به حداقل برسانید. 		iDevCenter

در بسیاری مواقع لازم است که سبک و شکلی یکسان در تمام صفحات یک سایت رعایت شود و همهچنین مواردی مانند تعریف Stylesheetهای استفاده شده نیز باید به تمام صفحات اضافه شوند. در این مقاله الگویی برای پروژه‌های #C خواهیم ساخت تا با استفاده از آن دیگر مجبور به نوشتن کدهای تکراری برای هر صفحه نباشیم.

توجه: در تمام مسیرهای استفاده شده در این مقاله بجای VSNET دایرکتوری محل نصب Visual Studio .NET را مشخص کنید.

ابتدا با استفاده از Notepad فایل WebProjectItems.vsdir را که در مسیر VSNET\VC#\CSharpProjectItems\WebProjectItems قرار دارد باز کنید و خط زیر را به آن اضافه کنید:

..\MyCustomWebFormWiz.vsz|{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}|My Custom Form|10|#2263|{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}|4534|0|WebForm.aspx

سپس به دایرکتوری VSNET\VC#\CSharpProjectItems رفته و فایل CSharpAddWebFormWiz.vsz را کپی کرده و با نام MyCustomWebFormWiz.vsz ذخیره کنید. با استفاده از Notepad آن را باز کنید و مقدار Param را بصورت زیر تغییر دهید:

Param="WIZARD_NAME = MyCustomWebFormWiz"

اکنون به دایرکتوری VSNET\VC#\VC#Wizards رفته و دایرکتوری CSharpAddWebFormWiz را کپی کرده و به آن نام MyCustomWebFormWiz را بدهید. سپس فایل WebForm1.aspx را که در مسیر VSNET\VC#\VC#Wizards\MyCustomWebFormWiz\Templates\1033 قرار دارد باز کنید و تغییرات لازم را در آن داده و ذخیره کنید.

برای استفاده از این الگوی جدید کافیست یک پروژه جدید وب در #C ایجاد کرده و Add Web Form را در منوی Project کلیک کنید و سپس My Custom Form را انتخاب کنید.

منابع

  • Add a CSS Style Sheet Reference to All Web Forms in a Visual C# .NET Web Project

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫ایجاد تصاویر بصورت دینامیک در ASP.NET

ایجاد تصاویر بصورت دینامیک در ASP.NET

توسط: SoheilPro
تاریخ انتشار: 8 آذر 1381

اگر نیاز دارید برای سایت خود تصاویری را بصورت دینامیک ایجاد کنید، ASP.NET سریعترین و آسان‌ترین راه را برای شما فراهم کرده است. 		iDevCenter

اگر تا به حال از خدمات سایت‌های فراهم کننده شمارنده‌های گرافیکی (Counter) استفاده کرده باشید، حتما" متوجه شده‌اید که ویژگی src تگ imgی که باید به صفحه خود اضافه کنید به یک فایل تصویری مانند GIF یا JPEG اشاره نمیکند بلکه معمولا مشخص کننده یک برنامه CGI است. این روش راهی است برای استفاده از تصاویر دینامیک در وب. برای ایجاد اینگونه تصاویر تا کنون بیشتر از CGI استفاده میشد زیرا انجام چنین کاری در ASP بسیار دشوار است. اما اکنون با عرضه ASP.NET شما هم میتوانید براحتی چنین تصاویری را تولید و استفاده کنید. یکی دیگر از استفاده‌های این روش نمایش اطلاعات آماری بصورت تصویر است.

ما در این مقاله توسط #C یک برنامه ASP.NET خواهیم نوشت که تاریخ امروز را بصورت یک تصویر ایجاد کند.
کد نهایی این برنامه بصورت زیر است:

 1  <%@ Page language="C#" %>
 2  <%@ Import namespace="System" %>
 3  <%@ Import namespace="System.Drawing" %>
 4  <%@ Import namespace="System.Drawing.Imaging" %>
 5
 6  <%
 7  	Bitmap bmp = new Bitmap(140, 40);
 8  	Graphics graph = Graphics.FromImage(bmp);
 9
10  	graph.Clear(Color.Orange);
11  	graph.DrawString(DateTime.Today.ToString("yy/MM/dd"),
            new Font("Tahoma", 23),
            new SolidBrush(Color.White), 0, 0);
12
13  	Response.ContentType = "image/jpeg";
14  	bmp.Save(Response.OutputStream, ImageFormat.Jpeg);
15
16  	graph.Dispose();
17  	bmp.Dispose();
18  %>
Today.aspx

در خطوط اول تا چهارم زیان برنامه و Namespaceهای استفاده شده معرفی شده‌اند. در خطهای 7 و 8 یک شیئ Bitmap با اندازه 140x40 ایجاد و سپس براساس آن یک شیئ Graphics ساخته میشود. دو خط بعد مسئول ترسیم شکل مورد نظر هستند بدینصورت که ابتدا کل تصویر بوسیله رنگ نارنجی، رنگ میشود و سپس تاریخ امروز با قلم Tahoma و رنگ سفید رسم میشود.

مهمترین قسمت این برنامه خطوط 13 و 14 است. در خط 13 خروجی برنامه بصورت image/jpeg مشخص میشود. با این کار مرورگر متوجه میشود که با یک تصویر از نوع JPEG سر و کار دارد نه یک صفحه ASPX. در خط 14 نیز تصویر ایجاد شده با فرمت JPEG به جریان خروجی ارسال میشود.

در دو خط پایانی برنامه هم حافظه اشفال‌شده توسط اشیاء آزاد میشود.

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

<img src="Today.aspx" />

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫آیکونی برای سایت شما

آیکونی برای سایت شما

توسط: SoheilPro
تاریخ انتشار: 8 آذر 1381

با اضافه کردن یک آیکون به سایتتان برای نمایش در منوی Favorites میتوانید به سایت خود ظاهری حرفه‌ای‌تر ببخشید و توجه کاربران را به آن جلب کنید. 		iDevCenter

یکی از ویژگی‌هایی که با عرضه نسخه پنجم Internet Explorer به این برنامه اضافه شد، امکان نشان دادن آیکون ویژه هر سایت در منوی Favorites بود. انجام اینکار بسیار ساده است و به هیچ نرم‌افزار خواصی نه در سمت سرور و نه در سمت کاربر نیاز ندارد.

برای Internet Explorer 5 اندازه این آیکون باید 16x16 پیکسل باشد؛ در غیر اینصورت نادیده گرفته خواهد شد. جهت ساختن آیکون میتوانید از برنامه‌های زیادی که در اینترنت برای این کار موجود است استفاده کنید. یکی از بهترین برنامه‌ها در این زمینه برنامه Microangelo است که میتوانید آنرا از سایت www.impactsoftware.com دریافت کنید. برنامه‌های Visual Studio 6 و Visual Studio .NET نیز امکان ساخت و ویرایش آیکون را دارند.

بعد از ساخت آیکون باید آنرا با سایت خود مرتبط کنید. ساده‌ترین راه برای انجام این کار قرار دادن آیکون با نام favicon.ico در دایرکتوری ریشه سایت است. از این پس هر بار که کاربری سایت شما را به لیست Favorites خود اضافه کنید، Internet Explorer به طور خودکار این فایل را از آدرس http://www.mywebsite.com/favicon.ico دریافت کرده و نمایش میدهد.

اما اگر میزبان سایت شما اجازه استفاده از فایلهای ICO. را نمیدهد و مجبورید آیکون خود را روی سایت دیگری قرار دهید و یا اگر میخواهید برای هر صفحه از آیکون متفاوتی استفاده کنید، باید از راه دوم استفاده کنید. در این روش لازم است که خط زیر را به قسمت Head صفحات خود یعنی بین تگهای <head> و <head/> اضافه کنید و بجای http://www.mydomain.com/myicon.ico آدرس فایل آیکون خود را قرار دهید.

<link rel="SHORTCUT ICON" href="http://www.mydomain.com/myicon.ico">

اکنون هر بار که کاربری سایت شما را به لیست Favorites خود اضافه کند، آیکونی که مشخص کرده‌اید در کنار منوی مربوطه و آدرس سایت در نوار آدرس نشان داده خواهد شد.

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫آشنایی با کنترل XML در ASP.NET

آشنایی با کنترل XML در ASP.NET

توسط: SoheilPro
تاریخ انتشار: 20 آذر 1381

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

امروزه بکارگیری فناوری XML در طراحی سایت‌ها بسیار رواج یافته است و یکی از بیشترین موارد استفاده آن، نمایش اطلاعات یک فایل XML بصورت فرمت شده در صفحات وب است. به همین دلیل مایکروسافت یک کنترل را دقیقا" به همین منظور در ASP.NET قرار داده است.

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

<asp:xml DocumentSource="MyFile.xml" id="xml1" Runat="server" />

با اضافه‌کردن خط بالا به یک صفحه، محتویات فایل MyFile.xml بطور خودکار به صفحه اضافه خواهد شد. روش دیگر، قرار دادن محتویات سند به شکل XML بین تگهای <asp:xml> و <asp:xml/> بصورت زیر است:

<asp:xml id="xml1" Runat="server">
    <Books>
        <Book>Sample Book 1</Book>
        <Book>Sample Book 2</Book>
    </Books>
</asp:xml>

اما اگر سند XML بصورت یک فایل ذخیره شده روی دیسک وجود نداشته باشد و برای مثال براساس اطلاعات موجود در دیتابیس در زمان درخواست صفحه ساخته شود، این روش قابل استفاده نخواهد بود. در این حالت باید از خاصیت Document در کد صفحه استفاده کرد و یک شیئ از نوع System.Xml.XmlDocument را به آن نسبت داد. مثال زیر یک سند XML ساخته و آن را توسط کنترل xml1 نمایش میدهد:

XmlDocument doc = new XmlDocument();
XmlElement elem = doc.CreateElement("Price");

elem.InnerText="24.95";
doc.AppendChild(elem);

Xml1.Document = doc;

در بیشتر موارد نشان دادن اطلاعات فایل XML به تنهایی کافی نیست و باید از یک فایل XSL نیز برای تعیین نحوه نمایش اطلاعات استفاده کرد. برای این کار دو خاصیت Transform و TransformSource در این کنترل قرار داده شده‌اند. خاصیت Transform تنها هنگام نوشتن کد قابل استفاده است و باید به آن یک شیئ از نوع System.Xml.Xsl.XslTransform نسبت داد. اما خاصیت TransformSource هنگام طراحی صفحه نیز قابل دسترسی است و میتوان از آن برای مشخص کردن نام و مسیر فایل XSL استفاده کرد. مثال زیر فایل MyFile.xml را توسط فایل MyTransform.xsl فرمت کرده و نمایش میدهد:

<asp:xml DocumentSource="MyFile.xml" TransformSource="MyTransform.xsl" id="xml1" Runat="server" />

کد زیر نیز دقیقا" کار مثال بالا را انجام میدهد، با این تفاوت که بجای خاصیتهای DocumentSource و TransformSource از خاصیتهای Document و Transform استفاده میکند:

XmlDocument doc = new XmlDocument();
XslTransform trans = new XslTransform();

doc.Load(MapPath("MyFile.xml"));
trans.Load(MapPath("MyTransform.xsl"));

Xml1.Document = doc;
Xml1.Transform = trans;

نکته‌ای که باید به آن توجه داشت این است که اگر شما همزمان از سه خاصیت DocumentContent ،DocumentSource ،Document و یا خاصیتهای Transform و TransformSource استفاده کنید، تنها آخرین موردی که مشخص کرده‌اید مورد استفاده قرار خواهد گرفت و بقیه موارد نادیده گرفته خواهند شد.

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫آشنایی با کنترل DataGrid در ASP.NET

آشنایی با کنترل DataGrid در ASP.NET

توسط: benyblack
تاریخ انتشار: 21 آذر 1381

کنترل DataGrid یکی از پر استفاده‌ترین کنترل‌های دات نت است. در این مقاله به شرح امکانات این کنترل پرداخته میشود. 		iDevCenter

DataGrid داده‌های جدولی را نشان میدهد و می تواند انتخاب، مرتب سازی، صفحه بندی و ویرایش داده‌ها را پشتیبانی کند. به طور پیش فرض دیتاگرید یک BindColumn برای هر ستون داده‌ها در منبع داده ایجاد می کند (AutoGenerateColumns = True). هر فیلد در یک ستون جدا سازی شده قرار می گیرد. نام فیلد در عنوان (Header) ستون قرار می گیرد و مقدار آن در یک برچسب متن ظاهر می شود.

این مثال استفاده از DataGrid را نشان میدهد:

تعریف ستون‌ها:
شما می توانید طبقه بندی، رفتار، و نمایش ستونهای منفرد را با دستکاری مستقیم مجموعه ستونها (Columns Collection) کنترل کنید. نوع استاندارد ستون (Bound Column) مقادیر را در برچسب‌های متنی نشان میدهد. البته گرید انواع دیگری را نیز که به صورت متفاوتی نمایش می یابند پشتیبانی می کند. در مجموعه ستونها انواع متفاوتی از ستونها قابل استفاده است.

نکته: شما می توانید تعریف صریح ستونها را به همراه Auto-Generated Columns استفاده کنید. وقتی این دو با هم استفاده شوند، ابتدا ستونهای با تعریف صریح ارائه می شوند. Auto-Generated Columns در مجموعه ستونها اضافه نمی شوند.

BoundColumn | به شما اجازه میدهد طبفه بندی و نمایش ستونها راکنترل کنید.
HyperLinkColumn | داده‌ها را در کنترل HyperLink نمایش میدهد.
ButtonColumn | فرمان های کاربر را به Event Handlerهای گرید مرتبط می کند.
TemplateColumn | به شما اجازه میدهد شیوه نمایش هر کنترلی را در گرید کنترل کنید.
EditCommandColumn | لینکهای Update ،Edit و Cancel را در پاسخ به تغییرات در ویژگی EditItemIndex نمایش میدهد.

پنهان کردن ستونها:
هر ستون در گرید دارای ویژگی Visible است. برای پنهان کردن هر ستون Visible را به False تغییر دهید. (مثال | کد)

مرتب سازی ستونها:
داده ها در گرید به طور معمول با کلیک کردن سر ستون (Header) هر ستون مرتب میشوند. شما میتوانید مرتب سازی را در DataGrid با تنظیم AllowSorting به True فعال کنید. (مثال | کد)

صفحه بندی:
DataGrid لوازمی را برای نمایش گروهی داده‌ها از منبع داده‌ها ارایه میدهد. شما میتوانید صفحه بندی داده‌ها در DataGrid را با تنظیم AllowPaging به True فعال کنید. با فعال سازی صفحه بندی گرید دکمه‌های راهبری (Next/Prev یا شماره‌ای) را نشان میدهد. (مثال | کد)

در ضمن شما می توانید به جای این دکمه‌ها یا لینک‌ها از کنترل‌های دلخواه استفاده کنید. شما باید CurrentPageIndex را تنظیم کنید و دوباره از DataBind استفاده کنید. (مثال | کد)

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫ارث بری فرم ویژوال در دلفی (1)

ارث بری فرم ویژوال در دلفی

توسط: sobh
تاریخ انتشار: 5 دی 1381

اگر بتوانید در برنامه هایتان به طور گسترده از ارث بری فرم ویژوال (Visual Form Inheritance) استفاده کنید، مدت زمانی که صرف توسعهء نرم افزارتان می کنید کاهش یافته، ایرادات آن کمتر شده و رابط کاربر آن ظاهر پایدار و با ثبات تری پیدا می کند. 		iDevCenter

ارث بری فرم ویژوال چیست؟
VFI قابلیتی در دلفی است که اجازه می دهد فرمهای جدید از فرمهای موجود مشتق شوند یا قابلیتهای آن را به ارث برند. VFI به طور کلی همان مزایای ارث بری را در اختیار می گذارد که اولین آنها قابلیت بر گرفتن شباهتهای کلاسهای مختلف از کلاسهای بالاتر در یک سلسله مراتب است. در این مورد، کلاسها فرمهایی هستند که در ابزار طراحی فرم دلفی ساخته شده اند. به زبان دیگر VFI به شما اجازه می دهد یک کد را در جایی بنویسید که بین چندین فرم مشترک باشد. واضح است که یک بار نوشتن کد کارایی را بالا برده و امکان خطا را کاهش می دهد. حال این فرمهاممکن است همگی مربوط به یک برنامه یا برنامه های مختلف باشند.

VFI چیزی بیش از استفادهء مجدد از کد است. این همان جایی است که بخش ویژوال VFI وارد می شود. شما می توانید فرمهایی را در دلفی طراحی کنید، وهمان طرح بندی و ظاهر را بین فرمهای متفاوت به اشتراک گذارید. واداشتن فرمها به داشتن طرح بندی مشترک باعث ایجاد ثبات در ظاهر و بالا رفتن کارایی می شود.

همچنین استفاده از VFI به شما امکان طراحی سلسله وار فرمها را می دهد. هر تغییری در فرمهای مراتب بالاتر در فرمهای وارث تاثیر می گذارد. همین طور، می توانید اجزاء و یا کدهایی را به فرمها اضافه و در نتیجه تمام فرمهای وارث را تغییر دهید.

فرض کنید در حال نوشتن برنامه ای برای مدیریت مشتریان و صورتحساب هایشان هستید. شما برنامه را طراحی کرده و معین می کنید که برای کار با داده ها به سه فرم کلی نیاز دارید: یکی برای مشتریان، دومی برای صورتحساب ها و سومی برای قطعاتی که می فروشید. گرچه هر فرم اطلاعات متفاوتی ارائه می کند، عناصر مشابهی در فرمها هست. مثلا هر فرم باید دوبرگ داشته باشد. یکی با یک DBGrid بر رویش و دیگری با کنترلهای متفاوت برای ویرایش جدولی که در نظر دارید. همچنین هر برگ به چند دکمه برای ذخیره و لغو تغییرات و اضافه و حذف کردن رکوردها نیاز دارد. شما می توانید هر فرم را جداگانه طراحی کرده و برای هر کدام جداگانه کد بنویسید. اما راه بهترش آغاز کار با یک فرم کلی پیش ساخته حاوی کنترلها و کد مشترک است. بعد می توانید از VFI استفاده کرده، فرمهای مورد نظرتان را مبتنی بر این فرم اولیه بسازید و تغییرات لازم را در آنها ایجاد کنید.

وقتی فرمها را ساختید، باز هم می توانید امکانات جدیدی به فرم اولیه اضافه کنید. مثلا اگر بخواهید در پس زمینهء همهء فرمها آرم خاصی را نمایش دهید یا در همه امکاناتی کلی برای جستجو فراهم آورید. کافی است هر آنچه را می خواهید به فرم اولیه بیافزایید. فرمهای پایین دست خود به خود رفتار یا ظاهر جدید را به ارث می برند.

مروری کوتاه بر وراثت
وراثت یکی از ویژگیهای برنامه نویسی شیء گراست که به شما اجازهء ساخت کلاسهای تازه مبتنی بر کلاسهای موجود را می دهد. کلاس قدیمی، کلاس مافوق یا بالادست و کلاس جدید، کلاس زیر دست یا پایین دست خوانده می شود. کلاسها بالطبع دارای داده ها و کدهایی هستند. کلاسهای پایین رتبه تر می توانند داده ها و کدهای عمومی کلاسهای بالادست خود را ببینند. دلفی از یک مدل وراثت تکی پشتیبانی می کند. بدین معنی که هر کلاس می تواند به طور مستقیم وارث فقط یک کلاس باشد. (بعضی زبانها از نوع دیگری وراثت به نام وراثت چندتایی پشتیبانی میکنند. در این زبانها یک کلاس می تواند وارث چندین کلاس بالادست خود باشد.) همچنین می توانید به طور مکرر از وراثت استفاده کنید. یعنی می توانید مثلا کلاس A را وارث کلاس B و کلاس B را وارث کلاس C بسازید. در این حالت کلاس A می تواند کدها و داده های عمومی هر دو کلاس B و C را ببیند (شکل 1 را ببینید).
شکل 1

کلاس زیر را که ابزار طراحی فرم دلفی به طور خودکار برای فرم ما ایجاد کرده در نظر بگیرید:

Type
  TFrmRichEdit = class(TForm)
    btnCancel: TButton;
    btnOk: TButton;
    rtfNotes: TRichEdit;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

نام این کلاس TFrmRichEdit است و می بینید که به صورت وارثی از TForm تعریف شده. TForm یکی از کلاسهایی است که از قبل در VCL تعریف شده. TForm و کلاسهای بالاترش داده و کدی را که برای همهء انواع فرمها متعارف است تعریف می کند. خاصیتهایی مانند Font, Caption و Color و همین طور روالهایی چون Show, Close و ShowModal در همین کلاسها تعریف می شوند. پس TForm و پدرانش همهء شباهتهای میان انواع فرمها را در بر می گیرند. اگر دلفی از وراثت پشتیبانی نمی کرد، ابزار طرحی فرم دلفی می بایست هربار، برای هر فرم تمام این روالها و داده های مشترک را از اول می نوشت.

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

Var
  frmRichEdit: TFrmRichEdit

سپس می توانید کلاس را با صدا زدن روال سازنده اش ، Create، نمونه سازی کنید. Create یک پارامتر می گیرد، که به آن شیء Application را رد می کنیم:

frmRichEdit := TFrmRichEdit.Create(Application);

اینجا هم وراثت توی کار است! چه کسی Create را تعریف کرده؟ یکی از کلاسهای بالادست TFrmRichEdit. اگر بخواهیم دقیقتر بگوییم، TCustomForm.

هنگامی که از روی یک کلاس، شیئی می سازید، می توانید به طور مستقیم به روالها و داده های آن شیء دسترسی داشته باشید:

frmRichEdit.btnOk.Enabled := False;

همچنین به روالها و داده های کلاسهای بالادستش:

frmRichEdit.Caption := ‘RTF Editor’;
frmRichEdit.Show;

Caption در TControl (که چندین مرتبه بالاتر است) تعریف شده. روال Show هم در TCustomForm تعریف شده.

بالاتر دربارهء داده و کدهای عمومی یک کلاس صحبت کردیم. می دانید منظور ما از "Public" دقیقا چیست؟ آیا می شود کد و داده هایمان را به صورت دیگری هم تعریف کنیم؟ در حقیقت عمومی، میدان یا قلمرو تعریفمان را مشخص می کند. نشان می دهد که شیء یا متغیر تعریف شده در کجاها باید مرئی و قابل دستیابی باشد و در کجاها نباشد. داده و کد عمومی یک کلاس برای کاربرانش قابل رویت هستند. در مثال بالا هر سهء btnOk, btnCancel و rtfNotes، متغیرهای عمومی نمونهء ما هستند.

متغیرها، کدها و روالهای یک کلاس را دو جور دیگر هم می توانیم تعریف کنیم. به صورت خصوصی و حفاظت شده . اکنون اگر دوباره به کلاسی که تعریف کردیم، نگاهی بیندازید، دو بخش به نامهای public و private می بینید که هر دو تهی هستند. آنچه در این بخشها تعریف کنید، قلمروی همنام همان بخش خواهد داشت. کد و داده های شخصی تنها در روالهای درونی کلاس قابل رویت هستند و کاربران کلاس نمی توانند آنها را ببینند.

گرچه دلفی به طور پیش فرض بخش حفاظت شده را برای شما نمی سازد، ولی اگر نیاز باشد، خودتان می توانید آن را بسازید. هر چه در بخش حفاظت شده تعریف شود، مانند تعریفهای بخش خصوصی برنامه در اختیار روالهای خود کلاس خواهد بود. آنچه که این دو (خصوصی و حفاظت شده) را با هم متفاوت می سازد، روش برخورد با کلاسهای پایین دست است. کلاسهای زیر دست می توانند چیزهایی را که حفاظت شده تعریف شده، ببینند. اما آن چه که خصوصی تعریف شده، محدود به خود کلاس است و بس.

حال که وراثت را هر چند کوتاه مرور کردیم، اجازه بدهید VFI را در عمل ببینیم.

فوت و فن VFI
برای ساختن فرمهای جدید بر پایهء فرمهای موجود، باید از انبار اشیاء دلفی استفاده کنید. این انبار در بر گیرندهء تعدادی فرمهای پیش ساخته و همچنین فرمهای موجود برنامهء شماست که با انتخابشان می توانید فرمهای جدیدی مبتنی بر آنها بسازید. برای ساختن یک فرم جدید معمولا منوی File | New | Form را انتخاب می کنیم. ولی برای ساختن فرمی بر پایهء فرمهای موجود باید File | New | Other… را انتخاب کرد. این گزینه انبارهء اشیاء دلفی یا همان Object Repository را در مقابل ما می گشاید. اکنون می توانید آنچه را می خواهید بسازید، انتخاب کنید. شما می توانید خودتان فرمهایی به انبار اضافه کنید، ولی تعدادی فرم هم پیشاپیش همراه دلفی ارائه شده که به عنوان نقطهء شروع می توانید از آنها استفاده کنید.

حالا صفحهء Forms را انتخاب کنید. چندین فرم از جمله About box و Dual list box را مشاهده می کنید (شکل 2 را ببینید). این فرمها را در همهء برنامه ها می توان به کار برد.

شکل 2

به سه گزینهء Use, Copy و Inherit در پایین توجه کنید. اینها به دلفی می گویند که بین فرم جدید شما و فرمهای درون انبار چه رابطه ای باید برقرار باشد:

  • Copy: یعنی اینکه می خواهید عین فرم درون انبار در برنامهء شما بازنویسی شود. فرم جدید از فرم درون انبار کاملا" مستقل خواهد بود و تغییر در فرم درون انبار هیچ تاثیری بر فرم جدید نخواهد داشت.
  • Inherit: یعنی فرم جدید بر پایهء فرم درون انبار است و پیوندهایش را با آن برقرار نگه می دارد. اگر فرم درون انبار را تغییر دهید، تمام فرمهای مبتنی بر آن هم تغییر می کنند. معمولا در VFI این گزینه را انتخاب می کنیم.
  • Use: یعنی می خواهید فرم درون انبار را از همان جا که هست، مستقیما استفاده کنید. در این حالت دستکاری و تغییر در فرم، در واقع تغییر دادن فرم درون انبار است. این تغییرات بر همهء فرمهای وارث تاثیر خواهد داشت.
فرمهای برنامهء خودتان را هم به همین صورت می توانید مجددا استفاده کنید. پنجرهء Object Repository چندین برگ دارد. وقتی این پنجره را باز می کنید، یکی از صفحات باید همنام برنامهء شما باشد، که در بر گیرندهء فرمهای پروژهء حاضر است. فرق این فرمها با فرمهای خود انبار در این است که فرمهای برنامهء خودتان را فقط می توانید به ارث ببرید. در نتیجه تنها گزینهء قابل انتخاب در این صفحه، گزینهء Inherit است. به هر حال تنها گزیته ای هم هست که معنی می دهد.

وقتی بر مبنای یکی از فرمهای درون انبار یک فرم جدید می سازید، امکان تغییر در این فرم جدید وجود دارد. می توانید اجزاء جدیدی به آن افزوده یا روالهای جدیدی بنویسید. همین طور می توانید آنچه را به ارث برده اید تغییر دهید. می توانید اجزاء به ارث برده را حرکت داده یا تغییر اندازه دهید، ولی نمی توانید آنها را حذف کنید. اگر بخواهید چنین کاری بکنید، دلفی از شما ایراد خواهد گرفت. گر چه نمی توانید اجزاء به ارث برده را حذف کنید، ولی به جایش می توانید آنها را نامرئی کنید، یعنی ویژگی Visible آن را False کنید.

هنگامی که مقدار یکی از ویژگیهای به ارث برده را تغییر می دهید، پیوند بین ویژگیهای دو فرم بالا دست و پایین دست را شکسته اید. مثلا فرض کنید بر روی فرم پایین دست دکمه ای را به سمت چپ حرکت می دهید. حالا همان دکمه را در فرم توی انبار تکان می دهید. چون فرم پایین دست پیوند خود را با ویژگی Left فرم بالا دست شکسته، دکمهء روی فرم زیر دست حرکتی نمی کند. (روشن است که اگر پیوند را بر هم نزده بودید حرک می کرد.) می توانید این پیوند را با کلیک راست بر روی دکمه و انتخاب Revert to inherited دوباره برقرار سازید. این کار تمام تغییراتی را که در آن جزء فرم پایین دست (در اینجا دکمهء فرم جدید ما) ایجاد کرده اید، به حالت نخست بر می گرداند.

وقتی با روالهای ارث برده از کلاسهای بالا دست کار می کنید، اوضاع کمی متفاوت است و انتخابهای بیشتری دارید. می توانید روال بالا دست را جایگزین کنید، یا این که کدی بنویسید که علاوه بر روال بالا دست اجرا شود. در صفحهء Forms از پنجرهء New Items، گزینهء Inherit را کلیک کنید و Dual list box را برگزینید. فرم مورد نظر ساخته می شود. اگر روی دکمهء < دوبار کلیک کنید، دلفی برایتان روال زیر را می سازد. این دکمه برای جابجا کردن آیتمها از لیست چپ به لیست راست است.

procedure TDualListDlg2.IncludeBtnClick(Sender: TObject);
begin
  inherited;

end;

سرواژهء inherited به معنی فراخوانی روال همنام در کلاس بالا دست است. در حقیقت کد مربوط به کلاس بالا دست است که موارد انتخابی را از لیست دست راست به لیست دست چپ جابجا می کند:

procedure TDualListDlg.IncludeBtnClick(Sender: TObject);
var
  Index: Integer;
begin
  Index := GetFirstSelection(SrcList);
  MoveSelected(SrcList, DstList.Items);
  SetItem(SrcList, Index);
end;

این سرواژهء inherited در روال بالاست که روال پایین را اجرا می کند. شما می توانید آزادانه کد دلخواهتان را قبل یا بعد از inherited اضافه کنید. همین طور می توانید آن را حذف کنید و دیگر روال بالا دستی را صدا نکنید.

یک مثال کوتاه
فرض کنید چندین فرم از Dual list box توی انبار به ارث برده اید. آنها را جوری که مناسب برنامه تان است آراسته اید و حالا ناگهان به این فکر افتاده اید که به کاربرتان اجازه دهید در فرمهایتان آیتمهای مورد نظرش را از یک لیست کشیده و در لیست دیگر بیندازد . اگر از VFI استفاده نکرده بودید، حالا ناگزیر بودید این قابلیت کشیدن و انداختن را برای همهء فرمهایتان یکی یکی بنویسید. ولی چون VFI را به کار برده اید، می توانید فقط یک بار این کد را به فرم درون انبار شیء بیافزایید. به صورت قدم به قدم:

  • box را در حالت Use از Object Repository برگزینید.
  • ویژگی DragMode لیست دست چپ، SrcList، را برابر dmAutomatic قرار دهید. این مقدار به لیست شما می فهماند که باید به طور خودکار به کاربر شما اجازهء کشیدن را بدهد. همین که کاربر یک آیتم را انتخاب کرده و دکمهء سمت چپ ماوس را نگه دارد، کشیدن آغاز می شود. روش دیگر، dmManual است که در آن برنامهء شما، خود باید مسوولیت آغاز کشیدن را بر دوش بگیرد.
  • رویداد OnDragOver را برای لیست دست راست، DstList، یه صورت زیر بنویسید:

    Accept := (Source = SrcList);

    رویداد OnDragOver هنگامی رخ می دهد که کاربر یک آیتم را به روی کنترل بکشد. این رویداد برای اطمینان یافتن از تناسب کنترل مقصد با آیتم کشیده شده به کار می رود. کدی که نوشتیم به DstList می گوید اگر مبدا آیتم کشیده شده SrcList بود، در صورت رها شدن بپذیرش.
  • رویداد OnDragDrop را برای DstList به صورت زیر بنویسید:

    IncludeBtnClick(Sender);

    رویداد OnDragDrop هنگامی رخ می دهد که کاربر یک آیتم را رها کند. این کد دقیقا همان کاری را باید بکند که به هنگام کلیک بر روی کلید < اتفاق می افتاد، پس بی دلیل آن را بازنویسی نمی کنیم.

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫استفاده از Microsoft Agent در ویژوال بیسیک

استفاده از Microsoft Agent در ویژوال بیسیک

توسط: DelphiMan
تاریخ انتشار: 4 بهمن 1381

در این مقاله آموزشی من قصد دارم یك سری مطالب مختصر و مفید در مورد Microsoft Agent و همچنین طریقه كار كردن با آن را با استفاده از زبان VB برای شما توضیح بدم. 		iDevCenter

Microsoft Agent چیست؟
Microsoft Agent یک ActiveX است که می شه با اون یک شخصیت رو کنترل کرد تا یک سری فرمانها و صحبتهای ما رو به گوش کاربر برسونه... اگر از محصولات Office استفاده کرده باشید حتماً اون کلیپسی رو که براتون ادا در میاره دیدین... بله به اون میگن Agnet... حالا میخوایم ببینیم که چطوری میشه از اون در برنامه های خودمون استفاده کنیم.

یکی از بهترین Agentهای طراحی شده Merlin نام داره که اعمال زیادی رو براتون انجام میده و من هم خیلی بهش علاقه دارم (;

برنامه نویسی Microsoft Agent:
اول از همه شما احتیاج دارید که این ActiveX رو در فرمتون تعریف کنید، برای این کار شما ابتدا باید یک Object ایجاد کنید:

Public MyAgent As Object

خوب حالا شما باید Agent رو در Event ،Load فرمتون صدا بزنید. Agent در یک فایل acs. ذخیره میشه که باید اونو Load کنید. در زیر کدی برای صدا زدن آن آورده‌ام که البته باید به این نکته توجه کرد که فایل acs. شما میتونه تو هر شاخه دیگه باشه که میتونید قبلاً تو هاردتون Search کنید. و همچنین در کد زیر فرض شده شما ActiveX خودتون رو با نام Agent1 در فرمتون قرار دادین:

Agent1.Characters.Load "myagent", "c:\agent\Merlin.acs"
Set MyAgent = Agent1.Characters("myagent")

حالا ناراحت این نباشید که ActiveX رو ندارین در آخر مقاله آدرس جاهایی که میتونید اون رو بگیرید آورده‌ام. خوب حالا بعد از اینکه شما Object رو ساختین حالا با یک دستور به سادگی میتونید Agent رو نمایش بدین:

MyAgent.Show

بعد از این دستور Merlin نمایش داده میشه حالا چیکارش کنیم؟؟!! اگه شما Microsoft Text2Speech Engine رو تو ویندوزتون نصب کرده باشید میتونید به Agent بگین که براتون صحبت کنه. پس به طریق زیر عمل کنید:

MyAgent.Speak "Look! I can speak!"

حالا شما میتونید چند جمله مشخص کنید تا Agent براتون یکیشو بخونه (به دلخواه خودش!!!) برای اینکار میتونید از | در بین جملاتتون استفاده کنید:

MyAgent.Speak "Hello|Hi"

همچنین شما میتونید Agent خودتون رو به هر جای صفحه که خواستید ببرید برای اینکار هم میتونید اینطور بنویسید:

MyAgent.MoveTo 320, 240

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

MyAgent.Think "I'm thinking....hmm...E=MC2..Eureka!"

در ضمن یک سری دستورات برای اینکه بتونید این متن‌ها رو کنترل کنید هم وجود داره که من تو مقاله‌ای که برای دلفی نوشتم آوردم که دیگه اینجا نیاوردم، شما میتونید اون دستورات را در اینجا هم استفاده کنید.

خوب حالا طریقه کار کردن با Agent رو یاد گرفتیم حالا برای مخفی کردن اون میتونید از دستور زیر استفاده کنید:

MyAgent.Hide

تا اینجا همه چیز در مورد صحبت کردن و نمایش دادن متن بود حالا یک مقداری هم می پردازیم به حرکات و اعمال دیگر Agent که خیلی هم سرگرم کننده هست. Merlin برای اعمال زیادی حرکات خاصی داره که بسیار جالب هستند. مثلا برای Search ،Idle ،Think ،Greet ،Process و… می تونید از Merlin بخواهید که براتون ادا در بیاره ;) برای اینکار باید از دستور زیر استفاده کنید:

MyAgent.Play "animationname"

در دستور بالا بجای animationname باید نام حرکتی که میخواهید براتون انجام بده رو بیارید که برای هر Agent متفاوت هست. البته یک سری اعمال مثل اون چیزهایی که در بالا گفتم تقریبا تو همه Agentها در نظر گرفته شده. شما خودتون هم میتونید برای کار خودتون یک Agent طراحی کنید که برای اینکار می تونید از نرم‌افزارهایی که برای اینکار وجود دارند استفاده کنید مثل Microsoft Agent Character Editor که میتونید از سایت Microsoft دریافت کنید.

خوب این هم یک مقاله مقدماتی در مورد کار با MSAgent در برنامه های VB که امیدوارم برای شروع خوب بوده باشه. از اونجایی که من مخالف آموزش مطالب بصورت کامل و قدم به قدم هستم ادامه این راه جالب و سرگرم کننده را به عهده خودتون میزارم و امیدوارم که بتونید نرم افزارهای خوبی با این تکنولوژی تهیه کنید.

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫محدودكردن تغییر اندازه فرم در دلفی

محدودكردن تغییر اندازه فرم در دلفی

توسط: delphix
تاریخ انتشار: 4 بهمن 1381

گاهی اوقات لازم است كه اندازه فرم بیش از حد مشخصی تغییر نكند؛ این یك پیشنهاد برای برطرف كردن این مشكل است. 		iDevCenter

گاهی اوقات نیاز است فرم ما از نظر اندازه پیرو یک الگو باشد و کاربر نتواند خارج از محدوده این فرم را تغییر اندازه دهد، راهی که پیشنهاد می شود، استفاده از 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.

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫استفاده از DLL‌ها در دلفی

استفاده از DLL‌ها در دلفی

توسط: delphix
تاریخ انتشار: 8 بهمن 1381

برای استاندارد نمودن برنامه و استفاده بهینه از حافظه، استفاده از DLLها بصورت دینامیكی پیشنهاد می‌شود. در این خودآموز سعی شده در كمال سادگی مطلب عنوان شود. 		iDevCenter

ایجاد یک 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 ها باعث پایین آمدن سرعت نمایش فرم‌ها و در عوض بالارفتن سرعت برنامه خواهد شد.

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫نصب ProgressBar روی StatusBar در دلفی

نصب ProgressBar روی StatusBar در دلفی

توسط: delphix
تاریخ انتشار: 24 بهمن 1381

گاهی اوقات علاقه داریم كه ProgressBar روی StatusBar قرارگیرد. مانند كاری كه در Internet Explorer انجام میشود. راههای مختلفی برای این كار وجود دارد اما شاید این روش یكی از ساده ترین آنها باشد. 		iDevCenter

بتازگی بعضی از برنامه نویسان میخواهند فرمهایی شبیه فرمهای ویندوز XP بسازند که خاصیت زیبای آن قراردادن ProgressBar روی 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;

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫نمایش میزان كپی شدن فایل با ProgressBar در دلفی

نمایش میزان كپی شدن فایل با ProgressBar در دلفی

توسط: delphix
تاریخ انتشار: 24 بهمن 1381

شما در این روش ابتدا فایلی را باز كرده، اندازه آن را محاسبه و قسمت بندی می‌كنید و سپس با استفاده از آن میزان پیشرفت كار را نمایش می دهید. 		iDevCenter

چطور میتوان زمان کپی شدن فایل را با استفاده از 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

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫نحوه تهیه نسخه پشتیبان (Backup) در SQL Server 2000

نحوه تهیه نسخه پشتیبان (Backup) در SQL Server 2000

توسط: Hamid
تاریخ انتشار: 28 بهمن 1381

در این مقاله روشهای مختلف تهیه نسخه پشتیبان (Backup) و همچنین تعریف برنامه زمانبندی جهت Backup گیری اتوماتیک در زمانهای معین شرح داده شده است. 		iDevCenter

در SQL Server فایلهای Backup علاوه بر ساختار Database، داده ها و Object ها (Table, View, Stored Procedure, Foreign Key, Primary Key, Relation, UDF, DDF, …) را نیز شامل میشود. به عبارت دیگر با Backup گرفتن، داده های شما به صورت فیزیکی (و نه به صورت دستورات Insert) ذخیره میشود.

قبل از شروع کار توجه داشته باشید که سرویسSQL Server Agent ، Start شده باشد.

1. استفاده از Script
در این Script متغیر path حاوی مسیر، نام فایل و همچنین تاریخ، ساعت و دقیقه اجرا میباشد.

Declare @path varchar(200)

Set @path='C:\Backup\BK_' + Replace(Cast(GetDate() As char), ':', '-') + '.BAK'

BACKUP DATABASE [MyDatabaseName] TO DISK = @path WITH NOINIT,
NOUNLOAD, NAME = N'My Backup', NOSKIP, STATS = 10, NOFORMAT

سپس یک Daily, Weekly, Monthly) Job) تعریف کرده و Script فوق را در آن Job قرار میدهیم که باعث میشودScript ما به صورت متناوب اجرا شود.

2. استفاده از Wizard Backup
بر رویDatabase مورد نظر Right-Click کنید و گزینه Backup Database را انتخاب کنید تا پنجره SQL Server Backup ظاهر شود.

بر روی Add… کلیک کنید تا مسیر و نام فایل Backup را تعیین کنید.

پس ازتعیین مسیر و نام فایل Backup، بر روی OK کلیک کنید. با OK کردن نام و مسیر فایل، به پنجره قبلی بر میگردیم. در این حالت به دو صورت میتوان عمل کرد: یکی Backup گرفتن که با کلیک کردن برروی کلید OK در همان لحظه این عمل انجام میشود و دیگری تعریف Schedule یا برنامه زمانبندی جهت تکرار Backup گیری به صورت اتوماتیک.

برای تعریف Schedule بر روی Check Box کنار Schedule کلیک کنید. به محض کلیک، در Box مقابل، برنامه زمانبندی Default ظاهر میشود. حال برای تغییر برنامه زمانبندی پیش فرض بر روی کلید ... کلیک کنید تا پنجره Edit Schedule باز شود.

در این مرحله ابتدا نام برنامه زمانبندی و سپس نوع برنامه را مشخص کنید. در صورتی که تمایل دارید Back گیری به صورت منظم و در زمانهای مشخص انجام شود گزینه Recurring را انتخاب کنید. برای تغییر برنامه پیش فرض بر روی کلید Change کلیک کنید تا پنجره Edit Recurring Job Schedule ظاهر شود.

در این قسمت میتوانید دوره (ماهیانه، هفتگی و روزانه)، ساعت و بازه زمانی اجرای این برنامه زمانبندی را مشخص کنید. پس از تایید نهایی از Database شما طبق برنامه زمانبندی Backup گرفته میشود و در مسیر مشخص شده ذخیره میگردد. توجه داشته باشید که تاریخ و ساعت Backup گیری به انتهای نام فایل Backup اضافه میشود.

روش سوم تعریف Backup به صورت منظم با استفاده از تعریف یک Database Maintenance Plan میباشد که به این مبحث در مقاله بعد به طور مفصل میپردازیم.

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫تغییر Hint برای هر ستون از DBGrid در دلفی

تغییر Hint برای هر ستون از DBGrid در دلفی

توسط: delphix
تاریخ انتشار: 7 اسفند 1381

در DBGrid كار كردن بر روی هر سلول كاری مشكل و پردرد سر است چون انعطاف TGrid را ندارد. در این مقاله سعی کرده‌ام شما را با راه حل این مشل آشنا كنم. 		iDevCenter

ابتدا باید یک عنصر جدید مبتنی بر 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;

همه کارها انجام شد. حالا شما میتوانید نتیجه را مشاهده کنید.

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫ارسال (Upload) فایل به سرور در ASP.NET

ارسال (Upload) فایل به سرور در ASP.NET

توسط: MahdiDotNET
تاریخ انتشار: 23 اسفند 1381

چگونگی ارسال فایل به سرور از طریق ASP.NET. 		iDevCenter

در بسیاری از Web Applicationها نیاز به ایجاد امکان Upload فایل به سرور به صورت کنترل شده و بدون نیاز به برقراری دسترسی از طریق FTP و... می باشد. انجام این کار در ASP.NET بسیار ساده است. در این مقاله سعی شده است از دیدگاه کاربردی و نه آزمایشگاهی به این مطلب نگریسته شود. به طوری که کلیه مراحل جهت ذخیره فایل روی Remote Server می باشد و نه Localhost.

کدنویسی شامل دو قسمت می باشد:
  • کدهای مربوط به Presentation Layer و یا همان صفحات aspx. که مورد مشاهده کاربر قرار می گیرد.
  • کدهای مربوط به Business Login Layer که همان Code Behind و Handlerهای صفحه می باشند که در این مقاله به زبان VB.NET نوشته شده است.
برای این کار ابتدا بایستی یک وب فرم درون Application خود ایجاد کرده سپس در درون تگ <form> تگ زیر را اضافه کنید:

<input id="filename" type="file" runat="server">

ویژگی type="file" نشاندهنده این است که ما با یک فیلد معمولی متنی سر و کار نداریم.

دو نکته مهمی که باید در اینجا مدنظر قرار گیرند عبارتند از:
  • فراموش نکنید که ویژگیهای runat="server" و enctype="multipart/form-data" حتما در تگ <form> تنظیم شوند.
  • تگ <input> شما نیز باید خاصیت runat="server" را داشته باشد تا بتوانیم از طریق ASP.NET آن را کنترل کنیم.
قرار دادن تگ <input> در صفحه شما یک فیلد متنی و یک دکمه ...Browse برای شما ایجاد می کند که با کلیک کردن روی آن پنجره ای جهت انتخاب فایل از روی سخت دیسک شما باز می شود و پس از انتخاب فایل و تایید مقدار Value فیلد متنی با مسیر فایل روی سخت دیسک شما جایگزین می شود.

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

<asp:Button id="UploadButton" runat="server" Text="Upload" />

در حال حاضر صفحه Presentation آماده است و بایستی در Code Behind صفحه و یا Block Script رویداد کلیک روی دکمه Upload را کنترل نماییم. (ما در اینجا از Code Behind استفاده کرده ایم و تنها قسمت مربوط به Event Handling ذکر شده اما در فایل ضمیمه مقاله کل Code Behind را می توانید بیابید)

Private Sub UploadButton_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles UploadButton.Click
 If Not (filename.PostedFile.FileName.Length = 0) Then
    Dim ServerPath As String = "C:\YourWebSite\YourFolder" &
Mid(filename.PostedFile.FileName, InStrRev(filename.PostedFile.FileName, "\",
-1, 1), filename.PostedFile.FileName.Length)
    filename.PostedFile.SaveAs(ServerPath)

    filename.Visible = False
    UploadButton.Visible = False
    lblError.Visible = False
    lblSendMessage.Visible = True
    lblSendMessage.Text = "فایل شما به سرور منتقل شد.";
  Else
    lblError.Visible = True
  End If
End Sub

کد بالا پیچیدگی چندانی ندارد اما جهت رفع هرگونه ابهام برخی قسمتهای آن را توضیح می دهیم: در حلقه شرطی ابتدا خاصیبت PostedFile که به فایل مورد انتقال اشاره می کند مورد بررسی قرار می گیرد و چنانچه طول نام فایل برابر صفر نباشد (یعنی فایلی انتخاب شده باشد) آنگاه با استفاده از متد SaveAs فایل را روی سرور ذخیره می کند. نکته ای که این جا مطرح است این است که با استفاده از توابع Mid و InStrRev تنها قسمت انتهایی مسیر فایل روی سخت دیسک شما (یعنی \filename.ext) دریافت شده و به انتهای مسیر فیزیکی Server شما می چسبد تا فایل مزبور با همان نام روی Server ذخیره شود. شما می توانید مسیر فیزیکی سرور خود را با ساختن یک فایل ساده مثل ShowPath.aspx و قرار دادن دستور زیر پیدا کنید.

<% Response.Write(Server.MapPath("ShowPath.aspx")) %>

چنانچه شما فایلهای ضمیمه این مقاله را بررسی کنید خواهید دید که چندین Label Control جهت اطلاع رسانی به کاربر جهت انتخاب فایل پیش از کلیک بر روی دکمه Upload و نیز پس از ارسال فایل قرار داده شده است. ویژگی Visible که در این قسمتها مورد استفاده قرار گرفته است باعث می شود تا پیغام فوق تنها در زمان مقتضی نمایش و حتی فرمها نیز پس از ارسال محو شوند.

نکته دیگری که بایستی حتما مد نظر قرار دهید این است که مقدار maxRequestLength را که در واقع حجم فایل ارسالی را محدود می کند تنظیم کنید. برای این کار در فایل web.config خود و در قسمت <system.web> تگ زیر را اضافه کنید:

<httpRuntime maxRequestLength="50000" />

عدد فوق بر حسب بایت می باشد و در این مثال حجم فایل ارسالی حداکثر 50 کیلوبایت در نظر گرفته شده است. چنانچه شما می خواهید در این زمینه نیز محدودیتی را برای کاربران خود اعمال کنید بایستی در یک حلقه شرطی ویژگی filename.PostedFile.ContentLength را نیز کنترل کنید.

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫نشان دادن قابلیت‌های مرورگر در ASP.NET

نشان دادن قابلیت‌های مرورگر در ASP.NET

توسط: shaho
تاریخ انتشار: 5 فروردین 1382

در این مقاله با چگونگی تشخیص قابلیت‌های مرورگر توسط ASP.NET آشنا خواهید شد. 		iDevCenter

اگرچه در حال حاضر جنگ مرورگرها تقریبا تمام شده است اما این موضوع دلیلی بر شناخته نشدن قابلیتهای مرورگرها نیست. در اینجا توانایی 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:
نسخه اصلی مرورگر را نشان می دهد. بعنوان مثال در IE 5.1 عدد 5 نشانگر نسخه اصلی است.

MinorVersion:
نسخه جزیی (کوچکتر) مرورگر را نشان می دهد. بعنوان مثال در IE 5.1 عدد 1 نشانگر نسخه جزیی است.

Type:
نوع و نسخه مرورگر را بصورت یک رشته بازمیگرداند.

VBScript:
نشان می دهد که مرورگر VBScript را ساپورت می کند یا نه.

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

در زیر نمونه کامل یک مثال آورده شده است:

<%@ page language="VB" %>
<%@ Import Namespace="System.Web" %>
<html>
  <head>
     <title>HTTPBrowserCapabilities Demo</title>
  </head>

  <body>
    <%
    Dim browserObj As HTTPBrowserCapabilities
    browserObj = Request.Browser
    %>

  Your browser supports ActiveX controls: <%=browserObj.ActiveXControls %><br />
  Your browser type: <%=browserObj.Type %><br />
  Your browser version: <%=browserObj.Version%><br />

  ... Add any other property that you would like to display.

  </body>
</html>

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫جلوگیری از حملات SQL Injection در ASP.NET

جلوگیری از حملات SQL Injection در ASP.NET

توسط: MahdiDotNET
تاریخ انتشار: 22 فروردین 1382

در قسمت اول این مقاله به توضیح SQL Injection و نحوه مقابله با آن در ASP.NET و در پایگاه داده Access پرداخته می شود. 		iDevCenter

در این مقاله فرض شده است که خواننده با اصول اولیه زبان پرس و جوی ساخت یافته (Structured Query Language) یا همان SQL آشنا است. در ضمن کدهای موجود در این مقاله تماما به زبان VB.NET می باشند

یک حمله SQL Injection چیست؟
حتما در فیلمهای سینمایی دیده اید که بسیاری از تبهکاران قربانیان خود را با تزریق مواد سمی به جای دارو از میان بر می دارند. آیا در دنیای سایبر نیز چنین ایده هایی وجود دارد؟ در کمال تعجب باید بگویم که بله!! هکرها هم به نوعی از این شگرد استفاده می کنند. می گویید چگونه؟ با تزریق کردن دستورات SQL مورد علاقه خود به Application شما! اجازه دهید تا با یک مثال مطلب را روشن تر کنم:

سیستم Login:
صفحات Login معمولا دارای فیلدهایی هستند که دو مقدار ID و Password را از کاربر گرفته و سپس با استفاده از یک دستور SQL آن را پردازش می کنند. نمونه ساده ای از این دستور به صورت زیر است:

SELECT COUNT(UserID) FROM tblUsers WHERE UserID='" & UserID.Text & "' AND Pass='" & Password.Text & "'"

در این مثال UserID و Password دو کنترل TextBox هستند که مقادیر آنها بایستی مورد پردازش قرار گیرد. حال فرض می کنیم کاربر مقادیر را به صورت mahdi و 123 وارد نماید، در این صورت جمله SQL به صورت زیر تولید می شود:

SELECT COUNT(UserID) FROM tblUsers WHERE UserID='mahdi' AND Pass='123'

خوب تا اینحا مشکلی وجود ندارد. حال فرض کنید که هکر ما به جای کلمه کاربری خود عبارت زیر را وارد نماید:

' OR 1=1 –

در این صورت عبارت SQL زیر تولید خواهد شد:

SELECT COUNT(UserID) FROM tblUsers WHERE UserID='' OR 1=1 – AND PASS=''

احتمالا می دانید که کاراکتر - در SQL علامت توضیحات است و عبارت پس از آن دیگر پردازش نمی شود لذا هنگام پردازش دستور چون همواره 1=1 است و با توجه به OR به کار رفته، بدون توجه به خالی بودن مقدار مقابل UserID 1=1 کافی تلقی شده و کلیه رکوردهای بانک اطلاعاتی برگردانده می شود و Attacker اصطلاحا Authenticate می شود.

پیش از آنکه به ارائه راه حل این حفره امنیتی خودساخته بپردازیم این نکه شایان ذکر است که این حملات در پایگاه اطلاعاتی SQL Server بسیار پیچیده تر است که در قسمت دوم مقاله مورد بررسی قرار خواهد گرفت.

چاره کار!
ساختار شی گرای ASP.NET و امکانات این ساختار به برنامه نویسان امکان مانور بیشتری را داده است. حال ما کد کامل اصلاح شده را در زیر آورده و سپس توضیحات آن را ذکر می کنیم:

Dim strSQL As String = "SELECT COUNT(UserID) FROM tblUsers WHERE
UserID=@UserID AND Password=@Password"
Dim cmndCheck As OleDbCommand = New OleDbCommand(strSQL, _Connection)

cmndCheck.Parameters.Add("@UserID", UserID.Text);
cmndCheck.Parameters.Add("@Password", Password.Text);
cmndCheck.Connection.Open()
Dim IsValid As Integer = cmndCheck.ExecuteScalar()

If IsValid > 0
    '... Some Code here... User is authenticated
Else
    '... Some Code here... User is not aututorized to view the page
End If

تغییر در همان خط اول یعنی دستور SQL مشخص است این بار به جای اینکه مقادیر دریافتی از فیلدها با Single Quote به خورد پردازشگر دستور داده شود مقادیر با پارامترهای تولید شده توسط آبجکت OleDbCommand جایگزین می شود و در آخر cmndCheck پردازش شده چنانچه مقدار تولید شده توسط ExecuteScalar بزرگتر از صفر باشد بدین معنی است که حداقل یک رکورد با شرایط مورد نظر ما پیدا شده است. (متغیر Connection_ که باید برابر ConnectionString شما قرار گیرد دانسته فرض شده است)

تقاوت اصلی این روش نسبت به روش ناامن قبلی این است که در اینجا مقادیر به صورت کاملا" پارامتری شده پردازش می شوند نه به صورت قطعاتی از یک رشته حرفی که در واقع دام اصلی SQL Injection به شمار می آید. در واقع ما در اینجا از تکنیکهای رشته سازی با استفاده از & یا + اجتناب کرده ایم.

نکته مهم دیگری که باید حتما مورد توجه قرار دهید این است که یکی از راههایی که هکرها برای حمله به سایت شما استفاده می کنند خطاسازی صوری در زمان اجرای Application و مطالعه اطلاعات خطای دریافت شده است. برای جلوگیری از این اتفاق که می تواند ساختار بعضی از قسمتهای کد شما را برای حمله کنندگان آشکار کند حتما در Application خود از روال خطایابی Customize شده استفاده کنید. علاوه بر این می توانید در بسیاری از قسمتها به صورت موردی از Try...End Try استفاده کنید و برای اطلاع خودتان از خطای رخ داده e As OleDbException را به آدرس Email خود ارسال کنید که در این مورد در فرصتی دیگر صحبت خواهم کرد.

این مثال و راه حل یکی از ساده ترین انواع حملات Injection روی Web Applicationهاست و شما می توانید نمونه ها و مثالهای متعددی در این خصوص را در سایتهای www.sqlsecurity.com و www.nextgenss.com پیدا کنید که چنانچه گفته شد (و در قسمت دوم این مقاله بدان پرداخته خواهد شد) بیشتر مربوط به SQL Server است. روش کلی کار در SQL Server نیز کمابیش مشابه همین روش است با این تفاوت که در آنجا از Stored Procedure استفاده می شود. پس منتظر قسمت دوم این مقاله و تکنیکهای پیشرفته تر Hackerها در نفوذ به بانک اطلاعاتی SQL Server یک برنامه نویس ناشی و روش اجتناب از آن باشید ;-)

توضیح: برخی قسمتهای این مقاله از مقاله "از بانک اطلاعاتی خود دفاع کنید" نوشته Beth Breidenbach چاپ شده در شماره 9 (نوامبر/دسامبر 2002) مجله asp.netPRO اقتباس شده است.

سایت‌های مرتبط

  • SQLSecurity.com
  • NextGenSS.com

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫ارسال ایمیل در ASP.NET با استفاده از HTML Template

ارسال ایمیل در ASP.NET با استفاده از HTML Template

توسط: MahdiDotNET
تاریخ انتشار: 30 فروردین 1382

شاید شما تاکنون مقالات بسیاری در خصوص ارسال Email در ASP.NET دیده باشید. ضعف اغلب این مقالات در این است که تنها به ذکر ساده ترین نوع ارسال Email بسنده میکنند. در این مقاله شما روش ساختن یک خبرنامه HTML ساده را خواهید آموخت. 		iDevCenter

آیا تاکنون سعی کرده اید برای سایت خود خبرنامه ایجاد کنید؟ آیا تاکنون وسوسه شده اید که سیستمی طراحی کنید که در صورتی که بینندگان سایت شما نظرات خود را در سایت شما وارد کنند برای آنها یک Email تشکرآمیز ارسال کنید؟ آیا می دانید ساختن یک HTML Template زیبا برای خبرنامه شما و استفاده همیشگی از آن جهت ارسال خبرنامه در ASP.NET بسیار ساده صورت می گیرد؟ آیا تاکنون سیستم نظرخواهی سایت Weblog.iProDev.NET را امتحان کرده و Email تشکر آن را دریافت کرده اید؟

چنانچه سوالات بالا شما را به دانستن بیشتر ترغیب کرده است به شما تبریک می گویم! چرا که در ادامه این مقاله شما روش بسیار ساده ارسال 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 سرور خود رجوع کنید.

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫تاریخچه زبان دلفی

تاریخچه زبان دلفی

توسط: MehranBalaei
تاریخ انتشار: 11 اردیبهشت 1382

تاریخچه مختصری از زبان دلفی از زمان پیدایش تا دلفی 6 به تفکیک نسخه‌های مختلف آن. 		iDevCenter

دلفی در واقع یک کامپایلر پاسکال است. دلفی 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 تبدیل شده است.

منبع: Borland Delphi Developer's Guide, Essentials of Rapid Development Advanced Techniques

سایت‌های مرتبط

  • سایت رسمی Delphi

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫موارد استفاده از DataReader و DataSet در ASP.NET

موارد استفاده از DataReader و DataSet در ASP.NET

توسط: shahabfar
تاریخ انتشار: 17 اردیبهشت 1382

شاید تا به حال بارها با این مسئله که در برنامه تحت وب نوشته شده خود با ASP.NET برای دستیابی به اطلاعات یک Database از DataSet استفاده کنید یا DataReader مواجه شده باشید. ولی براستی کدام انتخاب بهتر است؟ 		iDevCenter

شاید تا به حال بارها با این مسئله که در برنامه تحت وب نوشته شده خود با ASP.NET برای دستیابی به اطلاعات یک Database از DataSet استفاده کنید یا DataReader مواجه شده باشید. گاها" در بعضی از مقالات مشاهده می شود که به تعریف و تمجید از DataReader در مقابل DataSet پرداخته شده است و در بعضی مقالات نیز استفاده از DataSet توصیه شده است.

اما واقعیت اینست که مایکروسافت این دو کلاس دستیابی داده را بوجود آورده چرا که به هر دوی آنها نیاز بوده است. هر کدام از این دو کلاس دارای نقاط ضعف و قوتی می باشند که با توجه به حالتی که در برنامه با آن مواجه هستیم، باید هر یک از این دو کلاس را در جایی مناسب مورد استفاده قرار دهیم.

در این مقاله سعی بر آن است تا با در نظر گرفتن حالتهای مختلف استفاده از داده های یک Database، راهکاری مناسب برای استفاده از DataSet یا DataReader معرفی شود. نکته حائز اهمیت در این مقاله اینست که بحث بر روی استفاده از DataSet یا DataReader در بازهء برنامه های تحت وب صورت می گیرد و فرض بر این است که خوانندگان گرامی دارای آشنایی اولیه با این دو کلاس باشند.

در چه مواقعی باید از کلاس DataReader استفاده کرد؟
موارد زیر بیان کننده حالاتی است که استفاده از DataReader در مقابل DataSet ترجیح داده می‌شود.
  • هنگامی که داده مورد استفاده می بایست همیشه جدید باشد. پس بنابراین در هر زمان که به داده مورد نظر نیاز باشد باید مستقیما" از Database فراخوانی شود.
  • هنگامی که به هر ردیف از داده ها بطور معمول و ساده‌ای نیاز باشد. مانند پر کردن یک وب کنترل مثل DataGrid یا DropDownList.
  • هنگام دستیابی یکطرفه و فقط خواندنی به داده‌های از نوع XML. در این حالت میتوان از متد ExecuteXmlReader برای بدست آوردن کلاس XmlReader که همانند DataReader عمل میکند، استفاده کرد.
  • هنگامی که قصد دارید چندین درخواست تکراری برای دریافت قسمت کوچکی از اطلاعات Database داشته باشید.
در چه مواقعی از کلاس DataSet باید استفاده کرد؟
موارد زیر حالاتی را نشان می دهد که استفاده از DataSet در مقابل DataReader توصیه می‌شود.
  • هنگامی که سرویس وبی ساخته‌اید که مقدار برگشتی آن داده‌های برگرفته شده از Database می‌باشد. همانطور که می‌دانید اطلاعات بین وب سرویس و برنامه‌ای که از وب سرویس استفاده می‌کند بصورت داده‌های XML انتقال می‌یابد. از این رو با توجه به اینکه DataReader ارتباط با Database را در خود حفظ می‌کند، لذا نمی‌تواند بصورت داده‌های Serialize ،XML شود.
  • هنگامی که نیاز به فیلتر کردن و یا مرتب‌سازی داده‌ها باشد.
  • هنگامی که نیاز به ایجاد حلقه تکرار در داده‌ها باشد. مثلا" هنگامی که می‌خواهید از یکسری دادهء مشابه در بیش از یک سرور کنترل استفاده کنید. DataReader تنها برای استفاده در یک سرور کنترل بکار میرود در حالی که DataSet اینگونه نیست.
  • هنگامی که نیاز به ذخیره اطلاعاتی باشد که بعدا" مورد استفاده مجدد قرار خواهد گرفت. میتوان یک DataSet را براحتی در یک Session یا Application ذخیره کرد.
  • هنگام ارتباط دو طرفه با داده‌های XML. با استفاده از DataSet براحتی میتوان داده‌های یک فایل XML را خوانده و دوباره آنها را در قالب داده‌های XML در یک فایل ذخیره کرد.

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫استفاده از اکتیوایکس‌های server-side در ساخت صفحات ASP

استفاده از اکتیوایکس‌های server-side در ساخت صفحات ASP

توسط: sheidaian
تاریخ انتشار: 17 اردیبهشت 1382

در این درس روش ایجاد کلاسهای ActiveX که بتوان از آنها در صفحات ASP استفاده نمود، آموزش داده می شود. 		iDevCenter

با قراردادن کدهای ASP درون Componentهای server-side، برنامه نویس نه تنها می تواند از قابلیت‌های ویژوال بیسیک در نوشتن کدهای خود استفاده کند، بلکه سرعت Load صفحات ASP وی نیز افزایش می یابد. همچنین این روش راهکاری برای کپسوله سازی و حفاظت از کدهای ASP می باشد. در این درس یک نمونه اکتیویکس server-side را توسط ویژوال بیسیک ایجاد نموده و از آن در صفحات ASP استفاده خواهیم کرد.

اجزای Server-Side
اکتیواکس‌های server-side بر خلاف اکتیواکس‌های client-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)

End Sub

زمانیکه کاربر یک صفحه ASP را که شامل شیئی از کلاس ما باشد فراخوانی کند، SciptingContext ،IIS را به شی ما پاس می دهد. 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)
   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")
   Response.Write("You Entered :" & MyTempVar)
%>

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

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

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

Public Sub OnEndPage()
   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”)
%>

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

<%
   ObjReference.MyMethod()
%>

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫استفاده از +COM در ساخت صفحات ASP

استفاده از +COM در ساخت صفحات ASP

توسط: sheidaian
تاریخ انتشار: 9 خرداد 1382

در این مقاله با تکنولوژی +COM آشنا شده و روش بکارگیری این تکنولوژی در صفحات ASP را خواهید آموخت. 		iDevCenter

+COM چیست ؟
روشی که برای دسترسی به Object های ASP در مقاله قبلی بیان شد تا IIS 3.0 استفاده می شد. این روش استفاده از متدهای OnStart و OnEnd بود. البته گرچه هنوز این روش از سوی IIS ورژن ۵ پشتیبانی می شود اما دارای یک مشکل است: اگر بخواهید از یک کلاس در کلاس دیگری استفاده کنید نمی توانید در کلاس مورد استفاده، دو متد ذکر شده را قرار دهید و بنابراین به اشیای ASP دسترسی نخواهید داشت.

راه حلی که برای این مشکل ارائه شده است تکنولوژی +COM می باشد. بطور خلاصه در این تکنولوژی شیی به اسم ObjectContext وجود دارد که از طریق آن می توانید به اشیای ASP دسترسی داشته باشید.

برای استفاده از تکنولوژی +COM ابتدا از منوی References ،Project را انتخاب کرده و مورد 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()
  Dim objCtx As ObjectContext
  Set objCtx = GetObjectContext
  Set Request = objCtx.item("Request")
  Set Response = objCtx.item("Response")
  Set Server = objCtx.item("Server")
  Set Session = objCtx.item("Session")
  Set Application = objCtx.item("Application")
End Sub

اکنون میتوانید از این اشیاء دقیقا" مانند مثال ذکر شده در مقاله قبل استفاده کنید.

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫نكات مفید كار در محیط دلفی

نكات مفید كار در محیط دلفی

توسط: DelphiMan
تاریخ انتشار: 17 خرداد 1382

شما هر چقدر كه با دلفی كار كرده باشید و برنامه نویسی حرفه‌ای باشید باز هم در این مقاله نكات جدیدی خواهید یافت كه كار شما را در كد نویسی و كار در محیط دلفی آسان خواهد كرد. 		iDevCenter

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

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫ایجاد کلاسی برای کار با فایلهای XML در ویژوال بیسیک

ایجاد کلاسی برای کار با فایلهای XML در ویژوال بیسیک

توسط: sheidaian
تاریخ انتشار: 14 تیر 1382

هدف از این مبحث ایجاد یک کلاس مقدماتی برای خواندن داده ها از فایلهای XML می باشد. توجه داشته باشید که کلاسی که در این بخش معرفی می شود کلاسی ساده می باشد که فقط با آن می توان مقدار یک گره (Node) از در فایل XML را خواند. 		iDevCenter

مقدمه:
XML یک زبان نشانه‌ای توسعه پذیر (eXtensible Markup Language) است که در سال 1998 توسط کنسرسیوم وب جهانی W3C ایجاد شد. XML واقعا" یک زبان نیست بلکه یک متا-زبان است و برای توصیف سایر زبانها بکار می‌رود. داده‌ها در فایلهای XML براحتی قابل تعریف و استفاده هستند.

مثالی از یک فایل XML:

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

هدف از این مبحث، ایجاد یک کلاس مقدماتی برای خواندن داده‌ها از فایلهای XML می باشد. توجه داشته باشید که کلاسی که در این بخش معرفی می شود کلاسی ساده می باشد که فقط با آن می توان مقدار یک ند (Node) موجود در فایل XML را خواند. در صورت نیاز، می توانید خودتان متدهای دیگری را به آن اضافه کنید. برای این منظور نکاتی در انتهای این مبحث آورده شده است.

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

Private xml

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

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

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

Public Function getvalue(ByVal NName As String) As String
   Dim x
   getvalue = ""

   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 قرار دادن پارامترهای اتصال به بانک اطلاعاتی را در فایل XML و خواندن آنها در زمان Initiate کردن ADODB برای اتصال به بانک اطلاعاتی است:

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

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

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

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

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)
   Set thisChild = root.childNodes(i)
   name = thisChild.childNodes(0).Text
   id = thisChild.childNodes(1).Text
Next

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

Dim newuser, newname, newid
Set newuser = xml.createNode("element", "people", "")
Set newname = xml.createNode("element", "name", "")
Set newid = xml.createNode("element", "id", "")

newname.text = yourname
newid.text = yourid
newuser.appendChild(newname)
newuser.appendChild(newid)
root.appendChild(newuser)

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

xml.save(Server.Mappath(filename))

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

For i = (root.childNodes.length - 1) TO 0 STEP -1
   Set thisChild = root.childNodes(i)
   name = thisChild.childNodes(0).Text

   If name = searchname Then
      root.removeChild(thisChild)
   End If
Next

در انتها نیز فایل XML را ذخیره کنید.

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫آرایه‌ها در دلفی

آرایه‌ها در دلفی

توسط: Delphijon
تاریخ انتشار: 11 مرداد 1382

در این مقاله شما با ساختارهای مختلف آرایه‌ها، فضادهی آرایه‌های چند بعدی و فشرده سازی آرایه‌ها در پاسکال شیئ آشنا می‌شوید. 		iDevCenter

دلفی به ما امکان می دهد آرایه‌هایی از هر نوع متغییری را ایجاد کنیم. برای تعریف آرایه به صورت زیر عمل میکنیم:

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);

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫اضافه کردن تصویر به پایگاه داده

اضافه کردن تصویر به پایگاه داده

توسط: ghasempoor_m
تاریخ انتشار: 17 مرداد 1382

در این مقاله سعی بر آن است که توضیح کوتاهی در رابطه با اضافه کردن تصاویر به پایگاه داده SQL Server 2000 داده شود. 		iDevCenter

در بسیاری مواقع ما نیاز به افزودن تصویر به پایگاه داده داریم. از آنجایی که دسترسی به فایلهای موجود در سرور جهت استفاده هکرها بسیار سهل الوصول است، برخی مواقع نمی‌توانیم اطلاعات حساس را در قالب فایلهای تصویری در سرور ذخیره کنیم. به همین جهت بهتر آن است که در قالب نوع داده image در بانک اطلاعاتی ذخیره شود.

در این قسمت موارد زیر بررسی می شوند:
  • بررسی پیش نیازهای اضافه نمودن فایل تصویری
  • کار با شیء Stream
  • پیدا کردن اندازه و نوع تصویری که آپلود می شود
  • چگونگی استفاده از متد InputStream

بررسی پیش نیازهای اضافه نمودن فایل تصویری
دو مورد اصلی که قبل از شروع آپلود نیاز داریم عبارتند از:

  • - تنظیم خاصیت enctype فرم مربوطه (در برچسبForm) به enctype="multipart/form-data"
    - داشتن <input type=file> که به کاربر اجازه انتخاب فایل مورد نظرش را می دهد. (فایلی که در پایگاه داده باید ذخیره شود) و یک Submit button جهت اجرای عملیات مربوط به آپلود کردن فای
    - استفاده از فضانام System.IO جهت سروکار داشتن با شیء Stream

  • سه پارامتر بالا در یک صفحه 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 و تکرار آن برای همه ردیفهاست. قبل از نمایش تصویر، نوع آن هم مشخص می شود.

منابع

  • Inserting Images to SqlServer in ASP.NET
  • Retrieving Images from SqlServer in ASP.NET

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫مدیریت حافظه در دلفی

مدیریت حافظه در دلفی

توسط: Delphijon
تاریخ انتشار: 27 مرداد 1382

گاهی مواقع شاید شما احتیاج داشته باشید خوتان مستقیما به حافطه دسترسی داشته باشید و آنرا کنترل کنید. در این مقاله نگاهی به مدیریت حافظه در دلفی و همچنین حافظه‌های Heap و Stack خواهیم داشت. 		iDevCenter

تخصیص خودکار حافظه
وقتی شما از نوع‌های پایه (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 می باشد. این بدان معناست که آخرین حافظه شیء شما تخصیص داه خواهد شد و سپس حذف می شود. حافظه پشته در روتین‌های نوعی استفاده می‌شود. وقتی شما یک روتین را صدا میزنید، پارامترهایش و روتین نوع آن در پشته ریخته می شود. همچنین پارامترهایی که در یک روتین تعریف میشوند، در پشته ذخیره میشوند و وقتی روتین خاتمه پیدا می کند تمام آنها به طور خودکار از بین می رود.

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫بدست آوردن مشخصات سیستم در VB.NET

بدست آوردن مشخصات سیستم در VB.NET

توسط: HosseinGates
تاریخ انتشار: 5 شهریور 1382

این مقاله شامل ترفندهایی جهت بدست آوردن مشخصات سیستم مانند نام ماشین، ورژن سیستم عامل و همچنین کاربردهای آنهاست. 		iDevCenter

در این مقاله به بررسی روشهایی پرداخته میشود که به کمک آن می‌توان چند مشخصه از مشخصات سیستم را بدست آورد و از آنها در برنامه‌های کاربردی خود استفاده کرد. این ویژگیها با استفاده از فضانام System.Environment بدست می آیند. کلاس Environment شامل اطلاعاتی در مورد محیط کار و پلات‌فرم حاضر روی سیستم و همچنین وسایلی در این زمینه می باشد. این کلاس نمی‌تواند به ارث برده شود.

نام ماشین (MachineName):
به کار بردن خصوصیت MachineName از این کلاس نام NetBIOS کامپیوتر مربوطه را برمی‌گرداند. با بکار بردن کد زیر در رویداد کلیک یک Button می‌توان نام ماشین را در یک جعبه متن نمایش داد:

TextBox1.Text = System.Environment.MachineName.ToString

ورژن سیستم عامل (OSVersion):
با استفاده از خصوصیت OSVersion می‌توانید ورژن سیستم عامل کامپیوتر کاربر را شناسایی کنید. برای مثال با بکار بردن کد زیر روی ویندوز ایکس پی، عدد 5.1.2600 به عنوان نتیجه برگردانده میشود.

TextBox1.Text = System.Environment.OSVersion.ToString

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

دایرکتوری سیستم (SystemDirectory):
خصوصیت SystemDirectory، نام دایرکتوری سیستم کاربر را برمی‌گرداند. من با اجرای این کد در کامپیوترم نتیجهء F:\WinNT\System32 را گرفتم. (ویندوز ایکس پی من روی درایو F نصب شده است).

TextBox1.Text = System.Environment.SystemDirectory.ToString

نام دامنه (UserDomainName):
این خصوصیت نام دامنه شبکهء کامپیوتر میزبان را اعلام میکند. مقدار این خصوصیت به طور معمول همان نام کامپیوتر میزبان است. برنامه شما باید تحت ویندوز ان تی 3.1 و یا بالاتر از به اجرا درآید؛ درغیراینصورت یک استثناء برپا خواهد شد (PlatformNotSupportedException).

TextBox1.Text = System.Environment.UserDomainName.ToString

نام کاربر (UserName):
مقدار خروجی این خصوصیت نام کاربری شخصی است که به سیستم وارد شده است. این خصوصیت می‌تواند جهت شناسایی کاربر حاضر در سیستم به کار گرفته شود و از آن برای کنترل دسترسی به برنامه و اهداف امنیتی بهره برد. از دیگر کاربرد‌های این خصوصیت، سفارشی کردن برنامه برای هر کاربر است.

TextBox1.Text = System.Environment.UserName.ToString

ورژن CLR ‏(Version):
این خصوصیت نگارش زبان معمول زمان اجرا (Common Language Runtime) را برمی‌گرداند.

TextBox1.Text = System.Environment.Version.ToString

TickCount:
این ویژگی یکی از ویژگیهای جالب ویندوز است که کاربردهای فراوانی دارد. این خصوصیت یک عدد 32 بیتی را برمی‌گرداند که نشان دهندهء زمانی است (بر حسب میلی ثانیه) که از روشن شدن سیستم میگذرد. این مقدار از تایمر سیستم گرفته میشود و در یک متغیر عددی 32-بیتی علامتدار ذخیره میشود. با توجه به اینکه این مقدار 32 بیت طول دارد، بنابراین اگر سیستم شما 24.9 روز روشن بماند، این مقدار صفر شده و ازنو شروع به شمردن میکند. دقت کنید این خصوصیت نمی تواند کمتر از 500 میلی ثانیه باشد. با بکار بردن کد زیر میتوان این مقدار را در یک جعبه متن نمایش داد:

TextBox1.Text = System.Environment.TickCount.ToString

از جمله کاربردهای خصوصیت TickCount میتوان به محدود کردن زمان استفاده از کامپیوتر توسط کاربر اشاره کرد که میتواند کاربردهای فراوانی داشته باشد.

نکته: توجه داشته باشید که TickCount با Tick تفاوت دارد. Tick عددی است با وقفه های به مدت 100 نانو ثانیه که شامل مدت زمانی است که از ساعت 12:00am مورخ 1/1/0001 میگذرد. این خصوصیت را میتوانید با استفاده از System.DateTime.Now.Ticks بدست بیاورید.

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫برسی کوکی‌ها (Cookies) و جلسات (Sessions) در ASP.NET

برسی کوکی‌ها (Cookies) و جلسات (Sessions) در ASP.NET

توسط: kiumars
تاریخ انتشار: 12 شهریور 1382

در این مقاله با کوکی‌ها و جلسات آشنا شده و نحوه عمل و بکارگیری آنها در ASP.NET را یاد خواهید گرفت. 		iDevCenter

در این مقاله ابتدا به بررسی کوکی‌ها (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ها باید به نکات زیر توجه کنید:
  • هر Session اگر کاریر مرورگر را ببندد یا 20 دقیقه از سرور درخواست نکند از بین می رود.
  • Session هر کاربر جدا از Session بقیه کاربران است.
  • در 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>

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫انواع روشهای انتقال مقادیر بین فرمهای وب در ASP.NET

انواع روشهای انتقال مقادیر بین فرمهای وب در ASP.NET

توسط: ehsan_valizadeh
تاریخ انتشار: 18 شهریور 1382

در این مقاله با سه روش QueryString، متغیرهای Session و متد Server.Transform برای انتقال مقادیر بین فرم‌های وب آشنا خواهید شد. 		iDevCenter

فرمهای وب ASP.NET، مدل برنامه‌نویسی رویدادگرای شگرفی را برای توسعه‌گران فراهم می‌کنند. این موضوع طراحی سرتاسر برنامه کاربردی شما را ساده می‌کند ولی مسائل و مشکلات خاص خود را نشان می‌دهد. برای مثال، در ASP کلاسیک شما به آسانی می‌توانید مقادیر را با استفاده از POST از یک صفحه ASP به صفحه‌ای دیگر ارسال نمایید. اما اگر می‌خواهید در مدل فرمهای وب (یا همان مدل برنامه‌نویسی ASP.NET) برنامه‌نویسی کنید، همان چیز در ASP.NET ممکن نمی‌باشد. اما راههایی برای غلبه بر این وضعیت وجود دارند که می‌توانند مورد استفاده قرار بگیرند. در این مقاله موضوعات زیر را مورد بررسی قرار خواهیم داد:

  • چگونگی ارسال مقادیر با استفاده از QueryString
  • چگونگی استفاده از متغیرهای Session برای ارسال مقادیر
  • چگونگی استفاده از متد Server.Transfer برای ارسال مقادیر

استفاده از QueryString
QueryString یک مکانیسم قدیمی برای ارسال مقادیر در بین صفحات است. مزیت اصلی این متد سادگی آن است. اما عیب آن این است که پس از ارسال، مقادیر در نوار آدرس مرورگر قابل مشاهده می‌باشند و نمی‌توان آبجکت‌ها را از این طریق ارسال کرد. این متد مناسب‌ترین راه برای ارسال تعداد کمی از مقادیری است که نیازی به محافظت از دید دیگران ندارند. برای اعمال کردن این متد مراحل زیر را انجام دهید:

  • یک فرم وب با کنترل‌هایش را درست کنید.
  • یک کنترل دکمه‌ای Button یا LinkButton برای ارسال فرم به سرور بر روی فرم قرار دهید.
  • در رویداد کلیک دکمه یک متغیر از نوع String تعریف کنید که URL را برای فرم دیگر که مقادیر قرار است به آنجا ارسال شوند، نگه می‌دارد.
  • مقادیر کنترل‌ها را در قالب پارامترهای QueryString در متغیر از نوع String قرار دهید.
  • از متد Response.Redirect که از متغیر String تعریف شده استفاده می‌کند برای هدایت کاربر به صفحه دیگر استفاده نمایید.
قطعه کد زیر چگونگی انجام این مراحل را نشان می‌دهد:

private void Button1_Click(object sender, System.EventArgs e)
{
   string url;
   url="anotherwebform.aspx?name=" +
      TextBox1.Text + "&email=" +
      TextBox2.Text;
   Response.Redirect(url);
}
فرم وب منبع

private void Page_Load(object sender, System.EventArgs e)
{
   Label1.Text=Request.QueryString["name"];
   Label2.Text=Request.QueryString["email"];
}
فرم وب مقصد

استفاده از متغیرهای Session
در این روش باید مقادیر کنترل‌ها را در متغیرهای Session ذخیره کنیم و در فرم وب دیگری به آنها دسترسی داشته باشیم. همانطور که می‌دانید ذخیره داده‌های زیاد در Session ممکن است اختلالاتی را در سرور بوجود آورد، بنابراین باید از این متد بدرستی استفاده شود. البته هر وقت که خواستید می‌توانید متغیرهای Session را از بین ببرید. مراحل اصلی برای استفاده از این متد به ترتیب زیر می‌باشد:

  • یک فرم وب با کنترل‌هایش را درست کنید.
  • یک کنترل دکمه‌ای Button یا LinkButton برای ارسال فرم به سرور بر روی فرم قرار دهید.
  • در رویداد کلیک دکمه، متغیرهای Session را تعریف کرده و مقادیر کنترل‌ها را در آنها قرار دهید.
  • کاربر را با استفاده از Server.Transfer به صفحه‌ای دیگر هدایت کنید.
  • در فرم وب دیگر متغیرهای Session را دریافت کرده و پس از دریافت اگر لازم باشد آنها را پاک کنید.
کد زیر این مراحل را در عمل نشان می‌دهد:

private void Button1_Click(object sender, System.EventArgs e)
{
   // textbox1 and textbox2 are webform controls
   Session["name"]=TextBox1.Text;
   Session["email"]=TextBox2.Text;
   Server.Transfer("anotherwebform.aspx");
}
فرم وب منبع

private void Page_Load(object sender, System.EventArgs e)
{
   Label1.Text=Session["name"].ToString();
   Label2.Text=Session["email"].ToString();
   Session.Remove("name");
   Session.Remove("email");
}
فرم وب مقصد

استفاده از Server.Transfer
این روش متدی پیچیده ولی روش ماهرانه‌ای برای ارسال مقادیر بین صفحات است. در اینجا مقادیری را که می‌خواهید در صفحات دیگر به آنها دسترسی داشته باشید به عنوان خصوصیات کلاس صفحه بیان می‌کنید. در کل این متد واضحتر و شیءگراتر از متدهای قبلی است. مراحل زیر را برای استفاده از این متد بترتیب دنبال کنید:

  • یک فرم وب با کنترل‌هایش را درست کنید.
  • رویدادهای خصوصیت Get که مقادیر کنترل‌ها را برخواهند گرداند را تعریف کنید.
  • یک کنترل دکمه‌ای Button یا LinkButton برای ارسال فرم به سرور بر روی فرم قرار دهید.
  • در رویداد کلیک دکمه متد Server.Transfer که اجرای برنامه را به فرم تعیین شده انتقال می‌دهد فراخوانی کنید.
  • در فرم دوم شما می‌توانید با استفاده از خصوصیت Context.Handler به یک نمونه از فرم اول دسترسی داشته باشید. سپس می‌توانید از خصوصیات Get که برای دسترسی به مقادیر کنترل‌ها ایجاد کرده‌ایم استفاده کنید.
کد زیر برای اجرای یک نمونه از مراحل بالا تدارک دیده شده است. خصوصیات زیر را به فرم وب اضافه کنید:

public string Name
{
   get
   {
      return TextBox1.Text;
   }
}

public string EMail
{
   get
   {
      return TextBox2.Text;
   }
}
فرم وب منبع

حال Server.Transfer را فراخوانی کنید.

private void Button1_Click(object sender, System.EventArgs e)
{
   Server.Transfer("anotherwebform.aspx");
}
فرم وب منبع

private void Page_Load
(object sender, System.EventArgs e)
{
   //create instance of source web form
   WebForm1 wf1;

   //get reference to current handler instance
   wf1=(WebForm1)Context.Handler;
   Label1.Text=wf1.Name;
   Label2.Text=wf1.EMail;
}
فرم وب مقصد

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫ذخیره کردن Connection String در فایل Web.Config

ذخیره کردن Connection String در فایل Web.Config

توسط: ehsan_valizadeh
تاریخ انتشار: 18 شهریور 1382

با استفاده از فایل Web.Config در ASP.NET میتوانید مقادیر عمومی مانند رشته اتصال (ConnectionString) را بین تمام صفحات خود به اشتراک بگذارید. 		iDevCenter

بسیاری اوقات برنامه‌های کاربردی نیاز دارند که چیزهای خاصی مانند Connection String (رشته اتصال) یا پارامترهای عمومی برنامه، به طور خارجی برای برنامه ذخیره شوند. راه قدیمی برای این کار استفاده از فایلهای INI یا وارد کردن آنها در Registry بود. البته هر کدام از این روشها مشکلات خاص خود را دارند. ASP.NET راه مناسبی را برای انجام آن فراهم کرده است. شما می‌توانید این قبیل مقادیر را قسمت <appSettings> فایل Web.Config ذخیره کنید. کد زیر بیانگر این مطلب می‌باشد.

ذخیره کردن مقادیر در Web.Config
کد زیر را به فایل Web.Config خود اضافه کنید:

<configuration>
   <appSettings>
      <add key="connectionstring"
         value="Integrated Security=SSPI;
         Initial Catalog=Northwind;
         Data Source=MyServer\NetSDK" />
    </appSettings>
</configuration>

فضانامهای مورد نیاز
فضانامهای زیر کلاسهای مورد نیاز برای این کار را فراهم می‌کنند:

System.Collections.Specialized
System.Configuration

کد VB.NET برای بازیابی مقادیر
کد زیر چگونگی بازیابی مقادیر را با استفاده از VB.NET نشان می‌دهد:

Dim myvar As String
Dim nv As NameValueCollection
nv = ConfigurationSettings.AppSettings()
myvar = nv("connectionstring")

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

Dim myvar As String
myvar=ConfigurationSettings.AppSettings("connectionstring")

کد #C برای بازیابی مقادیر
کد زیر چگونگی بازیابی مقادیر را با استفاده از #C نشان می‌دهد:

string myvar;
NameValueCollection nv;
nv=ConfigurationSettings.AppSettings;
myvar=nv["connectionstring"];

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

string myvar;
myvar=ConfigurationSettings.AppSettings["connectionstring"];

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫نگاهی به فیلترهای CSS در HTML

نگاهی به فیلترهای CSS در HTML

توسط: alirezagolkari
تاریخ انتشار: 4 مهر 1382

یكی از امكانات جالبی كه CSS در اختیار ما میگذارد، خصوصیتی بنام Filter میباشد كه بوسیله آن میتوان به تصاویر و متن‌های درون صفحه وب افكتهای ویژه‌ای را اضافه كرد. 		iDevCenter

تقریبا تمام کسانی که با طراحی صفحات وب و یا HTML سروکار دارند با (CSS (Cascading Style Sheets آشنایی دارند. با استفاده از CSS نحوه نمایش اطلاعات درون صفحه وب مشخص میشود و این کار بسیار راحتتر از HTML است. همچنین انجام بعضی از انواع قالب بندی‌هایی که با CSS امکان پذیر است با دستورات HTML امکان پذیر نیست.

یکی از امکانات جالبی که CSS در اختیار ما میگذارد خصوصیتی بنام Filter میباشد که بوسیله آن میتوان به تصاویر و متهای درون صفحه وب افکتهای متفاوتی را اضافه کرد. بطور مثال شما قادر خواهید بود درون یک صفحه وب یک متن سایه دار داشته باشید بدون اینکه از عکس بجای متن استفاده کنید که این خود باعث میشود ویرایش کردن متن مورد نظر شما نیز به راحتی صورت گیرد، چون دیگر شما با یک تصاویر کار ندارید، بلکه متن مورد نظر خود را به راحتی ویرایش میکنید. همچنین شما قادر خواهید بود که شفافیت یک عکس را کم کنید یا آن را وارونه کنید. اینها فقط چند نمونه از امکانات خصوصیت Filter در CSS است. در ادامه این مقاله امکانات و نحوه استفاده از خصوصیت Filter را بیان خواهیم کرد.

باید دقت داشت که برای کار کردن فیلترها همیشه باید خصوصیت width را برای تگ مورد نظر تنظیم کنید. در غیر این صورت این فیلترها از کار خواهند افتاد. در این مقاله برای اضافه کردن فیلترها از تگ DIV استفاده شده است. و برای راحتی کار با نوشتن دستورات زیر، خصوصیت width برای همه تگهای DIV تنظیم شده است. توجه داشته باشید که این دستورات باید در قسمت head صفحه وب و قبل از تگ <head/> نوشته شوند.

<style>
   <!--
     div {width: 100%;}
    -->
</style>

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

<div style="فیلتر مورد نظر">
   محتویاتی که قرار است فیلتر بر روی آن اعمال شود
   این محتویات میتواند هرچیزی باشد مثلا متن یا تصویر
</div>

بطور مثال:

<div style="filter: alpha(opacity=30);">
   <img src="1.jpg" width="100" height="100">
</div>

برای مشخص شدن خصوصیتهای مختلف دستور filter و نتایج استفاده از هرکدام از جدول زیر استفاده شده است. در جدول زیر سعی شده دستورات مربوط به خصوصیت filter با تنظیمات مختلف نشان داده شود. همچنین این کدها به عنوان نمونه هستند و خود شما با تغییر هرکدام از پارامترها میتوانید جلوه‌های متفاوتی را ایجاد کنید. در قسمت مربوط به توضیحات هم سعی شده پارامترهای اصلی هرکدام از فیلترها را بطور مختصر معرفی شوند.

دقت داشته باشید که برای مشاهده جلوه‌های بیان شده به مرورگر Internet Explorer 4.0 یا بالاتر از آن نیاز است.

filter: alpha(opacity=30);
alpha: با این فیلتر میتوان میزان نمایان بودن یک تصویر را مشخص نمود.
opacity: مقدارد نمایان شدن تصویر را مشخص مکند که مقداری بین 0 تا 100 را میپذیرد.

filter:alpha(opacity=0, finishopacity=100, style=1, startx=0, starty=0, finishx=100, finishy=100);
در این قسمت تمام پارامترهای خصوصیت alpha نشان داده شده است. با استفاده از این پارامترها میتوان میزان نمایش داده شدن یک شکل را از کم به زیاد تعیین نمود.

filter:alpha(opacity=100, finishopacity=10, style=2, startx=0, starty=0, finishx=100, finishy=100);
این مثال با همان پارامترهایی که در مثال قبل آمده بود بیان شده و فقط مقادیر پارامترهایی که بصورت رنگی در آمده‌اند تغییر کرده‌اند. همچنین پارامتر style‌ میتواند مقادیری بین 0 تا 3 داشته باشد.

filter:blur(add=false, direction=90, strength=7);
با این فیلتر میتوان تصویر را محو کرد.
direction: زاویه محو شدن شکل
strength: میزان تاثیر این فیلتر

filter:blur(add=true, direction=90, strength=7);
add: این پارامتر مشخص میکند که آیا تصویر اولیه نیز با تصویر ایجاد شده جدید ترکیب شود یا خیر.

filter:fliph;
چرخش بصورت افقی

filter:flipv;
چرخش بصورت عمودی

filter:gray;
ایجاد جلوه سیاه و سفید

filter:xray;
ابتدا شکل را سیاه و سفید و سپس میزان رنگها و روشنایی را معکوس میکند.

filter:invert;
میزان رنگها و روشنایی را معکوس میکند.

filter: mask(color=#ffffff);
این فیلتر به این صورت عمل میکند که محتویات مورد نظر را با یک رنگ خواص به صورت شفاف در می‌آورد. در اینجا عکس مورد نظر به عنوان زمینه (background) تعیین شده و با تنظیم رنگ با رنگ زمینه دلخواه (در اینجا سفید) در اصل ما رنگ متن را با یک تصویر پر کرده ایم.
iDevCenter

filter:glow(color=#ff8000, strength=5);
ایجاد حالت روشنایی با رنگ و میزان دلخواه در اطراف متن مورد نظر

iDevCenter

filter:blur;
همان فیلتر blur اما بدون پارامتر

iDevCenter

filter:shadow(color=#666666, direction=135);
ایجاد جلوه سایه با رنگ و زاویه دلخواه

iDevCenter

filter:dropshadow(color=#999999, offx=3, offy=3, positive=true);
نمایش سایه یک متن با رنگ دلخواه در موقعیت دلخواه

iDevCenter

filter:wave(strength=3);
ایجاد جلوه موجی شکل به اندازه دلخواه

iDevCenter

filter:fliph();
چرخش بصورت افقی

iDevCenter

filter:flipv();
چرخش بصورت عمودی

iDevCenter

منابع

  • w3schools.com

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫نشان دادن تصاویر در DataGrid بر اساس داده‌های پایگاه داده

نشان دادن تصاویر در DataGrid بر اساس داده‌های پایگاه داده

توسط: ehsan_valizadeh
تاریخ انتشار: 10 مهر 1382

با استفاده از این مقاله خواهید توانست در کنترل‌های DataGrid خود علاوه بر متون و لینک‌ها تصاویر را نیز نمایش دهید. 		iDevCenter

کنترل DataGrid پیچیده‌ترین کنترلی است که در ASP.NET وجود دارد. با استفاده از DataGrid امکان فرمت دهی و نمایش٬ مرتب سازی و صفحه بندی رکوردهای جداول بانک اطلاعاتی فراهم می شود. در اینجا میخواهیم با استفاده از قابلیتهای این کنترل روشی را برای نشان دادن تصاویر در آن بررسی کنیم. هر کدام از این تصاویر قرار است در رکورد مربوط به خود در کنترل DataGrid نمایش داده شوند. هر رکورد داده های دیگری را نیز شامل می شود که همه آنها در جدول products واقع در پایگاه داده products.mdb قرار دارند. هر رکورد شامل ستونی به نام ImageName (از نوع داده Text) میباشد که نام تصویر مربوط به رکورد را شامل میشود.

تعریف ستون برای کنترل DataGrid
وقتی که یک منبع داده مانند یک DataSet را به کنترل DataGrid مقید میکنیم٬ خود کنترل همه کارها را انجام میدهد و همه رکوردها را به طور اتوماتیک نمایش میدهد. ولی اگر بخواهیم ستونهای کنترل DataGrid را تحت کنترل خود درآورده و فقط ستونهای دلخواه را نمایش دهیم باید خودمان برای کنترل DataGrid ستون تعریف کنیم. قبل از اینکه بتوانیم ستونی را برای DataGrid تعریف کنیم٬ لازم است که خصوصیت AutoGenerateColumns آنرا برابر False قرار دهیم. پس از انجام این کار میتوانیم شروع به تعریف ستون برای کنترل DataGrid نماییم. کنترل DataGrid پنج نوع ستون را می شناسد که عبارتند از:
  • BoundColumn: نوع پیش فرض ستونها که رکوردها را نمایش میدهد.
  • HyperLinkColumn: که رکوردها را به صورت یک Hyperlink نمایش میدهد.
  • TemplateColumn: که رکوردها را با استفاده از یک الگوی مشخص نمایش میدهد.
  • ButtonColumn: که کنترلهایی از نوع Button را نمایش میدهد.
  • EditCommandButton: که فرامین ویرایش همانند Edit ،Update و Cancel را نمایش میدهد.
در نمونه کدی که همراه مقاله میتوانید آنرا دریافت کنید٬ کنترل DataGrid را به صورت زیر تعریف کرده‌ایم:

<asp:Datagrid id="dg" runat="server" AutoGenerateColumns="False"
BorderColor="Black"Font-Size="10" Font-Name="Arial" BackColor="#C6C3FF"
Headerstyle-Font-Size="12" Headerstyle-Font-Bold="True"
Headerstyle-Font-Name="Arial" Headerstyle-Forecolor="#0F0F0F"
Headerstyle-BackColor="#8482C6" cellspacing="0" cellpadding="0">

   <columns>
      <asp:BoundColumn HeaderStyle-HorizontalAlign="Center"
      DataField="ProdName" HeaderText="ProdName" />
      <asp:TemplateColumn HeaderStyle-HorizontalAlign="Center">
         <HeaderTemplate>
            Images
         </HeaderTemplate>
         <ItemTemplate>
            <div align="center">
               <img src='/prodimages/<%# Container.DataItem("ImageName") %>' />
            </div>
         </ItemTemplate>
      </asp:TemplateColumn>
      <asp:BoundColumn DataField="Comments" HeaderText="Comments" />
   </columns>
</asp:Datagrid>

در کدهای مربوط به کنترل DataGrid سه ستون برای آن تعریف شده است. ستون اول از نوع BoundColumn، ستون دوم از نوع TemplateColumn و ستون سوم هم دوباره از نوع BoundColumn تعریف شده‌اند. در ستونهایی که از نوع BoundColumn می باشند٬ انتساب نام فیلد جدول بانک اطلاعاتی به خصوصیت DataField ستون٬ برای نمایش دادن داده‌های آن فیلد در ستون DataGrid کافی میباشد.

تعریف ستون TemplateColumn برای کنترل DataGrid
وقتی که میخواهیم اختیارات بیشتری را در تعیین فرمت یک ستون داشته باشیم از الگوی TemplateColumn استفاده میکنیم. ستونی که از نوع TemplateColumn برای کنترل DataGrid تعریف میشود٬ میتواند الگوهای زیر را داشته باشد:

  • HeaderTemplate: تعیین کننده فرمت متنی است که در بالای ستون نمایش داده میشود.
  • ItemTemplate: تعیین کننده فرمت آیتم‌های اصلی ستون میباشد.
  • EditItemTemplate: تعیین کننده فرمت آیتمی است که به قصد ویرایش انتخاب شده است.
  • FooterTemplate: تعیین کننده فرمت آیتمی است که پایین ستون نمایش داده میشود.
در کد مربوط به تعریف کنترل DataGrid از دو الگوی HeaderTemplate و ItemTemplate استفاده شده است. در داخل HeaderTemplate کلمه Images نوشته شده است که موقع اجرا در بالای ستون نمایش داده میشود. کار اصلی برای نمایش تصاویر در داخل الگوی ItemTemplate انجام شده است. در اینجا با کدهای HTMLی که در زیر دوباره آنها را مشاهده میکنید توانسته‌ایم تصاویر مربوط به رکوردها را نمایش دهیم.

<div align="center">
   <img src='/prodimages/<%# Container.DataItem("ImageName") %>' />
</div>

در اینجا با استفاده از تگ <img> تصاویر را از داخل پوشه prodimages نمایش داده ایم. نام تصاویر با استفاده از عبارت <%# Container.DataItem("ImageName") %> تعیین شده است که مقدار ستون ImageName برای هر رکورد را بازمیگرداند.

تمام کد مربوط به صفحه و همچنین پایگاه داده products.mdb را می توانید همراه مقاله دریافت نمایید.

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫حفظ وضعیت فرمهای وب هنگام استفاده از Server.Transfer

حفظ وضعیت فرمهای وب هنگام استفاده از Server.Transfer

توسط: ehsan_valizadeh
تاریخ انتشار: 10 مهر 1382

شاید شما هم این تصور غلط را داشته باشید که متد Server.Transfer نمیتواند برای ارسال وضعیت فرم به فرمی دیگر به کار رود! اما با اعمال مقداری تغییرات میتوان این کار را به آسانی انجام داد. 		iDevCenter

در ASP کلاسیک برای ارسال یک فرم به فرمی دیگر باید صفت action فرم را مقداردهی نماییم٬ ولی در ASP.NET این کار به همان صورت میسر نمی باشد. مدل فرمهای وب ASP.NET مستلزم آن است که هر فرم به خودش ارسال شود. اگر شما می خواهید که یک کنترل را از یک فرم به فرمی دیگر انتقال دهید٬ باید از متد Server.Transfer استفاده نمایید. همچنین در رابطه با نحوه ارسال مقادیر بین فرمها میتوانید به مقاله قبلی من با عنوان انواع روشهای انتقال مقادیر بین فرمهای وب در ASP.NET مراجعه کنید. بسیاری از برنامه نویسان ASP.NET این تصور غلط را دارند که متد Server.Transfer نمیتواند برای ارسال وضعیت فرم به فرمی دیگر به کار رود٬ اما با اعمال مقداری تغییرات میتوانید این کار را به آسانی انجام دهید.

متد Server.Transfer
متد Server.Transfer برای ارسال کنترل از یک فرم به فرمی دیگر استفاده می شود. بر خلاف Response.Redirect – که در واقع از مرورگر می خواهد که یک درخواست دیگری را بوجود آورد - Server.Transfer باعث انتقال کنترل در طرف سرور می شود. متد Server.Transfer دو پارامتر را دریافت می کند: یک فرم وب که کنترل یا کنترل ها قرار است به آنجا ارسال شوند٬ دیگری یک مقدار Boolean که نشان دهنده آن است که وضعیت فرم فعلی در فرم جدید حفظ خواهد شد یا نه. اجازه دهید برنامه ای بسازیم که مشکلی را هنگام استفاده از این متد نشان می دهد٬ سپس نحوه حل این مشکل را بررسی خواهیم کرد.

مشکل هنگام استفاده از Server.Transfer
یک برنامه ASP.NET بسازید و دو فرم را به آن اضافه کنید. اجازه دهید نام فرمها را Page1.aspx و Page2.aspx بگذاریم. در فرم Page1.aspx یک کنترل جعبه متن با TextBox1 ،ID و یک کنترل Button قرار دهید. در رویداد کلیک دکمه کد زیر را بنویسید:

Server.Transfer("Page2.aspx", True)

سپس برنامه را با درخواست Page1.aspx اجرا کنید. مقداری را در کنترل جعبه متن وارد کرده و بر روی دکمه کلیک نمایید. در این حالت یک پیغام خطا با توضیح "The View State is invalid for this page and might be corrupted" را دریافت خواهید کرد. این خطا به علت یکی از صفات دایرکتیو Page@ فرم دوم (یعنی Page2.aspx) به نام EnableViewStateMac اتفاق می افتد. به صورت پیش فرض این صفت مقدار True را دارد و این امر باعث ایجاد خطا می شود.

EnableViewStateMac چیست؟
در زیر توضیحی را در مورد EnableViewStateMac از مستندات MSDN مشاهده می کنید:

Indicates that ASP.NET should run a machine authentication check (MAC) on the page's view state when the page is posted back from the client. true if view state should be MAC checked; otherwise, false. The default is false. Note: A view state MAC is an encrypted version the hidden variable that a page's view state is persisted to when sent to the browser. When you set this attribute to true, the encrypted view state is checked to verify that it has not been tampered with on the client.

زمانی که شما درخواست را برای صفحه می فرستید٬ مقدار EnableViewStateMac برای دایرکتیو Page صفحه True می باشد.

راه حل
به منظور غلبه بر مشکل حفظ وضعیت که در بالا مطرح شد٬ باید به طور صریح مقدار صفت EnableViewStateMac در دایرکتیو Page صفحه دوم (Page2.aspx) را برابر False قرار دهید:

<%@ Page Language="vb" EnableViewStateMac="False"%>

اکنون شما میتوانید به مقادیری که در TextBox1 در فرم Page1.aspx وارد شده است٬ دسترسی داشته باشید (در اینجا TextBox1 همان ID کنترل جعبه متن موجود در فرم Page1.aspx می باشد):

Response.Write(Request.Form("TextBox1"))

پرکردن محتوای کنترلهای فرم Page2.aspx با داده‌های دریافت شده از فرم Page1.aspx
فکر می کنید چطور میتوان محتوای کنترلهای واقع بر فرم Page2.aspx را با داده‌های رسیده توسط متد Server.Transfer پرکرد؟ میتوان این کار را به سادگی با یکی کردن ID کنترلهای فرم Page2.aspx با ID کنترلهای فرم Page1.aspx انجام داد. در برنامه نمونه که همراه مقاله میتوانید آنرا دریافت نمایید، مشاهده می‌کنید که IDهای دو کنترل جعبه متن واقع بر فرم Page1.aspx همان IDهای دو کنترل جعبه متن دیگر واقع در فرم Page2.aspx می باشند. اگر این IDها را در هر یک از فرمها تغییر دهیم دیگر نمیتوان مقادیر کنترلهای فرم Page1.aspx را در فرم دوم در کنترل‌ها جای داد.

خلاصه
ما در این مقاله نحوه ارسال کنترلها را از یک فرم وب به فرم وب دیگر همراه با حفظ داده‌های فرم بررسی کردیم. با مقداردهی مناسب صفت EnableViewStateMac برای دایرکتیو Page فرم دریافت کننده داده‌ها٬ توانستیم امکان چنین انتقالی بین دو فرم را فراهم بیاوریم. میتوانید از برنامه نمونه همراه مقاله برای دیدن نحوه انجام این کار استفاده نمایید.

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫ساختن فرم جمع آوری اطلاعات به صورت پویا بر پایه XML

ساختن فرم جمع آوری اطلاعات به صورت پویا بر پایه XML

توسط: HosseinGates
تاریخ انتشار: 18 مهر 1382

در این مقاله به چگونگی ساخت یک فرم ویندوز جهت جمع آوری اطلاعات و قرار دادن کنترلها بر روی آن به صورت پویا از طریق یک فایل XML می‌پردازیم. 		iDevCenter

XML یکی از مهمترین ارکان ویژوال استودیو دات نت است که امروزه در صنعت فناوری اطلاعات کاربرد بسیاری دارد. در این مقاله به چگونگی ساخت یک فرم جمع آوری اطلاعات و قرار دادن کنترلها بر روی آن به صورت پویا می‌پردازیم. اما قرار دادن کنترلها بر روی فرم به صورت کلاسیک و قدیمی صورت نمی‌گیرد بلکه این کار از روی یک فایل XML انجام می‌شود. در واقع این فایل XML برای برنامه مشخص می‌سازد که سوالات و جوابهای ما در قالب چه کنترلهایی بر روی فرم به نمایش درآیند. با این کار برای بروز رسانی برنامه کافیست سوالات و جوابهای خود را در فایل XML بروز کنیم بدون آنکه در برنامه خود تغییری ایجاد کنیم.

در مرحله اول یک شئ از فرم frmSurveyForm میسازیم. این فرم شامل دو دکمه OK و Cancel است که از پیش طراحی شده و سایر کنترلها را نیز بطور پویا ایجاد میکنیم. همچنین یک کلکسیون از کنترلها به نام surveyControls میسازیم که همان کلکسیون کنترلهایی است که قرار است بر روی فرم قرار گیرد. کلکسیونها، آرایه‌هایی هستند که اعضای آن میتوانند از چند نوع داده تشکیل شوند. همانطور که میدانید در ویژوال بیسیک دات نت تمام کنترلها درون یک کلکسیون قرار داده میشوند و به هر کدام از آنها یک شماره اختصاص داده میشود که میتوان با فراخوانی اندیس هر عضو به آن کنترل دسترسی پیدا کرد. توجه داشته باشید که آخرین کنترل اضافه شده به فرم اولین اندیس را دارد. این کدها را میتوان در رویداد یک دکمه قرار داد:

Dim survey As New frmSurveyForm()
Dim surveyControls As Control.ControlCollection = survey.SurveyFormControls

m_Location = New Point(10, 10)

Dim xr As New Xml.XmlDocument()
xr.Load("..\Questions.xml")

xr یک سند XML است که پس از ساختن آن یک سند XML را از به آن نسبت میدهیم. در این مثال فایل XML مورد نظر را در همان پوشه پروژه قرار داده‌ایم. این فایل به این مقاله ضمیمه شده است. سپس یک متغیر رشته‌ای به نام myTag میسازیم که این متغیر شامل مقدار خصوصیت name از تگ survey میباشد. استفاده از تگهای سند XML فواید زیادی را دربر دارد. با این روش برنامه قابلیت گسترش بیشتری را خواهد داشت و میتوان با اضافه کردن یا کاهش سوالات/ جوابها برنامه را به روز کرد.

Dim myTag As String = xr.SelectSingleNode("//survey").Attributes("name").Value

از سند XML خصوصیت displayName را خوانده و آنرا به عنوان Caption فرم ست میکنیم.

survey.SurveyTitle = xr.SelectSingleNode("//survey").Attributes("displayName").Value

خصوصیت SurveyTitle قبلا درون فرم frmSurveyFrom بصورت زیر تعریف شده است:

Public Property SurveyTitle() As String
  Get
    Return m_Title
  End Get

  Set(ByVal Value As String)
    m_Title = Value
    Me.Text = m_Title
  End Set
End Property

یک لیست گره (XMLNodeList) که شامل هر یک از سوالات میاشد ساخته و آنرا پر میکنیم:

Dim nodeList As Xml.XmlNodeList
nodeList = xr.GetElementsByTagName("question")

یک گره XML موقت میسازیم که هنگام بازیابی اطلاعات در مورد گره‌ها از لیست گره‌هایی که ساختیم به کار میرود. پس از آن شروع به خواندن یک به یک گره‌ها میکنیم و با توجه به خصوصیت type از هر گره کنترلی مناسب با آن میسازیم. این کار را با فراخوانی توابع نوشته شده انجام میدهیم. برای مثال اگر نوع آن برابر dropdown باشد با فراخوانی تابع Survey_AddComboBox یک ComboBox روی فرم ساخته میشود.

Dim myNode As XmlNode

For Each myNode In nodeList
  If Not myNode.Attributes Is Nothing Then

    Select Case myNode.Attributes("type").Value
      Case "dropdown"
      m_Location = Survey_AddComboBox(myNode, surveyControls, _
                           m_Location, myTag)

      Case "multilist"
      m_Location = Survey_AddListBox(myNode, surveyControls, _
                           m_Location, myTag, True)

      Case "text"
      m_Location = Survey_AddTextBox(myNode, surveyControls, _
                           m_Location, myTag)

      Case "radio"
      m_Location = Survey_AddRadioButtons(myNode, surveyControls, _
                           m_Location, myTag)
    End Select
  End If
Next

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

Private m_Location As New Point(10, 10)

مقدار خروجی توابع فوق همان m_Locaton است که با این کار پس از ساختن هر کنترل مقدار این متغیر که نشان دهنده مکان کنترل بعدیست تنظیم میشود. همچنین مقداری فضا را برای دو دکمه OK و Cancel خالی میگذاریم. ثابت CONTROL_WIDTH قبلا تعریف شده است و برابر عدد 300 است.

survey.Width = m_Location.X + CONTROL_WIDTH + 30
survey.Height = m_Location.Y + 75

در آخر نیز فرم را نمایش می دهیم:

survey.ShowDialog()

همانطور که مشاهده کردید با این روش یک فرم جمع آوری اطلاعات ساختیم. در قسمت دوم این مقاله به بررسی چگونگی ساخت کنترلها به صورت پویا می پردازیم. این کار را با توضیح توابع Survey_AddComboBox و Survey_AddListBox و Survey_AddTextBox و Survey_AddRadioButtons انجام می دهیم. همچنین خصوصیاتی در قسمت کد فرم frmSurveyFrom تعریف شده است که میتوانید با استفاده از فایل ضمیمه این مقاله آنها را مشاهده کنید.

تابع Survey_AddComboBox:
این تابع یکComboBox به کلکسیون کنترلها اضافه میکند. همچنین یک Label جهت نمایش سوال مربوطه نیز ساخته میشود.

Private Function Survey_AddComboBox(ByVal inNode As XmlNode, _
        ByVal inControls As Control.ControlCollection, _
        ByVal location As Point, ByVal tag As String) As Point

  Dim myCombo As New ComboBox()
  myCombo.Text = ""
  myCombo.Name = inNode.Attributes("name").Value
  myCombo.Tag = tag
  myCombo.Width = CONTROL_WIDTH

  Dim myNode As XmlNode
  For Each myNode In inNode.SelectNodes("responses/response")
    myCombo.Items.Add(myNode.InnerText)

    If Not myNode.Attributes("default") Is Nothing Then
      If myNode.Attributes("default").Value = "true" Then
        myCombo.Text = myNode.InnerText
      End If
    End If
  Next

  Dim myLabel As New Label()
  myLabel.Name = myCombo.Name & "Label"
  myLabel.Text = inNode.SelectSingleNode("text").InnerText
  myLabel.Width = CONTROL_WIDTH

  myLabel.Location = location
  inControls.Add(myLabel)
  location.Y += myLabel.Height

  myCombo.Location = location
  inControls.Add(myCombo)
  location.Y += myCombo.Height + 10

  Return location
End Function

در این تابع ابتدا یک ComboBox جدید ساخته و خصوصیات آنرا تنظیم میکنیم. پس از آن یک گره XML موقت جهت بازیابی اطلاعات از گره response می‌سازیم و سپس با خواندن گره‌ها اطلاعات آنها را به لیست اضافه می‌کنیم. اگر خصوصیت Default یک گره مقدار true داشته باشد، مقدار آن گره به عنوان مقدار Text در ComboBox نوشته میشود. پس از آن یک Label جدید ساخته و آنرا به کلکسیون کنترلها اضافه میکنیم. در آخر ComboBox جدید هم به کلکسیون کنترلها اضافه می‌شود. همچنین مقدار m_Location به عنوان مکان کنترل بعدی برگرداننده می‌شود.

تابع Survey_AddListBox:
این تابع یک لیست باکس (ListBox) به کلکسیون کنترلها اضافه میکند. همچنین یک Label جهت نمایش سوال مربوطه نیز ساخته میشود.

Private Function Survey_AddListBox(ByVal inNode As XmlNode, _
        ByVal inControls As Control.ControlCollection, _
        ByVal location As Point, ByVal tag As String, _
        ByVal isMultiSelect As Boolean) As Point

  Dim myList As New ListBox()
  myList.Text = ""
  myList.Name = inNode.Attributes("name").Value
  myList.Tag = tag
  myList.Width = CONTROL_WIDTH

  If isMultiSelect Then
    myList.SelectionMode = SelectionMode.MultiSimple
  Else
    myList.SelectionMode = SelectionMode.One
  End If

  Dim myNode As XmlNode
  For Each myNode In inNode.SelectNodes("responses/response")
    myList.Items.Add(myNode.InnerText)

    If Not myNode.Attributes("default") Is Nothing Then
      If myNode.Attributes("default").Value = "true" Then
        myList.Text = myNode.InnerText
      End If
    End If
  Next

  Dim myLabel As New Label()
  myLabel.Name = myList.Name & "Label"
  myLabel.Text = inNode.SelectSingleNode("text").InnerText
  myLabel.Width = CONTROL_WIDTH

  myLabel.Location = location
  inControls.Add(myLabel)
  location.Y += myLabel.Height

  myList.Location = location
  inControls.Add(myList)
  location.Y += myList.Height + 10

  Return location
End Function

در این تابع ابتدا یک ListBox جدید ساخته و خصوصیات آن از جمله خصوصیت MultiSelect را با توجه به پارامتر ارسال شده تنظیم میکنیم. پس از آن یک گره XML موقت جهت بازیابی اطلاعات از گره response می‌سازیم و سپس با خواندن گره‌ها اطلاعات آنها را به لیست اضافه می‌کنیم. اگر خصوصیت Default یک گره مقدار true داشته باشد، مقدار آن گره به عنوان مقدار Text در ListBox نوشته میشود. در آخر نیز ListBox جدید به کلکسیون کنترلها اضافه شده و مقدار m_Location به عنوان مکان کنترل بعدی برگرداننده می‌شود.

تابع Survey_AddRadioButtons:
این تابع یک GroupBox به کلکسیون کنترلهای قبلی اضافه میکند که شامل دکمه های رادیویی و یک Lable برای نمایش سوالات است.

Private Function Survey_AddRadioButtons(ByVal inNode As XmlNode, _
        ByVal inControls As Control.ControlCollection, _
        ByVal location As Point, ByVal tag As String) As Point

  Dim myGroupBox As New GroupBox()
  myGroupBox.Text = ""
  myGroupBox.Name = inNode.Attributes("name").Value
  myGroupBox.Tag = tag
  myGroupBox.Width = CONTROL_WIDTH + 20

  Dim myRadio As RadioButton
  Dim myRadioPoint As New Point(5, 10)
  Dim myNode As XmlNode

  For Each myNode In inNode.SelectNodes("responses/response")
    myRadio = New RadioButton()
    myRadio.Text = myNode.InnerText
    myRadio.Location = myRadioPoint
    myRadioPoint.Y += myRadio.Height

    If Not myNode.Attributes("default") Is Nothing Then
      If myNode.Attributes("default").Value = "true" Then
        myRadio.Checked = True
      End If
    End If

    myGroupBox.Controls.Add(myRadio)
  Next

  myGroupBox.Height = myRadioPoint.Y + 5

  Dim myLabel As New Label()
  myLabel.Name = myGroupBox.Name & "Label"
  myLabel.Text = inNode.SelectSingleNode("text").InnerText
  myLabel.Width = CONTROL_WIDTH

  myLabel.Location = location
  inControls.Add(myLabel)
  location.Y += myLabel.Height - 5

  myGroupBox.Location = location
  inControls.Add(myGroupBox)
  location.Y += myGroupBox.Height + 10

  Return location
End Function

در این تابع ابتدا یک GroupBox جدید ساخته و خصوصیات آنرا تنظیم میکنیم. پس از آن یک دکمه رادیویی میسازیم. بعد از آن با استفاده از یک حلقه جوابها را در دکمه های رادیویی می نویسیم و مقدار پیش فرض روی دکمه رادیویی مربوطه با توجه به خصوصیت default گره تنظیم می‌شود. ارتفاع GroupBox نیز با توجه به محتوی دکمه های رادیویی تنظیم می شود. در آخر نیز کنترلهای جدید به کلکسیون کنترلها اضافه شده و مقدار m_Location به عنوان مکان کنترل بعدی برگرداننده می‌شود.

تابع Survey_AddTextBox:
این تابع یک TextBox و یک Lable برای نمایش سوالات به کلکسیون کنترلهای قبلی اضافه میکند.

Private Function Survey_AddTextBox(ByVal inNode As XmlNode, _
        ByVal inControls As Control.ControlCollection, _
        ByVal location As Point, ByVal tag As String _
        ) As Point

  Dim myText As New TextBox()
  myText.Tag = tag
  myText.Width = CONTROL_WIDTH

  If Not inNode.SelectSingleNode("defaultResponse") Is Nothing Then
    myText.Text = inNode.SelectSingleNode("defaultResponse").InnerText
  End If

  If Not inNode.Attributes("name") Is Nothing Then
    myText.Name = inNode.Attributes("name").Value
  End If

  If Not inNode.SelectSingleNode("maxCharacters") Is Nothing Then
    myText.MaxLength = Integer.Parse(inNode.SelectSingleNode_
    ("maxCharacters").InnerText)
  End If

  If myText.MaxLength > 0 Then
    Dim numLines As Integer = (myText.MaxLength \ CHARS_PER_LINE) + 1

    If numLines = 1 Then
      myText.Multiline = False
    Else
      If numLines >= 4 Then
        myText.Multiline = True
        myText.Height = 4 * HEIGHT_PER_LINE
        myText.ScrollBars = ScrollBars.Vertical
      Else
        myText.Multiline = True
        myText.Height = numLines * HEIGHT_PER_LINE
        myText.ScrollBars = ScrollBars.None
      End If
    End If
  End If

  Dim myLabel As New Label()
  myLabel.Name = myText.Name & "Label"
  myLabel.Width = CONTROL_WIDTH

  If Not inNode.SelectSingleNode("text") Is Nothing Then
    myLabel.Text = inNode.SelectSingleNode("text").InnerText
  End If

  myLabel.Location = location
  inControls.Add(myLabel)
  location.Y += myLabel.Height

  myText.Location = location
  inControls.Add(myText)
  location.Y += myText.Height + 10

  Return location
End Function

در این تابع ابتدا یک جعبه متن جدید ساخته و برخی از خصوصیات آنرا با توجه به فایل XML تنظیم میکنیم. پس از آن تعداد خطوط مجاز، بزرگی جعبه متن و اینکه آیا ScrollBar نیاز است یا خیر محاسبه میشود. دو ثابت CHARS_PER_LINE و HEIGHT_PER_LINE نیز به ترتیب با مقادیر 30 و 19 تعریف شده‌اند. در انتها نیز کنترلهای جدید به کلکسیون کنترلها اضافه شده و مقدار m_Location نیز به عنوان مکان کنترل بعدی برگرداننده می‌شود.

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫بررسی شیئ DataView در ASP.NET

بررسی شیئ DataView در ASP.NET

توسط: keyvannayyeri
تاریخ انتشار: 3 آبان 1382

در این مقاله سعی شده به اختصار درباره خصوصیتها، متدها و نحوه کار با شیئ DataView اطلاعاتی ارائه شود. 		iDevCenter

یکی از اعمال مورد نیاز در کار با داده‌های یک بانک اطلاعاتی، جستجو، مرتب سازی و فیلتر کردن داده‌ها بر حسب نیازمندیهای برنامه کاربردی می باشد. در 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: سطرهایی که شامل پارامتر ارسالی به این متد هستند را پیدا می کند.

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫بررسی توابع مدیریت رشته‌ها در ویژوال بیسیک

بررسی توابع مدیریت رشته‌ها در ویژوال بیسیک

توسط: sheidaian
تاریخ انتشار: 13 آبان 1382

در این مقاله توابعی که در کار با رشته‌ها (Strings) در ویژوال بیسیک می‌توان از آنها استفاده کرد بهمراه مثال‌هایی از کاربرد هر تابع معرفی شده است. 		iDevCenter

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

Asc(string):
کد اسکی اولین کاراکتر رشته ورودی را بر میگرداند. تابع AscW نیز کد یونیکد اولین کاراکتر را بر میگرداند.

Chr(charcode):
رشته‌ای را بر میگرداند که معادل کد اسکی ورودی است. تابع ChrW نیز بر حسب یونیکد عمل میکند.

LCase(string):
تمام کاراکترهای رشته ورودی را به حروف کوچک تبدیل میکند.

UCase(string):
تمام کاراکترهای رشته ورودی را به حروف کوچک تبدیل میکند.

Left(string, length):
رشته‌ای را برمیگرداند که شامل تعداد مشخصی از کاراکترهای سمت چپ رشته ورودی است. که در آن string رشته ورودی و length طول رشته مورد نظر است. مثال:

Left("abcdef", 3) = "abc"

Right(string, length):
رشته‌ای را برمیگرداند که شامل تعداد مشخصی از کاراکترهای سمت راست رشته ورودی است. که در آن string رشته ورودی و length طول رشته مورد نظر است. مثال:

Right("abcdef", 3) = "def"

Space(number):
تعداد مشخصی کاراکتر فاصله بر می گرداند.

Len(string):
طول رشته ورودی را بر می گرداند. مثال:

Len("abcdefg") = 7

Trim(string):
این تابع spaceهایی که در ابتدا یا انتهای رشته باشد را حذف می کند. توابع LTrim و RTrim فقط از چپ و راست عمل می کنند. مثال:

Trim(" abc ") = "abc"

Mid(string, start[, length]):
این تابعی یک رشته برمیگرداند که شامل تعداد مشخصی از کاراکترهای رشته ورودی آن است. در این تابع string رشته ورودی، start محل شروع اولین کاراکتر رشته‌ای که می خواهیم از رشته ورودی استخراج کنیم و length یک پارامتر اختیاری است که طول رشته‌ای که میخواهیم از رشته ورودی استخراج کنیم را مشخص میکند. اگر این پارامتر وارد نشود کلیه کاراکترها از start به بعد استخراج خواهند شد . مثال:

Mid("abcdefg", 2, 3) = "bcd"

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(stringcheck, stringmatch[, start[, compare]]):
برعکس تابع InStr می باشد یعنی عمل جستجو را از انتهای رشته انجام می‌دهد.

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(expression):
رشته‌ای را برمیگرداند که کاراکترهای آن به ترتیب عکس کاراکترهای رشته ورودی است. مثال:

StrReverse("abcd") = "dcba"

Split(expression[, delimiter[, limit[, compare]]]):
آرایه‌ای از تعداد مشخصی رشته برمیگرداند که این رشته‌ها توسط یک کاراکتر جداکننده (delimiter) از درون یک رشته استخراج شده‌اند. پارامترهای این تابع عبارتند از:

expression: رشته اصلی. delimiter: این پارامتر اختیاری است و کاراکتر جداسازی را نشان میدهد. در صورتیکه این پارامتر وارد نشود کاراکتر فاصله (" ") برای جداسازی استفاده میشود. در صورتیکه طول این کاراکتر صفر باشد یک آرایه تک عضوی که شامل کل expression است برگردانده میشود. limit: تعداد رشته‌های موجود در آرایه را نشان میدهد. در صورتیکه این پارامتر داده نشود کلیه رشته‌های جداشده در آرایه خروجی قرار میگیرند. compare: نوع جستجو را نشان میدهد. اگر این پارامتر 0 داده شود جستجوی متنی انجام می شود و اگر 1 داده شود جستجوی باینری انجام میشود.

Dim Ar(3) As String

Ar = Split("a#bd#cde", "#")

Join(sourcearray[, delimiter]):
تعدادی رشته موجود در یک آرایه را بهم متصل میکند و رشته حاصل شده را بعنوان نتیجه برمیگرداند. پارامترهای این تابع عبارتند از:

sourcearray: شامل رشته‌هایی که می خواهیم بهم متصل کنیم. delimiter: کاراکتری که برای اتصال رشته‌ها بهم استفاده میشود . این کاراکتر در بین رشته‌iای اتصالی می‌آید و اگر داده نشود از کاراکتر فاصله استفاده میشود. اگر طول این کاراکتر صفر باشد رشته‌های بدون هیچ جداکننده‌ای بهم متصل میشوند. مثال:

Dim Ar(3) As String
Ar(1) = "ab"
Ar(2) = "c"
Ar(3) = "def"
Join(Ar, "*") = "ab*c*def"

StrComp(string1, string2[, compare]):
این تابع دو رشته ورودی را با هم مقایسه می کند. پارامترهای این تابع عبارتند از:

string1: رشته اول. string2: رشته دوم. compare: نوع جستجو را نشان میدهد. اگر این پارامتر 0 داده شود جستجوی متنی انجام می شود و اگر 1 داده شود جستجوی باینری انجام میشود.

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

StrConv(string, conversion):
در یک رشته ورودی تغییراتی را اعمال می کند. پارامترهای این تابع عبارتند از:

string: رشته ورودی. conversion: نوع عمل تبدیل را نشان میدهد. مقادیر ممکن این متغیر عبارتند از:

مقدار | توضیح
1 | تبدیل به حروف بزرگ
2 | تبدیل به حروف کوچک
3 | تبدیل اولین کاراکتر هر لغت در رشته به حرف بزرگ
64 | تبدیل به یک رشته یونیکد
128 | تبدیل از رشته یونیکد به کدپیچ پیش فرض سیستم

مثال:

StrConv("hello my friend", 3) = "Hello My Freind"

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫دستیابی به رجیستری در VB.NET

دستیابی به رجیستری در VB.NET

توسط: HosseinGates
تاریخ انتشار: 15 آذر 1382

احتمالا تاکنون مطالب زیادی در مورد رجیستری ویندوز شنیده‌اید. اما آیا تابحال فکر کرده‌اید که چگونه میتوانید از این ویژگی ویندوز در برنامه‌های خودتان استفاده کنید؟ 		iDevCenter

این مقاله به بررسی چگونگی دستیابی به رجیستری در ویژوال بیسیک دات نت می پردازد. رجیستری ویندوز یکی از پرکاربرد ترین مباحث در برنامه نویسی استاندارد ویندوز میباشد که اکثر برنامه‌های موجود از این امکان بهره میبرند. برای مثال می توان از رجیستری برای نگهداری آخرین تغییرات داده شده در برنامه و یا ذخیره تنظیماتی که کاربر در برنامه اعمال کرده است استفاده کرد. در NET. از دو کلاس Registry و RegistryKey برای دسترسی به رجیستری و داده‌های موجود در آن استفاده میشود.

هر ورودی در رجیستری ویندوز شامل دو قسمت میشود: نام مقدار (Value Name) و مقدار (Value). این ورودی‌ها در در کلیدها و زیرکلیدهای رجیستری ذخیره میشوند که از این لحاظ میتوان آنها را با فایلهایی مقایسه کرد که در فهرستها و زیر فهرستها قرار میگیرند.

دستیابی به رجیستری به وسیله توابع Visual Basic .NET
ویژوال بیسیک دات نت چهار تابع را برای کار با رجیستری معرفی میکند که برای استفاده از آنها شما باید اجازه خواندن و نوشتن، یعنی دسترسی RegistryPermissionAccess را داشته باشید. برای اطلاعات بیشتر در این مورد به کلاس RegistryPermission رجوع کنید. در زیر اطلاعاتی را در مورد این توابع مشاهده میکنید:

نام تابع | توضیحات
DeleteSetting | یک ناحیه یا یک کلید که شامل اطلاعات ورودی از برنامه در رجیستری است را حذف میکند.
GetSetting | مقدار یک کلید که شامل اطلاعات ورودی از برنامه در رجیستری است را برمیگرداند.
GetAllSettings | یک لسیت از کلیدها و ارزش آنها که شامل اطلاعات ورودی از برنامه در رجیستری است را برمیگرداند.
SaveSetting | اطلاعات برنامه را در رجیستری ذخیره میکند.

نکته: : اطلاعات یک ناحیه نمیتواند توسط تابع GetSetting برگردانده شود.

مثال زیر یک کلید و دو زیر کلید در رجیستری میسازد، ارزش کلید اول و ارزش دو زیر کلید آنرا را چاپ میکند سپس دومین زیر کلید را حذف و مقدار کلید اول و زیر کلیدهایش را چاپ میکند تا حذف زیر کلید دوم تایید شود:

' Create the first key.
SaveSetting("TestApp","Startup", "FirstKey", "First")

' Create the first subkey.
SaveSetting("TestApp","FirstKey", "FirstSubKey", "FirstSub")

' Create the second subkey.
SaveSetting("TestApp","FirstKey", "SecondSubKey", "SecondSub")

Try
   ' Write the first key's value.
   Console.WriteLine((GetSetting("TestApp", "Startup", "FirstKey"))

   ' Write the first key as well as its two subkeys.
   Console.WriteLine(GetAllSettings("TestApp", "Startup"))

Catch e As ArgumentException
Catch e As Exception
   Console.WriteLine(e.GetType.ToString)
End Try

DeleteSetting("TestApp", "FirstKey", "SecondSubKey")

Try
   Console.WriteLine(GetSetting("TestApp", "Startup", "FirstKey"))
   Console.WriteLine(GetAllSettings("TestApp", "Startup"))

Catch e As ArgumentException
Catch e As Exception
   Console.WriteLine(e.GetType.ToString)
End Try

توجه داشته باشید که استفاده از این توابع با محدودیتهایی همراه است. شما تنها میتوانید به کلیدهای رجیستری در محدوده HKEY_CURRENT_USER\Software\VB and VBA Program Settings دسترسی داشته باشید و همچنین به علت استفاده از کلید HKEY_CURRENT_USER شما حتما باید با نام کاربری معتبر به سیستم وارد شده باشید.

دستیابی به رجیستری توسط NET Framework.
همانطور که مشاهده کردید استفاده از توابع فوق با محدودیتهایی همراه است. NET Framework. برای حل این مشکل دو کلاس Registry و RegistryKey را معرفی میکند که این دو کلاس در فضانام Microsoft.Win32 قرار دارند. کلاس Registry کلیدهای پایه‌ای زیر را فراهم میکند که توسط آنها میتوان به زیر کلیدها و مقادیر آنها دسترسی داشت. خود این کلیدهای اصلی فقط خواندنی هستند. جدول زیر این هفت کلید را نشان میدهد:

نام کلید | توضیحات
ClassesRoot | معرف پسوندهای فایها و انواع اسناد موجود در سیستم به همراه خصوصیات مربوط به آنها.
CurrentConfig | اطلاعات مربوط به سخت افزار که مربوط به کاربر مشخصی نیست.
CurrentUser | اطلاعاتی مربوط به کاربر حاضر مانند تنظیمات محیط کار کاربر.
DynData | شامل اطلاعات پویای رجیستری که برای راه اندازهای دستگاه مجازی بکار میرود.
LocalMachine | شامل پنج زیر کلید (Hardware ،SAM ،Security ،Software و System) که تنظیمات مربوط به سیستم را نگه میدارند.
PerformanceData | شامل اطلاعات اجرایی مربوط به نرم افزارها.
Users | شامل اطلاعات مربوط به اولویتهای پیش فرض کاربر.

مثال زیر نشان میدهد که چگونه یک مقدار DWORD را از کلید HKEY_CURRENT_USER بخوانیم:

Imports Microsoft.Win32

Dim regVersion As RegistryKey
Dim keyValue As String
Dim intVersion As Integer = 0

keyValue = "Software\\Microsoft\\TestApp\\1.0"
regVersion = Registry.CurrentUser.OpenSubKey(keyValue, False)

If (Not regVersion Is Nothing) Then
   intVersion = regVersion.GetValue("Version", 0)
   regVersion.Close()
End If

مثال زیر یک مقدار DWORD را خوانده، یک واحد به آن اضافه کرده و سپس آنرا چاپ میکند:

Imports Microsoft.Win32

Dim keyValue As String
Dim regVersion As RegistryKey
Dim intVersion As Integer = 0

keyValue = "Software\\Microsoft\\TestApp\\1.0"
regVersion = Registry.CurrentUser.OpenSubKey(keyValue, True)

If regVersion Is Nothing Then
   ' Key doesn't exist; create it.
   regVersion = Registry.CurrentUser.CreateSubKey(keyValue)
End If

If (Not regVersion Is Nothing) Then
   intVersion = regVersion.GetValue("Version", 0)
   intVersion = intVersion + 1
   regVersion.SetValue("Version", intVersion)
   regVersion.Close()
End If

مطابق مثال بالا، برای دسترسی به یک کلید ابتدا متغیری از نوع RegistryKey تعریف میکنیم. سپس با استفاده از متد OpenSubKey آدرس کلید مورد نظر را داده تا کلید فوق برای خواندن آماده باشد. اگر پارامتر دوم این کلید برابر True باشد اجازه نوشتن بر روی آن کلید را نیز داریم. برای ساختن یک کلید نیز باید از متد CreateSubKey استفاده کرد. پس از ساختن و یا باز کردن یک کلید رجیستری، با استفاده از دو تابع GetValue و SetValue میتوان مقادیری را در آن کلید نوشت و یا از آن کلید خواند.

توسط رجیستری کارهای بسیار زیادی میتوان انجام داد. شما نیز با کمی تمرین میتوانید برنامه های استاندارد و جالبی را طراحی کنید.

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫عمومی سازی و بومی سازی در جاوا (1)

عمومی سازی و بومی سازی در جاوا

توسط: Haghgonia
تاریخ انتشار: 21 دی 1382

در این مقاله دو مبحث عمومی سازی (Internationalization) و بومی سازی (Localization) در جاوا مورد برررسی قرار می‌گیرد. 		iDevCenter

1- مقدمه
عمومی سازی به فرآیند طراحی یک نرم افزار بمنظور تطبیق با زبانها و کشورهای مختلف بدون نیاز به تغییر در کد برنامه گفته می‌شود. یک برنامه عمومی شده دارای مشخصات زیر است:
  • در کنار یکسری اطلاعات بومی شده، برنامه می تواند در هر کشور و به هر زبانی اجرا شود.
  • عناصر متنی مانند پیغامها و عنوان اجزا رابط کاربر، در داخل کد برنامه (hard coding) مشخص نمی‌شوند، بلکه در یک منبع خارج از کد برنامه ذخیره و بصورت دینامیک بازیابی می‌شوند.
  • پشتیبانی از زبانهای جدید بدون نیاز به کامپایل مجدد برنامه.
  • اطلاعات حساس به منطقه جغرافیایی از قبیل تاریخ، پول و اعداد مطابق با استانداردهای تعریف شده در کشور کاربر نهایی نمایش داده می‌شود.
  • به آسانی قابل بومی سازی است.

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

1.1- Internationalization
عمومی سازی در حوزه برنامه نویسی عبارتست از فرآیند طراحی و نوشتن یک برنامه بطوریکه بتوان بصورت سراسری و در کشورهای مختلف از آن استفاده کرد.

یک برنامه عمومی شده قابلیت پشتیبانی زبانهای مختلف و پارامترهای وابسته مانند تاریخ، زمان، پول و... را بدون نیاز به تغییر کد برنامه دارا می‌باشد. این ایده تحت عنوان (soft coding) یا جداسازی اجزاء رابط کاربر از کد منطق برنامه نیز مطرح می‌شود.

به جای کلمه Internationalization از مخفف آن I18N استفاده می‌شود. توضیح اینکه بین کاراکترهای شروع و پایان این کلمه 18 کاراکتر وجود دارد. بنابراین برای سهولت از کلمه I18N و همچنین از I18N'd به جای Internationalizationed استفاده می‌شود.

2.1- Localization
بومی‌سازی به فرآیند طراحی و پیاده‌سازی یک نرم افزار با قابلیت تطابق با یک زبان، فرهنگ، کشور و منطقه خاص گفته می‌شود. بسیاری از برنامه‌های نوشته شده برای یک کشور یا منطقه خاصی تنها در آن محدوده جغرافیائی قابل استفاده‌ می‌باشند.

به جای کلمه Localization از مخفف آن L10N نیز استفاده می‌شود.

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

2- عمومی سازی و بومی سازی در زبان جاوا
برخلاف سایر زبانهای برنامه‌نویسی، برنامه‌نویسان جاوا از امکانات و قابلیت‌های خوبی برای I18N برخوردار هستند.

1.2- پشتیبانی یونی‌کد (Unicode Support)
کاراکترست (Character Set) زبان جاوا بر مبنای یونی‌کد (Unicode) است، بدین منظور نوع داده‌ای char برای تطابق با یونی‌کد، دو بایتی (16 بیت) در نظر گرفته شده است. بنابراین نوع داده‌ای String که با استفاده از char ساخته می‌شود نیز یونی‌کد را پشتیبانی می‌کند. یونی‌کد طوری تعریف شده است که مقادیر 0 تا 127 برای استاندارد ASCII و 0 تا 255 برای استاندارد ISO 8859-1 (Latin-1) را در برمی‌گیرد. به دلیل شروع شدن دو استاندارد با عدد صفر، برنامه‌نویسانی که از قابلیت‌های I18N استفاده نمی‌کنند یا آشنا نیستند نیز می‌توانند بدون نیاز به شناخت یونی‌کد، برنامه‌هایی بنویسند که یونی‌کد را پشتیبانی کند، اما برنامه‌نویسانی که در محیط ویندوز برنامه می‌نویسند بایستی از تفاوت‌های استاندارد ISO 8859-1 و Windows Latin-1 (CP1252) آگاهی داشته باشند.

طول 16 بیتی نوع داده‌ای char امکان ذخیره سازی مقادیر 0 تا 65535 را فراهم می‌سازد. یک مقدار یونی‌کد با '\u' شروع و یک مقدار هگزادسیمال (مبنای 16) از 0000 تا FFFF پس از آن قرار می‌گیرد. دو خط مثال زیر، کاراکتر a را تعریف می‌کند:

char c1 = 'a'
char c2 = '\u0061'

نسخه JDK 1.3 یونی‌کد 2.1 و نسخه JDK 1.4 یونی‌کد 3.0 را پشتیبانی می‌کند.

سؤالی که مطرح می‌شود این است که آیا همه پلاتفرم‌ها یونی‌کد را پشتیبانی می‌کنند؟ جواب: در جاوا تمام استریم‌ها (Stream) که کاراکترها را پشتیبانی می‌کنند (java.io.Reader و java.io.Writer) به صورت اتوماتیک یک لایه مخفی که وظیفه تبدیل یونی‌کد به Encoding خاص سیستم عامل و بالعکس را انجام می‌دهند را فراخوانی می‌سازند. از طرف دیگر کلاسهای java.io.InputStreamReader و java.io.OutputStreamWriter دارای متدهایی برای تبدیل Encoding می‌باشند.

2.2- Locale
Locale در زبان جاوا مجموعه‌ای از کلاسها برای سفارشی کردن، تغییر، نمایش و شکل دهی اطلاعات است. این کلاسها روی انتخاب زبان، تقویم، تاریخ و زمان تأثیر می‌گذارند. یک شیء از کلاس java.util.Locale نشان‌دهنده یک ناحیه جغرافیائی خاص با زبان آن ناحیه می‌باشد.

3.2- Language
زبانهای قابل استفاده در Locale طبق استاندارد ISO 639 می‌باشد. جدول زیر چند مثال از نام زبان و کد تعریف شده را نشان می‌دهد. یک کد زبان با جزئیات آن زبان در نواحی مختلف استفاده نمی‌شود، برای مثال ممکن است Canadian French و Swiss French دارای گرامر و قوانین و واژه‌های متفاوت باشند ولی برای هر دو این زبانها کد fr در نظر گرفته می‌شود. به همین دلیل تنها زبانهای عمومی تعریف شده‌اند:

کد زبان | زبان
en | English
fr | French
zh | Chinese
ja | Japanese
ar | Arabic

4.2- Country
کشورهای قابل استفاده در Locale طبق استاندارد ISO 3165 می‌باشد. کد کشور در این استاندارد 2 رقمی و با حروف بزرگ تعریف شده است. جدول زیر تعدادی از کشورهای تعریف شده را نشان می‌دهد.

کد کشور | کشور
US | United States
FR | France
CA | Canada
SA | Saudi Arabia

5.2- Variant
Variant یک پسوند اختیاری برای یک Locale می‌باشد. Variant یک Locale سفارشی تعریف می‌کند که با Language و Country قابل ساخت نیست. از Variant می‌توان برای اضافه کردن یک مشخصه اضافی برای تعریف Locale استفاده کرد. برای مثال en _ us نشاندهنده English (United States) است اما en_us_ca برای تعریف English (U.S.A, California) یا en_us_mac برای تعریف English (U.S.A, Macintosh) می‌باشد.

3- استفاده از Locale در جاوا
کلاس Locale دو سازنده (Constructor) دارد:

Locale (String language, String country)
Locale (String language, String country, String variant)

مثال:

Locale mylocale = new Locale ("en", "US")

در مثال بالا en زبان انگلیسی و US کشور آمریکا را تعریف می‌کند.

1.3- Number
عبارت 1,234 چه عددی را نشان می‌دهد؟ جواب به منطقه و کشور بستگی دارد. در آمریکا این عبارت معنی "یک هزار و دویست و سی و چهار" را دارد اما در فرانسه این عبارت به معنی "یک و دویست و سی و چهار هزارم" است. بنابراین در نظر گرفتن قوانین نمایش اعداد و جدا کننده‌ها بسیار مهم بنظر می‌رسد. کلاس java.text.NumberFormat تعریف چگونگی نمایش اعداد برای یک منطقه خاص را به عهده دارد.

2.3- Currency
هر کشور یا منطقه دارای واحد پولی جداگانه است. علاوه بر این مواردی از قبیل علامت اعداد منفی، صفر، جداکننده رقم‌ها، علامت نقطه اعشاری و مکان قرار گرفتن علامت پول ($10، 10 ریال) نیز در کشورها متفاوت است. متد getCurrencyInstance در کلاس java.text.NumberFormat امکان پرداختن به جزئیات شکل دهی اعداد پولی یک کشور خاص را فراهم می‌سازد.

3.3- Date
مشابه سایر ساختارهای حساس به موقعیت جغرافیایی، فیلد تاریخ نیز جزئیات خاص خود را دارد. کوتاه یا کامل بودن تاریخ، جدا کننده روز، ماه و سال و نیز ترتیب آنها در کشورهای مختلف با یکدیگر متفاوت است.

4.3- Calendar
کلاس java.text.Calendar بسیار نزدیک به کلاس java.util.Date است و اجازه می‌دهد سال، ماه، روز و زمان را از یک تاریخ استخراج نمایند. متد getCalendarInstance یک Calendar برای کشور مورد نظر بر می‌گرداند. تنها تقویم پیاده‌سازی توسط شرکت سان میکرو سیستم تقویم Gregorian می‌باشد. برای ساختن تقویم‌های محلی توصیه می‌شود از کلاس Calendar جاوا استفاده شود.

5.3- Resource Bundle
ویژگی عمومی ساختن در JDK، مکانیزمی برای جداسازی عناصر رابط کاربر و سایر اطلاعات حساس به منطقه جغرافیایی از منطق برنامه است. این جداسازی انتقال فرآیند و تبدیل را آسان می‌سازد. بدین معنی که یک کد واحد نوشته می‌شود، در حالیکه ممکن است 30 نسخه به زبان‌های مختلف از آن تولید شود.

Resource Bundle شامل یک فایل با فرمت ASCII است. نام این فایل شامل دو قسمت، نام اصلی و یک پسوند است. برای مثال برای ایجاد یک Resource Bundle با نام MyBundle برای زبانهای ژاپنی و فرانسوی دو فایل بنام‌های MyBundle_ja_JP و MyBundle_fr_FR با پسوند properties تعریف می‌شود. هر فایل Resource Bundle شامل یکسری زوج کلید / مقدار است. در هر خط بایستی یک زوج کلید / مقدار تعریف شود. مثال:

#MyResource.properties
#<key>=<value>
Text_not_found=The file could not be found
Text_Hello=Hello, world!

متد getBundle در کلاس java.util.ResourceBundle امکان دسترسی به یک Resource Bundle را فراهم می‌سازد. مثال کاملی از تعریف Locale برای زبان فارسی در انتهای این مقاله ذکر شده است.

6.3- Character Sets
زبان جاوا با استفاده از یونی‌کد برای نمایش متن، فرآیند ذخیره سازی، دستکاری و نمایش کاراکترها را آسان ساخته است. یونی‌کد یک کارکترست 16 بیتی است بدین معنی که می‌تواند 216 کاراکتر تعریف کند. هر کاراکتر در این مجموعه منحصر بفرد است.

7.3- Layout Manager
Layout Manager در یک برنامه چند زبانه بدلیل دو مشکل اساسی در هنگام ترجمه رابط کاربر بسیار مهم است:
  • افزایش و کاهش طول متن ترجمه شده
  • موقعیت اجزاء رابط کاربر
متن ترجمه شده اغلب کوتاه‌تر یا بلندتر از متن اصلی است. Layout Manager نقش بسیار مهمی دارد چون اندازه اجزاء رابط کاربر را با توجه به طول متن استفاده شده در عنوان آن تغییر می‌دهد و همچنین جابجایی اجزاء رابط کاربر را بدلیل تغییر اندازه متن کنترل می‌کند.

4- یک مثال ساده
در این قسمت یک مثال ساده که پیغام‌هایی را به چندین زبان نمایش می‌دهد توضیح داده می‌شود. در این مثال با کلاسهای Locale و ResourceBundle جاوا آشنا می‌شوید.

1.4- قبل از Internationalization
در نظر بگیرید که یک برنامه نوشته اید که چند پیغام را نمایش می‌دهد:

public class NotI18N {
    static public void main(String[] args) {
        System.out.println("Hello.");
        System.out.println("How are you?");
        System.out.println("Goodbye.");
    }
}

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

2.4- بعد از Internationalization
کد زیر تغییر یافته برنامه شما را نشان می‌دهد. توجه کنید که متن پیغامها از داخل کد برنامه خارج شده است:

import java.util.*;

public class I18NSample {

    static public void main(String[] args) {

        String language;
        String country;

        if (args.length != 2) {
            language = new String("en");
            country = new String("US");
        } else {
            language = new String(args[0]);
            country = new String(args[1]);
        }

        Locale currentLocale;
        ResourceBundle messages;

        currentLocale = new Locale(language, country);

        messages = ResourceBundle.getBundle("MessagesBundle", currentLocale);
        System.out.println(messages.getString("greetings"));
        System.out.println(messages.getString("inquiry"));
        System.out.println(messages.getString("farewell"));
    }
}

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

- I18NSample.java
- MessageBundle.properies
- MessageBundle_de_DE.properties
- MessageBundle_en_US.properties
- MessageBundle_fr_FR.properties
- MessageBundle_ar_SA.properties

3.4- اجرای برنامه
برنامه عمومی شده انعطاف پذیر است: این برنامه به کاربر نهایی اجازه می‌دهد کشور و زبان را بصورت پارامتر به برنامه وارد کند.

مثال زیر نتیجه اجرای برنامه را برای زبان فرانسوی (French) fr و کشور فرانسه (France) FR نشان می‌دهد:

greetings = Bonjour
farewell = Au revoir
inquiry = Comment allez-vous?
فایل MessageBundle_fr_FR.properties

% java I18NSample fr FR

Bonjour.
Comment allez-vous?
Au revoir.
خروجی برنامه

مثال بعدی نتیجه اجرای برنامه را برای زبان انگلیسی (English) en و کشور آمریکا (United States) US نشان می‌دهد:

greetings = Hello
farewell = Goodbye
inquiry = How are you?
فایل MessageBundle.properties

% java I18NSample en US

Hello.
How are you?
Goodbye.
خروجی برنامه

5- اقدامات لازم برای I18N
بسیاری از برنامه‌ها از ابتدا عمومی و چند زبانه نیستند. این برنامه ها ممکن است از یک Prototype شروع شوند و یا قابلیت چند زبانه بودن در آنها در نظر گرفته نشده باشد. برای I18N ساختن یک برنامه موجود، بایستی مراحل زیر طی شده باشد:

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

  • پیغامها
  • عنوان اجزای رابط کاربر
  • صداها
  • رنگها
  • گرافیک و تصاویر
  • تاریخ
  • زمان
  • پول
  • واحدهای اندازه گیری
  • شماره تلفن
  • آدرسهای پستی
  • طراحی صفحات

2.5- جداسازی متنهای قابل ترجمه و انتقال به Resource Bundles
فرآیند ترجمه هزینه بر و گران است. شما می توانید این هزینه را با جداسازی متنهای نیازمند ترجمه و قرار دادن آنها در یک Resource Bundle کاهش دهید.

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

String buttonLabel = "OK";
...
JButton okButton = new JButton(buttonLabel);

3.5- پیغامهای ترکیبی (Compound Messages)
پیغامهای ترکیبی حاوی اطلاعات متغیر است. برای مثال در پیغام ".The disk contains 1100 files" عدد 1100 می تواند متغیر باشد. ترجمه این نوع پیغام بسیار مشکل است، زیرا برای مثال محل قرار گرفتن عدد 1100 در این عبارت در زبانهای مختلف با یکدیگر متفاوت است. پیغام زیر قابل ترجمه نیست چون ترتیب قرار گرفتن قسمتهای این جمله در داخل کد برنامه مشخص شده است.

Integer fileCount;
...
String diskStatus = "The disk contains " + fileCount.toString() + " files.";

4.5- نمایش اعداد و پول
اگر برنامه اعداد یا پول را نمایش می‌دهد، بایستی این اطلاعات به روشی مستقل از کشور یا منطقه خاص نمایش داده شود. کد زیر عمومی نیست چرا که نمی تواند اعداد را بصورت صحیح در تمام کشورها نمایش دهد:

Double amount;
TextField amountField;
...
String displayAmount = amount.toString();
amountField.setText(displayAmount);

در جاوا کلاس NumberFormat برای تغییر نمایش اعداد به زبانهای مختلف در نظر گرفته شده است.

5.5- نمایش تاریخ و زمان
نمایش تاریخ و زمان نیز مشابه اعداد با توجه به زبان و کشور متفاوت است. اگر شما کدی مشابه زیر در برنامه دارید، بایستی آنرا تغییر دهید:

Date currentDate = new Date();
TextField dateField;
...
String dateString = currentDate.toString();
dateField.setText(dateString);

در زبان جاوا کلاس DateFormat وظیفه تنظیم چگونگی نمایش تاریخ و زمان را بر عهده دارد.

6.5- استفاده از قابلیتهای یونی‌کد
کد زیر سعی می‌کند کاراکتر بودن یک حرف را بررسی کند:

char ch;
...
if ((ch >= 'a' && ch <= 'z') ||
    (ch >= 'A' && ch <= 'Z'))       // WRONG!

این کد تنها برای زبان انگلیسی قابل استفاده است. برای مثال این کد، حرف ü در کلمه آلمانی Grün را یا حرف پ در کلمه پارس را کاراکتر تشخیص نمی‌دهد.

متدهای مقایسه موجود در کلاس Character از استاندارد یونی‌کد برای شناسایی کاراکترها استفاده می‌کند. بنابراین کد بالا را می توان بصورت زیر تغییر داد:

char ch;
...
if (Character.isLetter(ch))

7.5- مقایسه رشته‌ها
معمولا هنگام مرتب سازی متن، رشته ها با یکدیگر مقایسه می‌شوند. یک برنامه معمولی برای مقایسه دو رشته ممکن است از کدی بصورت زیر استفاده کند:

String target;
String candidate;
...
if (target.equals(candidate)) {
...
if (target.compareTo(candidate) < 0) {
...

متدهای String.equals و String.compareTo عمل مقایسه را بصورت باینری انجام می دهند که برای بیشتر زبانهای موجود ناکارآمد است. برای مقایسه دو رشته بهتر است از کلاس Collator استفاده شود.

8.5- تبدیل متنهای غیر یونی‌کد
کاراکترها در زبان برنامه نویسی جاوا بصورت یونی‌کد ذخیره می‌شود. اگر برنامه شما از اطلاعات غیر از یونی‌کد استفاده می‌کند، بایستی اطلاعات را به یونی‌کد تبدیل نمایید.

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫عمومی سازی و بومی سازی در جاوا (2)

عمومی سازی و بومی سازی در جاوا

توسط: Haghgonia
تاریخ انتشار: 21 دی 1382

در این مقاله دو مبحث عمومی سازی (Internationalization) و بومی سازی (Localization) در جاوا مورد برررسی قرار می‌گیرد. 		iDevCenter

6- نمایش اعداد

1.6- استفاده از فرمتهای از پیش تعریف شده
با فراخوانی متدهای موجود در کلاس NumberFormat می‌توان رشته‌های حاوی اعداد، مقادیر پولی و علامت درصد را برای یک منطقه جغرافیایی خاص نمایش داد.

1.1.6- اعداد
با استفاده از متدهای کلاس NumberFormat می‌توان چگونگی نمایش اعداد از نوع double را تعریف کرد. مثال زیر یک عدد اعشاری را با توجه به منطقه تعریف شده نمایش میدهد:

Double amount = new Double(345987.246);
NumberFormat numberFormatter;
String amountOut;

numberFormatter = NumberFormat.getNumberInstance(currentLocale);
amountOut = numberFormatter.format(amount);
System.out.println(amountOut + " " + currentLocale.toString());

متد getNumberInstance الگوی نمایش منطقه مورد نظر را در صورت وجود برمیگرداند. خروجی مثال برای چندین منطقه مختلف:

345 987,246  fr_FR
345.987,246  de_DE
345,987.246  en_US

2.1.6- پول
اگر برنامه شما تجاری باشد، شما ممکن است نیاز داشته باشید اعداد یا مقادیر پولی را نمایش دهید. مشابه اعداد، مقادیر پولی را نیز می‌توان با توجه به یک منطقه خاص نمایش داد، با این تفاوت که متد getCurrencyInstance الگوی نمایش منطقه مورد نظر را برمی‌گرداند.

Double currency = new Double(9876543.21);
NumberFormat currencyFormatter;
String currencyOut;

currencyFormatter = NumberFormat.getCurrencyInstance(currentLocale);
currencyOut = currencyFormatter.format(currency);
System.out.println(currencyOut + " " + currentLocale.toString());

خروجی مثال برای چندین منطقه مختلف:

9 876 543,21 F   fr_FR
9.876.543,21 DM  de_DE
$9,876,543.21    en_US

در نگاه اول ممکن است خروجی برنامه اشتباه به نظر برسد، چراکه مقادیر عددی با هم یکسانند، البته 9876543,21F و 9.876.543.21 DM یکی نیست. بخاطر داشته باشید که کلاس NumberFormat از نرخهای ارزی بی اطلاع است. بنابراین متدهای کلاس NumberFormat تنها نمایش مقادیر را برعهده دارند و عمل تبدیل ارزها به یکدیگر را انجام نمی‌دهند.

3.1.6- درصد
برای نمایش علامت درصد (%) برای یک منطقه خاص در کلاس NumberFormat متد getPercentInstance تعریف شده است. برای مثال مقدار 0.75 بصورت 75% نمایش داده می شود. مثال:

Double percent = new Double(0.75);
NumberFormat percentFormatter;
String percentOut;

percentFormatter = NumberFormat.getPercentInstance(currentLocale);
percentOut = percentFormatter.format(percent);

2.6- فرمتهای سفارشی
از کلاس DecimalFormat می‌توان برای تعریف چگونگی نمایش اعداد برای یک منطقه یا کشور خاص استفاده کرد. این کلاس امکان تعریف صفرهای قبل و بعد از اعداد، جداکننده دسیمال (،)، علامت درصد (%)، علامت نقطه اعشاری (/)، علامت پول و هر پسوند یا پیشوند دیگر را به شما می دهد. البته برای تغییر علامت جداکننده ها می‌توان از کلاس DecimalFormatSymbols نیز در کنار DecimalFormat کمک گرفت.

3.6- ساختن الگو
با تعریف الگو می‌توان چگونگی نمایش اعداد را کنترل نمود، این الگو در قالب یک رشته تعریف می شود. جدول زیر لیستی از کاراکترهای مورد نیاز برای تعیین الگو را نشان می دهد.

علامت | شرح
0 | عدد صفر
# | عدد
, | جداکننده اعشاری
E | جدا کننده مانتیس و توان در اعداد نمایی
; | جدا کننده فرمتها
- | پیشوند اعداد منفی
% | علامت درصد (با ضرب در عدد 100)
X | هر کاراکتر دیگری که در پسوند و پیشوند استفاده شود
‘ | برای آوردن کاراکترهای خاص در پسوند و پیشوند

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

DecimalFormat myFormatter = new DecimalFormat(pattern);
String output = myFormatter.format(value);
System.out.println(value + " " + pattern + " " + output);

جدول زیر چند نمونه از تعریف الگو و خروجی آن را نشان می دهد:

مقدار | الگو | خروجی | توضیح
123456.789 | ###,###.### | 123,456.789 | علامت (#) نشان دهنده عدد، علامت (,) جداکننده دسیمال و علامت (.) جداکننده اعشاری
123456.789 | ###,## | 123456.79 | عدد مورد نظر دارای سه رقم اعشار است در حالیکه الگو دو رقم اعشار تعریف کرده است. بنابراین نتیجه حاصل گرد می شود.
123.78 | 000000.000 | 000123.780 | طبق الگو قبل و بعد از عدد به اندازه صفرهای تعریف شده، عدد صفر قرار می گیرد.
12345.67 | $###,###.### | $12,345.67 | علامت دلار ($) بعنوان پیشوند تعریف شده است.
12345.67 | \u00A5###,### .### | ¥12,345.67 | علامت ین (¥) با استفاده از مقدار یونی کد U+00A5
12345.67 | ###,###.###\uE816 | ریال12,345.67 | کلمه ریال با استفاده از مقدار یونی کد U+E816

7- فارسی سازی در جاوا

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

تقویم جلالی دارای خصوصیتی طبیعی وکلی است. این تقویم تمام چهار فصل سال را با آغازی مصادف با اولین روز بهار (در نیمکره شمالی) در بر میگیرد. همچنین این تقویم دارای یک قانون منظم (نه یکنواخت) برای روزهای ماه است. شش ماه اول هر سال 31 روز و شش ماه دوم در سال‌های کبیسه 30 روز میباشد، در غیر اینصورت ماه آخر سال 29 روزه خواهد بود. تقویم جلالی تقریبا" با سیستم رایج زودیاک (Zodiac System) غرب تطابق دارد.

در این دو مورد تقویم گریگوری با تقویم جلالی دارای اختلافاتی است. در این تقویم ارتباطی بین سال و فصل‌ها وجود ندارد. به طور قراردادی، تعداد روزها در هفت ماه سال 31 روز، در چهار ماه 30 روز و یک ماه در سال به طور نامنظم 28 یا 29 روز است.

علاوه بر این، تقویم جلالی از حرکت وضعی زمین (حرکت زمین به دور خورشید) تبعیت میکند. یک سال خورشیدی تقریبا معادل 365 روز، 5 ساعت و 49 دقیقه است. بر اساس تقویم جلالی، آغاز سال (تحویل سال) زمانی است که خورشید از نیمکره جنوبی به سمت نیمکره شمالی از روی خط استوا میگذرد. حال اگر لحظه تحویل سال قبل از ظهر (به وقت تهران) باشد، سال جدید (اول فروردین ماه) از همان روز آغاز میشود. در غیر اینصورت، آغاز سال نو روز بعد خواهد بود. در این روش (به طور تقریبی) در هر 33 سال، 8 سال کبیسه تعیین میگردد. سالهای کبیسه، سال‌هایی هستند که پس از تقسیم بر 33 باقیمانده آنها 6، 22، 17، 13، 9، 5، 1 و 30 باشد. بعنوان مثال، چنانچه 1370 را به 33 تقسیم کنیم، باقیمانده 17 خواهد بود پس سال 1370 سال کبیسه است. سال کبیسه بعدی سال 1375 میباشد –با چهار فاصله– در صورتیکه به طور معمول فاصله بین دو سال کبیسه 3 سال است.

تقویم گریگوری از روش ساده‌ای استفاده کرده که دارای اختلافاتی با سال طبیعی میباشد. در این روش هر چهار سال یکبار سال کبیسه خواهد بود، مگر سال‌هایی که قابل قسمت به 100 باشند، اما بر 400 نباشند. در نتیجه سال 2000 سال کبیسه است (از آنجایی که بر 400 قابل قسمت است) اما سال 2100 کبیسه نیست.

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

  • محاسبه سالهای کبیسه
  • تبدیل تاریخ میلادی به تاریخ هجری شمسی
  • تبدیل تاریخ هجری شمسی به تاریخ میلادی
  • نمایش تاریخ شمسی به شکلهای مختلف (کوتاه، کامل)
  • تابع چک کننده تاریخ هجری شمسی
  • Persian Date Taglib

2.7- تقویم هجری شمسی
مواردیکه در مبحث تقویم هجری شمسی بایستی لحاظ شود عبارتست از:

  • تفکیک مقادیر سال، روز، ماه برای تاریخ تعیین شده
  • مشخص کردن روز هفته/ اولین روز هفته / اولین روز ماه
  • قابلیت تغییر تاریخ با متدهای roll و add
  • Persian Calendar Taglib

3.7- نمایش اعداد
همانطور که قبلا" گفته شد می‏توان از متدهای تعریف شده در کلاسهای NumberFormat و DecimalFormat برای نمایش اعداد، مقادیر پولی و درصد استفاده کرد.

4.7- بانک اطلاعاتی
  • Database Character-Set (1252, 1256)
  • Sorting (Sequence Order)
  • JDBC Driver
  • Middle Conversion
  • Communication with Application Server

5.7- صفحات HTML/JSP
  • Character Encoding
  • Page Direction (Right to Left / Left to Right)
  • Text Wrapping
  • Language

مثالهای کاربردی
1- استفاده از Resource Bundle برای فارسی سازی
1.1- تعریف MessagesBundle_ar_SA.properties

label.login.userName=شناسه کاربر
label.login.password=رمزعبور

button.login=ورود
button.cancel=انصراف

label.calendar.date=تاریخ
label.calendar.year=سال
label.calendar.month=ماه
label.calendar.day=روز

label.calendar.pm= ب.ظ
label.calendar.am= ق.ظ

1.2- استفاده از Resource Bundle در JSP

<%@ page contentType="text/html;charset=1256"
         import="java.util.Locale,
         java.util.ResourceBundle"
%>

<%
   Locale locale = new Locale("ar", "SA");
   ResourceBundle msgs = ResourceBundle.getBundle("MessagesBundle", locale);
%>

<HTML lang="ar">
  <HEAD>
    <TITLE>Login Form </TITLE>
    <META http-equiv="Content-Type" content="text/html; charset=windows-1256">
   </HEAD>
  <BODY>

    <%=msgs.getString("label.login.userName")%>
    <%=msgs.getString("label.login.password")%>

  </BODY>
</HTML>

3.1- استفاده از Resource Bundle در Servlet

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

import java.util.ResourceBundle;
import java.util.Locale;

public class I18NServlet extends HttpServlet {

  public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {

    Locale locale = new Locale("ar", "SA");
    ResourceBundle msgs = ResourceBundle.getBundle("MessagesBundle", locale);

    PrintWriter out = response.getWriter();
    out.println(msgs.getString("label.calendar.date")
      + ":" +  new java.util.Date());

    out.close();
  }
}

2- نمایش مقادیر عددی
1.2- استفاده از فرمتهای از پیش تعریف شده

static public void displayNumber(Locale currentLocale) {

  Integer quantity = new Integer(123456);
  Double amount = new Double(345987.246);
  NumberFormat numberFormatter;
  String quantityOut;
  String amountOut;

  numberFormatter = NumberFormat.getNumberInstance(currentLocale);
  quantityOut = numberFormatter.format(quantity);
  amountOut = numberFormatter.format(amount);
  System.out.println(quantityOut + " " + currentLocale.toString());
  System.out.println(amountOut + " " + currentLocale.toString());
}

static public void displayCurrency(Locale currentLocale) {

  Double currency = new Double(9876543.21);
  NumberFormat currencyFormatter;
  String currencyOut;

  currencyFormatter = NumberFormat.getCurrencyInstance(currentLocale);
  currencyOut = currencyFormatter.format(currency);
  System.out.println(currencyOut + " " + currentLocale.toString());
}

static public void displayPercent(Locale currentLocale) {

  Double percent = new Double(0.75);
  NumberFormat percentFormatter;
  String percentOut;

  percentFormatter = NumberFormat.getPercentInstance(currentLocale);
  percentOut = percentFormatter.format(percent);
  System.out.println(percentOut + " " + currentLocale.toString());
}

2.2- تعریف الگوی جدید

static public void customFormat(String pattern, double value) {
  DecimalFormat myFormatter = new DecimalFormat(pattern);
  String output = myFormatter.format(value);
  System.out.println(value + " " + pattern + " " + output);
}

customFormat("###,###.###", 123456.789);
customFormat("###.##", 123456.789);
customFormat("000000.000", 123.78);
customFormat("$###,###.###", 12345.67);
customFormat("\u00a5###,###.###", 12345.67);
customFormat("###,###/###\ue816", 12345.67);

3- تنظیمات فارسی در صفحات HTML
3.1- تعریف زبان و Code Page

<HTML lang="fa">
  <HEAD>
    <META content="text/html; charset=windows-1256" http-equiv="Content-Type">
    <META content="fa" http-equiv="Content-Language">
  </HEAD>

  ...
</HTML>

<HTML>
  <HEAD>
    <META content="text/html; charset=UTF-8" http-equiv="Content-Type">
    <META content="fa" http-equiv="Content-Language">
  </HEAD>

  ...
</HTML>

2.3- راست به چپ صفحات

<HTML dir="rtl">
   ...
</HTML>

3.3- Text Wrapping

<TD nowrap>
...
</TD>

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫باز کردن پنجره Popup در ASP.NET با استفاده از Code Behind

باز کردن پنجره Popup در ASP.NET با استفاده از Code Behind

توسط: MahdiDotNET
تاریخ انتشار: 12 بهمن 1382

قطعا در بسیاری از Applicationها برای شما مواردی پیش آمده است که نیاز داشته‌اید صفحه‌ای خاص را در یک پنجره Popup باز کنید. اما آیا راهی برای انجام این کار با استفاده از کدنویسی در Code Behind وجود دارد؟ پاسخ مثبت است. 		iDevCenter

قطعا در بسیاری از 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 قرار می‌دهید می‌توانید به راحتی خطاهای برنامه نویسی خود را قبل از اینکه اجرای کد خود را آغاز نمایید، پیدا کنید.

منابع

  • ‪Popup - The .NET Way!

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫ساخت یک Screen Saver در VB.NET

ساخت یک Screen Saver در VB.NET

توسط: HosseinGates
تاریخ انتشار: 14 بهمن 1382

Screen Saverها یکی از جذاب ترین و سرگرم کننده ترین برنامه‌های کامپیوتری هستند که از تاریخچه‌ای طولانی برخوردار هستند. در این مقاله نحوه ساخت یک محافظ صفحه نمایش ساده با زبان Visual Basic .NET توضیح داده میشود. 		iDevCenter

Screen Saverها یکی از جذاب ترین و سرگرم کننده ترین برنامه‌های کامپیوتر میباشند که دارای تاریخچه‌ای طولانی هستند. تقریبا" از همان اوایل بوجود آمدن کامپیوترهای شخصی این برنامه‌ها توانستند کاربران زیادی را جذب خود کنند. Screen Saver یا محافظ صفحه نمایش برنامه‌ایست که پس از مدت زمان مشخصی که کاربر با صفحه کلید کار نکند یا ماوس را حرکت ندهد، مانیتور را فعال نموده و یا در آن تصویری را نمایش می‌دهد. تماس با صفحه کلید یا ماوس، محافظ صفحه نمایش را از فعالیت باز می‌دارد. بند فوق تعریفی از Screen Saver است که مبنای ساخت یک محافظ صفحه نمایش نیز بر همین اساس است. برای ساخت یک محافظ صفحه نمایش دو کار اصلی وجود دارد:

  • ساخت برنامه محافظ صفحه نمایش
  • تبدیل آن به فرمت scr. و قرار دادن آن در لیست Screen Saverهای ویندوز

در این مقاله نحوه ساخت یک محافظ صفحه نمایش ساده با زبان Visual Basic .NET توضیح داده می‌شود. الگوریتم این برنامه بسیار ساده بوده و در صورتیکه به زبانهای دیگر نیز تسلط دارید میتوانید این الگوریتم را با زبان دلخواهتان پیاده سازی کنید. همانطور که گفته شد ساخت چنین برنامه ای از دو قسمت تشکیل شده است که برای هر قسمت یک Project لازم است.

بخش اول – ساخت برنامه محافظ صفحه نمایش
یک پروژه جدید باز کنید و اسم Screen Saver دلخواه خود را بر روی آن بگذارید. اولین کار شما تنظیم برخی از خصوصیات فرمتان میباشد که تمامی آنها برای ساختن برنامه حیاتی می‌باشند. خصوصیات فرم خود را مانند زیر تنظیم کنید:

Property | Value
FormBorderstyle | None
WindowState | Maximized
ControlBox | None
MaximizeBox | None
MinimizeBox | None
ShowInTaskbar | False
TopMost | True

با این تنظیمات فرم شما در هنگام اجرا تمام صفحه را در بر خواهد گرفت. حالا شما می‌توانید هنرهای خود را روی فرم پیاده کنید. اما عجله نکنید. هنوز چند تا کار باقی مانده است. باید کاری کنیم که هنگامی که کاربر ماوس را حرکت میدهد برنامه خاتمه یابد. برای این منظور به سراغ رویداد MouseMove فرم می‌رویم. کد زیر را در این رویداد بنویسید:

If Not m_IsActive Then
   Me.m_MouseLocation = New Point(e.X, e.Y)
   m_IsActive = True
Else
   If Math.Abs(e.X - Me.m_MouseLocation.X) > 10 Or _
      Math.Abs(e.Y - Me.m_MouseLocation.Y) > 10 Then
      Application.Exit()
   End If
End If

شاید این کدها کمی عجیب به نظر برسند! اما این طور نیست. m_IsActive در کد فوق یک متغیر سطح ماژول Boolean و با مقدار اولیه False می‌باشد. m_MouseLocation نیز یک متغیر سطح ماژول از نوع Point می‌باشد. هر بار که رویداد فوق اجرا میشود (یعنی وقتی که ماوس حرکت داده می‌شود) نقطه‌ای که ماوس در آن نقطه بوده است درون متغیر m_MouseLocation ذخیره میشود. این مقدار با مقادیر بعدی محل قرار گرفتن ماوس مقایسه شده و در صورتی که تغییر مکان ماوس بیش از 10 پیکسل باشد برنامه اتمام میابد. این تکنیک بدین منظور ارائه شده تا برنامه با هر حرکت کوچک ماوس خاتمه نیابد.

شما می‌توانید در رویدادهای دیگر مانند MouseDown و KeyPress نیز کد زیر را قرار دهید تا برنامه شما کامل شود:

Application.Exit()

حال شما به یک تایمر جهت اجرای حرکاتی بر روی فرم نیاز دارید. پس از اضافه کردن تایمر به برنامه به رویداد Load فرم رفته و کدهای زیر را وارد کنید :

Me.Cursor.Hide()
Me.m_Graphics = Me.CreateGraphics()
Me.Timer1.Enabled = True

ابتدا مکان نما را مخفی می‌کنیم و سپس تایمر برنامه را به کار می اندازیم. در این جا یک متغیر سطح ماژول از نوع Graphics را نیز ساخته و به فرم خود نسبت داده‌ایم که این شئ گرافیکی برای کشیدن اشکالی بر روی فرم بکار می‌رود.

به رویداد Tick تایمر برنامه میرویم و زیر برنامه مربوط به کشیدن اشکال را فراخوانی می‌کنیم:

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Timer1.Tick

   DrawShape()
End Sub

زیر برنامه DrawShape در این برنامه به صورت Random و با رنگهای Random مستطیل‌هایی را رسم میکند. کدهای این زیر برنامه در زیر آورده شده است:

Private Sub DrawShape()
   Dim maxX As Integer = Me.Width
   Dim maxY As Integer = Me.Height
   Dim x1, x2, y1, y2 As Integer
   Dim myRect As Rectangle
   Dim myColor As Color

   x1 = m_Random.Next(0, maxX)
   x2 = m_Random.Next(0, maxX)

   y1 = m_Random.Next(0, maxY)
   y2 = m_Random.Next(0, maxY)

   myRect = New Rectangle(Math.Min(x1, x2), Math.Min(y1, y2), _
   Math.Abs(x1 - x2), Math.Abs(y1 - y2))

   myColor = Color.FromArgb(255, m_Random.Next(255), _
   m_Random.Next(255), m_Random.Next(255))

   m_Graphics.FillRectangle(New SolidBrush(myColor), myRect)
End Sub

تا اینجا Screen Saver ما آماده است ولی هنوز یک کار دیگر باقی مانده است. هنگامی که ویندوز این فایل را اجرا میکند پارامترهایی را به برنامه ارسال میکند. این پارامترها عبارتند از "/c" "/s" "/p" که معنی هر کدام در ادامه بیان خواهد شد. برای بررسی هر کدام از این پارامترها باید از متد زیر استفاده کرد:

<STAThread()>
Shared Sub Main(ByVal args As String())

End Sub

این زیر برنامه اولین زیر برنامه‌ایست که پس از راه اندازی برنامه اجرا خواهد شد. پس مکان مناسبی برای بررسی این پارامترهاست. ابتدا با شرط زیر بررسی می‌کنیم که آیا پارامتری به برنامه ارسال شده است یا خیر؟

If args.Length > 0 Then
   ...
Else
   Dim screenSaverForm As New ScreenSaverSample.fclsScreenSaver()
   screenSaverForm.ShowDialog()

   ' Exit the application when the form is closed
   Application.Exit()
End If

کدهای قسمت اول If را بعدا خواهیم نوشت اما قبل از آن به بررسی قسمت Else می‌پردازیم. اگر ویندوز هیچ پارامتری را به برنامه ارسال نکند (یعنی کاربر مستقیما" برروی فایل exe. دابل کلیک کند) این قسمت اجرا خواهد شد. فرم اصلی برنامه را نمایش داده و هنگامی که فرم بسته شد خط آخر اجرا میشود. اما برای قسمت اول If کدهای زیر را می‌نویسیم:

If args(0).ToLower = "/p" Then
   ' Exit the application.
   Application.Exit()
End If

If args(0).ToLower.Trim().Substring(0, 2) = "/c" Then
   Dim screenSaverSetting As New ScreenSaverSample.fclsSetting()
   screenSaverSetting.ShowDialog()

   ' Exit the application.
   Application.Exit()
End If

If args(0).ToLower = "/s" Then
   Dim screenSaverForm As New ScreenSaverSample.fclsScreenSaver()
   screenSaverForm.ShowDialog()

   ' Exit the application when the form is closed
   Application.Exit()
End If

اگر شرط args.Lenght > 0 برقرار شود بمعنای آنست که پارامتری توسط ویندوز به برنامه ارسال شده است. پس توسط سه شرط فوق پارامترها را بررسی می‌کنیم. پارامتر p/ در این مقاله مورد بررسی قرار نگرفته است. این پارامتر مربوط به ساخت قسمت پیش نمایش (Preview) است که با توجه به این که به کار با APIهای ویندوز نیاز دارد به خارج از بحث این مقاله است. برای همین به سادگی از آن گذشته و در صورت وجود آن برنامه را خاتمه می‌دهیم.

پارامتر c/ به معنای آنست که کاربر خواهان تنظیماتی برروی این Screen Saver می‌باشد. همان طور که می‌دانید برخی از Screen Saverها دارای فرمی مخصوص تنظیمات می‌باشند. شما نیز میتوانید فرمی مخصوص تنظیمات طراحی و بوسیله آن برنامه خود را کاملتر کنید. برای مثال می‌توانید در کدهای فوق بجای رسم مستطیل اشکال دیگری را به انتخاب کاربر رسم کنید. پس از ساختن فرم تنظیمات میبایست آنرا در این قسمت فراخوانی کرده و نمایش دهید. پارامتر s/ به معنای نمایش معمولی Screen Saver میباشد که مانند کد بالا فرم اصلی برنامه به نمایش درآمده است.

برنامه محافظ صفحه نمایش شما حاضر است. اما هنوز ویندوز آنرا در لیست Screen Saver های خود ثبت نکرده است!

بخش دوم - تبدیل برنامه به فرمت scr. و قرار دادن آن در لیست Screen Saverهای ویندوز
برای اینکه ویندوز برنامه شما را به عنوان یک محافظ صفحه نمایش بشناسد باید برنامه خود را با پسوند scr. در دایرکتوری سیستم ویندوز خود کپی کنید. یک پروژه جدید باز کرده و یک دکمه با عنوان Install روی فرم قرار دهید. به رویداد Click دکمه رفته و کدهای زیر را وارد کنید:

Dim fileName As String = "ScreenSaverSample.scr"
Dim sourceFile As String = Environment.CurrentDirectory & "\..\" & fileName
Dim destFile As String = Environment.SystemDirectory & "\" & fileName

Try
   File.Copy(sourceFile, destFile, True)
Catch ex As Exception
   MsgBox(ex.ToString(), MsgBoxStyle.Exclamation, Me.Text)
End Try

سه متغیر رشته‌ای تعریف کرده‌ایم که اولی نام فایل اجرایی است که پروژه قبلی تولید کرده است. متغیر بعدی آدرس فایل فوق و آخرین متغیر آدرس دایرکتوری سیستم میباشد (در ویندوزهای 32 بیتی با نام System32). در نتیجه پسوند فایل را از exe. به scr. تبدیل کرده و آنرا در دایرکتوری سیستم کپی می‌کنیم. عمل کپی نیز در ساختار Try – Catch قرار گرفته تا در صورت بروز خطا کاربر آگاه شود.

در صورتی که دستورات فوق بدون خطا اجرا شوند برنامه محافظ صفحه شما با موفقیت نصب خواهد شد. از Screen Saver خود لذت ببرید.

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫NET. به جای API: یک مثال کاربردی

NET. به جای API: یک مثال کاربردی

توسط: zargaran
تاریخ انتشار: 20 بهمن 1382

در این مقاله سعی شده تا با یک مثال پرکاربرد، امکانات NET Framework. در مقابل توابع API بررسی گردد. 		iDevCenter

پیش از این برای انجام بسیاری از کارها در برنامه نویسی ناچار به استفاده از APIهای Windows بودیم. به عنوان مثال برای باز کردن یک فایل pdf. با استفاده از ShellExecute می‌بایست کد زیر را در VB 6 وارد می‌کردیم:

Private Declare Function Ex Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As
Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As
String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Private Sub Form_Load()
   Ex Me.hwnd, "open", "C:\MyFile.pdf", vbNullString, vbNullString, 1
End Sub

اما در VB.NET می‌توان بدون استفاده از API برای باز کردن همین فایل از کد زیر استفاده کرد:

System.Diagnostics.Process.Start("C:\MyFile.pdf")

بررسی کد VB.NET:
System.Diagnostics یک Namespace شامل کلاس‌هایی برای ارتباط با پروسسهای سیستم می‌باشد. کلاس Process از این Namespace ما را قادر به کنترل پروسس‌های سیستم می‌نماید. متد Start از این کلاس، فایل مورد نظر ما را با توجه به پروسس مربوطه باز می‌کند.

البته در VB.NET هم می‌توان از API استفاده کرد که در این صورت کد آن به صورت زیر خواهد بود:

Declare Auto Function Ex Lib "shell32.dll" Alias "ShellExecute" (ByVal hwnd As
System.IntPtr, ByVal lpOperation As String, ByVal lpFile As String, ByVal
lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As
Long

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load

        Ex(Me.Handle, "open", "C:\MyFile.pdf", vbNullString, vbNullString, 1)
End Sub

مقایسه:
با اولین نگاه سادگی و سر راستی کد VB.NET مشخص می‌شود ولی مهمتر اینکه، نباید فراموش کرد با استفاده از APIها در حقیقت از کد مدیریت نشده (Unmanaged Code) استفاده کرده‌ایم که خود، عدم استفاده از امکانات Managed Code را در برنامه سبب می‌شود. برای اطلاعات بیشتر در زمینه فوائد Managed Code به MSDN مراجعه کنید. به این ترتیب می‌توان کلاس‌های NET Framework. را به عنوان جایگزینی مناسب برای بسیاری از توابع API استفاده کرد. ولی به هر حال در برخی موارد هنوز ناچار به استفاده از APIها می‌باشیم.

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫بررسی رکوردها در دلفی

بررسی رکوردها در دلفی

توسط: Delphijon
تاریخ انتشار: 29 بهمن 1382

در این مقاله به مبحث رکوردها در دلفی و چگونگی ساخت و استفاده از آنها می‌پردازیم. 		iDevCenter

یک ساختار تعریف شده در پاسکال موضوعی تحت عنوان record می‌باشد. رکوردها را می‌توان یک نوع داده که خود شامل چندین نوع داده دیگر است در نظر گرفت. برای تعریف رکوردها بصورت زیر عمل می‌کنیم:

type recordTypeName = record
   fieldList1: type1;
   ...
   fieldListn: typen;
end

پس از اینکه نوع رکورد ایجاد شد، باید متغییرهایی از نوع این رکورد تعریف واز آنها استفاده کرد. برای تعریف متغییر نوع رکورد به صورت زیر عمل می‌شود:

type
   TDateRec = record
   Year: Integer;
   Month: (Jan, Feb, Mar, Apr, May, Jun,
               Jul, Aug, Sep, Oct, Nov, Dec);
   Day: 1..31;
end;

var
   Record1, Record2: TDateRec;

هنگام کار با یک رکورد برای دستیابی به میدان‌های آن، از نماد نقطه استفاده میکنیم:

Record1.Year := 1904;
Record1.Month := Jun;
Record1.Day := 16;

همچنین می‌توان یک رکورد را در یک رکورد دیگر کپی کرد بدون اینکه با خطائی مواجه شویم. شما همچنین می‌توانید متغییرهای از نوع رکوردهای خود را به صورت مستقیم تعریف کنید:

var S: record
   Name: string;
   Age: Integer;
end;

رکوردهای با طول متغییر
نوع رکورد را می‌توان طوری تعریف کرد که طول بخشی از آن ثابت و طول بخش دیگری بر اساس شرایط فیلدها متغییر باشد. در زیر یک مثال و در ادامه آن جدولی از حافظه‌ای که اشغال می‌شود آورده شده است.

type
   TPartType = (ptComputer, ptMonitor, ptComponent);
   TPart = record
      PartNumber : String[15];
      Description : String[30];
      Price : Double;

      case PartType : TPartType of
         ptComputer: (CPU : String[10]; Speed : String[10]; HardDrive : String[10]);
         ptMonitor: (VideoType : String[10]; Size : String[5]; DotPitch : String[5]);
         ptComponent: (Internal : Boolean; Specs : String[29]);
end;

این تعریف به کامپایلر می گویید که تنها یکی از متغییرهای مجموعه case را برای استفاده در هر رکوردی انتخاب کند. این یک راهکار بسیار خوب برای استفاده از حافظه می باشد؛ زیرا حافظه یکسانی برای هر مجموعه‌ای از متغییرها در نظر گرفته می‌شود.

بایت | نام متغییر | نام متغییر | نام متغییر
0 | PartNumber |  |
15 | Description |  |
45 | Price |  |
53 | PartType |  |
54 | CPU | VideoType | Internal
55 |  |  | Specs
64 | Speed | Size |
69 |  | DotPitch |
74 | HardDrive |  |

دسترسی به یک بایت
بعضی مواقع، هنگامیکه با یک API خارجی کار می‌کنید، احتیاج دارید که اطلاعاتی از نوع Word یا Longint را به نوع‌های دلخواه بشکنید. به عنوان مثال TMSF را بصورت زیر در نظر بگیرید:

Most Significant Byte |  |  | Least Significant Byte
Unused | Frames | Seconds | Minute

ساختار TMSFRec رو بصورت زیر تعریف می‌کنیم:

type
   TMSFRec = record
      Minutes : Byte;
      Seconds : Byte;
      Frames : Byte;
      Dummy : Byte;
end;

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

begin
   MinuteLbl.Caption := IntToStr(TMSFRec(Position).Minutes);
   SecondLbl.Caption := IntToStr(TMSFRec(Position).Seconds);
   FrameLbl.Caption := IntToStr(TMSFRec(Position).Frames);
end;

در مثال قبل، Position متغییری از نوع Longint می‌باشد.

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫توابع ریاضی در ویژوال بیسیک

توابع ریاضی در ویژوال بیسیک

توسط: sheidaian
تاریخ انتشار: 8 اسفند 1382

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

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

تابع 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

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

تابع | فرمول
سکانت | 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
برای استفاده از اعداد پی و 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

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫آشنایی با شیئ پرینتر در ویژوال بیسیک

آشنایی با شیئ پرینتر در ویژوال بیسیک

توسط: sheidaian
تاریخ انتشار: 20 اسفند 1382

شیئ پرینتر، شیی است که پرینتر پیش فرض سیستم را کنترل می‌کند. در این مقاله با برخی از خواص و متدهای این شیئ آشنا خواهید شد. 		iDevCenter

شیئ پرینتر، شیی است که پرینتر پیش فرض سیستم را کنترل می‌کند. استفاده از شیئ پرینتر در ویژوال بیسیک مانند کار با سایر اشیاء است و بایستی از خواص و متدهای آن استفاده کرد. در ادامه با برخی از این خواص و متدها آشنا خواهید شد.

چاپ متن توسط شیئ پرینتر
برای چاپ متن توسط شیئ پرینتر کافیست خواص 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 اول از علامت ; استفاده کنیم.

چاپ گرافیک توسط شیئ پرینتر
به چهار روش می‌توان اشکال گرافیکی را توسط شیئ پرینتر چاپ کرد:

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 استفاده کرد. همچنین width1 و height1 طول و عرض تصویر چاپی می‌باشند . با استفاده از ترکیب x2 و y2 بهمراه width2 و height2 نیز می‌توان برشیئ از تصویر اصلی برای چاپ را مشخص کرد. مثال:

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

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

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

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫چگونگی ارسال ایمیل در PHP

چگونگی ارسال ایمیل در PHP

توسط: amirmohammad
تاریخ انتشار: 15 فروردین 1383

در این مقاله با تابع Mail در PHP آشنا شده و روش ارسال یک ایمیل از طریق آن را یاد خواهید گرفت. 		iDevCenter

PHP دو تابع اختصاصی برای ارسال Mail به همراه دارد که به صورت پیش فرض در داخل PHP نصب شده‌اند: تابع ()Mail که اجازه می‌دهد مستقیما" از یک Script ایمیل خود را ارسال کنید و تابع ()ezmlm_hash که کارهای لازم برای پیوستن نامه‌ها به EZMLM mailing list را در اختیار شما قرار می‌دهد (جهت توضیحات بیشتر به ezmlm.org مراجعه کنید).

تابع ()Mail برای ارسال نامه‌ها از اطلاعات موجود در فایل php.ini استفاده می‌کند و در اکثر موارد کار با مقادر پیش فرض این اطلاعات باعث عمل نکردن تابع می شود. این اطلاعات در سه قسمت وجود دارند (توجه داشته باشید که دو مورد اول برای سیستم‌های مایکروسافتی و مورد آخر برای کار با سیستم‌های یونیکسی است):

SMTP: آدرس میزبان SMTP را مشخص می‌کند. این آدرس هم می‌تواند یک آدرس کامل باشد و هم یک آدرس IP. این تنظیم فقط در سیستمهای مایکروسافتی مورد استفاده قرار می‌گیرد.

sendmail_from: مشخص می‌کند که این نامه از طرف چه کسی فرستاده شده است. این قسمت هم فقط در سیستم‌های مایکروسافتی کار می‌کند.

sendmail_path: مسیر کامل برنامه اجرایی email را مشخص می‌کند و این برنامه هنگام فرستادن email استفاده می‌شود. این قسمت مخصوص سیستمهای یونیکسی است.

تابع ()Mail بصورت زیر تعریف شده است:

bool mail(string recipient, string subject, string message, [string extra_headers], [string extra_arguments])

پارامترهای این تابع:

پارامتر | توضیحات
recipient | آدرس گیرنده نامه
subject | موضوع نامه
message | متن نامه
extra_headers | headerهای اضافی برای نامه شما
extra_arguments | آرگومانهای بیشتر برای تحت اختیار گرفتن برنامه فرستنده mail. در PHP نسخه 4.0.5 و بالاتر.

تایع فوق یک ایمیل به آدرس مشخص شده می‌فرستد و در صورت موفقیت مقدار TRUE و غیر این صورت مقدار FALSE را برمی‌گرداند.

پارامتر recipient می‌تواند هم حاوی یک آدرس باشد و هم یک لیست از آدرسها که با کاما از هم جدا شده‌اند. اگر شما می‌خواهید تا از header های اضافی برای ارسال نامه خود استفاده کنید مثلا از CC یا BCC این عبارات باید در پارامتر extra_headers قرار داده شوند. توجه داشته باشید که این تابع به هیچ عنوان مشخص نمی‌کند که آیا نامه به مقصد رسیده است یا خیر. در صورت کامل نبودن هر یک از موارد اجباری تابع فوق، این تابع عمل نخواهد کرد. این تابع از نسخه 3 در PHP موجود است.

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

/* When the following code was executed, i received this email:
*
* From: Apache httpd
* To: amirsaied@hotmail.com
* Subject: This is a test
* Date: Thu, 4 Mar 2004 16:33:17 -0700
*
* Hi there,
*
* This is a test message. please disregard.

$address = 'amirsaied@hotmail.com';
$subject= 'This is a test';
$message= 'Hi there,

This is a test message. please disregard.';
mail($address, $subject, $message);

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫بدست آوردن اطلاعاتی محیطی از سیستم در VB.NET

بدست آوردن اطلاعاتی محیطی از سیستم در VB.NET

توسط: HosseinGates
تاریخ انتشار: 5 خرداد 1383

در این مقاله روش بدست آوردن اطلاعات محیطی از سیستم مانند نام کاربر، نام کامپیوتر، اندازه آیکون‌ها، تعداد مانیتور، اندازه قاب پنجره، درایوهای موجود و آدرس پوشه‌های مخصوص سیستم در زبان Visual Basic .NET بررسی می‌شود. 		iDevCenter

اطلاعات سیستمی
اینگونه اطلاعات را می‌توان از فضانام System.Windows.Forms.SystemInformation بدست آورد. برای مثال چند نمونه از اینگونه اطلاعات را با کد زیر در کنترل ListView وارد می کنیم. نام این کنترل lvwSystemInformation است. توجه داشته باشید که خصوصیت View این کنترل در حالت Details قرار گرفته باشد.

With lvwSystemInformation.Items.Add("BorderSize")
    .SubItems.Add(SystemInformation.BorderSize.ToString())
End With

With lvwSystemInformation.Items.Add("ComputerName")
    .SubItems.Add(SystemInformation.ComputerName.ToString())
End With

With lvwSystemInformation.Items.Add("CursorSize")
    .SubItems.Add(SystemInformation.CursorSize.ToString())
End With

With lvwSystemInformation.Items.Add("DoubleClickTime")
    .SubItems.Add(SystemInformation.DoubleClickTime.ToString())
End With

With lvwSystemInformation.Items.Add("IconSize")
    .SubItems.Add(SystemInformation.IconSize.ToString())
End With

With lvwSystemInformation.Items.Add("MonitorCount")
    .SubItems.Add(SystemInformation.MonitorCount.ToString())
End With

بدست آوردن نام درایوها
متد Environment.GetLogicalDrives آرایه‌ای از نام درایوها برمی‌گرداند. می‌توان این آرایه را به عنوان Data Source یک لیست برای نمایش درایوها بکار برد. پس از بدست آوردن لیستی از درایوها، شما ممکن است بخواهید که اطلاعاتی نیز در مورد فایل‌ها و دایرکتوری‌های موجود در این درایوها بدست آورید. جهت این کار بهتر است که به کلاسهای System.IO.File و System.IO.Directory مراجعه کنید.

پوشه‌های مخصوص سیستم
در ویندوز پوشه‌هایی با نام پوشه‌های مخصوص یا Special Folders وجود دارد. پوشه‌های System ،Startup ،My Documents و Program Files از این نمونه‌اند. در بسیاری از مواقع لازم است که برنامه نویس آدرس این پوشه‌ها را بداند تا برای مثال بتواند فایلی را در آن‌ها کپی کند. اما از آنجایی که در هر سیستم آدرس این پوشه‌ها متفاوت است، VB.NET متدهایی را جهت بدست آوردن این آدرسها ارائه میدهد.

مهمترین پوشه هر ویندوز، شاخه System می‌باشد. برای بدست آوردن آدرس این پوشه می‌توان از کد زیر استفاده کرد:

lblSystemFolder.Text = GetFolderPath(SpecialFolder.System)

تابع GetFolderPath تابعی از کلاس System.Environment می‌باشد که آدرس اینگونه پوشه‌ها را برمی‌گرداند. تعریف این تابع به صورت زیر است:

Public Shared Function GetFolderPath (ByVal folder As System.Environment.SpecialFolder) As String

تکنیک دیگری نیز وجود دارد که به کمک آن می‌توان لیست کاملی از تمامی این پوشه‌ها را بدست آورد. در این روش نه چندان آسان از تابع GetNames از کلاس System.Enum استفاده می‌شود. این تابع یک مجموعه شمارشی را بعنوان پارامتر ورودی می‌گیرد و آرایه‌ای از اسامی ثابت‌های این مجموعه شمارشی برمی‌گرداند. تعریف تابع را در زیر مشاهده می‌کنید:

Public Shared Function GetNames(ByVal enumType As System.Type) As String()

پس از نوشتن تابعی مانند زیر، در یک رویداد مانند رویداد Load فرم این تابع با پارامتر Environment.SpecialFolder صدا زده می‌شود.

Private Sub LoadList(ByVal lst As ListBox, ByVal typ As Type)
   lst.DataSource = System.Enum.GetNames(typ)
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load

    LoadList(lstFolders, GetType(Environment.SpecialFolder))
End Sub

حال می‌خواهیم کاری کنیم که پس از کلیک بر روی نام هر پوشه، آدرس آن نیز نمایش داده شود. به رویداد SelectedIndexChanged رفته و کدهای زیر را می‌نویسیم:

Private Sub lstFolders_SelectedIndexChanged(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles lstFolders.SelectedIndexChanged

   Dim sf As Environment.SpecialFolder = GetSpecialFolderFromList()
   lblSpecialFolder.Text = GetFolderPath(sf)

End Sub

در این تابع ابتدا متغیری با نام sf از نوع Environment.SpecialFolder می‌سازیم که نگهدارنده مقدار خروجی تابع GetSpecialFolderFromList می‌باشد. این تابع با استفاده از گزینه انتخاب شده از لیست پوشه‌های مخصوص نام آنرا برمی‌گرداند و آن را بصورت زیر تعریف می کنیم:

Private Function GetSpecialFolderFromList() As Environment.SpecialFolder

   Return CType(System.Enum.Parse(GetType(Environment.SpecialFolder), _
      lstFolders.SelectedItem.ToString), Environment.SpecialFolder)

End Function

تابع Parse از کلاس System.Enum یک رشته یا مقدار عددی از یک مجموعه شمارشی را به یک شئ شمارشی تبدیل می‌کند. تعریف این تابع را در زیر می‌بینید:

Public Shared Function Parse(ByVal enumType As System.Type, ByVal value As String) As Object

سپس مقدار برگشتی آن با استفاده از CType به نوع Environment.SpecialFolder تبدیل می‌شود. بدین صورت پس از آنکه بر روی هر یک از آیتم‌های لیست کلیک می کنیم، آدرس آن در Label مقابل نمایش داده می‌شود.

به شما پیشنهاد می‌کنم برای درک بیشتر این مطالب حتما" نمونه برنامه مربوطه را دریافت و اجرا کنید.

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫چگونه یک سیستم عضوگیری ساده توسط PHP بسازیم؟

چگونه یک سیستم عضوگیری ساده توسط PHP بسازیم؟

توسط: sajjad_khaleghi
تاریخ انتشار: 18 تیر 1383

در این مقاله شما طرز ساختن یک سیستم عضویت ساده (Membership Sytem) برای وب سایتتان بوسیله PHP و MySQL را یاد خواهید گرفت. 		iDevCenter

در طی این مقاله شما استفاده آسان از موارد زیر و همچنین به کاربردن آنها در برنامه‌های دیگر را یاد خواهید گرفت:

  • گرفتن اطلاعات کاربر هنگام ثبت نام و ذخیره آن در MySQL
  • ساختن یک کلمه عبور به طور تصادفی و تبدیل آن به کد رمز در دیتابیس
  • تائید ایمیل کاربر هنگام ثبت نام قبل از اولین ورود
  • دستورات ابتدایی کار با فرم‌ها در PHP
  • به کار گیری تابع Mail در PHP و نحوه ارسال ایمیل توسط آن

لازم است یادآوری کنم که کدهای موجود در برنامه به صورت بسیار ساده نوشته شده‌اند و امکان دارد که بر حسب سیستم عامل و یا نسخه PHP که بر روی سیستم شما می‌باشد اجرا نشوند. چنانچه با این مشکل برخورد کردید، عیب را در نحوه نصب PHP و یا سیستم عامل خود جستجو کنید.

چنانچه با PHP و برنامه‌نویسی تحت وب و نیز طراحی صفحات و بانک اطلاعاتی به صورت ابتدایی آشنایی ندارید توصیه می‌کنم که این مقاله را دنبال نکنید. کلیه فایل‌های مورد نیاز در انتهای مقاله به صورت فشرده شده موجود می‌باشند. قبل از ادامه مقاله توصیه می‌کنم که حتما آن ها را دانلود کرده و در ویرایشگرهای خود باز کنید. ویرایشگر مورد استفاده من Notepad می‌باشد.

ساختن بانک اطلاعاتی (Database):
در این مرحله به ساخت یک بانک اطلاعاتی برای سیستم عضویت می‌پردازیم. ممکن است شما از phpMyAdmin و یا سایر برنامه‌های مرتبط با MySQL استفاده کنید ولی من از PHPMyAdmin به خاطر سهولت و همچنین فراگیر بودن آن در اکثر میزبانهای (Host) کاربران ایرانی، استفاده می‌کنم.

جهت این کار ابتدا یک بانک اطلاعاتی با نام دلخواه بسازید و سپس برای ایجاد جداول و مقداردهی اولیه در قسمت Query Window کد زیر را وارد کنید:

CREATE TABLE users (
userid int(25) NOT NULL auto_increment,
first_name varchar(25) NOT NULL default '',
last_name varchar(25) NOT NULL default '',
email_address varchar(25) NOT NULL default '',
username varchar(25) NOT NULL default '',
password varchar(255) NOT NULL default '',
info text NOT NULL,
user_level enum('0','1','2','3') NOT NULL default '0',
signup_date datetime NOT NULL default '0000−00−00 00:00:00',
last_login datetime NOT NULL default '0000−00−00 00:00:00',
activated enum('0','1') NOT NULL default '0',
PRIMARY KEY (userid) ) TYPE=MyISAM COMMENT='Membership Information';
sql.txt

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

حال که بانک اطلاعاتی مورد نیاز ایجاد شد به سراغ گرفتن اطلاعات از کاربر و ذخیره آن در بانک اطلاعاتی می‌رویم.

ثبت نام کاربر:
شما می‌توانید با HTML یک فرم ساده ایجاد کنید. این کار به راحتی توسط نرم‌افزارهایی نظیر Front Page و یا DreamWeaver قابل انجام است ولی من یک کد آماده با نام login_from.htm برای شما آماده کرده‌ام که می‌توانید از آن استفاده کنید. شما می‌توانید با سلیقه خود طرح و شکل آن را عوض کنید. چنانچه خواستید شکل فرم را عوض کنید این نکته توجه داشته باشید که نام فیلدهای فرم به صورت زیر باشد: first_name ،last_name ،email_address ،username و info.

چنانچه فرم نمونه را تغییر نمی‌دهید تمام نام‌ها برای هر فیلد درست انتخاب شده‌اند و نیازی به تغییر آنها نیست. لازم به یادآوری است که خاصیت action فرم باید به مسیر درستی (در اینجا register.php) برای فرستادن اطلاعات اشاره کند.

اکنون فایل register.php را باز کنید. به ظاهر کد پیچیده‌ای است. اماعجله نکنید! در ادامه درباره ساختار کدها و طرز کار هریک از آن‌ها صحبت خواهد شد. اگر به توضیحاتی که در درون کدها نوشته شده است توجه کنید درک آن بسیار ساده و قابل فهم خواهد بود. حال به توضیح برنامه می‌پردازیم:

&lt;?php
 include 'db.php';
?&gt;

این خط فایل db.php که حاوی کدهای لازم برای ارتباط با بانک اطلاعاتی می‌باشد را در بدنه اصلی برنامه فراخوانی می‌کند. باز هم این نکته را یادآوری می‌کنم که چنانچه اطلاعات زیادی درباره بانک‌های اطلاعاتی و نحوه برنامه نویسی آنها ندارید، حتما آموخته‌های خود را تکمیل کنید تا فهم و درک مطلب برای شما آسانتر شود. من یک نمونه اتصال به بانک اطلاعاتی را که در db.php نوشته شده در زیر آورده‌ام. اگر جزو کاربران حرفه‌ای PHP هستید تغییرات دلخواه و یا حتی جدید را می‌توانید در db.php انجام دهید:

<?php
 $dbhost = "localhost"; // database host
 $dbuser = "db_username"; // database username
 $dbpassword = "db_password"; // database password
 $db2use = "db_name"; // name of database

 $conn = @mysql_pconnect($dbhost,$dbuser,$dbpassword)
 or die("Connection failed: Please try later.");
 $db = @mysql_select_db ($db2use,$conn) or die(Error:.mysql_error());
?>

در مورد کد بالا به نکات زیر توجه کنید:
  • مقدار dbhost$ در بیشتر موارد localhost می‌باشد. اما چنانچه غیر از این بود با سرویس پشتیبان سرورتان تماس بگیرید.
  • dbuser$ نام کاربری بانک اطلاعاتی شما می‌باشد.
  • dbpassword$ کلمه عبور بانک اطلاعاتی شما می‌باشد.
  • db2use$ نام دیتابیس (بانک اطلاعاتی) مورد استفاده شما می‌باشد.

برای اتصال به بانک اطلاعاتی از یک mysql_pconnect استفاده کردیم که وظیفه ارتباط دائمی را تا پایان برنامه به عهده داشته دارد. این کار باعث صرفه جویی در زمان اجرای برنامه می‌شود ولی این نکته حائز اهمیت است که استفاده از یک ارتباط دائمی در بعضی موارد ممکن است به سود شما نباشد و باعث ایجاد بار اضافی بر روی سرور شما شود. سایر دستورات مربوط به بالا واضح است و احتیاج به توضیح ندارند. حال به ادامه توضیحات می پردازیم:

// Define post fields into simple variables
 $first_name = $_POST['first_name'];
 $last_name = $_POST['last_name'];
 $email_address = $_POST['email_address'];
 $username = $_POST['username'];
 $info = $_POST['info'];

// Let's strip some slashes in case the user entered any escaped characters
 $first_name = stripslashes($first_name);
 $last_name = stripslashes($last_name);
 $email_address = stripslashes($email_address);
 $username = stripslashes($username);
 $info = stripslashes($info);

همانطور که از توضیح اول کد مشخص است، اطلاعات فرستاده شده از طریق فرم در متغیرهایی ذخیره می‌شود. این عمل با استفاده از متد []POST_$ انجام می‌شود. در قسمت بعد از تابع ( )stripslashes استفاده کرده‌ایم. تابع یاد شده \ (اسلش)های موجود قبل از ' و " که PHP به طور خودکار به آنها اضافه می کند را حذف می‌کند. این عمل به خاطر این است که امکان دارد ما اطلاعاتی که توسط کاربر ثبت می شود را دوباره نمایش دهیم. وجود اسلش هنگام فراخوانی اطلاعات از بانک اطلاعاتی موجب بروز خطای دستوری می‌شود. این قسمت بیشتر در مورد اطلاعاتی است که از فیلد Infromation about you کاربرد دارد زیرا کاربر می‌تواند هر آنچه را که می‌خواهد در آن بنویسد.

برای چک کردن اینکه ایمیل درست وارد شده باشد یعنی حاوی @ و . باشد، دستورهای جاوا اسکریپتی بسیاری است که به دلیل پیچیده شدن موضوع آن را به خودتان واگذار میکنیم. حال نوبت به کنترل اطلاعاتی است که کاربر ارسال کرده است:

// Do some error checking on the form posted fields
 if((!$first_name) || (!$last_name) || (!$email_address) || (!$username)) {
   echo 'You did not submit the following required information! &lt;br /&gt;';

 if (!$first_name) {
   echo "First Name is a required field. Please enter it below.&lt;br /&gt;";
 }

 if (!$last_name) {
   echo "Last Name is a required field. Please enter it below.&lt;br /&gt;";
 }

 if (!$email_address) {
   echo "Email Address is a required field. Please enter it below.&lt;br /&gt;";
 }

 if (!$username) {
   echo "Desired Username is a required field. Please enter it below.&lt;br /&gt;";
 }

 include 'join_form.html'; // Show the form again!

 /* End the error checking and if everything is ok, we'll move on to
 creating the user account */

 exit(); // if the error checking has failed, we'll exit the script!
}

این قسمت بسیار ساده است. شرط اول کنترل میکند که همه فیلدها پر شده باشند. این کار بوسیله عملگر منطقی "یا" "||" انجام می‌شود. چنانچه یکی از فیلدها خالی باشد، پیغام‌های خطای متناظر با آن با آن فیلد بر روی صفحه نشان داده خواهد شد. چنانچه همه فیلدها پر شده باشند و فیلد خالی موجود نباشد کنترل متغیرها متوقف شده و از بلاک شرط با دستور ()exit خارج می شویم. قسمت بعد کنترل اینکه نام کاربری و ایمیل شما قبلا در بانک اطلاعاتی ذخیره نشده باشد:

 $sql_email_check = mysql_query("SELECT email_address FROM users WHERE
 email_address='$email_address'");
 $sql_username_check = mysql_query("SELECT username FROM users WHERE
 username='$username'");
 $email_check = mysql_num_rows($sql_email_check);
 $username_check = mysql_num_rows($sql_username_check);

 if (($email_check &gt; 0) || ($username_check &gt; 0)) {
  echo "Please fix the following errors: &lt;br /&gt;";

   if ($email_check &gt; 0) {
     echo "&lt;strong&gt;Your email address has already been used by
           another member in our database. Please submit a different
           Email address!&lt;br /&gt;";

     unset($email_address);
   }

   if ($username_check &gt; 0) {
     echo "The username you have selected has already been used by
           another member in our database. Please choose a different
           Username!&lt;br /&gt;";

     unset($username);
   }

   include 'join_form.html'; // Show the form again!

   exit(); // exit the script so that we do not create this account!
 }

دستورات بالا برای آنهایی که در حد متوسط از بانک‌های اطلاعاتی سر رشته دارند بسیار ساده است. چنانچه نام کاربری و یا ایمیل قبلا ثبت شده باشد مقدار () mysql_num_rows برابر صفر نمی‌شود و پیغام‌های متناظر با کنترل نام کاربری و یا ایمیل برای کاربر نشان داده می‌شود و روند ثبت نام قطع شده و پیغام مورد نظر چاپ می شود و در زیر آن دوباره فرم ثبت نام نشان داده می‌شود. حتما تا به حال با این موضوع در سایت های بزرگ برخورد کرده‌اید که چنانچه هر کدام از فیلدها به نحوی اشتباه پر شده باشند و یا نام کاربری قبلا ثبت شده باشد صفحه فرم با اطلاعاتی که کاربر هنگام ورود پر کرده تکمیل شده و قسمت مشکل دار با پیغام خطا به رنگ قرمز نمایش داده می‌شود. برای ساختن چنین روندی به برنامه نویسی پیشرفته و بکارگیری اسکریپت‌های مختلفی نیاز داریم که از سطح متوسط این مقاله خارج است.

function makeRandomPassword() {
 $salt = "abchefghjkmnpqrstuvwxyz0123456789";
 srand((double)microtime()*1000000);
 $i = 0;

 while ($i <= 7) {
   $num = rand() % 33;
   $tmp = substr($salt, $num, 1);
   $pass = $pass . $tmp;
   $i++;
 }

 return $pass;
}

$random_password = makeRandomPassword();
$db_password = md5($random_password);

کار این تابع ایجاد یک کلمه عبور تصادفی و تبدیل آن به فرمت md5 است. اینکه چرا کاربر اجازه ندارد که خودش کلمه عبور را انتخاب کند دلایلی دارد. یکی از آن دلایل این است که کلمه عبور ساخته شده به ایمیل کاربر فرستاده می‌شود و این به ما در راستای اینکه آیا ایمیل ثبت شده توسط کاربر ایمیل معتبری می‌باشد کمک می‌کند. به عبارتی چنانچه ایمیل فرد معتبر باشد کاربر با رفتن به ایمیل پسورد خود را دریافت می‌کند. و دلیل دیگر اینکه باایجاد یک کلمه عبور تصادفی و همچنین تبدیل آن به md5 امنیت کلمه عبور بسار بالا می‌رود و به سادگی توسط هکرها قابل شناسایی نیست.

// Enter info into the Database.
 $info2 = htmlspecialchars($info);
 $sql = mysql_query("INSERT INTO users (first_name, last_name,
 email_address, username, password, info, signup_date)
 VALUES('$first_name', '$last_name', '$email_address',
 '$username', '$db_password', '$info2', now())") or die (mysql_error());

 if (!$sql) {
   echo 'There has been an error creating your account. Please
   contact the  webmaster.';
 }
 else {
   $userid = mysql_insert_id();

   // Let's mail the user!
   $subject = "Your Membership at MyWebsite!";
   $message = "Dear $first_name $last_name,
   Thank you for registering at our website, http://www.mydomain.com!
   You are two steps away from logging in and accessing our exclusive members
   area. To activate your membership, please click here:
   http://www.mydomain.com/activate.php?id=$userid&code=$db_password
   Once you activate your memebership, you will be able to login with the
   following information:
   Username: $username
   Password: $random_password
   Thanks!
   The Webmaster
   This is an automated response, please do not reply!";

   mail($email_address, $subject, $message,
   "From: MyDomain Webmaster< admin@mydomain.com>");

   echo 'Your membership information has been mailed to your email address!
   Please check it and follow the directions!';
 }
?>

همانطور که از توضیحات بر می‌آید، این قسمت جهت ثبت در بانک اطلاعاتی و فرستادن اطلاعات از قببیل پسورد و همچنین لینک فعال سازی به کاربر می‌باشد. اما تابع ( )htmlspecialchars چه کاری انجام می‌دهد؟ این تابع تگهای html را به کدهای مربوطه تغییر می‌دهد برای مثال:

$new = htmlspecialchars("&lt;a href='test'&gt;Test&lt;/a&gt;", ENT_QUOTES);
echo $new;  // &lt;a href=&#039;test&#039;&gt;Test&lt;/a&gt;

این کار باعث می‌شود که کاراکترهایی نظیر < > ' به همین صورت در بانک اطلاعاتی ذخیره نشوند و باعث بروز خطاهای دستوری هنگام فراخوانی آنها توسط PHP نشوند.

در قسمت بعد اطلاعاتی که پس از گذراندن از مراحل مختلف آماده ذخیره شدن در بانک اطلاعاتی هستند به وسیله دستورINSERT در بانک اطلاعاتی ثبت می‌شوند. چنانچه مشکلی در بانک اطلاعاتی وجود نداشته باشد، مرحله بعدی آن که فرستادن ایمیل به کاربر می‌باشد اجرا می‌شود. فرستادن ایمیل توسط تابع ()mail انجام می‌شود. روش‌های استفاده از تابع ()mail بسیار است که با مراجعه به help برنامه PHP می‌توانید آنها را مشاهده کنید. در این جا ساده‌ترین روش برای اینکار انتخاب شده است. کاربر در قسمت پیام ایمیل چیزی شبیه به آنچه در زیر آمده است مشاهده می‌کند:

From: MyDomain Webmaster
To: you@email.com
Subject: Your Membership at MyWebsite!

Dear boy from sun,
Thank you for registering at our website, http://www.mydomain.com!
You are two steps away from logging in and accessing our exclusive members area.
To activate your membership, please click here:
http://www.mydomain.com/activate.php?id=3&cod=37ec82769e837c2f853450

Once you activate your memebership, you will be able to login with the
following information:
Username: myusername
Password: msxsag4h

Thanks!
The Webmaster
This is an automated response, please do not reply!

مرحله بعد به روز رسانی پایگاه داده هنگامی که کاربر ایمیل خود را چک کرده و بر روی لینک معتبر سازی کلیک کرده است، می‌باشد. کد زیر در فایل activate.php ذخیره شده است:

<?
 /* Account activation script */
 include 'db.php';
 $userid = $_REQUEST['id'];
 $code = $_REQUEST['code'];
 $sql = mysql_query("UPDATE users SET activated='1' WHERE userid='$userid'
 AND password='$code'");
 $sql_doublecheck = mysql_query("SELECT * FROM users WHERE userid='$userid'
 AND password='$code' AND activated='1'");
 $doublecheck = mysql_num_rows($sql_doublecheck);

 if ($doublecheck == 0) {
   echo "<font color=red>Your account could not be activated!</font>";
 } elseif ($doublecheck > 0) {
   echo "Your account has been activated! You may login below!<br />";
   include 'login_form.html';
 }
?>

خط اول فراخوانی فایل db.php برای برقراری ارتباط با بانک اطلاعاتی می‌باشد. پس از گرفتن اطلاعات خواسته شده از طریق لینک فعال سازی، برنامه ابتدا مقدار activate کاربر را در صورت صحت اطلاعات ارسالی برابر با 1 قرار می‌دهد و در بانک اطلاعاتی ذخیره می‌کند و چنانچه این عمل با موفقیت انجام شد دوباره کنترل میکند که آیا فعال سازی نام کاربری درست انجام گرفته است یا خیر. چنانچه این قسمت بدون خطا اجرا شود، صفحه ورود کاربر در صفحه ظاهر می‌شود.

در مقاله بعدی چگونگی ورود کاربر بعد از تائید نام کاربری و کلمه عبور را بررسی می‌کنیم.

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫نحوه ایجاد یک Wizard برای Visual Studio .NET

نحوه ایجاد یک Wizard برای Visual Studio .NET

توسط: keyvannayyeri
تاریخ انتشار: 10 مرداد 1383

در این مقاله با نحوه ساخت یک Wizard برای Visual Studio .NET توسط VB.NET آشنا خواهید شد. 		iDevCenter

Wizardها برنامه‌هایی کاربردی هستند که کاربران را در انجام یک سری دستورات یاری می‌دهند. به طور کلی دستوراتی که توسط Wizardها انجام می‌شوند به یک ترتیب خاص اعمال نیاز دارند. نکته مهم در مورد Wizardها این است که از تکرار و یکنواختی جلوگیری کرده و یک دستور چند مرحله‌ای را به یک ترتیب خطی از هر آنچه برای هدف مورد نظر است در می‌آورند.

به تجربه احتمالا می‌دانید مایکروسافت Wizardها را به عنوان ترتیبی از کادرهای محاوره‌ای با شمایل مناسب همراه با برخی کلمات که دستورات را نشان می‌دهند و کادرهای ورودی با انتخاب‌های چندگانه ساده پیاده‌سازی کرده است. این Wizardها در واقع نمایش خارجی بخشهای پنهانی هستند که ازآنها استفاده می‌کنند. ایجاد Wizardها در Visual Basic .NET برای VS.NET ساده تر از ایجاد Add-Inها برای برنامه‌های کاربردی است.

Visual Studio .NET به شما این امکان را می‌دهد که برای بعضی اعمال و کارها Wizardهایی را نوشته و آنها را در محیط این برنامه به اجرا درآورید. در این مقاله با نحوه نوشتن یک Wizard که توسط منوی File | Add New Item به اجرا در می‌آید، آشنا خواهید شد.

گام‌های اساسی برای ایجاد یک Wizard برای VS.NET مطابق زیر است:

  • ایجاد یک پروژه Class Library.
  • ایجاد یک Refrence به کتابخانه EvnDTE.
  • پیاده‌سازی Interfaceخاصی به نام IDTwizard و متدی که با آن Interface تعریف شده است یعنی Excute. وقتی Wizard احضار شود، این متد فراخوانی خواهد شد.
  • پیاده‌سازی رفتار Wizard: این گام معمولا" یک ترتیب از کادرهای محاوره‌ای و یک نتیجه پایانی را شامل می‌شود.
  • Compile و ثبت نام Wizard با استفاده از نرم‌افزار کمکی Regasm.exe.
  • ایجاد یک فایل متنی با نامی مشابه نام Wizard و پسوند vsz. برای مثال فایل Mywizard.dll احتیاج به یک فایل متنی با نام Mywizard.vsz دارد. در ادامه درباره این فایل متنی بیشتر توضیح خواهیم داد.
  • کپی کردن فایل به شاخه مخصوص آن. این شاخه به نحوه‌ای که شما Wizart را احضار می‌کنید، بستگی دارد. برای مثال اگر شما می‌خواهید Wizard شما زمانی که کاربر فایلی جدیدی را برای اضافه کردن به پروژه انتخاب می‌کند اجرا شود، یک Item جدید در پروژه VB ایجاد کرده و فایل با پسوند vsz. را به شاخه‌ای که شامل عناصر AddNewItem است کپی کنید. مثلا":

    C:\ProgramFiles\Microsft Visual Studio .NET\vb7\VBProjectItems\LocalProjectItems\

اساس کار نوشتن یک Wizart، ایجاد یک کلاس کتابخانه‌ای است که IDTWizard را پیاده‌سازی می‌کند. قطعه کد زیر بیانگر Wizard خاصی است که یک Message Box را نشان می‌دهد:

Imports EnvDTE

Public Class Class1
    Implements IDTWizard

Private Sub Excute(ByVal Application As Object, _
    ByVal hwndOwner As Integer, _
    ByRef contextParams() As Object, _
    ByRef customParams() As Object, _
    ByRef RetVal As wizardResult) Implements EnvDTE.IDTWizard.Excute

        MsgBox("یا علی")
        RetVal = wizardResult.wizardResultCancel

    End Sub
End Class

متد Excute پارامترهای متفاوتی را می‌گیرد. Application ارجای به محیطی است که Wizard در آن در حال اجراست. hwnOwner کنترل کننده (Handle) برنامه کاربردی والد است. ContextParams شامل اطلاعاتی در مورد محیطی است که Wizard در آن اجرا شده است. Custom Params مقادیری هستند که شما می‌توانید از طریق فایل vsz. با فرم نگارشی Params=Value به Wizard ارسال کنید. RetVal نیز یک مقدار شمارشی است که نشان می‌دهد Wizard موفق شده یا شکست خورده است.

ایجاد فایل VSZ.:
یک Wizard فایلی را با نامی مشابه با نام اعلام شده آن و پسوند vsz. نیاز دارد. این فایل یک فایل متنی ساده شبیه به یک فایل ini. است که اطلاعات لازم را به برنامه کاربردی ارسال می کند. فرمت پایه فایل vsz. یک فایل متنی با دو قسمت و نام و جفت‌های مقادیر است. برای Wizard نمونه ما تمام چیزی که نیاز است یک فایل متنی با محتوای زیر است:

VSWIZARD 7.0
Wizard=Wizard1.Class1
Param=<Nothing>

اگر شما نیاز به ارسال پارامتری دارید آن را به فرم Param=Value همانگونه که در مثال مشخص شده است، ارسال کنید. پس از ایجاد این فایل آن را به شاخه‌ای که قبلا" ذکر شد کپی کنید. برای مثال اگر آن را به شاخه زیر کپی کنید، Wizard شما از طریق منوی File | Add New Item در دسترس خواهد بود:

C:\ProgramFiles\Microsft Visual Studio .NET\vb7\VBProjectItems\LocalProjectItems\

Register کردن اسمبلی Wizard:
برای Register کردن اسمبلی یک Wizard آدرس کامل فایل آنرا در برنامه regasm.exe وارد کنید و مطمئن شوید که از سوئیچ codebase/ استفاده کرده‌اید. مثال زیر Wizard با نام mywizard.dll را که در شاخه فعلی موجود است Register می‌کند:

C:\WINNT\Microsoft .NET\Framework\v1.0.3215\regasm.exe mywizard.dll /codebase

برای انجام عکس این عمل (Unregister) از سوئیچ unregister/ استفاده کنید:

C:\WINNT\Microsoft .NET\Framework\v1.0.3215\regasm.exe mywizard.dll /unregister

تست کردن Wizard:
Wizard ما هم اکنون قابل استفاده است. برای تست آن کافیست از منوی File | Add New Item، مورد جدید اضافه شده را انتخاب کنید.

منبع:
کتاب Visual Basic .NET Unleashed از SAMS Publication

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫بررسی معماری Applet-to-Servlet در جاوا

بررسی معماری Applet-to-Servlet در جاوا

توسط: Haghgonia
تاریخ انتشار: 22 مرداد 1383

در این مقاله پس از معرفی Appletها و Servletها، چندین معماری Applet-to-Servlet بررسی می‌شود. 		iDevCenter

در طراحی برنامه‌های مبتنی بر وب و چند لایه می‌توان از روش Applet-to-Servlet استفاده کرد. اپلت‌ها یک مکانیزم مناسب جهت تولید رابط‌های گرافیکی قدرتمند و پویا هستند و از طرف دیگر Servletها نیز یک راه حل کارآمد برای کنترل درخواست‌ها در یک سرویس دهنده وب (Web Server) یا سرویس دهنده برنامه‌های کاربردی (Application Server) هستند. در مدل‌های برنامه‌نویسی شرکت سان که بهترین راه حل‌های تولید برنامه‌های بزرگ جاوا را بر پایه پلاتفرم Java 2 ارائه می‌کند، استفاده از اپلتها، HTML و Java Server Page درسمت سرویس گیرنده و Servletها بهمراه Enterprise Java Beans) EJB) یا سایر Componentهای کمکی در سمت سرویس دهنده توصیه می‌شود.

اپلت‌ها:
اپلت‌ها برنامه‌های جاوا هستند که در داخل سرویس دهنده وب اجرا می شوند و از کلاس java.applet.Applet یا javax.swing.JApplet ارث می‌گیرند. در مقایسه با صفحات HTML، اپلتها می‌توانند رابط کاربر قدرتمندتر و پویاتری تولید نمایند. از اپلت‌ها می‌توان در برنامه‌های بزرگ برای مشاهده یا تغییر اطلاعات ارسالی از سمت سرویس دهنده استفاده کرد. برای مثال از یک اپلت می‌توان برای مشاهده یا تغییر رکوردهای بانک اطلاعاتی یا کنترل وضعیت سرویس دهنده یا برنامه‌های در حال اجرای روی آن استفاده کرد.

یک اپلت می‌تواند دارای یک کلاس منفرد یا چندین کلاس باشد. برای تسریع در انتقال کلاس‌ها به سرویس گیرنده از حالت فشرده کلاس‌ها در قالب Java Archive File) JAR) می‌توان استفاده کرد. در نتیجه کد اپلت هر زمان که در سمت سرویس دهنده تغییر کند، با اولین مراجعه مجدد کاربر به سایت بروزرسانی می‌شود.

از آنجاییکه اپلت‌ها در سمت سرویس گیرنده اجرا می‌شوند، یکسری تدابیر امنیتی برای اپلتها در نظر گرفته شده است که نواقص و ایرادهای Microsoft ActiveX را برطرف می‌کند. از جمله محدودیت‌های اپلتها این است که به منابع سرویس گیرنده دسترسی ندارند و در روی سرویس گیرنده نمی‌توانند فایلی را بخوانند یا بنویسند و یا برنامه‌ای را اجرا نمایند.

Servletها:
Java Servletها اجزاء نرم‌افزاری سمت سرویس دهنده هستند که مشابه برنامه‌های CGI کنترل درخواستهای وب، برگرداندن اطلاعات پویا برای سرویس گیرنده، دسترسی به بانک اطلاعاتی و ارتباط با سایر اجزاء نرم‌افزاری موجود روی سرویس دهنده را انجام می‌دهند. بر خلاف CGI که به ازای هر درخواست سرویس گیرنده یک کپی از برنامه در سمت سرویس دهنده بارگذاری و اجرا می شود، Servletها تنها یکبار در سرویس دهنده بارگذاری و به ازای هر درخواست سرویس گیرنده فراخوانی می‌شوند. شکل زیر تفاوت بین Srevlet و CGI را نشان می‌دهد.

معماری‌های موجود
چندین معماری برای روش Applet-to-Servlet وجود دارد که در ادامه سه مورد از آن بررسی می‌شود.

  • معماری دو لایه (Two-Tier)
    در این معماری تنها از اپلت در سمت سرویس گیرنده استفاده می‌شود و اپلتها از طریق پروتکلهایی مانند JDBC و (Remote Method Invocation) RMI به منابع سیستم -بانکهای اطلاعاتی، دایرکتوریهای Light Weight Directory Access Protocol) LDAP) و EJB Component- مستقیما" دسترسی پیدا می‌کنند. شکل زیر این معماری را نشان می‌دهد:

    اگر چه این معماری ساده به نظر می‌رسد، اما دارای مشکلات و معایبی است که عبارتند از:

    • در این روش تمام اطلاعات دسترسی به سرویس دهنده و منابع آن شامل شناسه کاربر، رمز عبور، مشخصات بانک اطلاعاتی، مشخصات سرویس دهنده و هر چیز دیگری بایستی در داخل کد اپلت تعریف شود. در نتیجه احتمال دسترسی کاربر به این اطلاعات وجود دارد. (برای مثال استفاده از یک De-Compiler)
    • بانک اطلاعاتی یا هر سیستمی که اپلت به آن نیاز دارد روی همان ماشین سرویس دهنده وب قرار می‌گیرد و در نتیجه سرویس دهنده همزمان بعنوان سرویس دهنده بانک اطلاعاتی و سرویس دهنده وب عمل می کند. در اینصورت اگر دسترسی به یکسری از اطلاعات توسط Firewall محدود شده باشد، اپلت‌ها نمی‌توانند به این منابع دسترسی پیدا کنند.
    • مکانیزم Clustering و Pooling روی سرویس دهنده بسیار مشکل و حتی ناممکن می‌باشد.

  • معماری سه لایه (Three-Tier)
    یک راه حل بهتر نسبت به معماری دو لایه، استفاده از Servlet برای کپسوله کردن ارتباط با منابع سرویس دهنده می‌باشد. در این معماری Servlet مشکلات امنیتی حاصل از محدودیت‌های اپلت را برطرف می‌کند و همچنین دسترسی اپلت‌ها را به Business Logic و Enterprise Information Systems کنترل می‌کند. در این روش اپلت درخواست را به Servlet می‌فرستد و Servlet پس از برقراری ارتباط با بانک اطلاعاتی یا هر منبع مورد نیاز دیگر و انجام محاسبات، نتیجه را برای اپلت ارسال می‌نماید.

    مزایا و معایب این معماری عبارتند از:
    • در این معماری لایه‌های سیستم می‌توانتد روی چندین سرویس دهنده توزیع شوتد و تمام لایه‌ها با یک بانک اطلاعاتی واحد ارتباط برقرار می‌کنتد.
    • استفاده از این معماری باعث قابلیت گسترش (Scalability) و ماژوله بودن سیستم می شود‌.
    • قرار گرفتن لایه منطق برنامه در Servlet که پیچیدگی برنامه را افزایش داده و قابلیت حمل (Portability) را کاهش می‌دهد.

  • معماری چند لایه (N-Tier)
    اگر از تکنولوژی Enterprise Java Beans استفاده ‌شود، Servlet بعنوان یک میانجی عمل می‌کند. استفاده از EJB باعث حذف Business Logic و انتقال آن به EJB می‌شود. در این روش اپلت با Servlet تماس می‌گیرد و Servlet اطلاعات را به EJB می‌فرستد و بالعکس. استفاده از EJB ،Servlet ،HTML و اپلت حداکثر انعطاف پذیری و کارایی را درکنار پیچیدگی و هزینه بیشتر به همراه دارد.

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫ده نکته برای افزایش سرعت بارگزاری صفحات وب

ده نکته برای افزایش سرعت بارگزاری صفحات وب

توسط: alirezagolkari
تاریخ انتشار: 20 شهریور 1383

افزایش سرعت بارگزاری صفحات یکی از روش‌های موثر برای جلب رضایت بازدیدکنندگان یک سایت است که در این مقاله با 10 نکته برای انجام این کار آشنا خواهید شد. 		iDevCenter

افزایش سرعت بارگزاری صفحات یکی از مسائل مهم در طراحی صفحات وب می‌باشد. در صورتی که زمان بارگزاری یک صفحه وب طولانی باشد، معمولا" کاربران از مشاهده آن صفحه صرف نظر می‌کنند و دیگر به آن باز نمی‌گردند این به معنی از دست دادن کاربران سایت می‌باشد که برای مدیران یک سایت اصلا" خوشایند نیست. در ادامه ده روش موثر برای افزایش سرعت بارگزاری صفحات وب بیان می‌شود.

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 بالا را بصورت زیر تغییر دهید.

<img 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" >link</a>

از کد زیر استفاده کنید:

<a href="http://www.URL.com/directoryname/">link</a>

زیرا اگر از / در انتهای آدرس استفاده نکنید سرور متوجه نخواهد شد که اشاره به فایل شده یا فهرست. اما با اضافه کردن / سرور فورا" متوجه می‌شود که به یک فهرست اشاره شده و آنرا نمایش می‌دهد.

منابع

  • Ten ways to speed up the download time of your web pages

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫ساخت یک برنامه نصب توسط InstallShield

ساخت یک برنامه نصب توسط InstallShield

توسط: SoheilPro
تاریخ انتشار: 8 آذر 1381

هر برنامه‌ای به هر زبانی که نوشته شده باشد به یک برنامه نصب احتیاج دارد تا روی کامپیوترهای دیگر اجرا شود. در این مقاله نحوه ساخت یک برنامه نصب توسط InstallShield را یاد خواهید گرفت. 		iDevCenter

برنامه InstallShield یکی از قویترین نرم‌افزارهای ساخت برنامه‌های نصب برای ویندوز است. این برنامه بهمراه WISE تنها نرم‌افزارهای مورد تایید مایکروسافت برای ساخت برنامه‌های نصب تحت سیستم عامل‌های این شرکت میباشند. InstallShield تاکنون در نگارش‌های مختلفی عرضه شده است و ما در اینجا از نسخه InstallShield Developer 7.0 استفاده خواهیم کرد.

جهت شروع از Project Wizard که ساده‌ترین راه برای ساخت یک برنامه نصب است استفاده میکنم. برای اینکار InstallShield را اجرا کرده و از منوی File گزینه Project Wizard را انتخاب کنید. حال مرحله به مرحله صفحات این Wizard را مورد بررسی قرار میدهیم:

Welcome to the Project Wizard
این صفحه توضیحاتی درباره Project Wizard میدهد و امکانات آنرا معرفی میکند.

Wizard Project
در این صفحه گزینه Create a New Project را انتخاب کنید و نامی برای پروژه خود انتخاب کنید.

Project Type
حال باید مشخص کنید که قصد ساخت چه نوع پروژه‌ای را دارید. در این نسخه امکان ساخت دو نوع پروژه Standard و Basic MSI وجود دارد. در نوع Basic MSI برنامه نصب شما تماما" توسط Microsoft Windows Installer اجرا و کنترل میشود اما در نوع Standard شما از InstallScript نیز میتوانید برای کنترل برنامه نصب خود استفاده کنید. اما در هر صورت برنامه‌های نصب شما به Windows Installer احتیاج خواهند داشت.

Application Information
در این مرحله باید اطلاعاتی را درباره نرم‌افزاری که قصد ساخت برنامه نصب برای آن دارید را مشخص کنید. در قسمت‌های Application Name و Application Version نام و شماره نگارش نرم‌افزار خود را وارد کنید و توجه داشته باشید که شماره نگارش حتما" به صورت AA.BB.CCCC نوشته شود. در قسمت Default Destination Folder نیز مسیر پیش فرضی را که مایل به نصب برنامه خود در آنجا هستید را مشخص کنید. این مسیر با توجه به توصیه‌های مایکروسافت باید به صورت [ProgramFilesFolder]Company Name\Product Name باشد.

عباراتی که داخل کروشه نوشته میشوند مشخص کننده یک متغیر Windows Installer هستند. در این مورد استفاده از [ProgramFilesFolder] باعث میشود که هنگام اجرای برنامه نصب بجای این عبارت از مسیر دایرکتوری Program Files کاربر استفاده شود.

Company Information
در این مرحله نیز اطلاعات شرکت خود شامل نام، شماره تلفن پشتیبانی و آدرس سایت وب را وارد کنید.

Setup Languages
زبان‌هایی که مایل به پشیبانی از آنها در برنامه نصب خود هستید را از لیست انتخاب کنید.

Application Features
این مرحله یکی از مهمترین مراحل ساخت یک برنامه نصب است. در این مرحله میتوانید برنامه خود را به چند زیرمجموعه (Feature) تقسیم کنید بطوریکه کاربر بتواند به دلخواه مشخص کند که کدام Featureها نصب شوند. برای مثال میتوان یک برنامه را به زیرمجموعه‌های فایل‌های اصلی (Program Files)، فایل‌های راهنما (Help Files)، و فایل‌های نمونه (Sample Files) تقسیم کرد تا کاربر تنها مواردی را که احتیاج دارد نصب کند. هر زیرمجموعه نیز میتواند خود شامل چندین زیرمجموعه دیگر باشد.

Application Files
حال میرسیم به مهمترین مرحله که مشخص کردن فایل‌هایی است که باید نصب شوند. برای اینکار ابتدا از لیست بالای صفحه یک زیرمجموعه (Feature) را انتخاب کنید سپس با استفاده از دکمه Add Files فایل‌هایی را که به این زیرمجموعه مربوط میشوند اضافه کنید.

هنگام اضافه کردن فایل‌ها پنجره‌ای با عنوان Path Variable Recommendation ظاهر میشود که درباره نحوه رفتار با مسیر فایل سوال میکند. قبل از توضیح این قسمت لازم است با مفهوم Path Variable آشنا شویم. یک Path Variable متغیری است که به یک مسیر اشاره میکند. در نتیجه اگر برای مسیر C:\My Projects\My Program یک Path Variable با نام MyPath تعریف کرده باشید برای مشخص کردن فایلی که در این دایرکتوری با نام MyFile.exe وجود دارد میتوان از <MyPath>\MyFile.exe استفاده کرد. از جمله مزایای این روش سرعت و سهولت بیشتر هنگام کار با فایل‌ها است. همچنین اگر شما مجبور به تغییر دادن دایرکتوری محل قرارگیری فایل‌های خود شدید به جای تغییر دادن مسیر ده‌ها فایل تنها کافیست مقدار Path Variable را تغییر دهید.

در این پنجره سه گزینه وجود دارد که گزینه اول امکان استفاده از یک Path Variable موجود را میدهد؛ گزینه دوم بر اساس مسیر فایل انتخاب شده یک Path Variable میسازد و از آن استفاده میکند و گزینه سوم نیز از مسیر کامل فایل به طور مستقیم استفاده میکند.

Create Shortcuts
در این مرحله میتوانید میانبرهایی را برای برنامه‌تان در سیستم کاربر ایجاد کنید. برای این کار ابتدا محلی که مایل هستید میانبر در آنجا ساخته شود را انتخاب کنید و سپس بوسیله دکمه سمت راست موس روی آن کلیک کرده و از منوی باز شده New Shortcut را انتخاب کنید و نامی برای آن مشخص کنید. در قسمت Features زیرمجموعه‌ای که میانبر به آن مربوط میشود را انتخاب کنید و در قسمت‌های Icon و Icon Index به ترتیب فایل حاوی آیکون و در صورتی که این فایل شامل چندین آیکون است شماره آنرا وارد کنید. در قسمت Target نیز باید نام فایلی که این میانبر آنرا اجرا خواهد کرد مشخص کنید. برای این مورد به یکی دیگر از متغیرهای Windows Installer نیاز داریم که نام آن [INSTALLDIR] است. محتوی این متغیر همان محلی است که کاربر هنگام نصب برنامه مشخص کرده است. بنابر این برای مشخص کردن فایل MyFile.exe کافیست [INSTALLDIR]\MyFile.exe را وارد کنید.

Registry Data
اگر برنامه شما نیاز به تنظیمات خاصی در رجیستری ویندوز دارد میتوانید در این مرحله یک فایل reg. را برای زیرمجموعه مربوط به آن مشخص کنید تا هنگام نصب به رجیستری اضافه شود.

Dialogs
در آخرین مرحله نیز کافیست پنجره‌هایی را که مایل هستید در طول فرایند نصب نشان داده شوند مشخص کنید.

Wizard Summary
اکنون میتوانید مروری بر تمام مواردی که مشخص کرده‌اید داشته باشید و اگر مشکلی وجود داشت با استفاده از دکمه Back به عقب باز گردید و آن را تصحیح کنید. اگر مایل هستید که بعد ساخته شدن پروژه، نسخه اجرایی آن هم ساخته شود مورد Build a Release را نیز انتخاب کنید.

به شما تبریک میگویم! شما موفق شدید اولین برنامه نصب خود را بسازید. تنها کار باقیمانده فشار دادن کلیدهای Ctrl+F5 و مشاهده نتیجه است.

سایت‌های مرتبط

  • سایت InstallShield
  • راهنمای مایکروسافت درباره Windows Installer

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫آشنائی با فرم‌های وب در ASP.NET

آشنائی با فرم‌های وب در ASP.NET

توسط: asadi
تاریخ انتشار: 28 آذر 1381

اگر مایل هستید از پایه با ASP.NET آشنا شوید و به طور عملی ساخت یک برنامه وب را تجربه کنید، این خودآموز بهترین راهنمای شما است. 		iDevCenter

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

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫استفاده از Microsoft Agent در برنامه های خودتان

استفاده از Microsoft Agent در برنامه های خودتان

توسط: DelphiMan
تاریخ انتشار: 14 دی 1381

Microsoft Agent یکی از سرگرم کننده ترین فن آوریهای Microsoft می باشد که تا کنون توانسته بسیار مورد علاقه کاربران قرار بگیرد. Agentها به برنامه های شما جذابیت زیادی می دهند و امکان ارتباط بهتر و جالبتری را با کاربر ایجاد میکنند. 		iDevCenter

اولین باری که از این تکنولوژی استفاده شد در برنامه Office 97 بود که خیلی مورد علاقه کاربران قرار گرفت. من اون موقع خیلی گشتم تا بتونم از این امکان استفاده کنم ولی خوب نتونستم ): اما بعدها با پیشرفت کردن علم برنامه نویسی این تکنولوژی در اختیار دیگران هم قرار گرفت. برای همین در اوایل فقط در Office بود که از این امکان استفاده می شد.

حالا اینا رو گفتم اما ببینیم اصلاً Agent چی هست؟
شما اگه از Office استفاده میکنید حالا هر کدوم از برنامه هاش که باشه (Word ،Excel ،FrontPage...) یک شکلکی رو میبینید که همیشه نسبت به کارهایی که انجام میدین یک سری حرکات از خودش نشون میده که هم سرگرم کننده هست هم آموزنده. حالا حتماً متوجه شدین که در مورد چی صحبت میکنیم (هر چند که میدونم میدونستید (; ) خوب حالا می خواهیم ببینیم که چطور میشه از این امکان تو برنامه های خودمون استفاده کنیم مثلاً وقتی برنامه داره کار میکنه یه شکلکی بیاد برای کاربر ادا در بیاره تا طرف نفهمه که برنامه چیکار میکنه (: یا مثلا موقع ذخیره کردن و بازیابی کردن و یا جستجو و... یک سری حرکات مربوط به آن عمل انجام بده.

اینکار خیلی ساده است و فقط کافی هست شما یک Agent رو انتخاب کنید و در برنامتون تعریفش کنید و بعد هر کاری که خواستین رو بهش دستور بدین تا براتون انجام بده. ضمنا شما لازم نیست اصلاً غصه درست کار کردن اون رو بخورین چون خود Windows اونو کنترل میکنه که یه وقت کار بدی نکنه ((:

شما نمیتونید که Agent رو داخل یک جعبه مکالمه (Dialog Box) قرار بدین و فقط میتونید جای اولیه اون رو انتخاب کنید بعد نمایش بدین و کاربر میتونه اونو به دلخواه خود تغییر مکان بده با Drag کردن اینکار رو انجام میده. خوب حالا برای شروع کار به یک سری Agent نیاز داریم که البته همراه ویندوز همیشه یک سری همراه هستند بهترین اونها که میتونه کارهای زیادی انجام بده (منظور حالتهای زیادی براش تعریف شده) Merlin هست که یک جادوگر پیر می باشد. برای Download کردن اینها میتونید به سایتهایی که معرفی میکنم یک سری بزنید. ضمناً شما خودتون هم میتونید یک Agent طراحی بکنید که برای اینکار باید از یک سری نرم‌افزار استفاده کنید.

برای اینکه کاربر بتونه از Agent برنامه شما استفاده کنه باید حتماً Microsoft Agent Server‌ رو نصب کنه. که البته من تا حالا تو هر ویندوزی که برنامم رو اجرا کردم نصب شده بوده فکر کنم این برنامه همراه خود ویندوز هست (; ولی اگه نبود شما میتونید یک سری به آدرس زیر بزنید اونجا چیزهای جالبی در این مورد داره که یکم مطالعه کنید بد نیست:
http://www.microsoft.com/msagent

این مطالب تحت عنوان Microsoft Agent Software Development Kit هست که در اونجا شما همچنین میتونید نرم افزار Microsoft Agent Character Editor رو برای درست کردن Agent دریافت کنید. در این مقاله ما در مورد Voice Command‌ (فرمان‌های صوتی) و طراحی Agent صحبت نمیکنیم و فقط طرز استفاده از این امکان رو شرح میدم که خودتون بعداً میتونید در موردش بیشتر جستجو کنید. ما برای کارمون فقط احتیاج به Agent Server و یک کاراکتر داریم.

خوب حالا میریم سر اصل مطلب. بعد از اینکه مطمئن شدین روی ویندوزتون AgentServer رو دارین دلفی رو اجرا کنید و مراحل زیر رو مو به مو انجام بدین:
  • Component | Import ActiveX Control رو انتخاب کنید.
  • Microsoft Agent Control رو از تو لیست پیدا کنید و رو ی دکمه Install کلیک کنید.
  • خوب حالا باید تو قسمت ActiveX یک آیکونی شبیه به MenInBlack داشته باشید.
خوب تا یادم نرفته اینو بگم که برای پیدا کردن یک کاراکتر روی ویندوزتون باید برای acs.* جستجو کنید که البته به طور عادی اگر Agent Server نصب باشه توی شاخه Windows یک msagent باید وجود داشته باشه و داخل اون هم یک شاخه دیگه به نام Char هم هست که توش یک یا چند کاراکتر وجود داره که اگر از XP استفاده میکنید حتماً یکیش Merlin.acs هست (که من خیلی بهش علاقه دارم (: ) برای همین ما باید تو برنامه مون چک کنیم که آیا این شاخه وجود داره یا نه اگه وجود داشت میدونیم که Agent Server روی ویندوز کاربر نصب هست و ما می تونیم از Agent استفاده کنیم.

خوب برای اینکار باید اول ActiveX رو به روی فرم منتقل کنیم با اینکار یک type با نام TAgent به تعاریف فرم اضافه میشه. بعد باید یک متغییر تعریف کنیم که از نوع Boolean باشه تا با اون چک کنیم که آیا Agent Server نصب هست یا نه برای اینکار میشه از Code زیر استفاده کرد:

TYourObject
   private
     AgentInstalled: Boolean;
     function AgentIsInstalled: Boolean;
     procedure CreateAndLoadAgentIfInstalled;
     function GetColorDepth: Word;
     function GetWinDir: String;
     procedure SetFormColor;
     function AgentWasClicked

شما میتونید روی ویندوز کاربر به دنبال اون شاخه و کاراکتری که می خواهید از او استفاده کنید بگردید و اگه بود کار رو باهاش شروع کنید اگه هم نبود خوب دیگه کاربر باید محیط خشک برنامتون رو تحمل کنه (;

حالا مثلاً ما می خواهیم از Merlin استفاده کنیم:

function TYourObject.AgentIsInstalled: Boolean;
begin
   Result := (FileSearch('Merlin.acs', Format('%s\MSAGENT\CHARS', [GetWinDir]))<>'');
end;

function TYourObject.GetWinDir : string;
var
   WinDirZ : array[0..256] of Char;

begin
   GetWindowsDirectory(WinDirZ, SizeOf(WinDirZ));
   Result := StrPas(WinDirZ);
end;

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

حال که فهمیدیم کاربر امکان استفاده از Agent رو داره می تونیم کار رو شروع کنیم. در ادامه باید یک Object برای Agent خودمون بسازیم تا از این به بعد از اون استفاده کنیم و مجبور نباشیم از ActiveX استفاده کنیم. برای اینکار از کد زیر میشه استفاده کرد:

implementation

uses
   AgentDemoConsts,
   Registry,
   OLECtrls, AgentObjects_TLB;

procedure
   TYourObject.CreateAndLoadAgentIfInstalled;
const
   RightBias = 80;
   TopBias   = 70;
var
   tp: TPoint;

begin
   if (AgentInstalled) and not (Assigned(RobotAgent)) then begin
      RobotAgent := TAgent.Create(Application);
      RobotAgent.Characters.Load('Merlin','Merlin.acs');

      { Move the Agent to the center of the screen }
      tp.x := (Screen.Width div 2)-(Width div 2);
      tp.y := (Screen.Height div 2)-(Height div 2);

      with RobotAgent.Characters.Item['Merlin'] do begin
         MoveTo(tp.x+RightBias, tp.y+TopBias, 0);
         Show(0);
         Play('Greet');
         Play('Explain');
         Speak(SDemoIntro, '');
         Play('Pleased');
         Play('RestPose');
         Speak(SWhisper, '');
         Speak(SMonotone, '');
         Speak(SMap, '');
      end;
   end;
end;

چند خط اول که مشخص هست چه کار میکنه. اما بعد از اینکه کاراکتر تعریف شد (RobotAgent) اونو به Merlin نسبت میدیم وبعد هم اونو به وسط صفحه نمایش منتقل میکنیم و حالا میرسیم به مهمترین قسمت کار که دستور دهی به Merlin هست.

با استفاده از Play شما میتونید به Agent دستور بدین اما برای هر Agnet دستورات متفاوت هست یعنی ممکن هست که دستوارتی که برای Merlin کار میکنه برای Robby (که یکی دیگر از Agent ها هست) کار نکنه. شما اگه کاراکترتون رو خودتون درست میکنید خوب پس لیست دستوراتش رو دارید اما اگه اونو از جایی Download میکنید حتما لیست دستوراتش هم همراش هست. مثلا شما میتونید در مورد Merlin و یا Robby و یا چند Agent دیگه از تو همون آدرسی که در بالا دادم لیست دستوارتش رو بگیرید.

حالا در کد بالا میبینید که در ابتدا از دستور Show استفاده شده این دستور برای به نمایش در آوردن Agent هست و در تمامی آنها کار میکنه. بعد با استفاده از Play کارهای مورد نظرمون رو به Agent‌ میگیم. مثلاً من در ابتدا با استفاده از دستور Greet از Agent خواستم که سلام کنه و بعد هم با استفاده از Explain خواستم که شروع کنه به گفتن یک سری مطالب که با دستور Speak اونها رو که در متغییر SDemoIntro قرار داده ام به صورت یک بالون که بالای سرش باز میشه میگه. شما برای اینکه بگین مطالب رو با چه حالتهایی بخونه می تونید از دستواراتی که در جدول زیر آوردم استفاده کنید:

Addition | Resulting capability
\Chr="Whisper"\ | The Agent will whisper the following text.
\Pau=N\ | The Agent will pause for the designated number of milliseconds.
\Emp\ | The Agent will give special emphasis to the following phrase.
\Chr="Montone"\ | The Agent will emphasize nothing at all.
\Map=<spoken text> | The Agent will say one thing, and =<spoken text> "think" another.

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

SFuzzyWuzzy = 'Fuzzy wuzzy was a bear;\Pau=500\ ' +
   'fuzzy wuzzy had no hair;\Pau=500\  ' +
   'fuzzy wuzzy wasn't very \Emp\fuzzy, \Emp\was he?';

SWhisper = '\Chr="Whisper"\Now I will whisper: ' +
   'Whisper whisper whisper.';

SMonotone = '\Chr="Monotone"\Now I will speak in a ' +
   'monotone. Pat Paulsen for President.';

SMap = '\Map="I will now continue to speak in ' +
   'English, but you will see my words ' +
   'translated into German in the balloon above ' +
   'my head. How are you today? I am just ' +
   '\Emp\dandy!"="Jetzt werde ich zwar immer ' +
   'noch in Englisch reden, sie werden  ' +
   'aber meine Woerte im Balloon obenauf ins ' +
   'Deutsch uebersetzt sehen. Wie geht es  ' +
   'Ihnen heute? Mir geht es ganz gut!"\';

خوب دیگه همین بود تمام ماجرا حالا شما اگه می خواهین بیشتر در این مورد کار کنید من در مقالات بعدی یکی سری سایت و مطلب دیگه هم براتون میزارم البته به زبون اصلی خودشون حتماً خیلی مفید خواهد بود. ضمنا شما میتونید از Event ها هم در Agent استفاده کنید و مثلا برای رویداد OnClick روی Agent‌ یک چیزی تعریف کنید.

خوب در آخر از شما که تا اینجا آمدید متشکرم و یک سری نکات رو هم باید ذکر کنم:
  • این مطالب حاصل تجربه خودم و همچنین برگرفته از یک سری مقالاتی بوده که در این مورد مطالعه کردم.
  • در مورد استفاده از این کدهایی که در این مقاله آورده ام و همچنین در پایان این مقاله ضمیمه کرده ام هیچ گونه مسئولیتی بعهده من نخواهد بود که درست کار کنه یا بزنه کامپیوتر شما رو بسوزونه!!!!
  • استفاده از این مقاله به شرط ذکر نام و آدرس اصلی مقاله در سایتها و جاهای دیگر آزاد است.
  • اگه در این مورد نظری دارین یا حتماً برای من ایمیل کنید خوشحال خواهم شد بشنوم.

سایت‌های مرتبط

  • سایت رسمی Microsoft Agent

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫برنامه نویسی Direct3D در ویژوال بیسیک (1)

برنامه نویسی Direct3D در ویژوال بیسیک

توسط: sheidaian
تاریخ انتشار: 20 دی 1381

راهنمای استفاده از کتابخانه Direct3D در ویژوال بیسیک برای ساخت برنامه های مالتی مدیا و بازیهای سه بعدی. 		iDevCenter

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. Fullscreen 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 = D3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, frmMain.hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, D3DWindow)
End Sub

درصورتی که کارت گرافیک شما امکانات رندر سخت‌افزاری تصاویر را ندارد از D3DDEVTYPE_REF بجای D3DDEVTYPE_HAL استفاده کنید. حال بایستی روتین Render را بنویسیم. البته در این درس تصویری برای رندر نداریم و تنها چگونگی نوشتن این روتین را بیان خواهم کرد:

ابتدا بایستی Device مربوط به رندر، قبل از کشیدن تصویر در آن پاک شود:

D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET, &H0, 1#, 0

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

D3DDevice.BeginScene
'All rendering calls go between these two lines
D3DDEvice.EndScene

در پایان بایستی صفحه را Update کنید:

D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal 0

در درس بعد مشخصات و تواناییهای گرافیکی یک سیستم را توسط DirectX بدست خواهیم آورد.

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫برنامه نویسی شیئ گرا در VB.NET (1)

برنامه نویسی شیئ گرا در VB.NET

توسط: kamyar_rasta
تاریخ انتشار: 20 خرداد 1384

این مقاله به شما کمک می‌کند تا با مفاهیم پایه‌ای برنامه نویسی شیئ گرا مانند کلاسها، اشیاء، اینترفیس‌ها، چند ریختی و وراثت و همچنین چگونگی استفاده از آشنا شوید. 		iDevCenter

مقدمه‌ای بر برنامه نویسی شیءگرا

برنامه نویسی در محیط .NET بر پایه اشیاء انجام می‌گیرد. اشیا طرحهایی برنامه‌پذیرند که می‌توانند نمونهایی از بسته‌های از دادهای مرتبط و دستورات باشند. اشیاء طرحهای کامل و خاصی برای دیگر اعضای محیط برنامه هستند، بدون این که جزییات کارهای درونی خود شیئ مطرح شود. اشیاء از یک قالب به نام کلاس ساخته می‌شوند. کلاسهای کتابخانه‌ای پایه‌ای .NET یک سری کلاسهایی برای درست کردن اشیاء در برنامه‌هایتان آماده کرده‌اند. همچنین شما می‌توانید کلاسهای اختصاصی خودتان را نیز ساخته و استفاده کنید. در این مقاله شما با مقدمات برنامه نویسی شیئ گرا آشنا می‌شوید.

اشیاء، اعضا و تجرد (Abstraction)

یک شیئ (Object) یک طرح برنامه‌پذیر است که چیزهایی را نشان می‌دهد. در دنیای واقعی، ماشین، دوچرخه، کامپیوتر و... شیئ هستند. هر کدام از این اشیاء یک سری اعمال و خصوصیات دارند. در برنامه شما، یک شیئ شاید یک فرم یا یک کنترل مانند یک دکمه (Button) یا یک Database Connection یا هر چیز دیگری باشد. هر شیئ یک واحد عملیاتی کامل است، و شامل همه دادهای مورد نیازش و دارای همه اعمالی که برای آن ساخته شده است می‌باشد.

کلاس‌ها (Classes)

کلاسها قالب‌هایی برای اشیاء هستند. کلاسها را می‌توان، "طرحهای اولیه" برای اشیاء فرض کرد. آنها تمام عضوهای یک شیئ را تعیین، و رفتارهای آن را نیز تعریف می‌کنند. وقتی که یک کلاس مقداردهی شد، یک نمونه درون حافظه‌ای از آن کلاس ساخته می‌شود. این نمونه شیئ نامیده می‌شود. برای نمونه سازی از کلاس از کلمه کلیدی New استفاده می‌شود.

' Declares a variable of the Widget type
Dim myWidget As Widget

' Instantiates a new Widget object and assigns it to the myWidget variable
myWidget = New Widget()

وقتی یک نمونه از یک کلاس ساخته می‌شود، یک کپی از نمونه داده بوسیله آن کلاسی که در حافظه ساخته شده تعریف می‌شود و به مرجع متغییر داده می‌شود. هر نمونه از کلاس مستقل از دیگر نمونه هاست و می‌تواند یک طرح جداگانه برنامه پذیر باشد. درهر لحظه، محدودیتی برای تعداد کپی های یک کلاس (که قبلا تعریف شده) وجود ندارد. برای مقایسه، در جهان واقعی، اگر ماشین یک شیئ باشد، کلاس یک طرح برای ماشین است. یک طرح می‌تواند برای هر تعداد ماشین مورد استفاده قرار گیرد و تغییرات بر روی یک ماشین، تاثیری بر دیگر ماشین‌ها نمی‌گذارد.

اشیاء و اعضاء (Members)

اشیاء ترکیبی از عضوها هستند. اعضا، تشکیل شده از خصوصیات (Properties)، فیلدها، متدها و رویدادها (Events) و هر چیزی که اطلاعات و اعمالی داشته باشد. فیلدها و خصوصیات، اعضای داده‌ای هر شیئ هستند. متدها اعمالی هستند که شیئ می‌تواند انجام دهد و رویدادها اطلاعاتی هستند که زمانیکه اتفاقی در برنامه می‌افتد یک شیئ به اشیاء دیگر می‌فرستد یا از آنها دریافت می‌کند.

در مثال واقعی‌مان، شیئ ماشین، فیلدها و خصوصیاتی مانند "رنگ"، "مدل"، "سال تولید" دارد. این اطلاعات وضعیت شیئ ماشین را توصیف می‌کنند. شیئ ماشین می‌تواند متدهایی مانند "دور زدن" و "تعویض دنده" داشته باشد. متدها رفتاری که شیئ می‌تواند اجرا کند را نشان می‌دهند. ماشین شاید رویداد EngineOverheating از طرف شیئ "موتورش" را داشته باشد، یا وقتی با شیئ "درخت" تعامل می‌کند، شاید رویداد "تصادف" برای آن اتفاق بیفتد.

کپسوله سازی (Encapsulation)

کپسوله سازی روشی است که یک شیئ را مستقل از اینترفیسش پیاده سازی کنیم. یک برنامه با یک شیئ بواسطه اینترفیسش تعامل می‌کند، که شامل خصوصیات عمومی و متدهایش است. تا زمانی که این اینترفیس ثابت باقی می‌ماند، برنامه می‌تواند به تعامل با کامپوننت ادامه دهد؛ حتی اگر پیاده سازی اینترفیس بین دو نسخه کاملا" بازنویسی شده باشد.

اشیاء فقط از طریق متدها و خصوصیات عمومیشان با دیگر شیئ‌ها تعامل می‌کنند. داده‌های داخلی یک شیئ، نباید در اینترفیس قرار بگیرد. بنابراین فیلدها به‌ندرت Public تعریف می‌شوند.

به مثال ماشینمان برگردیم: اگر شیئ ماشین با شیئ راننده تعامل کند، اینترفیس ماشین شاید شامل متدهای "حرکت به جلو"، "حرکت به عقب" و "توقف" باشد. این همه اطلاعاتی است که راننده برای تعامل با ماشین نیاز دارد. ماشین شاید شامل شیئ "موتور" نیز باشد، اما راننده نیازی به شناخت شیئ موتور ندارد. همه اطلاعاتی که راننده درباره این متدها دارد این است که می‌توانند فراخوانی شوند و مقادیر ویژه‌ای نیز را برمی‌گردانند. بنابراین اگر شیئ موتور تغییری کند، تا زمانیکه اینترفیس به درستی به کار خود ادامه می‌دهد این امر تفاوتی برای راننده ایجاد نمی کند.

چند شکلی (Polymorphism)

چند شکلی توانایی کلاسهای متفاوت، در پیاده سازی‌های مختلف از اینترفیس‌های عمومی مشابه است. به عبارت دیگر، چندشکلی به متدها و خصوصیات یک شیئ اجازه می‌دهد، بدون توجه به چگونگی پیاده سازی اعضای آنها، فراخوانی شوند. برای مثال شیئ Driver می‌تواند بوسیله اینترفیس عمومی ICar با شیئ Car تعامل کند. اگر شیئ دیگری مانند شیئ Truck یا شیئ SportCar اینترفیس عمومی مشابهی را داشته باشند، شیئ Driver می‌تواند با آنها بدون توجه به پیاده سازی خاص آن اینترفیس تعامل کند. در اینجا دو راه اصلی برای تامین چندشکلی وجود دارد:

  • چندشکلی اینترفیسی (Interface Polymorphism)
  • چندشکلی وراثتی (Inheritance Polymorphism)

چندشکلی اینترفیسی (Interface Polymorphism)

اینترفیس یک قرارداد برای رفتار است. در واقع اینترفیس، اعضای یک کلاس را تعیین می‌کند، اما توضیحاتی درباره پیاده سازی جزییات آن نمی‌دهد. یک شیئ می‌تواند اینترفیس‌های زیاد و متفاوتی را پیاده سازی کند و کلاسهای متفاوت زیادی می‌توانند یک اینترفیس مشابه را پیاده سازی کنند. همه اشیایی که اینترفیس مشابهی را پیاده سازی می‌کنند می‌توانند با دیگر اشیاء درون اینترفیس تعامل کنند. به عنوان مثال شیئ Car مثال قبل شاید اینترفیس IDrivable را پیاده سازی کند (به عنوان قرار داد، اینترفیس‌ها با I شروع می‌شوند)، که متدهای GoForward, GoBackward و Stop را تعیین می‌کند. کلاس‌های دیگر مانند Truck ،Forklift یا Boat می‌توانند این اینترفیس را پیاده سازی کنند و بنابراین می‌توانند با شیئ Driver تعامل داشته باشند. شیئ Driver از پیاده سازی انیترفیسی که با آن تعامل دارد بی اطلاع است.

چندشکلی وراثتی (Inheritance Polymorphism)

وراثت به شما امکان می‌دهد که اعمال یک کلاس از پیش تعریف شده را در یک کلاس جدید با هم ترکیب کنید و اعضای متفاوت مورد نیاز را در آن پیاده سازی کنید. کلاسی که از کلاس دیگری ارث می برد "مشتق" آن کلاس، یا "وارث" آن کلاس نامیده می‌شود. یک کلاس می‌تواند مستقیما" فقط از یک کلاس ارث ببرد، که آن کلاس که از آن ارث می برد را کلاس پایه (Base Class) می‌نامند. کلاس جدید اعضای مشابهی با کلاس پایه دارد، و اعضای اضافی که مورد نیاز باشند می‌توانند افزوده شوند. به علاوه، در کلاس جدید بوسیله overriding پیاده سازی کلاس پایه، اعضای پایه می‌توانند تغییر کنند. کلاسهای وارث، همه ویژگی‌های کلاس پایه را نگه می‌دارند و می‌توانند با دیگر اشیاءیی که نمونه‌هایی از کلاس پایه هستند تعامل کنند. به عنوان مثال، اگر کلاس Car یک کلاس پایه باشد، SportsCar می‌تواند یک کلاس مشتق شده از آن باشد. کلاس SportsCar نیز می‌تواند کلاس پایه‌ای برای کلاس مشتق شده دیگری مثل کلاس ConvertibleSportsCar باشد. هر کلاس مشتق شده جدید، ممکن است اعضای جدید را پیاده سازی کند، اما اعمالی که در کلاس اولیه Car تعریف شده‌است همچنان باقی می‌مانند.

Overloading اعضاء

Overloading به شما امکان می‌دهد که چندین عضو با نام مشابه درست کنید. هر عضوی که همنام با عضو دیگری است، باید امضای متفاوتی داشته باشد. Overloading بیشتر در بین متدها متداول است.

شاید شما بخواهید متدی درست کنید که بتواند مجموعه‌های متفاوتی از پارامترها را بپذیرد:

Public Sub Display(ByVal DisplayValue As Integer)
' Implementation Omitted
End Sub

این متد کاملا" پذیرفتنی است. اما فرض کنیم که می‌خواهید به کلاینت اجازه دهید اگر نیاز بود پارامتر Duration را انتخاب کند. یا اینکه شاید بخواهید متد بتواند مقادیر Integer یا String را به عنوان پارامتر DisplayValue بپذیرد. گرچه در VB.NET اجازه دارید پارامترهای اختیاری داشته باشید اما بهترین راه Overloading است. Overloadها متدهای چندگانه هستند. متدهای Overload شده باید امضای متفاوتی داشته باشند. اما نیاز ندارند مقدار بازگشتی و نوع و یا سطح دسترسی مشابهی داشته باشد. وقتی یک متد Overload شده صدا زده می‌شود، CLR نوع آرگومانهای تحویل داده شده در فراخوانی متد را بررسی می‌کند. سپس لیست آرگومان‌ها را با فراخوانی‌ها و امضاهای Overloadهای موجود تطابق می‌دهد. اگر هیچ Overloadای با نوع آرگومان‌ها تناسب نداشته باشد، یک خطا اعلام می‌شود.

ساختن متدهای Overload

شما می‌توانید یک متد Overload شده را از راهی شبیه آنچه دیگر متدها را می‌سازید، درست کنید: بوسیله توصیف متد با یک نام، یک سطح دسترسی، یک نوع بازگشتی، و یک لیست آرگومان. یک متد Overload شده باید نامی ‌شبیه متدی موجود اما با امضایی متفاوتی با آن داشته باشد. سطح دسترسی و نوع بازگشتی می‌تواند مشابه و یا متفاوت باشد. مثال زیر یک متد Overload شده را نشان می‌دهد.

' This example demonstrates an overloaded method.
Public Sub DisplayMessage(ByVal i As Integer)
MessageBox.Show(i.ToString())
End Sub

' This method has the same name as the previous method, but is
' distinguishable by signature
Public Sub DisplayMessage(ByVal s As String)
MessageBox.Show(s)
End Sub

وقتی یک متد با نام DisplayMessage فراخوانی می‌شود، CLR نوع آرگومان‌های تحویل داده شده را مشخص می‌کند. اگر یک String باشد، متدی که String می‌گیرد، صدا زده می‌شود و اگر یک Integer باشد، متدی که Integer می‌گیرد فراخوانی می‌شود.

اینترفیس‌ها

اینترفیس یک قرارداد است. هر شیئ که پیاده سازی می‌شود، برای تامین پیاده سازی اعضای تعیین شده در آن اینترفیس یک ضمانت نامه اینترفیس می‌گیرد. اگر یک شیئ نیاز به تعامل با اینترفیسی داشته باشد، می‌تواند با هر شیئ که آن اینترفیس را پیاده سازی می‌کند تعامل داشته باشد. یک اینترفیس فقط اعضایی را تعریف می‌کند که بوسیله شیئ که بعدا پیاده سازی خواهد شد ساخته می‌شود. تعریف اینترفیس هیچ اطلاعاتی درباره پیاده سازی اعضاء جز پارامترهایی که می‌گیرند و نوع مقادیری که آنها برخواهند گرداند، نمی‌دهد و پیاده سازی اینترفیس‌ها کاملا به پیاده سازی کلاس واگذار می‌شود.

بنابراین این امکان دارد که در اشیاء مختلف پیاده سازی‌های مختلفی از اعضای مشابه داشته باشیم. به عنوان مثال، اینترفیسی به نام IShape که یک متد CalculateArea تعریف می‌کند. کلاس Circle این اینترفیس را برای محاسبه مساحت خود، به طریق متفاوتی با کلاس Square پیاده سازی می‌کند. هر چند که یک شیئ که نیاز به تعامل با IShapeدارد می‌تواند متد CalculateArea را فراخوانی کند و هر دوی Circle یا Square نتایج درستی می‌دهند.

تعریف اینترفیس‌ها

اینترفیس‌ها با کلمه کلیدی Interface تعریف می‌شوند.

Public Interface IDrivable
End Interface

این اعلان اینترفیس IDrivable را تعریف می‌کند اما هیچ عضوی برای آن تعریف نمی‌کند. متدهای یک عضو باید با امضای متد تعریف شود، اما بدون بدون تعریف سطح دسترسی مثل Public و Private. سطح دسترسی یک اینترفیسس سطح دسترسی اعضای آن اینترفیس را نیز تعیین می‌کند. پس اگر یک اینترفیس Public داشته باشید، همه اعضایش هم باید Public باشند. مثال زیر نشان می‌دهد که چطور متدها را به اینترفیس اضافه کنید:

Public Interface IDrivable
Sub GoForward(ByVal Speed As Integer)
Sub Halt()
Function DistanceTraveled() As Integer
End Interface

همچنین شما می‌توانید خصوصیات را نیز به اینترفیس‌ها اضافه کنید. خصوصیت باید ReadOnly یا WriteOnly تعریف شوند. مثال زیر را ببینید:

Public Interface IDrivable
' This defines a read-only property.
ReadOnly Property FuelLevel() As Integer
End Interface

اگرچه شما می‌توانید خصوصیات را در اینترفیس‌ها تعریف کنید، اما نمی‌توانید فیلدها را در آنها تعریف کنید. این شرط تضمین می‌کند که کلاسهایی که از طریق اینترفیس‌ها تعامل دارند به دادهای درونی یک شیئ دسترسی نداشته باشند.

اینترفیس‌ها همچنین می‌توانند رویدادها را تعریف کنند:

Public Interface IDrivable
Event OutOfFuel(ByVal sender As Object, e As System.EventArgs)
End Interface

چند شکلی با اینترفیس‌ها (Polymorphism with Interfaces)

هر شیئ که یک اینترفیس خاص را پیاده سازی می‌کند، می‌تواند با هر یک از اشیاء دیگری که به آن اینترفیس نیاز دارند، تعامل کند.

Public Sub GoSomewhere(ByVal v As IDrivable)
' Implementation omitted
End Sub

این متد نیاز به یک پیاده سازی از اینترفیس IDrivable دارد. هر شیئ که این اینترفیس را پیاده سازی می‌کند می‌تواند به عنوان یک پارامتر به این متد پاس داده شود. وقتی یک شیئ توسط اینترفیسش تعامل می‌کند، فقط اعضاء آن اینترفیس در دسترس هستند.

شما همچنین می‌توانید به طور ضمنی اشیایی که اینترفیس خاصی را پیاده سازی می‍کنند درست کنید. (توجه کنید در این مثال Truck باید IDrivable را پیاده سازی کند)

Dim myTruck As New Truck()
Dim myVehicle As IDrivable

' Casts myTruck to the IDrivable interface
myVehicle = CType(myTruck, IDrivable)

پیاده سازی اینترفیس‌ها

در VB.Net اینترفیس‌ها بوسیله کلاس‌ها و ساختارها (Structures) با کلمه کلیدی Implements پیاده سازی می‌شوند:

Public Class Truck
Implements IDrivable
' Additional implementation code omitted
End Class

کلاس‌ها می‌توانند چندین اینترفیس را پیاده سازی کنند. اگر بخواهید کلاسی تعریف کنید که چندین اینترفیس را پیاده سازی کند، می‌توانید نام اینترفیس‌ها را با کاما از هم جدا کنید. مثال زیر را ببینید:

Public Class Truck
Implements IDrivable, IFuelBurning, ICargoCarrying
' Additional implementation code omitted
End Class

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

پیاده سازی اعضای اینترفیس‌ها

در VB.NET، یک عضو کلاس با کلمه کلیدی Implements یک عضو اینترفیس را پیاده سازی می‌کند. عضو کلاسی که عضو اینترفیس را پیاده سازی می‌کند باید امضایی مشابه آن چه در اینترفیس تعریف شده، داشته باشد. اما نیاز نیست که سطح دسترسی مشابهی با آن داشته باشد. مثال بعد نشان می‌دهد چگونه یک عضو اینترفیس تعریف می‌شود.

Public Interface IDrivable
Sub GoForward(ByVal Speed As Integer)
End Interface

Public Class Truck
Implements IDrivable

Public Sub GoForward(ByVal Speed As Integer)
Implements IDrivable.GoForward
' Implementation omitted
End Sub
End Class

عضو کلاسی که یک عضو اینترفیس را پیاده سازی می‌کند مجبور نیست که نامی مشابه نام عضو اینترفیس داشته باشد. مثال بعد یک پیاده سازی کاملا معتبر متد GoForward از اینترفیس IDrivable را نشان می‌دهد:

Public Sub Move(ByVal Speed As Integer)
Implements IDrivable.GoForward
' Implementation omitted
End Sub

هر فراخوانی متد GoForward از اینترفیس IDrivable در مثال قبل، متد Move را از کلاس Truck اجرا می‌کند. همچنین شما می‌توانید سطح دسترسی متفاوتی را برای متد کلاسی که متد اینترفیس را پیاده سازی می‌کند در نظر بگیرید. به عنوان مثال می‌توانید متد Public اینترفیس را متد Private کلاس پیاده سازی کنید. اگر این روش را انجام دهید، وقتی که دسترسی درون اینترفیس است متد Public می‌شود، اما وقتی دسترسی به عنوان عضوی از کلاس است Private می‌ماند.

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫برنامه نویسی شیئ گرا در VB.NET (2)

برنامه نویسی شیئ گرا در VB.NET

توسط: kamyar_rasta
تاریخ انتشار: 20 خرداد 1384

این مقاله به شما کمک می‌کند تا با مفاهیم پایه‌ای برنامه نویسی شیئ گرا مانند کلاسها، اشیاء، اینترفیس‌ها، چند ریختی و وراثت و همچنین چگونگی استفاده از آشنا شوید. 		iDevCenter

وراثت چند شکلی

وراثت اجازه می‌دهد که کلاس جدیدی تعریف کنید که تمام اعضاء و اعمال یک کلاس که قبلا تعریف شده را در خود داشته باشد. به این ترتیب می‌توانید کلاس‌هایی درست کنید که اعمال پایه و مشترکی را انجام دهند و سپس زیر کلاسهای خاصی تولید کنید که خدمات متفاوت اما مرتبطی ارائه دهند.

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

وراثت

وراثت این امکان را به شما می‌دهد که چندین کلاس تولید کنید که از هم متمایزند اما در برخی از اعمال با هم شریک‌اند. کلاسهای ویژه‌ای که کلاس "مشتق شده " (Derived Classes) نامیده می‌شوند، از کلاس مشترک که "کلاس پایه" (Base Class) نامیده می‌شود ارث می‌برند. کلاسDerived را همچنین کلاس تعمیم یافته (Extended) یک کلاس پایه نیز می‌نامند. کلاس پایه اعمال مشترکی که به هر کلاس مشتق عرضه می‌شود را کپسوله سازی می‌کند. برای مثال فرض کنید کلاسی به نام کامیون داریم، کلاس کامیون تمامی اعمال اولیه که یک ماشین نیاز دارد را داراست. متدهایی برای به جلو رفتن، برگشتن و روشن شدن دارد و تمام متدهای لازم برای برای انجام این اعمال را کپسوله می‌کند. شاید شما یک کلاس مشتق که PickupTruck نام دارد تعریف کنید که از کلاس کامیون ارث می‌برد. چون این از کامیون ارث می برد همه اعمال و قابلیت‌هایی که کامیون تامین می‌کند را دارد. سپس شما می‌توانید قابلیت‌های اضافه‌ای را برای کلاس جدید پیاده سازی کنید، مانند خصوصیت "بار". کلاس PickupTruck می‌تواند به عنوان یک کلاس پایه برای کلاس مشتق دیگر "کامیون چهار دنده" ایفای نقش کند.

چند رفتاری در کلاس‌های وارث

عموما" کلاس‌های وارث یک رابطه "یک ... است" با کلاس پایه دارند. یک "کامیون کشاورزی چهاردنده" یک "کامیون کشاورزی" است و یک کامیون "کشاورزی" یک "کامیون" است. هر نمونه از کلاس مشتق می‌تواند رفتار متفاوتی به عنوان نمونه‌ای از کلاس پایه‌اش داشته باشد. پس، اگر متدی نیاز به شیئ کامیون داشته باشد شما می‌توانید شیئ کامیون کشاورزی را عرضه کنید. هر کلاس مشتق ممکن است به طور ضمنی به کلاس پایه خود تبدیل شود. وقتی یک کلاس به کلاس پایه خودش تبدیل می‌شود، هر عضوی که به وسیله کلاس مشتق پیاده سازی شده غیر قابل دسترس خواهند شد و تنها اعضای کلاس پایه در دسترس خواند بود.

ساختن کلاس‌های وارث

یک کلاس وارث به وسیله کلمه کلیدی Inherits در VB.NET تعریف می‌شود. در مثال زیر کلاس PickupTruckکه از کلاس Truck ارث برده را تعریف نمودیم:

Public Class PickupTruck
Inherits Truck

' Additional implementation omitted
End Class

کلاس ها فقط می‌توانند از یک کلاس پایه ارث ببرند اما میتوانند چندین اینترفیس را پیاده سازی کنند. اگر کلاس شما چندین اینترفیس را پیاده سازی کند و همچنین از یک کلاس ارث ببرد، باید از کلمه کلیدی Implements را بلافاصله بعد از کلمه کلیدی Inherits استفاده کنید:

Public Class FourWheelDrivePickupTruck
Inherits PickupTruck
Implements IFourWheelDrive

' Additional implementation omitted
End Class

وقتی که کلاس وارث تعریف شد، می‌توانید اعضای اضافی را پیاده سازی کنید که باعث اضافه شدن اعمال اختیاری به کلاستان می‌شود.

کلاس‌های بدون وارث

گاهی شاید بخواهید کلاسی درست کنید که نتواند به عنوان کلاس پایه برای دیگر کلاس‌ها عمل کند. به عنوان مثال شاید کلاس خاصی تعریف کنید که از آن در کامپوننت‌هایتان استفاده می‌کنید و نمی‌خواهید قابل استفاده به عنوان کلاس پایه برای دیگر برنامه نویسان باشد. در این موارد می‌توانید کلاستان را با NotInheritabel برچسب بزنید.

Public NotInheritable Class AClass
' Implementation omitted
End Class

اعضاء وارث

وقتی یک کلاس وارث درست می‌کنیم، کلاس جدید همه اعمال موجود در کلاس پایه را حفظ می‌کند. علاوه بر این اعضا جدیدی را اضافه می‌کند، شما می‌توانید اعضای وارث را آن طور که می‌خواهید پیاده سازی کنید. Overriding اعضای پایه این امکان را به شما می‌دهد که یک عضو موجود در کلاس پایه را پیاده سازی جدیدی کنید. در VB.NET همچنین می‌توانید اعضای پایه را سایه بزنید (Shadow). سایه زنی اعضای پایه این امکان را می‌دهد که عضو پایه را پنهان کنیم و یک عضو جدید با همان نام، اما با خصوصیات کاملا" متفاوت شامل امضاء، و سطح دسترسی جدید اضافه کنیم.

Overriding اعضاء کلاس پایه

وقتی از یک کلاس پایه ارث می‌برید، می‌توانید پیاده سازی متفاوتی برای اعضای کلاس پایه بوسیله Override کردن آنها داشته باشید. برای مثال، کلاس Car ممکن است متدی با نام GoForward داشته باشد. اگر کلاس SportCar از کلاس Car به ارث ببرد، شاید بخواهد پیاده سازی متفاوتی از متد GoForward داشته باشد. فقط متدها و خصوصیات کلاس پایه می‌توانند Override شوند. متغییرها و رویدادهای اعضاء نمی‌توانند Override شوند.

با استفاده از کلمه کلیدی Overrides می‌توانید پیاده سازی متفاوتی از یک عضو ارایه کنید. پیاده سازی جدید باید امضا و نوع برگشتی یکسانی با عضوی که Override می‌شود داشته باشد و باید سطح دسترسی مشابهی هم داشته باشد.

' This example assumes the existence of a GoForward method in the base class
Public Class SportsCar
Inherits Car

' This line declares the overridden method
Public Overrides Sub GoForward(ByVal Speed As Integer)
' Implementation omitted
End Sub
End Class

وقتی که یک عضو Override می‌شود، عضو جدید "جایگزین عضو کلاس پایه" نامیده می‌شود. به عنوان مثال، اگر نمونه‌ای از یک کلاس وارث از کلاس پایه خودش ساخته شود و یک متد Override شده فراخوانی شود، پیاده سازی جدید اجرا خواهد شد. برای Override عضو کلاس پایه، اعضا باید با Overridable برچسب زده شوند:

Public Overridable Sub OverrideMe()
' Implementation omitted
End Sub

سایه زنی (Shadowing) اعضای کلاس پایه

در بخش قبل آموختید که چطور پیاده سازی عضوی در کلاس پایه را با پیاده سازی متفاوتی از عضو مشابهی، جایگزین کنید. در NET. همچنین امکان پذیر است که پیاده سازی عضو کلاس پایه را پنهان کرد و با عضو کاملا" جدیدی جایگزین کرد، که سطح دسترسی و امضای متفاوتی داشته باشد یا حتی نوع متفاوتی داشته باشد. این کار Shadowing نامیده می‌شود. در VB.NET از کلمه کلیدی Shadows برای جایگزینی پیاده سازی جدید برای عضو کلاس پایه استفاده می‌کنیم.

' This is the base class
Public Class MyBaseClass
Public Function MyMethod(ByVal I As Integer) As String
' Implementation omitted
End Function
End Class

' This class inherits the base class
Public Class MyInheritedClass
Inherits MyBaseClass

' This function shadows the MyMethod sub defined in the base class.
' Note that this member has a completely different signature, access
' level and returns a different type of value.
Friend Shadows Function MyMethod(ByVal S As String) As Integer
' Implementation omitted
End Function
End Class

حفظ سازگاری با اعضای سایه زده شده

وقتی عضو کلاسی را سایه می‌زنید یا پنهان می‌کنید، پیاده سازی کلاس پایه را پنهان می‌کنید و پیاده سازی جدیدی می‌سازید که نیاز به مشخصات مشابه با عضو کلاس پایه ندارد. این می‌تواند موجب مشکلاتی شود. اگر شیئی تابع MyMethod را از مثال قبل صدا بزند، این انتظار دارد که نوع String برگشت داده شود و وقتی یک Interger از نمونه عضو سایه زده شده برمی‌گردد، یک خطا ایجاد می‌شود. بنابراین باید وقتی عضوی را سایه می‌زنید یا پنهان می‌کنید دقت زیادی داشته باشید. این باید در مواردی انجام شود که شما یقین دارید که سازگاری از بین نمی‌رود.

' This example uses the MyBaseClass and MyInheritedClass classes
' defined in the previous code example.
Dim X As New MyInheritedClass()
Dim Y As MyBaseClass

' X and Y now refer to the same object, but the variables have
' different types.
Y = X

' Because the variable X is of the MyInheritedClass type, the new
' member will be called by this line.
X.MyMethod("A String")

' However, because the variable Y is of the MyBaseClass type, the
' original implementation of the member will be called by this line.
Y.MyMethod(42)

دسترسی به اعضاء کلاس پایه

وقتی اعضاء را Override یا پنهان می‌سازید، شاید بخواهید به پیاده سازی اعضاء در کلاس پایه دسترسی داشته باشید. بوسیله کلمه کلیدی MyBase می‌توانید به اعضای کلاس پایه دسترسی داشته باشید. این کلمه اشاره‌ای به پیاده سازی کلاس پایه دارد و اجازه می‌دهد که پیاده سازی اعضای کلاس پایه را در اختیار داشته باشید. مثال زیر نشان می‌دهد که چگونه یک عضو کلاس پایه احضار می‌شود:

' This example demonstrates calling the base class implementation of
' MyMethod from within an override of that method
Public Overrides Function MyMethod(ByVal I As Integer) As String
MyBase.MyMethod(I)
' Additional implementation omitted
End Function

اعضاء حفاظت شده (Protected Members)

حال یک مرور سربع بر سطوح دسترسی خواهیم داشت. اعضاء Public در دسترس همه بخشهای یک برنامه هستند) شامل کلاسهای خارجی(. اعضاء Friend یاInternal برای اعضای اسمبلی محلی (Local Assembly) در دسترس اما برای فراخوانی‌های خارجی قابل دسترسی نیستند. اعضاء Private فقط درون کلاس خودشان قابل دسترس‌اند و نمی‌توانند مورد استفاده هیچ فراخوان دیگری (شامل کلاسهای وارث) قرار بگیرند. دو سطح دسترسی دیگر Protected و Protected Frind هستند.

وقتی کلمه کلیدی Protectded با یک عضو کلاس استفاده می‌شود، آن عضو برای فراخوانی‌های خارجی، سطح دسترسی مشابهی با کلمه کلیدی Private دارد. تفاوتشان در این است که اعضای Protected برای کلاس‌های مشتق شده هم قابل دسترسی هستند. مثال زیر را ملاحظه کنید:

'The base class defines two methods: a private method and a protected
' method.
Public Class BaseClass
' A private method cannot be called from derived classes
Private Sub Method1()
' Implementation omitted
End Sub

' A protected member can be called from derived classes
Protected Sub Method2()
' Implementation omitted
End Sub
End Class

' The inherited class inherits from BaseClass
Public Class InheritedClass
Inherits BaseClass

Public Sub Demo()
' This call is legal because the protected access level allows
' access to the member defined by the BaseClass
Me.Method2()

' This call will not compile because it attempts to access a
' private member of the base class.
Me.Method1()
End Sub
End Class

مثال قبل تفاوت بین اعضاء Private و اعضاء Protected را نشان می‌دهد. متد Demo قصد دارد که از نمونه‌ای از کلاس وارث Me، با فراخوانی Method1 و Method2 استفاده کند. چون هر دوی این متدها در کلاس پایه تعریف شده‌اند، سطح دسترسی آنها تعیین شده، به هر حال آنها می‌توانند از کلاس وارث فراخوانده شوند. فراخوانی Method2 موفقیت آمیز است اما از آنجاییکه Method1 خصوصی (Private) است، برای کلاس‌های وارث در دسترس نیست.

دومین سطح دسترسی Protect Friend است. این مورد ترکیبی از سطوح Protected و Friend است. بنابراین عضوی که Protect Friend است می‌تواند بوسیله کلاس‌های درون اسمبلی یا کلاس‌هایی که از آن کلاس ارث می‌برند استفاده شوند، به علاوه از درون کلاس خودش هم دردسترس است.

کلاس‌ها و اعضای مجرد

وقتی کامپوننت‌هایی را می‌سازید، شاید بخواهید کلاس پایه‌ای درست کنید که برخی اعمال ثابت را داشته باشد اما پیاده سازی دیگر اعضای آن را به کلاس‌هایی که از آن به ارث می‌برند واگذار کنید. شما می‌توانید با استفاده از کلاسهای مجرد Abstract Classes این کار را انجام دهید، کلاس‌هایی که باید به ارث رسیده شوند.

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

ساختن کلاس‌های مجرد (Abstract Classes)

بوسیله کلمه کلیدی MustInherit می‌توانید کلاسی را کلاس مجرد کنید.

Public MustInherit Class AbstractClass
' Implementation omitted
End Class

تعریف اعضای مجرد

مانند کلاس معمولی، کلاس مجرد می‌تواند هر عضوی را پیاده سازی کند. اعضای معمولی یک کلاس مجرد می‌تواند Overridable (مجازی) شود، در این مورد کلاس‌های وارث می‌توانند اعضایی که نیاز دارند را بسازند، یا می‌توانند غیر مجازی شوند و بنابراین پیاده سازی ثابتی دارند که می‌تواند با همه اعضاء مشترک شود.

کلاسهای مجرد هم میتواند اعضای مجرد تعیین کند. اعلان یک عضو مجرد بسیار شبیه اعلان یک عضو اینترفیس است. تنها نوع عضو، سطح دسترسی، پارامترهای مورد نیاز و نوعی که برگرداننده می‌شود تعیین می‌شود. هیچ جزییاتی راجع به پیاده سازی اعضایی که در متد اعلان شده‌اند وجود ندارد. پس، فقط اعضاء اینترفیس تعیین می‌شوند. برای اعلان یک عضو مجرد، باید از کلمه کلیدی MustOverride استفاده کرد. اعضا مجرد باید درکلاسهای مجرد اعلان شوند. اگر سعی کنید عضو مجردی را در کلاس غیر مجردی اعلان کنید، کامپایلر خطایی اعلام خواهد کرد. مثال بفدی کلاس مجردی با 3 عضو مجرد نشان می دهد:

Public MustInherit Class Car
Public MustOverride Sub GoForward(ByVal i As Integer)
Public MustOverride Function CheckSpeed() As Integer
Public MustOverride Property Color() As String
End Class

ارث بری از یک کلاس مجرد

وقتی یک کلاس غیر مجرد از یک کلاس مجرد ارث می‌برد، باید پیاده سازی برای هر یک از اعضا مجرد تعیین شده بوسیله کلاس مجرد تامین کند. مثال بعدی پیاده سازی از کلاس مجرد مثال قبلی را نشان می‌دهد.

Public Class MyCar
Inherits Car

Public Overrides Sub GoForward(ByVal I As Integer)
' Specific implementation of this method would go here
End Sub

Public Overrides Function CheckSpeed() As Integer
' Implementation for this method goes here
End Function

Public Overrides Property Color() As String
Get
' Both the getter and the setter must be implemented
End Get
Set(ByVal Value As String)
' Setter implementation goes here
End Set
End Property
End Class

همچنین می‌توانید کلاس مجرد جدیدی را با ارث بری از کلاس مجرد حاضری درست کنید. در این مورد، کلاس مجرد مشتق شده نیاز ندارد که پیاده سازیی برای اعضا مجرد تعیین شده در کلاس پایه تعریف کند. اما اگر نیاز باشد می‌توان این اعضاء را نیز مجددا پیاده سازی کند.

منابع

  • Developing Windows-Based Applications with Microsoft Visual Basic .NET

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫روش پیاده‌سازی برنامه نویسی فوق العاده

روش پیاده‌سازی برنامه نویسی فوق العاده

توسط: khashayar
تاریخ انتشار: 5 تیر 1384

XPDM روشی است بر اساس متدلوژی XP که توجه زیادی به مسائل مهم کاربردهای تجارت الکترونیک دارد و راهکارهای سریع و بهینه‌ای برای تغییرات محیط‌های تجاری ارائه می‌نماید. 		iDevCenter

هر چند زمان زیادی از پیدایش متدولوژی XP نمی‌گذرد، اما با توجه به بالا بردن کارایی و سرعت بخشیدن به امر تولید نرم‌افزار، از استقبال زیادی برخوردار گردیده، بگونه‌ای که تعداد زیادی از شرکت‌ها و موسسات از این متدلوژی جهت تولید نرم‌افزارهای خود استفاده می‌نمایند. بسیاری از این شرکت‌ها و موسسات با استفاده از اصول متدلوژی XP، با توجه به نیاز، نسخه‌هایی سفارشی شده از این روش را ایجاد و با استفاده از آنها حداکثر کارایی را در تولید نرم‌افزارهایشان بدست آورده‌اند. از جمله این شرکت‌ها، شرکت SSW می‌باشد که یک نسخه سفارشی شده از XP بنام SSW XPDM را بوجود آورده است. این شرکت یکی از شرکت‌های همکار مایکروسافت خصوصا" در زمینه ارائه راه حلهای NET. بوده و با همکاریAdam Cogan (طراح ارشد و مدیر بخش محلی میکروسافت در تولید و بروز رسانی MSDN) از جمله یکی از شرکت‌های پیشتاز و موفق در این زمینه می‌باشد. در این مقاله سعی در تشریح این روش گردیده است.

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

روش XPDM ارائه شده توسط شرکت SSW روشی است بر اساس متدلوژی XP که توجه زیادی به مسائل مهم کاربردهای تجارت الکترونیک دارد و راهکارهای سریع و بهینه‌ای برای تغییرات محیط‌های تجاری ارائه می‌نماید. قبل از اینکه به توضیح روش SSW XPDM بپردازیم، بد نیست نگاهی سریع و گذرا بر متدولوژی XP داشته باشیم.

برنامه نویسی فوق العاده (eXtreme Programming)

متدلوژی XP بر چهار ارزش کلیدی زیر بنا گردیده‌است:

  • ارتباط (Communication)
  • ساده سازی (Simplicity)
  • بازخورد (Feedback)
  • شجاعت (Courage)

از انجام سه ارزش کلیدی ارتباط، ساده سازی و بازخورد در کنار یکدیگر توسط اعضای تیم پروژه و کاربر به ارزش کلیدی شجاعت دست خواهیم یافت. همانگونه که در شکل 1 دیده می‌شود، هدف اصلی متدولو‍ژی XP شجاعت می‌باشد. برای مثال شجاعت در تغییر کدی که باید تغییر داده شود، شجاعت برای درخواست یک نیاز جدید توسط کاربر و شجاعت در باور اینکه به نتیجه مطلوب خواهیم رسید. شجاعت یک تیم از واکنش آنها نسبت به فشار و اضطرابها مشخص می‌شود.

متدولوژی XP جهت مقابله با تغییرات غیر منتظره و رفع نیازها و درخواست‌های جدید (که می‌توانند در مراحل بعدی انجام گردند) طراحی گردیده و بدین ترتیب با استفاده از چهار ارزش کلیدی خود همواره در حال اصلاح و تعدیل طرح پروژه با توجه به شرایط می‌باشد در حالی که در گروه‌هایی که براساس متدلوژی‌هایی بغیر از XP کار می‌کنند یا این درخواست‌ها و ورودی‌های جدید نادیده گرفته می‌شود (به دلیل اینکه چهارچوب پروژه از قبل تعیین شده و این تغییرات بسادگی قابل اعمال نخواهند بود) و یا بعنوان یک سری اطلاعات جدید اما در همان چهار چوب طرح کلی پروژه به آنها رسیدگی می‌کنند.

هدف از شجاعت، داشتن اطلاعات صحیح از وضعیت لحظه به لحظه پروژه و اطلاع دقیق از توانایی‌های اعضای تیم در مقابله با مشکلات و اجرای صحیح پروژه می‌باشد. تاکید فراوان XP بر ارزش‌های ارتباط و بازخورد به این دلیل است که همواره بدانیم در کجا هستیم و چگونه به بهترین وجه از عامل شجاعت در پیشبرد پروژه استفاده نمائیم.

Figure 1
شکل 1

چهار ارزش کلیدی XP با استفاده از مرور پیوسته و مستمر و تنظیم و تعدیل اهداف پروژه همیشه پروژه را بصورت زنده و پویا نگهداشته و همچنین تاکید زیادی بر ارتباط مداوم و فعال بین طراحان، برنامه نویسان، مدیران پروژه، مدیران تجاری و کاربران در طول عمر پروژه دارند.

در طول این ارتباط مداوم هر یک از اعضای تیم پروژه وظایف زیر را بر عهده خواهند داشت:

  • طراحان نرم‌افزار با کمک مدیران تجاری نیازهای سیستم را در حداقل زمان ممکن مشخص می‌نمایند.
  • مدیران پروژه انجام فعالیت‌ها را بصورت محدود شده در محدوده زمانی بین 1 تا 3 روز برنامه ریزی می‌کنند.
  • برنامه نویسان بطور پیوسته در حال نوشتن و مرور کدها می‌باشند، البته این کار بصورت برنامه نویسی زوجی (Pair Programming) صورت می‌پذیرد. در این روش دو برنامه نویس با هم بر روی یک طرح، تابع یا فرم کار می‌کنند و بدین صورت کار هر یک توسط دیگری نقد می‌گردد.
  • کاربران، نسخه‌های مختلف سیستم را آزمایش نموده و نتایج را بطور مستمر گزارش می‌نمایند.
  • مدیران تجاری بطور مداوم تغییرات سیستم و تغییر اولویت‌ها را بر اساس تغییرات نیازهای تجاری مرور کرده و گزارش می‌کنند.

تصویر کلی از SSW XPDM

در روش SSW XPDM ابتدا با بدست آوردن یک دید کلی نسبت به مسئله و تعیین اولویت‌ها و تعیین دقیق نیازهای کاربر، یک طرح نسخه نهایی مشخص گردیده و سپس این طرح نسخه نهایی به طرح نسخ میانی که می‌توانند در طول یک دوره زمانی یک تا سه هفته‌ای پیاده سازی شوند، تقسیم می‌گردد (البته این عمل بطور مستمر در طول اجرای پروژه انجام می‌گردد). جهت پیاده سازی نسخ میانی، آنها نیز به نوبه خود به طرح نسخ جزئی که طول دوره پیاده سازی آنها یک تا سه روز می‌باشد، تقسیم شده و با طرح آزمون برای هر یک از نسخ جزئی و پیاده سازی و آزمایش آنها توسط روش برنامه نویسی زوجی و با الحاق این نسخه‌های جزئی، نسخه‌های میانی ساخته شده که این نسخ میانی باید توسط کاربر مورد بررسی و تائید قرار گیرد و در خاتمه بعد از تولید و تائید نسخ میانی، نسخه نهایی ایجاد گردیده و با تست نسخه نهایی و تائید آن توسط کاربر محصول نهایی تولید خواهد شد. بدیهی است در آزمون هر مرحله در صورت بروز خطاها و اشکالات احتمالی، آنها به مرحله قبلی ارجاع داده خواهند شد و تا رفع کامل آنها این عمل تکرار خواهد گردید.

شکی نیست که پیاده سازی نرم افزار یک علم کاملا" دقیق نبوده و همواره با یک درصد ریسک همراه است. SSW XPDM روشی است برای به حداقل رساندن درصد ریسک و حداکثر سازی کارایی تولید نرم افزار. در متدلوژی SWW XPDM در پایان تولید هر نسخه میانی، کاربران با آزمون و تشخیص خطاهای طراحی و پیاده سازی جهت برطرف نمودن آنها توسط اعضاء تیم پروژه میزان ریسک به دوره‌های یک تا سه هفته‌ای کاهش میابد.

در شکل 2 شمای کلی مراحل متدولوژی SSW XPDM نشان داده شده است. لازم به توضیح است قسمت‌هایی که بصورت پررنگ مشخص گردیده اند، با کمک کاربر انجام می‌گیرند. در ادامه به توضیح هر یک از این مراحل می‌پردازیم.

Figure 2
شکل 2

1. مقدار‌دهی اولیه پروژه

این مرحله که معمولا" توسط یک نفر از اعضاء طراح سیستم، در محل کار کاربر انجام می‌گیرد و شامل اهداف زیر می‌باشد (انجام این مرحله غالبا" هزینه‌ای برای کاربر در بر نخواهد داشت):

  • بدست آوردن یک دید کلی از پروژه
  • تعیین بهترین فناوری پیاده سازی
  • تعیین و معرفی بهترین نرم‌افزارها بعنوان ابزار پیاده سازی
  • تشریح متدلوژی پیاده سازی برای کاربر
  • ارائه مستندات سوابق و شرایط شرکت برای آشنایی و توجیه هر چه بیشتر کاربر جهت عقد قرارداد

2. تعیین اولویت‌ها

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

3. نوشتن نیازهای کاربر

نیازهای کاربر یک مستند فنی نیست، بلکه تا حد امکان باید ساده باشد و در اصل نوشتن نیازهای کاربر بصورت بسیار ساده و روان (در باره اینکه سیستم چه کاری باید انجام دهد) می‌باشد. با نوشتن نیازهای کاربر علاوه بر واضح شدن انتظارات کاربر می‌توان تخمینی از زمان پیاده سازی آنها نیز بدست آورد. اگر مشخص کردن و نوشتن نیازهای کاربر بیش از سه روز بطول بی‌انجامد باید به مراحل حداکثر سه روزه شکسته شود. برای مثال اگر پیاده سازی "سیستم مدیریت مشتریان" برای کاربر مطرح باشد که نوشتن نیازهای آن به بیش از سه روز زمان احتیاج داشته باشد، باید برای مثال به دو قسمت تشریح امکانات "اضافه/ویرایش/حذف مشتریان" و "جستجوی مشتریان" تقسیم گردد.

4. طرح نسخه کلی و نسخ میانی

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

  • چه عملیات و توابعی باید انجام گیرند
  • هزینه و زمان هر یک از این فعالیتها چقدر است

هر طرح نسخه میانی بعنوان یک پیشنهاد باید به تائید کاربر برسد.

5. مرور نسخ میانی

همانطور که بیان گردید طرح نسخه کلی در اصل همان نیازهای مشخص شده کاربر می‌باشد، اما طرح نسخ میانی به فعالیت‌هایی که در اولویت بوده و در یک دوره یک تا سه هفته‌ای قابل پیاده سازی هستند، اطلاق می‌گردد. بنابراین روند انجام کار بدین ترتیب است که با توجه به اولویت مطرح شده از طرف کاربر اولین طرح نسخه میانی طراحی شده و بعد از آن این طرح باید توسط طرفین (تیم پروژه و کاربر) مرور گشته و علاوه بر تائید آن مواردی که در اولویت‌های بعد قرار دارند و باید در طرح نسخه میانی بعدی لحاظ گردند مورد موافقت قرار گیرند. بنابراین همانگونه که ملاحظه می‌گردد در این متدلوژی ابتدا مولفه های مرکزی نرم افزار ایجاد می‌شوند.

6. طرح نسخ جرئی

طرح نسخه جزئی یک توصیف تکنیکی از طرح نسخه میانی است که به فعالیت‌های برنامه نویسی یک تا سه روزه شکسته شده است. این فعالیت‌ها به دو بخش آزمون و پیاده سازی تقسیم می‌شوند. بخاطر داشته باشید که طرح نسخه میانی یک سری از نیازهای عملیاتی هستند که کاربر و اعضاء تیم پروژه بر روی آن بتوافق رسیده‌اند و در یک دوره زمانی یک تا سه هفته‌ای قابل پیاده سازی می‌باشند.

7. طرح آزمون نسخه جزئی

بر اساس متدلوژی XP طرح آزمون‌ها باید قبل از پیاده سازی آماده گردند. این بدین معناست که تمام پیاده سازی‌هایی که انجام می‌شوند، باید بر اساس قوانین از قبل تعریف شده باشند. این یک روش کارا جهت تشخیص و رفع سریع خطاهای احتمالی می‌باشد. بنابراین در این مرحله طرح آزمون برای نسخه جزئی آماده می‌گردد تا در مرحله پیاده سازی نسخه جرئی مورد استفاده قرار بگیرد.

8. پیاده‌سازی نسخه جزئی

پیاده سازی نسخه جزئی عبارت است از پیاده سازی فرمها، توابع، اشیاء، روالهای ذخیره شده که باید در یک دوره یک تا سه روزه پیاده سازی گردند. هنگامی که یک فعالیت تائید گردید، تستهای آنها نوشته شده و پیاده سازی آنها آغاز می‌گردد. تمام عملیات در انتهای پیاده سازی هر نسخه جزئی مرور می‌گردد. همانطور که قبلا" گفته شد در این روش کد نویسی با روش برنامه نویسی زوجی (Pair Programming) انجام می‌پذیرد.

9. آزمایش نسخه میانی

در پایان پیاده سازی نسخ جزئی (در طول یک دوره یک تا سه هفته‌ای) یک نسخه از نرم افرار (نسخه میانی) برای مرور و تائید کاربر آماده می‌گردد، کاربر با مرور و آزمون این نسخه میانی در صورت وجود خطاها و اشکالات احتمالی آنها را گزارش کرده و با ارجاع آنها به مرحله قبل تا رفع کامل آنها این عمل ادامه پیدا می‌کند. در صورت رضایت کاربر، این نسخه میانی جهت ایجاد نسخه نهایی مورد تائید قرار می‌گیرد. یکی از اصول پروژه‌های موفق این است که هر کجا خطا یا اشکالی بروز کند باید قبل از پیاده سازی بیشتر برطرف گردد.

10. تائید نسخه نهایی

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

11. انتشار نسخه نهایی

هنگامیکه هر دو طرف (کاربر و تیم پروژه) از نسخه نهایی رضایت داشتند، آن را بصورت یک محصول نهایی ارائه خواهند نمود. در غیر این صورت دوباره با تعیین نیازها یک نسخه جدید ایجاد شده و دوباره مورد آزمون قرار خواهد گرفت.

12. آموزش

بسیاری از کاربردهای جدید بر اساس نظرات مدیریتی طراحی و پیاده سازی می‌گردند و کاربر واقعی آخرین کسی است که سیستم را آزمایش می‌کند، در صورتیکه در متدلوژی XP از ابتدای کار کاربران واقعی سیستم در طی تمام مراحل طراحی و پیاده سازی مشارکت فعال داشته و بطور پیوسته در حال آموزش هستند.

13. پشتیبانی

یکی از نگرانی‌های بجای کاربران همیشه مسئله پشتیبانی می‌باشد. متدلوژی XPDM SSW با طرح سطوح مختلف پشتیبانی برای کاربران مختلف این مسئله مهم را در نظر می‌گیرد. بنابراین با ارائه یک طرح در زمینه روند و چگونگی پشتیبانی نیازهای کاربران در این زمینه برطرف خواهد گردید.

14. پیاده‌سازی بیشتر

با توجه به اینکه نیازها (خصوصا" نیازهای تجاری) بطور مداوم در حال تغییر و تحول می‌باشند، بنابراین احتیاج است که سیستم همواره در حال گسترش و سازگاری با تغییرات باشد. با توجه به قابلیت انعطاف و پویایی متدولوژی XP این عمل با انجام مستمر مراحل آن بسادگی انجام پذیر خواهد بود.

در این مقاله با اقتباس از منابع ذکر شده زیر، سعی در توضیح یک روش ساده و عملی برای استفاده از متدولوژی XP بوده و تشریح دقیق متدولوژی XP مد نظر نبوده است با این وصف نظرات استادان و دوستان گرامی در مورد کاستی‌های این نوشته و تجارب و راهنمای‌هایشان موجب امتنان خواهد بود.

منابع

  • SSW XPDM delivers functional, value-adding software - faster
  • www.xprogramming.com

توجه: هرگونه استفاده از این مقاله در وب سایت‌ها و یا نشریات چاپی تنها با اجازه از سایت iDevCenter.com مجاز است.


iDevCenter - ‫استفاده از ظاهر جدید Windows XP در برنامه‌ها

استفاده از ظاهر جدید Windows XP در برنامه‌ها

با کمک این مقاله خواهید توانست از ظاهر جدید کنترل‌های Windows XP در برنامه‌های خود استفاده کنید.

توسط SoheilPro | 8 آذر 1381 | 3789 بار مشاهده Printable Version نسخه مخصوص چاپ
با عرضه سیتم عامل Windows XP بعد از مدتها تغییری اساسی در واسط کاربر خانواده سیستم عامل‌های ویندوز ایجاد شد. این ظاهر جدید که Luna نام دارد دکمه‌ها و بقیه کنترل‌های استاندارد ویندوز را از حالت خشک قدیمی خارج کرده و به آنها جلوه‌ای تازه می‌بخشد. اما این ویژگی جدید به طور خودکار برای برنامه‌های قدیمی فعال نیست و باید تغییراتی در این برنامه‌ها ایجاد شود تا بتوانند از این امکان بهره بگیرند.

اولین قدم برای فعال کردن این ویژگی در برنامه‌ها فراخواندن تابع InitCommonControls است. این تابع باید در اولین نقطه اجرای برنامه فراخوانده شود. با انجام این کار ویندوز هنگام ساختن کنترل‌های برنامه از کنترل‌های جدید استفاده خواهد کرد. انجام این کار در ویژوال بیسیک بصورت زیر است:

Public Declare Function InitCommonControls Lib "comctl32.dll" () As Long

Private Sub Form_Initialize()
    InitCommonControls
End Sub

قدم بعد اضافه کردن فایل manifest به برنامه است. این فایل یک فایل متنی با فرمت XML است که شامل اطلاعات لازم درباره کنترل‌های جدید برای ویندوز می‌باشد. برای ساختن این فایل متن زیر را کپی کرده و با نام <Filename>.manifest در همان دایرکتوری که برنامه شما قرار دارد ذخیره کنید. برای مثال اگر نام فایل اجرایی برنامه شما Test.exe است نام فایل manifest باید Test.exe.manifest باشد.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly
    xmlns="urn:schemas-microsoft-com:asm.v1"
    manifestVersion="1.0"
>
<assemblyIdentity
    type="win32"
    processorArchitecture="*"
    version="6.0.0.0"
    name="mash"
/>
<description>Enter your Description Here</description>
<dependency>
   <dependentAssembly>
      <assemblyIdentity
           type="win32"
           name="Microsoft.Windows.Common-Controls" version="6.0.0.0"
           language="*"
           processorArchitecture="*"
         publicKeyToken="6595b64144ccf1df"
      />
   </dependentAssembly>
</dependency>
</assembly>

اکنون برنامه‌های شما هم قادر خواهند بود تا از جدیدترین رابط کاربر ارائه شده توسط Windows XP استفاده کنند.

Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫ایجاد یک الگوی سفارشی برای Web Formها

ایجاد یک الگوی سفارشی برای Web Formها

با ایجاد یک الگو (Template) میتوانید زمان لازم برای ساخت یک سایت وب که دارای صفحات مشابه زیادی است را به حداقل برسانید.

توسط SoheilPro | 8 آذر 1381 | 2884 بار مشاهده Printable Version نسخه مخصوص چاپ
در بسیاری مواقع لازم است که سبک و شکلی یکسان در تمام صفحات یک سایت رعایت شود و همهچنین مواردی مانند تعریف Stylesheetهای استفاده شده نیز باید به تمام صفحات اضافه شوند. در این مقاله الگویی برای پروژه‌های #C خواهیم ساخت تا با استفاده از آن دیگر مجبور به نوشتن کدهای تکراری برای هر صفحه نباشیم.

توجه: در تمام مسیرهای استفاده شده در این مقاله بجای VSNET دایرکتوری محل نصب Visual Studio .NET را مشخص کنید.

ابتدا با استفاده از Notepad فایل WebProjectItems.vsdir را که در مسیر VSNET\VC#\CSharpProjectItems\WebProjectItems قرار دارد باز کنید و خط زیر را به آن اضافه کنید:

..\MyCustomWebFormWiz.vsz|{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}|My Custom Form|10|#2263|{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}|4534|0|WebForm.aspx

سپس به دایرکتوری VSNET\VC#\CSharpProjectItems رفته و فایل CSharpAddWebFormWiz.vsz را کپی کرده و با نام MyCustomWebFormWiz.vsz ذخیره کنید. با استفاده از Notepad آن را باز کنید و مقدار Param را بصورت زیر تغییر دهید:

Param="WIZARD_NAME = MyCustomWebFormWiz"

اکنون به دایرکتوری VSNET\VC#\VC#Wizards رفته و دایرکتوری CSharpAddWebFormWiz را کپی کرده و به آن نام MyCustomWebFormWiz را بدهید. سپس فایل WebForm1.aspx را که در مسیر VSNET\VC#\VC#Wizards\MyCustomWebFormWiz\Templates\1033 قرار دارد باز کنید و تغییرات لازم را در آن داده و ذخیره کنید.

برای استفاده از این الگوی جدید کافیست یک پروژه جدید وب در #C ایجاد کرده و Add Web Form را در منوی Project کلیک کنید و سپس My Custom Form را انتخاب کنید.

منابع

  • Add a CSS Style Sheet Reference to All Web Forms in a Visual C# .NET Web Project
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫ایجاد تصاویر بصورت دینامیک در ASP.NET

Softtool

ایجاد تصاویر بصورت دینامیک در ASP.NET

اگر نیاز دارید برای سایت خود تصاویری را بصورت دینامیک ایجاد کنید، ASP.NET سریعترین و آسان‌ترین راه را برای شما فراهم کرده است.

توسط SoheilPro | 8 آذر 1381 | 2842 بار مشاهده Printable Version نسخه مخصوص چاپ
اگر تا به حال از خدمات سایت‌های فراهم کننده شمارنده‌های گرافیکی (Counter) استفاده کرده باشید، حتما" متوجه شده‌اید که ویژگی src تگ imgی که باید به صفحه خود اضافه کنید به یک فایل تصویری مانند GIF یا JPEG اشاره نمیکند بلکه معمولا مشخص کننده یک برنامه CGI است. این روش راهی است برای استفاده از تصاویر دینامیک در وب. برای ایجاد اینگونه تصاویر تا کنون بیشتر از CGI استفاده میشد زیرا انجام چنین کاری در ASP بسیار دشوار است. اما اکنون با عرضه ASP.NET شما هم میتوانید براحتی چنین تصاویری را تولید و استفاده کنید. یکی دیگر از استفاده‌های این روش نمایش اطلاعات آماری بصورت تصویر است.

ما در این مقاله توسط #C یک برنامه ASP.NET خواهیم نوشت که تاریخ امروز را بصورت یک تصویر ایجاد کند.
کد نهایی این برنامه بصورت زیر است:

 1  <%@ Page language="C#" %>
 2  <%@ Import namespace="System" %>
 3  <%@ Import namespace="System.Drawing" %>
 4  <%@ Import namespace="System.Drawing.Imaging" %>
 5
 6  <%
 7  	Bitmap bmp = new Bitmap(140, 40);
 8  	Graphics graph = Graphics.FromImage(bmp);
 9
10  	graph.Clear(Color.Orange);
11  	graph.DrawString(DateTime.Today.ToString("yy/MM/dd"),
            new Font("Tahoma", 23),
            new SolidBrush(Color.White), 0, 0);
12
13  	Response.ContentType = "image/jpeg";
14  	bmp.Save(Response.OutputStream, ImageFormat.Jpeg);
15
16  	graph.Dispose();
17  	bmp.Dispose();
18  %>
Today.aspx

در خطوط اول تا چهارم زیان برنامه و Namespaceهای استفاده شده معرفی شده‌اند. در خطهای 7 و 8 یک شیئ Bitmap با اندازه 140x40 ایجاد و سپس براساس آن یک شیئ Graphics ساخته میشود. دو خط بعد مسئول ترسیم شکل مورد نظر هستند بدینصورت که ابتدا کل تصویر بوسیله رنگ نارنجی، رنگ میشود و سپس تاریخ امروز با قلم Tahoma و رنگ سفید رسم میشود.

مهمترین قسمت این برنامه خطوط 13 و 14 است. در خط 13 خروجی برنامه بصورت image/jpeg مشخص میشود. با این کار مرورگر متوجه میشود که با یک تصویر از نوع JPEG سر و کار دارد نه یک صفحه ASPX. در خط 14 نیز تصویر ایجاد شده با فرمت JPEG به جریان خروجی ارسال میشود.

در دو خط پایانی برنامه هم حافظه اشفال‌شده توسط اشیاء آزاد میشود.

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

<img src="Today.aspx" />

Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫آیکونی برای سایت شما

Softtool

آیکونی برای سایت شما

با اضافه کردن یک آیکون به سایتتان برای نمایش در منوی Favorites میتوانید به سایت خود ظاهری حرفه‌ای‌تر ببخشید و توجه کاربران را به آن جلب کنید.

توسط SoheilPro | 8 آذر 1381 | 4456 بار مشاهده Printable Version نسخه مخصوص چاپ
یکی از ویژگی‌هایی که با عرضه نسخه پنجم Internet Explorer به این برنامه اضافه شد، امکان نشان دادن آیکون ویژه هر سایت در منوی Favorites بود. انجام اینکار بسیار ساده است و به هیچ نرم‌افزار خواصی نه در سمت سرور و نه در سمت کاربر نیاز ندارد.

برای Internet Explorer 5 اندازه این آیکون باید 16x16 پیکسل باشد؛ در غیر اینصورت نادیده گرفته خواهد شد. جهت ساختن آیکون میتوانید از برنامه‌های زیادی که در اینترنت برای این کار موجود است استفاده کنید. یکی از بهترین برنامه‌ها در این زمینه برنامه Microangelo است که میتوانید آنرا از سایت www.impactsoftware.com دریافت کنید. برنامه‌های Visual Studio 6 و Visual Studio .NET نیز امکان ساخت و ویرایش آیکون را دارند.

بعد از ساخت آیکون باید آنرا با سایت خود مرتبط کنید. ساده‌ترین راه برای انجام این کار قرار دادن آیکون با نام favicon.ico در دایرکتوری ریشه سایت است. از این پس هر بار که کاربری سایت شما را به لیست Favorites خود اضافه کنید، Internet Explorer به طور خودکار این فایل را از آدرس http://www.mywebsite.com/favicon.ico دریافت کرده و نمایش میدهد.

اما اگر میزبان سایت شما اجازه استفاده از فایلهای ICO. را نمیدهد و مجبورید آیکون خود را روی سایت دیگری قرار دهید و یا اگر میخواهید برای هر صفحه از آیکون متفاوتی استفاده کنید، باید از راه دوم استفاده کنید. در این روش لازم است که خط زیر را به قسمت Head صفحات خود یعنی بین تگهای <head> و <head/> اضافه کنید و بجای http://www.mydomain.com/myicon.ico آدرس فایل آیکون خود را قرار دهید.

<link rel="SHORTCUT ICON" href="http://www.mydomain.com/myicon.ico">

اکنون هر بار که کاربری سایت شما را به لیست Favorites خود اضافه کند، آیکونی که مشخص کرده‌اید در کنار منوی مربوطه و آدرس سایت در نوار آدرس نشان داده خواهد شد.

Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫آشنایی با کنترل XML در ASP.NET

آشنایی با کنترل XML در ASP.NET

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

توسط SoheilPro | 20 آذر 1381 | 2325 بار مشاهده Printable Version نسخه مخصوص چاپ
امروزه بکارگیری فناوری XML در طراحی سایت‌ها بسیار رواج یافته است و یکی از بیشترین موارد استفاده آن، نمایش اطلاعات یک فایل XML بصورت فرمت شده در صفحات وب است. به همین دلیل مایکروسافت یک کنترل را دقیقا" به همین منظور در ASP.NET قرار داده است.

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

<asp:xml DocumentSource="MyFile.xml" id="xml1" Runat="server" />

با اضافه‌کردن خط بالا به یک صفحه، محتویات فایل MyFile.xml بطور خودکار به صفحه اضافه خواهد شد. روش دیگر، قرار دادن محتویات سند به شکل XML بین تگهای <asp:xml> و <asp:xml/> بصورت زیر است:

<asp:xml id="xml1" Runat="server">
    <Books>
        <Book>Sample Book 1</Book>
        <Book>Sample Book 2</Book>
    </Books>
</asp:xml>

اما اگر سند XML بصورت یک فایل ذخیره شده روی دیسک وجود نداشته باشد و برای مثال براساس اطلاعات موجود در دیتابیس در زمان درخواست صفحه ساخته شود، این روش قابل استفاده نخواهد بود. در این حالت باید از خاصیت Document در کد صفحه استفاده کرد و یک شیئ از نوع System.Xml.XmlDocument را به آن نسبت داد. مثال زیر یک سند XML ساخته و آن را توسط کنترل xml1 نمایش میدهد:

XmlDocument doc = new XmlDocument();
XmlElement elem = doc.CreateElement("Price");

elem.InnerText="24.95";
doc.AppendChild(elem);

Xml1.Document = doc;

در بیشتر موارد نشان دادن اطلاعات فایل XML به تنهایی کافی نیست و باید از یک فایل XSL نیز برای تعیین نحوه نمایش اطلاعات استفاده کرد. برای این کار دو خاصیت Transform و TransformSource در این کنترل قرار داده شده‌اند. خاصیت Transform تنها هنگام نوشتن کد قابل استفاده است و باید به آن یک شیئ از نوع System.Xml.Xsl.XslTransform نسبت داد. اما خاصیت TransformSource هنگام طراحی صفحه نیز قابل دسترسی است و میتوان از آن برای مشخص کردن نام و مسیر فایل XSL استفاده کرد. مثال زیر فایل MyFile.xml را توسط فایل MyTransform.xsl فرمت کرده و نمایش میدهد:

<asp:xml DocumentSource="MyFile.xml" TransformSource="MyTransform.xsl" id="xml1" Runat="server" />

کد زیر نیز دقیقا" کار مثال بالا را انجام میدهد، با این تفاوت که بجای خاصیتهای DocumentSource و TransformSource از خاصیتهای Document و Transform استفاده میکند:

XmlDocument doc = new XmlDocument();
XslTransform trans = new XslTransform();

doc.Load(MapPath("MyFile.xml"));
trans.Load(MapPath("MyTransform.xsl"));

Xml1.Document = doc;
Xml1.Transform = trans;

نکته‌ای که باید به آن توجه داشت این است که اگر شما همزمان از سه خاصیت DocumentContent ،DocumentSource ،Document و یا خاصیتهای Transform و TransformSource استفاده کنید، تنها آخرین موردی که مشخص کرده‌اید مورد استفاده قرار خواهد گرفت و بقیه موارد نادیده گرفته خواهند شد.

Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫آشنایی با کنترل DataGrid در ASP.NET

آشنایی با کنترل DataGrid در ASP.NET

کنترل DataGrid یکی از پر استفاده‌ترین کنترل‌های دات نت است. در این مقاله به شرح امکانات این کنترل پرداخته میشود.

توسط benyblack | 21 آذر 1381 | 2100 بار مشاهده Printable Version نسخه مخصوص چاپ
DataGrid داده‌های جدولی را نشان میدهد و می تواند انتخاب، مرتب سازی، صفحه بندی و ویرایش داده‌ها را پشتیبانی کند. به طور پیش فرض دیتاگرید یک BindColumn برای هر ستون داده‌ها در منبع داده ایجاد می کند (AutoGenerateColumns = True). هر فیلد در یک ستون جدا سازی شده قرار می گیرد. نام فیلد در عنوان (Header) ستون قرار می گیرد و مقدار آن در یک برچسب متن ظاهر می شود.

این مثال استفاده از DataGrid را نشان میدهد:

تعریف ستون‌ها:
شما می توانید طبقه بندی، رفتار، و نمایش ستونهای منفرد را با دستکاری مستقیم مجموعه ستونها (Columns Collection) کنترل کنید. نوع استاندارد ستون (Bound Column) مقادیر را در برچسب‌های متنی نشان میدهد. البته گرید انواع دیگری را نیز که به صورت متفاوتی نمایش می یابند پشتیبانی می کند. در مجموعه ستونها انواع متفاوتی از ستونها قابل استفاده است.

نکته: شما می توانید تعریف صریح ستونها را به همراه Auto-Generated Columns استفاده کنید. وقتی این دو با هم استفاده شوند، ابتدا ستونهای با تعریف صریح ارائه می شوند. Auto-Generated Columns در مجموعه ستونها اضافه نمی شوند.

BoundColumn | به شما اجازه میدهد طبفه بندی و نمایش ستونها راکنترل کنید.
HyperLinkColumn | داده‌ها را در کنترل HyperLink نمایش میدهد.
ButtonColumn | فرمان های کاربر را به Event Handlerهای گرید مرتبط می کند.
TemplateColumn | به شما اجازه میدهد شیوه نمایش هر کنترلی را در گرید کنترل کنید.
EditCommandColumn | لینکهای Update ،Edit و Cancel را در پاسخ به تغییرات در ویژگی EditItemIndex نمایش میدهد.

پنهان کردن ستونها:
هر ستون در گرید دارای ویژگی Visible است. برای پنهان کردن هر ستون Visible را به False تغییر دهید. (مثال | کد)

مرتب سازی ستونها:
داده ها در گرید به طور معمول با کلیک کردن سر ستون (Header) هر ستون مرتب میشوند. شما میتوانید مرتب سازی را در DataGrid با تنظیم AllowSorting به True فعال کنید. (مثال | کد)

صفحه بندی:
DataGrid لوازمی را برای نمایش گروهی داده‌ها از منبع داده‌ها ارایه میدهد. شما میتوانید صفحه بندی داده‌ها در DataGrid را با تنظیم AllowPaging به True فعال کنید. با فعال سازی صفحه بندی گرید دکمه‌های راهبری (Next/Prev یا شماره‌ای) را نشان میدهد. (مثال | کد)

در ضمن شما می توانید به جای این دکمه‌ها یا لینک‌ها از کنترل‌های دلخواه استفاده کنید. شما باید CurrentPageIndex را تنظیم کنید و دوباره از DataBind استفاده کنید. (مثال | کد)

Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫ارث بری فرم ویژوال در دلفی (1)

Softtool

ارث بری فرم ویژوال در دلفی

اگر بتوانید در برنامه هایتان به طور گسترده از ارث بری فرم ویژوال (Visual Form Inheritance) استفاده کنید، مدت زمانی که صرف توسعهء نرم افزارتان می کنید کاهش یافته، ایرادات آن کمتر شده و رابط کاربر آن ظاهر پایدار و با ثبات تری پیدا می کند.

توسط sobh | 5 دی 1381 | 2328 بار مشاهده Printable Version نسخه مخصوص چاپ
ارث بری فرم ویژوال چیست؟
VFI قابلیتی در دلفی است که اجازه می دهد فرمهای جدید از فرمهای موجود مشتق شوند یا قابلیتهای آن را به ارث برند. VFI به طور کلی همان مزایای ارث بری را در اختیار می گذارد که اولین آنها قابلیت بر گرفتن شباهتهای کلاسهای مختلف از کلاسهای بالاتر در یک سلسله مراتب است. در این مورد، کلاسها فرمهایی هستند که در ابزار طراحی فرم دلفی ساخته شده اند. به زبان دیگر VFI به شما اجازه می دهد یک کد را در جایی بنویسید که بین چندین فرم مشترک باشد. واضح است که یک بار نوشتن کد کارایی را بالا برده و امکان خطا را کاهش می دهد. حال این فرمهاممکن است همگی مربوط به یک برنامه یا برنامه های مختلف باشند.

VFI چیزی بیش از استفادهء مجدد از کد است. این همان جایی است که بخش ویژوال VFI وارد می شود. شما می توانید فرمهایی را در دلفی طراحی کنید، وهمان طرح بندی و ظاهر را بین فرمهای متفاوت به اشتراک گذارید. واداشتن فرمها به داشتن طرح بندی مشترک باعث ایجاد ثبات در ظاهر و بالا رفتن کارایی می شود.

همچنین استفاده از VFI به شما امکان طراحی سلسله وار فرمها را می دهد. هر تغییری در فرمهای مراتب بالاتر در فرمهای وارث تاثیر می گذارد. همین طور، می توانید اجزاء و یا کدهایی را به فرمها اضافه و در نتیجه تمام فرمهای وارث را تغییر دهید.

فرض کنید در حال نوشتن برنامه ای برای مدیریت مشتریان و صورتحساب هایشان هستید. شما برنامه را طراحی کرده و معین می کنید که برای کار با داده ها به سه فرم کلی نیاز دارید: یکی برای مشتریان، دومی برای صورتحساب ها و سومی برای قطعاتی که می فروشید. گرچه هر فرم اطلاعات متفاوتی ارائه می کند، عناصر مشابهی در فرمها هست. مثلا هر فرم باید دوبرگ داشته باشد. یکی با یک DBGrid بر رویش و دیگری با کنترلهای متفاوت برای ویرایش جدولی که در نظر دارید. همچنین هر برگ به چند دکمه برای ذخیره و لغو تغییرات و اضافه و حذف کردن رکوردها نیاز دارد. شما می توانید هر فرم را جداگانه طراحی کرده و برای هر کدام جداگانه کد بنویسید. اما راه بهترش آغاز کار با یک فرم کلی پیش ساخته حاوی کنترلها و کد مشترک است. بعد می توانید از VFI استفاده کرده، فرمهای مورد نظرتان را مبتنی بر این فرم اولیه بسازید و تغییرات لازم را در آنها ایجاد کنید.

وقتی فرمها را ساختید، باز هم می توانید امکانات جدیدی به فرم اولیه اضافه کنید. مثلا اگر بخواهید در پس زمینهء همهء فرمها آرم خاصی را نمایش دهید یا در همه امکاناتی کلی برای جستجو فراهم آورید. کافی است هر آنچه را می خواهید به فرم اولیه بیافزایید. فرمهای پایین دست خود به خود رفتار یا ظاهر جدید را به ارث می برند.

مروری کوتاه بر وراثت
وراثت یکی از ویژگیهای برنامه نویسی شیء گراست که به شما اجازهء ساخت کلاسهای تازه مبتنی بر کلاسهای موجود را می دهد. کلاس قدیمی، کلاس مافوق یا بالادست و کلاس جدید، کلاس زیر دست یا پایین دست خوانده می شود. کلاسها بالطبع دارای داده ها و کدهایی هستند. کلاسهای پایین رتبه تر می توانند داده ها و کدهای عمومی کلاسهای بالادست خود را ببینند. دلفی از یک مدل وراثت تکی پشتیبانی می کند. بدین معنی که هر کلاس می تواند به طور مستقیم وارث فقط یک کلاس باشد. (بعضی زبانها از نوع دیگری وراثت به نام وراثت چندتایی پشتیبانی میکنند. در این زبانها یک کلاس می تواند وارث چندین کلاس بالادست خود باشد.) همچنین می توانید به طور مکرر از وراثت استفاده کنید. یعنی می توانید مثلا کلاس A را وارث کلاس B و کلاس B را وارث کلاس C بسازید. در این حالت کلاس A می تواند کدها و داده های عمومی هر دو کلاس B و C را ببیند (شکل 1 را ببینید).
شکل 1

کلاس زیر را که ابزار طراحی فرم دلفی به طور خودکار برای فرم ما ایجاد کرده در نظر بگیرید:

Type
  TFrmRichEdit = class(TForm)
    btnCancel: TButton;
    btnOk: TButton;
    rtfNotes: TRichEdit;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

نام این کلاس TFrmRichEdit است و می بینید که به صورت وارثی از TForm تعریف شده. TForm یکی از کلاسهایی است که از قبل در VCL تعریف شده. TForm و کلاسهای بالاترش داده و کدی را که برای همهء انواع فرمها متعارف است تعریف می کند. خاصیتهایی مانند Font, Caption و Color و همین طور روالهایی چون Show, Close و ShowModal در همین کلاسها تعریف می شوند. پس TForm و پدرانش همهء شباهتهای میان انواع فرمها را در بر می گیرند. اگر دلفی از وراثت پشتیبانی نمی کرد، ابزار طرحی فرم دلفی می بایست هربار، برای هر فرم تمام این روالها و داده های مشترک را از اول می نوشت.

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

Var
  frmRichEdit: TFrmRichEdit

سپس می توانید کلاس را با صدا زدن روال سازنده اش ، Create، نمونه سازی کنید. Create یک پارامتر می گیرد، که به آن شیء Application را رد می کنیم:

frmRichEdit := TFrmRichEdit.Create(Application);

اینجا هم وراثت توی کار است! چه کسی Create را تعریف کرده؟ یکی از کلاسهای بالادست TFrmRichEdit. اگر بخواهیم دقیقتر بگوییم، TCustomForm.

هنگامی که از روی یک کلاس، شیئی می سازید، می توانید به طور مستقیم به روالها و داده های آن شیء دسترسی داشته باشید:

frmRichEdit.btnOk.Enabled := False;

همچنین به روالها و داده های کلاسهای بالادستش:

frmRichEdit.Caption := ‘RTF Editor’;
frmRichEdit.Show;

Caption در TControl (که چندین مرتبه بالاتر است) تعریف شده. روال Show هم در TCustomForm تعریف شده.

بالاتر دربارهء داده و کدهای عمومی یک کلاس صحبت کردیم. می دانید منظور ما از "Public" دقیقا چیست؟ آیا می شود کد و داده هایمان را به صورت دیگری هم تعریف کنیم؟ در حقیقت عمومی، میدان یا قلمرو تعریفمان را مشخص می کند. نشان می دهد که شیء یا متغیر تعریف شده در کجاها باید مرئی و قابل دستیابی باشد و در کجاها نباشد. داده و کد عمومی یک کلاس برای کاربرانش قابل رویت هستند. در مثال بالا هر سهء btnOk, btnCancel و rtfNotes، متغیرهای عمومی نمونهء ما هستند.

متغیرها، کدها و روالهای یک کلاس را دو جور دیگر هم می توانیم تعریف کنیم. به صورت خصوصی و حفاظت شده . اکنون اگر دوباره به کلاسی که تعریف کردیم، نگاهی بیندازید، دو بخش به نامهای public و private می بینید که هر دو تهی هستند. آنچه در این بخشها تعریف کنید، قلمروی همنام همان بخش خواهد داشت. کد و داده های شخصی تنها در روالهای درونی کلاس قابل رویت هستند و کاربران کلاس نمی توانند آنها را ببینند.

گرچه دلفی به طور پیش فرض بخش حفاظت شده را برای شما نمی سازد، ولی اگر نیاز باشد، خودتان می توانید آن را بسازید. هر چه در بخش حفاظت شده تعریف شود، مانند تعریفهای بخش خصوصی برنامه در اختیار روالهای خود کلاس خواهد بود. آنچه که این دو (خصوصی و حفاظت شده) را با هم متفاوت می سازد، روش برخورد با کلاسهای پایین دست است. کلاسهای زیر دست می توانند چیزهایی را که حفاظت شده تعریف شده، ببینند. اما آن چه که خصوصی تعریف شده، محدود به خود کلاس است و بس.

حال که وراثت را هر چند کوتاه مرور کردیم، اجازه بدهید VFI را در عمل ببینیم.

فوت و فن VFI
برای ساختن فرمهای جدید بر پایهء فرمهای موجود، باید از انبار اشیاء دلفی استفاده کنید. این انبار در بر گیرندهء تعدادی فرمهای پیش ساخته و همچنین فرمهای موجود برنامهء شماست که با انتخابشان می توانید فرمهای جدیدی مبتنی بر آنها بسازید. برای ساختن یک فرم جدید معمولا منوی File | New | Form را انتخاب می کنیم. ولی برای ساختن فرمی بر پایهء فرمهای موجود باید File | New | Other… را انتخاب کرد. این گزینه انبارهء اشیاء دلفی یا همان Object Repository را در مقابل ما می گشاید. اکنون می توانید آنچه را می خواهید بسازید، انتخاب کنید. شما می توانید خودتان فرمهایی به انبار اضافه کنید، ولی تعدادی فرم هم پیشاپیش همراه دلفی ارائه شده که به عنوان نقطهء شروع می توانید از آنها استفاده کنید.

حالا صفحهء Forms را انتخاب کنید. چندین فرم از جمله About box و Dual list box را مشاهده می کنید (شکل 2 را ببینید). این فرمها را در همهء برنامه ها می توان به کار برد.

شکل 2

به سه گزینهء Use, Copy و Inherit در پایین توجه کنید. اینها به دلفی می گویند که بین فرم جدید شما و فرمهای درون انبار چه رابطه ای باید برقرار باشد:

  • Copy: یعنی اینکه می خواهید عین فرم درون انبار در برنامهء شما بازنویسی شود. فرم جدید از فرم درون انبار کاملا" مستقل خواهد بود و تغییر در فرم درون انبار هیچ تاثیری بر فرم جدید نخواهد داشت.
  • Inherit: یعنی فرم جدید بر پایهء فرم درون انبار است و پیوندهایش را با آن برقرار نگه می دارد. اگر فرم درون انبار را تغییر دهید، تمام فرمهای مبتنی بر آن هم تغییر می کنند. معمولا در VFI این گزینه را انتخاب می کنیم.
  • Use: یعنی می خواهید فرم درون انبار را از همان جا که هست، مستقیما استفاده کنید. در این حالت دستکاری و تغییر در فرم، در واقع تغییر دادن فرم درون انبار است. این تغییرات بر همهء فرمهای وارث تاثیر خواهد داشت.
فرمهای برنامهء خودتان را هم به همین صورت می توانید مجددا استفاده کنید. پنجرهء Object Repository چندین برگ دارد. وقتی این پنجره را باز می کنید، یکی از صفحات باید همنام برنامهء شما باشد، که در بر گیرندهء فرمهای پروژهء حاضر است. فرق این فرمها با فرمهای خود انبار در این است که فرمهای برنامهء خودتان را فقط می توانید به ارث ببرید. در نتیجه تنها گزینهء قابل انتخاب در این صفحه، گزینهء Inherit است. به هر حال تنها گزیته ای هم هست که معنی می دهد.

وقتی بر مبنای یکی از فرمهای درون انبار یک فرم جدید می سازید، امکان تغییر در این فرم جدید وجود دارد. می توانید اجزاء جدیدی به آن افزوده یا روالهای جدیدی بنویسید. همین طور می توانید آنچه را به ارث برده اید تغییر دهید. می توانید اجزاء به ارث برده را حرکت داده یا تغییر اندازه دهید، ولی نمی توانید آنها را حذف کنید. اگر بخواهید چنین کاری بکنید، دلفی از شما ایراد خواهد گرفت. گر چه نمی توانید اجزاء به ارث برده را حذف کنید، ولی به جایش می توانید آنها را نامرئی کنید، یعنی ویژگی Visible آن را False کنید.

هنگامی که مقدار یکی از ویژگیهای به ارث برده را تغییر می دهید، پیوند بین ویژگیهای دو فرم بالا دست و پایین دست را شکسته اید. مثلا فرض کنید بر روی فرم پایین دست دکمه ای را به سمت چپ حرکت می دهید. حالا همان دکمه را در فرم توی انبار تکان می دهید. چون فرم پایین دست پیوند خود را با ویژگی Left فرم بالا دست شکسته، دکمهء روی فرم زیر دست حرکتی نمی کند. (روشن است که اگر پیوند را بر هم نزده بودید حرک می کرد.) می توانید این پیوند را با کلیک راست بر روی دکمه و انتخاب Revert to inherited دوباره برقرار سازید. این کار تمام تغییراتی را که در آن جزء فرم پایین دست (در اینجا دکمهء فرم جدید ما) ایجاد کرده اید، به حالت نخست بر می گرداند.

وقتی با روالهای ارث برده از کلاسهای بالا دست کار می کنید، اوضاع کمی متفاوت است و انتخابهای بیشتری دارید. می توانید روال بالا دست را جایگزین کنید، یا این که کدی بنویسید که علاوه بر روال بالا دست اجرا شود. در صفحهء Forms از پنجرهء New Items، گزینهء Inherit را کلیک کنید و Dual list box را برگزینید. فرم مورد نظر ساخته می شود. اگر روی دکمهء < دوبار کلیک کنید، دلفی برایتان روال زیر را می سازد. این دکمه برای جابجا کردن آیتمها از لیست چپ به لیست راست است.

procedure TDualListDlg2.IncludeBtnClick(Sender: TObject);
begin
  inherited;

end;

سرواژهء inherited به معنی فراخوانی روال همنام در کلاس بالا دست است. در حقیقت کد مربوط به کلاس بالا دست است که موارد انتخابی را از لیست دست راست به لیست دست چپ جابجا می کند:

procedure TDualListDlg.IncludeBtnClick(Sender: TObject);
var
  Index: Integer;
begin
  Index := GetFirstSelection(SrcList);
  MoveSelected(SrcList, DstList.Items);
  SetItem(SrcList, Index);
end;

این سرواژهء inherited در روال بالاست که روال پایین را اجرا می کند. شما می توانید آزادانه کد دلخواهتان را قبل یا بعد از inherited اضافه کنید. همین طور می توانید آن را حذف کنید و دیگر روال بالا دستی را صدا نکنید.

یک مثال کوتاه
فرض کنید چندین فرم از Dual list box توی انبار به ارث برده اید. آنها را جوری که مناسب برنامه تان است آراسته اید و حالا ناگهان به این فکر افتاده اید که به کاربرتان اجازه دهید در فرمهایتان آیتمهای مورد نظرش را از یک لیست کشیده و در لیست دیگر بیندازد . اگر از VFI استفاده نکرده بودید، حالا ناگزیر بودید این قابلیت کشیدن و انداختن را برای همهء فرمهایتان یکی یکی بنویسید. ولی چون VFI را به کار برده اید، می توانید فقط یک بار این کد را به فرم درون انبار شیء بیافزایید. به صورت قدم به قدم:

  • box را در حالت Use از Object Repository برگزینید.
  • ویژگی DragMode لیست دست چپ، SrcList، را برابر dmAutomatic قرار دهید. این مقدار به لیست شما می فهماند که باید به طور خودکار به کاربر شما اجازهء کشیدن را بدهد. همین که کاربر یک آیتم را انتخاب کرده و دکمهء سمت چپ ماوس را نگه دارد، کشیدن آغاز می شود. روش دیگر، dmManual است که در آن برنامهء شما، خود باید مسوولیت آغاز کشیدن را بر دوش بگیرد.
  • رویداد OnDragOver را برای لیست دست راست، DstList، یه صورت زیر بنویسید:

    Accept := (Source = SrcList);

    رویداد OnDragOver هنگامی رخ می دهد که کاربر یک آیتم را به روی کنترل بکشد. این رویداد برای اطمینان یافتن از تناسب کنترل مقصد با آیتم کشیده شده به کار می رود. کدی که نوشتیم به DstList می گوید اگر مبدا آیتم کشیده شده SrcList بود، در صورت رها شدن بپذیرش.
  • رویداد OnDragDrop را برای DstList به صورت زیر بنویسید:

    IncludeBtnClick(Sender);

    رویداد OnDragDrop هنگامی رخ می دهد که کاربر یک آیتم را رها کند. این کد دقیقا همان کاری را باید بکند که به هنگام کلیک بر روی کلید < اتفاق می افتاد، پس بی دلیل آن را بازنویسی نمی کنیم.

1 2 قسمت بعد »
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫ارث بری فرم ویژوال در دلفی (2)

ارث بری فرم ویژوال در دلفی

اگر بتوانید در برنامه هایتان به طور گسترده از ارث بری فرم ویژوال (Visual Form Inheritance) استفاده کنید، مدت زمانی که صرف توسعهء نرم افزارتان می کنید کاهش یافته، ایرادات آن کمتر شده و رابط کاربر آن ظاهر پایدار و با ثبات تری پیدا می کند.

توسط sobh | 5 دی 1381 | 2328 بار مشاهده Printable Version نسخه مخصوص چاپ
پشت نقاب VFI
یکی از چیزهایی که مرا به دلفی علاقمند می کند، رو راست بودنش است. دلفی هیچ چیز را از ما مخفی نمی کند، هر کاری انجام دهیم، به کد برنامه منعکس می کند. برای اینکه بدانید VFI دقیقا چگونه کار می کند، کافی است کدی را که ابزار طراحی فرم دلفی تولید کرده بررسی کنید. اجازه بدهید با کدی شروع کنیم که با انتخاب گزینهء Copy در Object Repository تولید می شود. دوباره همان Dual list box را انتخاب می کنیم. شکل 3 تعریف کلاس ایجاد شده را نشان می دهد.

type
  TDualListDlg = class(TForm)
    OKBtn: TButton;
    CancelBtn: TButton;
    HelpBtn: TButton;
    SrcList: TListBox;
    DstList: TListBox;
    SrcLabel: TLabel;
    DstLabel: TLabel;
    IncludeBtn: TSpeedButton;
    IncAllBtn: TSpeedButton;
    ExcludeBtn: TSpeedButton;
    ExAllBtn: TSpeedButton;
    procedure IncludeBtnClick(Sender: TObject);
    procedure ExcludeBtnClick(Sender: TObject);
    procedure IncAllBtnClick(Sender: TObject);
    procedure ExcAllBtnClick(Sender: TObject);
    procedure MoveSelected(List: TCustomListBox;
      Items: TStrings);
    procedure SetItem(List: TListBox; Index: Integer);
    function GetFirstSelection(List: TCustomListBox):
      Integer;
    procedure SetButtons;
  private
    { Private declarations }
  public
    { Public declarations }
end;
شکل 3

این فقط بخش interface برنامه است. بخش implementation در اینجا نشان داده نشده. برای ما همان خط اول مهم است که تعریف کلاس باشد:

TDualListDlg = Class(Tform)

این کلاس وارث TForm است. همه چیز Dual list box در همین فایل PAS. و DFM. مربوطه اش آمده. حال شکل 4 را در نظر بگیرید. این شکل فایل PAS. مربوط به Dual list box را در حالتی نشان می دهد که گزینهء Inherit را انتخاب کرده باشیم.

unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls,
  Forms, Dialogs, DUALLIST, StdCtrls, Buttons;

type
  TDualListDlg3 = class(TDualListDlg)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  DualListDlg3: TDualListDlg3;

implementation

{$R *.DFM}

end.
شکل 4

باز خط مهم همان خط تعریف کلاس است:

TDualListDlg3 = class(TDualListDlg)

که نشان می دهد فرم جدید وارث کلاس دیگری به نام TDualListDlg است. روشن است که TDualListDlg همان فرم توی انبار است. به عبارت uses این کلاس توجه کنید، ببینید که شامل یونیت DUALLIST است. اگر دقت کنید می بینید که این یونیت در عبارت uses فایل .DPR یعنی خود پروژه هم هست:

uses
Forms,
Unit1 in 'Unit1.pas' { Form1 },
Unit2 in 'Unit2.pas' { Form2 },

DualList in '..\OBJREPOS\DUALLIST.pas' { DualListDlg },
Unit3 in 'Unit3.pas' { DualListDlg3 };

چون فرم جدیدتان وارث فرم دیگری است، پروژهء شما باید هر دو را در بر داشته باشد.

تغییراتی که در فرم خود می دهید، فقط در فایلهای PAS. و DFM. فرم خودتان منعکس می شود. برای نمونه اگر روی فرمتان جای چیزی را عوض کنید، این تغییر فقط در فایل DFM. کلاس پایین دست (کلاس شما) ثبت و ضبط می شود. در واقع فایل DFM. یک فرم پایین دست، در بر دارندهء آن ویژگیهای فرم پایین دست است که نسبت به فرم بالادست تغییر کرده. بهترین راه برای فهمیدن تغییرات بین دو فرم همین است.

برای حسن ختام این بخش نگاهی هم به ساختار خود انبار اشیاء می اندازیم. انبار اشیاء دلفی یک فایل INI. بیشتر نیست. انبار اشیاء دلفی در فایلی با نام Delphi32.DRO در زیر شاخهء bin\ شاخهء نصب دلفی نگهداری می شود. می توانید آن را با Notepad یا یک ویرایشگر متن دیگر باز کنید تا خودتان ببینید. شکل 5 بخش مربوط به Dual list box را نمایش می دهد.

[C:\PROGRAM FILES\BORLAND\DELPHI6\OBJREPOS\DUALLIST]
Type=FormTemplate
Name=Dual list box
Page=Forms
Icon=C:\PROGRAM FILES\BORLAND\DELPHI6\OBJREPOS\DUALLIST.ICO
Description=Dialog box with two list boxes. Supports moving items from one list to the other.
Author=Borland
DefaultMainForm=0
DefaultNewForm=0
Ancestor=
Designer=dfm
شکل پنج

مهمترین خط همان خط اول است. می بینید که این خط جای فایلها را روی دیسک به دلفی نشان می دهد. همهء فرمها همین جور در انبار نگهداری می شوند.

VFI در جهان واقع
مقالات فنی معمولا تصویری روشن و امید بخش از برنامه نویسی و تولید نرم افزار پیش رویتان می گذارند. همین چند کار را انجام دهید و... به بهشت برنامه نویسی خوش آمدید! در دنیای واقعی، VFI می تواند جلوی هدر رفتن وقتتان را بگیرد و برنامه هایتان را پایدارتر کند. ولی کار زیادی هم می برد. اولین باری که VFI را به کار ببرید، مدت زیادی از وقتتان صرف طراحی سلسله مراتب فرمها خواهد شد. اینجا سعی می کنم آنچه را بار اول استفاده تان از VFI پیش می آید برایتان مجسم کنم.

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

این سبک طراحی یک عملیات مکرر است. ممکن است بار اولی که از آن استفاده می کنید تغییر محسوسی در بهره وری مشاهده نکنید، ولی بعدا خواهید دید. یک مثال از کارهای خودم یادم می آید. ما یک رابط کاربری استاندارد برای ویرایش جداول بانک اطلاعاتی طراحی کردیم. تمام امکانات لازم - مانند add، delete، edit، search – را ایجاد کردیم و به کاربر اجازه دادیم هم از راه منوها و هم با دکمه های روی Coolbar به آنها دستیابی داشته یاشد. همهء کد و ظواهر مشترک را در یک کلاس در بالادست جمع کرده و آن را در تمام برنامه هایمان به کار می بردیم. فرمهای اصلی برنامه مان همه از همان فرم مشتق می شدند. از قضا کاربر ما از Coolbar خوشش نیامد و دوست داشت که جایش با یک چیز ساده تر عوض شود. ما 30 فرم را به همین صورت ساخته بودیم، ولی تمام کاری که حالا می بایست می کردیم، عوض کردن Coolbar در آن فرم کلی با یک Toolbar بود. بعد هم برنامه را کامپایل کردیم!

برتریهای واقعی VFI تازه بار دوم یا سومی که از یک طراحی خاص استفاده کنید معلوم می شود. به یاد داشته باشید که انبار اشیاء را می توانید برای به اشتراک گذاشتن فرمها بین برنامه هایتان به کار ببرید. در کار ما، مرحلهء اول طراحی برنامه تهیهء فهرست فرمهای لازم برای برنامه و شباهتهای میان آنهاست. پس از آن است که تصمیم می گیریم همان فرمهای پیش ساخته مان را به کار ببریم، آنها را کمی تغییر دهیم، یا اینکه اصلا فرمهای جدیدی بسازیم. به هر حال هیچ گاه از صفر آغاز نمی کنیم.

اگر می خواهید کار با VFI را آغاز کنید، پیشنهاد می کنم از یک فرم برای کار با بانکهای اطلاعاتی آغاز کنید. تصمیم خود را در مورد قیافه اش بگیرید، طراحی اش کنید و آن را در انبار اشیاء بگذارید. تا می توانید، و تا آنجا که می شود کدهای مشترکتان را به آن منتقل کنید. بعد فرمهای برنامه تان را از همین فرم به ارث ببرید و به آنها اطلاعات مختص جدولتان را بیافزایید. زمانی که دارید برای فرمها کد می نویسید همیشه توجه داشته باشد که اگر کد مشترکی پیدا شد، آن را به کلاسهای بالاتر ببرید. هر بخش از کد را که می نویسید، از خود بپرسید که آیا این کد مختص همین فرم است یا می شود آن را در فرمهای دیگر به کار برد. اگر کلی به نظر می رسد، حتما آن را به کلاسهای بالاتر ببرید.

خلاصه
VFI یه شما توانایی ساخت فرمهای جدید بر پایهء فرمهای موجود را فراهم می کند. VFI همان برتریهای وراثت را دارد، در نتیجه توسعهء برنامه را سریعتر و آن را استوار و متناسب تر می کند.

درک شیوهء کارکرد VFI وابسته به فهم درست مدل شیئی دلفی و بخصوص وراثت است. به نظر من یکی از قویترین امکانات دلفی است و خودم خیلی زیاد استفاده اش می کنم.

نویسنده اصلی: Rick Spence
منبع: Delphi Informant Magazine

« قسمت قبل 1 2
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫استفاده از Microsoft Agent در ویژوال بیسیک

استفاده از Microsoft Agent در ویژوال بیسیک

در این مقاله آموزشی من قصد دارم یك سری مطالب مختصر و مفید در مورد Microsoft Agent و همچنین طریقه كار كردن با آن را با استفاده از زبان VB برای شما توضیح بدم.

توسط DelphiMan | 4 بهمن 1381 | 3292 بار مشاهده Printable Version نسخه مخصوص چاپ
Microsoft Agent چیست؟
Microsoft Agent یک ActiveX است که می شه با اون یک شخصیت رو کنترل کرد تا یک سری فرمانها و صحبتهای ما رو به گوش کاربر برسونه... اگر از محصولات Office استفاده کرده باشید حتماً اون کلیپسی رو که براتون ادا در میاره دیدین... بله به اون میگن Agnet... حالا میخوایم ببینیم که چطوری میشه از اون در برنامه های خودمون استفاده کنیم.

یکی از بهترین Agentهای طراحی شده Merlin نام داره که اعمال زیادی رو براتون انجام میده و من هم خیلی بهش علاقه دارم (;

برنامه نویسی Microsoft Agent:
اول از همه شما احتیاج دارید که این ActiveX رو در فرمتون تعریف کنید، برای این کار شما ابتدا باید یک Object ایجاد کنید:

Public MyAgent As Object

خوب حالا شما باید Agent رو در Event ،Load فرمتون صدا بزنید. Agent در یک فایل acs. ذخیره میشه که باید اونو Load کنید. در زیر کدی برای صدا زدن آن آورده‌ام که البته باید به این نکته توجه کرد که فایل acs. شما میتونه تو هر شاخه دیگه باشه که میتونید قبلاً تو هاردتون Search کنید. و همچنین در کد زیر فرض شده شما ActiveX خودتون رو با نام Agent1 در فرمتون قرار دادین:

Agent1.Characters.Load "myagent", "c:\agent\Merlin.acs"
Set MyAgent = Agent1.Characters("myagent")

حالا ناراحت این نباشید که ActiveX رو ندارین در آخر مقاله آدرس جاهایی که میتونید اون رو بگیرید آورده‌ام. خوب حالا بعد از اینکه شما Object رو ساختین حالا با یک دستور به سادگی میتونید Agent رو نمایش بدین:

MyAgent.Show

بعد از این دستور Merlin نمایش داده میشه حالا چیکارش کنیم؟؟!! اگه شما Microsoft Text2Speech Engine رو تو ویندوزتون نصب کرده باشید میتونید به Agent بگین که براتون صحبت کنه. پس به طریق زیر عمل کنید:

MyAgent.Speak "Look! I can speak!"

حالا شما میتونید چند جمله مشخص کنید تا Agent براتون یکیشو بخونه (به دلخواه خودش!!!) برای اینکار میتونید از | در بین جملاتتون استفاده کنید:

MyAgent.Speak "Hello|Hi"

همچنین شما میتونید Agent خودتون رو به هر جای صفحه که خواستید ببرید برای اینکار هم میتونید اینطور بنویسید:

MyAgent.MoveTo 320, 240

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

MyAgent.Think "I'm thinking....hmm...E=MC2..Eureka!"

در ضمن یک سری دستورات برای اینکه بتونید این متن‌ها رو کنترل کنید هم وجود داره که من تو مقاله‌ای که برای دلفی نوشتم آوردم که دیگه اینجا نیاوردم، شما میتونید اون دستورات را در اینجا هم استفاده کنید.

خوب حالا طریقه کار کردن با Agent رو یاد گرفتیم حالا برای مخفی کردن اون میتونید از دستور زیر استفاده کنید:

MyAgent.Hide

تا اینجا همه چیز در مورد صحبت کردن و نمایش دادن متن بود حالا یک مقداری هم می پردازیم به حرکات و اعمال دیگر Agent که خیلی هم سرگرم کننده هست. Merlin برای اعمال زیادی حرکات خاصی داره که بسیار جالب هستند. مثلا برای Search ،Idle ،Think ،Greet ،Process و… می تونید از Merlin بخواهید که براتون ادا در بیاره ;) برای اینکار باید از دستور زیر استفاده کنید:

MyAgent.Play "animationname"

در دستور بالا بجای animationname باید نام حرکتی که میخواهید براتون انجام بده رو بیارید که برای هر Agent متفاوت هست. البته یک سری اعمال مثل اون چیزهایی که در بالا گفتم تقریبا تو همه Agentها در نظر گرفته شده. شما خودتون هم میتونید برای کار خودتون یک Agent طراحی کنید که برای اینکار می تونید از نرم‌افزارهایی که برای اینکار وجود دارند استفاده کنید مثل Microsoft Agent Character Editor که میتونید از سایت Microsoft دریافت کنید.

خوب این هم یک مقاله مقدماتی در مورد کار با MSAgent در برنامه های VB که امیدوارم برای شروع خوب بوده باشه. از اونجایی که من مخالف آموزش مطالب بصورت کامل و قدم به قدم هستم ادامه این راه جالب و سرگرم کننده را به عهده خودتون میزارم و امیدوارم که بتونید نرم افزارهای خوبی با این تکنولوژی تهیه کنید.

Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫محدودكردن تغییر اندازه فرم در دلفی

Softtool

محدودكردن تغییر اندازه فرم در دلفی

گاهی اوقات لازم است كه اندازه فرم بیش از حد مشخصی تغییر نكند؛ این یك پیشنهاد برای برطرف كردن این مشكل است.

توسط delphix | 4 بهمن 1381 | 2174 بار مشاهده Printable Version نسخه مخصوص چاپ
گاهی اوقات نیاز است فرم ما از نظر اندازه پیرو یک الگو باشد و کاربر نتواند خارج از محدوده این فرم را تغییر اندازه دهد، راهی که پیشنهاد می شود، استفاده از 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.

Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫استفاده از DLL‌ها در دلفی

استفاده از DLL‌ها در دلفی

برای استاندارد نمودن برنامه و استفاده بهینه از حافظه، استفاده از DLLها بصورت دینامیكی پیشنهاد می‌شود. در این خودآموز سعی شده در كمال سادگی مطلب عنوان شود.

توسط delphix | 8 بهمن 1381 | 2924 بار مشاهده Printable Version نسخه مخصوص چاپ
ایجاد یک 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 ها باعث پایین آمدن سرعت نمایش فرم‌ها و در عوض بالارفتن سرعت برنامه خواهد شد.

Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫نصب ProgressBar روی StatusBar در دلفی

نصب ProgressBar روی StatusBar در دلفی

گاهی اوقات علاقه داریم كه ProgressBar روی StatusBar قرارگیرد. مانند كاری كه در Internet Explorer انجام میشود. راههای مختلفی برای این كار وجود دارد اما شاید این روش یكی از ساده ترین آنها باشد.

توسط delphix | 24 بهمن 1381 | 2503 بار مشاهده Printable Version نسخه مخصوص چاپ
بتازگی بعضی از برنامه نویسان میخواهند فرمهایی شبیه فرمهای ویندوز XP بسازند که خاصیت زیبای آن قراردادن ProgressBar روی 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;

Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫نمایش میزان كپی شدن فایل با ProgressBar در دلفی

نمایش میزان كپی شدن فایل با ProgressBar در دلفی

شما در این روش ابتدا فایلی را باز كرده، اندازه آن را محاسبه و قسمت بندی می‌كنید و سپس با استفاده از آن میزان پیشرفت كار را نمایش می دهید.

توسط delphix | 24 بهمن 1381 | 2640 بار مشاهده Printable Version نسخه مخصوص چاپ
چطور میتوان زمان کپی شدن فایل را با استفاده از 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

Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫نحوه تهیه نسخه پشتیبان (Backup) در SQL Server 2000

نحوه تهیه نسخه پشتیبان (Backup) در SQL Server 2000

در این مقاله روشهای مختلف تهیه نسخه پشتیبان (Backup) و همچنین تعریف برنامه زمانبندی جهت Backup گیری اتوماتیک در زمانهای معین شرح داده شده است.

توسط Hamid | 28 بهمن 1381 | 2970 بار مشاهده Printable Version نسخه مخصوص چاپ
در SQL Server فایلهای Backup علاوه بر ساختار Database، داده ها و Object ها (Table, View, Stored Procedure, Foreign Key, Primary Key, Relation, UDF, DDF, …) را نیز شامل میشود. به عبارت دیگر با Backup گرفتن، داده های شما به صورت فیزیکی (و نه به صورت دستورات Insert) ذخیره میشود.

قبل از شروع کار توجه داشته باشید که سرویسSQL Server Agent ، Start شده باشد.

1. استفاده از Script
در این Script متغیر path حاوی مسیر، نام فایل و همچنین تاریخ، ساعت و دقیقه اجرا میباشد.

Declare @path varchar(200)

Set @path='C:\Backup\BK_' + Replace(Cast(GetDate() As char), ':', '-') + '.BAK'

BACKUP DATABASE [MyDatabaseName] TO DISK = @path WITH NOINIT,
NOUNLOAD, NAME = N'My Backup', NOSKIP, STATS = 10, NOFORMAT

سپس یک Daily, Weekly, Monthly) Job) تعریف کرده و Script فوق را در آن Job قرار میدهیم که باعث میشودScript ما به صورت متناوب اجرا شود.

2. استفاده از Wizard Backup
بر رویDatabase مورد نظر Right-Click کنید و گزینه Backup Database را انتخاب کنید تا پنجره SQL Server Backup ظاهر شود.

بر روی Add… کلیک کنید تا مسیر و نام فایل Backup را تعیین کنید.

پس ازتعیین مسیر و نام فایل Backup، بر روی OK کلیک کنید. با OK کردن نام و مسیر فایل، به پنجره قبلی بر میگردیم. در این حالت به دو صورت میتوان عمل کرد: یکی Backup گرفتن که با کلیک کردن برروی کلید OK در همان لحظه این عمل انجام میشود و دیگری تعریف Schedule یا برنامه زمانبندی جهت تکرار Backup گیری به صورت اتوماتیک.

برای تعریف Schedule بر روی Check Box کنار Schedule کلیک کنید. به محض کلیک، در Box مقابل، برنامه زمانبندی Default ظاهر میشود. حال برای تغییر برنامه زمانبندی پیش فرض بر روی کلید ... کلیک کنید تا پنجره Edit Schedule باز شود.

در این مرحله ابتدا نام برنامه زمانبندی و سپس نوع برنامه را مشخص کنید. در صورتی که تمایل دارید Back گیری به صورت منظم و در زمانهای مشخص انجام شود گزینه Recurring را انتخاب کنید. برای تغییر برنامه پیش فرض بر روی کلید Change کلیک کنید تا پنجره Edit Recurring Job Schedule ظاهر شود.

در این قسمت میتوانید دوره (ماهیانه، هفتگی و روزانه)، ساعت و بازه زمانی اجرای این برنامه زمانبندی را مشخص کنید. پس از تایید نهایی از Database شما طبق برنامه زمانبندی Backup گرفته میشود و در مسیر مشخص شده ذخیره میگردد. توجه داشته باشید که تاریخ و ساعت Backup گیری به انتهای نام فایل Backup اضافه میشود.

روش سوم تعریف Backup به صورت منظم با استفاده از تعریف یک Database Maintenance Plan میباشد که به این مبحث در مقاله بعد به طور مفصل میپردازیم.

Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫تغییر Hint برای هر ستون از DBGrid در دلفی

تغییر Hint برای هر ستون از DBGrid در دلفی

در DBGrid كار كردن بر روی هر سلول كاری مشكل و پردرد سر است چون انعطاف TGrid را ندارد. در این مقاله سعی کرده‌ام شما را با راه حل این مشل آشنا كنم.

توسط delphix | 7 اسفند 1381 | 3103 بار مشاهده Printable Version نسخه مخصوص چاپ
ابتدا باید یک عنصر جدید مبتنی بر 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;

همه کارها انجام شد. حالا شما میتوانید نتیجه را مشاهده کنید.

Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫ارسال (Upload) فایل به سرور در ASP.NET

Softtool

ارسال (Upload) فایل به سرور در ASP.NET

چگونگی ارسال فایل به سرور از طریق ASP.NET.

توسط MahdiDotNET | 23 اسفند 1381 | 3087 بار مشاهده Printable Version نسخه مخصوص چاپ
در بسیاری از Web Applicationها نیاز به ایجاد امکان Upload فایل به سرور به صورت کنترل شده و بدون نیاز به برقراری دسترسی از طریق FTP و... می باشد. انجام این کار در ASP.NET بسیار ساده است. در این مقاله سعی شده است از دیدگاه کاربردی و نه آزمایشگاهی به این مطلب نگریسته شود. به طوری که کلیه مراحل جهت ذخیره فایل روی Remote Server می باشد و نه Localhost.

کدنویسی شامل دو قسمت می باشد:
  • کدهای مربوط به Presentation Layer و یا همان صفحات aspx. که مورد مشاهده کاربر قرار می گیرد.
  • کدهای مربوط به Business Login Layer که همان Code Behind و Handlerهای صفحه می باشند که در این مقاله به زبان VB.NET نوشته شده است.
برای این کار ابتدا بایستی یک وب فرم درون Application خود ایجاد کرده سپس در درون تگ <form> تگ زیر را اضافه کنید:

<input id="filename" type="file" runat="server">

ویژگی type="file" نشاندهنده این است که ما با یک فیلد معمولی متنی سر و کار نداریم.

دو نکته مهمی که باید در اینجا مدنظر قرار گیرند عبارتند از:
  • فراموش نکنید که ویژگیهای runat="server" و enctype="multipart/form-data" حتما در تگ <form> تنظیم شوند.
  • تگ <input> شما نیز باید خاصیت runat="server" را داشته باشد تا بتوانیم از طریق ASP.NET آن را کنترل کنیم.
قرار دادن تگ <input> در صفحه شما یک فیلد متنی و یک دکمه ...Browse برای شما ایجاد می کند که با کلیک کردن روی آن پنجره ای جهت انتخاب فایل از روی سخت دیسک شما باز می شود و پس از انتخاب فایل و تایید مقدار Value فیلد متنی با مسیر فایل روی سخت دیسک شما جایگزین می شود.

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

<asp:Button id="UploadButton" runat="server" Text="Upload" />

در حال حاضر صفحه Presentation آماده است و بایستی در Code Behind صفحه و یا Block Script رویداد کلیک روی دکمه Upload را کنترل نماییم. (ما در اینجا از Code Behind استفاده کرده ایم و تنها قسمت مربوط به Event Handling ذکر شده اما در فایل ضمیمه مقاله کل Code Behind را می توانید بیابید)

Private Sub UploadButton_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles UploadButton.Click
 If Not (filename.PostedFile.FileName.Length = 0) Then
    Dim ServerPath As String = "C:\YourWebSite\YourFolder" &
Mid(filename.PostedFile.FileName, InStrRev(filename.PostedFile.FileName, "\",
-1, 1), filename.PostedFile.FileName.Length)
    filename.PostedFile.SaveAs(ServerPath)

    filename.Visible = False
    UploadButton.Visible = False
    lblError.Visible = False
    lblSendMessage.Visible = True
    lblSendMessage.Text = "فایل شما به سرور منتقل شد.";
  Else
    lblError.Visible = True
  End If
End Sub

کد بالا پیچیدگی چندانی ندارد اما جهت رفع هرگونه ابهام برخی قسمتهای آن را توضیح می دهیم: در حلقه شرطی ابتدا خاصیبت PostedFile که به فایل مورد انتقال اشاره می کند مورد بررسی قرار می گیرد و چنانچه طول نام فایل برابر صفر نباشد (یعنی فایلی انتخاب شده باشد) آنگاه با استفاده از متد SaveAs فایل را روی سرور ذخیره می کند. نکته ای که این جا مطرح است این است که با استفاده از توابع Mid و InStrRev تنها قسمت انتهایی مسیر فایل روی سخت دیسک شما (یعنی \filename.ext) دریافت شده و به انتهای مسیر فیزیکی Server شما می چسبد تا فایل مزبور با همان نام روی Server ذخیره شود. شما می توانید مسیر فیزیکی سرور خود را با ساختن یک فایل ساده مثل ShowPath.aspx و قرار دادن دستور زیر پیدا کنید.

<% Response.Write(Server.MapPath("ShowPath.aspx")) %>

چنانچه شما فایلهای ضمیمه این مقاله را بررسی کنید خواهید دید که چندین Label Control جهت اطلاع رسانی به کاربر جهت انتخاب فایل پیش از کلیک بر روی دکمه Upload و نیز پس از ارسال فایل قرار داده شده است. ویژگی Visible که در این قسمتها مورد استفاده قرار گرفته است باعث می شود تا پیغام فوق تنها در زمان مقتضی نمایش و حتی فرمها نیز پس از ارسال محو شوند.

نکته دیگری که بایستی حتما مد نظر قرار دهید این است که مقدار maxRequestLength را که در واقع حجم فایل ارسالی را محدود می کند تنظیم کنید. برای این کار در فایل web.config خود و در قسمت <system.web> تگ زیر را اضافه کنید:

<httpRuntime maxRequestLength="50000" />

عدد فوق بر حسب بایت می باشد و در این مثال حجم فایل ارسالی حداکثر 50 کیلوبایت در نظر گرفته شده است. چنانچه شما می خواهید در این زمینه نیز محدودیتی را برای کاربران خود اعمال کنید بایستی در یک حلقه شرطی ویژگی filename.PostedFile.ContentLength را نیز کنترل کنید.

فایل‌های مرتبط

  • برنامه نمونه (3 کیلوبایت)
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫نشان دادن قابلیت‌های مرورگر در ASP.NET

نشان دادن قابلیت‌های مرورگر در ASP.NET

در این مقاله با چگونگی تشخیص قابلیت‌های مرورگر توسط ASP.NET آشنا خواهید شد.

توسط shaho | 5 فروردین 1382 | 1573 بار مشاهده Printable Version نسخه مخصوص چاپ
اگرچه در حال حاضر جنگ مرورگرها تقریبا تمام شده است اما این موضوع دلیلی بر شناخته نشدن قابلیتهای مرورگرها نیست. در اینجا توانایی 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:
نسخه اصلی مرورگر را نشان می دهد. بعنوان مثال در IE 5.1 عدد 5 نشانگر نسخه اصلی است.

MinorVersion:
نسخه جزیی (کوچکتر) مرورگر را نشان می دهد. بعنوان مثال در IE 5.1 عدد 1 نشانگر نسخه جزیی است.

Type:
نوع و نسخه مرورگر را بصورت یک رشته بازمیگرداند.

VBScript:
نشان می دهد که مرورگر VBScript را ساپورت می کند یا نه.

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

در زیر نمونه کامل یک مثال آورده شده است:

<%@ page language="VB" %>
<%@ Import Namespace="System.Web" %>
<html>
  <head>
     <title>HTTPBrowserCapabilities Demo</title>
  </head>

  <body>
    <%
    Dim browserObj As HTTPBrowserCapabilities
    browserObj = Request.Browser
    %>

  Your browser supports ActiveX controls: <%=browserObj.ActiveXControls %><br />
  Your browser type: <%=browserObj.Type %><br />
  Your browser version: <%=browserObj.Version%><br />

  ... Add any other property that you would like to display.

  </body>
</html>

Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫جلوگیری از حملات SQL Injection در ASP.NET

Softtool

جلوگیری از حملات SQL Injection در ASP.NET

در قسمت اول این مقاله به توضیح SQL Injection و نحوه مقابله با آن در ASP.NET و در پایگاه داده Access پرداخته می شود.

توسط MahdiDotNET | 22 فروردین 1382 | 3264 بار مشاهده Printable Version نسخه مخصوص چاپ
در این مقاله فرض شده است که خواننده با اصول اولیه زبان پرس و جوی ساخت یافته (Structured Query Language) یا همان SQL آشنا است. در ضمن کدهای موجود در این مقاله تماما به زبان VB.NET می باشند

یک حمله SQL Injection چیست؟
حتما در فیلمهای سینمایی دیده اید که بسیاری از تبهکاران قربانیان خود را با تزریق مواد سمی به جای دارو از میان بر می دارند. آیا در دنیای سایبر نیز چنین ایده هایی وجود دارد؟ در کمال تعجب باید بگویم که بله!! هکرها هم به نوعی از این شگرد استفاده می کنند. می گویید چگونه؟ با تزریق کردن دستورات SQL مورد علاقه خود به Application شما! اجازه دهید تا با یک مثال مطلب را روشن تر کنم:

سیستم Login:
صفحات Login معمولا دارای فیلدهایی هستند که دو مقدار ID و Password را از کاربر گرفته و سپس با استفاده از یک دستور SQL آن را پردازش می کنند. نمونه ساده ای از این دستور به صورت زیر است:

SELECT COUNT(UserID) FROM tblUsers WHERE UserID='" & UserID.Text & "' AND Pass='" & Password.Text & "'"

در این مثال UserID و Password دو کنترل TextBox هستند که مقادیر آنها بایستی مورد پردازش قرار گیرد. حال فرض می کنیم کاربر مقادیر را به صورت mahdi و 123 وارد نماید، در این صورت جمله SQL به صورت زیر تولید می شود:

SELECT COUNT(UserID) FROM tblUsers WHERE UserID='mahdi' AND Pass='123'

خوب تا اینحا مشکلی وجود ندارد. حال فرض کنید که هکر ما به جای کلمه کاربری خود عبارت زیر را وارد نماید:

' OR 1=1 –

در این صورت عبارت SQL زیر تولید خواهد شد:

SELECT COUNT(UserID) FROM tblUsers WHERE UserID='' OR 1=1 – AND PASS=''

احتمالا می دانید که کاراکتر - در SQL علامت توضیحات است و عبارت پس از آن دیگر پردازش نمی شود لذا هنگام پردازش دستور چون همواره 1=1 است و با توجه به OR به کار رفته، بدون توجه به خالی بودن مقدار مقابل UserID 1=1 کافی تلقی شده و کلیه رکوردهای بانک اطلاعاتی برگردانده می شود و Attacker اصطلاحا Authenticate می شود.

پیش از آنکه به ارائه راه حل این حفره امنیتی خودساخته بپردازیم این نکه شایان ذکر است که این حملات در پایگاه اطلاعاتی SQL Server بسیار پیچیده تر است که در قسمت دوم مقاله مورد بررسی قرار خواهد گرفت.

چاره کار!
ساختار شی گرای ASP.NET و امکانات این ساختار به برنامه نویسان امکان مانور بیشتری را داده است. حال ما کد کامل اصلاح شده را در زیر آورده و سپس توضیحات آن را ذکر می کنیم:

Dim strSQL As String = "SELECT COUNT(UserID) FROM tblUsers WHERE
UserID=@UserID AND Password=@Password"
Dim cmndCheck As OleDbCommand = New OleDbCommand(strSQL, _Connection)

cmndCheck.Parameters.Add("@UserID", UserID.Text);
cmndCheck.Parameters.Add("@Password", Password.Text);
cmndCheck.Connection.Open()
Dim IsValid As Integer = cmndCheck.ExecuteScalar()

If IsValid > 0
    '... Some Code here... User is authenticated
Else
    '... Some Code here... User is not aututorized to view the page
End If

تغییر در همان خط اول یعنی دستور SQL مشخص است این بار به جای اینکه مقادیر دریافتی از فیلدها با Single Quote به خورد پردازشگر دستور داده شود مقادیر با پارامترهای تولید شده توسط آبجکت OleDbCommand جایگزین می شود و در آخر cmndCheck پردازش شده چنانچه مقدار تولید شده توسط ExecuteScalar بزرگتر از صفر باشد بدین معنی است که حداقل یک رکورد با شرایط مورد نظر ما پیدا شده است. (متغیر Connection_ که باید برابر ConnectionString شما قرار گیرد دانسته فرض شده است)

تقاوت اصلی این روش نسبت به روش ناامن قبلی این است که در اینجا مقادیر به صورت کاملا" پارامتری شده پردازش می شوند نه به صورت قطعاتی از یک رشته حرفی که در واقع دام اصلی SQL Injection به شمار می آید. در واقع ما در اینجا از تکنیکهای رشته سازی با استفاده از & یا + اجتناب کرده ایم.

نکته مهم دیگری که باید حتما مورد توجه قرار دهید این است که یکی از راههایی که هکرها برای حمله به سایت شما استفاده می کنند خطاسازی صوری در زمان اجرای Application و مطالعه اطلاعات خطای دریافت شده است. برای جلوگیری از این اتفاق که می تواند ساختار بعضی از قسمتهای کد شما را برای حمله کنندگان آشکار کند حتما در Application خود از روال خطایابی Customize شده استفاده کنید. علاوه بر این می توانید در بسیاری از قسمتها به صورت موردی از Try...End Try استفاده کنید و برای اطلاع خودتان از خطای رخ داده e As OleDbException را به آدرس Email خود ارسال کنید که در این مورد در فرصتی دیگر صحبت خواهم کرد.

این مثال و راه حل یکی از ساده ترین انواع حملات Injection روی Web Applicationهاست و شما می توانید نمونه ها و مثالهای متعددی در این خصوص را در سایتهای www.sqlsecurity.com و www.nextgenss.com پیدا کنید که چنانچه گفته شد (و در قسمت دوم این مقاله بدان پرداخته خواهد شد) بیشتر مربوط به SQL Server است. روش کلی کار در SQL Server نیز کمابیش مشابه همین روش است با این تفاوت که در آنجا از Stored Procedure استفاده می شود. پس منتظر قسمت دوم این مقاله و تکنیکهای پیشرفته تر Hackerها در نفوذ به بانک اطلاعاتی SQL Server یک برنامه نویس ناشی و روش اجتناب از آن باشید ;-)

توضیح: برخی قسمتهای این مقاله از مقاله "از بانک اطلاعاتی خود دفاع کنید" نوشته Beth Breidenbach چاپ شده در شماره 9 (نوامبر/دسامبر 2002) مجله asp.netPRO اقتباس شده است.

سایت‌های مرتبط

  • SQLSecurity.com
  • NextGenSS.com
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫ارسال ایمیل در ASP.NET با استفاده از HTML Template

ارسال ایمیل در ASP.NET با استفاده از HTML Template

شاید شما تاکنون مقالات بسیاری در خصوص ارسال Email در ASP.NET دیده باشید. ضعف اغلب این مقالات در این است که تنها به ذکر ساده ترین نوع ارسال Email بسنده میکنند. در این مقاله شما روش ساختن یک خبرنامه HTML ساده را خواهید آموخت.

توسط MahdiDotNET | 30 فروردین 1382 | 4271 بار مشاهده Printable Version نسخه مخصوص چاپ
آیا تاکنون سعی کرده اید برای سایت خود خبرنامه ایجاد کنید؟ آیا تاکنون وسوسه شده اید که سیستمی طراحی کنید که در صورتی که بینندگان سایت شما نظرات خود را در سایت شما وارد کنند برای آنها یک Email تشکرآمیز ارسال کنید؟ آیا می دانید ساختن یک HTML Template زیبا برای خبرنامه شما و استفاده همیشگی از آن جهت ارسال خبرنامه در ASP.NET بسیار ساده صورت می گیرد؟ آیا تاکنون سیستم نظرخواهی سایت Weblog.iProDev.NET را امتحان کرده و Email تشکر آن را دریافت کرده اید؟

چنانچه سوالات بالا شما را به دانستن بیشتر ترغیب کرده است به شما تبریک می گویم! چرا که در ادامه این مقاله شما روش بسیار ساده ارسال 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 سرور خود رجوع کنید.

Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫تاریخچه زبان دلفی

تاریخچه زبان دلفی

تاریخچه مختصری از زبان دلفی از زمان پیدایش تا دلفی 6 به تفکیک نسخه‌های مختلف آن.

توسط MehranBalaei | 11 اردیبهشت 1382 | 5781 بار مشاهده Printable Version نسخه مخصوص چاپ
دلفی در واقع یک کامپایلر پاسکال است. دلفی 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 تبدیل شده است.

منبع: Borland Delphi Developer's Guide, Essentials of Rapid Development Advanced Techniques

سایت‌های مرتبط

  • سایت رسمی Delphi
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫موارد استفاده از DataReader و DataSet در ASP.NET

Softtool

موارد استفاده از DataReader و DataSet در ASP.NET

شاید تا به حال بارها با این مسئله که در برنامه تحت وب نوشته شده خود با ASP.NET برای دستیابی به اطلاعات یک Database از DataSet استفاده کنید یا DataReader مواجه شده باشید. ولی براستی کدام انتخاب بهتر است؟

توسط shahabfar | 17 اردیبهشت 1382 | 2821 بار مشاهده Printable Version نسخه مخصوص چاپ
شاید تا به حال بارها با این مسئله که در برنامه تحت وب نوشته شده خود با ASP.NET برای دستیابی به اطلاعات یک Database از DataSet استفاده کنید یا DataReader مواجه شده باشید. گاها" در بعضی از مقالات مشاهده می شود که به تعریف و تمجید از DataReader در مقابل DataSet پرداخته شده است و در بعضی مقالات نیز استفاده از DataSet توصیه شده است.

اما واقعیت اینست که مایکروسافت این دو کلاس دستیابی داده را بوجود آورده چرا که به هر دوی آنها نیاز بوده است. هر کدام از این دو کلاس دارای نقاط ضعف و قوتی می باشند که با توجه به حالتی که در برنامه با آن مواجه هستیم، باید هر یک از این دو کلاس را در جایی مناسب مورد استفاده قرار دهیم.

در این مقاله سعی بر آن است تا با در نظر گرفتن حالتهای مختلف استفاده از داده های یک Database، راهکاری مناسب برای استفاده از DataSet یا DataReader معرفی شود. نکته حائز اهمیت در این مقاله اینست که بحث بر روی استفاده از DataSet یا DataReader در بازهء برنامه های تحت وب صورت می گیرد و فرض بر این است که خوانندگان گرامی دارای آشنایی اولیه با این دو کلاس باشند.

در چه مواقعی باید از کلاس DataReader استفاده کرد؟
موارد زیر بیان کننده حالاتی است که استفاده از DataReader در مقابل DataSet ترجیح داده می‌شود.
  • هنگامی که داده مورد استفاده می بایست همیشه جدید باشد. پس بنابراین در هر زمان که به داده مورد نظر نیاز باشد باید مستقیما" از Database فراخوانی شود.
  • هنگامی که به هر ردیف از داده ها بطور معمول و ساده‌ای نیاز باشد. مانند پر کردن یک وب کنترل مثل DataGrid یا DropDownList.
  • هنگام دستیابی یکطرفه و فقط خواندنی به داده‌های از نوع XML. در این حالت میتوان از متد ExecuteXmlReader برای بدست آوردن کلاس XmlReader که همانند DataReader عمل میکند، استفاده کرد.
  • هنگامی که قصد دارید چندین درخواست تکراری برای دریافت قسمت کوچکی از اطلاعات Database داشته باشید.
در چه مواقعی از کلاس DataSet باید استفاده کرد؟
موارد زیر حالاتی را نشان می دهد که استفاده از DataSet در مقابل DataReader توصیه می‌شود.
  • هنگامی که سرویس وبی ساخته‌اید که مقدار برگشتی آن داده‌های برگرفته شده از Database می‌باشد. همانطور که می‌دانید اطلاعات بین وب سرویس و برنامه‌ای که از وب سرویس استفاده می‌کند بصورت داده‌های XML انتقال می‌یابد. از این رو با توجه به اینکه DataReader ارتباط با Database را در خود حفظ می‌کند، لذا نمی‌تواند بصورت داده‌های Serialize ،XML شود.
  • هنگامی که نیاز به فیلتر کردن و یا مرتب‌سازی داده‌ها باشد.
  • هنگامی که نیاز به ایجاد حلقه تکرار در داده‌ها باشد. مثلا" هنگامی که می‌خواهید از یکسری دادهء مشابه در بیش از یک سرور کنترل استفاده کنید. DataReader تنها برای استفاده در یک سرور کنترل بکار میرود در حالی که DataSet اینگونه نیست.
  • هنگامی که نیاز به ذخیره اطلاعاتی باشد که بعدا" مورد استفاده مجدد قرار خواهد گرفت. میتوان یک DataSet را براحتی در یک Session یا Application ذخیره کرد.
  • هنگام ارتباط دو طرفه با داده‌های XML. با استفاده از DataSet براحتی میتوان داده‌های یک فایل XML را خوانده و دوباره آنها را در قالب داده‌های XML در یک فایل ذخیره کرد.
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫استفاده از اکتیوایکس‌های server-side در ساخت صفحات ASP

استفاده از اکتیوایکس‌های server-side در ساخت صفحات ASP

در این درس روش ایجاد کلاسهای ActiveX که بتوان از آنها در صفحات ASP استفاده نمود، آموزش داده می شود.

توسط sheidaian | 17 اردیبهشت 1382 | 3275 بار مشاهده Printable Version نسخه مخصوص چاپ
با قراردادن کدهای ASP درون Componentهای server-side، برنامه نویس نه تنها می تواند از قابلیت‌های ویژوال بیسیک در نوشتن کدهای خود استفاده کند، بلکه سرعت Load صفحات ASP وی نیز افزایش می یابد. همچنین این روش راهکاری برای کپسوله سازی و حفاظت از کدهای ASP می باشد. در این درس یک نمونه اکتیویکس server-side را توسط ویژوال بیسیک ایجاد نموده و از آن در صفحات ASP استفاده خواهیم کرد.

اجزای Server-Side
اکتیواکس‌های server-side بر خلاف اکتیواکس‌های client-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)

End Sub

زمانیکه کاربر یک صفحه ASP را که شامل شیئی از کلاس ما باشد فراخوانی کند، SciptingContext ،IIS را به شی ما پاس می دهد. 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)
   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")
   Response.Write("You Entered :" & MyTempVar)
%>

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

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

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

Public Sub OnEndPage()
   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”)
%>

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

<%
   ObjReference.MyMethod()
%>

Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫استفاده از +COM در ساخت صفحات ASP

استفاده از +COM در ساخت صفحات ASP

در این مقاله با تکنولوژی +COM آشنا شده و روش بکارگیری این تکنولوژی در صفحات ASP را خواهید آموخت.

توسط sheidaian | 9 خرداد 1382 | 2629 بار مشاهده Printable Version نسخه مخصوص چاپ
+COM چیست ؟
روشی که برای دسترسی به Object های ASP در مقاله قبلی بیان شد تا IIS 3.0 استفاده می شد. این روش استفاده از متدهای OnStart و OnEnd بود. البته گرچه هنوز این روش از سوی IIS ورژن ۵ پشتیبانی می شود اما دارای یک مشکل است: اگر بخواهید از یک کلاس در کلاس دیگری استفاده کنید نمی توانید در کلاس مورد استفاده، دو متد ذکر شده را قرار دهید و بنابراین به اشیای ASP دسترسی نخواهید داشت.

راه حلی که برای این مشکل ارائه شده است تکنولوژی +COM می باشد. بطور خلاصه در این تکنولوژی شیی به اسم ObjectContext وجود دارد که از طریق آن می توانید به اشیای ASP دسترسی داشته باشید.

برای استفاده از تکنولوژی +COM ابتدا از منوی References ،Project را انتخاب کرده و مورد 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()
  Dim objCtx As ObjectContext
  Set objCtx = GetObjectContext
  Set Request = objCtx.item("Request")
  Set Response = objCtx.item("Response")
  Set Server = objCtx.item("Server")
  Set Session = objCtx.item("Session")
  Set Application = objCtx.item("Application")
End Sub

اکنون میتوانید از این اشیاء دقیقا" مانند مثال ذکر شده در مقاله قبل استفاده کنید.

Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫نكات مفید كار در محیط دلفی

نكات مفید كار در محیط دلفی

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

توسط DelphiMan | 17 خرداد 1382 | 5300 بار مشاهده Printable Version نسخه مخصوص چاپ
محیط دلفی برای برنامه نویسی یکی از بهترین محیطهای برنامه نویسی است گذشته از کارکرد داخلی و کمپایلر آن که بسیار قوی و سریع است، محیط آن یعنی 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 را بزنید. در اینحالت اگر روی کد تابع باشید به قسمت تعریف آن خواهید رفت.

Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫ایجاد کلاسی برای کار با فایلهای XML در ویژوال بیسیک

ایجاد کلاسی برای کار با فایلهای XML در ویژوال بیسیک

هدف از این مبحث ایجاد یک کلاس مقدماتی برای خواندن داده ها از فایلهای XML می باشد. توجه داشته باشید که کلاسی که در این بخش معرفی می شود کلاسی ساده می باشد که فقط با آن می توان مقدار یک گره (Node) از در فایل XML را خواند.

توسط sheidaian | 14 تیر 1382 | 2680 بار مشاهده Printable Version نسخه مخصوص چاپ
مقدمه:
XML یک زبان نشانه‌ای توسعه پذیر (eXtensible Markup Language) است که در سال 1998 توسط کنسرسیوم وب جهانی W3C ایجاد شد. XML واقعا" یک زبان نیست بلکه یک متا-زبان است و برای توصیف سایر زبانها بکار می‌رود. داده‌ها در فایلهای XML براحتی قابل تعریف و استفاده هستند.

مثالی از یک فایل XML:

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

هدف از این مبحث، ایجاد یک کلاس مقدماتی برای خواندن داده‌ها از فایلهای XML می باشد. توجه داشته باشید که کلاسی که در این بخش معرفی می شود کلاسی ساده می باشد که فقط با آن می توان مقدار یک ند (Node) موجود در فایل XML را خواند. در صورت نیاز، می توانید خودتان متدهای دیگری را به آن اضافه کنید. برای این منظور نکاتی در انتهای این مبحث آورده شده است.

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

Private xml

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

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

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

Public Function getvalue(ByVal NName As String) As String
   Dim x
   getvalue = ""

   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 قرار دادن پارامترهای اتصال به بانک اطلاعاتی را در فایل XML و خواندن آنها در زمان Initiate کردن ADODB برای اتصال به بانک اطلاعاتی است:

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

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

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

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

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)
   Set thisChild = root.childNodes(i)
   name = thisChild.childNodes(0).Text
   id = thisChild.childNodes(1).Text
Next

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

Dim newuser, newname, newid
Set newuser = xml.createNode("element", "people", "")
Set newname = xml.createNode("element", "name", "")
Set newid = xml.createNode("element", "id", "")

newname.text = yourname
newid.text = yourid
newuser.appendChild(newname)
newuser.appendChild(newid)
root.appendChild(newuser)

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

xml.save(Server.Mappath(filename))

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

For i = (root.childNodes.length - 1) TO 0 STEP -1
   Set thisChild = root.childNodes(i)
   name = thisChild.childNodes(0).Text

   If name = searchname Then
      root.removeChild(thisChild)
   End If
Next

در انتها نیز فایل XML را ذخیره کنید.

Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫آرایه‌ها در دلفی

Softtool

آرایه‌ها در دلفی

در این مقاله شما با ساختارهای مختلف آرایه‌ها، فضادهی آرایه‌های چند بعدی و فشرده سازی آرایه‌ها در پاسکال شیئ آشنا می‌شوید.

توسط Delphijon | 11 مرداد 1382 | 2552 بار مشاهده Printable Version نسخه مخصوص چاپ
دلفی به ما امکان می دهد آرایه‌هایی از هر نوع متغییری را ایجاد کنیم. برای تعریف آرایه به صورت زیر عمل میکنیم:

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);

Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫اضافه کردن تصویر به پایگاه داده

اضافه کردن تصویر به پایگاه داده

در این مقاله سعی بر آن است که توضیح کوتاهی در رابطه با اضافه کردن تصاویر به پایگاه داده SQL Server 2000 داده شود.

توسط ghasempoor_m | 17 مرداد 1382 | 4292 بار مشاهده Printable Version نسخه مخصوص چاپ
در بسیاری مواقع ما نیاز به افزودن تصویر به پایگاه داده داریم. از آنجایی که دسترسی به فایلهای موجود در سرور جهت استفاده هکرها بسیار سهل الوصول است، برخی مواقع نمی‌توانیم اطلاعات حساس را در قالب فایلهای تصویری در سرور ذخیره کنیم. به همین جهت بهتر آن است که در قالب نوع داده image در بانک اطلاعاتی ذخیره شود.

در این قسمت موارد زیر بررسی می شوند:
  • بررسی پیش نیازهای اضافه نمودن فایل تصویری
  • کار با شیء Stream
  • پیدا کردن اندازه و نوع تصویری که آپلود می شود
  • چگونگی استفاده از متد InputStream

بررسی پیش نیازهای اضافه نمودن فایل تصویری
دو مورد اصلی که قبل از شروع آپلود نیاز داریم عبارتند از:

  • - تنظیم خاصیت enctype فرم مربوطه (در برچسبForm) به enctype="multipart/form-data"
    - داشتن <input type=file> که به کاربر اجازه انتخاب فایل مورد نظرش را می دهد. (فایلی که در پایگاه داده باید ذخیره شود) و یک Submit button جهت اجرای عملیات مربوط به آپلود کردن فای
    - استفاده از فضانام System.IO جهت سروکار داشتن با شیء Stream

  • سه پارامتر بالا در یک صفحه 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 و تکرار آن برای همه ردیفهاست. قبل از نمایش تصویر، نوع آن هم مشخص می شود.

منابع

  • Inserting Images to SqlServer in ASP.NET
  • Retrieving Images from SqlServer in ASP.NET
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫مدیریت حافظه در دلفی

مدیریت حافظه در دلفی

گاهی مواقع شاید شما احتیاج داشته باشید خوتان مستقیما به حافطه دسترسی داشته باشید و آنرا کنترل کنید. در این مقاله نگاهی به مدیریت حافظه در دلفی و همچنین حافظه‌های Heap و Stack خواهیم داشت.

توسط Delphijon | 27 مرداد 1382 | 3786 بار مشاهده Printable Version نسخه مخصوص چاپ
تخصیص خودکار حافظه
وقتی شما از نوع‌های پایه (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 می باشد. این بدان معناست که آخرین حافظه شیء شما تخصیص داه خواهد شد و سپس حذف می شود. حافظه پشته در روتین‌های نوعی استفاده می‌شود. وقتی شما یک روتین را صدا میزنید، پارامترهایش و روتین نوع آن در پشته ریخته می شود. همچنین پارامترهایی که در یک روتین تعریف میشوند، در پشته ذخیره میشوند و وقتی روتین خاتمه پیدا می کند تمام آنها به طور خودکار از بین می رود.

Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫بدست آوردن مشخصات سیستم در VB.NET

Softtool

بدست آوردن مشخصات سیستم در VB.NET

این مقاله شامل ترفندهایی جهت بدست آوردن مشخصات سیستم مانند نام ماشین، ورژن سیستم عامل و همچنین کاربردهای آنهاست.

توسط HosseinGates | 5 شهریور 1382 | 3726 بار مشاهده Printable Version نسخه مخصوص چاپ
در این مقاله به بررسی روشهایی پرداخته میشود که به کمک آن می‌توان چند مشخصه از مشخصات سیستم را بدست آورد و از آنها در برنامه‌های کاربردی خود استفاده کرد. این ویژگیها با استفاده از فضانام System.Environment بدست می آیند. کلاس Environment شامل اطلاعاتی در مورد محیط کار و پلات‌فرم حاضر روی سیستم و همچنین وسایلی در این زمینه می باشد. این کلاس نمی‌تواند به ارث برده شود.

نام ماشین (MachineName):
به کار بردن خصوصیت MachineName از این کلاس نام NetBIOS کامپیوتر مربوطه را برمی‌گرداند. با بکار بردن کد زیر در رویداد کلیک یک Button می‌توان نام ماشین را در یک جعبه متن نمایش داد:

TextBox1.Text = System.Environment.MachineName.ToString

ورژن سیستم عامل (OSVersion):
با استفاده از خصوصیت OSVersion می‌توانید ورژن سیستم عامل کامپیوتر کاربر را شناسایی کنید. برای مثال با بکار بردن کد زیر روی ویندوز ایکس پی، عدد 5.1.2600 به عنوان نتیجه برگردانده میشود.

TextBox1.Text = System.Environment.OSVersion.ToString

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

دایرکتوری سیستم (SystemDirectory):
خصوصیت SystemDirectory، نام دایرکتوری سیستم کاربر را برمی‌گرداند. من با اجرای این کد در کامپیوترم نتیجهء F:\WinNT\System32 را گرفتم. (ویندوز ایکس پی من روی درایو F نصب شده است).

TextBox1.Text = System.Environment.SystemDirectory.ToString

نام دامنه (UserDomainName):
این خصوصیت نام دامنه شبکهء کامپیوتر میزبان را اعلام میکند. مقدار این خصوصیت به طور معمول همان نام کامپیوتر میزبان است. برنامه شما باید تحت ویندوز ان تی 3.1 و یا بالاتر از به اجرا درآید؛ درغیراینصورت یک استثناء برپا خواهد شد (PlatformNotSupportedException).

TextBox1.Text = System.Environment.UserDomainName.ToString

نام کاربر (UserName):
مقدار خروجی این خصوصیت نام کاربری شخصی است که به سیستم وارد شده است. این خصوصیت می‌تواند جهت شناسایی کاربر حاضر در سیستم به کار گرفته شود و از آن برای کنترل دسترسی به برنامه و اهداف امنیتی بهره برد. از دیگر کاربرد‌های این خصوصیت، سفارشی کردن برنامه برای هر کاربر است.

TextBox1.Text = System.Environment.UserName.ToString

ورژن CLR ‏(Version):
این خصوصیت نگارش زبان معمول زمان اجرا (Common Language Runtime) را برمی‌گرداند.

TextBox1.Text = System.Environment.Version.ToString

TickCount:
این ویژگی یکی از ویژگیهای جالب ویندوز است که کاربردهای فراوانی دارد. این خصوصیت یک عدد 32 بیتی را برمی‌گرداند که نشان دهندهء زمانی است (بر حسب میلی ثانیه) که از روشن شدن سیستم میگذرد. این مقدار از تایمر سیستم گرفته میشود و در یک متغیر عددی 32-بیتی علامتدار ذخیره میشود. با توجه به اینکه این مقدار 32 بیت طول دارد، بنابراین اگر سیستم شما 24.9 روز روشن بماند، این مقدار صفر شده و ازنو شروع به شمردن میکند. دقت کنید این خصوصیت نمی تواند کمتر از 500 میلی ثانیه باشد. با بکار بردن کد زیر میتوان این مقدار را در یک جعبه متن نمایش داد:

TextBox1.Text = System.Environment.TickCount.ToString

از جمله کاربردهای خصوصیت TickCount میتوان به محدود کردن زمان استفاده از کامپیوتر توسط کاربر اشاره کرد که میتواند کاربردهای فراوانی داشته باشد.

نکته: توجه داشته باشید که TickCount با Tick تفاوت دارد. Tick عددی است با وقفه های به مدت 100 نانو ثانیه که شامل مدت زمانی است که از ساعت 12:00am مورخ 1/1/0001 میگذرد. این خصوصیت را میتوانید با استفاده از System.DateTime.Now.Ticks بدست بیاورید.

فایل‌های مرتبط

  • برنامه نمونه (8 کیلوبایت)
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫برسی کوکی‌ها (Cookies) و جلسات (Sessions) در ASP.NET

برسی کوکی‌ها (Cookies) و جلسات (Sessions) در ASP.NET

در این مقاله با کوکی‌ها و جلسات آشنا شده و نحوه عمل و بکارگیری آنها در ASP.NET را یاد خواهید گرفت.

توسط kiumars | 12 شهریور 1382 | 3433 بار مشاهده Printable Version نسخه مخصوص چاپ
در این مقاله ابتدا به بررسی کوکی‌ها (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ها باید به نکات زیر توجه کنید:
  • هر Session اگر کاریر مرورگر را ببندد یا 20 دقیقه از سرور درخواست نکند از بین می رود.
  • Session هر کاربر جدا از Session بقیه کاربران است.
  • در 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>

Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫انواع روشهای انتقال مقادیر بین فرمهای وب در ASP.NET

انواع روشهای انتقال مقادیر بین فرمهای وب در ASP.NET

در این مقاله با سه روش QueryString، متغیرهای Session و متد Server.Transform برای انتقال مقادیر بین فرم‌های وب آشنا خواهید شد.

توسط ehsan_valizadeh | 18 شهریور 1382 | 3382 بار مشاهده Printable Version نسخه مخصوص چاپ
فرمهای وب ASP.NET، مدل برنامه‌نویسی رویدادگرای شگرفی را برای توسعه‌گران فراهم می‌کنند. این موضوع طراحی سرتاسر برنامه کاربردی شما را ساده می‌کند ولی مسائل و مشکلات خاص خود را نشان می‌دهد. برای مثال، در ASP کلاسیک شما به آسانی می‌توانید مقادیر را با استفاده از POST از یک صفحه ASP به صفحه‌ای دیگر ارسال نمایید. اما اگر می‌خواهید در مدل فرمهای وب (یا همان مدل برنامه‌نویسی ASP.NET) برنامه‌نویسی کنید، همان چیز در ASP.NET ممکن نمی‌باشد. اما راههایی برای غلبه بر این وضعیت وجود دارند که می‌توانند مورد استفاده قرار بگیرند. در این مقاله موضوعات زیر را مورد بررسی قرار خواهیم داد:

  • چگونگی ارسال مقادیر با استفاده از QueryString
  • چگونگی استفاده از متغیرهای Session برای ارسال مقادیر
  • چگونگی استفاده از متد Server.Transfer برای ارسال مقادیر

استفاده از QueryString
QueryString یک مکانیسم قدیمی برای ارسال مقادیر در بین صفحات است. مزیت اصلی این متد سادگی آن است. اما عیب آن این است که پس از ارسال، مقادیر در نوار آدرس مرورگر قابل مشاهده می‌باشند و نمی‌توان آبجکت‌ها را از این طریق ارسال کرد. این متد مناسب‌ترین راه برای ارسال تعداد کمی از مقادیری است که نیازی به محافظت از دید دیگران ندارند. برای اعمال کردن این متد مراحل زیر را انجام دهید:

  • یک فرم وب با کنترل‌هایش را درست کنید.
  • یک کنترل دکمه‌ای Button یا LinkButton برای ارسال فرم به سرور بر روی فرم قرار دهید.
  • در رویداد کلیک دکمه یک متغیر از نوع String تعریف کنید که URL را برای فرم دیگر که مقادیر قرار است به آنجا ارسال شوند، نگه می‌دارد.
  • مقادیر کنترل‌ها را در قالب پارامترهای QueryString در متغیر از نوع String قرار دهید.
  • از متد Response.Redirect که از متغیر String تعریف شده استفاده می‌کند برای هدایت کاربر به صفحه دیگر استفاده نمایید.
قطعه کد زیر چگونگی انجام این مراحل را نشان می‌دهد:

private void Button1_Click(object sender, System.EventArgs e)
{
   string url;
   url="anotherwebform.aspx?name=" +
      TextBox1.Text + "&email=" +
      TextBox2.Text;
   Response.Redirect(url);
}
فرم وب منبع

private void Page_Load(object sender, System.EventArgs e)
{
   Label1.Text=Request.QueryString["name"];
   Label2.Text=Request.QueryString["email"];
}
فرم وب مقصد

استفاده از متغیرهای Session
در این روش باید مقادیر کنترل‌ها را در متغیرهای Session ذخیره کنیم و در فرم وب دیگری به آنها دسترسی داشته باشیم. همانطور که می‌دانید ذخیره داده‌های زیاد در Session ممکن است اختلالاتی را در سرور بوجود آورد، بنابراین باید از این متد بدرستی استفاده شود. البته هر وقت که خواستید می‌توانید متغیرهای Session را از بین ببرید. مراحل اصلی برای استفاده از این متد به ترتیب زیر می‌باشد:

  • یک فرم وب با کنترل‌هایش را درست کنید.
  • یک کنترل دکمه‌ای Button یا LinkButton برای ارسال فرم به سرور بر روی فرم قرار دهید.
  • در رویداد کلیک دکمه، متغیرهای Session را تعریف کرده و مقادیر کنترل‌ها را در آنها قرار دهید.
  • کاربر را با استفاده از Server.Transfer به صفحه‌ای دیگر هدایت کنید.
  • در فرم وب دیگر متغیرهای Session را دریافت کرده و پس از دریافت اگر لازم باشد آنها را پاک کنید.
کد زیر این مراحل را در عمل نشان می‌دهد:

private void Button1_Click(object sender, System.EventArgs e)
{
   // textbox1 and textbox2 are webform controls
   Session["name"]=TextBox1.Text;
   Session["email"]=TextBox2.Text;
   Server.Transfer("anotherwebform.aspx");
}
فرم وب منبع

private void Page_Load(object sender, System.EventArgs e)
{
   Label1.Text=Session["name"].ToString();
   Label2.Text=Session["email"].ToString();
   Session.Remove("name");
   Session.Remove("email");
}
فرم وب مقصد

استفاده از Server.Transfer
این روش متدی پیچیده ولی روش ماهرانه‌ای برای ارسال مقادیر بین صفحات است. در اینجا مقادیری را که می‌خواهید در صفحات دیگر به آنها دسترسی داشته باشید به عنوان خصوصیات کلاس صفحه بیان می‌کنید. در کل این متد واضحتر و شیءگراتر از متدهای قبلی است. مراحل زیر را برای استفاده از این متد بترتیب دنبال کنید:

  • یک فرم وب با کنترل‌هایش را درست کنید.
  • رویدادهای خصوصیت Get که مقادیر کنترل‌ها را برخواهند گرداند را تعریف کنید.
  • یک کنترل دکمه‌ای Button یا LinkButton برای ارسال فرم به سرور بر روی فرم قرار دهید.
  • در رویداد کلیک دکمه متد Server.Transfer که اجرای برنامه را به فرم تعیین شده انتقال می‌دهد فراخوانی کنید.
  • در فرم دوم شما می‌توانید با استفاده از خصوصیت Context.Handler به یک نمونه از فرم اول دسترسی داشته باشید. سپس می‌توانید از خصوصیات Get که برای دسترسی به مقادیر کنترل‌ها ایجاد کرده‌ایم استفاده کنید.
کد زیر برای اجرای یک نمونه از مراحل بالا تدارک دیده شده است. خصوصیات زیر را به فرم وب اضافه کنید:

public string Name
{
   get
   {
      return TextBox1.Text;
   }
}

public string EMail
{
   get
   {
      return TextBox2.Text;
   }
}
فرم وب منبع

حال Server.Transfer را فراخوانی کنید.

private void Button1_Click(object sender, System.EventArgs e)
{
   Server.Transfer("anotherwebform.aspx");
}
فرم وب منبع

private void Page_Load
(object sender, System.EventArgs e)
{
   //create instance of source web form
   WebForm1 wf1;

   //get reference to current handler instance
   wf1=(WebForm1)Context.Handler;
   Label1.Text=wf1.Name;
   Label2.Text=wf1.EMail;
}
فرم وب مقصد

Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫ذخیره کردن Connection String در فایل Web.Config

ذخیره کردن Connection String در فایل Web.Config

با استفاده از فایل Web.Config در ASP.NET میتوانید مقادیر عمومی مانند رشته اتصال (ConnectionString) را بین تمام صفحات خود به اشتراک بگذارید.

توسط ehsan_valizadeh | 18 شهریور 1382 | 2872 بار مشاهده Printable Version نسخه مخصوص چاپ
بسیاری اوقات برنامه‌های کاربردی نیاز دارند که چیزهای خاصی مانند Connection String (رشته اتصال) یا پارامترهای عمومی برنامه، به طور خارجی برای برنامه ذخیره شوند. راه قدیمی برای این کار استفاده از فایلهای INI یا وارد کردن آنها در Registry بود. البته هر کدام از این روشها مشکلات خاص خود را دارند. ASP.NET راه مناسبی را برای انجام آن فراهم کرده است. شما می‌توانید این قبیل مقادیر را قسمت <appSettings> فایل Web.Config ذخیره کنید. کد زیر بیانگر این مطلب می‌باشد.

ذخیره کردن مقادیر در Web.Config
کد زیر را به فایل Web.Config خود اضافه کنید:

<configuration>
   <appSettings>
      <add key="connectionstring"
         value="Integrated Security=SSPI;
         Initial Catalog=Northwind;
         Data Source=MyServer\NetSDK" />
    </appSettings>
</configuration>

فضانامهای مورد نیاز
فضانامهای زیر کلاسهای مورد نیاز برای این کار را فراهم می‌کنند:

System.Collections.Specialized
System.Configuration

کد VB.NET برای بازیابی مقادیر
کد زیر چگونگی بازیابی مقادیر را با استفاده از VB.NET نشان می‌دهد:

Dim myvar As String
Dim nv As NameValueCollection
nv = ConfigurationSettings.AppSettings()
myvar = nv("connectionstring")

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

Dim myvar As String
myvar=ConfigurationSettings.AppSettings("connectionstring")

کد #C برای بازیابی مقادیر
کد زیر چگونگی بازیابی مقادیر را با استفاده از #C نشان می‌دهد:

string myvar;
NameValueCollection nv;
nv=ConfigurationSettings.AppSettings;
myvar=nv["connectionstring"];

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

string myvar;
myvar=ConfigurationSettings.AppSettings["connectionstring"];

Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫نگاهی به فیلترهای CSS در HTML

نگاهی به فیلترهای CSS در HTML

یكی از امكانات جالبی كه CSS در اختیار ما میگذارد، خصوصیتی بنام Filter میباشد كه بوسیله آن میتوان به تصاویر و متن‌های درون صفحه وب افكتهای ویژه‌ای را اضافه كرد.

توسط alirezagolkari | 4 مهر 1382 | 4755 بار مشاهده Printable Version نسخه مخصوص چاپ
تقریبا تمام کسانی که با طراحی صفحات وب و یا HTML سروکار دارند با (CSS (Cascading Style Sheets آشنایی دارند. با استفاده از CSS نحوه نمایش اطلاعات درون صفحه وب مشخص میشود و این کار بسیار راحتتر از HTML است. همچنین انجام بعضی از انواع قالب بندی‌هایی که با CSS امکان پذیر است با دستورات HTML امکان پذیر نیست.

یکی از امکانات جالبی که CSS در اختیار ما میگذارد خصوصیتی بنام Filter میباشد که بوسیله آن میتوان به تصاویر و متهای درون صفحه وب افکتهای متفاوتی را اضافه کرد. بطور مثال شما قادر خواهید بود درون یک صفحه وب یک متن سایه دار داشته باشید بدون اینکه از عکس بجای متن استفاده کنید که این خود باعث میشود ویرایش کردن متن مورد نظر شما نیز به راحتی صورت گیرد، چون دیگر شما با یک تصاویر کار ندارید، بلکه متن مورد نظر خود را به راحتی ویرایش میکنید. همچنین شما قادر خواهید بود که شفافیت یک عکس را کم کنید یا آن را وارونه کنید. اینها فقط چند نمونه از امکانات خصوصیت Filter در CSS است. در ادامه این مقاله امکانات و نحوه استفاده از خصوصیت Filter را بیان خواهیم کرد.

باید دقت داشت که برای کار کردن فیلترها همیشه باید خصوصیت width را برای تگ مورد نظر تنظیم کنید. در غیر این صورت این فیلترها از کار خواهند افتاد. در این مقاله برای اضافه کردن فیلترها از تگ DIV استفاده شده است. و برای راحتی کار با نوشتن دستورات زیر، خصوصیت width برای همه تگهای DIV تنظیم شده است. توجه داشته باشید که این دستورات باید در قسمت head صفحه وب و قبل از تگ <head/> نوشته شوند.

<style>
   <!--
     div {width: 100%;}
    -->
</style>

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

<div style="فیلتر مورد نظر">
   محتویاتی که قرار است فیلتر بر روی آن اعمال شود
   این محتویات میتواند هرچیزی باشد مثلا متن یا تصویر
</div>

بطور مثال:

<div style="filter: alpha(opacity=30);">
   <img src="1.jpg" width="100" height="100">
</div>

برای مشخص شدن خصوصیتهای مختلف دستور filter و نتایج استفاده از هرکدام از جدول زیر استفاده شده است. در جدول زیر سعی شده دستورات مربوط به خصوصیت filter با تنظیمات مختلف نشان داده شود. همچنین این کدها به عنوان نمونه هستند و خود شما با تغییر هرکدام از پارامترها میتوانید جلوه‌های متفاوتی را ایجاد کنید. در قسمت مربوط به توضیحات هم سعی شده پارامترهای اصلی هرکدام از فیلترها را بطور مختصر معرفی شوند.

دقت داشته باشید که برای مشاهده جلوه‌های بیان شده به مرورگر Internet Explorer 4.0 یا بالاتر از آن نیاز است.

filter: alpha(opacity=30);
alpha: با این فیلتر میتوان میزان نمایان بودن یک تصویر را مشخص نمود.
opacity: مقدارد نمایان شدن تصویر را مشخص مکند که مقداری بین 0 تا 100 را میپذیرد.

filter:alpha(opacity=0, finishopacity=100, style=1, startx=0, starty=0, finishx=100, finishy=100);
در این قسمت تمام پارامترهای خصوصیت alpha نشان داده شده است. با استفاده از این پارامترها میتوان میزان نمایش داده شدن یک شکل را از کم به زیاد تعیین نمود.

filter:alpha(opacity=100, finishopacity=10, style=2, startx=0, starty=0, finishx=100, finishy=100);
این مثال با همان پارامترهایی که در مثال قبل آمده بود بیان شده و فقط مقادیر پارامترهایی که بصورت رنگی در آمده‌اند تغییر کرده‌اند. همچنین پارامتر style‌ میتواند مقادیری بین 0 تا 3 داشته باشد.

filter:blur(add=false, direction=90, strength=7);
با این فیلتر میتوان تصویر را محو کرد.
direction: زاویه محو شدن شکل
strength: میزان تاثیر این فیلتر

filter:blur(add=true, direction=90, strength=7);
add: این پارامتر مشخص میکند که آیا تصویر اولیه نیز با تصویر ایجاد شده جدید ترکیب شود یا خیر.

filter:fliph;
چرخش بصورت افقی

filter:flipv;
چرخش بصورت عمودی

filter:gray;
ایجاد جلوه سیاه و سفید

filter:xray;
ابتدا شکل را سیاه و سفید و سپس میزان رنگها و روشنایی را معکوس میکند.

filter:invert;
میزان رنگها و روشنایی را معکوس میکند.

filter: mask(color=#ffffff);
این فیلتر به این صورت عمل میکند که محتویات مورد نظر را با یک رنگ خواص به صورت شفاف در می‌آورد. در اینجا عکس مورد نظر به عنوان زمینه (background) تعیین شده و با تنظیم رنگ با رنگ زمینه دلخواه (در اینجا سفید) در اصل ما رنگ متن را با یک تصویر پر کرده ایم.
iDevCenter

filter:glow(color=#ff8000, strength=5);
ایجاد حالت روشنایی با رنگ و میزان دلخواه در اطراف متن مورد نظر

iDevCenter

filter:blur;
همان فیلتر blur اما بدون پارامتر

iDevCenter

filter:shadow(color=#666666, direction=135);
ایجاد جلوه سایه با رنگ و زاویه دلخواه

iDevCenter

filter:dropshadow(color=#999999, offx=3, offy=3, positive=true);
نمایش سایه یک متن با رنگ دلخواه در موقعیت دلخواه

iDevCenter

filter:wave(strength=3);
ایجاد جلوه موجی شکل به اندازه دلخواه

iDevCenter

filter:fliph();
چرخش بصورت افقی

iDevCenter

filter:flipv();
چرخش بصورت عمودی

iDevCenter

منابع

  • w3schools.com
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫نشان دادن تصاویر در DataGrid بر اساس داده‌های پایگاه داده

نشان دادن تصاویر در DataGrid بر اساس داده‌های پایگاه داده

با استفاده از این مقاله خواهید توانست در کنترل‌های DataGrid خود علاوه بر متون و لینک‌ها تصاویر را نیز نمایش دهید.

توسط ehsan_valizadeh | 10 مهر 1382 | 3771 بار مشاهده Printable Version نسخه مخصوص چاپ
کنترل DataGrid پیچیده‌ترین کنترلی است که در ASP.NET وجود دارد. با استفاده از DataGrid امکان فرمت دهی و نمایش٬ مرتب سازی و صفحه بندی رکوردهای جداول بانک اطلاعاتی فراهم می شود. در اینجا میخواهیم با استفاده از قابلیتهای این کنترل روشی را برای نشان دادن تصاویر در آن بررسی کنیم. هر کدام از این تصاویر قرار است در رکورد مربوط به خود در کنترل DataGrid نمایش داده شوند. هر رکورد داده های دیگری را نیز شامل می شود که همه آنها در جدول products واقع در پایگاه داده products.mdb قرار دارند. هر رکورد شامل ستونی به نام ImageName (از نوع داده Text) میباشد که نام تصویر مربوط به رکورد را شامل میشود.

تعریف ستون برای کنترل DataGrid
وقتی که یک منبع داده مانند یک DataSet را به کنترل DataGrid مقید میکنیم٬ خود کنترل همه کارها را انجام میدهد و همه رکوردها را به طور اتوماتیک نمایش میدهد. ولی اگر بخواهیم ستونهای کنترل DataGrid را تحت کنترل خود درآورده و فقط ستونهای دلخواه را نمایش دهیم باید خودمان برای کنترل DataGrid ستون تعریف کنیم. قبل از اینکه بتوانیم ستونی را برای DataGrid تعریف کنیم٬ لازم است که خصوصیت AutoGenerateColumns آنرا برابر False قرار دهیم. پس از انجام این کار میتوانیم شروع به تعریف ستون برای کنترل DataGrid نماییم. کنترل DataGrid پنج نوع ستون را می شناسد که عبارتند از:
  • BoundColumn: نوع پیش فرض ستونها که رکوردها را نمایش میدهد.
  • HyperLinkColumn: که رکوردها را به صورت یک Hyperlink نمایش میدهد.
  • TemplateColumn: که رکوردها را با استفاده از یک الگوی مشخص نمایش میدهد.
  • ButtonColumn: که کنترلهایی از نوع Button را نمایش میدهد.
  • EditCommandButton: که فرامین ویرایش همانند Edit ،Update و Cancel را نمایش میدهد.
در نمونه کدی که همراه مقاله میتوانید آنرا دریافت کنید٬ کنترل DataGrid را به صورت زیر تعریف کرده‌ایم:

<asp:Datagrid id="dg" runat="server" AutoGenerateColumns="False"
BorderColor="Black"Font-Size="10" Font-Name="Arial" BackColor="#C6C3FF"
Headerstyle-Font-Size="12" Headerstyle-Font-Bold="True"
Headerstyle-Font-Name="Arial" Headerstyle-Forecolor="#0F0F0F"
Headerstyle-BackColor="#8482C6" cellspacing="0" cellpadding="0">

   <columns>
      <asp:BoundColumn HeaderStyle-HorizontalAlign="Center"
      DataField="ProdName" HeaderText="ProdName" />
      <asp:TemplateColumn HeaderStyle-HorizontalAlign="Center">
         <HeaderTemplate>
            Images
         </HeaderTemplate>
         <ItemTemplate>
            <div align="center">
               <img src='/prodimages/<%# Container.DataItem("ImageName") %>' />
            </div>
         </ItemTemplate>
      </asp:TemplateColumn>
      <asp:BoundColumn DataField="Comments" HeaderText="Comments" />
   </columns>
</asp:Datagrid>

در کدهای مربوط به کنترل DataGrid سه ستون برای آن تعریف شده است. ستون اول از نوع BoundColumn، ستون دوم از نوع TemplateColumn و ستون سوم هم دوباره از نوع BoundColumn تعریف شده‌اند. در ستونهایی که از نوع BoundColumn می باشند٬ انتساب نام فیلد جدول بانک اطلاعاتی به خصوصیت DataField ستون٬ برای نمایش دادن داده‌های آن فیلد در ستون DataGrid کافی میباشد.

تعریف ستون TemplateColumn برای کنترل DataGrid
وقتی که میخواهیم اختیارات بیشتری را در تعیین فرمت یک ستون داشته باشیم از الگوی TemplateColumn استفاده میکنیم. ستونی که از نوع TemplateColumn برای کنترل DataGrid تعریف میشود٬ میتواند الگوهای زیر را داشته باشد:

  • HeaderTemplate: تعیین کننده فرمت متنی است که در بالای ستون نمایش داده میشود.
  • ItemTemplate: تعیین کننده فرمت آیتم‌های اصلی ستون میباشد.
  • EditItemTemplate: تعیین کننده فرمت آیتمی است که به قصد ویرایش انتخاب شده است.
  • FooterTemplate: تعیین کننده فرمت آیتمی است که پایین ستون نمایش داده میشود.
در کد مربوط به تعریف کنترل DataGrid از دو الگوی HeaderTemplate و ItemTemplate استفاده شده است. در داخل HeaderTemplate کلمه Images نوشته شده است که موقع اجرا در بالای ستون نمایش داده میشود. کار اصلی برای نمایش تصاویر در داخل الگوی ItemTemplate انجام شده است. در اینجا با کدهای HTMLی که در زیر دوباره آنها را مشاهده میکنید توانسته‌ایم تصاویر مربوط به رکوردها را نمایش دهیم.

<div align="center">
   <img src='/prodimages/<%# Container.DataItem("ImageName") %>' />
</div>

در اینجا با استفاده از تگ <img> تصاویر را از داخل پوشه prodimages نمایش داده ایم. نام تصاویر با استفاده از عبارت <%# Container.DataItem("ImageName") %> تعیین شده است که مقدار ستون ImageName برای هر رکورد را بازمیگرداند.

تمام کد مربوط به صفحه و همچنین پایگاه داده products.mdb را می توانید همراه مقاله دریافت نمایید.

فایل‌های مرتبط

  • کد برنامه نمونه (34 کیلوبایت)
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫حفظ وضعیت فرمهای وب هنگام استفاده از Server.Transfer

حفظ وضعیت فرمهای وب هنگام استفاده از Server.Transfer

شاید شما هم این تصور غلط را داشته باشید که متد Server.Transfer نمیتواند برای ارسال وضعیت فرم به فرمی دیگر به کار رود! اما با اعمال مقداری تغییرات میتوان این کار را به آسانی انجام داد.

توسط ehsan_valizadeh | 10 مهر 1382 | 2415 بار مشاهده Printable Version نسخه مخصوص چاپ
در ASP کلاسیک برای ارسال یک فرم به فرمی دیگر باید صفت action فرم را مقداردهی نماییم٬ ولی در ASP.NET این کار به همان صورت میسر نمی باشد. مدل فرمهای وب ASP.NET مستلزم آن است که هر فرم به خودش ارسال شود. اگر شما می خواهید که یک کنترل را از یک فرم به فرمی دیگر انتقال دهید٬ باید از متد Server.Transfer استفاده نمایید. همچنین در رابطه با نحوه ارسال مقادیر بین فرمها میتوانید به مقاله قبلی من با عنوان انواع روشهای انتقال مقادیر بین فرمهای وب در ASP.NET مراجعه کنید. بسیاری از برنامه نویسان ASP.NET این تصور غلط را دارند که متد Server.Transfer نمیتواند برای ارسال وضعیت فرم به فرمی دیگر به کار رود٬ اما با اعمال مقداری تغییرات میتوانید این کار را به آسانی انجام دهید.

متد Server.Transfer
متد Server.Transfer برای ارسال کنترل از یک فرم به فرمی دیگر استفاده می شود. بر خلاف Response.Redirect – که در واقع از مرورگر می خواهد که یک درخواست دیگری را بوجود آورد - Server.Transfer باعث انتقال کنترل در طرف سرور می شود. متد Server.Transfer دو پارامتر را دریافت می کند: یک فرم وب که کنترل یا کنترل ها قرار است به آنجا ارسال شوند٬ دیگری یک مقدار Boolean که نشان دهنده آن است که وضعیت فرم فعلی در فرم جدید حفظ خواهد شد یا نه. اجازه دهید برنامه ای بسازیم که مشکلی را هنگام استفاده از این متد نشان می دهد٬ سپس نحوه حل این مشکل را بررسی خواهیم کرد.

مشکل هنگام استفاده از Server.Transfer
یک برنامه ASP.NET بسازید و دو فرم را به آن اضافه کنید. اجازه دهید نام فرمها را Page1.aspx و Page2.aspx بگذاریم. در فرم Page1.aspx یک کنترل جعبه متن با TextBox1 ،ID و یک کنترل Button قرار دهید. در رویداد کلیک دکمه کد زیر را بنویسید:

Server.Transfer("Page2.aspx", True)

سپس برنامه را با درخواست Page1.aspx اجرا کنید. مقداری را در کنترل جعبه متن وارد کرده و بر روی دکمه کلیک نمایید. در این حالت یک پیغام خطا با توضیح "The View State is invalid for this page and might be corrupted" را دریافت خواهید کرد. این خطا به علت یکی از صفات دایرکتیو Page@ فرم دوم (یعنی Page2.aspx) به نام EnableViewStateMac اتفاق می افتد. به صورت پیش فرض این صفت مقدار True را دارد و این امر باعث ایجاد خطا می شود.

EnableViewStateMac چیست؟
در زیر توضیحی را در مورد EnableViewStateMac از مستندات MSDN مشاهده می کنید:

Indicates that ASP.NET should run a machine authentication check (MAC) on the page's view state when the page is posted back from the client. true if view state should be MAC checked; otherwise, false. The default is false. Note: A view state MAC is an encrypted version the hidden variable that a page's view state is persisted to when sent to the browser. When you set this attribute to true, the encrypted view state is checked to verify that it has not been tampered with on the client.

زمانی که شما درخواست را برای صفحه می فرستید٬ مقدار EnableViewStateMac برای دایرکتیو Page صفحه True می باشد.

راه حل
به منظور غلبه بر مشکل حفظ وضعیت که در بالا مطرح شد٬ باید به طور صریح مقدار صفت EnableViewStateMac در دایرکتیو Page صفحه دوم (Page2.aspx) را برابر False قرار دهید:

<%@ Page Language="vb" EnableViewStateMac="False"%>

اکنون شما میتوانید به مقادیری که در TextBox1 در فرم Page1.aspx وارد شده است٬ دسترسی داشته باشید (در اینجا TextBox1 همان ID کنترل جعبه متن موجود در فرم Page1.aspx می باشد):

Response.Write(Request.Form("TextBox1"))

پرکردن محتوای کنترلهای فرم Page2.aspx با داده‌های دریافت شده از فرم Page1.aspx
فکر می کنید چطور میتوان محتوای کنترلهای واقع بر فرم Page2.aspx را با داده‌های رسیده توسط متد Server.Transfer پرکرد؟ میتوان این کار را به سادگی با یکی کردن ID کنترلهای فرم Page2.aspx با ID کنترلهای فرم Page1.aspx انجام داد. در برنامه نمونه که همراه مقاله میتوانید آنرا دریافت نمایید، مشاهده می‌کنید که IDهای دو کنترل جعبه متن واقع بر فرم Page1.aspx همان IDهای دو کنترل جعبه متن دیگر واقع در فرم Page2.aspx می باشند. اگر این IDها را در هر یک از فرمها تغییر دهیم دیگر نمیتوان مقادیر کنترلهای فرم Page1.aspx را در فرم دوم در کنترل‌ها جای داد.

خلاصه
ما در این مقاله نحوه ارسال کنترلها را از یک فرم وب به فرم وب دیگر همراه با حفظ داده‌های فرم بررسی کردیم. با مقداردهی مناسب صفت EnableViewStateMac برای دایرکتیو Page فرم دریافت کننده داده‌ها٬ توانستیم امکان چنین انتقالی بین دو فرم را فراهم بیاوریم. میتوانید از برنامه نمونه همراه مقاله برای دیدن نحوه انجام این کار استفاده نمایید.

فایل‌های مرتبط

  • کد برنامه نمونه (15 کیلوبایت)
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫ساختن فرم جمع آوری اطلاعات به صورت پویا بر پایه XML

ساختن فرم جمع آوری اطلاعات به صورت پویا بر پایه XML

در این مقاله به چگونگی ساخت یک فرم ویندوز جهت جمع آوری اطلاعات و قرار دادن کنترلها بر روی آن به صورت پویا از طریق یک فایل XML می‌پردازیم.

توسط HosseinGates | 18 مهر 1382 | 3635 بار مشاهده Printable Version نسخه مخصوص چاپ
XML یکی از مهمترین ارکان ویژوال استودیو دات نت است که امروزه در صنعت فناوری اطلاعات کاربرد بسیاری دارد. در این مقاله به چگونگی ساخت یک فرم جمع آوری اطلاعات و قرار دادن کنترلها بر روی آن به صورت پویا می‌پردازیم. اما قرار دادن کنترلها بر روی فرم به صورت کلاسیک و قدیمی صورت نمی‌گیرد بلکه این کار از روی یک فایل XML انجام می‌شود. در واقع این فایل XML برای برنامه مشخص می‌سازد که سوالات و جوابهای ما در قالب چه کنترلهایی بر روی فرم به نمایش درآیند. با این کار برای بروز رسانی برنامه کافیست سوالات و جوابهای خود را در فایل XML بروز کنیم بدون آنکه در برنامه خود تغییری ایجاد کنیم.

در مرحله اول یک شئ از فرم frmSurveyForm میسازیم. این فرم شامل دو دکمه OK و Cancel است که از پیش طراحی شده و سایر کنترلها را نیز بطور پویا ایجاد میکنیم. همچنین یک کلکسیون از کنترلها به نام surveyControls میسازیم که همان کلکسیون کنترلهایی است که قرار است بر روی فرم قرار گیرد. کلکسیونها، آرایه‌هایی هستند که اعضای آن میتوانند از چند نوع داده تشکیل شوند. همانطور که میدانید در ویژوال بیسیک دات نت تمام کنترلها درون یک کلکسیون قرار داده میشوند و به هر کدام از آنها یک شماره اختصاص داده میشود که میتوان با فراخوانی اندیس هر عضو به آن کنترل دسترسی پیدا کرد. توجه داشته باشید که آخرین کنترل اضافه شده به فرم اولین اندیس را دارد. این کدها را میتوان در رویداد یک دکمه قرار داد:

Dim survey As New frmSurveyForm()
Dim surveyControls As Control.ControlCollection = survey.SurveyFormControls

m_Location = New Point(10, 10)

Dim xr As New Xml.XmlDocument()
xr.Load("..\Questions.xml")

xr یک سند XML است که پس از ساختن آن یک سند XML را از به آن نسبت میدهیم. در این مثال فایل XML مورد نظر را در همان پوشه پروژه قرار داده‌ایم. این فایل به این مقاله ضمیمه شده است. سپس یک متغیر رشته‌ای به نام myTag میسازیم که این متغیر شامل مقدار خصوصیت name از تگ survey میباشد. استفاده از تگهای سند XML فواید زیادی را دربر دارد. با این روش برنامه قابلیت گسترش بیشتری را خواهد داشت و میتوان با اضافه کردن یا کاهش سوالات/ جوابها برنامه را به روز کرد.

Dim myTag As String = xr.SelectSingleNode("//survey").Attributes("name").Value

از سند XML خصوصیت displayName را خوانده و آنرا به عنوان Caption فرم ست میکنیم.

survey.SurveyTitle = xr.SelectSingleNode("//survey").Attributes("displayName").Value

خصوصیت SurveyTitle قبلا درون فرم frmSurveyFrom بصورت زیر تعریف شده است:

Public Property SurveyTitle() As String
  Get
    Return m_Title
  End Get

  Set(ByVal Value As String)
    m_Title = Value
    Me.Text = m_Title
  End Set
End Property

یک لیست گره (XMLNodeList) که شامل هر یک از سوالات میاشد ساخته و آنرا پر میکنیم:

Dim nodeList As Xml.XmlNodeList
nodeList = xr.GetElementsByTagName("question")

یک گره XML موقت میسازیم که هنگام بازیابی اطلاعات در مورد گره‌ها از لیست گره‌هایی که ساختیم به کار میرود. پس از آن شروع به خواندن یک به یک گره‌ها میکنیم و با توجه به خصوصیت type از هر گره کنترلی مناسب با آن میسازیم. این کار را با فراخوانی توابع نوشته شده انجام میدهیم. برای مثال اگر نوع آن برابر dropdown باشد با فراخوانی تابع Survey_AddComboBox یک ComboBox روی فرم ساخته میشود.

Dim myNode As XmlNode

For Each myNode In nodeList
  If Not myNode.Attributes Is Nothing Then

    Select Case myNode.Attributes("type").Value
      Case "dropdown"
      m_Location = Survey_AddComboBox(myNode, surveyControls, _
                           m_Location, myTag)

      Case "multilist"
      m_Location = Survey_AddListBox(myNode, surveyControls, _
                           m_Location, myTag, True)

      Case "text"
      m_Location = Survey_AddTextBox(myNode, surveyControls, _
                           m_Location, myTag)

      Case "radio"
      m_Location = Survey_AddRadioButtons(myNode, surveyControls, _
                           m_Location, myTag)
    End Select
  End If
Next

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

Private m_Location As New Point(10, 10)

مقدار خروجی توابع فوق همان m_Locaton است که با این کار پس از ساختن هر کنترل مقدار این متغیر که نشان دهنده مکان کنترل بعدیست تنظیم میشود. همچنین مقداری فضا را برای دو دکمه OK و Cancel خالی میگذاریم. ثابت CONTROL_WIDTH قبلا تعریف شده است و برابر عدد 300 است.

survey.Width = m_Location.X + CONTROL_WIDTH + 30
survey.Height = m_Location.Y + 75

در آخر نیز فرم را نمایش می دهیم:

survey.ShowDialog()

همانطور که مشاهده کردید با این روش یک فرم جمع آوری اطلاعات ساختیم. در قسمت دوم این مقاله به بررسی چگونگی ساخت کنترلها به صورت پویا می پردازیم. این کار را با توضیح توابع Survey_AddComboBox و Survey_AddListBox و Survey_AddTextBox و Survey_AddRadioButtons انجام می دهیم. همچنین خصوصیاتی در قسمت کد فرم frmSurveyFrom تعریف شده است که میتوانید با استفاده از فایل ضمیمه این مقاله آنها را مشاهده کنید.

تابع Survey_AddComboBox:
این تابع یکComboBox به کلکسیون کنترلها اضافه میکند. همچنین یک Label جهت نمایش سوال مربوطه نیز ساخته میشود.

Private Function Survey_AddComboBox(ByVal inNode As XmlNode, _
        ByVal inControls As Control.ControlCollection, _
        ByVal location As Point, ByVal tag As String) As Point

  Dim myCombo As New ComboBox()
  myCombo.Text = ""
  myCombo.Name = inNode.Attributes("name").Value
  myCombo.Tag = tag
  myCombo.Width = CONTROL_WIDTH

  Dim myNode As XmlNode
  For Each myNode In inNode.SelectNodes("responses/response")
    myCombo.Items.Add(myNode.InnerText)

    If Not myNode.Attributes("default") Is Nothing Then
      If myNode.Attributes("default").Value = "true" Then
        myCombo.Text = myNode.InnerText
      End If
    End If
  Next

  Dim myLabel As New Label()
  myLabel.Name = myCombo.Name & "Label"
  myLabel.Text = inNode.SelectSingleNode("text").InnerText
  myLabel.Width = CONTROL_WIDTH

  myLabel.Location = location
  inControls.Add(myLabel)
  location.Y += myLabel.Height

  myCombo.Location = location
  inControls.Add(myCombo)
  location.Y += myCombo.Height + 10

  Return location
End Function

در این تابع ابتدا یک ComboBox جدید ساخته و خصوصیات آنرا تنظیم میکنیم. پس از آن یک گره XML موقت جهت بازیابی اطلاعات از گره response می‌سازیم و سپس با خواندن گره‌ها اطلاعات آنها را به لیست اضافه می‌کنیم. اگر خصوصیت Default یک گره مقدار true داشته باشد، مقدار آن گره به عنوان مقدار Text در ComboBox نوشته میشود. پس از آن یک Label جدید ساخته و آنرا به کلکسیون کنترلها اضافه میکنیم. در آخر ComboBox جدید هم به کلکسیون کنترلها اضافه می‌شود. همچنین مقدار m_Location به عنوان مکان کنترل بعدی برگرداننده می‌شود.

تابع Survey_AddListBox:
این تابع یک لیست باکس (ListBox) به کلکسیون کنترلها اضافه میکند. همچنین یک Label جهت نمایش سوال مربوطه نیز ساخته میشود.

Private Function Survey_AddListBox(ByVal inNode As XmlNode, _
        ByVal inControls As Control.ControlCollection, _
        ByVal location As Point, ByVal tag As String, _
        ByVal isMultiSelect As Boolean) As Point

  Dim myList As New ListBox()
  myList.Text = ""
  myList.Name = inNode.Attributes("name").Value
  myList.Tag = tag
  myList.Width = CONTROL_WIDTH

  If isMultiSelect Then
    myList.SelectionMode = SelectionMode.MultiSimple
  Else
    myList.SelectionMode = SelectionMode.One
  End If

  Dim myNode As XmlNode
  For Each myNode In inNode.SelectNodes("responses/response")
    myList.Items.Add(myNode.InnerText)

    If Not myNode.Attributes("default") Is Nothing Then
      If myNode.Attributes("default").Value = "true" Then
        myList.Text = myNode.InnerText
      End If
    End If
  Next

  Dim myLabel As New Label()
  myLabel.Name = myList.Name & "Label"
  myLabel.Text = inNode.SelectSingleNode("text").InnerText
  myLabel.Width = CONTROL_WIDTH

  myLabel.Location = location
  inControls.Add(myLabel)
  location.Y += myLabel.Height

  myList.Location = location
  inControls.Add(myList)
  location.Y += myList.Height + 10

  Return location
End Function

در این تابع ابتدا یک ListBox جدید ساخته و خصوصیات آن از جمله خصوصیت MultiSelect را با توجه به پارامتر ارسال شده تنظیم میکنیم. پس از آن یک گره XML موقت جهت بازیابی اطلاعات از گره response می‌سازیم و سپس با خواندن گره‌ها اطلاعات آنها را به لیست اضافه می‌کنیم. اگر خصوصیت Default یک گره مقدار true داشته باشد، مقدار آن گره به عنوان مقدار Text در ListBox نوشته میشود. در آخر نیز ListBox جدید به کلکسیون کنترلها اضافه شده و مقدار m_Location به عنوان مکان کنترل بعدی برگرداننده می‌شود.

تابع Survey_AddRadioButtons:
این تابع یک GroupBox به کلکسیون کنترلهای قبلی اضافه میکند که شامل دکمه های رادیویی و یک Lable برای نمایش سوالات است.

Private Function Survey_AddRadioButtons(ByVal inNode As XmlNode, _
        ByVal inControls As Control.ControlCollection, _
        ByVal location As Point, ByVal tag As String) As Point

  Dim myGroupBox As New GroupBox()
  myGroupBox.Text = ""
  myGroupBox.Name = inNode.Attributes("name").Value
  myGroupBox.Tag = tag
  myGroupBox.Width = CONTROL_WIDTH + 20

  Dim myRadio As RadioButton
  Dim myRadioPoint As New Point(5, 10)
  Dim myNode As XmlNode

  For Each myNode In inNode.SelectNodes("responses/response")
    myRadio = New RadioButton()
    myRadio.Text = myNode.InnerText
    myRadio.Location = myRadioPoint
    myRadioPoint.Y += myRadio.Height

    If Not myNode.Attributes("default") Is Nothing Then
      If myNode.Attributes("default").Value = "true" Then
        myRadio.Checked = True
      End If
    End If

    myGroupBox.Controls.Add(myRadio)
  Next

  myGroupBox.Height = myRadioPoint.Y + 5

  Dim myLabel As New Label()
  myLabel.Name = myGroupBox.Name & "Label"
  myLabel.Text = inNode.SelectSingleNode("text").InnerText
  myLabel.Width = CONTROL_WIDTH

  myLabel.Location = location
  inControls.Add(myLabel)
  location.Y += myLabel.Height - 5

  myGroupBox.Location = location
  inControls.Add(myGroupBox)
  location.Y += myGroupBox.Height + 10

  Return location
End Function

در این تابع ابتدا یک GroupBox جدید ساخته و خصوصیات آنرا تنظیم میکنیم. پس از آن یک دکمه رادیویی میسازیم. بعد از آن با استفاده از یک حلقه جوابها را در دکمه های رادیویی می نویسیم و مقدار پیش فرض روی دکمه رادیویی مربوطه با توجه به خصوصیت default گره تنظیم می‌شود. ارتفاع GroupBox نیز با توجه به محتوی دکمه های رادیویی تنظیم می شود. در آخر نیز کنترلهای جدید به کلکسیون کنترلها اضافه شده و مقدار m_Location به عنوان مکان کنترل بعدی برگرداننده می‌شود.

تابع Survey_AddTextBox:
این تابع یک TextBox و یک Lable برای نمایش سوالات به کلکسیون کنترلهای قبلی اضافه میکند.

Private Function Survey_AddTextBox(ByVal inNode As XmlNode, _
        ByVal inControls As Control.ControlCollection, _
        ByVal location As Point, ByVal tag As String _
        ) As Point

  Dim myText As New TextBox()
  myText.Tag = tag
  myText.Width = CONTROL_WIDTH

  If Not inNode.SelectSingleNode("defaultResponse") Is Nothing Then
    myText.Text = inNode.SelectSingleNode("defaultResponse").InnerText
  End If

  If Not inNode.Attributes("name") Is Nothing Then
    myText.Name = inNode.Attributes("name").Value
  End If

  If Not inNode.SelectSingleNode("maxCharacters") Is Nothing Then
    myText.MaxLength = Integer.Parse(inNode.SelectSingleNode_
    ("maxCharacters").InnerText)
  End If

  If myText.MaxLength > 0 Then
    Dim numLines As Integer = (myText.MaxLength \ CHARS_PER_LINE) + 1

    If numLines = 1 Then
      myText.Multiline = False
    Else
      If numLines >= 4 Then
        myText.Multiline = True
        myText.Height = 4 * HEIGHT_PER_LINE
        myText.ScrollBars = ScrollBars.Vertical
      Else
        myText.Multiline = True
        myText.Height = numLines * HEIGHT_PER_LINE
        myText.ScrollBars = ScrollBars.None
      End If
    End If
  End If

  Dim myLabel As New Label()
  myLabel.Name = myText.Name & "Label"
  myLabel.Width = CONTROL_WIDTH

  If Not inNode.SelectSingleNode("text") Is Nothing Then
    myLabel.Text = inNode.SelectSingleNode("text").InnerText
  End If

  myLabel.Location = location
  inControls.Add(myLabel)
  location.Y += myLabel.Height

  myText.Location = location
  inControls.Add(myText)
  location.Y += myText.Height + 10

  Return location
End Function

در این تابع ابتدا یک جعبه متن جدید ساخته و برخی از خصوصیات آنرا با توجه به فایل XML تنظیم میکنیم. پس از آن تعداد خطوط مجاز، بزرگی جعبه متن و اینکه آیا ScrollBar نیاز است یا خیر محاسبه میشود. دو ثابت CHARS_PER_LINE و HEIGHT_PER_LINE نیز به ترتیب با مقادیر 30 و 19 تعریف شده‌اند. در انتها نیز کنترلهای جدید به کلکسیون کنترلها اضافه شده و مقدار m_Location نیز به عنوان مکان کنترل بعدی برگرداننده می‌شود.

فایل‌های مرتبط

  • متن برنامه نمونه (16 کیلوبایت)
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫بررسی شیئ DataView در ASP.NET

بررسی شیئ DataView در ASP.NET

در این مقاله سعی شده به اختصار درباره خصوصیتها، متدها و نحوه کار با شیئ DataView اطلاعاتی ارائه شود.

توسط keyvannayyeri | 3 آبان 1382 | 2488 بار مشاهده Printable Version نسخه مخصوص چاپ
یکی از اعمال مورد نیاز در کار با داده‌های یک بانک اطلاعاتی، جستجو، مرتب سازی و فیلتر کردن داده‌ها بر حسب نیازمندیهای برنامه کاربردی می باشد. در 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: سطرهایی که شامل پارامتر ارسالی به این متد هستند را پیدا می کند.

Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫بررسی توابع مدیریت رشته‌ها در ویژوال بیسیک

بررسی توابع مدیریت رشته‌ها در ویژوال بیسیک

در این مقاله توابعی که در کار با رشته‌ها (Strings) در ویژوال بیسیک می‌توان از آنها استفاده کرد بهمراه مثال‌هایی از کاربرد هر تابع معرفی شده است.

توسط sheidaian | 13 آبان 1382 | 4168 بار مشاهده Printable Version نسخه مخصوص چاپ
توابعی که برای مدیریت رشته‌ها در ویژوال بیسیک می توانید از آنها استفاده کنید عبارتند از:

Asc(string):
کد اسکی اولین کاراکتر رشته ورودی را بر میگرداند. تابع AscW نیز کد یونیکد اولین کاراکتر را بر میگرداند.

Chr(charcode):
رشته‌ای را بر میگرداند که معادل کد اسکی ورودی است. تابع ChrW نیز بر حسب یونیکد عمل میکند.

LCase(string):
تمام کاراکترهای رشته ورودی را به حروف کوچک تبدیل میکند.

UCase(string):
تمام کاراکترهای رشته ورودی را به حروف کوچک تبدیل میکند.

Left(string, length):
رشته‌ای را برمیگرداند که شامل تعداد مشخصی از کاراکترهای سمت چپ رشته ورودی است. که در آن string رشته ورودی و length طول رشته مورد نظر است. مثال:

Left("abcdef", 3) = "abc"

Right(string, length):
رشته‌ای را برمیگرداند که شامل تعداد مشخصی از کاراکترهای سمت راست رشته ورودی است. که در آن string رشته ورودی و length طول رشته مورد نظر است. مثال:

Right("abcdef", 3) = "def"

Space(number):
تعداد مشخصی کاراکتر فاصله بر می گرداند.

Len(string):
طول رشته ورودی را بر می گرداند. مثال:

Len("abcdefg") = 7

Trim(string):
این تابع spaceهایی که در ابتدا یا انتهای رشته باشد را حذف می کند. توابع LTrim و RTrim فقط از چپ و راست عمل می کنند. مثال:

Trim(" abc ") = "abc"

Mid(string, start[, length]):
این تابعی یک رشته برمیگرداند که شامل تعداد مشخصی از کاراکترهای رشته ورودی آن است. در این تابع string رشته ورودی، start محل شروع اولین کاراکتر رشته‌ای که می خواهیم از رشته ورودی استخراج کنیم و length یک پارامتر اختیاری است که طول رشته‌ای که میخواهیم از رشته ورودی استخراج کنیم را مشخص میکند. اگر این پارامتر وارد نشود کلیه کاراکترها از start به بعد استخراج خواهند شد . مثال:

Mid("abcdefg", 2, 3) = "bcd"

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(stringcheck, stringmatch[, start[, compare]]):
برعکس تابع InStr می باشد یعنی عمل جستجو را از انتهای رشته انجام می‌دهد.

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(expression):
رشته‌ای را برمیگرداند که کاراکترهای آن به ترتیب عکس کاراکترهای رشته ورودی است. مثال:

StrReverse("abcd") = "dcba"

Split(expression[, delimiter[, limit[, compare]]]):
آرایه‌ای از تعداد مشخصی رشته برمیگرداند که این رشته‌ها توسط یک کاراکتر جداکننده (delimiter) از درون یک رشته استخراج شده‌اند. پارامترهای این تابع عبارتند از:

expression: رشته اصلی. delimiter: این پارامتر اختیاری است و کاراکتر جداسازی را نشان میدهد. در صورتیکه این پارامتر وارد نشود کاراکتر فاصله (" ") برای جداسازی استفاده میشود. در صورتیکه طول این کاراکتر صفر باشد یک آرایه تک عضوی که شامل کل expression است برگردانده میشود. limit: تعداد رشته‌های موجود در آرایه را نشان میدهد. در صورتیکه این پارامتر داده نشود کلیه رشته‌های جداشده در آرایه خروجی قرار میگیرند. compare: نوع جستجو را نشان میدهد. اگر این پارامتر 0 داده شود جستجوی متنی انجام می شود و اگر 1 داده شود جستجوی باینری انجام میشود.

Dim Ar(3) As String

Ar = Split("a#bd#cde", "#")

Join(sourcearray[, delimiter]):
تعدادی رشته موجود در یک آرایه را بهم متصل میکند و رشته حاصل شده را بعنوان نتیجه برمیگرداند. پارامترهای این تابع عبارتند از:

sourcearray: شامل رشته‌هایی که می خواهیم بهم متصل کنیم. delimiter: کاراکتری که برای اتصال رشته‌ها بهم استفاده میشود . این کاراکتر در بین رشته‌iای اتصالی می‌آید و اگر داده نشود از کاراکتر فاصله استفاده میشود. اگر طول این کاراکتر صفر باشد رشته‌های بدون هیچ جداکننده‌ای بهم متصل میشوند. مثال:

Dim Ar(3) As String
Ar(1) = "ab"
Ar(2) = "c"
Ar(3) = "def"
Join(Ar, "*") = "ab*c*def"

StrComp(string1, string2[, compare]):
این تابع دو رشته ورودی را با هم مقایسه می کند. پارامترهای این تابع عبارتند از:

string1: رشته اول. string2: رشته دوم. compare: نوع جستجو را نشان میدهد. اگر این پارامتر 0 داده شود جستجوی متنی انجام می شود و اگر 1 داده شود جستجوی باینری انجام میشود.

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

StrConv(string, conversion):
در یک رشته ورودی تغییراتی را اعمال می کند. پارامترهای این تابع عبارتند از:

string: رشته ورودی. conversion: نوع عمل تبدیل را نشان میدهد. مقادیر ممکن این متغیر عبارتند از:

مقدار | توضیح
1 | تبدیل به حروف بزرگ
2 | تبدیل به حروف کوچک
3 | تبدیل اولین کاراکتر هر لغت در رشته به حرف بزرگ
64 | تبدیل به یک رشته یونیکد
128 | تبدیل از رشته یونیکد به کدپیچ پیش فرض سیستم

مثال:

StrConv("hello my friend", 3) = "Hello My Freind"

Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫دستیابی به رجیستری در VB.NET

دستیابی به رجیستری در VB.NET

احتمالا تاکنون مطالب زیادی در مورد رجیستری ویندوز شنیده‌اید. اما آیا تابحال فکر کرده‌اید که چگونه میتوانید از این ویژگی ویندوز در برنامه‌های خودتان استفاده کنید؟

توسط HosseinGates | 15 آذر 1382 | 4151 بار مشاهده Printable Version نسخه مخصوص چاپ
این مقاله به بررسی چگونگی دستیابی به رجیستری در ویژوال بیسیک دات نت می پردازد. رجیستری ویندوز یکی از پرکاربرد ترین مباحث در برنامه نویسی استاندارد ویندوز میباشد که اکثر برنامه‌های موجود از این امکان بهره میبرند. برای مثال می توان از رجیستری برای نگهداری آخرین تغییرات داده شده در برنامه و یا ذخیره تنظیماتی که کاربر در برنامه اعمال کرده است استفاده کرد. در NET. از دو کلاس Registry و RegistryKey برای دسترسی به رجیستری و داده‌های موجود در آن استفاده میشود.

هر ورودی در رجیستری ویندوز شامل دو قسمت میشود: نام مقدار (Value Name) و مقدار (Value). این ورودی‌ها در در کلیدها و زیرکلیدهای رجیستری ذخیره میشوند که از این لحاظ میتوان آنها را با فایلهایی مقایسه کرد که در فهرستها و زیر فهرستها قرار میگیرند.

دستیابی به رجیستری به وسیله توابع Visual Basic .NET
ویژوال بیسیک دات نت چهار تابع را برای کار با رجیستری معرفی میکند که برای استفاده از آنها شما باید اجازه خواندن و نوشتن، یعنی دسترسی RegistryPermissionAccess را داشته باشید. برای اطلاعات بیشتر در این مورد به کلاس RegistryPermission رجوع کنید. در زیر اطلاعاتی را در مورد این توابع مشاهده میکنید:

نام تابع | توضیحات
DeleteSetting | یک ناحیه یا یک کلید که شامل اطلاعات ورودی از برنامه در رجیستری است را حذف میکند.
GetSetting | مقدار یک کلید که شامل اطلاعات ورودی از برنامه در رجیستری است را برمیگرداند.
GetAllSettings | یک لسیت از کلیدها و ارزش آنها که شامل اطلاعات ورودی از برنامه در رجیستری است را برمیگرداند.
SaveSetting | اطلاعات برنامه را در رجیستری ذخیره میکند.

نکته: : اطلاعات یک ناحیه نمیتواند توسط تابع GetSetting برگردانده شود.

مثال زیر یک کلید و دو زیر کلید در رجیستری میسازد، ارزش کلید اول و ارزش دو زیر کلید آنرا را چاپ میکند سپس دومین زیر کلید را حذف و مقدار کلید اول و زیر کلیدهایش را چاپ میکند تا حذف زیر کلید دوم تایید شود:

' Create the first key.
SaveSetting("TestApp","Startup", "FirstKey", "First")

' Create the first subkey.
SaveSetting("TestApp","FirstKey", "FirstSubKey", "FirstSub")

' Create the second subkey.
SaveSetting("TestApp","FirstKey", "SecondSubKey", "SecondSub")

Try
   ' Write the first key's value.
   Console.WriteLine((GetSetting("TestApp", "Startup", "FirstKey"))

   ' Write the first key as well as its two subkeys.
   Console.WriteLine(GetAllSettings("TestApp", "Startup"))

Catch e As ArgumentException
Catch e As Exception
   Console.WriteLine(e.GetType.ToString)
End Try

DeleteSetting("TestApp", "FirstKey", "SecondSubKey")

Try
   Console.WriteLine(GetSetting("TestApp", "Startup", "FirstKey"))
   Console.WriteLine(GetAllSettings("TestApp", "Startup"))

Catch e As ArgumentException
Catch e As Exception
   Console.WriteLine(e.GetType.ToString)
End Try

توجه داشته باشید که استفاده از این توابع با محدودیتهایی همراه است. شما تنها میتوانید به کلیدهای رجیستری در محدوده HKEY_CURRENT_USER\Software\VB and VBA Program Settings دسترسی داشته باشید و همچنین به علت استفاده از کلید HKEY_CURRENT_USER شما حتما باید با نام کاربری معتبر به سیستم وارد شده باشید.

دستیابی به رجیستری توسط NET Framework.
همانطور که مشاهده کردید استفاده از توابع فوق با محدودیتهایی همراه است. NET Framework. برای حل این مشکل دو کلاس Registry و RegistryKey را معرفی میکند که این دو کلاس در فضانام Microsoft.Win32 قرار دارند. کلاس Registry کلیدهای پایه‌ای زیر را فراهم میکند که توسط آنها میتوان به زیر کلیدها و مقادیر آنها دسترسی داشت. خود این کلیدهای اصلی فقط خواندنی هستند. جدول زیر این هفت کلید را نشان میدهد:

نام کلید | توضیحات
ClassesRoot | معرف پسوندهای فایها و انواع اسناد موجود در سیستم به همراه خصوصیات مربوط به آنها.
CurrentConfig | اطلاعات مربوط به سخت افزار که مربوط به کاربر مشخصی نیست.
CurrentUser | اطلاعاتی مربوط به کاربر حاضر مانند تنظیمات محیط کار کاربر.
DynData | شامل اطلاعات پویای رجیستری که برای راه اندازهای دستگاه مجازی بکار میرود.
LocalMachine | شامل پنج زیر کلید (Hardware ،SAM ،Security ،Software و System) که تنظیمات مربوط به سیستم را نگه میدارند.
PerformanceData | شامل اطلاعات اجرایی مربوط به نرم افزارها.
Users | شامل اطلاعات مربوط به اولویتهای پیش فرض کاربر.

مثال زیر نشان میدهد که چگونه یک مقدار DWORD را از کلید HKEY_CURRENT_USER بخوانیم:

Imports Microsoft.Win32

Dim regVersion As RegistryKey
Dim keyValue As String
Dim intVersion As Integer = 0

keyValue = "Software\\Microsoft\\TestApp\\1.0"
regVersion = Registry.CurrentUser.OpenSubKey(keyValue, False)

If (Not regVersion Is Nothing) Then
   intVersion = regVersion.GetValue("Version", 0)
   regVersion.Close()
End If

مثال زیر یک مقدار DWORD را خوانده، یک واحد به آن اضافه کرده و سپس آنرا چاپ میکند:

Imports Microsoft.Win32

Dim keyValue As String
Dim regVersion As RegistryKey
Dim intVersion As Integer = 0

keyValue = "Software\\Microsoft\\TestApp\\1.0"
regVersion = Registry.CurrentUser.OpenSubKey(keyValue, True)

If regVersion Is Nothing Then
   ' Key doesn't exist; create it.
   regVersion = Registry.CurrentUser.CreateSubKey(keyValue)
End If

If (Not regVersion Is Nothing) Then
   intVersion = regVersion.GetValue("Version", 0)
   intVersion = intVersion + 1
   regVersion.SetValue("Version", intVersion)
   regVersion.Close()
End If

مطابق مثال بالا، برای دسترسی به یک کلید ابتدا متغیری از نوع RegistryKey تعریف میکنیم. سپس با استفاده از متد OpenSubKey آدرس کلید مورد نظر را داده تا کلید فوق برای خواندن آماده باشد. اگر پارامتر دوم این کلید برابر True باشد اجازه نوشتن بر روی آن کلید را نیز داریم. برای ساختن یک کلید نیز باید از متد CreateSubKey استفاده کرد. پس از ساختن و یا باز کردن یک کلید رجیستری، با استفاده از دو تابع GetValue و SetValue میتوان مقادیری را در آن کلید نوشت و یا از آن کلید خواند.

توسط رجیستری کارهای بسیار زیادی میتوان انجام داد. شما نیز با کمی تمرین میتوانید برنامه های استاندارد و جالبی را طراحی کنید.

Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫عمومی سازی و بومی سازی در جاوا (1)

عمومی سازی و بومی سازی در جاوا

در این مقاله دو مبحث عمومی سازی (Internationalization) و بومی سازی (Localization) در جاوا مورد برررسی قرار می‌گیرد.

توسط Haghgonia | 21 دی 1382 | 3935 بار مشاهده Printable Version نسخه مخصوص چاپ
1- مقدمه
عمومی سازی به فرآیند طراحی یک نرم افزار بمنظور تطبیق با زبانها و کشورهای مختلف بدون نیاز به تغییر در کد برنامه گفته می‌شود. یک برنامه عمومی شده دارای مشخصات زیر است:
  • در کنار یکسری اطلاعات بومی شده، برنامه می تواند در هر کشور و به هر زبانی اجرا شود.
  • عناصر متنی مانند پیغامها و عنوان اجزا رابط کاربر، در داخل کد برنامه (hard coding) مشخص نمی‌شوند، بلکه در یک منبع خارج از کد برنامه ذخیره و بصورت دینامیک بازیابی می‌شوند.
  • پشتیبانی از زبانهای جدید بدون نیاز به کامپایل مجدد برنامه.
  • اطلاعات حساس به منطقه جغرافیایی از قبیل تاریخ، پول و اعداد مطابق با استانداردهای تعریف شده در کشور کاربر نهایی نمایش داده می‌شود.
  • به آسانی قابل بومی سازی است.

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

1.1- Internationalization
عمومی سازی در حوزه برنامه نویسی عبارتست از فرآیند طراحی و نوشتن یک برنامه بطوریکه بتوان بصورت سراسری و در کشورهای مختلف از آن استفاده کرد.

یک برنامه عمومی شده قابلیت پشتیبانی زبانهای مختلف و پارامترهای وابسته مانند تاریخ، زمان، پول و... را بدون نیاز به تغییر کد برنامه دارا می‌باشد. این ایده تحت عنوان (soft coding) یا جداسازی اجزاء رابط کاربر از کد منطق برنامه نیز مطرح می‌شود.

به جای کلمه Internationalization از مخفف آن I18N استفاده می‌شود. توضیح اینکه بین کاراکترهای شروع و پایان این کلمه 18 کاراکتر وجود دارد. بنابراین برای سهولت از کلمه I18N و همچنین از I18N'd به جای Internationalizationed استفاده می‌شود.

2.1- Localization
بومی‌سازی به فرآیند طراحی و پیاده‌سازی یک نرم افزار با قابلیت تطابق با یک زبان، فرهنگ، کشور و منطقه خاص گفته می‌شود. بسیاری از برنامه‌های نوشته شده برای یک کشور یا منطقه خاصی تنها در آن محدوده جغرافیائی قابل استفاده‌ می‌باشند.

به جای کلمه Localization از مخفف آن L10N نیز استفاده می‌شود.

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

2- عمومی سازی و بومی سازی در زبان جاوا
برخلاف سایر زبانهای برنامه‌نویسی، برنامه‌نویسان جاوا از امکانات و قابلیت‌های خوبی برای I18N برخوردار هستند.

1.2- پشتیبانی یونی‌کد (Unicode Support)
کاراکترست (Character Set) زبان جاوا بر مبنای یونی‌کد (Unicode) است، بدین منظور نوع داده‌ای char برای تطابق با یونی‌کد، دو بایتی (16 بیت) در نظر گرفته شده است. بنابراین نوع داده‌ای String که با استفاده از char ساخته می‌شود نیز یونی‌کد را پشتیبانی می‌کند. یونی‌کد طوری تعریف شده است که مقادیر 0 تا 127 برای استاندارد ASCII و 0 تا 255 برای استاندارد ISO 8859-1 (Latin-1) را در برمی‌گیرد. به دلیل شروع شدن دو استاندارد با عدد صفر، برنامه‌نویسانی که از قابلیت‌های I18N استفاده نمی‌کنند یا آشنا نیستند نیز می‌توانند بدون نیاز به شناخت یونی‌کد، برنامه‌هایی بنویسند که یونی‌کد را پشتیبانی کند، اما برنامه‌نویسانی که در محیط ویندوز برنامه می‌نویسند بایستی از تفاوت‌های استاندارد ISO 8859-1 و Windows Latin-1 (CP1252) آگاهی داشته باشند.

طول 16 بیتی نوع داده‌ای char امکان ذخیره سازی مقادیر 0 تا 65535 را فراهم می‌سازد. یک مقدار یونی‌کد با '\u' شروع و یک مقدار هگزادسیمال (مبنای 16) از 0000 تا FFFF پس از آن قرار می‌گیرد. دو خط مثال زیر، کاراکتر a را تعریف می‌کند:

char c1 = 'a'
char c2 = '\u0061'

نسخه JDK 1.3 یونی‌کد 2.1 و نسخه JDK 1.4 یونی‌کد 3.0 را پشتیبانی می‌کند.

سؤالی که مطرح می‌شود این است که آیا همه پلاتفرم‌ها یونی‌کد را پشتیبانی می‌کنند؟ جواب: در جاوا تمام استریم‌ها (Stream) که کاراکترها را پشتیبانی می‌کنند (java.io.Reader و java.io.Writer) به صورت اتوماتیک یک لایه مخفی که وظیفه تبدیل یونی‌کد به Encoding خاص سیستم عامل و بالعکس را انجام می‌دهند را فراخوانی می‌سازند. از طرف دیگر کلاسهای java.io.InputStreamReader و java.io.OutputStreamWriter دارای متدهایی برای تبدیل Encoding می‌باشند.

2.2- Locale
Locale در زبان جاوا مجموعه‌ای از کلاسها برای سفارشی کردن، تغییر، نمایش و شکل دهی اطلاعات است. این کلاسها روی انتخاب زبان، تقویم، تاریخ و زمان تأثیر می‌گذارند. یک شیء از کلاس java.util.Locale نشان‌دهنده یک ناحیه جغرافیائی خاص با زبان آن ناحیه می‌باشد.

3.2- Language
زبانهای قابل استفاده در Locale طبق استاندارد ISO 639 می‌باشد. جدول زیر چند مثال از نام زبان و کد تعریف شده را نشان می‌دهد. یک کد زبان با جزئیات آن زبان در نواحی مختلف استفاده نمی‌شود، برای مثال ممکن است Canadian French و Swiss French دارای گرامر و قوانین و واژه‌های متفاوت باشند ولی برای هر دو این زبانها کد fr در نظر گرفته می‌شود. به همین دلیل تنها زبانهای عمومی تعریف شده‌اند:

کد زبان | زبان
en | English
fr | French
zh | Chinese
ja | Japanese
ar | Arabic

4.2- Country
کشورهای قابل استفاده در Locale طبق استاندارد ISO 3165 می‌باشد. کد کشور در این استاندارد 2 رقمی و با حروف بزرگ تعریف شده است. جدول زیر تعدادی از کشورهای تعریف شده را نشان می‌دهد.

کد کشور | کشور
US | United States
FR | France
CA | Canada
SA | Saudi Arabia

5.2- Variant
Variant یک پسوند اختیاری برای یک Locale می‌باشد. Variant یک Locale سفارشی تعریف می‌کند که با Language و Country قابل ساخت نیست. از Variant می‌توان برای اضافه کردن یک مشخصه اضافی برای تعریف Locale استفاده کرد. برای مثال en _ us نشاندهنده English (United States) است اما en_us_ca برای تعریف English (U.S.A, California) یا en_us_mac برای تعریف English (U.S.A, Macintosh) می‌باشد.

3- استفاده از Locale در جاوا
کلاس Locale دو سازنده (Constructor) دارد:

Locale (String language, String country)
Locale (String language, String country, String variant)

مثال:

Locale mylocale = new Locale ("en", "US")

در مثال بالا en زبان انگلیسی و US کشور آمریکا را تعریف می‌کند.

1.3- Number
عبارت 1,234 چه عددی را نشان می‌دهد؟ جواب به منطقه و کشور بستگی دارد. در آمریکا این عبارت معنی "یک هزار و دویست و سی و چهار" را دارد اما در فرانسه این عبارت به معنی "یک و دویست و سی و چهار هزارم" است. بنابراین در نظر گرفتن قوانین نمایش اعداد و جدا کننده‌ها بسیار مهم بنظر می‌رسد. کلاس java.text.NumberFormat تعریف چگونگی نمایش اعداد برای یک منطقه خاص را به عهده دارد.

2.3- Currency
هر کشور یا منطقه دارای واحد پولی جداگانه است. علاوه بر این مواردی از قبیل علامت اعداد منفی، صفر، جداکننده رقم‌ها، علامت نقطه اعشاری و مکان قرار گرفتن علامت پول ($10، 10 ریال) نیز در کشورها متفاوت است. متد getCurrencyInstance در کلاس java.text.NumberFormat امکان پرداختن به جزئیات شکل دهی اعداد پولی یک کشور خاص را فراهم می‌سازد.

3.3- Date
مشابه سایر ساختارهای حساس به موقعیت جغرافیایی، فیلد تاریخ نیز جزئیات خاص خود را دارد. کوتاه یا کامل بودن تاریخ، جدا کننده روز، ماه و سال و نیز ترتیب آنها در کشورهای مختلف با یکدیگر متفاوت است.

4.3- Calendar
کلاس java.text.Calendar بسیار نزدیک به کلاس java.util.Date است و اجازه می‌دهد سال، ماه، روز و زمان را از یک تاریخ استخراج نمایند. متد getCalendarInstance یک Calendar برای کشور مورد نظر بر می‌گرداند. تنها تقویم پیاده‌سازی توسط شرکت سان میکرو سیستم تقویم Gregorian می‌باشد. برای ساختن تقویم‌های محلی توصیه می‌شود از کلاس Calendar جاوا استفاده شود.

5.3- Resource Bundle
ویژگی عمومی ساختن در JDK، مکانیزمی برای جداسازی عناصر رابط کاربر و سایر اطلاعات حساس به منطقه جغرافیایی از منطق برنامه است. این جداسازی انتقال فرآیند و تبدیل را آسان می‌سازد. بدین معنی که یک کد واحد نوشته می‌شود، در حالیکه ممکن است 30 نسخه به زبان‌های مختلف از آن تولید شود.

Resource Bundle شامل یک فایل با فرمت ASCII است. نام این فایل شامل دو قسمت، نام اصلی و یک پسوند است. برای مثال برای ایجاد یک Resource Bundle با نام MyBundle برای زبانهای ژاپنی و فرانسوی دو فایل بنام‌های MyBundle_ja_JP و MyBundle_fr_FR با پسوند properties تعریف می‌شود. هر فایل Resource Bundle شامل یکسری زوج کلید / مقدار است. در هر خط بایستی یک زوج کلید / مقدار تعریف شود. مثال:

#MyResource.properties
#<key>=<value>
Text_not_found=The file could not be found
Text_Hello=Hello, world!

متد getBundle در کلاس java.util.ResourceBundle امکان دسترسی به یک Resource Bundle را فراهم می‌سازد. مثال کاملی از تعریف Locale برای زبان فارسی در انتهای این مقاله ذکر شده است.

6.3- Character Sets
زبان جاوا با استفاده از یونی‌کد برای نمایش متن، فرآیند ذخیره سازی، دستکاری و نمایش کاراکترها را آسان ساخته است. یونی‌کد یک کارکترست 16 بیتی است بدین معنی که می‌تواند 216 کاراکتر تعریف کند. هر کاراکتر در این مجموعه منحصر بفرد است.

7.3- Layout Manager
Layout Manager در یک برنامه چند زبانه بدلیل دو مشکل اساسی در هنگام ترجمه رابط کاربر بسیار مهم است:
  • افزایش و کاهش طول متن ترجمه شده
  • موقعیت اجزاء رابط کاربر
متن ترجمه شده اغلب کوتاه‌تر یا بلندتر از متن اصلی است. Layout Manager نقش بسیار مهمی دارد چون اندازه اجزاء رابط کاربر را با توجه به طول متن استفاده شده در عنوان آن تغییر می‌دهد و همچنین جابجایی اجزاء رابط کاربر را بدلیل تغییر اندازه متن کنترل می‌کند.

4- یک مثال ساده
در این قسمت یک مثال ساده که پیغام‌هایی را به چندین زبان نمایش می‌دهد توضیح داده می‌شود. در این مثال با کلاسهای Locale و ResourceBundle جاوا آشنا می‌شوید.

1.4- قبل از Internationalization
در نظر بگیرید که یک برنامه نوشته اید که چند پیغام را نمایش می‌دهد:

public class NotI18N {
    static public void main(String[] args) {
        System.out.println("Hello.");
        System.out.println("How are you?");
        System.out.println("Goodbye.");
    }
}

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

2.4- بعد از Internationalization
کد زیر تغییر یافته برنامه شما را نشان می‌دهد. توجه کنید که متن پیغامها از داخل کد برنامه خارج شده است:

import java.util.*;

public class I18NSample {

    static public void main(String[] args) {

        String language;
        String country;

        if (args.length != 2) {
            language = new String("en");
            country = new String("US");
        } else {
            language = new String(args[0]);
            country = new String(args[1]);
        }

        Locale currentLocale;
        ResourceBundle messages;

        currentLocale = new Locale(language, country);

        messages = ResourceBundle.getBundle("MessagesBundle", currentLocale);
        System.out.println(messages.getString("greetings"));
        System.out.println(messages.getString("inquiry"));
        System.out.println(messages.getString("farewell"));
    }
}

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

- I18NSample.java
- MessageBundle.properies
- MessageBundle_de_DE.properties
- MessageBundle_en_US.properties
- MessageBundle_fr_FR.properties
- MessageBundle_ar_SA.properties

3.4- اجرای برنامه
برنامه عمومی شده انعطاف پذیر است: این برنامه به کاربر نهایی اجازه می‌دهد کشور و زبان را بصورت پارامتر به برنامه وارد کند.

مثال زیر نتیجه اجرای برنامه را برای زبان فرانسوی (French) fr و کشور فرانسه (France) FR نشان می‌دهد:

greetings = Bonjour
farewell = Au revoir
inquiry = Comment allez-vous?
فایل MessageBundle_fr_FR.properties

% java I18NSample fr FR

Bonjour.
Comment allez-vous?
Au revoir.
خروجی برنامه

مثال بعدی نتیجه اجرای برنامه را برای زبان انگلیسی (English) en و کشور آمریکا (United States) US نشان می‌دهد:

greetings = Hello
farewell = Goodbye
inquiry = How are you?
فایل MessageBundle.properties

% java I18NSample en US

Hello.
How are you?
Goodbye.
خروجی برنامه

5- اقدامات لازم برای I18N
بسیاری از برنامه‌ها از ابتدا عمومی و چند زبانه نیستند. این برنامه ها ممکن است از یک Prototype شروع شوند و یا قابلیت چند زبانه بودن در آنها در نظر گرفته نشده باشد. برای I18N ساختن یک برنامه موجود، بایستی مراحل زیر طی شده باشد:

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

  • پیغامها
  • عنوان اجزای رابط کاربر
  • صداها
  • رنگها
  • گرافیک و تصاویر
  • تاریخ
  • زمان
  • پول
  • واحدهای اندازه گیری
  • شماره تلفن
  • آدرسهای پستی
  • طراحی صفحات

2.5- جداسازی متنهای قابل ترجمه و انتقال به Resource Bundles
فرآیند ترجمه هزینه بر و گران است. شما می توانید این هزینه را با جداسازی متنهای نیازمند ترجمه و قرار دادن آنها در یک Resource Bundle کاهش دهید.

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

String buttonLabel = "OK";
...
JButton okButton = new JButton(buttonLabel);

3.5- پیغامهای ترکیبی (Compound Messages)
پیغامهای ترکیبی حاوی اطلاعات متغیر است. برای مثال در پیغام ".The disk contains 1100 files" عدد 1100 می تواند متغیر باشد. ترجمه این نوع پیغام بسیار مشکل است، زیرا برای مثال محل قرار گرفتن عدد 1100 در این عبارت در زبانهای مختلف با یکدیگر متفاوت است. پیغام زیر قابل ترجمه نیست چون ترتیب قرار گرفتن قسمتهای این جمله در داخل کد برنامه مشخص شده است.

Integer fileCount;
...
String diskStatus = "The disk contains " + fileCount.toString() + " files.";

4.5- نمایش اعداد و پول
اگر برنامه اعداد یا پول را نمایش می‌دهد، بایستی این اطلاعات به روشی مستقل از کشور یا منطقه خاص نمایش داده شود. کد زیر عمومی نیست چرا که نمی تواند اعداد را بصورت صحیح در تمام کشورها نمایش دهد:

Double amount;
TextField amountField;
...
String displayAmount = amount.toString();
amountField.setText(displayAmount);

در جاوا کلاس NumberFormat برای تغییر نمایش اعداد به زبانهای مختلف در نظر گرفته شده است.

5.5- نمایش تاریخ و زمان
نمایش تاریخ و زمان نیز مشابه اعداد با توجه به زبان و کشور متفاوت است. اگر شما کدی مشابه زیر در برنامه دارید، بایستی آنرا تغییر دهید:

Date currentDate = new Date();
TextField dateField;
...
String dateString = currentDate.toString();
dateField.setText(dateString);

در زبان جاوا کلاس DateFormat وظیفه تنظیم چگونگی نمایش تاریخ و زمان را بر عهده دارد.

6.5- استفاده از قابلیتهای یونی‌کد
کد زیر سعی می‌کند کاراکتر بودن یک حرف را بررسی کند:

char ch;
...
if ((ch >= 'a' && ch <= 'z') ||
    (ch >= 'A' && ch <= 'Z'))       // WRONG!

این کد تنها برای زبان انگلیسی قابل استفاده است. برای مثال این کد، حرف ü در کلمه آلمانی Grün را یا حرف پ در کلمه پارس را کاراکتر تشخیص نمی‌دهد.

متدهای مقایسه موجود در کلاس Character از استاندارد یونی‌کد برای شناسایی کاراکترها استفاده می‌کند. بنابراین کد بالا را می توان بصورت زیر تغییر داد:

char ch;
...
if (Character.isLetter(ch))

7.5- مقایسه رشته‌ها
معمولا هنگام مرتب سازی متن، رشته ها با یکدیگر مقایسه می‌شوند. یک برنامه معمولی برای مقایسه دو رشته ممکن است از کدی بصورت زیر استفاده کند:

String target;
String candidate;
...
if (target.equals(candidate)) {
...
if (target.compareTo(candidate) < 0) {
...

متدهای String.equals و String.compareTo عمل مقایسه را بصورت باینری انجام می دهند که برای بیشتر زبانهای موجود ناکارآمد است. برای مقایسه دو رشته بهتر است از کلاس Collator استفاده شود.

8.5- تبدیل متنهای غیر یونی‌کد
کاراکترها در زبان برنامه نویسی جاوا بصورت یونی‌کد ذخیره می‌شود. اگر برنامه شما از اطلاعات غیر از یونی‌کد استفاده می‌کند، بایستی اطلاعات را به یونی‌کد تبدیل نمایید.

1 2 قسمت بعد »
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫عمومی سازی و بومی سازی در جاوا (1)

عمومی سازی و بومی سازی در جاوا

در این مقاله دو مبحث عمومی سازی (Internationalization) و بومی سازی (Localization) در جاوا مورد برررسی قرار می‌گیرد.

توسط Haghgonia | 21 دی 1382 | 3936 بار مشاهده Printable Version نسخه مخصوص چاپ
1- مقدمه
عمومی سازی به فرآیند طراحی یک نرم افزار بمنظور تطبیق با زبانها و کشورهای مختلف بدون نیاز به تغییر در کد برنامه گفته می‌شود. یک برنامه عمومی شده دارای مشخصات زیر است:
  • در کنار یکسری اطلاعات بومی شده، برنامه می تواند در هر کشور و به هر زبانی اجرا شود.
  • عناصر متنی مانند پیغامها و عنوان اجزا رابط کاربر، در داخل کد برنامه (hard coding) مشخص نمی‌شوند، بلکه در یک منبع خارج از کد برنامه ذخیره و بصورت دینامیک بازیابی می‌شوند.
  • پشتیبانی از زبانهای جدید بدون نیاز به کامپایل مجدد برنامه.
  • اطلاعات حساس به منطقه جغرافیایی از قبیل تاریخ، پول و اعداد مطابق با استانداردهای تعریف شده در کشور کاربر نهایی نمایش داده می‌شود.
  • به آسانی قابل بومی سازی است.

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

1.1- Internationalization
عمومی سازی در حوزه برنامه نویسی عبارتست از فرآیند طراحی و نوشتن یک برنامه بطوریکه بتوان بصورت سراسری و در کشورهای مختلف از آن استفاده کرد.

یک برنامه عمومی شده قابلیت پشتیبانی زبانهای مختلف و پارامترهای وابسته مانند تاریخ، زمان، پول و... را بدون نیاز به تغییر کد برنامه دارا می‌باشد. این ایده تحت عنوان (soft coding) یا جداسازی اجزاء رابط کاربر از کد منطق برنامه نیز مطرح می‌شود.

به جای کلمه Internationalization از مخفف آن I18N استفاده می‌شود. توضیح اینکه بین کاراکترهای شروع و پایان این کلمه 18 کاراکتر وجود دارد. بنابراین برای سهولت از کلمه I18N و همچنین از I18N'd به جای Internationalizationed استفاده می‌شود.

2.1- Localization
بومی‌سازی به فرآیند طراحی و پیاده‌سازی یک نرم افزار با قابلیت تطابق با یک زبان، فرهنگ، کشور و منطقه خاص گفته می‌شود. بسیاری از برنامه‌های نوشته شده برای یک کشور یا منطقه خاصی تنها در آن محدوده جغرافیائی قابل استفاده‌ می‌باشند.

به جای کلمه Localization از مخفف آن L10N نیز استفاده می‌شود.

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

2- عمومی سازی و بومی سازی در زبان جاوا
برخلاف سایر زبانهای برنامه‌نویسی، برنامه‌نویسان جاوا از امکانات و قابلیت‌های خوبی برای I18N برخوردار هستند.

1.2- پشتیبانی یونی‌کد (Unicode Support)
کاراکترست (Character Set) زبان جاوا بر مبنای یونی‌کد (Unicode) است، بدین منظور نوع داده‌ای char برای تطابق با یونی‌کد، دو بایتی (16 بیت) در نظر گرفته شده است. بنابراین نوع داده‌ای String که با استفاده از char ساخته می‌شود نیز یونی‌کد را پشتیبانی می‌کند. یونی‌کد طوری تعریف شده است که مقادیر 0 تا 127 برای استاندارد ASCII و 0 تا 255 برای استاندارد ISO 8859-1 (Latin-1) را در برمی‌گیرد. به دلیل شروع شدن دو استاندارد با عدد صفر، برنامه‌نویسانی که از قابلیت‌های I18N استفاده نمی‌کنند یا آشنا نیستند نیز می‌توانند بدون نیاز به شناخت یونی‌کد، برنامه‌هایی بنویسند که یونی‌کد را پشتیبانی کند، اما برنامه‌نویسانی که در محیط ویندوز برنامه می‌نویسند بایستی از تفاوت‌های استاندارد ISO 8859-1 و Windows Latin-1 (CP1252) آگاهی داشته باشند.

طول 16 بیتی نوع داده‌ای char امکان ذخیره سازی مقادیر 0 تا 65535 را فراهم می‌سازد. یک مقدار یونی‌کد با '\u' شروع و یک مقدار هگزادسیمال (مبنای 16) از 0000 تا FFFF پس از آن قرار می‌گیرد. دو خط مثال زیر، کاراکتر a را تعریف می‌کند:

char c1 = 'a'
char c2 = '\u0061'

نسخه JDK 1.3 یونی‌کد 2.1 و نسخه JDK 1.4 یونی‌کد 3.0 را پشتیبانی می‌کند.

سؤالی که مطرح می‌شود این است که آیا همه پلاتفرم‌ها یونی‌کد را پشتیبانی می‌کنند؟ جواب: در جاوا تمام استریم‌ها (Stream) که کاراکترها را پشتیبانی می‌کنند (java.io.Reader و java.io.Writer) به صورت اتوماتیک یک لایه مخفی که وظیفه تبدیل یونی‌کد به Encoding خاص سیستم عامل و بالعکس را انجام می‌دهند را فراخوانی می‌سازند. از طرف دیگر کلاسهای java.io.InputStreamReader و java.io.OutputStreamWriter دارای متدهایی برای تبدیل Encoding می‌باشند.

2.2- Locale
Locale در زبان جاوا مجموعه‌ای از کلاسها برای سفارشی کردن، تغییر، نمایش و شکل دهی اطلاعات است. این کلاسها روی انتخاب زبان، تقویم، تاریخ و زمان تأثیر می‌گذارند. یک شیء از کلاس java.util.Locale نشان‌دهنده یک ناحیه جغرافیائی خاص با زبان آن ناحیه می‌باشد.

3.2- Language
زبانهای قابل استفاده در Locale طبق استاندارد ISO 639 می‌باشد. جدول زیر چند مثال از نام زبان و کد تعریف شده را نشان می‌دهد. یک کد زبان با جزئیات آن زبان در نواحی مختلف استفاده نمی‌شود، برای مثال ممکن است Canadian French و Swiss French دارای گرامر و قوانین و واژه‌های متفاوت باشند ولی برای هر دو این زبانها کد fr در نظر گرفته می‌شود. به همین دلیل تنها زبانهای عمومی تعریف شده‌اند:

کد زبان | زبان
en | English
fr | French
zh | Chinese
ja | Japanese
ar | Arabic

4.2- Country
کشورهای قابل استفاده در Locale طبق استاندارد ISO 3165 می‌باشد. کد کشور در این استاندارد 2 رقمی و با حروف بزرگ تعریف شده است. جدول زیر تعدادی از کشورهای تعریف شده را نشان می‌دهد.

کد کشور | کشور
US | United States
FR | France
CA | Canada
SA | Saudi Arabia

5.2- Variant
Variant یک پسوند اختیاری برای یک Locale می‌باشد. Variant یک Locale سفارشی تعریف می‌کند که با Language و Country قابل ساخت نیست. از Variant می‌توان برای اضافه کردن یک مشخصه اضافی برای تعریف Locale استفاده کرد. برای مثال en _ us نشاندهنده English (United States) است اما en_us_ca برای تعریف English (U.S.A, California) یا en_us_mac برای تعریف English (U.S.A, Macintosh) می‌باشد.

3- استفاده از Locale در جاوا
کلاس Locale دو سازنده (Constructor) دارد:

Locale (String language, String country)
Locale (String language, String country, String variant)

مثال:

Locale mylocale = new Locale ("en", "US")

در مثال بالا en زبان انگلیسی و US کشور آمریکا را تعریف می‌کند.

1.3- Number
عبارت 1,234 چه عددی را نشان می‌دهد؟ جواب به منطقه و کشور بستگی دارد. در آمریکا این عبارت معنی "یک هزار و دویست و سی و چهار" را دارد اما در فرانسه این عبارت به معنی "یک و دویست و سی و چهار هزارم" است. بنابراین در نظر گرفتن قوانین نمایش اعداد و جدا کننده‌ها بسیار مهم بنظر می‌رسد. کلاس java.text.NumberFormat تعریف چگونگی نمایش اعداد برای یک منطقه خاص را به عهده دارد.

2.3- Currency
هر کشور یا منطقه دارای واحد پولی جداگانه است. علاوه بر این مواردی از قبیل علامت اعداد منفی، صفر، جداکننده رقم‌ها، علامت نقطه اعشاری و مکان قرار گرفتن علامت پول ($10، 10 ریال) نیز در کشورها متفاوت است. متد getCurrencyInstance در کلاس java.text.NumberFormat امکان پرداختن به جزئیات شکل دهی اعداد پولی یک کشور خاص را فراهم می‌سازد.

3.3- Date
مشابه سایر ساختارهای حساس به موقعیت جغرافیایی، فیلد تاریخ نیز جزئیات خاص خود را دارد. کوتاه یا کامل بودن تاریخ، جدا کننده روز، ماه و سال و نیز ترتیب آنها در کشورهای مختلف با یکدیگر متفاوت است.

4.3- Calendar
کلاس java.text.Calendar بسیار نزدیک به کلاس java.util.Date است و اجازه می‌دهد سال، ماه، روز و زمان را از یک تاریخ استخراج نمایند. متد getCalendarInstance یک Calendar برای کشور مورد نظر بر می‌گرداند. تنها تقویم پیاده‌سازی توسط شرکت سان میکرو سیستم تقویم Gregorian می‌باشد. برای ساختن تقویم‌های محلی توصیه می‌شود از کلاس Calendar جاوا استفاده شود.

5.3- Resource Bundle
ویژگی عمومی ساختن در JDK، مکانیزمی برای جداسازی عناصر رابط کاربر و سایر اطلاعات حساس به منطقه جغرافیایی از منطق برنامه است. این جداسازی انتقال فرآیند و تبدیل را آسان می‌سازد. بدین معنی که یک کد واحد نوشته می‌شود، در حالیکه ممکن است 30 نسخه به زبان‌های مختلف از آن تولید شود.

Resource Bundle شامل یک فایل با فرمت ASCII است. نام این فایل شامل دو قسمت، نام اصلی و یک پسوند است. برای مثال برای ایجاد یک Resource Bundle با نام MyBundle برای زبانهای ژاپنی و فرانسوی دو فایل بنام‌های MyBundle_ja_JP و MyBundle_fr_FR با پسوند properties تعریف می‌شود. هر فایل Resource Bundle شامل یکسری زوج کلید / مقدار است. در هر خط بایستی یک زوج کلید / مقدار تعریف شود. مثال:

#MyResource.properties
#<key>=<value>
Text_not_found=The file could not be found
Text_Hello=Hello, world!

متد getBundle در کلاس java.util.ResourceBundle امکان دسترسی به یک Resource Bundle را فراهم می‌سازد. مثال کاملی از تعریف Locale برای زبان فارسی در انتهای این مقاله ذکر شده است.

6.3- Character Sets
زبان جاوا با استفاده از یونی‌کد برای نمایش متن، فرآیند ذخیره سازی، دستکاری و نمایش کاراکترها را آسان ساخته است. یونی‌کد یک کارکترست 16 بیتی است بدین معنی که می‌تواند 216 کاراکتر تعریف کند. هر کاراکتر در این مجموعه منحصر بفرد است.

7.3- Layout Manager
Layout Manager در یک برنامه چند زبانه بدلیل دو مشکل اساسی در هنگام ترجمه رابط کاربر بسیار مهم است:
  • افزایش و کاهش طول متن ترجمه شده
  • موقعیت اجزاء رابط کاربر
متن ترجمه شده اغلب کوتاه‌تر یا بلندتر از متن اصلی است. Layout Manager نقش بسیار مهمی دارد چون اندازه اجزاء رابط کاربر را با توجه به طول متن استفاده شده در عنوان آن تغییر می‌دهد و همچنین جابجایی اجزاء رابط کاربر را بدلیل تغییر اندازه متن کنترل می‌کند.

4- یک مثال ساده
در این قسمت یک مثال ساده که پیغام‌هایی را به چندین زبان نمایش می‌دهد توضیح داده می‌شود. در این مثال با کلاسهای Locale و ResourceBundle جاوا آشنا می‌شوید.

1.4- قبل از Internationalization
در نظر بگیرید که یک برنامه نوشته اید که چند پیغام را نمایش می‌دهد:

public class NotI18N {
    static public void main(String[] args) {
        System.out.println("Hello.");
        System.out.println("How are you?");
        System.out.println("Goodbye.");
    }
}

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

2.4- بعد از Internationalization
کد زیر تغییر یافته برنامه شما را نشان می‌دهد. توجه کنید که متن پیغامها از داخل کد برنامه خارج شده است:

import java.util.*;

public class I18NSample {

    static public void main(String[] args) {

        String language;
        String country;

        if (args.length != 2) {
            language = new String("en");
            country = new String("US");
        } else {
            language = new String(args[0]);
            country = new String(args[1]);
        }

        Locale currentLocale;
        ResourceBundle messages;

        currentLocale = new Locale(language, country);

        messages = ResourceBundle.getBundle("MessagesBundle", currentLocale);
        System.out.println(messages.getString("greetings"));
        System.out.println(messages.getString("inquiry"));
        System.out.println(messages.getString("farewell"));
    }
}

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

- I18NSample.java
- MessageBundle.properies
- MessageBundle_de_DE.properties
- MessageBundle_en_US.properties
- MessageBundle_fr_FR.properties
- MessageBundle_ar_SA.properties

3.4- اجرای برنامه
برنامه عمومی شده انعطاف پذیر است: این برنامه به کاربر نهایی اجازه می‌دهد کشور و زبان را بصورت پارامتر به برنامه وارد کند.

مثال زیر نتیجه اجرای برنامه را برای زبان فرانسوی (French) fr و کشور فرانسه (France) FR نشان می‌دهد:

greetings = Bonjour
farewell = Au revoir
inquiry = Comment allez-vous?
فایل MessageBundle_fr_FR.properties

% java I18NSample fr FR

Bonjour.
Comment allez-vous?
Au revoir.
خروجی برنامه

مثال بعدی نتیجه اجرای برنامه را برای زبان انگلیسی (English) en و کشور آمریکا (United States) US نشان می‌دهد:

greetings = Hello
farewell = Goodbye
inquiry = How are you?
فایل MessageBundle.properties

% java I18NSample en US

Hello.
How are you?
Goodbye.
خروجی برنامه

5- اقدامات لازم برای I18N
بسیاری از برنامه‌ها از ابتدا عمومی و چند زبانه نیستند. این برنامه ها ممکن است از یک Prototype شروع شوند و یا قابلیت چند زبانه بودن در آنها در نظر گرفته نشده باشد. برای I18N ساختن یک برنامه موجود، بایستی مراحل زیر طی شده باشد:

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

  • پیغامها
  • عنوان اجزای رابط کاربر
  • صداها
  • رنگها
  • گرافیک و تصاویر
  • تاریخ
  • زمان
  • پول
  • واحدهای اندازه گیری
  • شماره تلفن
  • آدرسهای پستی
  • طراحی صفحات

2.5- جداسازی متنهای قابل ترجمه و انتقال به Resource Bundles
فرآیند ترجمه هزینه بر و گران است. شما می توانید این هزینه را با جداسازی متنهای نیازمند ترجمه و قرار دادن آنها در یک Resource Bundle کاهش دهید.

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

String buttonLabel = "OK";
...
JButton okButton = new JButton(buttonLabel);

3.5- پیغامهای ترکیبی (Compound Messages)
پیغامهای ترکیبی حاوی اطلاعات متغیر است. برای مثال در پیغام ".The disk contains 1100 files" عدد 1100 می تواند متغیر باشد. ترجمه این نوع پیغام بسیار مشکل است، زیرا برای مثال محل قرار گرفتن عدد 1100 در این عبارت در زبانهای مختلف با یکدیگر متفاوت است. پیغام زیر قابل ترجمه نیست چون ترتیب قرار گرفتن قسمتهای این جمله در داخل کد برنامه مشخص شده است.

Integer fileCount;
...
String diskStatus = "The disk contains " + fileCount.toString() + " files.";

4.5- نمایش اعداد و پول
اگر برنامه اعداد یا پول را نمایش می‌دهد، بایستی این اطلاعات به روشی مستقل از کشور یا منطقه خاص نمایش داده شود. کد زیر عمومی نیست چرا که نمی تواند اعداد را بصورت صحیح در تمام کشورها نمایش دهد:

Double amount;
TextField amountField;
...
String displayAmount = amount.toString();
amountField.setText(displayAmount);

در جاوا کلاس NumberFormat برای تغییر نمایش اعداد به زبانهای مختلف در نظر گرفته شده است.

5.5- نمایش تاریخ و زمان
نمایش تاریخ و زمان نیز مشابه اعداد با توجه به زبان و کشور متفاوت است. اگر شما کدی مشابه زیر در برنامه دارید، بایستی آنرا تغییر دهید:

Date currentDate = new Date();
TextField dateField;
...
String dateString = currentDate.toString();
dateField.setText(dateString);

در زبان جاوا کلاس DateFormat وظیفه تنظیم چگونگی نمایش تاریخ و زمان را بر عهده دارد.

6.5- استفاده از قابلیتهای یونی‌کد
کد زیر سعی می‌کند کاراکتر بودن یک حرف را بررسی کند:

char ch;
...
if ((ch >= 'a' && ch <= 'z') ||
    (ch >= 'A' && ch <= 'Z'))       // WRONG!

این کد تنها برای زبان انگلیسی قابل استفاده است. برای مثال این کد، حرف ü در کلمه آلمانی Grün را یا حرف پ در کلمه پارس را کاراکتر تشخیص نمی‌دهد.

متدهای مقایسه موجود در کلاس Character از استاندارد یونی‌کد برای شناسایی کاراکترها استفاده می‌کند. بنابراین کد بالا را می توان بصورت زیر تغییر داد:

char ch;
...
if (Character.isLetter(ch))

7.5- مقایسه رشته‌ها
معمولا هنگام مرتب سازی متن، رشته ها با یکدیگر مقایسه می‌شوند. یک برنامه معمولی برای مقایسه دو رشته ممکن است از کدی بصورت زیر استفاده کند:

String target;
String candidate;
...
if (target.equals(candidate)) {
...
if (target.compareTo(candidate) < 0) {
...

متدهای String.equals و String.compareTo عمل مقایسه را بصورت باینری انجام می دهند که برای بیشتر زبانهای موجود ناکارآمد است. برای مقایسه دو رشته بهتر است از کلاس Collator استفاده شود.

8.5- تبدیل متنهای غیر یونی‌کد
کاراکترها در زبان برنامه نویسی جاوا بصورت یونی‌کد ذخیره می‌شود. اگر برنامه شما از اطلاعات غیر از یونی‌کد استفاده می‌کند، بایستی اطلاعات را به یونی‌کد تبدیل نمایید.

1 2 قسمت بعد »
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫عمومی سازی و بومی سازی در جاوا (2)

عمومی سازی و بومی سازی در جاوا

در این مقاله دو مبحث عمومی سازی (Internationalization) و بومی سازی (Localization) در جاوا مورد برررسی قرار می‌گیرد.

توسط Haghgonia | 21 دی 1382 | 3935 بار مشاهده Printable Version نسخه مخصوص چاپ
6- نمایش اعداد

1.6- استفاده از فرمتهای از پیش تعریف شده
با فراخوانی متدهای موجود در کلاس NumberFormat می‌توان رشته‌های حاوی اعداد، مقادیر پولی و علامت درصد را برای یک منطقه جغرافیایی خاص نمایش داد.

1.1.6- اعداد
با استفاده از متدهای کلاس NumberFormat می‌توان چگونگی نمایش اعداد از نوع double را تعریف کرد. مثال زیر یک عدد اعشاری را با توجه به منطقه تعریف شده نمایش میدهد:

Double amount = new Double(345987.246);
NumberFormat numberFormatter;
String amountOut;

numberFormatter = NumberFormat.getNumberInstance(currentLocale);
amountOut = numberFormatter.format(amount);
System.out.println(amountOut + " " + currentLocale.toString());

متد getNumberInstance الگوی نمایش منطقه مورد نظر را در صورت وجود برمیگرداند. خروجی مثال برای چندین منطقه مختلف:

345 987,246  fr_FR
345.987,246  de_DE
345,987.246  en_US

2.1.6- پول
اگر برنامه شما تجاری باشد، شما ممکن است نیاز داشته باشید اعداد یا مقادیر پولی را نمایش دهید. مشابه اعداد، مقادیر پولی را نیز می‌توان با توجه به یک منطقه خاص نمایش داد، با این تفاوت که متد getCurrencyInstance الگوی نمایش منطقه مورد نظر را برمی‌گرداند.

Double currency = new Double(9876543.21);
NumberFormat currencyFormatter;
String currencyOut;

currencyFormatter = NumberFormat.getCurrencyInstance(currentLocale);
currencyOut = currencyFormatter.format(currency);
System.out.println(currencyOut + " " + currentLocale.toString());

خروجی مثال برای چندین منطقه مختلف:

9 876 543,21 F   fr_FR
9.876.543,21 DM  de_DE
$9,876,543.21    en_US

در نگاه اول ممکن است خروجی برنامه اشتباه به نظر برسد، چراکه مقادیر عددی با هم یکسانند، البته 9876543,21F و 9.876.543.21 DM یکی نیست. بخاطر داشته باشید که کلاس NumberFormat از نرخهای ارزی بی اطلاع است. بنابراین متدهای کلاس NumberFormat تنها نمایش مقادیر را برعهده دارند و عمل تبدیل ارزها به یکدیگر را انجام نمی‌دهند.

3.1.6- درصد
برای نمایش علامت درصد (%) برای یک منطقه خاص در کلاس NumberFormat متد getPercentInstance تعریف شده است. برای مثال مقدار 0.75 بصورت 75% نمایش داده می شود. مثال:

Double percent = new Double(0.75);
NumberFormat percentFormatter;
String percentOut;

percentFormatter = NumberFormat.getPercentInstance(currentLocale);
percentOut = percentFormatter.format(percent);

2.6- فرمتهای سفارشی
از کلاس DecimalFormat می‌توان برای تعریف چگونگی نمایش اعداد برای یک منطقه یا کشور خاص استفاده کرد. این کلاس امکان تعریف صفرهای قبل و بعد از اعداد، جداکننده دسیمال (،)، علامت درصد (%)، علامت نقطه اعشاری (/)، علامت پول و هر پسوند یا پیشوند دیگر را به شما می دهد. البته برای تغییر علامت جداکننده ها می‌توان از کلاس DecimalFormatSymbols نیز در کنار DecimalFormat کمک گرفت.

3.6- ساختن الگو
با تعریف الگو می‌توان چگونگی نمایش اعداد را کنترل نمود، این الگو در قالب یک رشته تعریف می شود. جدول زیر لیستی از کاراکترهای مورد نیاز برای تعیین الگو را نشان می دهد.

علامت | شرح
0 | عدد صفر
# | عدد
, | جداکننده اعشاری
E | جدا کننده مانتیس و توان در اعداد نمایی
; | جدا کننده فرمتها
- | پیشوند اعداد منفی
% | علامت درصد (با ضرب در عدد 100)
X | هر کاراکتر دیگری که در پسوند و پیشوند استفاده شود
‘ | برای آوردن کاراکترهای خاص در پسوند و پیشوند

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

DecimalFormat myFormatter = new DecimalFormat(pattern);
String output = myFormatter.format(value);
System.out.println(value + " " + pattern + " " + output);

جدول زیر چند نمونه از تعریف الگو و خروجی آن را نشان می دهد:

مقدار | الگو | خروجی | توضیح
123456.789 | ###,###.### | 123,456.789 | علامت (#) نشان دهنده عدد، علامت (,) جداکننده دسیمال و علامت (.) جداکننده اعشاری
123456.789 | ###,## | 123456.79 | عدد مورد نظر دارای سه رقم اعشار است در حالیکه الگو دو رقم اعشار تعریف کرده است. بنابراین نتیجه حاصل گرد می شود.
123.78 | 000000.000 | 000123.780 | طبق الگو قبل و بعد از عدد به اندازه صفرهای تعریف شده، عدد صفر قرار می گیرد.
12345.67 | $###,###.### | $12,345.67 | علامت دلار ($) بعنوان پیشوند تعریف شده است.
12345.67 | \u00A5###,### .### | ¥12,345.67 | علامت ین (¥) با استفاده از مقدار یونی کد U+00A5
12345.67 | ###,###.###\uE816 | ریال12,345.67 | کلمه ریال با استفاده از مقدار یونی کد U+E816

7- فارسی سازی در جاوا

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

تقویم جلالی دارای خصوصیتی طبیعی وکلی است. این تقویم تمام چهار فصل سال را با آغازی مصادف با اولین روز بهار (در نیمکره شمالی) در بر میگیرد. همچنین این تقویم دارای یک قانون منظم (نه یکنواخت) برای روزهای ماه است. شش ماه اول هر سال 31 روز و شش ماه دوم در سال‌های کبیسه 30 روز میباشد، در غیر اینصورت ماه آخر سال 29 روزه خواهد بود. تقویم جلالی تقریبا" با سیستم رایج زودیاک (Zodiac System) غرب تطابق دارد.

در این دو مورد تقویم گریگوری با تقویم جلالی دارای اختلافاتی است. در این تقویم ارتباطی بین سال و فصل‌ها وجود ندارد. به طور قراردادی، تعداد روزها در هفت ماه سال 31 روز، در چهار ماه 30 روز و یک ماه در سال به طور نامنظم 28 یا 29 روز است.

علاوه بر این، تقویم جلالی از حرکت وضعی زمین (حرکت زمین به دور خورشید) تبعیت میکند. یک سال خورشیدی تقریبا معادل 365 روز، 5 ساعت و 49 دقیقه است. بر اساس تقویم جلالی، آغاز سال (تحویل سال) زمانی است که خورشید از نیمکره جنوبی به سمت نیمکره شمالی از روی خط استوا میگذرد. حال اگر لحظه تحویل سال قبل از ظهر (به وقت تهران) باشد، سال جدید (اول فروردین ماه) از همان روز آغاز میشود. در غیر اینصورت، آغاز سال نو روز بعد خواهد بود. در این روش (به طور تقریبی) در هر 33 سال، 8 سال کبیسه تعیین میگردد. سالهای کبیسه، سال‌هایی هستند که پس از تقسیم بر 33 باقیمانده آنها 6، 22، 17، 13، 9، 5، 1 و 30 باشد. بعنوان مثال، چنانچه 1370 را به 33 تقسیم کنیم، باقیمانده 17 خواهد بود پس سال 1370 سال کبیسه است. سال کبیسه بعدی سال 1375 میباشد –با چهار فاصله– در صورتیکه به طور معمول فاصله بین دو سال کبیسه 3 سال است.

تقویم گریگوری از روش ساده‌ای استفاده کرده که دارای اختلافاتی با سال طبیعی میباشد. در این روش هر چهار سال یکبار سال کبیسه خواهد بود، مگر سال‌هایی که قابل قسمت به 100 باشند، اما بر 400 نباشند. در نتیجه سال 2000 سال کبیسه است (از آنجایی که بر 400 قابل قسمت است) اما سال 2100 کبیسه نیست.

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

  • محاسبه سالهای کبیسه
  • تبدیل تاریخ میلادی به تاریخ هجری شمسی
  • تبدیل تاریخ هجری شمسی به تاریخ میلادی
  • نمایش تاریخ شمسی به شکلهای مختلف (کوتاه، کامل)
  • تابع چک کننده تاریخ هجری شمسی
  • Persian Date Taglib

2.7- تقویم هجری شمسی
مواردیکه در مبحث تقویم هجری شمسی بایستی لحاظ شود عبارتست از:

  • تفکیک مقادیر سال، روز، ماه برای تاریخ تعیین شده
  • مشخص کردن روز هفته/ اولین روز هفته / اولین روز ماه
  • قابلیت تغییر تاریخ با متدهای roll و add
  • Persian Calendar Taglib

3.7- نمایش اعداد
همانطور که قبلا" گفته شد می‏توان از متدهای تعریف شده در کلاسهای NumberFormat و DecimalFormat برای نمایش اعداد، مقادیر پولی و درصد استفاده کرد.

4.7- بانک اطلاعاتی
  • Database Character-Set (1252, 1256)
  • Sorting (Sequence Order)
  • JDBC Driver
  • Middle Conversion
  • Communication with Application Server

5.7- صفحات HTML/JSP
  • Character Encoding
  • Page Direction (Right to Left / Left to Right)
  • Text Wrapping
  • Language

مثالهای کاربردی
1- استفاده از Resource Bundle برای فارسی سازی
1.1- تعریف MessagesBundle_ar_SA.properties

label.login.userName=شناسه کاربر
label.login.password=رمزعبور

button.login=ورود
button.cancel=انصراف

label.calendar.date=تاریخ
label.calendar.year=سال
label.calendar.month=ماه
label.calendar.day=روز

label.calendar.pm= ب.ظ
label.calendar.am= ق.ظ

1.2- استفاده از Resource Bundle در JSP

<%@ page contentType="text/html;charset=1256"
         import="java.util.Locale,
         java.util.ResourceBundle"
%>

<%
   Locale locale = new Locale("ar", "SA");
   ResourceBundle msgs = ResourceBundle.getBundle("MessagesBundle", locale);
%>

<HTML lang="ar">
  <HEAD>
    <TITLE>Login Form </TITLE>
    <META http-equiv="Content-Type" content="text/html; charset=windows-1256">
   </HEAD>
  <BODY>

    <%=msgs.getString("label.login.userName")%>
    <%=msgs.getString("label.login.password")%>

  </BODY>
</HTML>

3.1- استفاده از Resource Bundle در Servlet

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

import java.util.ResourceBundle;
import java.util.Locale;

public class I18NServlet extends HttpServlet {

  public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {

    Locale locale = new Locale("ar", "SA");
    ResourceBundle msgs = ResourceBundle.getBundle("MessagesBundle", locale);

    PrintWriter out = response.getWriter();
    out.println(msgs.getString("label.calendar.date")
      + ":" +  new java.util.Date());

    out.close();
  }
}

2- نمایش مقادیر عددی
1.2- استفاده از فرمتهای از پیش تعریف شده

static public void displayNumber(Locale currentLocale) {

  Integer quantity = new Integer(123456);
  Double amount = new Double(345987.246);
  NumberFormat numberFormatter;
  String quantityOut;
  String amountOut;

  numberFormatter = NumberFormat.getNumberInstance(currentLocale);
  quantityOut = numberFormatter.format(quantity);
  amountOut = numberFormatter.format(amount);
  System.out.println(quantityOut + " " + currentLocale.toString());
  System.out.println(amountOut + " " + currentLocale.toString());
}

static public void displayCurrency(Locale currentLocale) {

  Double currency = new Double(9876543.21);
  NumberFormat currencyFormatter;
  String currencyOut;

  currencyFormatter = NumberFormat.getCurrencyInstance(currentLocale);
  currencyOut = currencyFormatter.format(currency);
  System.out.println(currencyOut + " " + currentLocale.toString());
}

static public void displayPercent(Locale currentLocale) {

  Double percent = new Double(0.75);
  NumberFormat percentFormatter;
  String percentOut;

  percentFormatter = NumberFormat.getPercentInstance(currentLocale);
  percentOut = percentFormatter.format(percent);
  System.out.println(percentOut + " " + currentLocale.toString());
}

2.2- تعریف الگوی جدید

static public void customFormat(String pattern, double value) {
  DecimalFormat myFormatter = new DecimalFormat(pattern);
  String output = myFormatter.format(value);
  System.out.println(value + " " + pattern + " " + output);
}

customFormat("###,###.###", 123456.789);
customFormat("###.##", 123456.789);
customFormat("000000.000", 123.78);
customFormat("$###,###.###", 12345.67);
customFormat("\u00a5###,###.###", 12345.67);
customFormat("###,###/###\ue816", 12345.67);

3- تنظیمات فارسی در صفحات HTML
3.1- تعریف زبان و Code Page

<HTML lang="fa">
  <HEAD>
    <META content="text/html; charset=windows-1256" http-equiv="Content-Type">
    <META content="fa" http-equiv="Content-Language">
  </HEAD>

  ...
</HTML>

<HTML>
  <HEAD>
    <META content="text/html; charset=UTF-8" http-equiv="Content-Type">
    <META content="fa" http-equiv="Content-Language">
  </HEAD>

  ...
</HTML>

2.3- راست به چپ صفحات

<HTML dir="rtl">
   ...
</HTML>

3.3- Text Wrapping

<TD nowrap>
...
</TD>

فایل‌های مرتبط

  • متن برنامه‌ها (7 کیلوبایت)

« قسمت قبل 1 2
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫باز کردن پنجره Popup در ASP.NET با استفاده از Code Behind

Softtool

باز کردن پنجره Popup در ASP.NET با استفاده از Code Behind

قطعا در بسیاری از Applicationها برای شما مواردی پیش آمده است که نیاز داشته‌اید صفحه‌ای خاص را در یک پنجره Popup باز کنید. اما آیا راهی برای انجام این کار با استفاده از کدنویسی در Code Behind وجود دارد؟ پاسخ مثبت است.

توسط MahdiDotNET | 12 بهمن 1382 | 3935 بار مشاهده Printable Version نسخه مخصوص چاپ
قطعا در بسیاری از 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 قرار می‌دهید می‌توانید به راحتی خطاهای برنامه نویسی خود را قبل از اینکه اجرای کد خود را آغاز نمایید، پیدا کنید.

منابع

  • ‪Popup - The .NET Way!
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫ساخت یک Screen Saver در VB.NET

ساخت یک Screen Saver در VB.NET

Screen Saverها یکی از جذاب ترین و سرگرم کننده ترین برنامه‌های کامپیوتری هستند که از تاریخچه‌ای طولانی برخوردار هستند. در این مقاله نحوه ساخت یک محافظ صفحه نمایش ساده با زبان Visual Basic .NET توضیح داده میشود.

توسط HosseinGates | 14 بهمن 1382 | 4874 بار مشاهده Printable Version نسخه مخصوص چاپ
Screen Saverها یکی از جذاب ترین و سرگرم کننده ترین برنامه‌های کامپیوتر میباشند که دارای تاریخچه‌ای طولانی هستند. تقریبا" از همان اوایل بوجود آمدن کامپیوترهای شخصی این برنامه‌ها توانستند کاربران زیادی را جذب خود کنند. Screen Saver یا محافظ صفحه نمایش برنامه‌ایست که پس از مدت زمان مشخصی که کاربر با صفحه کلید کار نکند یا ماوس را حرکت ندهد، مانیتور را فعال نموده و یا در آن تصویری را نمایش می‌دهد. تماس با صفحه کلید یا ماوس، محافظ صفحه نمایش را از فعالیت باز می‌دارد. بند فوق تعریفی از Screen Saver است که مبنای ساخت یک محافظ صفحه نمایش نیز بر همین اساس است. برای ساخت یک محافظ صفحه نمایش دو کار اصلی وجود دارد:

  • ساخت برنامه محافظ صفحه نمایش
  • تبدیل آن به فرمت scr. و قرار دادن آن در لیست Screen Saverهای ویندوز

در این مقاله نحوه ساخت یک محافظ صفحه نمایش ساده با زبان Visual Basic .NET توضیح داده می‌شود. الگوریتم این برنامه بسیار ساده بوده و در صورتیکه به زبانهای دیگر نیز تسلط دارید میتوانید این الگوریتم را با زبان دلخواهتان پیاده سازی کنید. همانطور که گفته شد ساخت چنین برنامه ای از دو قسمت تشکیل شده است که برای هر قسمت یک Project لازم است.

بخش اول – ساخت برنامه محافظ صفحه نمایش
یک پروژه جدید باز کنید و اسم Screen Saver دلخواه خود را بر روی آن بگذارید. اولین کار شما تنظیم برخی از خصوصیات فرمتان میباشد که تمامی آنها برای ساختن برنامه حیاتی می‌باشند. خصوصیات فرم خود را مانند زیر تنظیم کنید:

Property | Value
FormBorderstyle | None
WindowState | Maximized
ControlBox | None
MaximizeBox | None
MinimizeBox | None
ShowInTaskbar | False
TopMost | True

با این تنظیمات فرم شما در هنگام اجرا تمام صفحه را در بر خواهد گرفت. حالا شما می‌توانید هنرهای خود را روی فرم پیاده کنید. اما عجله نکنید. هنوز چند تا کار باقی مانده است. باید کاری کنیم که هنگامی که کاربر ماوس را حرکت میدهد برنامه خاتمه یابد. برای این منظور به سراغ رویداد MouseMove فرم می‌رویم. کد زیر را در این رویداد بنویسید:

If Not m_IsActive Then
   Me.m_MouseLocation = New Point(e.X, e.Y)
   m_IsActive = True
Else
   If Math.Abs(e.X - Me.m_MouseLocation.X) > 10 Or _
      Math.Abs(e.Y - Me.m_MouseLocation.Y) > 10 Then
      Application.Exit()
   End If
End If

شاید این کدها کمی عجیب به نظر برسند! اما این طور نیست. m_IsActive در کد فوق یک متغیر سطح ماژول Boolean و با مقدار اولیه False می‌باشد. m_MouseLocation نیز یک متغیر سطح ماژول از نوع Point می‌باشد. هر بار که رویداد فوق اجرا میشود (یعنی وقتی که ماوس حرکت داده می‌شود) نقطه‌ای که ماوس در آن نقطه بوده است درون متغیر m_MouseLocation ذخیره میشود. این مقدار با مقادیر بعدی محل قرار گرفتن ماوس مقایسه شده و در صورتی که تغییر مکان ماوس بیش از 10 پیکسل باشد برنامه اتمام میابد. این تکنیک بدین منظور ارائه شده تا برنامه با هر حرکت کوچک ماوس خاتمه نیابد.

شما می‌توانید در رویدادهای دیگر مانند MouseDown و KeyPress نیز کد زیر را قرار دهید تا برنامه شما کامل شود:

Application.Exit()

حال شما به یک تایمر جهت اجرای حرکاتی بر روی فرم نیاز دارید. پس از اضافه کردن تایمر به برنامه به رویداد Load فرم رفته و کدهای زیر را وارد کنید :

Me.Cursor.Hide()
Me.m_Graphics = Me.CreateGraphics()
Me.Timer1.Enabled = True

ابتدا مکان نما را مخفی می‌کنیم و سپس تایمر برنامه را به کار می اندازیم. در این جا یک متغیر سطح ماژول از نوع Graphics را نیز ساخته و به فرم خود نسبت داده‌ایم که این شئ گرافیکی برای کشیدن اشکالی بر روی فرم بکار می‌رود.

به رویداد Tick تایمر برنامه میرویم و زیر برنامه مربوط به کشیدن اشکال را فراخوانی می‌کنیم:

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Timer1.Tick

   DrawShape()
End Sub

زیر برنامه DrawShape در این برنامه به صورت Random و با رنگهای Random مستطیل‌هایی را رسم میکند. کدهای این زیر برنامه در زیر آورده شده است:

Private Sub DrawShape()
   Dim maxX As Integer = Me.Width
   Dim maxY As Integer = Me.Height
   Dim x1, x2, y1, y2 As Integer
   Dim myRect As Rectangle
   Dim myColor As Color

   x1 = m_Random.Next(0, maxX)
   x2 = m_Random.Next(0, maxX)

   y1 = m_Random.Next(0, maxY)
   y2 = m_Random.Next(0, maxY)

   myRect = New Rectangle(Math.Min(x1, x2), Math.Min(y1, y2), _
   Math.Abs(x1 - x2), Math.Abs(y1 - y2))

   myColor = Color.FromArgb(255, m_Random.Next(255), _
   m_Random.Next(255), m_Random.Next(255))

   m_Graphics.FillRectangle(New SolidBrush(myColor), myRect)
End Sub

تا اینجا Screen Saver ما آماده است ولی هنوز یک کار دیگر باقی مانده است. هنگامی که ویندوز این فایل را اجرا میکند پارامترهایی را به برنامه ارسال میکند. این پارامترها عبارتند از "/c" "/s" "/p" که معنی هر کدام در ادامه بیان خواهد شد. برای بررسی هر کدام از این پارامترها باید از متد زیر استفاده کرد:

<STAThread()>
Shared Sub Main(ByVal args As String())

End Sub

این زیر برنامه اولین زیر برنامه‌ایست که پس از راه اندازی برنامه اجرا خواهد شد. پس مکان مناسبی برای بررسی این پارامترهاست. ابتدا با شرط زیر بررسی می‌کنیم که آیا پارامتری به برنامه ارسال شده است یا خیر؟

If args.Length > 0 Then
   ...
Else
   Dim screenSaverForm As New ScreenSaverSample.fclsScreenSaver()
   screenSaverForm.ShowDialog()

   ' Exit the application when the form is closed
   Application.Exit()
End If

کدهای قسمت اول If را بعدا خواهیم نوشت اما قبل از آن به بررسی قسمت Else می‌پردازیم. اگر ویندوز هیچ پارامتری را به برنامه ارسال نکند (یعنی کاربر مستقیما" برروی فایل exe. دابل کلیک کند) این قسمت اجرا خواهد شد. فرم اصلی برنامه را نمایش داده و هنگامی که فرم بسته شد خط آخر اجرا میشود. اما برای قسمت اول If کدهای زیر را می‌نویسیم:

If args(0).ToLower = "/p" Then
   ' Exit the application.
   Application.Exit()
End If

If args(0).ToLower.Trim().Substring(0, 2) = "/c" Then
   Dim screenSaverSetting As New ScreenSaverSample.fclsSetting()
   screenSaverSetting.ShowDialog()

   ' Exit the application.
   Application.Exit()
End If

If args(0).ToLower = "/s" Then
   Dim screenSaverForm As New ScreenSaverSample.fclsScreenSaver()
   screenSaverForm.ShowDialog()

   ' Exit the application when the form is closed
   Application.Exit()
End If

اگر شرط args.Lenght > 0 برقرار شود بمعنای آنست که پارامتری توسط ویندوز به برنامه ارسال شده است. پس توسط سه شرط فوق پارامترها را بررسی می‌کنیم. پارامتر p/ در این مقاله مورد بررسی قرار نگرفته است. این پارامتر مربوط به ساخت قسمت پیش نمایش (Preview) است که با توجه به این که به کار با APIهای ویندوز نیاز دارد به خارج از بحث این مقاله است. برای همین به سادگی از آن گذشته و در صورت وجود آن برنامه را خاتمه می‌دهیم.

پارامتر c/ به معنای آنست که کاربر خواهان تنظیماتی برروی این Screen Saver می‌باشد. همان طور که می‌دانید برخی از Screen Saverها دارای فرمی مخصوص تنظیمات می‌باشند. شما نیز میتوانید فرمی مخصوص تنظیمات طراحی و بوسیله آن برنامه خود را کاملتر کنید. برای مثال می‌توانید در کدهای فوق بجای رسم مستطیل اشکال دیگری را به انتخاب کاربر رسم کنید. پس از ساختن فرم تنظیمات میبایست آنرا در این قسمت فراخوانی کرده و نمایش دهید. پارامتر s/ به معنای نمایش معمولی Screen Saver میباشد که مانند کد بالا فرم اصلی برنامه به نمایش درآمده است.

برنامه محافظ صفحه نمایش شما حاضر است. اما هنوز ویندوز آنرا در لیست Screen Saver های خود ثبت نکرده است!

بخش دوم - تبدیل برنامه به فرمت scr. و قرار دادن آن در لیست Screen Saverهای ویندوز
برای اینکه ویندوز برنامه شما را به عنوان یک محافظ صفحه نمایش بشناسد باید برنامه خود را با پسوند scr. در دایرکتوری سیستم ویندوز خود کپی کنید. یک پروژه جدید باز کرده و یک دکمه با عنوان Install روی فرم قرار دهید. به رویداد Click دکمه رفته و کدهای زیر را وارد کنید:

Dim fileName As String = "ScreenSaverSample.scr"
Dim sourceFile As String = Environment.CurrentDirectory & "\..\" & fileName
Dim destFile As String = Environment.SystemDirectory & "\" & fileName

Try
   File.Copy(sourceFile, destFile, True)
Catch ex As Exception
   MsgBox(ex.ToString(), MsgBoxStyle.Exclamation, Me.Text)
End Try

سه متغیر رشته‌ای تعریف کرده‌ایم که اولی نام فایل اجرایی است که پروژه قبلی تولید کرده است. متغیر بعدی آدرس فایل فوق و آخرین متغیر آدرس دایرکتوری سیستم میباشد (در ویندوزهای 32 بیتی با نام System32). در نتیجه پسوند فایل را از exe. به scr. تبدیل کرده و آنرا در دایرکتوری سیستم کپی می‌کنیم. عمل کپی نیز در ساختار Try – Catch قرار گرفته تا در صورت بروز خطا کاربر آگاه شود.

در صورتی که دستورات فوق بدون خطا اجرا شوند برنامه محافظ صفحه شما با موفقیت نصب خواهد شد. از Screen Saver خود لذت ببرید.

فایل‌های مرتبط

  • متن برنامه (37 کیلوبایت)
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫NET. به جای API: یک مثال کاربردی

NET. به جای API: یک مثال کاربردی

در این مقاله سعی شده تا با یک مثال پرکاربرد، امکانات NET Framework. در مقابل توابع API بررسی گردد.

توسط zargaran | 20 بهمن 1382 | 3546 بار مشاهده Printable Version نسخه مخصوص چاپ
پیش از این برای انجام بسیاری از کارها در برنامه نویسی ناچار به استفاده از APIهای Windows بودیم. به عنوان مثال برای باز کردن یک فایل pdf. با استفاده از ShellExecute می‌بایست کد زیر را در VB 6 وارد می‌کردیم:

Private Declare Function Ex Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As
Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As
String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Private Sub Form_Load()
   Ex Me.hwnd, "open", "C:\MyFile.pdf", vbNullString, vbNullString, 1
End Sub

اما در VB.NET می‌توان بدون استفاده از API برای باز کردن همین فایل از کد زیر استفاده کرد:

System.Diagnostics.Process.Start("C:\MyFile.pdf")

بررسی کد VB.NET:
System.Diagnostics یک Namespace شامل کلاس‌هایی برای ارتباط با پروسسهای سیستم می‌باشد. کلاس Process از این Namespace ما را قادر به کنترل پروسس‌های سیستم می‌نماید. متد Start از این کلاس، فایل مورد نظر ما را با توجه به پروسس مربوطه باز می‌کند.

البته در VB.NET هم می‌توان از API استفاده کرد که در این صورت کد آن به صورت زیر خواهد بود:

Declare Auto Function Ex Lib "shell32.dll" Alias "ShellExecute" (ByVal hwnd As
System.IntPtr, ByVal lpOperation As String, ByVal lpFile As String, ByVal
lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As
Long

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load

        Ex(Me.Handle, "open", "C:\MyFile.pdf", vbNullString, vbNullString, 1)
End Sub

مقایسه:
با اولین نگاه سادگی و سر راستی کد VB.NET مشخص می‌شود ولی مهمتر اینکه، نباید فراموش کرد با استفاده از APIها در حقیقت از کد مدیریت نشده (Unmanaged Code) استفاده کرده‌ایم که خود، عدم استفاده از امکانات Managed Code را در برنامه سبب می‌شود. برای اطلاعات بیشتر در زمینه فوائد Managed Code به MSDN مراجعه کنید. به این ترتیب می‌توان کلاس‌های NET Framework. را به عنوان جایگزینی مناسب برای بسیاری از توابع API استفاده کرد. ولی به هر حال در برخی موارد هنوز ناچار به استفاده از APIها می‌باشیم.

Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫بررسی رکوردها در دلفی

Softtool

بررسی رکوردها در دلفی

در این مقاله به مبحث رکوردها در دلفی و چگونگی ساخت و استفاده از آنها می‌پردازیم.

توسط Delphijon | 29 بهمن 1382 | 4937 بار مشاهده Printable Version نسخه مخصوص چاپ
یک ساختار تعریف شده در پاسکال موضوعی تحت عنوان record می‌باشد. رکوردها را می‌توان یک نوع داده که خود شامل چندین نوع داده دیگر است در نظر گرفت. برای تعریف رکوردها بصورت زیر عمل می‌کنیم:

type recordTypeName = record
   fieldList1: type1;
   ...
   fieldListn: typen;
end

پس از اینکه نوع رکورد ایجاد شد، باید متغییرهایی از نوع این رکورد تعریف واز آنها استفاده کرد. برای تعریف متغییر نوع رکورد به صورت زیر عمل می‌شود:

type
   TDateRec = record
   Year: Integer;
   Month: (Jan, Feb, Mar, Apr, May, Jun,
               Jul, Aug, Sep, Oct, Nov, Dec);
   Day: 1..31;
end;

var
   Record1, Record2: TDateRec;

هنگام کار با یک رکورد برای دستیابی به میدان‌های آن، از نماد نقطه استفاده میکنیم:

Record1.Year := 1904;
Record1.Month := Jun;
Record1.Day := 16;

همچنین می‌توان یک رکورد را در یک رکورد دیگر کپی کرد بدون اینکه با خطائی مواجه شویم. شما همچنین می‌توانید متغییرهای از نوع رکوردهای خود را به صورت مستقیم تعریف کنید:

var S: record
   Name: string;
   Age: Integer;
end;

رکوردهای با طول متغییر
نوع رکورد را می‌توان طوری تعریف کرد که طول بخشی از آن ثابت و طول بخش دیگری بر اساس شرایط فیلدها متغییر باشد. در زیر یک مثال و در ادامه آن جدولی از حافظه‌ای که اشغال می‌شود آورده شده است.

type
   TPartType = (ptComputer, ptMonitor, ptComponent);
   TPart = record
      PartNumber : String[15];
      Description : String[30];
      Price : Double;

      case PartType : TPartType of
         ptComputer: (CPU : String[10]; Speed : String[10]; HardDrive : String[10]);
         ptMonitor: (VideoType : String[10]; Size : String[5]; DotPitch : String[5]);
         ptComponent: (Internal : Boolean; Specs : String[29]);
end;

این تعریف به کامپایلر می گویید که تنها یکی از متغییرهای مجموعه case را برای استفاده در هر رکوردی انتخاب کند. این یک راهکار بسیار خوب برای استفاده از حافظه می باشد؛ زیرا حافظه یکسانی برای هر مجموعه‌ای از متغییرها در نظر گرفته می‌شود.

بایت | نام متغییر | نام متغییر | نام متغییر
0 | PartNumber |  |
15 | Description |  |
45 | Price |  |
53 | PartType |  |
54 | CPU | VideoType | Internal
55 |  |  | Specs
64 | Speed | Size |
69 |  | DotPitch |
74 | HardDrive |  |

دسترسی به یک بایت
بعضی مواقع، هنگامیکه با یک API خارجی کار می‌کنید، احتیاج دارید که اطلاعاتی از نوع Word یا Longint را به نوع‌های دلخواه بشکنید. به عنوان مثال TMSF را بصورت زیر در نظر بگیرید:

Most Significant Byte |  |  | Least Significant Byte
Unused | Frames | Seconds | Minute

ساختار TMSFRec رو بصورت زیر تعریف می‌کنیم:

type
   TMSFRec = record
      Minutes : Byte;
      Seconds : Byte;
      Frames : Byte;
      Dummy : Byte;
end;

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

begin
   MinuteLbl.Caption := IntToStr(TMSFRec(Position).Minutes);
   SecondLbl.Caption := IntToStr(TMSFRec(Position).Seconds);
   FrameLbl.Caption := IntToStr(TMSFRec(Position).Frames);
end;

در مثال قبل، Position متغییری از نوع Longint می‌باشد.

Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫توابع ریاضی در ویژوال بیسیک

توابع ریاضی در ویژوال بیسیک

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

توسط sheidaian | 8 اسفند 1382 | 7896 بار مشاهده Printable Version نسخه مخصوص چاپ
برای نوشتن برنامه‌های مهندسی، محاسباتی، گرافیکی و آماری نیاز دارید تا از برخی توابع ریاضی استفاده نمائید. ویژوال بیسیک 6 دارای مجموعه‌ای از توابع است که برای انجام محاسبات عددی پیش بینی شده اند. در این مقاله ابتدا با این توابع آشنا شده و سپس چگونگی ایجاد سایر توابع ریاضی را که در میان این مجموعه وجود ندارند خواهید دید. در پایان نیز با توابع ریاضی موجود در دات نت آشنا می‌شوید.

تابع 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

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

تابع | فرمول
سکانت | 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
برای استفاده از اعداد پی و 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

Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫آشنایی با شیئ پرینتر در ویژوال بیسیک

آشنایی با شیئ پرینتر در ویژوال بیسیک

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

توسط sheidaian | 20 اسفند 1382 | 4193 بار مشاهده Printable Version نسخه مخصوص چاپ
شیئ پرینتر، شیی است که پرینتر پیش فرض سیستم را کنترل می‌کند. استفاده از شیئ پرینتر در ویژوال بیسیک مانند کار با سایر اشیاء است و بایستی از خواص و متدهای آن استفاده کرد. در ادامه با برخی از این خواص و متدها آشنا خواهید شد.

چاپ متن توسط شیئ پرینتر
برای چاپ متن توسط شیئ پرینتر کافیست خواص 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 اول از علامت ; استفاده کنیم.

چاپ گرافیک توسط شیئ پرینتر
به چهار روش می‌توان اشکال گرافیکی را توسط شیئ پرینتر چاپ کرد:

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 استفاده کرد. همچنین width1 و height1 طول و عرض تصویر چاپی می‌باشند . با استفاده از ترکیب x2 و y2 بهمراه width2 و height2 نیز می‌توان برشیئ از تصویر اصلی برای چاپ را مشخص کرد. مثال:

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

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

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

Firefox Search Plug-in


iDevCenter - ‫چگونگی ارسال ایمیل در PHP

چگونگی ارسال ایمیل در PHP

در این مقاله با تابع Mail در PHP آشنا شده و روش ارسال یک ایمیل از طریق آن را یاد خواهید گرفت.

توسط amirmohammad | 15 فروردین 1383 | 6712 بار مشاهده Printable Version نسخه مخصوص چاپ
PHP دو تابع اختصاصی برای ارسال Mail به همراه دارد که به صورت پیش فرض در داخل PHP نصب شده‌اند: تابع ()Mail که اجازه می‌دهد مستقیما" از یک Script ایمیل خود را ارسال کنید و تابع ()ezmlm_hash که کارهای لازم برای پیوستن نامه‌ها به EZMLM mailing list را در اختیار شما قرار می‌دهد (جهت توضیحات بیشتر به ezmlm.org مراجعه کنید).

تابع ()Mail برای ارسال نامه‌ها از اطلاعات موجود در فایل php.ini استفاده می‌کند و در اکثر موارد کار با مقادر پیش فرض این اطلاعات باعث عمل نکردن تابع می شود. این اطلاعات در سه قسمت وجود دارند (توجه داشته باشید که دو مورد اول برای سیستم‌های مایکروسافتی و مورد آخر برای کار با سیستم‌های یونیکسی است):

SMTP: آدرس میزبان SMTP را مشخص می‌کند. این آدرس هم می‌تواند یک آدرس کامل باشد و هم یک آدرس IP. این تنظیم فقط در سیستمهای مایکروسافتی مورد استفاده قرار می‌گیرد.

sendmail_from: مشخص می‌کند که این نامه از طرف چه کسی فرستاده شده است. این قسمت هم فقط در سیستم‌های مایکروسافتی کار می‌کند.

sendmail_path: مسیر کامل برنامه اجرایی email را مشخص می‌کند و این برنامه هنگام فرستادن email استفاده می‌شود. این قسمت مخصوص سیستمهای یونیکسی است.

تابع ()Mail بصورت زیر تعریف شده است:

bool mail(string recipient, string subject, string message, [string extra_headers], [string extra_arguments])

پارامترهای این تابع:

پارامتر | توضیحات
recipient | آدرس گیرنده نامه
subject | موضوع نامه
message | متن نامه
extra_headers | headerهای اضافی برای نامه شما
extra_arguments | آرگومانهای بیشتر برای تحت اختیار گرفتن برنامه فرستنده mail. در PHP نسخه 4.0.5 و بالاتر.

تایع فوق یک ایمیل به آدرس مشخص شده می‌فرستد و در صورت موفقیت مقدار TRUE و غیر این صورت مقدار FALSE را برمی‌گرداند.

پارامتر recipient می‌تواند هم حاوی یک آدرس باشد و هم یک لیست از آدرسها که با کاما از هم جدا شده‌اند. اگر شما می‌خواهید تا از header های اضافی برای ارسال نامه خود استفاده کنید مثلا از CC یا BCC این عبارات باید در پارامتر extra_headers قرار داده شوند. توجه داشته باشید که این تابع به هیچ عنوان مشخص نمی‌کند که آیا نامه به مقصد رسیده است یا خیر. در صورت کامل نبودن هر یک از موارد اجباری تابع فوق، این تابع عمل نخواهد کرد. این تابع از نسخه 3 در PHP موجود است.

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

/* When the following code was executed, i received this email:
*
* From: Apache httpd
* To: amirsaied@hotmail.com
* Subject: This is a test
* Date: Thu, 4 Mar 2004 16:33:17 -0700
*
* Hi there,
*
* This is a test message. please disregard.

$address = 'amirsaied@hotmail.com';
$subject= 'This is a test';
$message= 'Hi there,

This is a test message. please disregard.';
mail($address, $subject, $message);

Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫بدست آوردن اطلاعاتی محیطی از سیستم در VB.NET

Softtool

بدست آوردن اطلاعاتی محیطی از سیستم در VB.NET

در این مقاله روش بدست آوردن اطلاعات محیطی از سیستم مانند نام کاربر، نام کامپیوتر، اندازه آیکون‌ها، تعداد مانیتور، اندازه قاب پنجره، درایوهای موجود و آدرس پوشه‌های مخصوص سیستم در زبان Visual Basic .NET بررسی می‌شود.

توسط HosseinGates | 5 خرداد 1383 | 3674 بار مشاهده Printable Version نسخه مخصوص چاپ
اطلاعات سیستمی
اینگونه اطلاعات را می‌توان از فضانام System.Windows.Forms.SystemInformation بدست آورد. برای مثال چند نمونه از اینگونه اطلاعات را با کد زیر در کنترل ListView وارد می کنیم. نام این کنترل lvwSystemInformation است. توجه داشته باشید که خصوصیت View این کنترل در حالت Details قرار گرفته باشد.

With lvwSystemInformation.Items.Add("BorderSize")
    .SubItems.Add(SystemInformation.BorderSize.ToString())
End With

With lvwSystemInformation.Items.Add("ComputerName")
    .SubItems.Add(SystemInformation.ComputerName.ToString())
End With

With lvwSystemInformation.Items.Add("CursorSize")
    .SubItems.Add(SystemInformation.CursorSize.ToString())
End With

With lvwSystemInformation.Items.Add("DoubleClickTime")
    .SubItems.Add(SystemInformation.DoubleClickTime.ToString())
End With

With lvwSystemInformation.Items.Add("IconSize")
    .SubItems.Add(SystemInformation.IconSize.ToString())
End With

With lvwSystemInformation.Items.Add("MonitorCount")
    .SubItems.Add(SystemInformation.MonitorCount.ToString())
End With

بدست آوردن نام درایوها
متد Environment.GetLogicalDrives آرایه‌ای از نام درایوها برمی‌گرداند. می‌توان این آرایه را به عنوان Data Source یک لیست برای نمایش درایوها بکار برد. پس از بدست آوردن لیستی از درایوها، شما ممکن است بخواهید که اطلاعاتی نیز در مورد فایل‌ها و دایرکتوری‌های موجود در این درایوها بدست آورید. جهت این کار بهتر است که به کلاسهای System.IO.File و System.IO.Directory مراجعه کنید.

پوشه‌های مخصوص سیستم
در ویندوز پوشه‌هایی با نام پوشه‌های مخصوص یا Special Folders وجود دارد. پوشه‌های System ،Startup ،My Documents و Program Files از این نمونه‌اند. در بسیاری از مواقع لازم است که برنامه نویس آدرس این پوشه‌ها را بداند تا برای مثال بتواند فایلی را در آن‌ها کپی کند. اما از آنجایی که در هر سیستم آدرس این پوشه‌ها متفاوت است، VB.NET متدهایی را جهت بدست آوردن این آدرسها ارائه میدهد.

مهمترین پوشه هر ویندوز، شاخه System می‌باشد. برای بدست آوردن آدرس این پوشه می‌توان از کد زیر استفاده کرد:

lblSystemFolder.Text = GetFolderPath(SpecialFolder.System)

تابع GetFolderPath تابعی از کلاس System.Environment می‌باشد که آدرس اینگونه پوشه‌ها را برمی‌گرداند. تعریف این تابع به صورت زیر است:

Public Shared Function GetFolderPath (ByVal folder As System.Environment.SpecialFolder) As String

تکنیک دیگری نیز وجود دارد که به کمک آن می‌توان لیست کاملی از تمامی این پوشه‌ها را بدست آورد. در این روش نه چندان آسان از تابع GetNames از کلاس System.Enum استفاده می‌شود. این تابع یک مجموعه شمارشی را بعنوان پارامتر ورودی می‌گیرد و آرایه‌ای از اسامی ثابت‌های این مجموعه شمارشی برمی‌گرداند. تعریف تابع را در زیر مشاهده می‌کنید:

Public Shared Function GetNames(ByVal enumType As System.Type) As String()

پس از نوشتن تابعی مانند زیر، در یک رویداد مانند رویداد Load فرم این تابع با پارامتر Environment.SpecialFolder صدا زده می‌شود.

Private Sub LoadList(ByVal lst As ListBox, ByVal typ As Type)
   lst.DataSource = System.Enum.GetNames(typ)
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load

    LoadList(lstFolders, GetType(Environment.SpecialFolder))
End Sub

حال می‌خواهیم کاری کنیم که پس از کلیک بر روی نام هر پوشه، آدرس آن نیز نمایش داده شود. به رویداد SelectedIndexChanged رفته و کدهای زیر را می‌نویسیم:

Private Sub lstFolders_SelectedIndexChanged(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles lstFolders.SelectedIndexChanged

   Dim sf As Environment.SpecialFolder = GetSpecialFolderFromList()
   lblSpecialFolder.Text = GetFolderPath(sf)

End Sub

در این تابع ابتدا متغیری با نام sf از نوع Environment.SpecialFolder می‌سازیم که نگهدارنده مقدار خروجی تابع GetSpecialFolderFromList می‌باشد. این تابع با استفاده از گزینه انتخاب شده از لیست پوشه‌های مخصوص نام آنرا برمی‌گرداند و آن را بصورت زیر تعریف می کنیم:

Private Function GetSpecialFolderFromList() As Environment.SpecialFolder

   Return CType(System.Enum.Parse(GetType(Environment.SpecialFolder), _
      lstFolders.SelectedItem.ToString), Environment.SpecialFolder)

End Function

تابع Parse از کلاس System.Enum یک رشته یا مقدار عددی از یک مجموعه شمارشی را به یک شئ شمارشی تبدیل می‌کند. تعریف این تابع را در زیر می‌بینید:

Public Shared Function Parse(ByVal enumType As System.Type, ByVal value As String) As Object

سپس مقدار برگشتی آن با استفاده از CType به نوع Environment.SpecialFolder تبدیل می‌شود. بدین صورت پس از آنکه بر روی هر یک از آیتم‌های لیست کلیک می کنیم، آدرس آن در Label مقابل نمایش داده می‌شود.

به شما پیشنهاد می‌کنم برای درک بیشتر این مطالب حتما" نمونه برنامه مربوطه را دریافت و اجرا کنید.

فایل‌های مرتبط

  • برنامه نمونه (23 کیلوبایت)
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫چگونه یک سیستم عضوگیری ساده توسط PHP بسازیم؟

چگونه یک سیستم عضوگیری ساده توسط PHP بسازیم؟

در این مقاله شما طرز ساختن یک سیستم عضویت ساده (Membership Sytem) برای وب سایتتان بوسیله PHP و MySQL را یاد خواهید گرفت.

توسط sajjad_khaleghi | 18 تیر 1383 | 5862 بار مشاهده Printable Version نسخه مخصوص چاپ
در طی این مقاله شما استفاده آسان از موارد زیر و همچنین به کاربردن آنها در برنامه‌های دیگر را یاد خواهید گرفت:

  • گرفتن اطلاعات کاربر هنگام ثبت نام و ذخیره آن در MySQL
  • ساختن یک کلمه عبور به طور تصادفی و تبدیل آن به کد رمز در دیتابیس
  • تائید ایمیل کاربر هنگام ثبت نام قبل از اولین ورود
  • دستورات ابتدایی کار با فرم‌ها در PHP
  • به کار گیری تابع Mail در PHP و نحوه ارسال ایمیل توسط آن

لازم است یادآوری کنم که کدهای موجود در برنامه به صورت بسیار ساده نوشته شده‌اند و امکان دارد که بر حسب سیستم عامل و یا نسخه PHP که بر روی سیستم شما می‌باشد اجرا نشوند. چنانچه با این مشکل برخورد کردید، عیب را در نحوه نصب PHP و یا سیستم عامل خود جستجو کنید.

چنانچه با PHP و برنامه‌نویسی تحت وب و نیز طراحی صفحات و بانک اطلاعاتی به صورت ابتدایی آشنایی ندارید توصیه می‌کنم که این مقاله را دنبال نکنید. کلیه فایل‌های مورد نیاز در انتهای مقاله به صورت فشرده شده موجود می‌باشند. قبل از ادامه مقاله توصیه می‌کنم که حتما آن ها را دانلود کرده و در ویرایشگرهای خود باز کنید. ویرایشگر مورد استفاده من Notepad می‌باشد.

ساختن بانک اطلاعاتی (Database):
در این مرحله به ساخت یک بانک اطلاعاتی برای سیستم عضویت می‌پردازیم. ممکن است شما از phpMyAdmin و یا سایر برنامه‌های مرتبط با MySQL استفاده کنید ولی من از PHPMyAdmin به خاطر سهولت و همچنین فراگیر بودن آن در اکثر میزبانهای (Host) کاربران ایرانی، استفاده می‌کنم.

جهت این کار ابتدا یک بانک اطلاعاتی با نام دلخواه بسازید و سپس برای ایجاد جداول و مقداردهی اولیه در قسمت Query Window کد زیر را وارد کنید:

CREATE TABLE users (
userid int(25) NOT NULL auto_increment,
first_name varchar(25) NOT NULL default '',
last_name varchar(25) NOT NULL default '',
email_address varchar(25) NOT NULL default '',
username varchar(25) NOT NULL default '',
password varchar(255) NOT NULL default '',
info text NOT NULL,
user_level enum('0','1','2','3') NOT NULL default '0',
signup_date datetime NOT NULL default '0000−00−00 00:00:00',
last_login datetime NOT NULL default '0000−00−00 00:00:00',
activated enum('0','1') NOT NULL default '0',
PRIMARY KEY (userid) ) TYPE=MyISAM COMMENT='Membership Information';
sql.txt

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

حال که بانک اطلاعاتی مورد نیاز ایجاد شد به سراغ گرفتن اطلاعات از کاربر و ذخیره آن در بانک اطلاعاتی می‌رویم.

ثبت نام کاربر:
شما می‌توانید با HTML یک فرم ساده ایجاد کنید. این کار به راحتی توسط نرم‌افزارهایی نظیر Front Page و یا DreamWeaver قابل انجام است ولی من یک کد آماده با نام login_from.htm برای شما آماده کرده‌ام که می‌توانید از آن استفاده کنید. شما می‌توانید با سلیقه خود طرح و شکل آن را عوض کنید. چنانچه خواستید شکل فرم را عوض کنید این نکته توجه داشته باشید که نام فیلدهای فرم به صورت زیر باشد: first_name ،last_name ،email_address ،username و info.

چنانچه فرم نمونه را تغییر نمی‌دهید تمام نام‌ها برای هر فیلد درست انتخاب شده‌اند و نیازی به تغییر آنها نیست. لازم به یادآوری است که خاصیت action فرم باید به مسیر درستی (در اینجا register.php) برای فرستادن اطلاعات اشاره کند.

اکنون فایل register.php را باز کنید. به ظاهر کد پیچیده‌ای است. اماعجله نکنید! در ادامه درباره ساختار کدها و طرز کار هریک از آن‌ها صحبت خواهد شد. اگر به توضیحاتی که در درون کدها نوشته شده است توجه کنید درک آن بسیار ساده و قابل فهم خواهد بود. حال به توضیح برنامه می‌پردازیم:

&lt;?php
 include 'db.php';
?&gt;

این خط فایل db.php که حاوی کدهای لازم برای ارتباط با بانک اطلاعاتی می‌باشد را در بدنه اصلی برنامه فراخوانی می‌کند. باز هم این نکته را یادآوری می‌کنم که چنانچه اطلاعات زیادی درباره بانک‌های اطلاعاتی و نحوه برنامه نویسی آنها ندارید، حتما آموخته‌های خود را تکمیل کنید تا فهم و درک مطلب برای شما آسانتر شود. من یک نمونه اتصال به بانک اطلاعاتی را که در db.php نوشته شده در زیر آورده‌ام. اگر جزو کاربران حرفه‌ای PHP هستید تغییرات دلخواه و یا حتی جدید را می‌توانید در db.php انجام دهید:

<?php
 $dbhost = "localhost"; // database host
 $dbuser = "db_username"; // database username
 $dbpassword = "db_password"; // database password
 $db2use = "db_name"; // name of database

 $conn = @mysql_pconnect($dbhost,$dbuser,$dbpassword)
 or die("Connection failed: Please try later.");
 $db = @mysql_select_db ($db2use,$conn) or die(Error:.mysql_error());
?>

در مورد کد بالا به نکات زیر توجه کنید:
  • مقدار dbhost$ در بیشتر موارد localhost می‌باشد. اما چنانچه غیر از این بود با سرویس پشتیبان سرورتان تماس بگیرید.
  • dbuser$ نام کاربری بانک اطلاعاتی شما می‌باشد.
  • dbpassword$ کلمه عبور بانک اطلاعاتی شما می‌باشد.
  • db2use$ نام دیتابیس (بانک اطلاعاتی) مورد استفاده شما می‌باشد.

برای اتصال به بانک اطلاعاتی از یک mysql_pconnect استفاده کردیم که وظیفه ارتباط دائمی را تا پایان برنامه به عهده داشته دارد. این کار باعث صرفه جویی در زمان اجرای برنامه می‌شود ولی این نکته حائز اهمیت است که استفاده از یک ارتباط دائمی در بعضی موارد ممکن است به سود شما نباشد و باعث ایجاد بار اضافی بر روی سرور شما شود. سایر دستورات مربوط به بالا واضح است و احتیاج به توضیح ندارند. حال به ادامه توضیحات می پردازیم:

// Define post fields into simple variables
 $first_name = $_POST['first_name'];
 $last_name = $_POST['last_name'];
 $email_address = $_POST['email_address'];
 $username = $_POST['username'];
 $info = $_POST['info'];

// Let's strip some slashes in case the user entered any escaped characters
 $first_name = stripslashes($first_name);
 $last_name = stripslashes($last_name);
 $email_address = stripslashes($email_address);
 $username = stripslashes($username);
 $info = stripslashes($info);

همانطور که از توضیح اول کد مشخص است، اطلاعات فرستاده شده از طریق فرم در متغیرهایی ذخیره می‌شود. این عمل با استفاده از متد []POST_$ انجام می‌شود. در قسمت بعد از تابع ( )stripslashes استفاده کرده‌ایم. تابع یاد شده \ (اسلش)های موجود قبل از ' و " که PHP به طور خودکار به آنها اضافه می کند را حذف می‌کند. این عمل به خاطر این است که امکان دارد ما اطلاعاتی که توسط کاربر ثبت می شود را دوباره نمایش دهیم. وجود اسلش هنگام فراخوانی اطلاعات از بانک اطلاعاتی موجب بروز خطای دستوری می‌شود. این قسمت بیشتر در مورد اطلاعاتی است که از فیلد Infromation about you کاربرد دارد زیرا کاربر می‌تواند هر آنچه را که می‌خواهد در آن بنویسد.

برای چک کردن اینکه ایمیل درست وارد شده باشد یعنی حاوی @ و . باشد، دستورهای جاوا اسکریپتی بسیاری است که به دلیل پیچیده شدن موضوع آن را به خودتان واگذار میکنیم. حال نوبت به کنترل اطلاعاتی است که کاربر ارسال کرده است:

// Do some error checking on the form posted fields
 if((!$first_name) || (!$last_name) || (!$email_address) || (!$username)) {
   echo 'You did not submit the following required information! &lt;br /&gt;';

 if (!$first_name) {
   echo "First Name is a required field. Please enter it below.&lt;br /&gt;";
 }

 if (!$last_name) {
   echo "Last Name is a required field. Please enter it below.&lt;br /&gt;";
 }

 if (!$email_address) {
   echo "Email Address is a required field. Please enter it below.&lt;br /&gt;";
 }

 if (!$username) {
   echo "Desired Username is a required field. Please enter it below.&lt;br /&gt;";
 }

 include 'join_form.html'; // Show the form again!

 /* End the error checking and if everything is ok, we'll move on to
 creating the user account */

 exit(); // if the error checking has failed, we'll exit the script!
}

این قسمت بسیار ساده است. شرط اول کنترل میکند که همه فیلدها پر شده باشند. این کار بوسیله عملگر منطقی "یا" "||" انجام می‌شود. چنانچه یکی از فیلدها خالی باشد، پیغام‌های خطای متناظر با آن با آن فیلد بر روی صفحه نشان داده خواهد شد. چنانچه همه فیلدها پر شده باشند و فیلد خالی موجود نباشد کنترل متغیرها متوقف شده و از بلاک شرط با دستور ()exit خارج می شویم. قسمت بعد کنترل اینکه نام کاربری و ایمیل شما قبلا در بانک اطلاعاتی ذخیره نشده باشد:

 $sql_email_check = mysql_query("SELECT email_address FROM users WHERE
 email_address='$email_address'");
 $sql_username_check = mysql_query("SELECT username FROM users WHERE
 username='$username'");
 $email_check = mysql_num_rows($sql_email_check);
 $username_check = mysql_num_rows($sql_username_check);

 if (($email_check &gt; 0) || ($username_check &gt; 0)) {
  echo "Please fix the following errors: &lt;br /&gt;";

   if ($email_check &gt; 0) {
     echo "&lt;strong&gt;Your email address has already been used by
           another member in our database. Please submit a different
           Email address!&lt;br /&gt;";

     unset($email_address);
   }

   if ($username_check &gt; 0) {
     echo "The username you have selected has already been used by
           another member in our database. Please choose a different
           Username!&lt;br /&gt;";

     unset($username);
   }

   include 'join_form.html'; // Show the form again!

   exit(); // exit the script so that we do not create this account!
 }

دستورات بالا برای آنهایی که در حد متوسط از بانک‌های اطلاعاتی سر رشته دارند بسیار ساده است. چنانچه نام کاربری و یا ایمیل قبلا ثبت شده باشد مقدار () mysql_num_rows برابر صفر نمی‌شود و پیغام‌های متناظر با کنترل نام کاربری و یا ایمیل برای کاربر نشان داده می‌شود و روند ثبت نام قطع شده و پیغام مورد نظر چاپ می شود و در زیر آن دوباره فرم ثبت نام نشان داده می‌شود. حتما تا به حال با این موضوع در سایت های بزرگ برخورد کرده‌اید که چنانچه هر کدام از فیلدها به نحوی اشتباه پر شده باشند و یا نام کاربری قبلا ثبت شده باشد صفحه فرم با اطلاعاتی که کاربر هنگام ورود پر کرده تکمیل شده و قسمت مشکل دار با پیغام خطا به رنگ قرمز نمایش داده می‌شود. برای ساختن چنین روندی به برنامه نویسی پیشرفته و بکارگیری اسکریپت‌های مختلفی نیاز داریم که از سطح متوسط این مقاله خارج است.

function makeRandomPassword() {
 $salt = "abchefghjkmnpqrstuvwxyz0123456789";
 srand((double)microtime()*1000000);
 $i = 0;

 while ($i <= 7) {
   $num = rand() % 33;
   $tmp = substr($salt, $num, 1);
   $pass = $pass . $tmp;
   $i++;
 }

 return $pass;
}

$random_password = makeRandomPassword();
$db_password = md5($random_password);

کار این تابع ایجاد یک کلمه عبور تصادفی و تبدیل آن به فرمت md5 است. اینکه چرا کاربر اجازه ندارد که خودش کلمه عبور را انتخاب کند دلایلی دارد. یکی از آن دلایل این است که کلمه عبور ساخته شده به ایمیل کاربر فرستاده می‌شود و این به ما در راستای اینکه آیا ایمیل ثبت شده توسط کاربر ایمیل معتبری می‌باشد کمک می‌کند. به عبارتی چنانچه ایمیل فرد معتبر باشد کاربر با رفتن به ایمیل پسورد خود را دریافت می‌کند. و دلیل دیگر اینکه باایجاد یک کلمه عبور تصادفی و همچنین تبدیل آن به md5 امنیت کلمه عبور بسار بالا می‌رود و به سادگی توسط هکرها قابل شناسایی نیست.

// Enter info into the Database.
 $info2 = htmlspecialchars($info);
 $sql = mysql_query("INSERT INTO users (first_name, last_name,
 email_address, username, password, info, signup_date)
 VALUES('$first_name', '$last_name', '$email_address',
 '$username', '$db_password', '$info2', now())") or die (mysql_error());

 if (!$sql) {
   echo 'There has been an error creating your account. Please
   contact the  webmaster.';
 }
 else {
   $userid = mysql_insert_id();

   // Let's mail the user!
   $subject = "Your Membership at MyWebsite!";
   $message = "Dear $first_name $last_name,
   Thank you for registering at our website, http://www.mydomain.com!
   You are two steps away from logging in and accessing our exclusive members
   area. To activate your membership, please click here:
   http://www.mydomain.com/activate.php?id=$userid&code=$db_password
   Once you activate your memebership, you will be able to login with the
   following information:
   Username: $username
   Password: $random_password
   Thanks!
   The Webmaster
   This is an automated response, please do not reply!";

   mail($email_address, $subject, $message,
   "From: MyDomain Webmaster< admin@mydomain.com>");

   echo 'Your membership information has been mailed to your email address!
   Please check it and follow the directions!';
 }
?>

همانطور که از توضیحات بر می‌آید، این قسمت جهت ثبت در بانک اطلاعاتی و فرستادن اطلاعات از قببیل پسورد و همچنین لینک فعال سازی به کاربر می‌باشد. اما تابع ( )htmlspecialchars چه کاری انجام می‌دهد؟ این تابع تگهای html را به کدهای مربوطه تغییر می‌دهد برای مثال:

$new = htmlspecialchars("&lt;a href='test'&gt;Test&lt;/a&gt;", ENT_QUOTES);
echo $new;  // &lt;a href=&#039;test&#039;&gt;Test&lt;/a&gt;

این کار باعث می‌شود که کاراکترهایی نظیر < > ' به همین صورت در بانک اطلاعاتی ذخیره نشوند و باعث بروز خطاهای دستوری هنگام فراخوانی آنها توسط PHP نشوند.

در قسمت بعد اطلاعاتی که پس از گذراندن از مراحل مختلف آماده ذخیره شدن در بانک اطلاعاتی هستند به وسیله دستورINSERT در بانک اطلاعاتی ثبت می‌شوند. چنانچه مشکلی در بانک اطلاعاتی وجود نداشته باشد، مرحله بعدی آن که فرستادن ایمیل به کاربر می‌باشد اجرا می‌شود. فرستادن ایمیل توسط تابع ()mail انجام می‌شود. روش‌های استفاده از تابع ()mail بسیار است که با مراجعه به help برنامه PHP می‌توانید آنها را مشاهده کنید. در این جا ساده‌ترین روش برای اینکار انتخاب شده است. کاربر در قسمت پیام ایمیل چیزی شبیه به آنچه در زیر آمده است مشاهده می‌کند:

From: MyDomain Webmaster
To: you@email.com
Subject: Your Membership at MyWebsite!

Dear boy from sun,
Thank you for registering at our website, http://www.mydomain.com!
You are two steps away from logging in and accessing our exclusive members area.
To activate your membership, please click here:
http://www.mydomain.com/activate.php?id=3&cod=37ec82769e837c2f853450

Once you activate your memebership, you will be able to login with the
following information:
Username: myusername
Password: msxsag4h

Thanks!
The Webmaster
This is an automated response, please do not reply!

مرحله بعد به روز رسانی پایگاه داده هنگامی که کاربر ایمیل خود را چک کرده و بر روی لینک معتبر سازی کلیک کرده است، می‌باشد. کد زیر در فایل activate.php ذخیره شده است:

<?
 /* Account activation script */
 include 'db.php';
 $userid = $_REQUEST['id'];
 $code = $_REQUEST['code'];
 $sql = mysql_query("UPDATE users SET activated='1' WHERE userid='$userid'
 AND password='$code'");
 $sql_doublecheck = mysql_query("SELECT * FROM users WHERE userid='$userid'
 AND password='$code' AND activated='1'");
 $doublecheck = mysql_num_rows($sql_doublecheck);

 if ($doublecheck == 0) {
   echo "<font color=red>Your account could not be activated!</font>";
 } elseif ($doublecheck > 0) {
   echo "Your account has been activated! You may login below!<br />";
   include 'login_form.html';
 }
?>

خط اول فراخوانی فایل db.php برای برقراری ارتباط با بانک اطلاعاتی می‌باشد. پس از گرفتن اطلاعات خواسته شده از طریق لینک فعال سازی، برنامه ابتدا مقدار activate کاربر را در صورت صحت اطلاعات ارسالی برابر با 1 قرار می‌دهد و در بانک اطلاعاتی ذخیره می‌کند و چنانچه این عمل با موفقیت انجام شد دوباره کنترل میکند که آیا فعال سازی نام کاربری درست انجام گرفته است یا خیر. چنانچه این قسمت بدون خطا اجرا شود، صفحه ورود کاربر در صفحه ظاهر می‌شود.

در مقاله بعدی چگونگی ورود کاربر بعد از تائید نام کاربری و کلمه عبور را بررسی می‌کنیم.

فایل‌های مرتبط

  • برنامه نمونه (4 کیلوبایت)
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫نحوه ایجاد یک Wizard برای Visual Studio .NET

نحوه ایجاد یک Wizard برای Visual Studio .NET

در این مقاله با نحوه ساخت یک Wizard برای Visual Studio .NET توسط VB.NET آشنا خواهید شد.

توسط keyvannayyeri | 10 مرداد 1383 | 3207 بار مشاهده Printable Version نسخه مخصوص چاپ
Wizardها برنامه‌هایی کاربردی هستند که کاربران را در انجام یک سری دستورات یاری می‌دهند. به طور کلی دستوراتی که توسط Wizardها انجام می‌شوند به یک ترتیب خاص اعمال نیاز دارند. نکته مهم در مورد Wizardها این است که از تکرار و یکنواختی جلوگیری کرده و یک دستور چند مرحله‌ای را به یک ترتیب خطی از هر آنچه برای هدف مورد نظر است در می‌آورند.

به تجربه احتمالا می‌دانید مایکروسافت Wizardها را به عنوان ترتیبی از کادرهای محاوره‌ای با شمایل مناسب همراه با برخی کلمات که دستورات را نشان می‌دهند و کادرهای ورودی با انتخاب‌های چندگانه ساده پیاده‌سازی کرده است. این Wizardها در واقع نمایش خارجی بخشهای پنهانی هستند که ازآنها استفاده می‌کنند. ایجاد Wizardها در Visual Basic .NET برای VS.NET ساده تر از ایجاد Add-Inها برای برنامه‌های کاربردی است.

Visual Studio .NET به شما این امکان را می‌دهد که برای بعضی اعمال و کارها Wizardهایی را نوشته و آنها را در محیط این برنامه به اجرا درآورید. در این مقاله با نحوه نوشتن یک Wizard که توسط منوی File | Add New Item به اجرا در می‌آید، آشنا خواهید شد.

گام‌های اساسی برای ایجاد یک Wizard برای VS.NET مطابق زیر است:

  • ایجاد یک پروژه Class Library.
  • ایجاد یک Refrence به کتابخانه EvnDTE.
  • پیاده‌سازی Interfaceخاصی به نام IDTwizard و متدی که با آن Interface تعریف شده است یعنی Excute. وقتی Wizard احضار شود، این متد فراخوانی خواهد شد.
  • پیاده‌سازی رفتار Wizard: این گام معمولا" یک ترتیب از کادرهای محاوره‌ای و یک نتیجه پایانی را شامل می‌شود.
  • Compile و ثبت نام Wizard با استفاده از نرم‌افزار کمکی Regasm.exe.
  • ایجاد یک فایل متنی با نامی مشابه نام Wizard و پسوند vsz. برای مثال فایل Mywizard.dll احتیاج به یک فایل متنی با نام Mywizard.vsz دارد. در ادامه درباره این فایل متنی بیشتر توضیح خواهیم داد.
  • کپی کردن فایل به شاخه مخصوص آن. این شاخه به نحوه‌ای که شما Wizart را احضار می‌کنید، بستگی دارد. برای مثال اگر شما می‌خواهید Wizard شما زمانی که کاربر فایلی جدیدی را برای اضافه کردن به پروژه انتخاب می‌کند اجرا شود، یک Item جدید در پروژه VB ایجاد کرده و فایل با پسوند vsz. را به شاخه‌ای که شامل عناصر AddNewItem است کپی کنید. مثلا":

    C:\ProgramFiles\Microsft Visual Studio .NET\vb7\VBProjectItems\LocalProjectItems\

اساس کار نوشتن یک Wizart، ایجاد یک کلاس کتابخانه‌ای است که IDTWizard را پیاده‌سازی می‌کند. قطعه کد زیر بیانگر Wizard خاصی است که یک Message Box را نشان می‌دهد:

Imports EnvDTE

Public Class Class1
    Implements IDTWizard

Private Sub Excute(ByVal Application As Object, _
    ByVal hwndOwner As Integer, _
    ByRef contextParams() As Object, _
    ByRef customParams() As Object, _
    ByRef RetVal As wizardResult) Implements EnvDTE.IDTWizard.Excute

        MsgBox("یا علی")
        RetVal = wizardResult.wizardResultCancel

    End Sub
End Class

متد Excute پارامترهای متفاوتی را می‌گیرد. Application ارجای به محیطی است که Wizard در آن در حال اجراست. hwnOwner کنترل کننده (Handle) برنامه کاربردی والد است. ContextParams شامل اطلاعاتی در مورد محیطی است که Wizard در آن اجرا شده است. Custom Params مقادیری هستند که شما می‌توانید از طریق فایل vsz. با فرم نگارشی Params=Value به Wizard ارسال کنید. RetVal نیز یک مقدار شمارشی است که نشان می‌دهد Wizard موفق شده یا شکست خورده است.

ایجاد فایل VSZ.:
یک Wizard فایلی را با نامی مشابه با نام اعلام شده آن و پسوند vsz. نیاز دارد. این فایل یک فایل متنی ساده شبیه به یک فایل ini. است که اطلاعات لازم را به برنامه کاربردی ارسال می کند. فرمت پایه فایل vsz. یک فایل متنی با دو قسمت و نام و جفت‌های مقادیر است. برای Wizard نمونه ما تمام چیزی که نیاز است یک فایل متنی با محتوای زیر است:

VSWIZARD 7.0
Wizard=Wizard1.Class1
Param=<Nothing>

اگر شما نیاز به ارسال پارامتری دارید آن را به فرم Param=Value همانگونه که در مثال مشخص شده است، ارسال کنید. پس از ایجاد این فایل آن را به شاخه‌ای که قبلا" ذکر شد کپی کنید. برای مثال اگر آن را به شاخه زیر کپی کنید، Wizard شما از طریق منوی File | Add New Item در دسترس خواهد بود:

C:\ProgramFiles\Microsft Visual Studio .NET\vb7\VBProjectItems\LocalProjectItems\

Register کردن اسمبلی Wizard:
برای Register کردن اسمبلی یک Wizard آدرس کامل فایل آنرا در برنامه regasm.exe وارد کنید و مطمئن شوید که از سوئیچ codebase/ استفاده کرده‌اید. مثال زیر Wizard با نام mywizard.dll را که در شاخه فعلی موجود است Register می‌کند:

C:\WINNT\Microsoft .NET\Framework\v1.0.3215\regasm.exe mywizard.dll /codebase

برای انجام عکس این عمل (Unregister) از سوئیچ unregister/ استفاده کنید:

C:\WINNT\Microsoft .NET\Framework\v1.0.3215\regasm.exe mywizard.dll /unregister

تست کردن Wizard:
Wizard ما هم اکنون قابل استفاده است. برای تست آن کافیست از منوی File | Add New Item، مورد جدید اضافه شده را انتخاب کنید.

منبع:
کتاب Visual Basic .NET Unleashed از SAMS Publication

Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫بررسی معماری Applet-to-Servlet در جاوا

Softtool

بررسی معماری Applet-to-Servlet در جاوا

در این مقاله پس از معرفی Appletها و Servletها، چندین معماری Applet-to-Servlet بررسی می‌شود.

توسط Haghgonia | 22 مرداد 1383 | 3192 بار مشاهده Printable Version نسخه مخصوص چاپ
در طراحی برنامه‌های مبتنی بر وب و چند لایه می‌توان از روش Applet-to-Servlet استفاده کرد. اپلت‌ها یک مکانیزم مناسب جهت تولید رابط‌های گرافیکی قدرتمند و پویا هستند و از طرف دیگر Servletها نیز یک راه حل کارآمد برای کنترل درخواست‌ها در یک سرویس دهنده وب (Web Server) یا سرویس دهنده برنامه‌های کاربردی (Application Server) هستند. در مدل‌های برنامه‌نویسی شرکت سان که بهترین راه حل‌های تولید برنامه‌های بزرگ جاوا را بر پایه پلاتفرم Java 2 ارائه می‌کند، استفاده از اپلتها، HTML و Java Server Page درسمت سرویس گیرنده و Servletها بهمراه Enterprise Java Beans) EJB) یا سایر Componentهای کمکی در سمت سرویس دهنده توصیه می‌شود.

اپلت‌ها:
اپلت‌ها برنامه‌های جاوا هستند که در داخل سرویس دهنده وب اجرا می شوند و از کلاس java.applet.Applet یا javax.swing.JApplet ارث می‌گیرند. در مقایسه با صفحات HTML، اپلتها می‌توانند رابط کاربر قدرتمندتر و پویاتری تولید نمایند. از اپلت‌ها می‌توان در برنامه‌های بزرگ برای مشاهده یا تغییر اطلاعات ارسالی از سمت سرویس دهنده استفاده کرد. برای مثال از یک اپلت می‌توان برای مشاهده یا تغییر رکوردهای بانک اطلاعاتی یا کنترل وضعیت سرویس دهنده یا برنامه‌های در حال اجرای روی آن استفاده کرد.

یک اپلت می‌تواند دارای یک کلاس منفرد یا چندین کلاس باشد. برای تسریع در انتقال کلاس‌ها به سرویس گیرنده از حالت فشرده کلاس‌ها در قالب Java Archive File) JAR) می‌توان استفاده کرد. در نتیجه کد اپلت هر زمان که در سمت سرویس دهنده تغییر کند، با اولین مراجعه مجدد کاربر به سایت بروزرسانی می‌شود.

از آنجاییکه اپلت‌ها در سمت سرویس گیرنده اجرا می‌شوند، یکسری تدابیر امنیتی برای اپلتها در نظر گرفته شده است که نواقص و ایرادهای Microsoft ActiveX را برطرف می‌کند. از جمله محدودیت‌های اپلتها این است که به منابع سرویس گیرنده دسترسی ندارند و در روی سرویس گیرنده نمی‌توانند فایلی را بخوانند یا بنویسند و یا برنامه‌ای را اجرا نمایند.

Servletها:
Java Servletها اجزاء نرم‌افزاری سمت سرویس دهنده هستند که مشابه برنامه‌های CGI کنترل درخواستهای وب، برگرداندن اطلاعات پویا برای سرویس گیرنده، دسترسی به بانک اطلاعاتی و ارتباط با سایر اجزاء نرم‌افزاری موجود روی سرویس دهنده را انجام می‌دهند. بر خلاف CGI که به ازای هر درخواست سرویس گیرنده یک کپی از برنامه در سمت سرویس دهنده بارگذاری و اجرا می شود، Servletها تنها یکبار در سرویس دهنده بارگذاری و به ازای هر درخواست سرویس گیرنده فراخوانی می‌شوند. شکل زیر تفاوت بین Srevlet و CGI را نشان می‌دهد.

معماری‌های موجود
چندین معماری برای روش Applet-to-Servlet وجود دارد که در ادامه سه مورد از آن بررسی می‌شود.

  • معماری دو لایه (Two-Tier)
    در این معماری تنها از اپلت در سمت سرویس گیرنده استفاده می‌شود و اپلتها از طریق پروتکلهایی مانند JDBC و (Remote Method Invocation) RMI به منابع سیستم -بانکهای اطلاعاتی، دایرکتوریهای Light Weight Directory Access Protocol) LDAP) و EJB Component- مستقیما" دسترسی پیدا می‌کنند. شکل زیر این معماری را نشان می‌دهد:

    اگر چه این معماری ساده به نظر می‌رسد، اما دارای مشکلات و معایبی است که عبارتند از:

    • در این روش تمام اطلاعات دسترسی به سرویس دهنده و منابع آن شامل شناسه کاربر، رمز عبور، مشخصات بانک اطلاعاتی، مشخصات سرویس دهنده و هر چیز دیگری بایستی در داخل کد اپلت تعریف شود. در نتیجه احتمال دسترسی کاربر به این اطلاعات وجود دارد. (برای مثال استفاده از یک De-Compiler)
    • بانک اطلاعاتی یا هر سیستمی که اپلت به آن نیاز دارد روی همان ماشین سرویس دهنده وب قرار می‌گیرد و در نتیجه سرویس دهنده همزمان بعنوان سرویس دهنده بانک اطلاعاتی و سرویس دهنده وب عمل می کند. در اینصورت اگر دسترسی به یکسری از اطلاعات توسط Firewall محدود شده باشد، اپلت‌ها نمی‌توانند به این منابع دسترسی پیدا کنند.
    • مکانیزم Clustering و Pooling روی سرویس دهنده بسیار مشکل و حتی ناممکن می‌باشد.

  • معماری سه لایه (Three-Tier)
    یک راه حل بهتر نسبت به معماری دو لایه، استفاده از Servlet برای کپسوله کردن ارتباط با منابع سرویس دهنده می‌باشد. در این معماری Servlet مشکلات امنیتی حاصل از محدودیت‌های اپلت را برطرف می‌کند و همچنین دسترسی اپلت‌ها را به Business Logic و Enterprise Information Systems کنترل می‌کند. در این روش اپلت درخواست را به Servlet می‌فرستد و Servlet پس از برقراری ارتباط با بانک اطلاعاتی یا هر منبع مورد نیاز دیگر و انجام محاسبات، نتیجه را برای اپلت ارسال می‌نماید.

    مزایا و معایب این معماری عبارتند از:
    • در این معماری لایه‌های سیستم می‌توانتد روی چندین سرویس دهنده توزیع شوتد و تمام لایه‌ها با یک بانک اطلاعاتی واحد ارتباط برقرار می‌کنتد.
    • استفاده از این معماری باعث قابلیت گسترش (Scalability) و ماژوله بودن سیستم می شود‌.
    • قرار گرفتن لایه منطق برنامه در Servlet که پیچیدگی برنامه را افزایش داده و قابلیت حمل (Portability) را کاهش می‌دهد.

  • معماری چند لایه (N-Tier)
    اگر از تکنولوژی Enterprise Java Beans استفاده ‌شود، Servlet بعنوان یک میانجی عمل می‌کند. استفاده از EJB باعث حذف Business Logic و انتقال آن به EJB می‌شود. در این روش اپلت با Servlet تماس می‌گیرد و Servlet اطلاعات را به EJB می‌فرستد و بالعکس. استفاده از EJB ،Servlet ،HTML و اپلت حداکثر انعطاف پذیری و کارایی را درکنار پیچیدگی و هزینه بیشتر به همراه دارد.

Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫ده نکته برای افزایش سرعت بارگزاری صفحات وب

ده نکته برای افزایش سرعت بارگزاری صفحات وب

افزایش سرعت بارگزاری صفحات یکی از روش‌های موثر برای جلب رضایت بازدیدکنندگان یک سایت است که در این مقاله با 10 نکته برای انجام این کار آشنا خواهید شد.

توسط alirezagolkari | 20 شهریور 1383 | 9272 بار مشاهده Printable Version نسخه مخصوص چاپ

افزایش سرعت بارگزاری صفحات یکی از مسائل مهم در طراحی صفحات وب می‌باشد. در صورتی که زمان بارگزاری یک صفحه وب طولانی باشد، معمولا" کاربران از مشاهده آن صفحه صرف نظر می‌کنند و دیگر به آن باز نمی‌گردند این به معنی از دست دادن کاربران سایت می‌باشد که برای مدیران یک سایت اصلا" خوشایند نیست. در ادامه ده روش موثر برای افزایش سرعت بارگزاری صفحات وب بیان می‌شود.

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 بالا را بصورت زیر تغییر دهید.

<img 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" >link</a>

از کد زیر استفاده کنید:

<a href="http://www.URL.com/directoryname/">link</a>

زیرا اگر از / در انتهای آدرس استفاده نکنید سرور متوجه نخواهد شد که اشاره به فایل شده یا فهرست. اما با اضافه کردن / سرور فورا" متوجه می‌شود که به یک فهرست اشاره شده و آنرا نمایش می‌دهد.

منابع

  • Ten ways to speed up the download time of your web pages
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫ساخت یک برنامه نصب توسط InstallShield

ساخت یک برنامه نصب توسط InstallShield

هر برنامه‌ای به هر زبانی که نوشته شده باشد به یک برنامه نصب احتیاج دارد تا روی کامپیوترهای دیگر اجرا شود. در این مقاله نحوه ساخت یک برنامه نصب توسط InstallShield را یاد خواهید گرفت.

توسط SoheilPro | 8 آذر 1381 | 4968 بار مشاهده Printable Version نسخه مخصوص چاپ
برنامه InstallShield یکی از قویترین نرم‌افزارهای ساخت برنامه‌های نصب برای ویندوز است. این برنامه بهمراه WISE تنها نرم‌افزارهای مورد تایید مایکروسافت برای ساخت برنامه‌های نصب تحت سیستم عامل‌های این شرکت میباشند. InstallShield تاکنون در نگارش‌های مختلفی عرضه شده است و ما در اینجا از نسخه InstallShield Developer 7.0 استفاده خواهیم کرد.

جهت شروع از Project Wizard که ساده‌ترین راه برای ساخت یک برنامه نصب است استفاده میکنم. برای اینکار InstallShield را اجرا کرده و از منوی File گزینه Project Wizard را انتخاب کنید. حال مرحله به مرحله صفحات این Wizard را مورد بررسی قرار میدهیم:

Welcome to the Project Wizard
این صفحه توضیحاتی درباره Project Wizard میدهد و امکانات آنرا معرفی میکند.

Wizard Project
در این صفحه گزینه Create a New Project را انتخاب کنید و نامی برای پروژه خود انتخاب کنید.

Project Type
حال باید مشخص کنید که قصد ساخت چه نوع پروژه‌ای را دارید. در این نسخه امکان ساخت دو نوع پروژه Standard و Basic MSI وجود دارد. در نوع Basic MSI برنامه نصب شما تماما" توسط Microsoft Windows Installer اجرا و کنترل میشود اما در نوع Standard شما از InstallScript نیز میتوانید برای کنترل برنامه نصب خود استفاده کنید. اما در هر صورت برنامه‌های نصب شما به Windows Installer احتیاج خواهند داشت.

Application Information
در این مرحله باید اطلاعاتی را درباره نرم‌افزاری که قصد ساخت برنامه نصب برای آن دارید را مشخص کنید. در قسمت‌های Application Name و Application Version نام و شماره نگارش نرم‌افزار خود را وارد کنید و توجه داشته باشید که شماره نگارش حتما" به صورت AA.BB.CCCC نوشته شود. در قسمت Default Destination Folder نیز مسیر پیش فرضی را که مایل به نصب برنامه خود در آنجا هستید را مشخص کنید. این مسیر با توجه به توصیه‌های مایکروسافت باید به صورت [ProgramFilesFolder]Company Name\Product Name باشد.

عباراتی که داخل کروشه نوشته میشوند مشخص کننده یک متغیر Windows Installer هستند. در این مورد استفاده از [ProgramFilesFolder] باعث میشود که هنگام اجرای برنامه نصب بجای این عبارت از مسیر دایرکتوری Program Files کاربر استفاده شود.

Company Information
در این مرحله نیز اطلاعات شرکت خود شامل نام، شماره تلفن پشتیبانی و آدرس سایت وب را وارد کنید.

Setup Languages
زبان‌هایی که مایل به پشیبانی از آنها در برنامه نصب خود هستید را از لیست انتخاب کنید.

Application Features
این مرحله یکی از مهمترین مراحل ساخت یک برنامه نصب است. در این مرحله میتوانید برنامه خود را به چند زیرمجموعه (Feature) تقسیم کنید بطوریکه کاربر بتواند به دلخواه مشخص کند که کدام Featureها نصب شوند. برای مثال میتوان یک برنامه را به زیرمجموعه‌های فایل‌های اصلی (Program Files)، فایل‌های راهنما (Help Files)، و فایل‌های نمونه (Sample Files) تقسیم کرد تا کاربر تنها مواردی را که احتیاج دارد نصب کند. هر زیرمجموعه نیز میتواند خود شامل چندین زیرمجموعه دیگر باشد.

Application Files
حال میرسیم به مهمترین مرحله که مشخص کردن فایل‌هایی است که باید نصب شوند. برای اینکار ابتدا از لیست بالای صفحه یک زیرمجموعه (Feature) را انتخاب کنید سپس با استفاده از دکمه Add Files فایل‌هایی را که به این زیرمجموعه مربوط میشوند اضافه کنید.

هنگام اضافه کردن فایل‌ها پنجره‌ای با عنوان Path Variable Recommendation ظاهر میشود که درباره نحوه رفتار با مسیر فایل سوال میکند. قبل از توضیح این قسمت لازم است با مفهوم Path Variable آشنا شویم. یک Path Variable متغیری است که به یک مسیر اشاره میکند. در نتیجه اگر برای مسیر C:\My Projects\My Program یک Path Variable با نام MyPath تعریف کرده باشید برای مشخص کردن فایلی که در این دایرکتوری با نام MyFile.exe وجود دارد میتوان از <MyPath>\MyFile.exe استفاده کرد. از جمله مزایای این روش سرعت و سهولت بیشتر هنگام کار با فایل‌ها است. همچنین اگر شما مجبور به تغییر دادن دایرکتوری محل قرارگیری فایل‌های خود شدید به جای تغییر دادن مسیر ده‌ها فایل تنها کافیست مقدار Path Variable را تغییر دهید.

در این پنجره سه گزینه وجود دارد که گزینه اول امکان استفاده از یک Path Variable موجود را میدهد؛ گزینه دوم بر اساس مسیر فایل انتخاب شده یک Path Variable میسازد و از آن استفاده میکند و گزینه سوم نیز از مسیر کامل فایل به طور مستقیم استفاده میکند.

Create Shortcuts
در این مرحله میتوانید میانبرهایی را برای برنامه‌تان در سیستم کاربر ایجاد کنید. برای این کار ابتدا محلی که مایل هستید میانبر در آنجا ساخته شود را انتخاب کنید و سپس بوسیله دکمه سمت راست موس روی آن کلیک کرده و از منوی باز شده New Shortcut را انتخاب کنید و نامی برای آن مشخص کنید. در قسمت Features زیرمجموعه‌ای که میانبر به آن مربوط میشود را انتخاب کنید و در قسمت‌های Icon و Icon Index به ترتیب فایل حاوی آیکون و در صورتی که این فایل شامل چندین آیکون است شماره آنرا وارد کنید. در قسمت Target نیز باید نام فایلی که این میانبر آنرا اجرا خواهد کرد مشخص کنید. برای این مورد به یکی دیگر از متغیرهای Windows Installer نیاز داریم که نام آن [INSTALLDIR] است. محتوی این متغیر همان محلی است که کاربر هنگام نصب برنامه مشخص کرده است. بنابر این برای مشخص کردن فایل MyFile.exe کافیست [INSTALLDIR]\MyFile.exe را وارد کنید.

Registry Data
اگر برنامه شما نیاز به تنظیمات خاصی در رجیستری ویندوز دارد میتوانید در این مرحله یک فایل reg. را برای زیرمجموعه مربوط به آن مشخص کنید تا هنگام نصب به رجیستری اضافه شود.

Dialogs
در آخرین مرحله نیز کافیست پنجره‌هایی را که مایل هستید در طول فرایند نصب نشان داده شوند مشخص کنید.

Wizard Summary
اکنون میتوانید مروری بر تمام مواردی که مشخص کرده‌اید داشته باشید و اگر مشکلی وجود داشت با استفاده از دکمه Back به عقب باز گردید و آن را تصحیح کنید. اگر مایل هستید که بعد ساخته شدن پروژه، نسخه اجرایی آن هم ساخته شود مورد Build a Release را نیز انتخاب کنید.

به شما تبریک میگویم! شما موفق شدید اولین برنامه نصب خود را بسازید. تنها کار باقیمانده فشار دادن کلیدهای Ctrl+F5 و مشاهده نتیجه است.

سایت‌های مرتبط

  • سایت InstallShield
  • راهنمای مایکروسافت درباره Windows Installer
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫آشنائی با فرم‌های وب در ASP.NET

آشنائی با فرم‌های وب در ASP.NET

اگر مایل هستید از پایه با ASP.NET آشنا شوید و به طور عملی ساخت یک برنامه وب را تجربه کنید، این خودآموز بهترین راهنمای شما است.

توسط asadi | 28 آذر 1381 | 5688 بار مشاهده Printable Version نسخه مخصوص چاپ
به عنوان یک برنامه نویس ویژوال بیسیک شما می توانید برنامه های تحت اینترنت نیز بنویسید. به طور معمول برنامه نویسان ویژوال بیسیک به سمت 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 نمایش داده شود. همانطور که می بینید برنامه مانند فرم های معمولی ویندوز اجرا می شود.

Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫استفاده از Microsoft Agent در برنامه های خودتان

استفاده از Microsoft Agent در برنامه های خودتان

Microsoft Agent یکی از سرگرم کننده ترین فن آوریهای Microsoft می باشد که تا کنون توانسته بسیار مورد علاقه کاربران قرار بگیرد. Agentها به برنامه های شما جذابیت زیادی می دهند و امکان ارتباط بهتر و جالبتری را با کاربر ایجاد میکنند.

توسط DelphiMan | 14 دی 1381 | 7120 بار مشاهده Printable Version نسخه مخصوص چاپ
اولین باری که از این تکنولوژی استفاده شد در برنامه Office 97 بود که خیلی مورد علاقه کاربران قرار گرفت. من اون موقع خیلی گشتم تا بتونم از این امکان استفاده کنم ولی خوب نتونستم ): اما بعدها با پیشرفت کردن علم برنامه نویسی این تکنولوژی در اختیار دیگران هم قرار گرفت. برای همین در اوایل فقط در Office بود که از این امکان استفاده می شد.

حالا اینا رو گفتم اما ببینیم اصلاً Agent چی هست؟
شما اگه از Office استفاده میکنید حالا هر کدوم از برنامه هاش که باشه (Word ،Excel ،FrontPage...) یک شکلکی رو میبینید که همیشه نسبت به کارهایی که انجام میدین یک سری حرکات از خودش نشون میده که هم سرگرم کننده هست هم آموزنده. حالا حتماً متوجه شدین که در مورد چی صحبت میکنیم (هر چند که میدونم میدونستید (; ) خوب حالا می خواهیم ببینیم که چطور میشه از این امکان تو برنامه های خودمون استفاده کنیم مثلاً وقتی برنامه داره کار میکنه یه شکلکی بیاد برای کاربر ادا در بیاره تا طرف نفهمه که برنامه چیکار میکنه (: یا مثلا موقع ذخیره کردن و بازیابی کردن و یا جستجو و... یک سری حرکات مربوط به آن عمل انجام بده.

اینکار خیلی ساده است و فقط کافی هست شما یک Agent رو انتخاب کنید و در برنامتون تعریفش کنید و بعد هر کاری که خواستین رو بهش دستور بدین تا براتون انجام بده. ضمنا شما لازم نیست اصلاً غصه درست کار کردن اون رو بخورین چون خود Windows اونو کنترل میکنه که یه وقت کار بدی نکنه ((:

شما نمیتونید که Agent رو داخل یک جعبه مکالمه (Dialog Box) قرار بدین و فقط میتونید جای اولیه اون رو انتخاب کنید بعد نمایش بدین و کاربر میتونه اونو به دلخواه خود تغییر مکان بده با Drag کردن اینکار رو انجام میده. خوب حالا برای شروع کار به یک سری Agent نیاز داریم که البته همراه ویندوز همیشه یک سری همراه هستند بهترین اونها که میتونه کارهای زیادی انجام بده (منظور حالتهای زیادی براش تعریف شده) Merlin هست که یک جادوگر پیر می باشد. برای Download کردن اینها میتونید به سایتهایی که معرفی میکنم یک سری بزنید. ضمناً شما خودتون هم میتونید یک Agent طراحی بکنید که برای اینکار باید از یک سری نرم‌افزار استفاده کنید.

برای اینکه کاربر بتونه از Agent برنامه شما استفاده کنه باید حتماً Microsoft Agent Server‌ رو نصب کنه. که البته من تا حالا تو هر ویندوزی که برنامم رو اجرا کردم نصب شده بوده فکر کنم این برنامه همراه خود ویندوز هست (; ولی اگه نبود شما میتونید یک سری به آدرس زیر بزنید اونجا چیزهای جالبی در این مورد داره که یکم مطالعه کنید بد نیست:
http://www.microsoft.com/msagent

این مطالب تحت عنوان Microsoft Agent Software Development Kit هست که در اونجا شما همچنین میتونید نرم افزار Microsoft Agent Character Editor رو برای درست کردن Agent دریافت کنید. در این مقاله ما در مورد Voice Command‌ (فرمان‌های صوتی) و طراحی Agent صحبت نمیکنیم و فقط طرز استفاده از این امکان رو شرح میدم که خودتون بعداً میتونید در موردش بیشتر جستجو کنید. ما برای کارمون فقط احتیاج به Agent Server و یک کاراکتر داریم.

خوب حالا میریم سر اصل مطلب. بعد از اینکه مطمئن شدین روی ویندوزتون AgentServer رو دارین دلفی رو اجرا کنید و مراحل زیر رو مو به مو انجام بدین:
  • Component | Import ActiveX Control رو انتخاب کنید.
  • Microsoft Agent Control رو از تو لیست پیدا کنید و رو ی دکمه Install کلیک کنید.
  • خوب حالا باید تو قسمت ActiveX یک آیکونی شبیه به MenInBlack داشته باشید.
خوب تا یادم نرفته اینو بگم که برای پیدا کردن یک کاراکتر روی ویندوزتون باید برای acs.* جستجو کنید که البته به طور عادی اگر Agent Server نصب باشه توی شاخه Windows یک msagent باید وجود داشته باشه و داخل اون هم یک شاخه دیگه به نام Char هم هست که توش یک یا چند کاراکتر وجود داره که اگر از XP استفاده میکنید حتماً یکیش Merlin.acs هست (که من خیلی بهش علاقه دارم (: ) برای همین ما باید تو برنامه مون چک کنیم که آیا این شاخه وجود داره یا نه اگه وجود داشت میدونیم که Agent Server روی ویندوز کاربر نصب هست و ما می تونیم از Agent استفاده کنیم.

خوب برای اینکار باید اول ActiveX رو به روی فرم منتقل کنیم با اینکار یک type با نام TAgent به تعاریف فرم اضافه میشه. بعد باید یک متغییر تعریف کنیم که از نوع Boolean باشه تا با اون چک کنیم که آیا Agent Server نصب هست یا نه برای اینکار میشه از Code زیر استفاده کرد:

TYourObject
   private
     AgentInstalled: Boolean;
     function AgentIsInstalled: Boolean;
     procedure CreateAndLoadAgentIfInstalled;
     function GetColorDepth: Word;
     function GetWinDir: String;
     procedure SetFormColor;
     function AgentWasClicked

شما میتونید روی ویندوز کاربر به دنبال اون شاخه و کاراکتری که می خواهید از او استفاده کنید بگردید و اگه بود کار رو باهاش شروع کنید اگه هم نبود خوب دیگه کاربر باید محیط خشک برنامتون رو تحمل کنه (;

حالا مثلاً ما می خواهیم از Merlin استفاده کنیم:

function TYourObject.AgentIsInstalled: Boolean;
begin
   Result := (FileSearch('Merlin.acs', Format('%s\MSAGENT\CHARS', [GetWinDir]))<>'');
end;

function TYourObject.GetWinDir : string;
var
   WinDirZ : array[0..256] of Char;

begin
   GetWindowsDirectory(WinDirZ, SizeOf(WinDirZ));
   Result := StrPas(WinDirZ);
end;

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

حال که فهمیدیم کاربر امکان استفاده از Agent رو داره می تونیم کار رو شروع کنیم. در ادامه باید یک Object برای Agent خودمون بسازیم تا از این به بعد از اون استفاده کنیم و مجبور نباشیم از ActiveX استفاده کنیم. برای اینکار از کد زیر میشه استفاده کرد:

implementation

uses
   AgentDemoConsts,
   Registry,
   OLECtrls, AgentObjects_TLB;

procedure
   TYourObject.CreateAndLoadAgentIfInstalled;
const
   RightBias = 80;
   TopBias   = 70;
var
   tp: TPoint;

begin
   if (AgentInstalled) and not (Assigned(RobotAgent)) then begin
      RobotAgent := TAgent.Create(Application);
      RobotAgent.Characters.Load('Merlin','Merlin.acs');

      { Move the Agent to the center of the screen }
      tp.x := (Screen.Width div 2)-(Width div 2);
      tp.y := (Screen.Height div 2)-(Height div 2);

      with RobotAgent.Characters.Item['Merlin'] do begin
         MoveTo(tp.x+RightBias, tp.y+TopBias, 0);
         Show(0);
         Play('Greet');
         Play('Explain');
         Speak(SDemoIntro, '');
         Play('Pleased');
         Play('RestPose');
         Speak(SWhisper, '');
         Speak(SMonotone, '');
         Speak(SMap, '');
      end;
   end;
end;

چند خط اول که مشخص هست چه کار میکنه. اما بعد از اینکه کاراکتر تعریف شد (RobotAgent) اونو به Merlin نسبت میدیم وبعد هم اونو به وسط صفحه نمایش منتقل میکنیم و حالا میرسیم به مهمترین قسمت کار که دستور دهی به Merlin هست.

با استفاده از Play شما میتونید به Agent دستور بدین اما برای هر Agnet دستورات متفاوت هست یعنی ممکن هست که دستوارتی که برای Merlin کار میکنه برای Robby (که یکی دیگر از Agent ها هست) کار نکنه. شما اگه کاراکترتون رو خودتون درست میکنید خوب پس لیست دستوراتش رو دارید اما اگه اونو از جایی Download میکنید حتما لیست دستوراتش هم همراش هست. مثلا شما میتونید در مورد Merlin و یا Robby و یا چند Agent دیگه از تو همون آدرسی که در بالا دادم لیست دستوارتش رو بگیرید.

حالا در کد بالا میبینید که در ابتدا از دستور Show استفاده شده این دستور برای به نمایش در آوردن Agent هست و در تمامی آنها کار میکنه. بعد با استفاده از Play کارهای مورد نظرمون رو به Agent‌ میگیم. مثلاً من در ابتدا با استفاده از دستور Greet از Agent خواستم که سلام کنه و بعد هم با استفاده از Explain خواستم که شروع کنه به گفتن یک سری مطالب که با دستور Speak اونها رو که در متغییر SDemoIntro قرار داده ام به صورت یک بالون که بالای سرش باز میشه میگه. شما برای اینکه بگین مطالب رو با چه حالتهایی بخونه می تونید از دستواراتی که در جدول زیر آوردم استفاده کنید:

Addition | Resulting capability
\Chr="Whisper"\ | The Agent will whisper the following text.
\Pau=N\ | The Agent will pause for the designated number of milliseconds.
\Emp\ | The Agent will give special emphasis to the following phrase.
\Chr="Montone"\ | The Agent will emphasize nothing at all.
\Map=<spoken text> | The Agent will say one thing, and =<spoken text> "think" another.

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

SFuzzyWuzzy = 'Fuzzy wuzzy was a bear;\Pau=500\ ' +
   'fuzzy wuzzy had no hair;\Pau=500\  ' +
   'fuzzy wuzzy wasn't very \Emp\fuzzy, \Emp\was he?';

SWhisper = '\Chr="Whisper"\Now I will whisper: ' +
   'Whisper whisper whisper.';

SMonotone = '\Chr="Monotone"\Now I will speak in a ' +
   'monotone. Pat Paulsen for President.';

SMap = '\Map="I will now continue to speak in ' +
   'English, but you will see my words ' +
   'translated into German in the balloon above ' +
   'my head. How are you today? I am just ' +
   '\Emp\dandy!"="Jetzt werde ich zwar immer ' +
   'noch in Englisch reden, sie werden  ' +
   'aber meine Woerte im Balloon obenauf ins ' +
   'Deutsch uebersetzt sehen. Wie geht es  ' +
   'Ihnen heute? Mir geht es ganz gut!"\';

خوب دیگه همین بود تمام ماجرا حالا شما اگه می خواهین بیشتر در این مورد کار کنید من در مقالات بعدی یکی سری سایت و مطلب دیگه هم براتون میزارم البته به زبون اصلی خودشون حتماً خیلی مفید خواهد بود. ضمنا شما میتونید از Event ها هم در Agent استفاده کنید و مثلا برای رویداد OnClick روی Agent‌ یک چیزی تعریف کنید.

خوب در آخر از شما که تا اینجا آمدید متشکرم و یک سری نکات رو هم باید ذکر کنم:
  • این مطالب حاصل تجربه خودم و همچنین برگرفته از یک سری مقالاتی بوده که در این مورد مطالعه کردم.
  • در مورد استفاده از این کدهایی که در این مقاله آورده ام و همچنین در پایان این مقاله ضمیمه کرده ام هیچ گونه مسئولیتی بعهده من نخواهد بود که درست کار کنه یا بزنه کامپیوتر شما رو بسوزونه!!!!
  • استفاده از این مقاله به شرط ذکر نام و آدرس اصلی مقاله در سایتها و جاهای دیگر آزاد است.
  • اگه در این مورد نظری دارین یا حتماً برای من ایمیل کنید خوشحال خواهم شد بشنوم.

فایل‌های مرتبط

  • برنامه نمونه (3 کیلوبایت)

سایت‌های مرتبط

  • سایت رسمی Microsoft Agent
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫برنامه نویسی Direct3D در ویژوال بیسیک (1)

Softtool

برنامه نویسی Direct3D در ویژوال بیسیک

راهنمای استفاده از کتابخانه Direct3D در ویژوال بیسیک برای ساخت برنامه های مالتی مدیا و بازیهای سه بعدی.

توسط sheidaian | 20 دی 1381 | 5193 بار مشاهده Printable Version نسخه مخصوص چاپ
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. Fullscreen 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 = D3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, frmMain.hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, D3DWindow)
End Sub

درصورتی که کارت گرافیک شما امکانات رندر سخت‌افزاری تصاویر را ندارد از D3DDEVTYPE_REF بجای D3DDEVTYPE_HAL استفاده کنید. حال بایستی روتین Render را بنویسیم. البته در این درس تصویری برای رندر نداریم و تنها چگونگی نوشتن این روتین را بیان خواهم کرد:

ابتدا بایستی Device مربوط به رندر، قبل از کشیدن تصویر در آن پاک شود:

D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET, &H0, 1#, 0

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

D3DDevice.BeginScene
'All rendering calls go between these two lines
D3DDEvice.EndScene

در پایان بایستی صفحه را Update کنید:

D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal 0

در درس بعد مشخصات و تواناییهای گرافیکی یک سیستم را توسط DirectX بدست خواهیم آورد.

فایل‌های مرتبط

  • متن برنامه (2 کیلوبایت)

1 2 3 4 5 6 7 8 9 قسمت بعد »
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫برنامه نویسی Direct3D در ویژوال بیسیک (2)

برنامه نویسی Direct3D در ویژوال بیسیک

راهنمای استفاده از کتابخانه Direct3D در ویژوال بیسیک برای ساخت برنامه های مالتی مدیا و بازیهای سه بعدی.

توسط sheidaian | 20 دی 1381 | 5193 بار مشاهده Printable Version نسخه مخصوص چاپ
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 قرار دهیم:

      Name = ""

      For J = 0 To 511
         Name = Name & Chr$(AdapterInfo.Description(J))
      Next J

      Name = Replace(sTemp, Chr$(0), " ")
   Next i
End Sub

بنابراین در متغیر Name نام آداپتور قرار خواهد گرفت.

2. مشخص کردن نوع Rendering
فرض کنید شی D3DCAPS8 توانایی Rendering آداپتور را نشان دهد. در اینصورت روتین EnumerateDevices بصورت زیر خواهد بود:

Private Sub EnumerateDevices()
On Local Error Resume Next
Dim Caps As D3DCAPS8
Dim deviceindex As Long

deviceindex = 0 'For Example

D3D.GetDeviceCaps deviceindex, D3DDEVTYPE_HAL, Caps
    If Err.Number = D3DERR_NOTAVAILABLE Then
        MsgBox("Reference Rasterizer (REF)")

اگر آداپتور امکان رندر سخت افزاری نداشته باشد در اینصورت:

    Else
        MsgBox("Hardware Acceleration (HAL) + Reference Rasterizer (REF)")
    End If
End Sub

3. شمارش تعداد Mode نمایشی آداپتور
فرض کنید در صورت REF بودن امکان رندر، متغیر r=2 و در غیراینصورت r=1 باشد . همچنین شی D3DDISPLAYMODE اطلاعات مدهای نمایشی را در خود داشته باشد و متغیر nModes از نوع Long باشد. در اینصورت روتین EnumerateDispModes بصورت زیر خواهد بود:

Private Sub EnumerateDispModes(r As Long)
   Dim i As Integer
   Dim mode_tmp As D3DDISPLAYMODE
   Dim deviceindex As Long

   deviceindex=0 'For Example

   nModes = D3D.GetAdapterModeCount(deviceindex)

   For i = 0 to nModes - 1
      D3D.EnumAdapterModes(deviceindex, i, mode_tmp)

ابتدا Modeها را به دو گروه ۱۶ بیتی و ۳۲ بیتی تقسیم می کنیم:

If mode_tmp.Format = D3DFMT_R8G8B8 Or mode_tmp.Format = D3DFMT_X8R8G8B8 Or mode_tmp.Format = 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 & "]"
         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 & "]"
         End If
      End If
   Next i
End Sub

4. مشخص کردن توانایی های آداپتور گرافیکی
فرض کنید در صورت REF بودن امکان رندر، متغیر r=2 و در غیراینصورت r=1 باشد:

Private Sub EnumerateHardware(r as long)
   Dim caps As D3DCAPS8
   Dim deviceindex As Long

   deviceindex=0 'For Example
   D3D.Getdevicecaps deviceindex, r, caps

   If Caps.MaxActiveLights = -1 Then
      MsgBox "Maximum Active Lights: Unlimited"
   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"
   End If

   If Caps.TextureCaps And D3DPTEXTURECAPS_CUBEMAP Then
      MsgBox "Device Supports Cube Mapping"
   End If

   If Caps.TextureCaps And D3DPTEXTURECAPS_VOLUMEMAP Then
      MsgBox "Device Supports Volume Mapping"
   End If

   If Caps.DevCaps And D3DDEVCAPS_PUREDEVICE Then
      MsgBox "Device supports the Pure Device Option"
   End If

   If Caps.DevCaps And D3DDEVCAPS_HWTRANSFORMANDLIGHT Then
      MsgBox "Device supports hardware transform and lighting"
   End If

   If Caps.DevCaps And D3DDEVCAPS_HWRASTERIZATION Then
      MsgBox "Device can use Hardware Rasterization"
   End If

   If Caps.Caps2 And D3DCAPS2_CANCALIBRATEGAMMA Then
      MsgBox "Device can Calibrate Gamma"
   End If

   If Caps.Caps2 And D3DCAPS2_CANRENDERWINDOWED Then
      MsgBox "Device can Render in Windowed Mode"
   End If

   If Caps.Caps2 And D3DCAPS2_FULLSCREENGAMMA Then
      MsgBox "Device can calibrate gamma in fullscreen mode"
   End If

   If Caps.RasterCaps And D3DPRASTERCAPS_FOGRANGE Then
      MsgBox "Device supports range based fog calculations"
   End If

   If Caps.RasterCaps And D3DPRASTERCAPS_ANISOTROPY Then
      MsgBox "Device supports Anisotropic Filtering"
   End If

   If Caps.RasterCaps And D3DPRASTERCAPS_ZBUFFERLESSHSR Then
      MsgBox "Device does not require a Z-Buffer/Depth Buffer"
   End If
End Sub

فایل‌های مرتبط

  • متن برنامه (3 کیلوبایت)

« قسمت قبل 1 2 3 4 5 6 7 8 9 قسمت بعد »
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫برنامه نویسی Direct3D در ویژوال بیسیک (3)

برنامه نویسی Direct3D در ویژوال بیسیک

راهنمای استفاده از کتابخانه Direct3D در ویژوال بیسیک برای ساخت برنامه های مالتی مدیا و بازیهای سه بعدی.

توسط sheidaian | 20 دی 1381 | 5193 بار مشاهده Printable Version نسخه مخصوص چاپ
شروع کار برای رسم اشیا دوبعدی
ابتدا ثابت 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

حال به سراغ تابع Initialise که در درس 1 با آن آشنا شدید می رویم و دستورات زیر را به آن اضافه می کنیم:

ابتدا سیستم سایه زنی Vertex را طوری تنظیم می کنیم که از FVF استفاده کند:

D3DDevice.SetVertexShader FVF

حال سیستم Lighting را برای Vertex های دو بعدی غیر فعال می کنیم زیرا نیازی به آن نداریم:

D3DDevice.SetRenderState D3DRS_LIGHTING, False

حال بایستی تابع InitializeGeometry را اجرا کنیم. این تابع را در ادامه توضیح خواهم داد. اگر نتیجه این تابع True باشد دراینصورت Initialise به درستی انجام شده است:

If InitialiseGeometry() = True Then
   Initialise = True
   Exit Function
End If

تابع InitialiseGeometry در این درس، تابعی ساده است که تنها آرایه Vertex ها را مقدار دهی می کند. برای رسم یک مربع نیاز به مقداردهی ۴ Vertex در جهت عقربه های ساعت داریم. ( این مربع شامل ۲ مثلث است)

Private Function InitialiseGeometry() As Boolean

   On Error GoTo BailOut:

   TriStrip(0) = CreateTLVertex(100, 100, 0, 1, RGB(255, 255, 255), 0, 0, 0)
   TriStrip(1) = CreateTLVertex(300, 100, 0, 1, RGB(255, 0, 0), 0, 0, 0)
   TriStrip(2) = CreateTLVertex(100, 300, 0, 1, RGB(0, 255, 0), 0, 0, 0)
   TriStrip(3) = CreateTLVertex(300, 300, 0, 1, RGB(0, 0, 255), 0, 0, 0)

   InitialiseGeometry = True
   Exit Function

   BailOut:
   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
   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

نکته: شما می توانید مقادیر اعشاری Floating Point را برای مختصاتهای x و y و z بکار ببرید، اما Direct3D مختصاتها را با گردکردن آنها تخمین می زند و بنابراین ممکن است باعث ایجاد نتایج ناخواسته شود.

حال بایستی تابع 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))
   D3DDevice.EndScene

   D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal 0

End Sub

ساختار اصلی برای اجرای توابع فوق بصورت زیر است:

Initialize

Do While YourEvent = True
   Render
   DoEvents
Loop

فایل‌های مرتبط

  • متن برنامه (3 کیلوبایت)

« قسمت قبل 1 2 3 4 5 6 7 8 9 قسمت بعد »
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫برنامه نویسی Direct3D در ویژوال بیسیک (4)

برنامه نویسی Direct3D در ویژوال بیسیک

راهنمای استفاده از کتابخانه Direct3D در ویژوال بیسیک برای ساخت برنامه های مالتی مدیا و بازیهای سه بعدی.

توسط sheidaian | 20 دی 1381 | 5193 بار مشاهده Printable Version نسخه مخصوص چاپ
Vertex:
یک نقطه در فضای سه بعدی که برای دادن موقعیت، Scale و زاویه یک Face استفاده می شود.

Face:
یک چند ضلعی که توسط مجموعه‌ای از نقاط به نام Vertex ساخته می شود.

Mesh:
مش، مجموعه‌ای از Faceها است که یک شی سه بعدی را روی صفحه تشکیل می دهند.

Direct3D از ساختاری بنام D3DVERTEX برای نمایش یک Vertex استفاده می کند. برای ساخت Face نیز از آرایه‌ای از Vertexها استفاده می شود. آرایه همیشه بایستی قابل تقسیم به سه باشد زیرا اشکال از Faceهای مثلثی ساخته می شوند. هنگامیکه این مثلثها کنار هم گذاشته شوند، شی سه بعدی را می سازند. Direct3D از بافری با نام Index Buffer استفاده می کند که به Direct3D می گوید با چه ترتیبی Vertexها را رسم نماید. Indexها بایستی همیشه در جهت عقربه‌های ساعت مشخص شوند.

« قسمت قبل 1 2 3 4 5 6 7 8 9 قسمت بعد »
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫برنامه نویسی Direct3D در ویژوال بیسیک (5)

برنامه نویسی Direct3D در ویژوال بیسیک

راهنمای استفاده از کتابخانه Direct3D در ویژوال بیسیک برای ساخت برنامه های مالتی مدیا و بازیهای سه بعدی.

توسط sheidaian | 20 دی 1381 | 5193 بار مشاهده Printable Version نسخه مخصوص چاپ
در این درس می خواهیم یک مربع که دارای بافت می باشد، رسم کنیم. برای اینکار از کتابخانه کمکی 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)
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))
  .
  .
  .
End Function

فایل‌های مرتبط

  • متن برنامه (6 کیلوبایت)

« قسمت قبل 1 2 3 4 5 6 7 8 9 قسمت بعد »
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫برنامه نویسی Direct3D در ویژوال بیسیک (6)

Softtool

برنامه نویسی Direct3D در ویژوال بیسیک

راهنمای استفاده از کتابخانه Direct3D در ویژوال بیسیک برای ساخت برنامه های مالتی مدیا و بازیهای سه بعدی.

توسط sheidaian | 20 دی 1381 | 5193 بار مشاهده Printable Version نسخه مخصوص چاپ
در این درس با استفاده از 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)

برای توصیف مکعب در این درس از روشی غیرکارامد استفاده شده است. به این ترتیب که از ۳۶ عدد 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

حال بایستی متد 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

حال به بخش تعریف ماتریسها می رسیم:

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)
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 استفاده شده است. قسمتهای سوم و چهارم مشخص می کنند فقط مثلثهایی کشیده شوند که با ابعاد بزرگتر از یکدهم دوربین و کوچکتر از 500 برابر دوربین هستند. حال دستور اختصاص به Device را خواهیم داشت:

D3DDevice.SetTransform D3DTS_PROJECTION, matProj

بعد از تعریف ماتریسها بایستی تابع InitializeGeometry را صدا کنیم. در این تابع از یک ثابت با نام DFC استفاده شده است. اگر DFC=1 باشد مکعب بطور کامل کشیده می شود و اگر بزرگتر از یک باشد، Faceهای آن جدا از هم دیده خواهند شد. همچنین توجه کنید که از بافرهای Vertex برای ذخیره داده Vertexها استفاده شده است. ساختار این تابع بصورت زیر خواهد بود:

1 - پر کردن ساختارهای Vertex:

'Front
Cube(0) = CreateLitVertex(-1, 1, DFC, color, 0, 0, 0)
Cube(1) = CreateLitVertex(1, 1, DFC, color, 0, 0, 0)
Cube(2) = CreateLitVertex(-1, -1, DFCcolor, 0, 0, 0)
Cube(4) = CreateLitVertex(-1, -1, DFC, color, 0, 0, 0)
Cube(5) = CreateLitVertex(1, -1, DFC, color, 0, 0, 0)

'Back
Cube(6) = CreateLitVertex(-1, 1, -DFC, color, 0, 0, 0)
Cube(7) = CreateLitVertex(1, 1, -DFC, color, 0, 0, 0)
Cube(8) = CreateLitVertex(-1, -1, -DFC, color, 0, 0, 0)
Cube(9) = CreateLitVertex(1, 1, -DFC, color, 0, 0, 0)
Cube(10) = CreateLitVertex(-1, -1, -DFC, color, 0, 0, 0)
Cube(11) = CreateLitVertex(1, -1, -DFC, color, 0, 0, 0)

'Right
Cube(12) = CreateLitVertex(-DFC, 1, -1, color, 0, 0, 0)
Cube(13) = CreateLitVertex(-DFC, 1, 1, color, 0, 0, 0)
Cube(14) = CreateLitVertex(-DFC, -1, -1, color, 0, 0, 0)
Cube(15) = CreateLitVertex(-DFC, 1, 1, color, 0, 0, 0)
Cube(16) = CreateLitVertex(-DFC, -1, -1, color, 0, 0, 0)
Cube(17) = CreateLitVertex(-DFC, -1, 1, color, 0, 0, 0)

'Left
Cube(18) = CreateLitVertex(DFC, 1, -1, color, 0, 0, 0)
Cube(20) = CreateLitVertex(DFC, -1, -1, color, 0, 0, 0)
Cube(21) = CreateLitVertex(DFC, 1, 1, color, 0, 0, 0)
Cube(22) = CreateLitVertex(DFC, -1, -1, color, 0, 0, 0)
Cube(23) = CreateLitVertex(DFC, -1, 1, color, 0, 0, 0)

'Top
Cube(24) = CreateLitVertex(-1, DFC, 1, color, 0, 0, 0)
Cube(25) = CreateLitVertex(1, DFC, 1, color, 0, 0, 0)
Cube(26) = CreateLitVertex(-1, DFC, -1, color, 0, 0, 0)
Cube(27) = CreateLitVertex(1, DFC, 1, cocolor, 0, 0, 0)
Cube(29) = CreateLitVertex(1, DFC, -1, color, 0, 0, 0)

'Bottom
Cube(30) = CreateLitVertex(-1, -DFC, 1, color, 0, 0, 0)
Cube(31) = CreateLitVertex(1, -DFC, 1, color, 0, 0, 0)
Cube(32) = CreateLitVertex(-1, -DFC, -1, color, 0, 0, 0)
Cube(33) = CreateLitVertex(1, -DFC, 1, color, 0, 0, 0)
Cube(34) = CreateLitVertex(-1, -DFC, -1, color, 0, 0, 0)
Cube(35) = CreateLitVertex(1, -DFC, -1, color, 0, 0, 0)

2 - ساخت یک بافر Vertex خالی با سایز مورد نظر:

Set VBuffer = D3DDevice.CreateVertexBuffer(Len(Cube(0)) * 36, 0, Lit_FVF, D3DPOOL_DEFAULT)

3 - پر کردن بافر مربوطه با داده ها:

D3DVertexBuffer8SetData VBuffer, 0, Len(Cube(0)) * 36, 0, Cube(0)

حال به سراغ روتین Render می رویم:

Public Sub Render()
  D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, 0, 1#, 0
  D3DDevice.BeginScene
  D3DDevice.SetStreamSource 0, VBuffer, Len(Cube(0))
  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

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)
  D3DXMatrixMultiply matWorld, matWorld, matTemp
  D3DXMatrixIdentity matTemp
  D3DXMatrixRotationZ matTemp, RotateAngle * (pi / 180)
  D3DXMatrixMultiply matWorld, matWorld, matTemp
  D3DDevice.SetTransform D3DTS_WORLD, matWorld

  Render
  DoEvents
Loop

فایل‌های مرتبط

  • متن برنامه (3 کیلوبایت)

« قسمت قبل 1 2 3 4 5 6 7 8 9 قسمت بعد »
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫برنامه نویسی Direct3D در ویژوال بیسیک (7)

برنامه نویسی Direct3D در ویژوال بیسیک

راهنمای استفاده از کتابخانه Direct3D در ویژوال بیسیک برای ساخت برنامه های مالتی مدیا و بازیهای سه بعدی.

توسط sheidaian | 20 دی 1381 | 5193 بار مشاهده Printable Version نسخه مخصوص چاپ
در این درس می خواهیم به مکعب درس قبل بافت اختصاص داده و نیز آنرا با یک منبع نور، نورپردازی کنیم. ابتدا تایپ 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

بعد از ساخت شی D3DDevice در تابع Initialize، پارامترهای آنرا بصورت زیر تنظیم می کنیم:

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)

حال بایستی تابع InitializeGeometry صدا زده شود و سپس تابع SetupLights فراخوانی شوند. ابتدا به توضیح تابع InitializeGeometry می پردازیم:

ابتدا یک بردار نرمال تعریف می کنیم:

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)

سپس این بافر Vertex ساخته شده را با داده های cube2 پر می کنیم:

D3DVertexBuffer8SetData VBuffer, 0, Len(Cube2(0)) * 36, 0, Cube2(0)

در دستورات فوق تابعی با نام 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
  D3DDevice.BeginScene
  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

  'روشن کردن
  D3DDevice.LightEnable 0, 1

  Render
  DoEvents
Loop

در متد D3DDevice.LightEnable پارامتر اول شماره منبع نور و پارامتر دوم فعال بودن آنرا نشان می دهد.

« قسمت قبل 1 2 3 4 5 6 7 8 9 قسمت بعد »
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫برنامه نویسی Direct3D در ویژوال بیسیک (8)

برنامه نویسی Direct3D در ویژوال بیسیک

راهنمای استفاده از کتابخانه Direct3D در ویژوال بیسیک برای ساخت برنامه های مالتی مدیا و بازیهای سه بعدی.

توسط sheidaian | 20 دی 1381 | 5193 بار مشاهده Printable Version نسخه مخصوص چاپ
در این درس روش ترسیم متن با دو نوع فونت را نشان خواهم داد. برای رسم یک متن با فونت تعریف شده در سیستم از شی 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"
fnt.Size = 18
fnt.Bold = True
Set MainFontDesc = fnt
Set MainFont = D3DX.CreateFont(D3DDevice, MainFontDesc.hFont)

و در مورد فونت 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)

روتین Render بصورت زیر خواهد بود:

Public Sub Render()
  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)
  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)

ابتدا بایستی مختصات Texture را انتخاب کنیم. برای اینکار بایستی هر Entry را در Texture جدا کنیم:

    Char = Mid$(strText, I, 1)

    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))

و حال رندر Vertexها:

    D3DDevice.SetTexture 0, fntTex
    D3DDevice.DrawPrimitiveUP D3DPT_TRIANGLESTRIP, 2, vertChar(0), Len(vertChar(0))
  Next I
End Sub

« قسمت قبل 1 2 3 4 5 6 7 8 9 قسمت بعد »
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫برنامه نویسی Direct3D در ویژوال بیسیک (9)

Softtool

برنامه نویسی Direct3D در ویژوال بیسیک

راهنمای استفاده از کتابخانه Direct3D در ویژوال بیسیک برای ساخت برنامه های مالتی مدیا و بازیهای سه بعدی.

توسط sheidaian | 20 دی 1381 | 5193 بار مشاهده Printable Version نسخه مخصوص چاپ
شیئ 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)

نورپردازی از نوع جهت‌دار با رنگ 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)

که ۲ شعاع کره و ۱۰۰۰ تعداد 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

« قسمت قبل 1 2 3 4 5 6 7 8 9
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫برنامه نویسی شیئ گرا در VB.NET (1)

برنامه نویسی شیئ گرا در VB.NET

این مقاله به شما کمک می‌کند تا با مفاهیم پایه‌ای برنامه نویسی شیئ گرا مانند کلاسها، اشیاء، اینترفیس‌ها، چند ریختی و وراثت و همچنین چگونگی استفاده از آشنا شوید.

توسط kamyar_rasta | 20 خرداد 1384 | 1765 بار مشاهده Printable Version نسخه مخصوص چاپ

مقدمه‌ای بر برنامه نویسی شیءگرا

برنامه نویسی در محیط .NET بر پایه اشیاء انجام می‌گیرد. اشیا طرحهایی برنامه‌پذیرند که می‌توانند نمونهایی از بسته‌های از دادهای مرتبط و دستورات باشند. اشیاء طرحهای کامل و خاصی برای دیگر اعضای محیط برنامه هستند، بدون این که جزییات کارهای درونی خود شیئ مطرح شود. اشیاء از یک قالب به نام کلاس ساخته می‌شوند. کلاسهای کتابخانه‌ای پایه‌ای .NET یک سری کلاسهایی برای درست کردن اشیاء در برنامه‌هایتان آماده کرده‌اند. همچنین شما می‌توانید کلاسهای اختصاصی خودتان را نیز ساخته و استفاده کنید. در این مقاله شما با مقدمات برنامه نویسی شیئ گرا آشنا می‌شوید.

اشیاء، اعضا و تجرد (Abstraction)

یک شیئ (Object) یک طرح برنامه‌پذیر است که چیزهایی را نشان می‌دهد. در دنیای واقعی، ماشین، دوچرخه، کامپیوتر و... شیئ هستند. هر کدام از این اشیاء یک سری اعمال و خصوصیات دارند. در برنامه شما، یک شیئ شاید یک فرم یا یک کنترل مانند یک دکمه (Button) یا یک Database Connection یا هر چیز دیگری باشد. هر شیئ یک واحد عملیاتی کامل است، و شامل همه دادهای مورد نیازش و دارای همه اعمالی که برای آن ساخته شده است می‌باشد.

کلاس‌ها (Classes)

کلاسها قالب‌هایی برای اشیاء هستند. کلاسها را می‌توان، "طرحهای اولیه" برای اشیاء فرض کرد. آنها تمام عضوهای یک شیئ را تعیین، و رفتارهای آن را نیز تعریف می‌کنند. وقتی که یک کلاس مقداردهی شد، یک نمونه درون حافظه‌ای از آن کلاس ساخته می‌شود. این نمونه شیئ نامیده می‌شود. برای نمونه سازی از کلاس از کلمه کلیدی New استفاده می‌شود.

' Declares a variable of the Widget type
Dim myWidget As Widget

' Instantiates a new Widget object and assigns it to the myWidget variable
myWidget = New Widget()

وقتی یک نمونه از یک کلاس ساخته می‌شود، یک کپی از نمونه داده بوسیله آن کلاسی که در حافظه ساخته شده تعریف می‌شود و به مرجع متغییر داده می‌شود. هر نمونه از کلاس مستقل از دیگر نمونه هاست و می‌تواند یک طرح جداگانه برنامه پذیر باشد. درهر لحظه، محدودیتی برای تعداد کپی های یک کلاس (که قبلا تعریف شده) وجود ندارد. برای مقایسه، در جهان واقعی، اگر ماشین یک شیئ باشد، کلاس یک طرح برای ماشین است. یک طرح می‌تواند برای هر تعداد ماشین مورد استفاده قرار گیرد و تغییرات بر روی یک ماشین، تاثیری بر دیگر ماشین‌ها نمی‌گذارد.

اشیاء و اعضاء (Members)

اشیاء ترکیبی از عضوها هستند. اعضا، تشکیل شده از خصوصیات (Properties)، فیلدها، متدها و رویدادها (Events) و هر چیزی که اطلاعات و اعمالی داشته باشد. فیلدها و خصوصیات، اعضای داده‌ای هر شیئ هستند. متدها اعمالی هستند که شیئ می‌تواند انجام دهد و رویدادها اطلاعاتی هستند که زمانیکه اتفاقی در برنامه می‌افتد یک شیئ به اشیاء دیگر می‌فرستد یا از آنها دریافت می‌کند.

در مثال واقعی‌مان، شیئ ماشین، فیلدها و خصوصیاتی مانند "رنگ"، "مدل"، "سال تولید" دارد. این اطلاعات وضعیت شیئ ماشین را توصیف می‌کنند. شیئ ماشین می‌تواند متدهایی مانند "دور زدن" و "تعویض دنده" داشته باشد. متدها رفتاری که شیئ می‌تواند اجرا کند را نشان می‌دهند. ماشین شاید رویداد EngineOverheating از طرف شیئ "موتورش" را داشته باشد، یا وقتی با شیئ "درخت" تعامل می‌کند، شاید رویداد "تصادف" برای آن اتفاق بیفتد.

کپسوله سازی (Encapsulation)

کپسوله سازی روشی است که یک شیئ را مستقل از اینترفیسش پیاده سازی کنیم. یک برنامه با یک شیئ بواسطه اینترفیسش تعامل می‌کند، که شامل خصوصیات عمومی و متدهایش است. تا زمانی که این اینترفیس ثابت باقی می‌ماند، برنامه می‌تواند به تعامل با کامپوننت ادامه دهد؛ حتی اگر پیاده سازی اینترفیس بین دو نسخه کاملا" بازنویسی شده باشد.

اشیاء فقط از طریق متدها و خصوصیات عمومیشان با دیگر شیئ‌ها تعامل می‌کنند. داده‌های داخلی یک شیئ، نباید در اینترفیس قرار بگیرد. بنابراین فیلدها به‌ندرت Public تعریف می‌شوند.

به مثال ماشینمان برگردیم: اگر شیئ ماشین با شیئ راننده تعامل کند، اینترفیس ماشین شاید شامل متدهای "حرکت به جلو"، "حرکت به عقب" و "توقف" باشد. این همه اطلاعاتی است که راننده برای تعامل با ماشین نیاز دارد. ماشین شاید شامل شیئ "موتور" نیز باشد، اما راننده نیازی به شناخت شیئ موتور ندارد. همه اطلاعاتی که راننده درباره این متدها دارد این است که می‌توانند فراخوانی شوند و مقادیر ویژه‌ای نیز را برمی‌گردانند. بنابراین اگر شیئ موتور تغییری کند، تا زمانیکه اینترفیس به درستی به کار خود ادامه می‌دهد این امر تفاوتی برای راننده ایجاد نمی کند.

چند شکلی (Polymorphism)

چند شکلی توانایی کلاسهای متفاوت، در پیاده سازی‌های مختلف از اینترفیس‌های عمومی مشابه است. به عبارت دیگر، چندشکلی به متدها و خصوصیات یک شیئ اجازه می‌دهد، بدون توجه به چگونگی پیاده سازی اعضای آنها، فراخوانی شوند. برای مثال شیئ Driver می‌تواند بوسیله اینترفیس عمومی ICar با شیئ Car تعامل کند. اگر شیئ دیگری مانند شیئ Truck یا شیئ SportCar اینترفیس عمومی مشابهی را داشته باشند، شیئ Driver می‌تواند با آنها بدون توجه به پیاده سازی خاص آن اینترفیس تعامل کند. در اینجا دو راه اصلی برای تامین چندشکلی وجود دارد:

  • چندشکلی اینترفیسی (Interface Polymorphism)
  • چندشکلی وراثتی (Inheritance Polymorphism)

چندشکلی اینترفیسی (Interface Polymorphism)

اینترفیس یک قرارداد برای رفتار است. در واقع اینترفیس، اعضای یک کلاس را تعیین می‌کند، اما توضیحاتی درباره پیاده سازی جزییات آن نمی‌دهد. یک شیئ می‌تواند اینترفیس‌های زیاد و متفاوتی را پیاده سازی کند و کلاسهای متفاوت زیادی می‌توانند یک اینترفیس مشابه را پیاده سازی کنند. همه اشیایی که اینترفیس مشابهی را پیاده سازی می‌کنند می‌توانند با دیگر اشیاء درون اینترفیس تعامل کنند. به عنوان مثال شیئ Car مثال قبل شاید اینترفیس IDrivable را پیاده سازی کند (به عنوان قرار داد، اینترفیس‌ها با I شروع می‌شوند)، که متدهای GoForward, GoBackward و Stop را تعیین می‌کند. کلاس‌های دیگر مانند Truck ،Forklift یا Boat می‌توانند این اینترفیس را پیاده سازی کنند و بنابراین می‌توانند با شیئ Driver تعامل داشته باشند. شیئ Driver از پیاده سازی انیترفیسی که با آن تعامل دارد بی اطلاع است.

چندشکلی وراثتی (Inheritance Polymorphism)

وراثت به شما امکان می‌دهد که اعمال یک کلاس از پیش تعریف شده را در یک کلاس جدید با هم ترکیب کنید و اعضای متفاوت مورد نیاز را در آن پیاده سازی کنید. کلاسی که از کلاس دیگری ارث می برد "مشتق" آن کلاس، یا "وارث" آن کلاس نامیده می‌شود. یک کلاس می‌تواند مستقیما" فقط از یک کلاس ارث ببرد، که آن کلاس که از آن ارث می برد را کلاس پایه (Base Class) می‌نامند. کلاس جدید اعضای مشابهی با کلاس پایه دارد، و اعضای اضافی که مورد نیاز باشند می‌توانند افزوده شوند. به علاوه، در کلاس جدید بوسیله overriding پیاده سازی کلاس پایه، اعضای پایه می‌توانند تغییر کنند. کلاسهای وارث، همه ویژگی‌های کلاس پایه را نگه می‌دارند و می‌توانند با دیگر اشیاءیی که نمونه‌هایی از کلاس پایه هستند تعامل کنند. به عنوان مثال، اگر کلاس Car یک کلاس پایه باشد، SportsCar می‌تواند یک کلاس مشتق شده از آن باشد. کلاس SportsCar نیز می‌تواند کلاس پایه‌ای برای کلاس مشتق شده دیگری مثل کلاس ConvertibleSportsCar باشد. هر کلاس مشتق شده جدید، ممکن است اعضای جدید را پیاده سازی کند، اما اعمالی که در کلاس اولیه Car تعریف شده‌است همچنان باقی می‌مانند.

Overloading اعضاء

Overloading به شما امکان می‌دهد که چندین عضو با نام مشابه درست کنید. هر عضوی که همنام با عضو دیگری است، باید امضای متفاوتی داشته باشد. Overloading بیشتر در بین متدها متداول است.

شاید شما بخواهید متدی درست کنید که بتواند مجموعه‌های متفاوتی از پارامترها را بپذیرد:

Public Sub Display(ByVal DisplayValue As Integer)
' Implementation Omitted
End Sub

این متد کاملا" پذیرفتنی است. اما فرض کنیم که می‌خواهید به کلاینت اجازه دهید اگر نیاز بود پارامتر Duration را انتخاب کند. یا اینکه شاید بخواهید متد بتواند مقادیر Integer یا String را به عنوان پارامتر DisplayValue بپذیرد. گرچه در VB.NET اجازه دارید پارامترهای اختیاری داشته باشید اما بهترین راه Overloading است. Overloadها متدهای چندگانه هستند. متدهای Overload شده باید امضای متفاوتی داشته باشند. اما نیاز ندارند مقدار بازگشتی و نوع و یا سطح دسترسی مشابهی داشته باشد. وقتی یک متد Overload شده صدا زده می‌شود، CLR نوع آرگومانهای تحویل داده شده در فراخوانی متد را بررسی می‌کند. سپس لیست آرگومان‌ها را با فراخوانی‌ها و امضاهای Overloadهای موجود تطابق می‌دهد. اگر هیچ Overloadای با نوع آرگومان‌ها تناسب نداشته باشد، یک خطا اعلام می‌شود.

ساختن متدهای Overload

شما می‌توانید یک متد Overload شده را از راهی شبیه آنچه دیگر متدها را می‌سازید، درست کنید: بوسیله توصیف متد با یک نام، یک سطح دسترسی، یک نوع بازگشتی، و یک لیست آرگومان. یک متد Overload شده باید نامی ‌شبیه متدی موجود اما با امضایی متفاوتی با آن داشته باشد. سطح دسترسی و نوع بازگشتی می‌تواند مشابه و یا متفاوت باشد. مثال زیر یک متد Overload شده را نشان می‌دهد.

' This example demonstrates an overloaded method.
Public Sub DisplayMessage(ByVal i As Integer)
MessageBox.Show(i.ToString())
End Sub

' This method has the same name as the previous method, but is
' distinguishable by signature
Public Sub DisplayMessage(ByVal s As String)
MessageBox.Show(s)
End Sub

وقتی یک متد با نام DisplayMessage فراخوانی می‌شود، CLR نوع آرگومان‌های تحویل داده شده را مشخص می‌کند. اگر یک String باشد، متدی که String می‌گیرد، صدا زده می‌شود و اگر یک Integer باشد، متدی که Integer می‌گیرد فراخوانی می‌شود.

اینترفیس‌ها

اینترفیس یک قرارداد است. هر شیئ که پیاده سازی می‌شود، برای تامین پیاده سازی اعضای تعیین شده در آن اینترفیس یک ضمانت نامه اینترفیس می‌گیرد. اگر یک شیئ نیاز به تعامل با اینترفیسی داشته باشد، می‌تواند با هر شیئ که آن اینترفیس را پیاده سازی می‌کند تعامل داشته باشد. یک اینترفیس فقط اعضایی را تعریف می‌کند که بوسیله شیئ که بعدا پیاده سازی خواهد شد ساخته می‌شود. تعریف اینترفیس هیچ اطلاعاتی درباره پیاده سازی اعضاء جز پارامترهایی که می‌گیرند و نوع مقادیری که آنها برخواهند گرداند، نمی‌دهد و پیاده سازی اینترفیس‌ها کاملا به پیاده سازی کلاس واگذار می‌شود.

بنابراین این امکان دارد که در اشیاء مختلف پیاده سازی‌های مختلفی از اعضای مشابه داشته باشیم. به عنوان مثال، اینترفیسی به نام IShape که یک متد CalculateArea تعریف می‌کند. کلاس Circle این اینترفیس را برای محاسبه مساحت خود، به طریق متفاوتی با کلاس Square پیاده سازی می‌کند. هر چند که یک شیئ که نیاز به تعامل با IShapeدارد می‌تواند متد CalculateArea را فراخوانی کند و هر دوی Circle یا Square نتایج درستی می‌دهند.

تعریف اینترفیس‌ها

اینترفیس‌ها با کلمه کلیدی Interface تعریف می‌شوند.

Public Interface IDrivable
End Interface

این اعلان اینترفیس IDrivable را تعریف می‌کند اما هیچ عضوی برای آن تعریف نمی‌کند. متدهای یک عضو باید با امضای متد تعریف شود، اما بدون بدون تعریف سطح دسترسی مثل Public و Private. سطح دسترسی یک اینترفیسس سطح دسترسی اعضای آن اینترفیس را نیز تعیین می‌کند. پس اگر یک اینترفیس Public داشته باشید، همه اعضایش هم باید Public باشند. مثال زیر نشان می‌دهد که چطور متدها را به اینترفیس اضافه کنید:

Public Interface IDrivable
Sub GoForward(ByVal Speed As Integer)
Sub Halt()
Function DistanceTraveled() As Integer
End Interface

همچنین شما می‌توانید خصوصیات را نیز به اینترفیس‌ها اضافه کنید. خصوصیت باید ReadOnly یا WriteOnly تعریف شوند. مثال زیر را ببینید:

Public Interface IDrivable
' This defines a read-only property.
ReadOnly Property FuelLevel() As Integer
End Interface

اگرچه شما می‌توانید خصوصیات را در اینترفیس‌ها تعریف کنید، اما نمی‌توانید فیلدها را در آنها تعریف کنید. این شرط تضمین می‌کند که کلاسهایی که از طریق اینترفیس‌ها تعامل دارند به دادهای درونی یک شیئ دسترسی نداشته باشند.

اینترفیس‌ها همچنین می‌توانند رویدادها را تعریف کنند:

Public Interface IDrivable
Event OutOfFuel(ByVal sender As Object, e As System.EventArgs)
End Interface

چند شکلی با اینترفیس‌ها (Polymorphism with Interfaces)

هر شیئ که یک اینترفیس خاص را پیاده سازی می‌کند، می‌تواند با هر یک از اشیاء دیگری که به آن اینترفیس نیاز دارند، تعامل کند.

Public Sub GoSomewhere(ByVal v As IDrivable)
' Implementation omitted
End Sub

این متد نیاز به یک پیاده سازی از اینترفیس IDrivable دارد. هر شیئ که این اینترفیس را پیاده سازی می‌کند می‌تواند به عنوان یک پارامتر به این متد پاس داده شود. وقتی یک شیئ توسط اینترفیسش تعامل می‌کند، فقط اعضاء آن اینترفیس در دسترس هستند.

شما همچنین می‌توانید به طور ضمنی اشیایی که اینترفیس خاصی را پیاده سازی می‍کنند درست کنید. (توجه کنید در این مثال Truck باید IDrivable را پیاده سازی کند)

Dim myTruck As New Truck()
Dim myVehicle As IDrivable

' Casts myTruck to the IDrivable interface
myVehicle = CType(myTruck, IDrivable)

پیاده سازی اینترفیس‌ها

در VB.Net اینترفیس‌ها بوسیله کلاس‌ها و ساختارها (Structures) با کلمه کلیدی Implements پیاده سازی می‌شوند:

Public Class Truck
Implements IDrivable
' Additional implementation code omitted
End Class

کلاس‌ها می‌توانند چندین اینترفیس را پیاده سازی کنند. اگر بخواهید کلاسی تعریف کنید که چندین اینترفیس را پیاده سازی کند، می‌توانید نام اینترفیس‌ها را با کاما از هم جدا کنید. مثال زیر را ببینید:

Public Class Truck
Implements IDrivable, IFuelBurning, ICargoCarrying
' Additional implementation code omitted
End Class

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

پیاده سازی اعضای اینترفیس‌ها

در VB.NET، یک عضو کلاس با کلمه کلیدی Implements یک عضو اینترفیس را پیاده سازی می‌کند. عضو کلاسی که عضو اینترفیس را پیاده سازی می‌کند باید امضایی مشابه آن چه در اینترفیس تعریف شده، داشته باشد. اما نیاز نیست که سطح دسترسی مشابهی با آن داشته باشد. مثال بعد نشان می‌دهد چگونه یک عضو اینترفیس تعریف می‌شود.

Public Interface IDrivable
Sub GoForward(ByVal Speed As Integer)
End Interface

Public Class Truck
Implements IDrivable

Public Sub GoForward(ByVal Speed As Integer)
Implements IDrivable.GoForward
' Implementation omitted
End Sub
End Class

عضو کلاسی که یک عضو اینترفیس را پیاده سازی می‌کند مجبور نیست که نامی مشابه نام عضو اینترفیس داشته باشد. مثال بعد یک پیاده سازی کاملا معتبر متد GoForward از اینترفیس IDrivable را نشان می‌دهد:

Public Sub Move(ByVal Speed As Integer)
Implements IDrivable.GoForward
' Implementation omitted
End Sub

هر فراخوانی متد GoForward از اینترفیس IDrivable در مثال قبل، متد Move را از کلاس Truck اجرا می‌کند. همچنین شما می‌توانید سطح دسترسی متفاوتی را برای متد کلاسی که متد اینترفیس را پیاده سازی می‌کند در نظر بگیرید. به عنوان مثال می‌توانید متد Public اینترفیس را متد Private کلاس پیاده سازی کنید. اگر این روش را انجام دهید، وقتی که دسترسی درون اینترفیس است متد Public می‌شود، اما وقتی دسترسی به عنوان عضوی از کلاس است Private می‌ماند.

1 2 قسمت بعد »
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫برنامه نویسی شیئ گرا در VB.NET (1)

برنامه نویسی شیئ گرا در VB.NET

این مقاله به شما کمک می‌کند تا با مفاهیم پایه‌ای برنامه نویسی شیئ گرا مانند کلاسها، اشیاء، اینترفیس‌ها، چند ریختی و وراثت و همچنین چگونگی استفاده از آشنا شوید.

توسط kamyar_rasta | 20 خرداد 1384 | 1768 بار مشاهده Printable Version نسخه مخصوص چاپ

مقدمه‌ای بر برنامه نویسی شیءگرا

برنامه نویسی در محیط .NET بر پایه اشیاء انجام می‌گیرد. اشیا طرحهایی برنامه‌پذیرند که می‌توانند نمونهایی از بسته‌های از دادهای مرتبط و دستورات باشند. اشیاء طرحهای کامل و خاصی برای دیگر اعضای محیط برنامه هستند، بدون این که جزییات کارهای درونی خود شیئ مطرح شود. اشیاء از یک قالب به نام کلاس ساخته می‌شوند. کلاسهای کتابخانه‌ای پایه‌ای .NET یک سری کلاسهایی برای درست کردن اشیاء در برنامه‌هایتان آماده کرده‌اند. همچنین شما می‌توانید کلاسهای اختصاصی خودتان را نیز ساخته و استفاده کنید. در این مقاله شما با مقدمات برنامه نویسی شیئ گرا آشنا می‌شوید.

اشیاء، اعضا و تجرد (Abstraction)

یک شیئ (Object) یک طرح برنامه‌پذیر است که چیزهایی را نشان می‌دهد. در دنیای واقعی، ماشین، دوچرخه، کامپیوتر و... شیئ هستند. هر کدام از این اشیاء یک سری اعمال و خصوصیات دارند. در برنامه شما، یک شیئ شاید یک فرم یا یک کنترل مانند یک دکمه (Button) یا یک Database Connection یا هر چیز دیگری باشد. هر شیئ یک واحد عملیاتی کامل است، و شامل همه دادهای مورد نیازش و دارای همه اعمالی که برای آن ساخته شده است می‌باشد.

کلاس‌ها (Classes)

کلاسها قالب‌هایی برای اشیاء هستند. کلاسها را می‌توان، "طرحهای اولیه" برای اشیاء فرض کرد. آنها تمام عضوهای یک شیئ را تعیین، و رفتارهای آن را نیز تعریف می‌کنند. وقتی که یک کلاس مقداردهی شد، یک نمونه درون حافظه‌ای از آن کلاس ساخته می‌شود. این نمونه شیئ نامیده می‌شود. برای نمونه سازی از کلاس از کلمه کلیدی New استفاده می‌شود.

' Declares a variable of the Widget type
Dim myWidget As Widget

' Instantiates a new Widget object and assigns it to the myWidget variable
myWidget = New Widget()

وقتی یک نمونه از یک کلاس ساخته می‌شود، یک کپی از نمونه داده بوسیله آن کلاسی که در حافظه ساخته شده تعریف می‌شود و به مرجع متغییر داده می‌شود. هر نمونه از کلاس مستقل از دیگر نمونه هاست و می‌تواند یک طرح جداگانه برنامه پذیر باشد. درهر لحظه، محدودیتی برای تعداد کپی های یک کلاس (که قبلا تعریف شده) وجود ندارد. برای مقایسه، در جهان واقعی، اگر ماشین یک شیئ باشد، کلاس یک طرح برای ماشین است. یک طرح می‌تواند برای هر تعداد ماشین مورد استفاده قرار گیرد و تغییرات بر روی یک ماشین، تاثیری بر دیگر ماشین‌ها نمی‌گذارد.

اشیاء و اعضاء (Members)

اشیاء ترکیبی از عضوها هستند. اعضا، تشکیل شده از خصوصیات (Properties)، فیلدها، متدها و رویدادها (Events) و هر چیزی که اطلاعات و اعمالی داشته باشد. فیلدها و خصوصیات، اعضای داده‌ای هر شیئ هستند. متدها اعمالی هستند که شیئ می‌تواند انجام دهد و رویدادها اطلاعاتی هستند که زمانیکه اتفاقی در برنامه می‌افتد یک شیئ به اشیاء دیگر می‌فرستد یا از آنها دریافت می‌کند.

در مثال واقعی‌مان، شیئ ماشین، فیلدها و خصوصیاتی مانند "رنگ"، "مدل"، "سال تولید" دارد. این اطلاعات وضعیت شیئ ماشین را توصیف می‌کنند. شیئ ماشین می‌تواند متدهایی مانند "دور زدن" و "تعویض دنده" داشته باشد. متدها رفتاری که شیئ می‌تواند اجرا کند را نشان می‌دهند. ماشین شاید رویداد EngineOverheating از طرف شیئ "موتورش" را داشته باشد، یا وقتی با شیئ "درخت" تعامل می‌کند، شاید رویداد "تصادف" برای آن اتفاق بیفتد.

کپسوله سازی (Encapsulation)

کپسوله سازی روشی است که یک شیئ را مستقل از اینترفیسش پیاده سازی کنیم. یک برنامه با یک شیئ بواسطه اینترفیسش تعامل می‌کند، که شامل خصوصیات عمومی و متدهایش است. تا زمانی که این اینترفیس ثابت باقی می‌ماند، برنامه می‌تواند به تعامل با کامپوننت ادامه دهد؛ حتی اگر پیاده سازی اینترفیس بین دو نسخه کاملا" بازنویسی شده باشد.

اشیاء فقط از طریق متدها و خصوصیات عمومیشان با دیگر شیئ‌ها تعامل می‌کنند. داده‌های داخلی یک شیئ، نباید در اینترفیس قرار بگیرد. بنابراین فیلدها به‌ندرت Public تعریف می‌شوند.

به مثال ماشینمان برگردیم: اگر شیئ ماشین با شیئ راننده تعامل کند، اینترفیس ماشین شاید شامل متدهای "حرکت به جلو"، "حرکت به عقب" و "توقف" باشد. این همه اطلاعاتی است که راننده برای تعامل با ماشین نیاز دارد. ماشین شاید شامل شیئ "موتور" نیز باشد، اما راننده نیازی به شناخت شیئ موتور ندارد. همه اطلاعاتی که راننده درباره این متدها دارد این است که می‌توانند فراخوانی شوند و مقادیر ویژه‌ای نیز را برمی‌گردانند. بنابراین اگر شیئ موتور تغییری کند، تا زمانیکه اینترفیس به درستی به کار خود ادامه می‌دهد این امر تفاوتی برای راننده ایجاد نمی کند.

چند شکلی (Polymorphism)

چند شکلی توانایی کلاسهای متفاوت، در پیاده سازی‌های مختلف از اینترفیس‌های عمومی مشابه است. به عبارت دیگر، چندشکلی به متدها و خصوصیات یک شیئ اجازه می‌دهد، بدون توجه به چگونگی پیاده سازی اعضای آنها، فراخوانی شوند. برای مثال شیئ Driver می‌تواند بوسیله اینترفیس عمومی ICar با شیئ Car تعامل کند. اگر شیئ دیگری مانند شیئ Truck یا شیئ SportCar اینترفیس عمومی مشابهی را داشته باشند، شیئ Driver می‌تواند با آنها بدون توجه به پیاده سازی خاص آن اینترفیس تعامل کند. در اینجا دو راه اصلی برای تامین چندشکلی وجود دارد:

  • چندشکلی اینترفیسی (Interface Polymorphism)
  • چندشکلی وراثتی (Inheritance Polymorphism)

چندشکلی اینترفیسی (Interface Polymorphism)

اینترفیس یک قرارداد برای رفتار است. در واقع اینترفیس، اعضای یک کلاس را تعیین می‌کند، اما توضیحاتی درباره پیاده سازی جزییات آن نمی‌دهد. یک شیئ می‌تواند اینترفیس‌های زیاد و متفاوتی را پیاده سازی کند و کلاسهای متفاوت زیادی می‌توانند یک اینترفیس مشابه را پیاده سازی کنند. همه اشیایی که اینترفیس مشابهی را پیاده سازی می‌کنند می‌توانند با دیگر اشیاء درون اینترفیس تعامل کنند. به عنوان مثال شیئ Car مثال قبل شاید اینترفیس IDrivable را پیاده سازی کند (به عنوان قرار داد، اینترفیس‌ها با I شروع می‌شوند)، که متدهای GoForward, GoBackward و Stop را تعیین می‌کند. کلاس‌های دیگر مانند Truck ،Forklift یا Boat می‌توانند این اینترفیس را پیاده سازی کنند و بنابراین می‌توانند با شیئ Driver تعامل داشته باشند. شیئ Driver از پیاده سازی انیترفیسی که با آن تعامل دارد بی اطلاع است.

چندشکلی وراثتی (Inheritance Polymorphism)

وراثت به شما امکان می‌دهد که اعمال یک کلاس از پیش تعریف شده را در یک کلاس جدید با هم ترکیب کنید و اعضای متفاوت مورد نیاز را در آن پیاده سازی کنید. کلاسی که از کلاس دیگری ارث می برد "مشتق" آن کلاس، یا "وارث" آن کلاس نامیده می‌شود. یک کلاس می‌تواند مستقیما" فقط از یک کلاس ارث ببرد، که آن کلاس که از آن ارث می برد را کلاس پایه (Base Class) می‌نامند. کلاس جدید اعضای مشابهی با کلاس پایه دارد، و اعضای اضافی که مورد نیاز باشند می‌توانند افزوده شوند. به علاوه، در کلاس جدید بوسیله overriding پیاده سازی کلاس پایه، اعضای پایه می‌توانند تغییر کنند. کلاسهای وارث، همه ویژگی‌های کلاس پایه را نگه می‌دارند و می‌توانند با دیگر اشیاءیی که نمونه‌هایی از کلاس پایه هستند تعامل کنند. به عنوان مثال، اگر کلاس Car یک کلاس پایه باشد، SportsCar می‌تواند یک کلاس مشتق شده از آن باشد. کلاس SportsCar نیز می‌تواند کلاس پایه‌ای برای کلاس مشتق شده دیگری مثل کلاس ConvertibleSportsCar باشد. هر کلاس مشتق شده جدید، ممکن است اعضای جدید را پیاده سازی کند، اما اعمالی که در کلاس اولیه Car تعریف شده‌است همچنان باقی می‌مانند.

Overloading اعضاء

Overloading به شما امکان می‌دهد که چندین عضو با نام مشابه درست کنید. هر عضوی که همنام با عضو دیگری است، باید امضای متفاوتی داشته باشد. Overloading بیشتر در بین متدها متداول است.

شاید شما بخواهید متدی درست کنید که بتواند مجموعه‌های متفاوتی از پارامترها را بپذیرد:

Public Sub Display(ByVal DisplayValue As Integer)
' Implementation Omitted
End Sub

این متد کاملا" پذیرفتنی است. اما فرض کنیم که می‌خواهید به کلاینت اجازه دهید اگر نیاز بود پارامتر Duration را انتخاب کند. یا اینکه شاید بخواهید متد بتواند مقادیر Integer یا String را به عنوان پارامتر DisplayValue بپذیرد. گرچه در VB.NET اجازه دارید پارامترهای اختیاری داشته باشید اما بهترین راه Overloading است. Overloadها متدهای چندگانه هستند. متدهای Overload شده باید امضای متفاوتی داشته باشند. اما نیاز ندارند مقدار بازگشتی و نوع و یا سطح دسترسی مشابهی داشته باشد. وقتی یک متد Overload شده صدا زده می‌شود، CLR نوع آرگومانهای تحویل داده شده در فراخوانی متد را بررسی می‌کند. سپس لیست آرگومان‌ها را با فراخوانی‌ها و امضاهای Overloadهای موجود تطابق می‌دهد. اگر هیچ Overloadای با نوع آرگومان‌ها تناسب نداشته باشد، یک خطا اعلام می‌شود.

ساختن متدهای Overload

شما می‌توانید یک متد Overload شده را از راهی شبیه آنچه دیگر متدها را می‌سازید، درست کنید: بوسیله توصیف متد با یک نام، یک سطح دسترسی، یک نوع بازگشتی، و یک لیست آرگومان. یک متد Overload شده باید نامی ‌شبیه متدی موجود اما با امضایی متفاوتی با آن داشته باشد. سطح دسترسی و نوع بازگشتی می‌تواند مشابه و یا متفاوت باشد. مثال زیر یک متد Overload شده را نشان می‌دهد.

' This example demonstrates an overloaded method.
Public Sub DisplayMessage(ByVal i As Integer)
MessageBox.Show(i.ToString())
End Sub

' This method has the same name as the previous method, but is
' distinguishable by signature
Public Sub DisplayMessage(ByVal s As String)
MessageBox.Show(s)
End Sub

وقتی یک متد با نام DisplayMessage فراخوانی می‌شود، CLR نوع آرگومان‌های تحویل داده شده را مشخص می‌کند. اگر یک String باشد، متدی که String می‌گیرد، صدا زده می‌شود و اگر یک Integer باشد، متدی که Integer می‌گیرد فراخوانی می‌شود.

اینترفیس‌ها

اینترفیس یک قرارداد است. هر شیئ که پیاده سازی می‌شود، برای تامین پیاده سازی اعضای تعیین شده در آن اینترفیس یک ضمانت نامه اینترفیس می‌گیرد. اگر یک شیئ نیاز به تعامل با اینترفیسی داشته باشد، می‌تواند با هر شیئ که آن اینترفیس را پیاده سازی می‌کند تعامل داشته باشد. یک اینترفیس فقط اعضایی را تعریف می‌کند که بوسیله شیئ که بعدا پیاده سازی خواهد شد ساخته می‌شود. تعریف اینترفیس هیچ اطلاعاتی درباره پیاده سازی اعضاء جز پارامترهایی که می‌گیرند و نوع مقادیری که آنها برخواهند گرداند، نمی‌دهد و پیاده سازی اینترفیس‌ها کاملا به پیاده سازی کلاس واگذار می‌شود.

بنابراین این امکان دارد که در اشیاء مختلف پیاده سازی‌های مختلفی از اعضای مشابه داشته باشیم. به عنوان مثال، اینترفیسی به نام IShape که یک متد CalculateArea تعریف می‌کند. کلاس Circle این اینترفیس را برای محاسبه مساحت خود، به طریق متفاوتی با کلاس Square پیاده سازی می‌کند. هر چند که یک شیئ که نیاز به تعامل با IShapeدارد می‌تواند متد CalculateArea را فراخوانی کند و هر دوی Circle یا Square نتایج درستی می‌دهند.

تعریف اینترفیس‌ها

اینترفیس‌ها با کلمه کلیدی Interface تعریف می‌شوند.

Public Interface IDrivable
End Interface

این اعلان اینترفیس IDrivable را تعریف می‌کند اما هیچ عضوی برای آن تعریف نمی‌کند. متدهای یک عضو باید با امضای متد تعریف شود، اما بدون بدون تعریف سطح دسترسی مثل Public و Private. سطح دسترسی یک اینترفیسس سطح دسترسی اعضای آن اینترفیس را نیز تعیین می‌کند. پس اگر یک اینترفیس Public داشته باشید، همه اعضایش هم باید Public باشند. مثال زیر نشان می‌دهد که چطور متدها را به اینترفیس اضافه کنید:

Public Interface IDrivable
Sub GoForward(ByVal Speed As Integer)
Sub Halt()
Function DistanceTraveled() As Integer
End Interface

همچنین شما می‌توانید خصوصیات را نیز به اینترفیس‌ها اضافه کنید. خصوصیت باید ReadOnly یا WriteOnly تعریف شوند. مثال زیر را ببینید:

Public Interface IDrivable
' This defines a read-only property.
ReadOnly Property FuelLevel() As Integer
End Interface

اگرچه شما می‌توانید خصوصیات را در اینترفیس‌ها تعریف کنید، اما نمی‌توانید فیلدها را در آنها تعریف کنید. این شرط تضمین می‌کند که کلاسهایی که از طریق اینترفیس‌ها تعامل دارند به دادهای درونی یک شیئ دسترسی نداشته باشند.

اینترفیس‌ها همچنین می‌توانند رویدادها را تعریف کنند:

Public Interface IDrivable
Event OutOfFuel(ByVal sender As Object, e As System.EventArgs)
End Interface

چند شکلی با اینترفیس‌ها (Polymorphism with Interfaces)

هر شیئ که یک اینترفیس خاص را پیاده سازی می‌کند، می‌تواند با هر یک از اشیاء دیگری که به آن اینترفیس نیاز دارند، تعامل کند.

Public Sub GoSomewhere(ByVal v As IDrivable)
' Implementation omitted
End Sub

این متد نیاز به یک پیاده سازی از اینترفیس IDrivable دارد. هر شیئ که این اینترفیس را پیاده سازی می‌کند می‌تواند به عنوان یک پارامتر به این متد پاس داده شود. وقتی یک شیئ توسط اینترفیسش تعامل می‌کند، فقط اعضاء آن اینترفیس در دسترس هستند.

شما همچنین می‌توانید به طور ضمنی اشیایی که اینترفیس خاصی را پیاده سازی می‍کنند درست کنید. (توجه کنید در این مثال Truck باید IDrivable را پیاده سازی کند)

Dim myTruck As New Truck()
Dim myVehicle As IDrivable

' Casts myTruck to the IDrivable interface
myVehicle = CType(myTruck, IDrivable)

پیاده سازی اینترفیس‌ها

در VB.Net اینترفیس‌ها بوسیله کلاس‌ها و ساختارها (Structures) با کلمه کلیدی Implements پیاده سازی می‌شوند:

Public Class Truck
Implements IDrivable
' Additional implementation code omitted
End Class

کلاس‌ها می‌توانند چندین اینترفیس را پیاده سازی کنند. اگر بخواهید کلاسی تعریف کنید که چندین اینترفیس را پیاده سازی کند، می‌توانید نام اینترفیس‌ها را با کاما از هم جدا کنید. مثال زیر را ببینید:

Public Class Truck
Implements IDrivable, IFuelBurning, ICargoCarrying
' Additional implementation code omitted
End Class

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

پیاده سازی اعضای اینترفیس‌ها

در VB.NET، یک عضو کلاس با کلمه کلیدی Implements یک عضو اینترفیس را پیاده سازی می‌کند. عضو کلاسی که عضو اینترفیس را پیاده سازی می‌کند باید امضایی مشابه آن چه در اینترفیس تعریف شده، داشته باشد. اما نیاز نیست که سطح دسترسی مشابهی با آن داشته باشد. مثال بعد نشان می‌دهد چگونه یک عضو اینترفیس تعریف می‌شود.

Public Interface IDrivable
Sub GoForward(ByVal Speed As Integer)
End Interface

Public Class Truck
Implements IDrivable

Public Sub GoForward(ByVal Speed As Integer)
Implements IDrivable.GoForward
' Implementation omitted
End Sub
End Class

عضو کلاسی که یک عضو اینترفیس را پیاده سازی می‌کند مجبور نیست که نامی مشابه نام عضو اینترفیس داشته باشد. مثال بعد یک پیاده سازی کاملا معتبر متد GoForward از اینترفیس IDrivable را نشان می‌دهد:

Public Sub Move(ByVal Speed As Integer)
Implements IDrivable.GoForward
' Implementation omitted
End Sub

هر فراخوانی متد GoForward از اینترفیس IDrivable در مثال قبل، متد Move را از کلاس Truck اجرا می‌کند. همچنین شما می‌توانید سطح دسترسی متفاوتی را برای متد کلاسی که متد اینترفیس را پیاده سازی می‌کند در نظر بگیرید. به عنوان مثال می‌توانید متد Public اینترفیس را متد Private کلاس پیاده سازی کنید. اگر این روش را انجام دهید، وقتی که دسترسی درون اینترفیس است متد Public می‌شود، اما وقتی دسترسی به عنوان عضوی از کلاس است Private می‌ماند.

1 2 قسمت بعد »
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫برنامه نویسی شیئ گرا در VB.NET (2)

برنامه نویسی شیئ گرا در VB.NET

این مقاله به شما کمک می‌کند تا با مفاهیم پایه‌ای برنامه نویسی شیئ گرا مانند کلاسها، اشیاء، اینترفیس‌ها، چند ریختی و وراثت و همچنین چگونگی استفاده از آشنا شوید.

توسط kamyar_rasta | 20 خرداد 1384 | 1765 بار مشاهده Printable Version نسخه مخصوص چاپ

وراثت چند شکلی

وراثت اجازه می‌دهد که کلاس جدیدی تعریف کنید که تمام اعضاء و اعمال یک کلاس که قبلا تعریف شده را در خود داشته باشد. به این ترتیب می‌توانید کلاس‌هایی درست کنید که اعمال پایه و مشترکی را انجام دهند و سپس زیر کلاسهای خاصی تولید کنید که خدمات متفاوت اما مرتبطی ارائه دهند.

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

وراثت

وراثت این امکان را به شما می‌دهد که چندین کلاس تولید کنید که از هم متمایزند اما در برخی از اعمال با هم شریک‌اند. کلاسهای ویژه‌ای که کلاس "مشتق شده " (Derived Classes) نامیده می‌شوند، از کلاس مشترک که "کلاس پایه" (Base Class) نامیده می‌شود ارث می‌برند. کلاسDerived را همچنین کلاس تعمیم یافته (Extended) یک کلاس پایه نیز می‌نامند. کلاس پایه اعمال مشترکی که به هر کلاس مشتق عرضه می‌شود را کپسوله سازی می‌کند. برای مثال فرض کنید کلاسی به نام کامیون داریم، کلاس کامیون تمامی اعمال اولیه که یک ماشین نیاز دارد را داراست. متدهایی برای به جلو رفتن، برگشتن و روشن شدن دارد و تمام متدهای لازم برای برای انجام این اعمال را کپسوله می‌کند. شاید شما یک کلاس مشتق که PickupTruck نام دارد تعریف کنید که از کلاس کامیون ارث می‌برد. چون این از کامیون ارث می برد همه اعمال و قابلیت‌هایی که کامیون تامین می‌کند را دارد. سپس شما می‌توانید قابلیت‌های اضافه‌ای را برای کلاس جدید پیاده سازی کنید، مانند خصوصیت "بار". کلاس PickupTruck می‌تواند به عنوان یک کلاس پایه برای کلاس مشتق دیگر "کامیون چهار دنده" ایفای نقش کند.

چند رفتاری در کلاس‌های وارث

عموما" کلاس‌های وارث یک رابطه "یک ... است" با کلاس پایه دارند. یک "کامیون کشاورزی چهاردنده" یک "کامیون کشاورزی" است و یک کامیون "کشاورزی" یک "کامیون" است. هر نمونه از کلاس مشتق می‌تواند رفتار متفاوتی به عنوان نمونه‌ای از کلاس پایه‌اش داشته باشد. پس، اگر متدی نیاز به شیئ کامیون داشته باشد شما می‌توانید شیئ کامیون کشاورزی را عرضه کنید. هر کلاس مشتق ممکن است به طور ضمنی به کلاس پایه خود تبدیل شود. وقتی یک کلاس به کلاس پایه خودش تبدیل می‌شود، هر عضوی که به وسیله کلاس مشتق پیاده سازی شده غیر قابل دسترس خواهند شد و تنها اعضای کلاس پایه در دسترس خواند بود.

ساختن کلاس‌های وارث

یک کلاس وارث به وسیله کلمه کلیدی Inherits در VB.NET تعریف می‌شود. در مثال زیر کلاس PickupTruckکه از کلاس Truck ارث برده را تعریف نمودیم:

Public Class PickupTruck
Inherits Truck

' Additional implementation omitted
End Class

کلاس ها فقط می‌توانند از یک کلاس پایه ارث ببرند اما میتوانند چندین اینترفیس را پیاده سازی کنند. اگر کلاس شما چندین اینترفیس را پیاده سازی کند و همچنین از یک کلاس ارث ببرد، باید از کلمه کلیدی Implements را بلافاصله بعد از کلمه کلیدی Inherits استفاده کنید:

Public Class FourWheelDrivePickupTruck
Inherits PickupTruck
Implements IFourWheelDrive

' Additional implementation omitted
End Class

وقتی که کلاس وارث تعریف شد، می‌توانید اعضای اضافی را پیاده سازی کنید که باعث اضافه شدن اعمال اختیاری به کلاستان می‌شود.

کلاس‌های بدون وارث

گاهی شاید بخواهید کلاسی درست کنید که نتواند به عنوان کلاس پایه برای دیگر کلاس‌ها عمل کند. به عنوان مثال شاید کلاس خاصی تعریف کنید که از آن در کامپوننت‌هایتان استفاده می‌کنید و نمی‌خواهید قابل استفاده به عنوان کلاس پایه برای دیگر برنامه نویسان باشد. در این موارد می‌توانید کلاستان را با NotInheritabel برچسب بزنید.

Public NotInheritable Class AClass
' Implementation omitted
End Class

اعضاء وارث

وقتی یک کلاس وارث درست می‌کنیم، کلاس جدید همه اعمال موجود در کلاس پایه را حفظ می‌کند. علاوه بر این اعضا جدیدی را اضافه می‌کند، شما می‌توانید اعضای وارث را آن طور که می‌خواهید پیاده سازی کنید. Overriding اعضای پایه این امکان را به شما می‌دهد که یک عضو موجود در کلاس پایه را پیاده سازی جدیدی کنید. در VB.NET همچنین می‌توانید اعضای پایه را سایه بزنید (Shadow). سایه زنی اعضای پایه این امکان را می‌دهد که عضو پایه را پنهان کنیم و یک عضو جدید با همان نام، اما با خصوصیات کاملا" متفاوت شامل امضاء، و سطح دسترسی جدید اضافه کنیم.

Overriding اعضاء کلاس پایه

وقتی از یک کلاس پایه ارث می‌برید، می‌توانید پیاده سازی متفاوتی برای اعضای کلاس پایه بوسیله Override کردن آنها داشته باشید. برای مثال، کلاس Car ممکن است متدی با نام GoForward داشته باشد. اگر کلاس SportCar از کلاس Car به ارث ببرد، شاید بخواهد پیاده سازی متفاوتی از متد GoForward داشته باشد. فقط متدها و خصوصیات کلاس پایه می‌توانند Override شوند. متغییرها و رویدادهای اعضاء نمی‌توانند Override شوند.

با استفاده از کلمه کلیدی Overrides می‌توانید پیاده سازی متفاوتی از یک عضو ارایه کنید. پیاده سازی جدید باید امضا و نوع برگشتی یکسانی با عضوی که Override می‌شود داشته باشد و باید سطح دسترسی مشابهی هم داشته باشد.

' This example assumes the existence of a GoForward method in the base class
Public Class SportsCar
Inherits Car

' This line declares the overridden method
Public Overrides Sub GoForward(ByVal Speed As Integer)
' Implementation omitted
End Sub
End Class

وقتی که یک عضو Override می‌شود، عضو جدید "جایگزین عضو کلاس پایه" نامیده می‌شود. به عنوان مثال، اگر نمونه‌ای از یک کلاس وارث از کلاس پایه خودش ساخته شود و یک متد Override شده فراخوانی شود، پیاده سازی جدید اجرا خواهد شد. برای Override عضو کلاس پایه، اعضا باید با Overridable برچسب زده شوند:

Public Overridable Sub OverrideMe()
' Implementation omitted
End Sub

سایه زنی (Shadowing) اعضای کلاس پایه

در بخش قبل آموختید که چطور پیاده سازی عضوی در کلاس پایه را با پیاده سازی متفاوتی از عضو مشابهی، جایگزین کنید. در NET. همچنین امکان پذیر است که پیاده سازی عضو کلاس پایه را پنهان کرد و با عضو کاملا" جدیدی جایگزین کرد، که سطح دسترسی و امضای متفاوتی داشته باشد یا حتی نوع متفاوتی داشته باشد. این کار Shadowing نامیده می‌شود. در VB.NET از کلمه کلیدی Shadows برای جایگزینی پیاده سازی جدید برای عضو کلاس پایه استفاده می‌کنیم.

' This is the base class
Public Class MyBaseClass
Public Function MyMethod(ByVal I As Integer) As String
' Implementation omitted
End Function
End Class

' This class inherits the base class
Public Class MyInheritedClass
Inherits MyBaseClass

' This function shadows the MyMethod sub defined in the base class.
' Note that this member has a completely different signature, access
' level and returns a different type of value.
Friend Shadows Function MyMethod(ByVal S As String) As Integer
' Implementation omitted
End Function
End Class

حفظ سازگاری با اعضای سایه زده شده

وقتی عضو کلاسی را سایه می‌زنید یا پنهان می‌کنید، پیاده سازی کلاس پایه را پنهان می‌کنید و پیاده سازی جدیدی می‌سازید که نیاز به مشخصات مشابه با عضو کلاس پایه ندارد. این می‌تواند موجب مشکلاتی شود. اگر شیئی تابع MyMethod را از مثال قبل صدا بزند، این انتظار دارد که نوع String برگشت داده شود و وقتی یک Interger از نمونه عضو سایه زده شده برمی‌گردد، یک خطا ایجاد می‌شود. بنابراین باید وقتی عضوی را سایه می‌زنید یا پنهان می‌کنید دقت زیادی داشته باشید. این باید در مواردی انجام شود که شما یقین دارید که سازگاری از بین نمی‌رود.

' This example uses the MyBaseClass and MyInheritedClass classes
' defined in the previous code example.
Dim X As New MyInheritedClass()
Dim Y As MyBaseClass

' X and Y now refer to the same object, but the variables have
' different types.
Y = X

' Because the variable X is of the MyInheritedClass type, the new
' member will be called by this line.
X.MyMethod("A String")

' However, because the variable Y is of the MyBaseClass type, the
' original implementation of the member will be called by this line.
Y.MyMethod(42)

دسترسی به اعضاء کلاس پایه

وقتی اعضاء را Override یا پنهان می‌سازید، شاید بخواهید به پیاده سازی اعضاء در کلاس پایه دسترسی داشته باشید. بوسیله کلمه کلیدی MyBase می‌توانید به اعضای کلاس پایه دسترسی داشته باشید. این کلمه اشاره‌ای به پیاده سازی کلاس پایه دارد و اجازه می‌دهد که پیاده سازی اعضای کلاس پایه را در اختیار داشته باشید. مثال زیر نشان می‌دهد که چگونه یک عضو کلاس پایه احضار می‌شود:

' This example demonstrates calling the base class implementation of
' MyMethod from within an override of that method
Public Overrides Function MyMethod(ByVal I As Integer) As String
MyBase.MyMethod(I)
' Additional implementation omitted
End Function

اعضاء حفاظت شده (Protected Members)

حال یک مرور سربع بر سطوح دسترسی خواهیم داشت. اعضاء Public در دسترس همه بخشهای یک برنامه هستند) شامل کلاسهای خارجی(. اعضاء Friend یاInternal برای اعضای اسمبلی محلی (Local Assembly) در دسترس اما برای فراخوانی‌های خارجی قابل دسترسی نیستند. اعضاء Private فقط درون کلاس خودشان قابل دسترس‌اند و نمی‌توانند مورد استفاده هیچ فراخوان دیگری (شامل کلاسهای وارث) قرار بگیرند. دو سطح دسترسی دیگر Protected و Protected Frind هستند.

وقتی کلمه کلیدی Protectded با یک عضو کلاس استفاده می‌شود، آن عضو برای فراخوانی‌های خارجی، سطح دسترسی مشابهی با کلمه کلیدی Private دارد. تفاوتشان در این است که اعضای Protected برای کلاس‌های مشتق شده هم قابل دسترسی هستند. مثال زیر را ملاحظه کنید:

'The base class defines two methods: a private method and a protected
' method.
Public Class BaseClass
' A private method cannot be called from derived classes
Private Sub Method1()
' Implementation omitted
End Sub

' A protected member can be called from derived classes
Protected Sub Method2()
' Implementation omitted
End Sub
End Class

' The inherited class inherits from BaseClass
Public Class InheritedClass
Inherits BaseClass

Public Sub Demo()
' This call is legal because the protected access level allows
' access to the member defined by the BaseClass
Me.Method2()

' This call will not compile because it attempts to access a
' private member of the base class.
Me.Method1()
End Sub
End Class

مثال قبل تفاوت بین اعضاء Private و اعضاء Protected را نشان می‌دهد. متد Demo قصد دارد که از نمونه‌ای از کلاس وارث Me، با فراخوانی Method1 و Method2 استفاده کند. چون هر دوی این متدها در کلاس پایه تعریف شده‌اند، سطح دسترسی آنها تعیین شده، به هر حال آنها می‌توانند از کلاس وارث فراخوانده شوند. فراخوانی Method2 موفقیت آمیز است اما از آنجاییکه Method1 خصوصی (Private) است، برای کلاس‌های وارث در دسترس نیست.

دومین سطح دسترسی Protect Friend است. این مورد ترکیبی از سطوح Protected و Friend است. بنابراین عضوی که Protect Friend است می‌تواند بوسیله کلاس‌های درون اسمبلی یا کلاس‌هایی که از آن کلاس ارث می‌برند استفاده شوند، به علاوه از درون کلاس خودش هم دردسترس است.

کلاس‌ها و اعضای مجرد

وقتی کامپوننت‌هایی را می‌سازید، شاید بخواهید کلاس پایه‌ای درست کنید که برخی اعمال ثابت را داشته باشد اما پیاده سازی دیگر اعضای آن را به کلاس‌هایی که از آن به ارث می‌برند واگذار کنید. شما می‌توانید با استفاده از کلاسهای مجرد Abstract Classes این کار را انجام دهید، کلاس‌هایی که باید به ارث رسیده شوند.

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

ساختن کلاس‌های مجرد (Abstract Classes)

بوسیله کلمه کلیدی MustInherit می‌توانید کلاسی را کلاس مجرد کنید.

Public MustInherit Class AbstractClass
' Implementation omitted
End Class

تعریف اعضای مجرد

مانند کلاس معمولی، کلاس مجرد می‌تواند هر عضوی را پیاده سازی کند. اعضای معمولی یک کلاس مجرد می‌تواند Overridable (مجازی) شود، در این مورد کلاس‌های وارث می‌توانند اعضایی که نیاز دارند را بسازند، یا می‌توانند غیر مجازی شوند و بنابراین پیاده سازی ثابتی دارند که می‌تواند با همه اعضاء مشترک شود.

کلاسهای مجرد هم میتواند اعضای مجرد تعیین کند. اعلان یک عضو مجرد بسیار شبیه اعلان یک عضو اینترفیس است. تنها نوع عضو، سطح دسترسی، پارامترهای مورد نیاز و نوعی که برگرداننده می‌شود تعیین می‌شود. هیچ جزییاتی راجع به پیاده سازی اعضایی که در متد اعلان شده‌اند وجود ندارد. پس، فقط اعضاء اینترفیس تعیین می‌شوند. برای اعلان یک عضو مجرد، باید از کلمه کلیدی MustOverride استفاده کرد. اعضا مجرد باید درکلاسهای مجرد اعلان شوند. اگر سعی کنید عضو مجردی را در کلاس غیر مجردی اعلان کنید، کامپایلر خطایی اعلام خواهد کرد. مثال بفدی کلاس مجردی با 3 عضو مجرد نشان می دهد:

Public MustInherit Class Car
Public MustOverride Sub GoForward(ByVal i As Integer)
Public MustOverride Function CheckSpeed() As Integer
Public MustOverride Property Color() As String
End Class

ارث بری از یک کلاس مجرد

وقتی یک کلاس غیر مجرد از یک کلاس مجرد ارث می‌برد، باید پیاده سازی برای هر یک از اعضا مجرد تعیین شده بوسیله کلاس مجرد تامین کند. مثال بعدی پیاده سازی از کلاس مجرد مثال قبلی را نشان می‌دهد.

Public Class MyCar
Inherits Car

Public Overrides Sub GoForward(ByVal I As Integer)
' Specific implementation of this method would go here
End Sub

Public Overrides Function CheckSpeed() As Integer
' Implementation for this method goes here
End Function

Public Overrides Property Color() As String
Get
' Both the getter and the setter must be implemented
End Get
Set(ByVal Value As String)
' Setter implementation goes here
End Set
End Property
End Class

همچنین می‌توانید کلاس مجرد جدیدی را با ارث بری از کلاس مجرد حاضری درست کنید. در این مورد، کلاس مجرد مشتق شده نیاز ندارد که پیاده سازیی برای اعضا مجرد تعیین شده در کلاس پایه تعریف کند. اما اگر نیاز باشد می‌توان این اعضاء را نیز مجددا پیاده سازی کند.

منابع

  • Developing Windows-Based Applications with Microsoft Visual Basic .NET

« قسمت قبل 1 2
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫روش پیاده‌سازی برنامه نویسی فوق العاده

روش پیاده‌سازی برنامه نویسی فوق العاده

XPDM روشی است بر اساس متدلوژی XP که توجه زیادی به مسائل مهم کاربردهای تجارت الکترونیک دارد و راهکارهای سریع و بهینه‌ای برای تغییرات محیط‌های تجاری ارائه می‌نماید.

توسط khashayar | 5 تیر 1384 | 1523 بار مشاهده Printable Version نسخه مخصوص چاپ

هر چند زمان زیادی از پیدایش متدولوژی XP نمی‌گذرد، اما با توجه به بالا بردن کارایی و سرعت بخشیدن به امر تولید نرم‌افزار، از استقبال زیادی برخوردار گردیده، بگونه‌ای که تعداد زیادی از شرکت‌ها و موسسات از این متدلوژی جهت تولید نرم‌افزارهای خود استفاده می‌نمایند. بسیاری از این شرکت‌ها و موسسات با استفاده از اصول متدلوژی XP، با توجه به نیاز، نسخه‌هایی سفارشی شده از این روش را ایجاد و با استفاده از آنها حداکثر کارایی را در تولید نرم‌افزارهایشان بدست آورده‌اند. از جمله این شرکت‌ها، شرکت SSW می‌باشد که یک نسخه سفارشی شده از XP بنام SSW XPDM را بوجود آورده است. این شرکت یکی از شرکت‌های همکار مایکروسافت خصوصا" در زمینه ارائه راه حلهای NET. بوده و با همکاریAdam Cogan (طراح ارشد و مدیر بخش محلی میکروسافت در تولید و بروز رسانی MSDN) از جمله یکی از شرکت‌های پیشتاز و موفق در این زمینه می‌باشد. در این مقاله سعی در تشریح این روش گردیده است.

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

روش XPDM ارائه شده توسط شرکت SSW روشی است بر اساس متدلوژی XP که توجه زیادی به مسائل مهم کاربردهای تجارت الکترونیک دارد و راهکارهای سریع و بهینه‌ای برای تغییرات محیط‌های تجاری ارائه می‌نماید. قبل از اینکه به توضیح روش SSW XPDM بپردازیم، بد نیست نگاهی سریع و گذرا بر متدولوژی XP داشته باشیم.

برنامه نویسی فوق العاده (eXtreme Programming)

متدلوژی XP بر چهار ارزش کلیدی زیر بنا گردیده‌است:

  • ارتباط (Communication)
  • ساده سازی (Simplicity)
  • بازخورد (Feedback)
  • شجاعت (Courage)

از انجام سه ارزش کلیدی ارتباط، ساده سازی و بازخورد در کنار یکدیگر توسط اعضای تیم پروژه و کاربر به ارزش کلیدی شجاعت دست خواهیم یافت. همانگونه که در شکل 1 دیده می‌شود، هدف اصلی متدولو‍ژی XP شجاعت می‌باشد. برای مثال شجاعت در تغییر کدی که باید تغییر داده شود، شجاعت برای درخواست یک نیاز جدید توسط کاربر و شجاعت در باور اینکه به نتیجه مطلوب خواهیم رسید. شجاعت یک تیم از واکنش آنها نسبت به فشار و اضطرابها مشخص می‌شود.

متدولوژی XP جهت مقابله با تغییرات غیر منتظره و رفع نیازها و درخواست‌های جدید (که می‌توانند در مراحل بعدی انجام گردند) طراحی گردیده و بدین ترتیب با استفاده از چهار ارزش کلیدی خود همواره در حال اصلاح و تعدیل طرح پروژه با توجه به شرایط می‌باشد در حالی که در گروه‌هایی که براساس متدلوژی‌هایی بغیر از XP کار می‌کنند یا این درخواست‌ها و ورودی‌های جدید نادیده گرفته می‌شود (به دلیل اینکه چهارچوب پروژه از قبل تعیین شده و این تغییرات بسادگی قابل اعمال نخواهند بود) و یا بعنوان یک سری اطلاعات جدید اما در همان چهار چوب طرح کلی پروژه به آنها رسیدگی می‌کنند.

هدف از شجاعت، داشتن اطلاعات صحیح از وضعیت لحظه به لحظه پروژه و اطلاع دقیق از توانایی‌های اعضای تیم در مقابله با مشکلات و اجرای صحیح پروژه می‌باشد. تاکید فراوان XP بر ارزش‌های ارتباط و بازخورد به این دلیل است که همواره بدانیم در کجا هستیم و چگونه به بهترین وجه از عامل شجاعت در پیشبرد پروژه استفاده نمائیم.

Figure 1
شکل 1

چهار ارزش کلیدی XP با استفاده از مرور پیوسته و مستمر و تنظیم و تعدیل اهداف پروژه همیشه پروژه را بصورت زنده و پویا نگهداشته و همچنین تاکید زیادی بر ارتباط مداوم و فعال بین طراحان، برنامه نویسان، مدیران پروژه، مدیران تجاری و کاربران در طول عمر پروژه دارند.

در طول این ارتباط مداوم هر یک از اعضای تیم پروژه وظایف زیر را بر عهده خواهند داشت:

  • طراحان نرم‌افزار با کمک مدیران تجاری نیازهای سیستم را در حداقل زمان ممکن مشخص می‌نمایند.
  • مدیران پروژه انجام فعالیت‌ها را بصورت محدود شده در محدوده زمانی بین 1 تا 3 روز برنامه ریزی می‌کنند.
  • برنامه نویسان بطور پیوسته در حال نوشتن و مرور کدها می‌باشند، البته این کار بصورت برنامه نویسی زوجی (Pair Programming) صورت می‌پذیرد. در این روش دو برنامه نویس با هم بر روی یک طرح، تابع یا فرم کار می‌کنند و بدین صورت کار هر یک توسط دیگری نقد می‌گردد.
  • کاربران، نسخه‌های مختلف سیستم را آزمایش نموده و نتایج را بطور مستمر گزارش می‌نمایند.
  • مدیران تجاری بطور مداوم تغییرات سیستم و تغییر اولویت‌ها را بر اساس تغییرات نیازهای تجاری مرور کرده و گزارش می‌کنند.

تصویر کلی از SSW XPDM

در روش SSW XPDM ابتدا با بدست آوردن یک دید کلی نسبت به مسئله و تعیین اولویت‌ها و تعیین دقیق نیازهای کاربر، یک طرح نسخه نهایی مشخص گردیده و سپس این طرح نسخه نهایی به طرح نسخ میانی که می‌توانند در طول یک دوره زمانی یک تا سه هفته‌ای پیاده سازی شوند، تقسیم می‌گردد (البته این عمل بطور مستمر در طول اجرای پروژه انجام می‌گردد). جهت پیاده سازی نسخ میانی، آنها نیز به نوبه خود به طرح نسخ جزئی که طول دوره پیاده سازی آنها یک تا سه روز می‌باشد، تقسیم شده و با طرح آزمون برای هر یک از نسخ جزئی و پیاده سازی و آزمایش آنها توسط روش برنامه نویسی زوجی و با الحاق این نسخه‌های جزئی، نسخه‌های میانی ساخته شده که این نسخ میانی باید توسط کاربر مورد بررسی و تائید قرار گیرد و در خاتمه بعد از تولید و تائید نسخ میانی، نسخه نهایی ایجاد گردیده و با تست نسخه نهایی و تائید آن توسط کاربر محصول نهایی تولید خواهد شد. بدیهی است در آزمون هر مرحله در صورت بروز خطاها و اشکالات احتمالی، آنها به مرحله قبلی ارجاع داده خواهند شد و تا رفع کامل آنها این عمل تکرار خواهد گردید.

شکی نیست که پیاده سازی نرم افزار یک علم کاملا" دقیق نبوده و همواره با یک درصد ریسک همراه است. SSW XPDM روشی است برای به حداقل رساندن درصد ریسک و حداکثر سازی کارایی تولید نرم افزار. در متدلوژی SWW XPDM در پایان تولید هر نسخه میانی، کاربران با آزمون و تشخیص خطاهای طراحی و پیاده سازی جهت برطرف نمودن آنها توسط اعضاء تیم پروژه میزان ریسک به دوره‌های یک تا سه هفته‌ای کاهش میابد.

در شکل 2 شمای کلی مراحل متدولوژی SSW XPDM نشان داده شده است. لازم به توضیح است قسمت‌هایی که بصورت پررنگ مشخص گردیده اند، با کمک کاربر انجام می‌گیرند. در ادامه به توضیح هر یک از این مراحل می‌پردازیم.

Figure 2
شکل 2

1. مقدار‌دهی اولیه پروژه

این مرحله که معمولا" توسط یک نفر از اعضاء طراح سیستم، در محل کار کاربر انجام می‌گیرد و شامل اهداف زیر می‌باشد (انجام این مرحله غالبا" هزینه‌ای برای کاربر در بر نخواهد داشت):

  • بدست آوردن یک دید کلی از پروژه
  • تعیین بهترین فناوری پیاده سازی
  • تعیین و معرفی بهترین نرم‌افزارها بعنوان ابزار پیاده سازی
  • تشریح متدلوژی پیاده سازی برای کاربر
  • ارائه مستندات سوابق و شرایط شرکت برای آشنایی و توجیه هر چه بیشتر کاربر جهت عقد قرارداد

2. تعیین اولویت‌ها

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

3. نوشتن نیازهای کاربر

نیازهای کاربر یک مستند فنی نیست، بلکه تا حد امکان باید ساده باشد و در اصل نوشتن نیازهای کاربر بصورت بسیار ساده و روان (در باره اینکه سیستم چه کاری باید انجام دهد) می‌باشد. با نوشتن نیازهای کاربر علاوه بر واضح شدن انتظارات کاربر می‌توان تخمینی از زمان پیاده سازی آنها نیز بدست آورد. اگر مشخص کردن و نوشتن نیازهای کاربر بیش از سه روز بطول بی‌انجامد باید به مراحل حداکثر سه روزه شکسته شود. برای مثال اگر پیاده سازی "سیستم مدیریت مشتریان" برای کاربر مطرح باشد که نوشتن نیازهای آن به بیش از سه روز زمان احتیاج داشته باشد، باید برای مثال به دو قسمت تشریح امکانات "اضافه/ویرایش/حذف مشتریان" و "جستجوی مشتریان" تقسیم گردد.

4. طرح نسخه کلی و نسخ میانی

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

  • چه عملیات و توابعی باید انجام گیرند
  • هزینه و زمان هر یک از این فعالیتها چقدر است

هر طرح نسخه میانی بعنوان یک پیشنهاد باید به تائید کاربر برسد.

5. مرور نسخ میانی

همانطور که بیان گردید طرح نسخه کلی در اصل همان نیازهای مشخص شده کاربر می‌باشد، اما طرح نسخ میانی به فعالیت‌هایی که در اولویت بوده و در یک دوره یک تا سه هفته‌ای قابل پیاده سازی هستند، اطلاق می‌گردد. بنابراین روند انجام کار بدین ترتیب است که با توجه به اولویت مطرح شده از طرف کاربر اولین طرح نسخه میانی طراحی شده و بعد از آن این طرح باید توسط طرفین (تیم پروژه و کاربر) مرور گشته و علاوه بر تائید آن مواردی که در اولویت‌های بعد قرار دارند و باید در طرح نسخه میانی بعدی لحاظ گردند مورد موافقت قرار گیرند. بنابراین همانگونه که ملاحظه می‌گردد در این متدلوژی ابتدا مولفه های مرکزی نرم افزار ایجاد می‌شوند.

6. طرح نسخ جرئی

طرح نسخه جزئی یک توصیف تکنیکی از طرح نسخه میانی است که به فعالیت‌های برنامه نویسی یک تا سه روزه شکسته شده است. این فعالیت‌ها به دو بخش آزمون و پیاده سازی تقسیم می‌شوند. بخاطر داشته باشید که طرح نسخه میانی یک سری از نیازهای عملیاتی هستند که کاربر و اعضاء تیم پروژه بر روی آن بتوافق رسیده‌اند و در یک دوره زمانی یک تا سه هفته‌ای قابل پیاده سازی می‌باشند.

7. طرح آزمون نسخه جزئی

بر اساس متدلوژی XP طرح آزمون‌ها باید قبل از پیاده سازی آماده گردند. این بدین معناست که تمام پیاده سازی‌هایی که انجام می‌شوند، باید بر اساس قوانین از قبل تعریف شده باشند. این یک روش کارا جهت تشخیص و رفع سریع خطاهای احتمالی می‌باشد. بنابراین در این مرحله طرح آزمون برای نسخه جزئی آماده می‌گردد تا در مرحله پیاده سازی نسخه جرئی مورد استفاده قرار بگیرد.

8. پیاده‌سازی نسخه جزئی

پیاده سازی نسخه جزئی عبارت است از پیاده سازی فرمها، توابع، اشیاء، روالهای ذخیره شده که باید در یک دوره یک تا سه روزه پیاده سازی گردند. هنگامی که یک فعالیت تائید گردید، تستهای آنها نوشته شده و پیاده سازی آنها آغاز می‌گردد. تمام عملیات در انتهای پیاده سازی هر نسخه جزئی مرور می‌گردد. همانطور که قبلا" گفته شد در این روش کد نویسی با روش برنامه نویسی زوجی (Pair Programming) انجام می‌پذیرد.

9. آزمایش نسخه میانی

در پایان پیاده سازی نسخ جزئی (در طول یک دوره یک تا سه هفته‌ای) یک نسخه از نرم افرار (نسخه میانی) برای مرور و تائید کاربر آماده می‌گردد، کاربر با مرور و آزمون این نسخه میانی در صورت وجود خطاها و اشکالات احتمالی آنها را گزارش کرده و با ارجاع آنها به مرحله قبل تا رفع کامل آنها این عمل ادامه پیدا می‌کند. در صورت رضایت کاربر، این نسخه میانی جهت ایجاد نسخه نهایی مورد تائید قرار می‌گیرد. یکی از اصول پروژه‌های موفق این است که هر کجا خطا یا اشکالی بروز کند باید قبل از پیاده سازی بیشتر برطرف گردد.

10. تائید نسخه نهایی

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

11. انتشار نسخه نهایی

هنگامیکه هر دو طرف (کاربر و تیم پروژه) از نسخه نهایی رضایت داشتند، آن را بصورت یک محصول نهایی ارائه خواهند نمود. در غیر این صورت دوباره با تعیین نیازها یک نسخه جدید ایجاد شده و دوباره مورد آزمون قرار خواهد گرفت.

12. آموزش

بسیاری از کاربردهای جدید بر اساس نظرات مدیریتی طراحی و پیاده سازی می‌گردند و کاربر واقعی آخرین کسی است که سیستم را آزمایش می‌کند، در صورتیکه در متدلوژی XP از ابتدای کار کاربران واقعی سیستم در طی تمام مراحل طراحی و پیاده سازی مشارکت فعال داشته و بطور پیوسته در حال آموزش هستند.

13. پشتیبانی

یکی از نگرانی‌های بجای کاربران همیشه مسئله پشتیبانی می‌باشد. متدلوژی XPDM SSW با طرح سطوح مختلف پشتیبانی برای کاربران مختلف این مسئله مهم را در نظر می‌گیرد. بنابراین با ارائه یک طرح در زمینه روند و چگونگی پشتیبانی نیازهای کاربران در این زمینه برطرف خواهد گردید.

14. پیاده‌سازی بیشتر

با توجه به اینکه نیازها (خصوصا" نیازهای تجاری) بطور مداوم در حال تغییر و تحول می‌باشند، بنابراین احتیاج است که سیستم همواره در حال گسترش و سازگاری با تغییرات باشد. با توجه به قابلیت انعطاف و پویایی متدولوژی XP این عمل با انجام مستمر مراحل آن بسادگی انجام پذیر خواهد بود.

در این مقاله با اقتباس از منابع ذکر شده زیر، سعی در توضیح یک روش ساده و عملی برای استفاده از متدولوژی XP بوده و تشریح دقیق متدولوژی XP مد نظر نبوده است با این وصف نظرات استادان و دوستان گرامی در مورد کاستی‌های این نوشته و تجارب و راهنمای‌هایشان موجب امتنان خواهد بود.

منابع

  • SSW XPDM delivers functional, value-adding software - faster
  • www.xprogramming.com
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


CSS Button

ایجاد یک کلید بدون استفاده از تصویر و با استفاده از CSS


iDevCenter - فهرست مقالات فارسی

فهرست مقالات فارسی

هدف این بخش، تهیه فهرستی کامل از تمام مقالات آموزشی منتشر شده در سایت‌ها و وبلاگ‌های فارسی زبان است.

عنوان | مشاهده | تاریخ
آشنایی با انواع جداول موجود در MySQL | 293 | 1384-04-22
اصول طراحی پایگاه‌های اطلاعاتی | 524 | 1384-04-22
کدنویسی استاندارد در PHP | 274 | 1384-04-22
مقدمه‌ای بر توسعه وب توسط MySQL ،Apache و PHP | 233 | 1384-04-22
نگاهی به الگوریتم RSA (قسمت دوم) | 167 | 1384-04-22
نگاهی به الگوریتم RSA (قسمت اول) | 207 | 1384-04-22
ایجاد Watermark محو روی تصاویر | 255 | 1384-04-05
عکسهای سایه دار و CSS | 275 | 1384-04-05
تابع ()Mail در PHP | 198 | 1384-04-05
استانداردهای وب: Width در مرورگرهای مختلف | 199 | 1384-04-05
استانداردهای وب: DOCTYPE | 110 | 1384-04-05
مقیاس‌ها در CSS | 173 | 1384-03-20
قدرت CSS: طراحی گالری عکس بدون استفاده از Table | 261 | 1384-03-20
Tab Menu حرفه‌ای و CSS | 253 | 1384-03-20
mod_rewrite چیست؟ | 157 | 1384-03-20
مستطیل های لبه گرد و CSS | 302 | 1384-03-20
مفاهیم Encryption و رمزگذاری بر روی اطلاعات | 199 | 1384-03-20
ساختن لینکدونی با تعداد دفعات کلیک در PHP | 243 | 1384-03-20
Semantic Web؛ وقتی اینترنت دیگه می فهمه! | 119 | 1384-03-20
نحوه ساختن و خواندن اسناد RSS در PHP | 191 | 1384-03-20

1 2 صفحه بعد »
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - فهرست مقالات فارسی

Softtool

فهرست مقالات فارسی

هدف این بخش، تهیه فهرستی کامل از تمام مقالات آموزشی منتشر شده در سایت‌ها و وبلاگ‌های فارسی زبان است.

عنوان | مشاهده | تاریخ
RSS چیست و چه کاربردی دارد؟ | 503 | 1384-03-20

« صفحه قبل 1 2
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - فهرست مقالات فارسی

فهرست مقالات فارسی

هدف این بخش، تهیه فهرستی کامل از تمام مقالات آموزشی منتشر شده در سایت‌ها و وبلاگ‌های فارسی زبان است.

عنوان | مشاهده | تاریخ
آشنایی با انواع جداول موجود در MySQL | 293 | 1384-04-22
اصول طراحی پایگاه‌های اطلاعاتی | 524 | 1384-04-22
کدنویسی استاندارد در PHP | 274 | 1384-04-22
مقدمه‌ای بر توسعه وب توسط MySQL ،Apache و PHP | 233 | 1384-04-22
نگاهی به الگوریتم RSA (قسمت دوم) | 167 | 1384-04-22
نگاهی به الگوریتم RSA (قسمت اول) | 207 | 1384-04-22
ایجاد Watermark محو روی تصاویر | 255 | 1384-04-05
عکسهای سایه دار و CSS | 275 | 1384-04-05
تابع ()Mail در PHP | 198 | 1384-04-05
استانداردهای وب: Width در مرورگرهای مختلف | 199 | 1384-04-05
استانداردهای وب: DOCTYPE | 110 | 1384-04-05
مقیاس‌ها در CSS | 172 | 1384-03-20
قدرت CSS: طراحی گالری عکس بدون استفاده از Table | 261 | 1384-03-20
Tab Menu حرفه‌ای و CSS | 253 | 1384-03-20
mod_rewrite چیست؟ | 157 | 1384-03-20
مستطیل های لبه گرد و CSS | 302 | 1384-03-20
مفاهیم Encryption و رمزگذاری بر روی اطلاعات | 199 | 1384-03-20
ساختن لینکدونی با تعداد دفعات کلیک در PHP | 243 | 1384-03-20
Semantic Web؛ وقتی اینترنت دیگه می فهمه! | 119 | 1384-03-20
نحوه ساختن و خواندن اسناد RSS در PHP | 191 | 1384-03-20

1 2 صفحه بعد »
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫RSS چیست و چه کاربردی دارد؟

Softtool

فهرست مقالات فارسی

RSS چیست و چه کاربردی دارد؟

زمینه: | XML
تاریخ انتشار: | 26 تیر 1383
مشاهده: | 503 بار
نویسنده: | محسن طالب
سایت: | weblog.mohsentaleb.com
تاریخ ثبت: | 20 خرداد 1384

مشاهده مقاله
Search


iDevCenter - ‫نحوه ساختن و خواندن اسناد RSS در PHP

فهرست مقالات فارسی

نحوه ساختن و خواندن اسناد RSS در PHP

زمینه: | XML
تاریخ انتشار: | 28 تیر 1383
مشاهده: | 191 بار
نویسنده: | محسن طالب
سایت: | weblog.mohsentaleb.com
تاریخ ثبت: | 20 خرداد 1384

مشاهده مقاله
Search


iDevCenter - ‫Semantic Web؛ وقتی اینترنت دیگه می فهمه!

Softtool

فهرست مقالات فارسی

Semantic Web؛ وقتی اینترنت دیگه می فهمه!

زمینه: | [Misc]
تاریخ انتشار: | 1 مرداد 1383
مشاهده: | 119 بار
نویسنده: | محسن طالب
سایت: | weblog.mohsentaleb.com
تاریخ ثبت: | 20 خرداد 1384

مشاهده مقاله
Search


iDevCenter - ‫ساختن لینکدونی با تعداد دفعات کلیک در PHP

فهرست مقالات فارسی

ساختن لینکدونی با تعداد دفعات کلیک در PHP

زمینه: | PHP
تاریخ انتشار: | 11 مرداد 1383
مشاهده: | 243 بار
نویسنده: | محسن طالب
سایت: | weblog.mohsentaleb.com
تاریخ ثبت: | 20 خرداد 1384

مشاهده مقاله
Search


iDevCenter - ‫مفاهیم Encryption و رمزگذاری بر روی اطلاعات

فهرست مقالات فارسی

مفاهیم Encryption و رمزگذاری بر روی اطلاعات

زمینه: | [Misc]
تاریخ انتشار: | 16 مرداد 1383
مشاهده: | 199 بار
نویسنده: | محسن طالب
سایت: | weblog.mohsentaleb.com
تاریخ ثبت: | 20 خرداد 1384

مشاهده مقاله
Search


iDevCenter - ‫مستطیل های لبه گرد و CSS

Softtool

فهرست مقالات فارسی

مستطیل های لبه گرد و CSS

زمینه: | HTML/CSS
تاریخ انتشار: | 21 مرداد 1383
مشاهده: | 302 بار
نویسنده: | محسن طالب
سایت: | weblog.mohsentaleb.com
تاریخ ثبت: | 20 خرداد 1384

مشاهده مقاله
Search


iDevCenter - ‫mod_rewrite چیست؟

فهرست مقالات فارسی

mod_rewrite چیست؟

زمینه: | PHP
تاریخ انتشار: | 25 مرداد 1383
مشاهده: | 157 بار
نویسنده: | محسن طالب
سایت: | weblog.mohsentaleb.com
تاریخ ثبت: | 20 خرداد 1384

مشاهده مقاله
Search


iDevCenter - ‫Tab Menu حرفه‌ای و CSS

Softtool

فهرست مقالات فارسی

Tab Menu حرفه‌ای و CSS

زمینه: | HTML/CSS
تاریخ انتشار: | 29 مرداد 1383
مشاهده: | 253 بار
نویسنده: | محسن طالب
سایت: | weblog.mohsentaleb.com
تاریخ ثبت: | 20 خرداد 1384

مشاهده مقاله
Search


iDevCenter - ‫قدرت CSS: طراحی گالری عکس بدون استفاده از Table

Softtool

فهرست مقالات فارسی

قدرت CSS: طراحی گالری عکس بدون استفاده از Table

زمینه: | HTML/CSS
تاریخ انتشار: | 3 شهریور 1383
مشاهده: | 261 بار
نویسنده: | محسن طالب
سایت: | weblog.mohsentaleb.com
تاریخ ثبت: | 20 خرداد 1384

مشاهده مقاله
Search


iDevCenter - ‫ مقیاس‌ها در CSS

فهرست مقالات فارسی

مقیاس‌ها در CSS

زمینه: | HTML/CSS
تاریخ انتشار: | 9 شهریور 1383
مشاهده: | 172 بار
نویسنده: | محسن طالب
سایت: | weblog.mohsentaleb.com
تاریخ ثبت: | 20 خرداد 1384

مشاهده مقاله
Search


iDevCenter - ‫استانداردهای وب: DOCTYPE

Softtool

فهرست مقالات فارسی

استانداردهای وب: DOCTYPE

زمینه: | HTML/CSS
تاریخ انتشار: | 12 شهریور 1383
مشاهده: | 110 بار
نویسنده: | محسن طالب
سایت: | weblog.mohsentaleb.com
تاریخ ثبت: | 5 تیر 1384

مشاهده مقاله
Search


iDevCenter - ‫استانداردهای وب: Width در مرورگرهای مختلف

فهرست مقالات فارسی

استانداردهای وب: Width در مرورگرهای مختلف

زمینه: | HTML/CSS
تاریخ انتشار: | 24 شهریور 1383
مشاهده: | 199 بار
نویسنده: | محسن طالب
سایت: | weblog.mohsentaleb.com
تاریخ ثبت: | 5 تیر 1384

مشاهده مقاله
Search


iDevCenter - ‫تابع ()Mail در PHP

فهرست مقالات فارسی

تابع ()Mail در PHP

زمینه: | PHP
تاریخ انتشار: | 22 مهر 1383
مشاهده: | 198 بار
نویسنده: | محسن طالب
سایت: | weblog.mohsentaleb.com
تاریخ ثبت: | 5 تیر 1384

مشاهده مقاله
Search


iDevCenter - ‫عکسهای سایه دار و CSS

فهرست مقالات فارسی

عکسهای سایه دار و CSS

زمینه: | HTML/CSS
تاریخ انتشار: | 30 مهر 1383
مشاهده: | 275 بار
نویسنده: | محسن طالب
سایت: | weblog.mohsentaleb.com
تاریخ ثبت: | 5 تیر 1384

مشاهده مقاله
Search


iDevCenter - ‫ایجاد Watermark محو روی تصاویر

Softtool

فهرست مقالات فارسی

ایجاد Watermark محو روی تصاویر

زمینه: | HTML/CSS
تاریخ انتشار: | 23 آبان 1383
مشاهده: | 255 بار
نویسنده: | محسن طالب
سایت: | weblog.mohsentaleb.com
تاریخ ثبت: | 5 تیر 1384

مشاهده مقاله
Search


iDevCenter - ‫نگاهی به الگوریتم RSA (قسمت اول)

Softtool

فهرست مقالات فارسی

نگاهی به الگوریتم RSA (قسمت اول)

زمینه: | [Misc]
تاریخ انتشار: | 20 تیر 1384
مشاهده: | 207 بار
نویسنده: | ؟
سایت: | www.ipnetsecurity.com
تاریخ ثبت: | 22 تیر 1384

مشاهده مقاله
Search


iDevCenter - ‫نگاهی به الگوریتم RSA (قسمت دوم)

فهرست مقالات فارسی

نگاهی به الگوریتم RSA (قسمت دوم)

زمینه: | [Misc]
تاریخ انتشار: | 21 تیر 1384
مشاهده: | 167 بار
نویسنده: | ؟
سایت: | www.ipnetsecurity.com
تاریخ ثبت: | 22 تیر 1384

مشاهده مقاله
Search


iDevCenter - ‫مقدمه‌ای بر توسعه وب توسط MySQL ،Apache و PHP

فهرست مقالات فارسی

مقدمه‌ای بر توسعه وب توسط MySQL ،Apache و PHP

زمینه: | Databases / PHP
تاریخ انتشار: | 30 اردیبهشت 1384
مشاهده: | 233 بار
نویسنده: | امیر محمد سعید
سایت: | www.iranamp.com
تاریخ ثبت: | 22 تیر 1384

مشاهده مقاله
Search


iDevCenter - ‫کدنویسی استاندارد در PHP

Softtool

فهرست مقالات فارسی

کدنویسی استاندارد در PHP

زمینه: | PHP
تاریخ انتشار: | 6 خرداد 1383
مشاهده: | 274 بار
نویسنده: | امیر محمد سعید
سایت: | www.iranamp.com
تاریخ ثبت: | 22 تیر 1384

مشاهده مقاله
Search


iDevCenter - ‫اصول طراحی پایگاه‌های اطلاعاتی

Softtool

فهرست مقالات فارسی

اصول طراحی پایگاه‌های اطلاعاتی

زمینه: | Databases
تاریخ انتشار: | 21 خرداد 1383
مشاهده: | 524 بار
نویسنده: | امیر محمد سعید
سایت: | www.iranamp.com
تاریخ ثبت: | 22 تیر 1384

مشاهده مقاله
Search


iDevCenter - ‫آشنایی با انواع جداول موجود در MySQL

Softtool

فهرست مقالات فارسی

آشنایی با انواع جداول موجود در MySQL

زمینه: | Databases
تاریخ انتشار: | 18 تیر 1383
مشاهده: | 293 بار
نویسنده: | امیر محمد سعید
سایت: | www.iranamp.com
تاریخ ثبت: | 22 تیر 1384

مشاهده مقاله
Search


iDevCenter - پروژه‌ها

پروژه‌ها

در این قسمت می‌توانید پروژه‌های مختلفی را که با حمایت سایت iDevCenter.com به انجام رسیده و یا در حال اجرا است را مشاهده کنید.

  • Iran Localization Info for Microsoft .NET Framework
    اصلاح مشکلات زبان فارسی و کشور ایران در کلاس‌های مربوط به جهانی‌سازی در NET.
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - Iran Localization Info for Microsoft .NET

Iran Localization Info for Microsoft .NET

اصلاح مشکلات زبان فارسی و کشور ایران در کلاس‌های مربوط به جهانی‌سازی در NET.

مقدمه

NET. سکوی نرم‌افزاری جدید مایکروسافت برای توسعه‌دهندگان وب و برنامه‌های کاربردی است. در واقع، NET. مجموعه‌ای از سرویس‌های مختلف است که به برنامه نویسان اجازه می‌دهد به آسانی برای محیط‌های گوناگون مانند وب، ویندوز و حتی ابزارهای هوشمند مانند موبایل‌ها و PDAها برنامه نویسی کنند. بنابر گفته‌های مایکروسافت و شواهد موجود، NET. تا چندی دیگر به پایه و اساس برنامه نویسی (حداقل برای سیستم عامل ویندوز) تبدیل خواهد شد و تمام نرم‌افزارها و سیستم‌های نرم‌افزاری بر اساس این فناوری توسعه خواهند یافت.

یکی از قابلیت‌های NET. پشتیبانی از جهانی سازی است. جهانی سازی به معنی تولید یک نرم‌افزار برای استفاده توسط چندین زبان و ملیت گوناگون است. NET. با پشتیبانی کامل از جهانی سازی، به برنامه نویسان این امکان را می‌دهد که به آسانی و به سرعت برنامه‌های خود را برای طیف وسیعی از زبان‌ها و ملیت‌ها عرضه کنند. بنابر این عرضه نسخه فارسی نرم‌افزارهای مختلف و معروف تا چند وقت دیگر چندان دور از ذهن نخواهد بود. اما در این راه مشکلی وجود دارد!

اضافه کردن قابلیت پشتیبانی از یک زبان خاص به یک نرم‌افزار تنها به ترجمه متون و المان‌های تصویری مانند منوها و دکمه‌ها محدود نمی‌شود؛ بلکه مرحله بسیار مهم دیگری نیز وجود دارد و آن نمایش اطلاعات مطابق فرهنگ و روش نوشتاری آن زبان و کشور است. برای مثال فرض کنید یک برنامه مالی برای استفاده در کشورهای آمریکا، فرانسه و ایران تهیه شده است و این برنامه می‌خواهد مقدار 1000 را به کاربر نشان دهد؛ در این حالت برنامه باید عبارت "1000$" را به کاربر آمریکایی، عبارت "€ 1000" را به کاربر فرانسوی و عبارت "1000 ریال" را به کاربر ایرانی نشان دهد. از دیگر اطلاعات خاص هر کشور می‌توان به تقویم رسمی، نام روزهای هفته و ماه‌های سال، نحوه نوشتن تاریخ و زمان، کاراکتر ممیز، کاراکتر جداکننده اعداد و... اشاره کرد.

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

با این کار نسخه‌های آتی ویندوز و دیگر نرم‌افزارها به طور کامل قادر به پشتیبانی از زبان فارسی خواهند بود و دیگر نرم‌افزار مدیریت اطلاعاتتان به شما نخواهد گفت: "روز Sunday یک قرار ملاقات دارید"!

درباره این پروژه

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

گرچه این پروژه به سازمان و شرکت خاصی وابسته نیست و حامی اصلی آن سایت iDevCenter.com است، اما حمایت سازمان‌های معتبر و دانشگاه‌ها و نشریات کمک بزرگی به پیشبرد این پروژه خواهد کرد و به گرمی از آن استقبال می‌شود. جهت اطلاعات بیشتر و یا در صورتی که قصد حمایت از این پروژه را دارید با آدرس تماس بگیرید.

وضعیت فعلی پروژه

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

Suggestion Details: Iran Localization Info for Microsoft .NET Framework (CultureInfo for fa-IR)

بنابر گفته مایکروسافت، تغییراتی از جمله اصلاح EnglishName ،DisplayName و Nativename انجام شده است اما تغییرات دیگر قابل اعمال برای نسخه NET 2.0. نیستند و به نگارش بعدی موکول خواهند شد.

اطلاعات فنی

در NET. کلاس CultureInfo مسئول ارائه اطلاعات مربوط به کشورها و زبان‌های مختلف است. این کلاس خود اطلاعات را در قالب چهار کلاس دیگر عرضه می‌کند که این کلاس‌ها عبارتند از: DateTimeFormatInfo ،NumberFormatInfo ،TextInfo و CompareInfo. با توجه به تحقیقات انجام شده، کلاس‌های TextInfo و CompareInfo مشکلی ندارد و به درستی کار می‌کنند. بنابراین تنها کلاس‌های CultureInfo ،DateTimeFormatInfo و NumberFormatInfo باید اصلاح شوند.

کلاس CultureInfo مسئول ارائه اطلاعات کلی درباره یک کشور و زبان خاص است؛ مانند نام و تقویم رسمی. کلاس DateTimeFormatInfo مسئول ارائه اطلاعات در مورد نحوه نگارش تاریخ و زمان است؛ مانند نام روزهای هفته و نشانگر قبل از ظهر و بعد از ظهر. و بالاخره کلاس NumberFormatInfo نیز مسئول ارائه اطلاعات در مورد نحوه نگارش اعداد است؛ مانند واحد پول و کاراکتر ممیز.

برای آشنایی بیشتر با این کلاس‌ها و همچنین مشاهده اطلاعات آنها در مورد زبان فارسی و کشور ایران (که بعضی از آنها اشتباه است) می‌توانید از ابزار Culture Browser استفاده کنید. این ابزار اطلاعات را به طور پویا از کلاس‌های NET. نسخه 1.1 استخراج می‌کند.

نسخه پیش‌نویس

در هر زمان می‌توانید جدیدترین نسخه پیش‌نویس را در آدرس زیر مشاهده کنید:

Iran Localization Info for Microsoft .NET Framework (Preliminary Draft)

منابع و لینک‌ها

لیست زیر شامل سایت‌ها و مطالبی است که یا از آنها به نحوی برای این پروژه کمک گرفته شده است و یا شامل نکات مفیدی در این زمینه می‌باشند. مطالعه این مطالب برای کسانی که قصد همکاری با این پروژه را دارند، بسیار مفید خواهد بود.

  • Persian Information Interchange Standard for Unicode
  • Persian word processing
  • Review of System.Globalization.CultureInfo
  • Developing World-Ready Ready Applications for Applications, By Houman Pournasseh
  • Some articles about the Persian calendar
  • Farsi or Persian? 1 2 3 4

همکاران

در زیر لیستی از اشخاصی که در شکل گیری و تکامل این پروژه نقش داشته‌اند را مشاهده می‌کنید:

  • امید خندان راد
  • سهیل رشیدی
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter :: Culture Browser (CultureInfo View)

 Culture Browser
CultureInfo View

Select a culture from the list below to retrieve its culture information:

Property | Value
Name | fa-IR
LCID | 0x429
English Name | Persian (Iran)
Display Name | Persian (Iran)
Native Name | فارسى (ايران)
Is Neutral Culture | False
Two-Letter ISO Language Name | fa
Three-Letter ISO Language Name | fas
Three-Letter Windows Language Name | FAR
Parent | fa
Calendar (default) | Gregorian Calendar (U S English)
Optional Calendars | Gregorian Calendar (U S English) Gregorian Calendar (Localized) Hijri Calendar Gregorian Calendar (Transliterated English)
Date Time Format | System.Globalization.DateTimeFormatInfo
Number Format | System.Globalization.NumberFormatInfo
Text Info | TextInfo - 1065
Compare Info | CompareInfo - 1065

See Also
CultureInfo class | RegionInfo class | System.Globalization namespace

Version Information: Microsoft .NET Framework Version: 2.0.50215.44


iDevCenter :: Culture Browser (DateTimeFormat View)

 Culture Browser
DateTimeFormat View

Select a culture and one of the optional calendars to retrieve its date time format information:
View CultureInfo

Property | Value
Day Names | Sunday Monday Tuesday Wednesday Thursday Friday Saturday
Abbreviated Day Names | Sun Mon Tue Wed Thu Fri Sat
Month Names | January February March April May June July August September October November December
Abbreviated Month Names | Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
Calendar | Gregorian Calendar (U S English)
Calendar Week Rule | FirstDay
First Day Of Week | Sunday
Is Read Only | False
Date Separator | /
Time Separator | :
AM Designator | ق.ظ
PM Designator | ب.ظ
Short Date Pattern | M/d/yyyy
Short Time Pattern | hh:mm tt
Long Date Pattern | dddd, MMMM dd, yyyy
Long Time Pattern | hh:mm:ss tt
Full DateTime Pattern | dddd, MMMM dd, yyyy hh:mm:ss tt
MonthDay Pattern | MMMM dd
YearMonth Pattern | MMMM, yyyy
RFC1123 Pattern | ddd, dd MMM yyyy HH':'mm':'ss 'GMT'
Sortable DateTime Pattern | yyyy'-'MM'-'dd'T'HH':'mm':'ss
Universal Sortable DateTime Pattern | yyyy'-'MM'-'dd HH':'mm':'ss'Z'

See Also
DateTimeFormatInfo Members | Formatting Overview | Standard DateTime Format Strings | Custom DateTime Format Strings

Version Information: Microsoft .NET Framework Version: 2.0.50215.44


iDevCenter :: Culture Browser (DateTimeFormat View)

 Culture Browser
DateTimeFormat View

Select a culture and one of the optional calendars to retrieve its date time format information:
View CultureInfo

Property | Value
Day Names | يكشنبه دوشنبه سه شنبه چهارشنبه پنجشنبه جمعه شنبه
Abbreviated Day Names | يكشنبه دوشنبه سه شنبه چهارشنبه پنجشنبه جمعه شنبه
Month Names | ژانويه فوريه مارس آوريل مى ژوئن ژوئيه اوت سپتامبر اُكتبر نوامبر دسامبر
Abbreviated Month Names | ژانويه فوريه مارس آوريل مى ژوئن ژوئيه اوت سپتامبر اُكتبر نوامبر دسامبر
Calendar | Gregorian Calendar (Localized)
Calendar Week Rule | FirstDay
First Day Of Week | Sunday
Is Read Only | False
Date Separator | /
Time Separator | :
AM Designator | ق.ظ
PM Designator | ب.ظ
Short Date Pattern | yyyy/MM/dd
Short Time Pattern | hh:mm tt
Long Date Pattern | yyyy/MM/dd
Long Time Pattern | hh:mm:ss tt
Full DateTime Pattern | yyyy/MM/dd hh:mm:ss tt
MonthDay Pattern | dd MMMM
YearMonth Pattern | yyyy/MM
RFC1123 Pattern | ddd, dd MMM yyyy HH':'mm':'ss 'GMT'
Sortable DateTime Pattern | yyyy'-'MM'-'dd'T'HH':'mm':'ss
Universal Sortable DateTime Pattern | yyyy'-'MM'-'dd HH':'mm':'ss'Z'

See Also
DateTimeFormatInfo Members | Formatting Overview | Standard DateTime Format Strings | Custom DateTime Format Strings

Version Information: Microsoft .NET Framework Version: 2.0.50215.44


iDevCenter :: Culture Browser (DateTimeFormat View)

 Culture Browser
DateTimeFormat View

Select a culture and one of the optional calendars to retrieve its date time format information:
View CultureInfo

Property | Value
Day Names | الاحد الاثنين الثلاثاء الاربعاء الخميس الجمعة السبت
Abbreviated Day Names | الاحد الاثنين الثلاثاء الاربعاء الخميس الجمعة السبت
Month Names | محرم صفر ربيع الأول ربيع الثاني جمادى الأولى جمادى الثانية رجب شعبان رمضان شوال ذو القعدة ذو الحجة
Abbreviated Month Names | محرم صفر ربيع الاول ربيع الثاني جمادى الاولى جمادى الثانية رجب شعبان رمضان شوال ذو القعدة ذو الحجة
Calendar | Hijri Calendar
Calendar Week Rule | FirstDay
First Day Of Week | Sunday
Is Read Only | False
Date Separator | /
Time Separator | :
AM Designator | ق.ظ
PM Designator | ب.ظ
Short Date Pattern | dd/MM/yy
Short Time Pattern | hh:mm tt
Long Date Pattern | dd/MMMM/yyyy
Long Time Pattern | hh:mm:ss tt
Full DateTime Pattern | dd/MMMM/yyyy hh:mm:ss tt
MonthDay Pattern | dd MMMM
YearMonth Pattern | MMMM, yyyy
RFC1123 Pattern | ddd, dd MMM yyyy HH':'mm':'ss 'GMT'
Sortable DateTime Pattern | yyyy'-'MM'-'dd'T'HH':'mm':'ss
Universal Sortable DateTime Pattern | yyyy'-'MM'-'dd HH':'mm':'ss'Z'

See Also
DateTimeFormatInfo Members | Formatting Overview | Standard DateTime Format Strings | Custom DateTime Format Strings

Version Information: Microsoft .NET Framework Version: 2.0.50215.44


iDevCenter :: Culture Browser (DateTimeFormat View)

 Culture Browser
DateTimeFormat View

Select a culture and one of the optional calendars to retrieve its date time format information:
View CultureInfo

Property | Value
Day Names | الاحد الاثنين الثلاثاء الاربعاء الخميس الجمعة السبت
Abbreviated Day Names | الاحد الاثنين الثلاثاء الاربعاء الخميس الجمعة السبت
Month Names | يناير فبراير مارس ابريل مايو يونيو يوليو اغسطس سبتمبر اكتوبر نوفمبر ديسمبر
Abbreviated Month Names | يناير فبراير مارس ابريل مايو يونيو يوليو اغسطس سبتمبر اكتوبر نوفمبر ديسمبر
Calendar | Gregorian Calendar (Transliterated English)
Calendar Week Rule | FirstDay
First Day Of Week | Sunday
Is Read Only | False
Date Separator | /
Time Separator | :
AM Designator | ق.ظ
PM Designator | ب.ظ
Short Date Pattern | MM/dd/yyyy
Short Time Pattern | hh:mm tt
Long Date Pattern | dddd, MMMM dd, yyyy
Long Time Pattern | hh:mm:ss tt
Full DateTime Pattern | dddd, MMMM dd, yyyy hh:mm:ss tt
MonthDay Pattern | MMMM dd
YearMonth Pattern | MMMM, yyyy
RFC1123 Pattern | ddd, dd MMM yyyy HH':'mm':'ss 'GMT'
Sortable DateTime Pattern | yyyy'-'MM'-'dd'T'HH':'mm':'ss
Universal Sortable DateTime Pattern | yyyy'-'MM'-'dd HH':'mm':'ss'Z'

See Also
DateTimeFormatInfo Members | Formatting Overview | Standard DateTime Format Strings | Custom DateTime Format Strings

Version Information: Microsoft .NET Framework Version: 2.0.50215.44


iDevCenter :: Culture Browser (NumberFormat View)

 Culture Browser
NumberFormat View

Select a culture to retrieve its number format information:
View CultureInfo

Properties | Value
Currency Decimal Digits | 2
Currency Decimal Separator | /
Currency Group Separator | ,
Currency Group Sizes | 3
Currency Negative Pattern | 3
Currency Positive Pattern | 2
Currency Symbol | ريال
Is Read Only | False
NaN Symbol | NaN
Negative Infinity Symbol | -Infinity
Negative Sign | -
Number Decimal Digits | 2
Number Decimal Separator | .
Number Group Separator | ,
Number Group Sizes | 3
Number Negative Pattern | 3
Percent Decimal Digits | 2
Percent Decimal Separator | .
Percent Group Separator | ,
Percent Group Sizes | 3
Percent Negative Pattern | 0
Percent Positive Pattern | 0
Percent Symbol | %
Per-Mille Symbol | ‰
Positive Infinity Symbol | Infinity
Positive Sign | +

See Also
NumberFormatInfo Members | Formatting Overview | Standard Number Format Strings | Custom Number Format Strings

Version Information: Microsoft .NET Framework Version: 2.0.50215.44


Iran L10n Info for Microsoft .NET Framework

 Iran Localization Info for Microsoft .NET Framework
This draft is preliminary and subject to change.
Last updated on: Wednesday, November 3, 2004 12:15 (GMT+03:30)
iranl10ninfo@idevcenter.com

Table Of Contents
  • Introduction
  • About us
  • 1. Iran Culture Info
  • 2. Iran Number Format Info
  • 3. Iran DateTime Format Info
  • 3.1. Calendars
  • 3.2. DateTime Naming and Patterns
  • See Also

Introduction
The .NET framework comes with a set of tools and large support for localizing applications, as well as providing the required classes holding the essential locale information that help developers do this task as painless as possible. It is important that whenever we have to show the user dates, times, monetary values, or numbers, we use these globalization features in .NET. These features use the globalization settings in Windows to properly format these values into strings for display.

Localization in .NET is managed by the System.Globalization namespace, and the bundle to use to retrieve the locale info for a culture is the System.Globalization.CultureInfo class. While we can use the CultureInfo class to obtain some predefined culture information, they could only be useful for us when they are true.

About us
We are a group of Iranian developers who care for their IT culture. We are not an affiliate or a liaison of any beneficial organization, however, looking forward to receive directional and intellectual hands from valid authorities and professionals.

1. Iran Culture Info
The following is a listing of the public non-static properties of the CultureInfo class. For a full description on this class please see System.Globalization.CultureInfo in MSDN.

public Calendar Calendar { virtual get; }
public CompareInfo CompareInfo { virtual get; }
public DateTimeFormatInfo DateTimeFormat { virtual get; virtual set; }
public string DisplayName { virtual get; }
public string EnglishName { virtual get; }
public bool IsNeutralCulture { virtual get; }
public bool IsReadOnly { get; }
public int LCID { virtual get; }
public string Name { virtual get; }
public string NativeName { virtual get; }
public NumberFormatInfo NumberFormat { virtual get; virtual set; }
public Calendar[] OptionalCalendars { virtual get; }
public CultureInfo Parent { virtual get; }
public TextInfo TextInfo { virtual get; }
public string ThreeLetterISOLanguageName { virtual get; }
public string ThreeLetterWindowsLanguageName { virtual get; }
public string TwoLetterISOLanguageName { virtual get; }
public bool UseUserOverride { get; }

Assuming that we have an object faIR declared as:

CultureInfo faIR = new System.Globalization.CultureInfo("fa-IR");

The following table lists the above properties and their return values when dynamically questioning faIR. The second column shows the values returned by the .NET 1.1, if it is any other than what is expected, the correct value is shown in the third column. You can also view the current values using the Culture Browser tool.

Property | .NET 1.1 return value | Expected return value
Name | "fa-IR" |
LCID | 1065 |
English Name | "Farsi (Iran)" | "Persian (Iran)" [1.1]
Display Name | "Farsi (Iran)" | "Persian (Iran)" [1.1]
Native Name | "فارسى (ايران)" | "فارسی (ایران)" [1.2]
Is Neutral Culture | false |
Two Letter ISO Language Name | "fa" |
Three Letter ISO Language Name | "Fas" |
Three Letter Windows Language Name | "FAR" |
Parent | new System.Globalization.CultureInfo("fa") |
Calendar | An instance of System.Globalization.GregorianCalendar subtype Localized (TransliteratedFrench) | An instance of System.Globalization.JalaaliCalendar [3.1.1]
Optional Calendars [3.1] | An array of calendars: - System.Globalization.GregorianCalendar subtype USEnglish - System.Globalization.GregorianCalendar subtype Localized (TransliteratedFrench) - System.Globalization.HijriCalendar - System.Globalization.GregorianCalendar subtype TransliteratedEnglish | An array of calendars: [3.1.2] - System.Globalization.JalaaliCalendar - System.Globalization.GregorianCalendar subtype Localized (TransliteratedFrench) - System.Globalization.GregorianCalendar subtype USEnglish - System.Globalization.GregorianCalendar subtype MiddleEastFrench - System.Globalization.HijriCalendar - System.Globalization.GregorianCalendar subtype TransliteratedEnglish
DateTime Format | An instance of System.Globalization.DateTimeFormatInfo | An instance of System.Globalization.DateTimeFormatInfo [3]
Number Format | An instance of System.Globalization.NumberFormatInfo | An instance of System.Globalization.NumberFormatInfo [2]
Text Info | An instance of System.Globalization.TextInfo [1.3] |
Compare Info | An instance of System.Globalization.CompareInfo [1.3] |
Is Read Only | False |
Use User Override | False |

Please note that the return value of IsReadOnly and UseUserOverride properties may vary depending on how the object is constructed.

Descriptions

[1.1]
Using the word "Farsi" in English is technically wrong. The Academy of Persian Language and Literature in Tehran has strongly suggested using the word "Persian" as the English name of Iran's official language.

References on this issue:
ISO 639 Language Codes and Names
http://students.washington.edu/irina/persianword/tt.htm
http://www.iranian.com/Features/Dec97/Persian/
http://www.persian-language.org/Group/Article.asp?ID=173

[1.2]
According to the Persian Information Interchange Standard for Unicode, the Arabic letter Yeh (U+064A) and Arabic letter Alef Maksura (U+0649) should never be used instead of the Persian letter Yeh (U+06CC). So the correct Unicode sequence for the NativeName is:

<U+0641, U+0627, U+0631, U+0633, U+06CC, U+0020, U+0028, U+0627, U+06CC, U+0631, U+0627, U+0646, U+0029>

[1.3]
We didn't notice any flaws in the returned TextInfo and CompareInfo objects.

2. Iran Number Format Info
The following is a listing of the public non-static properties of the NumberFormatInfo class. For a full description on this class please see System.Globalization.NumberFormatInfo in MSDN.

public int CurrencyDecimalDigits { get; set; }
public string CurrencyDecimalSeparator { get; set; }
public string CurrencyGroupSeparator { get; set; }
public int[] CurrencyGroupSizes { get; set; }
public int CurrencyNegativePattern { get; set; }
public int CurrencyPositivePattern { get; set; }
public string CurrencySymbol { get; set; }
public static NumberFormatInfo CurrentInfo { get; }
public static NumberFormatInfo InvariantInfo { get; }
public bool IsReadOnly { get; }
public string NaNSymbol { get; set; }
public string NegativeInfinitySymbol { get; set; }
public string NegativeSign { get; set; }
public int NumberDecimalDigits { get; set; }
public string NumberDecimalSeparator { get; set; }
public string NumberGroupSeparator { get; set; }
public int[] NumberGroupSizes { get; set; }
public int NumberNegativePattern { get; set; }
public int PercentDecimalDigits { get; set; }
public string PercentDecimalSeparator { get; set; }
public string PercentGroupSeparator { get; set; }
public int[] PercentGroupSizes { get; set; }
public int PercentNegativePattern { get; set; }
public int PercentPositivePattern { get; set; }
public string PercentSymbol { get; set; }
public string PerMilleSymbol { get; set; }
public string PositiveInfinitySymbol { get; set; }
public string PositiveSign { get; set; }

Assuming that we have an object nfi declared as:

NumberFormatInfo nfi = new System.Globalization.CultureInfo("fa-IR").NumberFormat;

The following table lists the above properties and their return values when dynamically questioning nfi. The second column shows the values returned by the .NET 1.1, if it is any other than what is expected, the correct value is shown in the third column as well as its Unicode representation in the next column. You can also view the current values using the Culture Browser tool.

Property | .NET 1.1 return value | Expected return value | Unicode character(s) | Unicode character name
Currency Decimal Digits | 2 | 0 [2.10] |  |
Currency Decimal Separator | / | ٫ [2.1] | U+066B | Arabic Decimal Separator
Currency Group Separator | , | ٬ [2.2] | U+066C | Arabic Thousands Separator
Currency Group Sizes | 3 |  |  |
Currency Negative Pattern | 3 | 13 [2.5] |  |
Currency Positive Pattern | 2 | 3 [2.4] |  |
Currency Symbol | ريال | ریال [2.3] | <U+0631, U+06CC, U+0627, U+0644> |
Is Read Only | False |  |  |
NaN Symbol | NaN |  |  |
Negative Infinity Symbol | -Infinity | -بی‌نهایت [2.9] | <U+002D, U+0628, U+06CC, U+200C, U+0646, U+0647, U+0627, U+06CC, U+062A> |
Negative Sign | - |  |  |
Number Decimal Digits | 2 |  |  |
Number Decimal Separator | . | ٫ [2.1] | U+066B | Arabic Decimal Separator
Number Group Separator | , | ٬ [2.2] | U+066C | Arabic Thousands Separator
Number Group Sizes | 3 |  |  |
Number Negative Pattern | 3 |  |  |
Percent Decimal Digits | 2 |  |  |
Percent Decimal Separator | . | ٫ [2.1] | U+066B | Arabic Decimal Separator
Percent Group Separator | , | ٬ [2.2] | U+066C | Arabic Thousands Separator
Percent Group Sizes | 3 |  |  |
Percent Negative Pattern | 0 | 2 [2.8] |  |
Percent Positive Pattern | 0 | 2 [2.7] |  |
Percent Symbol | % | ٪ [2.6] | U+066A | Arabic Percent Sign
Per-Mille Symbol | ‰ |  |  |
Positive Infinity Symbol | Infinity | +بی‌نهایت [2.9] | <U+002B, U+0628, U+06CC, U+200C, U+0646, U+0647, U+0627, U+06CC, U+062A> |
Positive Sign | + |  |  |

By applying the values in the recent table we should get numbers formatted into the following forms. You can click on each sample to view a larger picture.

 | Positive | Negative
Number |  |
Percent |  |
Currency |  |

Note: National Persian numbers are in the Unicode range U+06F0 through U+06F9.

See also Standard Number Format Strings and Custom Number Format Strings in MSDN.

Descriptions

[2.1]
The Persian Information Interchange Standard for Unicode, defines using the Arabic Decimal Separator (U+066B) to show delimited numbers (except in cases that there is device restrictions such as mobile phones where we can also use the Slash character). The decimal separator is like a forward slash, but almost two-thirds the size and moved half its height lower. The character also needs to be implemented in the new fonts.
See also Persian Numerals.

[2.2]
For the Group Separator properties the Comma character (U+002C) is being used whereas according to the Persian Information Interchange Standard for Unicode, the Arabic Thousands Separator (U+066C) should be used. The thousands separator is apostrophe-like or tick-like, but may take different shapes based on the style of the writer or font. The character also needs to be implemented in the new fonts.
See also Persian Numerals.

[2.3]
According to the Persian Information Interchange Standard for Unicode, the Arabic letter Yeh (U+064A) should never be used instead of the Persian letter Yeh (U+06CC). In addition, Unicode assigns the character code U+FDFC for the Rial Sign which is a ligature of the characters U+0631, U+06CC, U+0627, U+0644. However, the Rial Sign is an optional ligature and should not be used in general interchange. Hence, its character sequence should be used and depending on the application and the rendering system it might be replaced by the "Rial Sign" character.
See also Unicode Ligatures in Arabic scripts.

[2.4]
The Currency Positive Pattern 3 implies 'n $'. When rendered in a Right-to-Left direction, the desired currency format is produced.
See also CurrencyPositivePattern property in MSDN.

[2.5]
The Currency Negative Pattern 13 implies 'n- $'. When rendered in a Right-to-Left direction, the desired currency format is produced.
See also CurrencyNegativePattern property in MSDN.

[2.6]
We used the Arabic Percent Sign here to specify the right character used in Persian. However, in the systems that properly implement the Unicode Bidirectional Algorithm, the Percent Sign (U+0025) is automatically converted to the Arabic Percent Sign (U+066A) according to the context.

[2.7]
The Percent Positive Pattern 2 implies '%n'. In both Left-to-Right and Right-to-Left rendering orders it should produce the correct format.
See also PercentPositivePattern property in MSDN.

[2.8]
The Percent Negative Pattern 2 implies '-%n'. When rendered in a Left-to-Right direction it gives the correct format but not when in Right-to-Left. For Right-to-Left rendering order the pattern should be like '%n-' but unfortunately it is not yet defined in the PercentNegativePattern property's patterns list.
See also PercentNegativePattern property in MSDN.

[2.9]
For the Positive and Negative Infinity we can also use the '+∞' and '-∞' signs resepectively. The Unicode infinity sign (U+221E) is included in most of the popular fonts.

[2.10]
The Iranian Rial does not have any fractions and the amounts in Rial are rounded to an integer number.

3. Iran DateTime Format Info
The following is a listing of the public non-static properties of the DateTimeFormatInfo class. For a full description on this class please see System.Globalization.DateTimeFormatInfo in MSDN.

public string[] AbbreviatedDayNames { get; set; }
public string[] AbbreviatedMonthNames { get; set; }
public string AMDesignator { get; set; }
public Calendar Calendar { get; set; }
public CalendarWeekRule CalendarWeekRule { get; set; }
public string DateSeparator { get; set; }
public string[] DayNames { get; set; }
public DayOfWeek FirstDayOfWeek { get; set; }
public string FullDateTimePattern { get; set; }
public bool IsReadOnly { get; }
public string LongDatePattern { get; set; }
public string LongTimePattern { get; set; }
public string MonthDayPattern { get; set; }
public string[] MonthNames { get; set; }
public string PMDesignator { get; set; }
public string RFC1123Pattern { get; }
public string ShortDatePattern { get; set; }
public string ShortTimePattern { get; set; }
public string SortableDateTimePattern { get; }
public string TimeSeparator { get; set; }
public string UniversalSortableDateTimePattern { get; }
public string YearMonthPattern { get; set; }

3.1. Calendars

Currently, .NET Framework 1.1 is assigning the following calendars to the specific culture of "fa-IR". You can click on each of the calendar links to view its associated DateTimeFormatInfo information.

System.Globalization.GregorianCalendar subtype USEnglish
System.Globalization.GregorianCalendar subtype Localized (TransliteratedFrench)
System.Globalization.HijriCalendar
System.Globalization.GregorianCalendar subtype TransliteratedEnglish [3.1.2]

.NET Framework 1.2 (Whidbey) is supposed to embrace the System.Globalization.JalaaliCalendar [3.1.1] class which implements the major calendar in use in Iran. We suggest the following as the optional calendars for the locale of "fa-IR" with JalaaliCalendar as the default calendar.

Index | Optional Calendars
0 | Calendar: System.Globalization.JalaaliCalendar (default) Calendar Native Name: تقویم هجری شمسی (جلالی) Day Names: یکشنبه دوشنبه سه‌شنبه چهارشنبه پنجشنبه جمعه شنبه Month Names: فروردین اردیبهشت خرداد تیر مرداد شهریور مهر آبان آذر دی بهمن اسفند
1 [3.1.3] | Calendar: System.Globalization.GregorianCalendar subtype Localized (TransliteratedFrench) Calendar Native Name: تقویم میلادی (برگردان فرانسوی) Day Names: یکشنبه دوشنبه سه‌شنبه چهارشنبه پنجشنبه جمعه شنبه Month Names: ژانویه فوریه مارس آوریل مه ژوئن ژوئیه اوت سپتامبر اُکتبر نوامبر دسامبر
2 | Calendar: System.Globalization.GregorianCalendar subtype USEnglish Calendar Native Name: تقویم میلادی (انگلیسی) Day Names: Sunday Monday Tuesday Wednesday Thursday Friday Saturday Month Names: January February March April May June July August September October November December
3 | Calendar: System.Globalization.GregorianCalendar subtype MiddleEastFrench Calendar Native Name: تقویم میلادی (فرانسوی) Day Names: dimanche lundi mardi mercredi jeudi vendredi samedi Month Names: janvier février mars avril mai juin juillet août septembre octobre novembre décembre
4 [3.1.4] | Calendar: System.Globalization.HijriCalendar Calendar Native Name: تقویم هجری (قمری) Day Names: یکشنبه دوشنبه سه‌شنبه چهارشنبه پنجشنبه جمعه شنبه Month Names: محرم صفر ربیع الاول ربیع الثانی جمادى الاول جمادى الثانی رجب شعبان رمضان شوال ذوالقعده ذوالحجه
5 | Calendar: System.Globalization.GregorianCalendar subtype TransliteratedEnglish Calendar Native Name: تقویم میلادی (برگردان انگلیسی) Day Names: یکشنبه دوشنبه سه‌شنبه چهارشنبه پنجشنبه جمعه شنبه Month Names: جنیوری فبریوری مارچ ایپریل می جون جولای آگوست سپتمبر اُکتوبر نومبر دیسمبر

Descriptions

[3.1.1]
The name of the modern calendar (the developed Jalaali calendar) in use in Iran today is actually Hejri-Shamsi or Khorshidi, and it is internationally known as the Persian calendar or the Iranian calendar. The Jalaali calendar refers to an era other than the Persian calendar. However, since this is only an informational draft we don’t suggest any strict name for it and we used Microsoft’s choice (i.e. Jalaali calendar) during this context.

See also the XML documentation for the PersianCalendar class.
Download the PersianCalendar class code sample.

[3.1.2]
.NET Framework 1.1 defines Gregorian Calendar subtype Transliterated English as one of the optional calendars of "fa-IR", but it is actually an Arabic transliterated English which is not used in Iran. We usually use the Transliterated French of the Gregorian calendar, however its Persian transliterated English looks like the index 5 in the calendars table above.

[3.1.3]
The transliterated French form of the month name May is "مه" <U+0645 , U+0647> in Persian.

[3.1.4]
In the Hijri calendar used in Iran, weekdays are the same as in the Persian (Jalaali) calendar and for the month names only Persian letters are used as in index 4 in the table above.

3.2. DateTime Naming and Patterns

Assuming that we have an object dtfi declared as:

DateTimeFormatInfo dtfi = new System.Globalization.CultureInfo("fa-IR").DateTimeFormat;
dtfi.Calendar = new System.Globalization.JalaaliCalendar();

The following table lists the above properties and their suggested return values when dtfi is set to use the Jalaali Calendar.

Property | Value | Unicode
Day Names | یکشنبه [3.2.1] دوشنبه سه‌شنبه [3.2.2] چهارشنبه پنجشنبه جمعه شنبه | <U+06CC, U+06A9, U+0634, U+0646, U+0628, U+0647> <U+062F, U+0648, U+0634, U+0646, U+0628, U+0647> <U+0633, U+0647, U+200C, U+0634, U+0646, U+0628, U+0647> <U+0686, U+0647, U+0627, U+0631, U+0634, U+0646, U+0628, U+0647> <U+067E, U+0646, U+062C, U+0634, U+0646, U+0628, U+0647> <U+062C, U+0645, U+0639, U+0647> <U+0634, U+0646, U+0628, U+0647>
Abbreviated Day Names [3.2.3] | یکشنبه [3.2.1] دوشنبه سه‌شنبه [3.2.2] چهارشنبه پنجشنبه جمعه شنبه | <U+06CC, U+06A9, U+0634, U+0646, U+0628, U+0647> <U+062F, U+0648, U+0634, U+0646, U+0628, U+0647> <U+0633, U+0647, U+200C, U+0634, U+0646, U+0628, U+0647> <U+0686, U+0647, U+0627, U+0631, U+0634, U+0646, U+0628, U+0647> <U+067E, U+0646, U+062C, U+0634, U+0646, U+0628, U+0647> <U+062C, U+0645, U+0639, U+0647> <U+0634, U+0646, U+0628, U+0647>
Month Names | فروردین اردیبهشت خرداد تیر مرداد شهریور مهر آبان آذر دی بهمن اسفند | <U+0641, U+0631, U+0648, U+0631, U+062F, U+06CC, U+0646> <U+0627, U+0631, U+062F, U+06CC, U+0628, U+0647, U+0634, U+062A> <U+062E, U+0631, U+062F, U+0627, U+062F> <U+062A, U+06CC, U+0631> <U+0645, U+0631, U+062F, U+0627, U+062F> <U+0634, U+0647, U+0631, U+06CC, U+0648, U+0631> <U+0645, U+0647, U+0631> <U+0622, U+0628, U+0627, U+0646> <U+0622, U+0630, U+0631> <U+062F, U+06CC> <U+0628, U+0647, U+0645, U+0646> <U+0627, U+0633, U+0641, U+0646, U+062F>
Abbreviated Month Names | فروردین اردیبهشت خرداد تیر مرداد شهریور مهر آبان آذر دی بهمن اسفند | <U+0641, U+0631, U+0648, U+0631, U+062F, U+06CC, U+0646> <U+0627, U+0631, U+062F, U+06CC, U+0628, U+0647, U+0634, U+062A> <U+062E, U+0631, U+062F, U+0627, U+062F> <U+062A, U+06CC, U+0631> <U+0645, U+0631, U+062F, U+0627, U+062F> <U+0634, U+0647, U+0631, U+06CC, U+0648, U+0631> <U+0645, U+0647, U+0631> <U+0622, U+0628, U+0627, U+0646> <U+0622, U+0630, U+0631> <U+062F, U+06CC> <U+0628, U+0647, U+0645, U+0646> <U+0627, U+0633, U+0641, U+0646, U+062F>
Calendar | Jalaali Calendar |
Calendar Week Rule | FirstFourDayWeek |
First Day Of Week | Saturday |
Is Read Only | False |
Date Separator | / | U+002F
Time Separator | : | U+003A
AM Designator | صبح | <U+0635, U+0628, U+062D>
PM Designator | ب.ظ | <U+0628, U+002E, U+0638>

Note: The above values are also correct for the Transliterated French and Transliterated English subtypes of the Gregorian calendar, except the MonthNames and AbbreviatedMonthNames that should be similar to the month names in table 3.1.

The rest of the properties describe the different date and time patterns and are listed in the second table.

Property | Value | LTR Sample | RTL Sample
Short Date Pattern | yyyy/M/d | 1382/2/7 | ۱۳۸۲/۲/۷
Short Time Pattern | h:mm tt | 4:31 ب.ظ | ۴:۳۱ ب.ظ
Long Date Pattern | dddd'،' d MMMM yyyy | یکشنبه، 7 اردیبهشت 1382 | یکشنبه، ۷ اردیبهشت ۱۳۸۲
Long Time Pattern | h:mm:ss tt | 4:31:40 ب.ظ | ۴:۳۱:۴۰ ب.ظ
Full DateTime Pattern | dddd dd/MMMM/yyyy h:mm:ss tt | یکشنبه 07/اردیبهشت/1382 4:31:40 ب.ظ | یکشنبه ۰۷/اردیبهشت/۱۳۸۲ ۴:۳۱:۴۰ ب.ظ
MonthDay Pattern | d MMMM | 7 اردیبهشت | ۷ اردیبهشت
YearMonth Pattern | MMMM yyyy | اردیبهشت 1382 | اردیبهشت ۱۳۸۲
RFC1123 Pattern | ddd, dd MMM yyyy HH':'mm':'ss 'GMT' |  |
Sortable DateTime Pattern | yyyy'-'MM'-'dd'T'HH':'mm':'ss |  |
Universal Sortable DateTime Pattern | yyyy'-'MM'-'dd HH':'mm':'ss'Z' |  |

Note: The last three patterns are conventional and are read-only. The above patterns are also correct for the Transliterated French and Transliterated English subtypes of the Gregorian calendar.

See also Standard DateTime Format Strings and Custom DateTime Format Strings in MSDN.

Descriptions

[3.2.1]
According to the Persian Information Interchange Standard for Unicode, the Arabic letter Yeh (U+064A) should never be used instead of the Persian letter Yeh (U+06CC). The same is about the Arabic Kaf (U+0643) and the Persian Keh (U+06A9). This fact should be considered in every script in Persian such as the words ‎"فروردین", ‎"ژانویه", ‎"اُکتبر", ‎"یکشنبه", etc.

[3.2.2]
Please note that the character ZWNJ (U+200C) is used in the word "سه‌شنبه" (Tuesday).

[3.2.3]
There is no abbreviated form for the weekday names in Persian. However, in certain cases such as in the month calendar headers it is acceptable to use the first letter of weekdays. The direction is also from right to left.

آذر ۱۳۸۳
ش | ی | د | س | چ | پ | ج
 | ۱ | ۲ | ۳ | ۴ | ۵ | ۶
۷ | ۸ | ۹ | ۱۰ | ۱۱ | ۱۲ | ۱۳
۱۴ | ۱۵ | ۱۶ | ۱۷ | ۱۸ | ۱۹ | ۲۰
۲۱ | ۲۲ | ۲۳ | ۲۴ | ۲۵ | ۲۶ | ۲۷
۲۸ | ۲۹ | ۳۰ |  |  |  |

See Also
Unicode Range: 0600-06FF
Persian word processing
Review of System.Globalization.CultureInfo
Developing World-Ready Applications for Applications, By Houman Pournasseh
Articles about the calendar

Version History
  • 2004-11-03: [3.2] Short Time Pattern, LTR Sample fixed. (no leading zero)
  • 2004-11-03: Comment [2.1] modified.
  • 2004-10-29: Added comment [3.1.4].
  • 2004-10-29: "امرداد" renamed to "مرداد".
  • 2004-10-29: [3.2] Short Date Pattern, RTL Sample fixed. (year at left)
  • 2004-05-06: Added comment [2.10].
  • 2004-05-06: [2]: Currency Decimal Digits = 0.
  • 2004-05-02: [SeeAlso] modified.
  • 2004-05-02: Comment [3.2.3] modified.
  • 2004-05-02: [3.1] Note 2: modified.
  • 2004-05-01: [3.1] Note 1: removed "and that the FirstDayOfWeek in the Gregorian calendar is always Sunday.".
  • 2004-05-01: [3.2.3]: Month calendar view added.
  • 2004-04-30: Added comment [3.2.3].
  • 2004-04-30: Table [3.2]: "می" changed to "مه".
  • 2004-04-29: Comment [3.2.1] modified.
  • 2004-04-29: [3.2]: AbbreviatedDayNames values changed to full names.
  • 2004-04-26: [1.1]: A reference added.
  • 2004-04-26: "بینهایت" renamed to "بی‌نهایت".
  • 2004-04-26: Comment [3.2.1] modified - Persian Keh.
  • 2004-04-26: All occurences of Arabic Kaf (U+0643) replaced with Persian Keh (U+06A9).
  • 2004-04-24: Comment [3.1.1] modified (see also, download).
  • 2004-04-24: added 'using System.Globalization;' header.
  • 2004-04-24: Added see also 'Standard DateTime Format Strings' and 'Custom DateTime Format Strings'.
  • 2004-04-24: Added see also 'Standard Number Format Strings' and 'Custom Number Format Strings'.
  • 2004-04-24: DateTime LTR and RTL samples added.
  • 2004-04-24: DateTime patterns modified.
  • 2004-04-24: Removed second column in DateTime patterns table.
  • 2004-04-24: Added comment [2.9].
  • 2004-04-24: Added comment [3.2.3].
  • 2004-04-24: Added "Note:" under table [3.2].
  • 2004-04-24: Added comment [3.2.2].
  • 2004-04-24: Added comment [3.2.1].
  • 2004-04-24: "3.2. DateTime Format Info" renamed to "3.2. DateTime Naming and Patterns".
  • 2004-04-24: Table [3.1]: Calendar Native Name in RTL.
  • 2004-04-24: Table [3.1]: (default) indicator added to JalaaliCalendar.
  • 2004-04-24: Table [3.1]: Calendar links removed.
  • 2004-04-24: [3.1]: Calendars linked to Culture Browser's DateTimeFormatView.
  • 2004-04-23: Added comment [2.8].
  • 2004-04-23: Added comment [2.7].
  • 2004-04-23: Added comment [2.6].
  • 2004-04-23: Added comment [2.5].
  • 2004-04-23: Added comment [2.4].
  • 2004-04-23: Added number format samples table.
  • 2004-04-23: Comment [2.2] modified.
  • 2004-04-23: Comment [2.1] modified.
  • 2004-04-23: Table [2] modified.
  • 2004-04-23: Comment [1.3] added.
  • 2004-04-22: [2]: Sample number pics added.
  • 2004-04-22: Table [2]: Sample columns removed.
  • 2004-04-22: Table [2]: -/+Infinity added.
  • 2004-04-22: Table [2]: Percent Sign added.
  • 2004-04-22: Made 'OptionalCalendars' property in table [1] link to [3.1].
  • 2004-04-22: Moved [1.3] to [3.1.1].
  • 2004-04-22: Numbered sections under [3].
  • 2004-04-22: Put NativeName return values in RTL containers.
  • 2004-04-22: Removed 'as well as its Unicode character(s) in the next column' in [1].
  • 2004-04-21: Made calendars link to Culture Browser's DateTimeFormatView.
  • 2004-04-21: Made 'An instance of System.Globalization.DateTimeFormatInfo' in Iran CultureInfo table link to [3].
  • 2004-04-21: Made 'An instance of System.Globalization.NumberFormatInfo' in Iran CultureInfo table link to [2].
  • 2004-04-21: Changed 'Correct return value' to 'Expected return value'.
  • 2004-04-21: Made 'Culture Browser' links to display fa-IR as default.
  • 2004-04-21: Replaced 'CultureInfo Class Structure' with public members of CultureInfo class.
  • 2004-04-20: Changed Culture Browser's url.
  • 2004-04-18: Added <sup> formating for "[x.y]"s.
  • 2004-04-18: [DateTime Format Info] Added "<" & ">" to AM Designator & PM Designator.
  • 2004-04-17: [CultureInfo struct] Added a note for "IsReadOnly" and "UseUserOverride" members.
  • 2004-04-17: [CultureInfo struct] KeyboardLayoutID member removed.
  • 2004-04-17: [1.1]: "our language" replaced with "Iran's official language".
  • 2004-04-15: Initial draft.


iDevCenter - آزمون‌ها

آزمون‌ها

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

عنوان | منبع | تعداد سوالات
آشنایی با HTML | w3schools.com | 15
آشنایی با NET. | dotnetcoders.com | 18
آشنایی با XML | w3schools.com | 20
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫آشنایی با XML

Softtool

آزمون‌ها

سوالات باقیمانده: 19 | زمان: آشنایی با XML
1) XML مخفف چیست؟

Search


iDevCenter - ‫آشنایی با NET.

آزمون‌ها

سوالات باقیمانده: 17 | زمان: آشنایی با NET.
1) کدام فضای‌نام (Namespace) برای دسترسی به پایگاه داده‌ها استفاده میشود؟

Search


iDevCenter - ‫آشنایی با HTML

آزمون‌ها

سوالات باقیمانده: 14 | زمان: آشنایی با HTML
1) HTML مخفف چیست؟

Search


iDevCenter - نکته‌ها

نکته‌ها

هر سه روز یکبار در این بخش یک نکته جالب و کاربردی در رابطه با برنامه نویسی و طراحی وب معرفی می‌شود که قطعا" دانستن آنها برای شما مفید خواهد بود. بنابرین مطمئن شوید که هیچکدام از آنها را از دست ندهید.

نکته امروز:
  • بدست آوردن نام جدول‌های یک دیتابیس Access

نکته‌های گذشته:
  • ریست کردن مقدار Identity یک جدول در SQL Server
Search


iDevCenter - ‫ریست کردن مقدار Identity یک جدول در SQL Server

نکته‌ها

ریست کردن مقدار Identity یک جدول در SQL Server
توسط: SoheilPro
Databases

جهت ریست کردن مقدار Identity یک جدول در SQL Server 2000، می‌توانید از دستور زیر استفاده کنید:

USE pubs
GO
DBCC CHECKIDENT (authors, RESEED, 30)
GO

که در اینجا authors نام جدول مورد نظر و 30 مقدار جدیدی است که شمردن از آن آغاز خواهد شد.
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in


iDevCenter - ‫بدست آوردن نام جدول‌های یک دیتابیس Access

نکته‌ها

بدست آوردن نام جدول‌های یک دیتابیس Access
توسط: SoheilPro
ASP.NET / Databases

با استفاده از Query زیر می‌توانید نام تمام جدول‌های یک دیتابیس از نوع MS Access را بدست بیاورید:

SELECT MSysObjects.Name FROM MSysObjects WHERE MSysObjects.Flags = 0 AND MSysObjects.Type = 1
Search
جستجوگر iDevCenter را به مرورگر Firefox خود اضافه کنید!

Firefox Search Plug-in