PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : شروع پروژه بازی آنلاین - Delphi XE5 & Intaweb 14.0.32 & TMS Intraweb Component & SQL Server - علاقمندان به ما بپیوندند



مجید
19 / May / 2015, 02:01 PM
با سلام
پروژه تمرینی : تولید یک وب اپلیکیشن توسط اینتراوب و دلفی با محتوای بازی کلمات
مواد لازم:
Delphi XE5
Intraweb 14.0.32
TMS IntraWeb Components Pro v5.4.1.1
SQL Server 2008R2 or 2012 or 2014
----------------------------
Host & Domain :
OS : Windows
Disk Space : 100 MB
Traffic : 2 GB
One DB SQL : 2008 R2 or 2012 or 2014 Min 10 MB
برای نام دامین لطفا پیشنهاد دهید
----------------------------
مستندات پروژه
----------------------------
تیم کاری شامل:
تعدادی برنامه نویس دلفی
تعدادی گرافیست
تعدادی طراح صفحات وب (صرفا آشنا به HTML , CSS)
----------------------------
فعلا برای شروع همینا کافیه . ببینیم کیا میان جلو و یا علی میگن!

مجید
20 / May / 2015, 07:44 PM
تا این لحظه 18 بار این موضوع مشاهده شده . و از این 18 بازدید هیچ کس ابراز علاقه نکرده . لطفا اگه کسی به این موضوع علاقه داره به مشاهده اکتفا نکنه و یه نظری ، انتقادی ، پیشنهادی ، اعتراضی ، دادی فریادی چیزی بکنه ما بفهمیم اینجا تنها نیستیم!

admin
22 / May / 2015, 07:35 AM
سلام و درود.
ابتدا تشکر از وقتی که گذاشتید و همچنین ایده ی زیبای پروژه رو مطرح کردید.
بحث بازی آنلاین ، بحث سنگینیه، ولی امکان پذیر...
نام دامین رو به نظر من طوری انتخاب کنید که حداقل Intra داخلش باشه ...
بچه ها عادت دارند ابتدا قسمتی از کار رو ببینند، بعدا بیان جلو ;) اگه امکان داره ابتدا خودتون پروژه رو استارت بزنید تا بقیه هم راغب بشوند ...
بازم تشکر از ایده ی خوبتون

مجید
22 / May / 2015, 02:51 PM
سلام
اگه کسی باشه که بتونه در زمینه هاست کمکمون کنه خیلی عالی میشه. دامنه را هم میتونیم به صورت subdomain از همین هاست کمک شده استفاده کنیم. البته اگه کسی پیدا نشه مجبوریم برای خرید هاست پول جمع کنیم (که فکر میکنم تقریبا محال باشه)

ضمنا با Intraweb 14.0.32 نیازی نیست حتما سراغ ISAPI بریم
سرور های معمولی که دات نت را هم ساپورت میکنند پشتیبانی میشوند
اینجا رو ببینید :
<span style="font-family: trebuchet ms"><font size="3"><font color="Indigo"><b><font color="red">[فقط اعضاء انجمن قادر به مشاهده لینکها و عکسها می باشند <a href="/reg_iran.php" target="_blank">برای عضویت در سایت کلیک کنید</a>]</font></b></font></font></span>

meyti
23 / May / 2015, 01:24 PM
هزینه هاست و دامنه تقریبا چقدرمیشه ؟ بعد حتما اول باید هاست و دومین باشه بعد پروژه شروع بشه !؟ یا میشه شروع کرد بعد به سرور انتقال داد ؟؟

مجید
23 / May / 2015, 06:46 PM
من از دو جا قیمت گرفتم که لینکشو میذارم شما هم برید ببینید :
<span style="font-family: trebuchet ms"><font size="3"><font color="Indigo"><b><font color="red">[فقط اعضاء انجمن قادر به مشاهده لینکها و عکسها می باشند <a href="/reg_iran.php" target="_blank">برای عضویت در سایت کلیک کنید</a>]</font></b></font></font></span>
پلن W001 از همش ارزون تره قیمیت سالانه اش 48 هزار تومان و قیمت شش ماهه اش هم 24 هزار تومانه
قیمت های ایران هاست هم که خیلی بالا بود و امکان تغییر به دلخواه کاربر را نداشت . واسه همین هم سراغ ایران هاست نرفتم.
یک قیمت هم از رادکام گرفتم که تصویرشو براتون میذارم :
161
شما هم از جاهایی که سراغ دارید قیمت بگیرید ببینیم کی ارزون تر میده
دقت داشته باشید که هاست نباید لینوکس باشه . ممکنه ارزونتر باشه ولی به کار ما نمیاد.
ضمنا در مورد الزامی بودن هاست و دامین باید خدمتتون عرض کنم که هیچ الزامی برای وجود هاست و دامین در ابتدا وجود نداره . فقط داشتنشون باعث تسریع در پیشرفت پروژه میشه . فرض کنید هر کدام از اعضاء گروه که بخواد میتونه توی فولدر خودش با کد خودش تست هایی انجام بده و با سرعت بیشتری نتیجه را در اختیار هم تیمی هاش بذاره ضمن اینکه اینطوری افراد جدیدی که مایل باشند نتیجه کار ما رو ببینند دیگه نیازی نیست که سورس پروژه را در اختیار داشته باشند و مثلا دنبال حل کردن مشکلاتی باشند که هر کدام از ما ممکنه درگیرشون بشیم . ضمنا ممکنه این وسط هم کسی پیدا بشه که از کار تیمی ما خوشش بیاد و سفارش یه پروژه قابل توجه بهمون بده . البته محسنات دیگه ای هم داره که الان وقتش نیست دربارش حرف بزنیم . ولی در هر حال تصمیم گیری باید با خرد جمعی باشه و بنده فقط نظر خودمو گفتم .

مجید
27 / May / 2015, 01:47 AM
خب ظاهرا دیگه کسی پا پیش نمیذاره . خرید یا هدیه هاست هم به نظر میاد که منتفی باشه .
اشکالی نداره یه خورده دیگه صبر میکنیم ببینیم واقعا این بحث چقدر طرفدار داره . اگه موضوع انتخاب شده طرفدار نداشته باشه دلیلی برای کلید خوردن وجود نداره .

meyti
27 / May / 2015, 01:01 PM
سلام -
اگه اشتباه نکنم با ایران سرور 6 ماهه و دومین حدود 30 هزار هزینش بشه که فک کنم بین 3 یا 4 نفری که عضو شدن تا حالا رقم بالایی نباشه .
من موافق شروع پروژه ام - حتی اگه 2 نفری هم باشه !

مجید
27 / May / 2015, 01:34 PM
سلام -
اگه اشتباه نکنم با ایران سرور 6 ماهه و دومین حدود 30 هزار هزینش بشه که فک کنم بین 3 یا 4 نفری که عضو شدن تا حالا رقم بالایی نباشه .
من موافق شروع پروژه ام - حتی اگه 2 نفری هم باشه !

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

mrtr0101
27 / May / 2015, 02:11 PM
سلام
به نظر من اینتراوب بیشتر برای اتوماسیون های اداری و وب اپلیکیشن هایی مناسب است که کار با دیتابیس دارند . حالا کسی هم بتونه بازی آنلاین بنویسه جالبه
در مورد هزینه سرور اصلا سراغ این هاست ها نرید . اولا شما در این هاست ها دسترسی کامل به iis ندارید که بتونید تغییرات انجام بدید . و اونها هم چنین اجازه ای به شما نخواهند داد . باید سرور مجازی یا اختصاصی اجاره کنید که هزینه اش بالاست . برای یه پروژه با 20 نفر کاربر آنلاین یه سرور با رم یک گیگ می خواد که هزینه سالیانه اشت 500 هزار تومان است . حالا کاربر ها برن بالا هزینه اش نجومی می شه . من خودم سرور تا 2 میلیون هم اجاره کرده ام .
در کل برای بازی آنلاین شاید انتراوب مناسب نباشد . شاید هم من اطلاع ندارم .
پیشنهاد من اینه بچه ها با هم جمع بشید یه اتوماسیون اداری دبیرخانه بدون کاغذ ویا برنامه هتل داری یا .... بنویسید برای آموزش
با تشکر

meyti
27 / May / 2015, 03:42 PM
منم با اتوماسیون بیشتر موافقم چون چیزی هست که احتمال هست که روزی سفارش داده بشه - اما بازی رو فک نکنم : البته بازی حتما باید گرافیست و خیلی تخصص های دیگه هم باشه تا چیز خوبی دربیاد .
درضمن اگه به جنبه آموزش نگاه داشته باشیم فک کنم بشه با آی پی استاتیک یه کارایی کرد ! و احتیاجی به سرور و دومین نباشه -

مجید
27 / May / 2015, 03:52 PM
سلام
به نظر من اینتراوب بیشتر برای اتوماسیون های اداری و وب اپلیکیشن هایی مناسب است که کار با دیتابیس دارند . حالا کسی هم بتونه بازی آنلاین بنویسه جالبه
در مورد هزینه سرور اصلا سراغ این هاست ها نرید . اولا شما در این هاست ها دسترسی کامل به iis ندارید که بتونید تغییرات انجام بدید . و اونها هم چنین اجازه ای به شما نخواهند داد . باید سرور مجازی یا اختصاصی اجاره کنید که هزینه اش بالاست . برای یه پروژه با 20 نفر کاربر آنلاین یه سرور با رم یک گیگ می خواد که هزینه سالیانه اشت 500 هزار تومان است . حالا کاربر ها برن بالا هزینه اش نجومی می شه . من خودم سرور تا 2 میلیون هم اجاره کرده ام .
در کل برای بازی آنلاین شاید انتراوب مناسب نباشد . شاید هم من اطلاع ندارم .
پیشنهاد من اینه بچه ها با هم جمع بشید یه اتوماسیون اداری دبیرخانه بدون کاغذ ویا برنامه هتل داری یا .... بنویسید برای آموزش
با تشکر

سلام و ممنون که نظر دادید
قصد ما از اجرای پروژه بازی آنلاین ، فقط کسب یک تجربه هست . ممکنه با اجرای این پروژه یک تیم خوب و یکدست تشکیل بشه که بتونه پروژه های بزرگتری را هم اجرا کنه . البته شاید هم همه چیز طوری که دلمون میخواد پیش نره ولی به هر حال قصد داریم با یک پروژه تمرینی کوچک تلاش کنیم تا اولا از هم چیزی یاد بگیریم و دوما اگه شد یک تیم تشکیل بدیم . به امید خدا اگه همه چیز خوب پیش بره بعد از این پروژه میریم سراغ یه پروژه بزرگتر.
در مورد هزینه های هاست که فرمودید حق با شماست . در نسخه های قبلی اینتراوب ، برای انتشار یک وب اپلیکیشن باید سروری در اختیار می بود که حتما از ISAPI پشتیبانی میکرد .و تمامی گفته های شما در مورد IIS , دسترسی ها و هزینه های سرور اختصاصی درسته. اما در نسخه های جدید تر امکان Intraweb Library اضافه شده که ادعا میکنه نیازی به ISAPI نداره و میشه مثل فایل های DLL که حاصل پابلیش یک پروژه C#.net است روی یک هاست معمولی ویندوز اجرا بشه.
لطفا لینک زیر را مطالعه کنید
<span style="font-family: trebuchet ms"><font size="3"><font color="Indigo"><b><font color="red">[فقط اعضاء انجمن قادر به مشاهده لینکها و عکسها می باشند <a href="/reg_iran.php" target="_blank">برای عضویت در سایت کلیک کنید</a>]</font></b></font></font></span>

در همون دو سطر اول توضیح داده که موضوع چیه
فکر میکنم اگه این موضوع صحت داشته باشه و در عمل هم بشه اثباتش کرد دیگه برای اجرای یک وب اپلیکیشن با کیفیت نیازی نیست سراغ سی شارپ و محصولات مایکروسافت رفت . بنده معتقدم امکاناتی که دلفی در اختیار برنامه نویس میذاره قابل قیاس با محصولات مایکروسافت نیست . بنده مدتی (حدودا 2 تا 3 سال) با Visual Studio کلنجار رفتم و چند تا پروژه هم انجام دادم . اما به دلیل فرسایشی بودن کار با محصولات مایکروسافت به دلفی برگشتم و حالا که اینتروب مشکل وابستگی خودشو به ISAPI برطرف کرده دیگه دلیلی نمیبینم که برای اجرای یک وب اپلیکیشن سراغ سی شارپ برم . البته با تواضع کامل به همه برنامه نویسان سی شارپ احترام میذارم . فکر میکنم عده زیادی از دلفی کارها به همین دلیل مدتی را صرف کار با ویژوال استودیو کردند و ممکنه تجربیاتی شبیه بنده داشته باشند . امیدوارم علاقمندان به این موضوع به جمع ما ملحق بشوند.

مجید
27 / May / 2015, 04:02 PM
اگه مستندات یک پروژه اتوماسیون را دارید لطفا منتشر کنید تا برای پروژه بعدی درباره اش تصمیم گیری کنیم .
البته اگه عمری بود و اگه تیم شکل گرفت و اگه به مشکل اساسی برخورد نکردیم و ............

meyti
28 / May / 2015, 09:50 AM
یه خرده در مورد خود بازی توضیح میدین !؟ چطوریه ؟

مجید
28 / May / 2015, 03:41 PM
عنوان پروژه : بازی آنلاین کلمات

عناصر بازی :
1- کلمه رمز
2- کاربر یا کاربرانی که تلاش میکنند رمز را پیدا کنند
3- کلمات پیشنهادی کاربران
4- امتیازی که بازی به کلمات کاربران میدهد

هدف :
کاربران در این بازی برای یافتن کلمه رمز با یکدیگر رقابت میکنند . در صورتیکه کاربری کلمه رمز را پیدا کند بازی امتیازی را به حساب کاربر اضافه میکند .

روش بازی :

کاربران پس از ثبت نام در بازی (ثبت نام سریع و بدون نیاز به تایید ایمیل) وارد بازی میشوند . کاربران در هنگام ثبت نام نمیتوانند از نام های ثبت شده ی قبلی استفاده کنند . در صورتیکه قبلا ثبت نام کرده باشند میتوانند با وارد کردن نام کاربری و رمز عبور وارد بازی شوند .
پس از ورود به بازی جدولی را مشاهده میکنند که دارای 3 ستون است :
ستون اول نام کاربر
ستون دوم کلمه پیشنهادی
ستون سوم امتیاز کلمه
---------------------------------------
در بالای جدول قسمتی قرار دارد که کاربر میتواند کلمه پیشنهادی خود را در آن وارد کرده و از این لحظه وارد بازی شود.
بازی به کلمه پیشنهادی هر کاربر با یک امتیاز دو قسمتی پاسخ میدهد و کاربر باید با بررسی امتیازات دریافت شده حدس بزند که چه حروفی در کلمه رمز وجود دارد و در نهایت حدس بزند کلمه رمز چیست.
درصورتیکه رمز توسط کاربری پیدا شد ابتدا امتیاز جایزه به حساب کابر پیدا کننده ی رمز واریز میشود و سپس بازی به صورت خودکار رمز دیگری را انتخاب میکند و بازی با رمز جدید ادامه پیدا خواهد کرد و از این لحظه کاربران باید بدنبال رمز جدید باشند.

مثال
کلمه رمز : دلفی
توضیح اینکه : د ل ف ی - چهار حرف کلمه رمز هستند . کلمه رمز نباید حروف تکراری داشته باشد . مثال های غلط : لک لک ، فلفل ، دلیل . وجود حروف تکراری باعث گمراه شدن کاربران خواهد شد. از این رو تمام کلماتی که به عنوان رمز یا کلمه پیشنهادی در بازی استفاده خواهند شد حروف غیر تکراری دارند.
کلمه رمز از یک جدول فراخوانی می شود (این جدول هم اکنون موجود است)

کلمه پیشنهادی یکی از کاربران بطور مثال : دانش
بازی حروف کلمه پیشنهادی (د ا ن ش) را با کلمه رمز (د ل ف ی) مقایسه میکند و امتیازی که بازی به کلمات پیشنهادی کاربران میدهد به شرح زیر است:
1+0
که عدد اول یعنی 1 نشان دهنده ی تعداد حروف مشترک دو کلمه است و عدد دوم یعنی 0 نشان دهنده ی تعداد حروف مشترکی است که سر جای خود قرار گرفته اند.
مثال پیشنهادی دوم : فیله
بازی حروف کلمه پیشنهادی (ف ی ل ه) را با کلمه رمز (د ل ف ی) مقایسه میکند و امتیازی که بازی به کلمات پیشنهادی کاربران میدهد به شرح زیر است:
3+0
مثال پیشنهادی سوم : دلیر
بازی حروف کلمه پیشنهادی (د ل ی ر) را با کلمه رمز (د ل ف ی) مقایسه میکند و امتیازی که بازی به کلمات پیشنهادی کاربران میدهد به شرح زیر است:
3+2

نکته 1 : ممکن است بعضی کلمات امتیاز 0+0 بگیرند . در این صورت کاربرمیتواند حروف کلمه پیشنهادی خود را از دامنه حروف احتمالی رمز حذف کرده و در کلمات پیشنهادی بعدی خود از آنها استفاده نکند
نکته 2 : کاربر میتواند برای خود حروف الفبای فارسی را در محلی یادداشت کرده و پس از برخورد به کلماتی که امتیاز 0+0 گرفته اند حروف مورد نظر را علامت بزند.
نکته 3 : کلمات پیشنهادی کابران نیز نباید حروف تکراری داشته باشد.
نکته 4 : طول کلمه پیشنهادی نباید بیشتر یا کمتر از طول کلمه رمز باشد.
نکته 5 : فاصله (space) جزء کاراکتر های غیر مجاز در کلمات پیشنهادی است .

امتیازات :
امتیاز هر کلمه پیشنهادی به صورت خودکار به حساب کاربر واریز میشود
مثال : کلمه دلیر در مثال سوم (2+3) 5 امتیاز را به حساب کاربر واریز خواهد کرد
امتیاز پیدا کردن رمز 500 است
-------------------------------------------------
کلمه رمز میتواند 3 حرفی ، 4 حرفی و یا 5 حرفی باشد که این مورد باید در سطح بازی انتخاب شود . یعنی می توان بازی را مثلا در سه سطح ساده (رمز 3 حرفی) ، متوسط (رمز 4 حرفی) و سخت (رمز 5 حرفی) طراحی و در اختیار کاربر قرار داد
و به همین نسبت هم امتیازات رمز پیدا شده میتواند برای 3 حرفی 200 امتیاز ، 4 حرفی 500 امتیاز و 5 حرفی 800 امتیاز باشد
-------------------------------------------------
می توان محیطی برای کابران در حین بازی در نظر گرفت که با هم گفتگو کنند . چیزی شبیه چت هیجان بیشتری به بازی خواهد داد.
-------------------------------------------------

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

مجید
28 / May / 2015, 07:06 PM
امروز خودم Windowes Server 2008 R2 نصب کردم و مراحل گفته شده در لینک <span style="font-family: trebuchet ms"><font size="3"><font color="Indigo"><b><font color="red">[فقط اعضاء انجمن قادر به مشاهده لینکها و عکسها می باشند <a href="/reg_iran.php" target="_blank">برای عضویت در سایت کلیک کنید</a>]</font></b></font></font></span> را انجام دادم . نتیجه قابل قبول بود.
فقط یک نکته باقی مونده . اونم اینکه آیا تنظیمات خواسته شده در لینک بالا توسط فروشندگان یا بخش پشتیبانی هاست ها انجام میشه یا باید برای انجام این کارها هزینه ای جدا گانه پرداخت کرد و یا شاید هم اصلا با زدن یک تیکت براحتی و بدون درد سر برامون انجامش میدن؟
پاسخ این سوال را فقط در عمل میشه فهمید!

مجید
31 / May / 2015, 04:08 AM
من روزی چند بار به اینجا سر میزنم ببینم نظری حرفی انتقادی پیشنهادی یا هر چیز جدیدی اضافه شده یا نه!
ولی متاسفانه پست های جدید خیلی کمه. شاید دلیلش این باشه که دلفی کاران عزیز سرشون خیلی شلوغه.
به هر حال من هنوز دلسرد نشدم . امیدوارم اشتیاق بیشتری (وقت آزاد بیشتری برای سر شلوغ ها) بوجود بیاد .

meyti
31 / May / 2015, 10:19 AM
با سلام
از همه اعضا مخصوصا مدیران عزیز خواهش میکنم که شرکت کنند - حتی اگرم وقت ندارند که تو خود پروژه باشند یه نظری پیشنهادی و.... بدهند که این سایت که تنها فروم اختصاصی دلفیه از رونق نیافته .

meyti
31 / May / 2015, 10:26 AM
طرح بازی جالب بود - از جایی دیدین یا خلاقیت خودشماست ؟

مجید
31 / May / 2015, 12:42 PM
طرح بازی جالب بود - از جایی دیدین یا خلاقیت خودشماست ؟

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

مجید
03 / June / 2015, 11:30 PM
یک هفته از آخرین پست میگذره و تا الان 496 بازدید از این موضوع انجام شده . جالب اینجاست اغلب بازدید های این موضوع توسط کاربران میهمان انجام میشه و از بین این همه بازدید گروه Intraweb فقط 4 عضو گرفته
تا این لحظه بنده به همراه 3 عزیز دیگر ( meyti و admin و mrtr0101 ) عضو این گروه هستیم. از اعضاء گروه خواهشمندم اگر امکان داره به دوستان و همکاران خودشون اطلاع رسانی کنند. جای گرافیست و طراح وب تو گروه خالیه.
به امید خدا سعی میکنم هفته آینده یک تحلیل سر پایی از پروژه بذارم .

مجید
04 / June / 2015, 03:31 PM
<span style="font-family: trebuchet ms"><font size="3"><font color="Indigo"><b><font color="red">[فقط اعضاء انجمن قادر به مشاهده لینکها و عکسها می باشند <a href="/reg_iran.php" target="_blank">برای عضویت در سایت کلیک کنید</a>]</font></b></font></font></span> (<span style="font-family: trebuchet ms"><font size="3"><font color="Indigo"><b><font color="red">[فقط اعضاء انجمن قادر به مشاهده لینکها و عکسها می باشند <a href="/reg_iran.php" target="_blank">برای عضویت در سایت کلیک کنید</a>]</font></b></font></font></span>)

b_e_shamlu
05 / June / 2015, 03:54 AM
سلام دوستان منهم موافق هستم اما باید عرض کنم که خیلی آشنایی نداشته و همینکه وقت زیادی هم ندارم اما تا آنجایی که بتوانم و توان داشته باشم در خدمت شما هستم

دوستان یک پیشنهاد
تقریبا همه جا اتوماسین اداری وجود دارد .
من یک پیشنهاد دارم و اون اینکه برنامه بودجه (تامین اعتبار - درخواست وجه - هزینه و ...) چراکه فقط مورد استفاده ادارات دولتی میباشد و کمتر شرکتی به آن پرداخته .
اگه شد کمی در موردش فکر کنید شاید خوب بود؟؟؟؟!!!!!!

مجید
05 / June / 2015, 07:09 AM
سلام دوستان منهم موافق هستم اما باید عرض کنم که خیلی آشنایی نداشته و همینکه وقت زیادی هم ندارم اما تا آنجایی که بتوانم و توان داشته باشم در خدمت شما هستم

دوستان یک پیشنهاد
تقریبا همه جا اتوماسین اداری وجود دارد .
من یک پیشنهاد دارم و اون اینکه برنامه بودجه (تامین اعتبار - درخواست وجه - هزینه و ...) چراکه فقط مورد استفاده ادارات دولتی میباشد و کمتر شرکتی به آن پرداخته .
اگه شد کمی در موردش فکر کنید شاید خوب بود؟؟؟؟!!!!!!

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

برنامه نویس دلفی

گرافیست (آشنا به فتوشاپ و سایر برنامه های گرافیکی و ...)

طراح وب (آشنا به HTML و CSS و ...)

مدیر تیم تولید جهت هماهنگی بین اعضاء

مدیر روابط عمومی (در صورت نیاز به گفتگو با مشتریان احتمالی نظیر شرکت های دولتی و ...)



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

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

در مورد پیشنهادتون هم قبل از هر چیز باید گردش کار یا همون Workflow (لطفا اینجا (<span style="font-family: trebuchet ms"><font size="3"><font color="Indigo"><b><font color="red">[فقط اعضاء انجمن قادر به مشاهده لینکها و عکسها می باشند <a href="/reg_iran.php" target="_blank">برای عضویت در سایت کلیک کنید</a>]</font></b></font></font></span>) و یا اینجا (<span style="font-family: trebuchet ms"><font size="3"><font color="Indigo"><b><font color="red">[فقط اعضاء انجمن قادر به مشاهده لینکها و عکسها می باشند <a href="/reg_iran.php" target="_blank">برای عضویت در سایت کلیک کنید</a>]</font></b></font></font></span>) را ببینید) سیستم مورد نظرتون را به صورت مستندات در اختیار داشته باشید تا بتونیم بررسیش کنیم و در موردش تصمیم گیری کنیم . این اصطلاحاتی که شما فرمودید (تامین اعتبار و درخواست بودجه و هزینه و ... ) برای بنده نا آشناست و هر چقدر هم که دربارشون فکر کنم حاصلش چیزی نمیشه . اگه شما مستندات یا مطالبی دارید که برای درک سیستم مورد نظر مفیده لطفا بعد از عضویت توی گروه Intraweb (<span style="font-family: trebuchet ms"><font size="3"><font color="Indigo"><b><font color="red">[فقط اعضاء انجمن قادر به مشاهده لینکها و عکسها می باشند <a href="/reg_iran.php" target="_blank">برای عضویت در سایت کلیک کنید</a>]</font></b></font></font></span>)منتشر کنید تا بقیه هم اطلاعات هم سطح شما داشته باشند.

با تشکر فراوان

مجید
07 / June / 2015, 12:54 PM
سلام
چند توصیه و پیشنهاد دارم که فکر میکنم ممکنه برای دوستان مفید باشه . البته حرف جدیدی نیست . فقط جهت هماهنگی بیشتر عرض میکنم.

پیشنهاد اول (بهینه سازی IDE دلفی) : نرم افزار cnPack (<span style="font-family: trebuchet ms"><font size="3"><font color="Indigo"><b><font color="red">[فقط اعضاء انجمن قادر به مشاهده لینکها و عکسها می باشند <a href="/reg_iran.php" target="_blank">برای عضویت در سایت کلیک کنید</a>]</font></b></font></font></span>) را دانلود و نصب کنید.
پیشنهاد دوم (تهیه تصاویر همراه با توضیحات از محیط کاری شامل فرم ها ، دیاگرام ها ، خطا ها و ...) : نرم افزار SnagIt (<span style="font-family: trebuchet ms"><font size="3"><font color="Indigo"><b><font color="red">[فقط اعضاء انجمن قادر به مشاهده لینکها و عکسها می باشند <a href="/reg_iran.php" target="_blank">برای عضویت در سایت کلیک کنید</a>]</font></b></font></font></span>) را دانلود و نصب کنید.
پیشنهاد سوم (یکسان سازی IDE دلفی) : برای استفاده بیشتر از دسکتاپ دلفی در زمان کار بهتر است تغییراتی در محیط آن داده شود . بنده تغییرات دلخواه خود را روی دلفی تنظیم کردم و فایل config آنرا ضمیمه همین پست میکنم . استفاده از یک محیط کاری بین اعضاء یک گروه باعث هماهنگی بیشتر خواهد شد . مثلا فایل های کدی که بین اعضا رد و بدل خواهد شد شکل و شمایل متحدی خواهد داشت و کاربران نیازی ندارند که کد های یکدیگر را فرمت کنند تا برایشان خوانا تر شود . این موضوع در formatting سورس کد بسیار به چشم می آید.

فایل دیگری که ضمیه شده است را باید پس از نصب نرم افزار cnPack استفاده کنید . این فایل یک Backup از محیط دلفی بنده است که توسط cnPack تهیه شده و پس از Restore کردن آن محیط دلفی شما شبیه به دلفی بنده خواهد شد.

مجید
09 / June / 2015, 04:41 PM
سلام
امروز رسما پروژه استارت میخوره
امیدوارم همه چیز خوب پیش بره و اعضاء گروه هم کمک کنند تا سریعتر به نتیجه برسیم

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



فرم ورود کاربران
190
فرم ثبت نام 275



فرم تغییر رمز عبور180

فرم پروفایل کاربر
181


فرم فراموشی رمز عبور
185
فرم انتخاب سطح دشواری بازی
191




فرم بازی
192




و در انتها هم تصویری از دیاگرام دیتابیس بازی

248

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

مجید
16 / June / 2015, 05:50 PM
سلام
این پست اختصاص داره به طرز ساخت کلاس TUser که در بازی ازش استفاده خواهیم کرد.

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



205



206



207



208

بعدش این شکلی میشه



209



حالا روی IntraWeb_WordGame کلیک راست کنید و از منویی که ظاهر میشه Add و از منوی بعدی Namespace را انتخاب کنید




210



با استفاده از Modeling میتونیم کلاس ها را ایجاد کنیم . البته بدون استفاده از این ابزار هم میشه کلاس درست کرد ولی هم سخت تر است و هم ضریب خطا در حین کار بالا میره . در کل این ابزار بسیار مفید هست . اگه تا حالا سراغش نرفتین حتما تستش کنید .


211

Namespace1 را به WordGame_Namespace تغییر بدهید



212


روی WordGame_Namespace دبل کلیلک کنید تا محیط ایجاد کلاس باز شود
سپس در فضای خالی کلیک راست کرده و از منویی که ظاهر میشود Add و سپس Class را انتخاب کنید.



213

ادامه در پست بعد

مجید
16 / June / 2015, 06:30 PM
Class1 ایجاد میشه . در همین مرحله نام Class1 را به TUser تغییر بدید

214


215


روی کلاس TUser کلیلک راست کنید و از منویی که ظاهر میشود Add و سپس Property را انتخاب کنید
Property ها در زمان کد نویسی در اختیار شما خواهند بود و میتوانید مقادیر آنها را تغییر دهید . همچنین میتوانید آنها را با مقادیر متناظر خود در بانک اطلاعاتی مقدار دهی کنید


216


217


Property1 را به UserID تغییر دهید

218

دقت کنید که مقدار SetProperty1 در تصویر بالا تبدیل به SetUserID در تصویر پایین شد.
همچنین مقدار FProperty1 در تصویر بالا تبدیل به FUserID در تصویر پایین شد
دلفی وظیفه این تغییرات را به عهده میگیرد تا خطای کاربر به حداقل برسد.
حالا وقت آن رسیده که نگاهی به کد ایجاد شده بیاندازیم
روی کلاس TUser دبل کلیک کنید تا فایل کد آن باز شود :

219


همانطور که میبینید بین Begin و End در procedure TUser.SetUserID هیچ کدی نوشته نشده است
اینجا شما باید وارد عمل شوید و کد دلخواه خود را وارد کنید
در این مثال دستور زیر را وارد میکنیم :
FUserID := val;

220


کار این پروسیجر مقدار دهی به فیلد FUserID است و با کدی که وارد آن کردیم این عملیات تکمیل میشود . توجه داشته باشید که اگر این کد ها را وارد نکنید کلاس به درستی عمل نخواهد کرد.
به همین ترتیب Property های دیگر را نیز اظافه میکنیم :



230



به نوع Property ها دقت کنید . بعضی عددی و بعضی رشته ای هستند. تغییر نوع Property ها را میتوانید در زمان تغییر نام آنها انجام دهید



231

232




ادامه در پست بعد

مجید
16 / June / 2015, 07:09 PM
هر کلاس میتواند دو پروسیجر Create و Destroy داشته باشه . این دو پروسیجر به ترتیب در زمان ساخت و حذف از حافظه ، فراخوانی میشوند . میتوانید در Create مقادیر اولیه برای فیلد ها در نظر بگیرید .

نکته : فیلد ها همان قسمتهایی از کلاس هستند که با Property ها هم نام هستند و با حرف F شروع میشوند مانند Property UserID = Field FUserID
Peroperty ها مقادیر خود را در فیلد ها نگهداری میکنند و از آنها فراخوانی میکنند. به بیانی دیگر Property ها واسطه ای میان کاربر و فیلد ها هستند

برای ساخت پروسیجر Create روی کلاس کلیک راست کرده و از منویی که ظاهر میشود Add و سپس Constructor را انتخاب کنید
و
برای ساخت پروسیجر Destroy روی کلاس کلیک راست کرده و از منویی که ظاهر میشود Add و سپس Destructor را انتخاب کنید

233

حالا در کد مربوط به پروسیجر Create فیلد های کلاس را با مقادیر پیشفرض مقدار دهی میکنیم . پروسیجر Destroy در این کلاس بدون تغییر باقی خواهد ماند


234


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

235


و در انتها هم یک ADOConnection به ServerController اضافه میکنیم و به دیتابیس SQL وصلش میکنیم
نام ADOConnection را به ADOConnectionMain تغییر بدید و خصوصیاتشو هم مثل تصویر تنظیم کنید


227

228

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




type
TUser = class
public
private
var
FUserID : Integer;
FUsername : string;
FPassword : string;
FFullName : string;
FTotalPoint : Integer;
FEMail : string;
procedure SetUserID(val: Integer);
procedure SetUsername(val: string);
procedure SetPassword(val: string);
procedure SetFulName(val: string);
procedure SetTotalPoint(val: Integer);
procedure SetEMail(val: string);
function SendMail(aSMTP: TIdSMTP; aMailMessage: TIdMessage; aSubject, aBody: WideString): string;
public
property UserID : Integer read FUserID write SetUserID;
property Username : string read FUsername write SetUsername;
property Password : string read FPassword write SetPassword;
property FullName : string read FFullName write SetFulName;
property TotalPoint : Integer read FTotalPoint write SetTotalPoint;
property EMail : string read FEMail write SetEMail;
constructor Create;
destructor Destroy; override;
function Login: TUser;
function GetUserInfo(aUsername: string; aUserID: Integer = 0; aEMail: string = ''): TUser;
function RegisterUser: TUser;
function UpdateUser: boolean;
function ChangePassword(NewPassword: string): boolean;
procedure SendNewPasswordEmail(aSMTP: TIdSMTP; aMailMessage: TIdMessage);
end;

procedure TUser.SetUserID(val: Integer);
begin
FUserID := val;
end;

procedure TUser.SetUsername(val: string);
begin
FUsername := val;
end;

procedure TUser.SetPassword(val: string);
begin
FPassword := val;
end;

procedure TUser.SetFulName(val: string);
begin
FFullName := val;
end;

procedure TUser.SetTotalPoint(val: Integer);
begin
FTotalPoint := val;
end;

procedure TUser.SetEMail(val: string);
begin
FEMail := val;
end;

constructor TUser.Create;
begin
inherited Create;
FUserID := 0;
FUsername := '';
FPassword := '';
FFullName := '';
FTotalPoint := 0;
FEMail := '';
end;

destructor TUser.Destroy;
begin
inherited Destroy;
end;

function TUser.Login: TUser;
var
V: Integer;
begin
Result := nil;
V := fOpenReturnInt('Select Count(*) from Users where Username = ' + QuotedStr(Username) + ' and Password = ' +
QuotedStr(Password));
if V > 0 then
Result := GetUserInfo(Username);
end;

function TUser.GetUserInfo(aUsername: string; aUserID: Integer = 0; aEMail: string = ''): TUser;
var
WHR_Clause: String;
V : TADOQuery;
I : Integer;
begin
Result := nil;
if aUserID <> 0 then
WHR_Clause := ' UserID = ' + IntToStr(aUserID)
else if aUsername <> '' then
WHR_Clause := ' Username = ' + QuotedStr(aUsername)
else if aEMail <> '' then
WHR_Clause := ' EMail = ' + QuotedStr(aEMail);
V := fOpen('Select * from Users where ' + WHR_Clause);
if V.RecordCount > 0 then
begin
Result := TUser.Create;
with Result do
begin
UserID := V.FieldByName('UserID').AsInteger;
FullName := V.FieldByName('FullName').AsString;
Username := V.FieldByName('Username').AsString;
Password := V.FieldByName('Password').AsString;
TotalPoint := V.FieldByName('TotalPoint').AsInteger;
EMail := V.FieldByName('EMail').AsString;
end;
end;
FreeAndNil(V);
end;

function TUser.RegisterUser: TUser;
var
V: Integer;
begin
Result := nil;
V := fOpenReturnInt('Select Count(*) from Users where Username = ' + QuotedStr(Username));
if V = 0 then
begin
V := fOpenReturnInt('INSERT INTO Users (Username, Password, FullName, TotalPoint, EMail) VALUES (' +
QuotedStr(Username) + ',' + QuotedStr(Password) + ', N' + QuotedStr(FullName) + ',0,' +
QuotedStr(EMail) + '); Select Scope_Identity();');
if V > 0 then
begin
Result := Self.GetUserInfo(Self.Username);
Self := Result;
end;
end;
end;

function TUser.UpdateUser: boolean;
var
V: Integer;
begin
Result := False;
V := fRun('Update Users SET FullName = N' + QuotedStr(FullName) + ' where UserID = ' + IntToStr(UserID));
if V > 0 then
Result := True;
end;

function TUser.ChangePassword(NewPassword: string): boolean;
var
V: Integer;
begin
Result := False;
V := fRun('Update Users set Password = ' + QuotedStr(NewPassword) + ' where UserID = ' + IntToStr(UserID));
if V > 0 then
Result := True;
end;

procedure TUser.SendNewPasswordEmail(aSMTP: TIdSMTP; aMailMessage: TIdMessage);
var
Subject, Body: WideString;
NewPass : String;
begin
NewPass := RandomPassword(10);
Subject := ':: ' + IWServerController.AppName + ' :: تغییر رمز عبور ::';
Body := 'کاربر گرامی ، ' + FullName + 'اقدام به درخواست رمز عبور جدید کرده اید . ' + IWServerController.AppName +
' شما از طریق کنترل پنل خود در سایت <br>' +
'رمز عبور جدید شما : ' + NewPass;
Self.ChangePassword(NewPass);
SendMail(aSMTP, aMailMessage, Subject, Body);
end;

function TUser.SendMail(aSMTP: TIdSMTP; aMailMessage: TIdMessage; aSubject, aBody: WideString): string;
var
S: String;
begin
// setup SMTP
aSMTP.Host := 'smtp.gmail.com';
aSMTP.Port := 25; // for smtp.gmail.com
// setup mail message
aMailMessage.From.Address := 'Email@gmail.com';
aMailMessage.Recipients.EMailAddresses := EMail;
aMailMessage.ContentType := 'text/html';
aMailMessage.Subject := 'Subject Email';
S := '<table style="FONT-SIZE: 12px; font-name: Tahoma" dir="rtl" border="1" cellspacing="1" cellpadding="1" width="100%">';
S := S + '<tr><td>' + aBody + '</td></tr>';
S := S + '</table>';
aMailMessage.CharSet := 'UTF-8';
aMailMessage.Body.Text := S;
// send mail
try
try
aSMTP.Connect;
aSMTP.Send(aMailMessage);
except
on E: Exception do
// Error Handling
end;
finally
if aSMTP.Connected then
aSMTP.Disconnect;
end;
end;





اگر عمری بود در پست های بعدی کلاس های دیگر برنامه را قرار میدم

مجید
18 / June / 2015, 01:09 PM
سلام
امروز کلاس TUserProfile را میسازیم
روی قسمت خالی محیط دیاگرام کلیک راست کرده و از منویی که ظاهر میشود Add و سپس Structure را انتخاب کنید .


236


یک Structure ایجاد میشود


237


نام Structure1 را به TUserProfile تغییر بدید


238


مانند کلاس TUser خصوصیات (Peroperty ها) را به کلاس اضافه میکنیم
Point3 و Count3 برای امتیاز بازی و تعداد رمز های پیدا شده در سطح ساده
Point4 و Count4 برای امتیاز بازی و تعداد رمز های پیدا شده در سطح متوسط
Point5 و Count5 برای امتیاز بازی و تعداد رمز های پیدا شده در سطح سخت


239


به کلاس TUser یک Property با نام UserProfile از نوع TUserProfile اضافه میکنیم


240


به ارتباطی که بین دوکلاس برقرار شده است توجه کنید


241


یک Procedure به کلاس TUserProfile اضافه کنید و نام آن را Initial بگذارید


242



243

و بدنه Procedure را به شکل زیر کد نویسی کنید


244


مانند شکل زیر کلاس TUser را ویرایش کنید

246

کلاس TUserProfile اطلاعات مربوط به امتیازات و تعداد رمز های پیدا شده توسط کاربر را در اختیار شما میگذارد



unit WordGame_Namespace;

interface

uses
IdComponent,
IdTCPConnection,
IdTCPClient,
IdSSLOpenSSL,
IdIOHandler,
IdIOHandlerSocket,
IdIOHandlerStack,
IdSSL,
IdMessageClient,
IdSMTP,
IdBaseComponent,
IdMessage,
IdExplicitTLSClientServerBase,
IdSMTPBase,
Forms,
System.Classes,
ServerController,
StrUtils,
Data.DB,
Data.Win.ADODB,
SysUtils;

type
TUserProfile = record
private
FPoint3: Integer;
FPoint4: Integer;
FPoint5: Integer;
FCount3: Integer;
FCount4: Integer;
FCount5: Integer;
procedure SetPoint3(val: Integer);
procedure SetPoint4(val: Integer);
procedure SetPoint5(val: Integer);
procedure SetCount3(val: Integer);
procedure SetCount4(val: Integer);
procedure SetCount5(val: Integer);
procedure Initial(aUserID: Integer);
public
property Point3: Integer read FPoint3 write SetPoint3;
property Point4: Integer read FPoint4 write SetPoint4;
property Point5: Integer read FPoint5 write SetPoint5;
property Count3: Integer read FCount3 write SetCount3;
property Count4: Integer read FCount4 write SetCount4;
property Count5: Integer read FCount5 write SetCount5;
end;

TUser = class
public
private
var
FUserID : Integer;
FUsername : string;
FPassword : string;
FFullName : string;
FTotalPoint : Integer;
FEMail : string;
FUserProfile: TUserProfile;
procedure SetUserID(val: Integer);
procedure SetUsername(val: string);
procedure SetPassword(val: string);
procedure SetFulName(val: string);
procedure SetTotalPoint(val: Integer);
procedure SetEMail(val: string);
function SendMail(aSMTP: TIdSMTP; aMailMessage: TIdMessage; aSubject, aBody: WideString): string;
procedure SetUserProfile(val: TUserProfile);
public
property UserID : Integer read FUserID write SetUserID;
property Username : string read FUsername write SetUsername;
property Password : string read FPassword write SetPassword;
property FullName : string read FFullName write SetFulName;
property TotalPoint : Integer read FTotalPoint write SetTotalPoint;
property EMail : string read FEMail write SetEMail;
property UserProfile: TUserProfile read FUserProfile write SetUserProfile;
constructor Create;
destructor Destroy; override;
function Login: TUser;
function GetUserInfo(aUsername: string; aUserID: Integer = 0; aEMail: string = ''): TUser;
function RegisterUser: TUser;
function UpdateUser: boolean;
function ChangePassword(NewPassword: string): boolean;
procedure SendNewPasswordEmail(aSMTP: TIdSMTP; aMailMessage: TIdMessage);
end;

function RandomPassword(PLen: Integer): string;
function fOpen(aQry: WideString): TADOQuery;
function fOpenReturnInt(aQry: WideString): Integer;
function fOpenReturnStr(aQry: WideString): String;
function fRun(aQry: WideString): Integer;

implementation

function RandomPassword(PLen: Integer): string;
var
str: string;
begin
Randomize;
str := '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLM NOPQRSTUVWXYZ';
Result := '';
repeat
Result := Result + str[Random(Length(str)) + 1];
until (Length(Result) = PLen);
end;

function fOpen(aQry: WideString): TADOQuery;
var
A: TADOQuery;
begin
try
A := TADOQuery.Create(Application);
A.Connection := IWServerController.ADOConnectionMain;
A.Close;
A.SQL.Text := aQry;
A.Open;
Result := A;
except
on E: Exception do
begin
// Error Handling
end;
end;
end;

function fOpenReturnInt(aQry: WideString): Integer;
var
A: TADOQuery;
begin
try
try
A := TADOQuery.Create(Application);
A.Connection := IWServerController.ADOConnectionMain;
A.Close;
A.SQL.Text := aQry;
A.Open;
Result := A.Fields[0].AsInteger;
except
on E: Exception do
begin
// Error Handling
end;
end;
finally
FreeAndNil(A);
end;
end;

function fOpenReturnStr(aQry: WideString): String;
var
A: TADOQuery;
begin
try
try
A := TADOQuery.Create(Application);
A.Connection := IWServerController.ADOConnectionMain;
A.Close;
A.SQL.Text := aQry;
A.Open;
Result := A.Fields[0].AsString;
except
on E: Exception do
begin
// Error Handling
end;
end;
finally
FreeAndNil(A);
end;
end;

function fRun(aQry: WideString): Integer;
var
A: TADOQuery;
begin
try
try
A := TADOQuery.Create(Application);
A.Connection := IWServerController.ADOConnectionMain;
A.Close;
A.SQL.Text := aQry;
Result := A.ExecSQL;
except
on E: Exception do
begin
// Error Handling
end;
end;
finally
FreeAndNil(A);
end;
end;

procedure TUserProfile.SetPoint3(val: Integer);
begin
FPoint3 := val;
end;

procedure TUserProfile.SetPoint4(val: Integer);
begin
FPoint4 := val;
end;

procedure TUserProfile.SetPoint5(val: Integer);
begin
FPoint5 := val;
end;

procedure TUserProfile.SetCount3(val: Integer);
begin
FCount3 := val;
end;

procedure TUserProfile.SetCount4(val: Integer);
begin
FCount4 := val;
end;

procedure TUserProfile.SetCount5(val: Integer);
begin
FCount5 := val;
end;

procedure TUserProfile.Initial(aUserID: Integer);
var
V: TADOQuery;
I: Integer;
begin
if aUserID <> 0 then
begin
V := fOpen('Exec sp_UserProfile ' + IntToStr(aUserID));
if V.RecordCount > 0 then
begin
Point3 := V.FieldByName('Point3').AsInteger;
Point4 := V.FieldByName('Point4').AsInteger;
Point5 := V.FieldByName('Point5').AsInteger;
Count3 := V.FieldByName('Count3').AsInteger;
Count4 := V.FieldByName('Count4').AsInteger;
Count5 := V.FieldByName('Count5').AsInteger;
end;
FreeAndNil(V);
end;
end;

procedure TUser.SetUserID(val: Integer);
begin
FUserID := val;
end;

procedure TUser.SetUsername(val: string);
begin
FUsername := val;
end;

procedure TUser.SetPassword(val: string);
begin
FPassword := val;
end;

procedure TUser.SetFulName(val: string);
begin
FFullName := val;
end;

procedure TUser.SetTotalPoint(val: Integer);
begin
FTotalPoint := val;
end;

procedure TUser.SetEMail(val: string);
begin
FEMail := val;
end;

constructor TUser.Create;
begin
inherited Create;
FUserID := 0;
FUsername := '';
FPassword := '';
FFullName := '';
FTotalPoint := 0;
FEMail := '';
FUserProfile.Point3 := 0;
FUserProfile.Point4 := 0;
FUserProfile.Point5 := 0;
FUserProfile.Count3 := 0;
FUserProfile.Count4 := 0;
FUserProfile.Count5 := 0;
end;

destructor TUser.Destroy;
begin
inherited Destroy;
end;

function TUser.Login: TUser;
var
V: Integer;
begin
Result := nil;
V := fOpenReturnInt('Select Count(*) from Users where Username = ' + QuotedStr(Username) + ' and Password = ' +
QuotedStr(Password));
if V > 0 then
Result := GetUserInfo(Username);
end;

function TUser.GetUserInfo(aUsername: string; aUserID: Integer = 0; aEMail: string = ''): TUser;
var
WHR_Clause: String;
V : TADOQuery;
I : Integer;
begin
Result := nil;
if aUserID <> 0 then
WHR_Clause := ' UserID = ' + IntToStr(aUserID)
else if aUsername <> '' then
WHR_Clause := ' Username = ' + QuotedStr(aUsername)
else if aEMail <> '' then
WHR_Clause := ' EMail = ' + QuotedStr(aEMail);
V := fOpen('Select * from Users where ' + WHR_Clause);
if V.RecordCount > 0 then
begin
Result := TUser.Create;
with Result do
begin
UserID := V.FieldByName('UserID').AsInteger;
FullName := V.FieldByName('FullName').AsString;
Username := V.FieldByName('Username').AsString;
Password := V.FieldByName('Password').AsString;
TotalPoint := V.FieldByName('TotalPoint').AsInteger;
EMail := V.FieldByName('EMail').AsString;
UserProfile.Initial(UserID);
end;
end;
FreeAndNil(V);
end;

function TUser.RegisterUser: TUser;
var
V: Integer;
begin
Result := nil;
V := fOpenReturnInt('Select Count(*) from Users where Username = ' + QuotedStr(Username));
if V = 0 then
begin
V := fOpenReturnInt('INSERT INTO Users (Username, Password, FullName, TotalPoint, EMail) VALUES (' +
QuotedStr(Username) + ',' + QuotedStr(Password) + ', N' + QuotedStr(FullName) + ',0,' +
QuotedStr(EMail) + '); Select Scope_Identity();');
if V > 0 then
begin
fRun('INSERT INTO UserProfile (UserID, DifficultyLevel, Point, PasswordCount) VALUES (' + IntToStr(V) +
', 3, 0, 0)');
fRun('INSERT INTO UserProfile (UserID, DifficultyLevel, Point, PasswordCount) VALUES (' + IntToStr(V) +
', 4, 0, 0)');
fRun('INSERT INTO UserProfile (UserID, DifficultyLevel, Point, PasswordCount) VALUES (' + IntToStr(V) +
', 5, 0, 0)');
Result := Self.GetUserInfo(Self.Username);
Self := Result;
end;
end;
end;

function TUser.UpdateUser: boolean;
var
V: Integer;
begin
Result := False;
V := fRun('Update Users SET FullName = N' + QuotedStr(FullName) + ' where UserID = ' + IntToStr(UserID));
if V > 0 then
Result := True;
end;

function TUser.ChangePassword(NewPassword: string): boolean;
var
V: Integer;
begin
Result := False;
V := fRun('Update Users set Password = ' + QuotedStr(NewPassword) + ' where UserID = ' + IntToStr(UserID));
if V > 0 then
Result := True;
end;

procedure TUser.SendNewPasswordEmail(aSMTP: TIdSMTP; aMailMessage: TIdMessage);
var
Subject, Body: WideString;
NewPass : String;
begin
NewPass := RandomPassword(10);
Subject := ':: ' + IWServerController.AppName + ' :: تغییر رمز عبور ::';
Body := 'کاربر گرامی ، ' + FullName + 'اقدام به درخواست رمز عبور جدید کرده اید . ' + IWServerController.AppName +
' شما از طریق کنترل پنل خود در سایت <br>' +
'رمز عبور جدید شما : ' + NewPass;
Self.ChangePassword(NewPass);
SendMail(aSMTP, aMailMessage, Subject, Body);
end;

function TUser.SendMail(aSMTP: TIdSMTP; aMailMessage: TIdMessage; aSubject, aBody: WideString): string;
var
S: String;
begin
// setup SMTP
aSMTP.Host := 'smtp.gmail.com';
aSMTP.Port := 25; // for smtp.gmail.com
// setup mail message
aMailMessage.From.Address := 'Email@gmail.com';
aMailMessage.Recipients.EMailAddresses := EMail;
aMailMessage.ContentType := 'text/html';
aMailMessage.Subject := 'Subject Email';
S := '<table style="FONT-SIZE: 12px; font-name: Tahoma" dir="rtl" border="1" cellspacing="1" cellpadding="1" width="100%">';
S := S + '<tr><td>' + aBody + '</td></tr>';
S := S + '</table>';
aMailMessage.CharSet := 'UTF-8';
aMailMessage.Body.Text := S;
// send mail
try
try
aSMTP.Connect;
aSMTP.Send(aMailMessage);
except
on E: Exception do
// Error Handling
end;
finally
if aSMTP.Connected then
aSMTP.Disconnect;
end;
end;

procedure TUser.SetUserProfile(val: TUserProfile);
begin
FUserProfile := val;
end;




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

مجید
19 / June / 2015, 01:25 AM
آخرین فایل Backup دیتابیس بازی ضمیمه شده است

مجید
19 / June / 2015, 01:32 AM
ایجاد کلاس TWordGame
از این کلاس برای درج رمز جدید ، ثبت کلمه پیشنهادی کاربران در حین بازی و نمایش اطلاعات بازی استفاده میشه
به همان روشی که در پست های قبلی توضیح داده شد یک کلاس جدید ایجاد کرده و نام آن را TWordGame بگذارید
و مانند تصویر متد های مورد نظر را اضافه کنید

286



type
TWordGame = class
public
function GetSecretWordID(aDifficultyLevel: Integer): Integer;
function GetSecretWord(aDifficultyLevel: Integer): string;
function GetLastWinner(aDifficultyLevel: Integer): string;
function GetLastFoundSecretWord(aDifficultyLevel: Integer): string;
function AddNewSecretWord(aDifficultyLevel: Integer): Integer;
function AddNewSuggestionWord(aUserID, agsID: Integer; aSuggestionWord: string;
aPoint1, aPoint2, aDifficultyLevel: Integer): boolean;
function GetWordGameData(aDifficultyLevel: Integer): TADOQuery;
end;





function TWordGame.GetSecretWordID(aDifficultyLevel: Integer): Integer;
begin
Result := fOpenReturnInt('select gsID from GameSecrets where IsFound = 0 and DifficultyLevel = ' +
IntToStr(aDifficultyLevel));
end;

function TWordGame.GetSecretWord(aDifficultyLevel: Integer): string;
begin
Result := fOpenReturnStr('SELECT Word FROM GameSecrets GS inner join Words' + IntToStr(aDifficultyLevel) +
' W on GS.SecretWordID = W.wID where IsFound = 0 and DifficultyLevel = ' +
IntToStr(aDifficultyLevel));
end;

function TWordGame.GetLastWinner(aDifficultyLevel: Integer): string;
begin
Result := fOpenReturnStr('Select FullName from GameSecrets GS '
+ ' inner join GameWords GW on GW.gsID = GS.gsID and GW.DifficultyLevel = GS.DifficultyLevel '
+ ' inner join Users U on U.UserID = GW.UserID '
+ ' where GW.Point1 = GW.Point2 and GW.Point2 = GW.DifficultyLevel and GW.DifficultyLevel = ' +
IntToStr(aDifficultyLevel) + ' Order by GW.gwID Desc ');
end;

function TWordGame.GetLastFoundSecretWord(aDifficultyLevel: Integer): string;
begin
Result := fOpenReturnStr('Select SuggestionWord from GameSecrets GS '
+ ' inner join GameWords GW on GW.gsID = GS.gsID and GW.DifficultyLevel = GS.DifficultyLevel '
+ ' inner join Users U on U.UserID = GW.UserID '
+ ' where GW.Point1 = GW.Point2 and GW.Point2 = GW.DifficultyLevel and GW.DifficultyLevel = ' +
IntToStr(aDifficultyLevel) + ' Order by GW.gwID Desc ');
end;

function TWordGame.AddNewSecretWord(aDifficultyLevel: Integer): Integer;
begin
Result := fOpenReturnInt('declare @Result int;'
+ ' Exec sp_AddNewSecretWord ' + IntToStr(aDifficultyLevel) + ' , @Result output'
+ ' Select @Result;');
end;

function TWordGame.AddNewSuggestionWord(aUserID, agsID: Integer; aSuggestionWord: string;
aPoint1, aPoint2, aDifficultyLevel: Integer): boolean;
var
SuggestedCount: Integer;
aDataSet : TADOQuery;
begin
SuggestedCount := 0;
aDataSet := fOpen('Select SuggestionWord, Count(*) from GameWords '
+ ' where SuggestionWord = N' + QuotedStr(aSuggestionWord) + ' and gsid = ' + IntToStr(agsID)
+ ' Group By SuggestionWord ');
SuggestedCount := aDataSet.Fields[1].AsInteger;
FreeAndNil(aDataSet);
if SuggestedCount = 0 then
fRun('Exec sp_AddNewSuggestionWord ' + IntToStr(aUserID) + ',N' + QuotedStr(aSuggestionWord) + ',' +
IntToStr(aPoint1) +
',' + IntToStr(aPoint2) + ',' + IntToStr(aDifficultyLevel));
Result := SuggestedCount = 0;
end;

function TWordGame.GetWordGameData(aDifficultyLevel: Integer): TADOQuery;
begin
Result := fOpen('Select U.FullName, GW.SuggestionWord, Cast(Point1 as Varchar(1))+'' + ''+Cast(Point2 as Varchar(1)) as Point from GameWords GW '
+ 'inner join GameSecrets GS on GS.gsID = GW.gsID and GS.DifficultyLevel = GW.DifficultyLevel '
+ 'inner join Users U on GW.UserID = U.UserID '
+ 'where GS.IsFound = 0 and GS.DifficultyLevel = ' + IntToStr(aDifficultyLevel)
+ ' Order By GW.gwID Desc ');
end;





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

مجید
20 / June / 2015, 09:03 PM
سلام
امروز در این پست ساخت فرم های بازی را انجام خواهیم داد

دلفی را اجرا کرده و پروژه بازی را باز کنید . در لیست Unit های بازی روی Unit3 کلیک راست کرده و گزینه Remove From Project را انتخاب کنید. این Unit به صورت پیش فرض همراه با پروژه ایجاد شده است.
سپس از منوی File گزینه New و سپس از منویی که ظاهر میشود گزینه ...Other را انتخاب کنید .
مانند تصویر گزینه NewForm را از زیر شاخه IntraWeb انتخاب کرده و روی OK کلیلک کنید تا فرم جدیدی به پروژه اضافه شود.


251


نام فرم جدید را به BaseForm تغییر داده و یک TIWTemplateProcessorHTML به فرم اضافه کنید . خصوصیت LayoutMgr فرم را به IWTemplateProcessorHTML1 تغییردهید.

مانند تصویر Unit1 را به BaseUnit تغییر نام دهید و از منوی File گزینه SaveAll را انتخاب کنید.



252

253

254

255

مجید
21 / June / 2015, 02:24 AM
فرم ثبت عضویت (RegisterForm)
از منوی File گزینه New و سپس ...Other را انتخاب کنید. و مانند تصویر یک فرم جدید که از همان BaseForm ارث بری میکند ایجاد کنید.


273






نام فرم را به RegisterForm تغییر داده و Unit آنرا با نام RegisterUnit ذخیره کنید.
روی فرم 4 عدد TIWEdit و یک عدد TTIWEmailEdit و یک عدد TIWGradButton قرار دهید و مشخصات آنها را به ترتیب زیر تغییر دهید :





object IWEditUsername: TIWEdit [0]
Left = 24
Top = 16
Width = 120
Height = 21
Cursor = crAuto
ParentShowHint = False
ShowHint = True
ZIndex = 0
RenderSize = True
Alignment = taLeftJustify
BGColor = clNone
FocusColor = clWebAQUAMARINE
Editable = True
NonEditableAsLabel = False
Font.Color = clNone
Font.Size = 10
Font.Style = []
FriendlyName = 'IWEditUsername'
MaxLength = 0
ReadOnly = False
Required = False
ScriptEvents = <>
SubmitOnAsyncEvent = True
TabOrder = 0
PasswordPrompt = False
end
object IWEmailEdit: TTIWEmailEdit [1]
Left = 24
Top = 43
Width = 121
Height = 21
Cursor = crAuto
ParentShowHint = False
ShowHint = True
ZIndex = 0
RenderSize = True
Alignment = taLeftJustify
BGColor = clNone
FocusColor = clWebAQUAMARINE
Editable = True
NonEditableAsLabel = False
Font.Color = clNone
Font.Size = 10
Font.Style = []
FriendlyName = 'IWEmailEdit'
MaxLength = 0
ReadOnly = False
Required = True
ScriptEvents = <>
SubmitOnAsyncEvent = True
TabOrder = 1
Flat = False
ErrorMessage = #1604#1591#1601#1575' '#1740#1705' '#1570#1583#1585#1587' '#1575#1740#1605#1740#1604' '#1605#1593#1578#1576#1585' '#1608#1575#1585#1583' '#1705#1606#1740#1583'.'
WarnOnly = False
end
object IWEditFullName: TIWEdit [2]
Left = 24
Top = 70
Width = 120
Height = 21
Cursor = crAuto
ParentShowHint = False
ShowHint = True
ZIndex = 0
RenderSize = True
Alignment = taLeftJustify
BGColor = clNone
FocusColor = clWebAQUAMARINE
Editable = True
NonEditableAsLabel = False
Font.Color = clNone
Font.Size = 10
Font.Style = []
FriendlyName = 'IWEditFullName'
MaxLength = 0
ReadOnly = False
Required = False
ScriptEvents = <>
SubmitOnAsyncEvent = True
TabOrder = 2
PasswordPrompt = False
end
object IWEditPassword: TIWEdit [3]
Left = 24
Top = 99
Width = 120
Height = 21
Cursor = crAuto
ParentShowHint = False
ShowHint = True
ZIndex = 0
RenderSize = True
Alignment = taLeftJustify
BGColor = clNone
FocusColor = clWebAQUAMARINE
Editable = True
NonEditableAsLabel = False
Font.Color = clNone
Font.Size = 10
Font.Style = []
FriendlyName = 'IWEditPassword'
MaxLength = 0
ReadOnly = False
Required = False
ScriptEvents = <>
SubmitOnAsyncEvent = True
TabOrder = 3
PasswordPrompt = True
end
object IWEditConfirmPassword: TIWEdit [4]
Left = 24
Top = 126
Width = 120
Height = 21
Cursor = crAuto
ParentShowHint = False
ShowHint = True
ZIndex = 0
RenderSize = True
Alignment = taLeftJustify
BGColor = clNone
FocusColor = clWebAQUAMARINE
Editable = True
NonEditableAsLabel = False
Font.Color = clNone
Font.Size = 10
Font.Style = []
FriendlyName = 'IWEditConfirmPassword'
MaxLength = 0
ReadOnly = False
Required = False
ScriptEvents = <>
SubmitOnAsyncEvent = True
TabOrder = 4
PasswordPrompt = True
end
object IWGradButtonRegister: TIWGradButton [5]
Left = 24
Top = 153
Width = 120
Height = 21
Cursor = crAuto
ParentShowHint = False
ShowHint = True
ZIndex = 0
RenderSize = True
Style.Border.Color = 818394
Style.Border.Width = 1
Style.BorderDisabled.Color = clWebGRAY
Style.BorderDisabled.Width = 1
Style.Button.Alignment = taCenter
Style.Button.Font.Color = clWebWHITE
Style.Button.Font.FontFamily = 'Arial, Sans-Serif, Verdana'
Style.Button.Font.Size = 10
Style.Button.Font.Style = []
Style.Button.FromColor = 1746426
Style.Button.ToColor = 2128628
Style.ButtonHover.Alignment = taCenter
Style.ButtonHover.Font.Color = clWebWHITE
Style.ButtonHover.Font.FontFamily = 'Arial, Sans-Serif, Verdana'
Style.ButtonHover.Font.Size = 10
Style.ButtonHover.Font.Style = []
Style.ButtonHover.FromColor = 1150712
Style.ButtonHover.ToColor = 1401072
Style.ButtonActive.Alignment = taCenter
Style.ButtonActive.Font.Color = clWebWHITE
Style.ButtonActive.Font.FontFamily = 'Arial, Sans-Serif, Verdana'
Style.ButtonActive.Font.Size = 10
Style.ButtonActive.Font.Style = []
Style.ButtonActive.FromColor = 2128628
Style.ButtonActive.ToColor = 1746426
Style.ButtonDisabled.Alignment = taCenter
Style.ButtonDisabled.Font.Color = clWebWHITE
Style.ButtonDisabled.Font.FontFamily = 'Arial, Sans-Serif, Verdana'
Style.ButtonDisabled.Font.Size = 10
Style.ButtonDisabled.Font.Style = []
Style.ButtonDisabled.FromColor = clWebLIGHTGRAY
Style.ButtonDisabled.ToColor = 7368816
Style.ColorScheme = csOrange
Style.BoxShadow.ColorTransparency = 0.500000000000000000
Style.TextShadow.ColorTransparency = 0.500000000000000000
Caption = #1579#1576#1578
Color = clBtnFace
Font.Color = clNone
Font.Size = 10
Font.Style = []
FriendlyName = 'IWGradButtonRegister'
ScriptEvents = <>
TabOrder = 5
OnClick = IWGradButtonRegisterClick
OnAsyncClick = IWGradButtonRegisterAsyncClick
end

مجید
21 / June / 2015, 02:38 AM
فرم ورود (LoginForm)
از منوی File گزینه New و سپس ...Other را انتخاب کنید. و مانند تصویر یک فرم جدید که از همان BaseForm ارث بری میکند ایجاد کنید.


259



نام فرم را به LoginForm تغییر داده و Unit آنرا با نام LoginUnit ذخیره کنید.
روی فرم 2 عدد TIWEdit و 2 عدد TIWLink و یک عدد TIWGradButton قرار دهید و مشخصات آنها را به ترتیب زیر تغییر دهید :





object IWEditUsername: TIWEdit [0]
Left = 24
Top = 16
Width = 121
Height = 21
Cursor = crAuto
ParentShowHint = False
ShowHint = True
ZIndex = 0
RenderSize = True
Alignment = taLeftJustify
BGColor = clNone
FocusColor = clWebAQUAMARINE
Editable = True
NonEditableAsLabel = False
Font.Color = clNone
Font.Size = 10
Font.Style = []
FriendlyName = 'IWEditUsername'
MaxLength = 0
ReadOnly = False
Required = False
ScriptEvents = <>
SubmitOnAsyncEvent = True
TabOrder = 0
PasswordPrompt = False
end
object IWEditPassword: TIWEdit [1]
Left = 24
Top = 40
Width = 121
Height = 21
Cursor = crAuto
ParentShowHint = False
ShowHint = True
ZIndex = 0
RenderSize = True
Alignment = taLeftJustify
BGColor = clNone
FocusColor = clWebAQUAMARINE
Editable = True
NonEditableAsLabel = False
Font.Color = clNone
Font.Size = 10
Font.Style = []
FriendlyName = 'IWEditPassword'
MaxLength = 0
ReadOnly = False
Required = False
ScriptEvents = <>
SubmitOnAsyncEvent = True
TabOrder = 1
PasswordPrompt = True
end
object IWGradButtonLogin: TIWGradButton [2]
Left = 24
Top = 67
Width = 121
Height = 21
Cursor = crAuto
ParentShowHint = False
ShowHint = True
ZIndex = 0
RenderSize = True
Style.Border.Color = 1213267
Style.Border.Width = 1
Style.BorderDisabled.Color = clWebGRAY
Style.BorderDisabled.Width = 1
Style.Button.Alignment = taCenter
Style.Button.Font.Color = clWebWHITE
Style.Button.Font.FontFamily = 'Arial, Sans-Serif, Verdana'
Style.Button.Font.Size = 10
Style.Button.Font.Style = []
Style.Button.FromColor = 3127165
Style.Button.ToColor = 949582
Style.ButtonHover.Alignment = taCenter
Style.ButtonHover.Font.Color = clWebWHITE
Style.ButtonHover.Font.FontFamily = 'Arial, Sans-Serif, Verdana'
Style.ButtonHover.Font.Size = 10
Style.ButtonHover.Font.Style = []
Style.ButtonHover.FromColor = 2661739
Style.ButtonHover.ToColor = 813891
Style.ButtonActive.Alignment = taCenter
Style.ButtonActive.Font.Color = clWebWHITE
Style.ButtonActive.Font.FontFamily = 'Arial, Sans-Serif, Verdana'
Style.ButtonActive.Font.Size = 10
Style.ButtonActive.Font.Style = []
Style.ButtonActive.FromColor = 949582
Style.ButtonActive.ToColor = 3127165
Style.ButtonDisabled.Alignment = taCenter
Style.ButtonDisabled.Font.Color = clWebWHITE
Style.ButtonDisabled.Font.FontFamily = 'Arial, Sans-Serif, Verdana'
Style.ButtonDisabled.Font.Size = 10
Style.ButtonDisabled.Font.Style = []
Style.ButtonDisabled.FromColor = clWebLIGHTGRAY
Style.ButtonDisabled.ToColor = 7368816
Style.ColorScheme = csGreen
Style.BoxShadow.ColorTransparency = 0.500000000000000000
Style.TextShadow.ColorTransparency = 0.500000000000000000
Caption = #1608#1585#1608#1583
Color = clBtnFace
Font.Color = clNone
Font.Size = 10
Font.Style = []
FriendlyName = 'IWGradButtonLogin'
ScriptEvents = <>
TabOrder = 2
OnClick = IWGradButtonLoginClick
OnAsyncClick = IWGradButtonLoginAsyncClick
end
object IWLinkForgetPassword: TIWLink [3]
Left = 33
Top = 94
Width = 105
Height = 17
Cursor = crAuto
ParentShowHint = False
ShowHint = True
ZIndex = 0
RenderSize = True
Alignment = taLeftJustify
Color = clNone
Font.Color = clWebBLUE
Font.Size = 10
Font.Style = []
ScriptEvents = <>
DoSubmitValidation = False
FriendlyName = 'IWLinkForgetPassword'
OnClick = IWLinkForgetPasswordClick
TabOrder = 3
RawText = False
Caption = #1601#1585#1575#1605#1608#1588#1740' '#1585#1605#1586' '#1593#1576#1608#1585
end
object IWLinkRegister: TIWLink [4]
Left = 69
Top = 110
Width = 49
Height = 17
Cursor = crAuto
ParentShowHint = False
ShowHint = True
ZIndex = 0
RenderSize = True
Alignment = taLeftJustify
Color = clNone
Font.Color = clWebRED
Font.Size = 10
Font.Style = []
ScriptEvents = <>
DoSubmitValidation = False
FriendlyName = 'IWLinkRegister'
OnClick = IWLinkRegisterClick
TabOrder = 4
RawText = False
Caption = #1579#1576#1578' '#1606#1575#1605
end

مجید
21 / June / 2015, 02:48 AM
فرم تغییر رمز عبور (ChangePasswordForm)
از منوی File گزینه New و سپس ...Other را انتخاب کنید. و مانند تصویر یک فرم جدید که از همان BaseForm ارث بری میکند ایجاد کنید.



261

نام فرم را به ChangePasswordForm تغییر داده و Unit آنرا با نام ChangePasswordUnit ذخیره کنید.
روی فرم 3 عدد TIWEdit و یک عدد TIWGradButton قرار دهید و مشخصات آنها را به ترتیب زیر تغییر دهید :





object IWEditCurrentPassword: TIWEdit [0]
Left = 24
Top = 19
Width = 120
Height = 21
Cursor = crAuto
ParentShowHint = False
ShowHint = True
ZIndex = 0
RenderSize = True
Alignment = taLeftJustify
BGColor = clNone
FocusColor = clWebAQUAMARINE
Editable = True
NonEditableAsLabel = False
Font.Color = clNone
Font.Size = 10
Font.Style = []
FriendlyName = 'IWEditCurrentPassword'
MaxLength = 0
ReadOnly = False
Required = False
ScriptEvents = <>
SubmitOnAsyncEvent = True
TabOrder = 0
PasswordPrompt = True
end
object IWEditNewPassword: TIWEdit [1]
Left = 24
Top = 46
Width = 120
Height = 21
Cursor = crAuto
ParentShowHint = False
ShowHint = True
ZIndex = 0
RenderSize = True
Alignment = taLeftJustify
BGColor = clNone
FocusColor = clWebAQUAMARINE
Editable = True
NonEditableAsLabel = False
Font.Color = clNone
Font.Size = 10
Font.Style = []
FriendlyName = 'IWEditNewPassword'
MaxLength = 0
ReadOnly = False
Required = False
ScriptEvents = <>
SubmitOnAsyncEvent = True
TabOrder = 1
PasswordPrompt = True
end
object IWEditConfirmNewPassword: TIWEdit [2]
Left = 24
Top = 73
Width = 120
Height = 21
Cursor = crAuto
ParentShowHint = False
ShowHint = True
ZIndex = 0
RenderSize = True
Alignment = taLeftJustify
BGColor = clNone
FocusColor = clWebAQUAMARINE
Editable = True
NonEditableAsLabel = False
Font.Color = clNone
Font.Size = 10
Font.Style = []
FriendlyName = 'IWEditConfirmNewPassword'
MaxLength = 0
ReadOnly = False
Required = False
ScriptEvents = <>
SubmitOnAsyncEvent = True
TabOrder = 2
PasswordPrompt = True
end
object IWGradButtonChangePassword: TIWGradButton [3]
Left = 24
Top = 100
Width = 120
Height = 21
Cursor = crAuto
ParentShowHint = False
ShowHint = True
ZIndex = 0
RenderSize = True
Style.Border.Color = 818394
Style.Border.Width = 1
Style.BorderDisabled.Color = clWebGRAY
Style.BorderDisabled.Width = 1
Style.Button.Alignment = taCenter
Style.Button.Font.Color = clWebWHITE
Style.Button.Font.FontFamily = 'Arial, Sans-Serif, Verdana'
Style.Button.Font.Size = 10
Style.Button.Font.Style = []
Style.Button.FromColor = 1746426
Style.Button.ToColor = 2128628
Style.ButtonHover.Alignment = taCenter
Style.ButtonHover.Font.Color = clWebWHITE
Style.ButtonHover.Font.FontFamily = 'Arial, Sans-Serif, Verdana'
Style.ButtonHover.Font.Size = 10
Style.ButtonHover.Font.Style = []
Style.ButtonHover.FromColor = 1150712
Style.ButtonHover.ToColor = 1401072
Style.ButtonActive.Alignment = taCenter
Style.ButtonActive.Font.Color = clWebWHITE
Style.ButtonActive.Font.FontFamily = 'Arial, Sans-Serif, Verdana'
Style.ButtonActive.Font.Size = 10
Style.ButtonActive.Font.Style = []
Style.ButtonActive.FromColor = 2128628
Style.ButtonActive.ToColor = 1746426
Style.ButtonDisabled.Alignment = taCenter
Style.ButtonDisabled.Font.Color = clWebWHITE
Style.ButtonDisabled.Font.FontFamily = 'Arial, Sans-Serif, Verdana'
Style.ButtonDisabled.Font.Size = 10
Style.ButtonDisabled.Font.Style = []
Style.ButtonDisabled.FromColor = clWebLIGHTGRAY
Style.ButtonDisabled.ToColor = 7368816
Style.ColorScheme = csOrange
Style.BoxShadow.ColorTransparency = 0.500000000000000000
Style.TextShadow.ColorTransparency = 0.500000000000000000
Caption = #1579#1576#1578' '#1585#1605#1586' '#1593#1576#1608#1585' '#1580#1583#1740#1583
Color = clBtnFace
Font.Color = clNone
Font.Size = 10
Font.Style = []
FriendlyName = 'IWGradButtonChangePassword'
ScriptEvents = <>
TabOrder = 3
end



----------------------------------------------------------------------------------------------------------------------------
فرم فراموشی رمز عبور (ForgetPasswordForm)
یک بار دیگر از منوی File گزینه New و سپس ...Other را انتخاب کنید. و یک فرم جدید که از همان BaseForm ارث بری میکند ایجاد کنید.
نام فرم را به ForgetPasswordForm تغییر داده و Unit آنرا با نام ForgetPasswordUnit ذخیره کنید.
روی فرم 1 عدد TTIWEmailEdit و یک عدد TIWGradButton قرار دهید و مشخصات آنها را به ترتیب زیر تغییر دهید :




object IWEmailEdit: TTIWEmailEdit [0]
Left = 24
Top = 19
Width = 161
Height = 21
Cursor = crAuto
ParentShowHint = False
ShowHint = True
ZIndex = 0
RenderSize = True
Alignment = taLeftJustify
BGColor = clNone
FocusColor = clWebAQUAMARINE
Editable = True
NonEditableAsLabel = False
Font.Color = clNone
Font.Size = 10
Font.Style = []
FriendlyName = 'IWEmailEdit'
MaxLength = 0
ReadOnly = False
Required = True
ScriptEvents = <>
SubmitOnAsyncEvent = True
TabOrder = 0
Flat = False
ErrorMessage = #1604#1591#1601#1575' '#1740#1705' '#1570#1583#1585#1587' '#1575#1740#1605#1740#1604' '#1605#1593#1578#1576#1585' '#1608#1575#1585#1583' '#1705#1606#1740#1583'.'
WarnOnly = False
end
object IWGradButtonSendPassword: TIWGradButton [1]
Left = 25
Top = 46
Width = 160
Height = 21
Cursor = crAuto
ParentShowHint = False
ShowHint = True
ZIndex = 0
RenderSize = True
Style.Border.Color = 818394
Style.Border.Width = 1
Style.BorderDisabled.Color = clWebGRAY
Style.BorderDisabled.Width = 1
Style.Button.Alignment = taCenter
Style.Button.Font.Color = clWebWHITE
Style.Button.Font.FontFamily = 'Arial, Sans-Serif, Verdana'
Style.Button.Font.Size = 10
Style.Button.Font.Style = []
Style.Button.FromColor = 1746426
Style.Button.ToColor = 2128628
Style.ButtonHover.Alignment = taCenter
Style.ButtonHover.Font.Color = clWebWHITE
Style.ButtonHover.Font.FontFamily = 'Arial, Sans-Serif, Verdana'
Style.ButtonHover.Font.Size = 10
Style.ButtonHover.Font.Style = []
Style.ButtonHover.FromColor = 1150712
Style.ButtonHover.ToColor = 1401072
Style.ButtonActive.Alignment = taCenter
Style.ButtonActive.Font.Color = clWebWHITE
Style.ButtonActive.Font.FontFamily = 'Arial, Sans-Serif, Verdana'
Style.ButtonActive.Font.Size = 10
Style.ButtonActive.Font.Style = []
Style.ButtonActive.FromColor = 2128628
Style.ButtonActive.ToColor = 1746426
Style.ButtonDisabled.Alignment = taCenter
Style.ButtonDisabled.Font.Color = clWebWHITE
Style.ButtonDisabled.Font.FontFamily = 'Arial, Sans-Serif, Verdana'
Style.ButtonDisabled.Font.Size = 10
Style.ButtonDisabled.Font.Style = []
Style.ButtonDisabled.FromColor = clWebLIGHTGRAY
Style.ButtonDisabled.ToColor = 7368816
Style.ColorScheme = csOrange
Style.BoxShadow.ColorTransparency = 0.500000000000000000
Style.TextShadow.ColorTransparency = 0.500000000000000000
Caption = #1575#1585#1587#1575#1604' '#1585#1605#1586' '#1593#1576#1608#1585' '#1576#1607' '#1575#1740#1605#1740#1604
Color = clBtnFace
Font.Color = clNone
Font.Size = 10
Font.Style = []
FriendlyName = 'IWGradButtonSendPassword'
ScriptEvents = <>
TabOrder = 1
end

مجید
21 / June / 2015, 02:58 AM
فرم پروفایل کاربر (UserProfileForm)
از منوی File گزینه New و سپس ...Other را انتخاب کنید. و مانند تصویر یک فرم جدید که از همان BaseForm ارث بری میکند ایجاد کنید.



263

نام فرم را به UserProfileForm تغییر داده و Unit آنرا با نام UserProfileUnit ذخیره کنید.
روی فرم 9 عدد TIWLabel قرار دهید و مشخصات آنها را به ترتیب زیر تغییر دهید :





object IWLabelUsername: TIWLabel [0]
Left = 40
Top = 16
Width = 114
Height = 16
Cursor = crAuto
ParentShowHint = False
ShowHint = True
ZIndex = 0
RenderSize = True
Alignment = taLeftJustify
BGColor = clNone
Font.Color = clNone
Font.Size = 10
Font.Style = []
NoWrap = False
ConvertSpaces = False
HasTabOrder = False
FriendlyName = 'IWLabelUsername'
Caption = 'IWLabelUsername'
RawText = False
end
object IWLabelTotalPoint: TIWLabel [1]
Left = 40
Top = 48
Width = 113
Height = 16
Cursor = crAuto
ParentShowHint = False
ShowHint = True
ZIndex = 0
RenderSize = True
Alignment = taLeftJustify
BGColor = clNone
Font.Color = clNone
Font.Size = 10
Font.Style = []
NoWrap = False
ConvertSpaces = False
HasTabOrder = False
FriendlyName = 'IWLabelTotalPoint'
Caption = 'IWLabelTotalPoint'
RawText = False
end
object IWLabelEMail: TIWLabel [2]
Left = 40
Top = 32
Width = 83
Height = 16
Cursor = crAuto
ParentShowHint = False
ShowHint = True
ZIndex = 0
RenderSize = True
Alignment = taLeftJustify
BGColor = clNone
Font.Color = clNone
Font.Size = 10
Font.Style = []
NoWrap = False
ConvertSpaces = False
HasTabOrder = False
FriendlyName = 'IWLabelEMail'
Caption = 'IWLabelEMail'
RawText = False
end
object IWLabelPoint3: TIWLabel [3]
Left = 40
Top = 64
Width = 89
Height = 16
Cursor = crAuto
ParentShowHint = False
ShowHint = True
ZIndex = 0
RenderSize = True
Alignment = taLeftJustify
BGColor = clNone
Font.Color = clNone
Font.Size = 10
Font.Style = []
NoWrap = False
ConvertSpaces = False
HasTabOrder = False
FriendlyName = 'IWLabelPoint3'
Caption = 'IWLabelPoint3'
RawText = False
end
object IWLabelPoint4: TIWLabel [4]
Left = 40
Top = 80
Width = 89
Height = 16
Cursor = crAuto
ParentShowHint = False
ShowHint = True
ZIndex = 0
RenderSize = True
Alignment = taLeftJustify
BGColor = clNone
Font.Color = clNone
Font.Size = 10
Font.Style = []
NoWrap = False
ConvertSpaces = False
HasTabOrder = False
FriendlyName = 'IWLabelPoint4'
Caption = 'IWLabelPoint4'
RawText = False
end
object IWLabelPoint5: TIWLabel [5]
Left = 40
Top = 96
Width = 89
Height = 16
Cursor = crAuto
ParentShowHint = False
ShowHint = True
ZIndex = 0
RenderSize = True
Alignment = taLeftJustify
BGColor = clNone
Font.Color = clNone
Font.Size = 10
Font.Style = []
NoWrap = False
ConvertSpaces = False
HasTabOrder = False
FriendlyName = 'IWLabelPoint5'
Caption = 'IWLabelPoint5'
RawText = False
end
object IWLabelCount3: TIWLabel [6]
Left = 40
Top = 112
Width = 94
Height = 16
Cursor = crAuto
ParentShowHint = False
ShowHint = True
ZIndex = 0
RenderSize = True
Alignment = taLeftJustify
BGColor = clNone
Font.Color = clNone
Font.Size = 10
Font.Style = []
NoWrap = False
ConvertSpaces = False
HasTabOrder = False
FriendlyName = 'IWLabelCount3'
Caption = 'IWLabelCount3'
RawText = False
end
object IWLabelCount4: TIWLabel [7]
Left = 40
Top = 128
Width = 94
Height = 16
Cursor = crAuto
ParentShowHint = False
ShowHint = True
ZIndex = 0
RenderSize = True
Alignment = taLeftJustify
BGColor = clNone
Font.Color = clNone
Font.Size = 10
Font.Style = []
NoWrap = False
ConvertSpaces = False
HasTabOrder = False
FriendlyName = 'IWLabelCount4'
Caption = 'IWLabelCount4'
RawText = False
end
object IWLabelCount5: TIWLabel [8]
Left = 40
Top = 144
Width = 94
Height = 16
Cursor = crAuto
ParentShowHint = False
ShowHint = True
ZIndex = 0
RenderSize = True
Alignment = taLeftJustify
BGColor = clNone
Font.Color = clNone
Font.Size = 10
Font.Style = []
NoWrap = False
ConvertSpaces = False
HasTabOrder = False
FriendlyName = 'IWLabelCount5'
Caption = 'IWLabelCount5'
RawText = False
end

مجید
21 / June / 2015, 03:10 AM
فرم انتخاب سطح دشواری بازی (SelectDifficultyLevelForm)
از منوی File گزینه New و سپس ...Other را انتخاب کنید. و مانند تصویر یک فرم جدید که از همان BaseForm ارث بری میکند ایجاد کنید.



265

نام فرم را به SelectDifficultyLevelForm تغییر داده و Unit آنرا با نام SelectDifficultyLevelUnit ذخیره کنید.
روی فرم 3 عدد TIWGradButton قرار دهید و مشخصات آنها را به ترتیب زیر تغییر دهید :





object IWGradButtonEasy: TIWGradButton [0]
Left = 24
Top = 20
Width = 130
Height = 21
Cursor = crAuto
ParentShowHint = False
ShowHint = True
ZIndex = 0
RenderSize = True
Style.Border.Color = 105166
Style.Border.Width = 1
Style.BorderDisabled.Color = clWebGRAY
Style.BorderDisabled.Width = 1
Style.Button.Alignment = taCenter
Style.Button.Font.Color = clWebBLACK
Style.Button.Font.FontFamily = 'Arial, Sans-Serif, Verdana'
Style.Button.Font.Size = 10
Style.Button.Font.Style = []
Style.Button.FromColor = 6215423
Style.Button.ToColor = 311294
Style.ButtonHover.Alignment = taCenter
Style.ButtonHover.Font.Color = clWebWHITE
Style.ButtonHover.Font.FontFamily = 'Arial, Sans-Serif, Verdana'
Style.ButtonHover.Font.Size = 10
Style.ButtonHover.Font.Style = []
Style.ButtonHover.FromColor = 105166
Style.ButtonHover.ToColor = 2869759
Style.ButtonActive.Alignment = taCenter
Style.ButtonActive.Font.Color = clWebWHITE
Style.ButtonActive.Font.FontFamily = 'Arial, Sans-Serif, Verdana'
Style.ButtonActive.Font.Size = 10
Style.ButtonActive.Font.Style = []
Style.ButtonActive.FromColor = 311294
Style.ButtonActive.ToColor = 6215423
Style.ButtonDisabled.Alignment = taCenter
Style.ButtonDisabled.Font.Color = clWebWHITE
Style.ButtonDisabled.Font.FontFamily = 'Arial, Sans-Serif, Verdana'
Style.ButtonDisabled.Font.Size = 10
Style.ButtonDisabled.Font.Style = []
Style.ButtonDisabled.FromColor = clWebLIGHTGRAY
Style.ButtonDisabled.ToColor = 7368816
Style.ColorScheme = csYellow
Style.BoxShadow.ColorTransparency = 0.500000000000000000
Style.TextShadow.ColorTransparency = 0.500000000000000000
Caption = #1587#1575#1583#1607' - '#1587#1607' '#1581#1585#1601#1740
Color = clBtnFace
Font.Color = clNone
Font.Size = 10
Font.Style = []
FriendlyName = 'IWGradButtonEasy'
ScriptEvents = <>
TabOrder = 0
end
object IWGradButtonMiddle: TIWGradButton [1]
Left = 24
Top = 44
Width = 130
Height = 21
Cursor = crAuto
ParentShowHint = False
ShowHint = True
ZIndex = 0
RenderSize = True
Style.Border.Color = 818394
Style.Border.Width = 1
Style.BorderDisabled.Color = clWebGRAY
Style.BorderDisabled.Width = 1
Style.Button.Alignment = taCenter
Style.Button.Font.Color = clWebWHITE
Style.Button.Font.FontFamily = 'Arial, Sans-Serif, Verdana'
Style.Button.Font.Size = 10
Style.Button.Font.Style = []
Style.Button.FromColor = 1746426
Style.Button.ToColor = 2128628
Style.ButtonHover.Alignment = taCenter
Style.ButtonHover.Font.Color = clWebWHITE
Style.ButtonHover.Font.FontFamily = 'Arial, Sans-Serif, Verdana'
Style.ButtonHover.Font.Size = 10
Style.ButtonHover.Font.Style = []
Style.ButtonHover.FromColor = 1150712
Style.ButtonHover.ToColor = 1401072
Style.ButtonActive.Alignment = taCenter
Style.ButtonActive.Font.Color = clWebWHITE
Style.ButtonActive.Font.FontFamily = 'Arial, Sans-Serif, Verdana'
Style.ButtonActive.Font.Size = 10
Style.ButtonActive.Font.Style = []
Style.ButtonActive.FromColor = 2128628
Style.ButtonActive.ToColor = 1746426
Style.ButtonDisabled.Alignment = taCenter
Style.ButtonDisabled.Font.Color = clWebWHITE
Style.ButtonDisabled.Font.FontFamily = 'Arial, Sans-Serif, Verdana'
Style.ButtonDisabled.Font.Size = 10
Style.ButtonDisabled.Font.Style = []
Style.ButtonDisabled.FromColor = clWebLIGHTGRAY
Style.ButtonDisabled.ToColor = 7368816
Style.ColorScheme = csOrange
Style.BoxShadow.ColorTransparency = 0.500000000000000000
Style.TextShadow.ColorTransparency = 0.500000000000000000
Caption = #1605#1578#1608#1587#1591' - '#1670#1607#1575#1585' '#1581#1585#1601#1740
Color = clBtnFace
Font.Color = clNone
Font.Size = 10
Font.Style = []
FriendlyName = 'IWGradButtonMiddle'
ScriptEvents = <>
TabOrder = 1
end
object IWGradButtonHard: TIWGradButton [2]
Left = 24
Top = 68
Width = 130
Height = 21
Cursor = crAuto
ParentShowHint = False
ShowHint = True
ZIndex = 0
RenderSize = True
Style.Border.Color = 1051800
Style.Border.Width = 1
Style.BorderDisabled.Color = clWebGRAY
Style.BorderDisabled.Width = 1
Style.Button.Alignment = taCenter
Style.Button.Font.Color = clWebWHITE
Style.Button.Font.FontFamily = 'Arial, Sans-Serif, Verdana'
Style.Button.Font.Size = 10
Style.Button.Font.Style = []
Style.Button.FromColor = 2366701
Style.Button.ToColor = 1512362
Style.ButtonHover.Alignment = taCenter
Style.ButtonHover.Font.Color = clWebWHITE
Style.ButtonHover.Font.FontFamily = 'Arial, Sans-Serif, Verdana'
Style.ButtonHover.Font.Size = 10
Style.ButtonHover.Font.Style = []
Style.ButtonHover.FromColor = 1775049
Style.ButtonHover.ToColor = 1380769
Style.ButtonActive.Alignment = taCenter
Style.ButtonActive.Font.Color = clWebWHITE
Style.ButtonActive.Font.FontFamily = 'Arial, Sans-Serif, Verdana'
Style.ButtonActive.Font.Size = 10
Style.ButtonActive.Font.Style = []
Style.ButtonActive.FromColor = 1512362
Style.ButtonActive.ToColor = 2366701
Style.ButtonDisabled.Alignment = taCenter
Style.ButtonDisabled.Font.Color = clWebWHITE
Style.ButtonDisabled.Font.FontFamily = 'Arial, Sans-Serif, Verdana'
Style.ButtonDisabled.Font.Size = 10
Style.ButtonDisabled.Font.Style = []
Style.ButtonDisabled.FromColor = clWebLIGHTGRAY
Style.ButtonDisabled.ToColor = 7368816
Style.ColorScheme = csRed
Style.BoxShadow.ColorTransparency = 0.500000000000000000
Style.TextShadow.ColorTransparency = 0.500000000000000000
Caption = #1587#1582#1578' - '#1662#1606#1580' '#1581#1585#1601#1740
Color = clBtnFace
Font.Color = clNone
Font.Size = 10
Font.Style = []
FriendlyName = 'IWGradButtonHard'
ScriptEvents = <>
TabOrder = 2
end

مجید
21 / June / 2015, 03:23 AM
فرم بازی (WordGameForm)
از منوی File گزینه New و سپس ...Other را انتخاب کنید. و مانند تصویر یک فرم جدید که از همان BaseForm ارث بری میکند ایجاد کنید.


266






نام فرم را به WordGameForm تغییر داده و Unit آنرا با نام WordGameUnit ذخیره کنید.
روی فرم 3 عدد TIWLabel
و 1 عدد TIWEdit
و 1 عدد TIWGradButton
و 1 عدد TTIWDBAdvWebGrid
و 1 عدد TDataSource
و 1 عدد TIWAJAXNotifier
و 1 عدد TIWTimer قرار دهید و مشخصات آنها را به ترتیب زیر تغییر دهید :





object IWLabelDifficultyLevel: TIWLabel [0]
Left = 16
Top = 16
Width = 135
Height = 16
Cursor = crAuto
ParentShowHint = False
ShowHint = True
ZIndex = 0
RenderSize = True
Alignment = taLeftJustify
BGColor = clNone
Font.Color = clNone
Font.Size = 10
Font.Style = []
NoWrap = False
ConvertSpaces = False
HasTabOrder = False
FriendlyName = 'IWLabelDifficultyLevel'
Caption = 'IWLabelDifficultyLevel'
RawText = False
end
object IWEditSuggestionWord: TIWEdit [1]
Left = 16
Top = 38
Width = 121
Height = 21
Cursor = crAuto
ParentShowHint = False
ShowHint = True
ZIndex = 0
RenderSize = True
Alignment = taLeftJustify
BGColor = clNone
FocusColor = clWebAQUAMARINE
Editable = True
NonEditableAsLabel = False
Font.Color = clNone
Font.Size = 10
Font.Style = []
FriendlyName = 'IWEditSuggestionWord'
MaxLength = 0
ReadOnly = False
Required = False
ScriptEvents = <>
SubmitOnAsyncEvent = True
TabOrder = 0
OnAsyncKeyDown = IWEditSuggestionWordAsyncKeyDown
PasswordPrompt = False
end
object TIWDBAdvWebGridGame: TTIWDBAdvWebGrid [2]
Left = 191
Top = 11
Width = 322
Height = 377
Cursor = crPointer
ParentShowHint = False
ShowHint = True
ZIndex = 0
RenderSize = True
ActiveRowColor = clNone
ActiveRowFontColor = clNone
AdvanceOnReturn = False
AutoEdit = False
AutoHTMLAdapt = False
Background.GradientDirection = gdHorizontal
Background.Gradient1 = clNone
Background.Gradient2 = clNone
Background.Picture.Stretch = False
Background.Picture.Frame = 0
Bands.Active = True
Bands.PrimaryColor = clInfoBk
Bands.SecondaryColor = clWebWHITE
Borders.Inner = ibColumns
Borders.Outer = obVertical
Borders.Padding = 0
Borders.Spacing = 0
Borders.Width = 1
Borders.Collapsed = True
Borders.Color = clNone
Borders.ColorDark = clNone
Borders.ColorLight = clNone
CellComment.BorderColor = 14263350
CellComment.Color = 15784080
CellComment.DisplayType = dtMouseOver
CellComment.Font.Color = 9330453
CellComment.Font.Size = 10
CellComment.Font.Style = []
CheckTruePicture.Stretch = False
CheckTruePicture.Frame = 1
CheckTruePictureURL = '/True.png'
CheckFalsePicture.Stretch = False
CheckFalsePicture.Frame = 1
CheckFalsePictureURL = '/False.png'
Color = clNone
Columns = <
item
Alignment = taCenter
CanSort = False
CheckTrue = 'true'
CheckFalse = 'false'
ColumnHeaderAlignment = taCenter
ColumnHeaderClick = False
ColumnHeaderFont.Color = clNone
ColumnHeaderFont.Size = 10
ColumnHeaderFont.Style = []
DefaultDynEdit = '0'
DefaultDynText = '0'
DetailFont.Color = clNone
DetailFont.Size = 10
DetailFont.Style = []
Font.Color = clNone
Font.Size = 10
Font.Style = []
FooterFormat = '%g'
SpinEditMaxValue = 100
SpinEditMinValue = 0
Title = #1575#1605#1578#1610#1575#1586
Width = 80
DataField = 'Point'
end
item
Alignment = taCenter
CanSort = False
CheckTrue = 'true'
CheckFalse = 'false'
ColumnHeaderAlignment = taCenter
ColumnHeaderClick = False
ColumnHeaderFont.Color = clNone
ColumnHeaderFont.Size = 10
ColumnHeaderFont.Style = []
DataButtonType = dbtLink
DefaultDynEdit = '0'
DefaultDynText = '0'
DetailFont.Color = clNone
DetailFont.Size = 10
DetailFont.Style = []
Font.Color = clNone
Font.Size = 10
Font.Style = []
FooterFormat = '%g'
SpinEditMaxValue = 100
SpinEditMinValue = 0
Title = #1705#1604#1605#1607' '#1662#1610#1588#1606#1607#1575#1583#1740
Width = 100
DataField = 'SuggestionWord'
end
item
Alignment = taCenter
CanSort = False
CheckTrue = 'true'
CheckFalse = 'false'
ColumnHeaderAlignment = taCenter
ColumnHeaderClick = False
ColumnHeaderFont.Color = clNone
ColumnHeaderFont.Size = 10
ColumnHeaderFont.Style = []
DefaultDynEdit = '0'
DefaultDynText = '0'
DetailFont.Color = clNone
DetailFont.Size = 10
DetailFont.Style = []
Font.Color = clNone
Font.Size = 10
Font.Style = []
FooterFormat = '%g'
SpinEditMaxValue = 100
SpinEditMinValue = 0
Title = #1705#1575#1585#1576#1585
Width = 135
DataField = 'FullName'
end>
ColumnHeaderColor = clWebGOLD
ColumnHeaderFont.Color = clNone
ColumnHeaderFont.Size = 10
ColumnHeaderFont.Style = []
ColumnHeaderBorders.Inner = ibAll
ColumnHeaderBorders.Outer = obAll
ColumnHeaderBorders.Padding = 0
ColumnHeaderBorders.Spacing = 0
ColumnHeaderBorders.Width = 1
ColumnHeaderBorders.Collapsed = True
ColumnHeaderBorders.Color = clNone
ColumnHeaderBorders.ColorDark = clNone
ColumnHeaderBorders.ColorLight = clNone
ColumnSizing = True
Controller.Alignment = taCenter
Controller.Borders.Inner = ibAll
Controller.Borders.Outer = obAll
Controller.Borders.Padding = 0
Controller.Borders.Spacing = 0
Controller.Borders.Width = 0
Controller.Borders.Collapsed = True
Controller.Borders.Color = clNone
Controller.Borders.ColorDark = clNone
Controller.Borders.ColorLight = clNone
Controller.Color = clWebMISTYROSE
Controller.Font.Color = clWebBLACK
Controller.Font.FontName = 'Tahoma'
Controller.Font.Size = 10
Controller.Font.Style = []
Controller.Gradient1 = clWebWHITE
Controller.Gradient2 = clWebGREEN
Controller.GradientDirection = gdVertical
Controller.Height = 24
Controller.MaxPages = 10
Controller.Position = cpTop
Controller.Pager = cpPrevNextFirstLast
Controller.PagerType = cptLink
Controller.IndicatorFormat = '%d of %d'
Controller.IndicatorType = itNone
Controller.TextPrev = #1589#1601#1581#1607' '#1602#1576#1604
Controller.TextNext = #1589#1601#1581#1607' '#1576#1593#1583
Controller.TextFirst = #1589#1601#1581#1607' '#1575#1608#1604
Controller.TextLast = #1589#1601#1581#1607' '#1570#1582#1585
Controller.ImgPrev.Stretch = False
Controller.ImgPrev.Frame = 0
Controller.ImgNext.Stretch = False
Controller.ImgNext.Frame = 0
Controller.ImgFirst.Stretch = False
Controller.ImgFirst.Frame = 0
Controller.ImgLast.Stretch = False
Controller.ImgLast.Frame = 0
Controller.RowCountSelect = False
Controller.HintFind = 'Find'
Controller.ShowPagersAlways = False
DateSeparator = '/'
DateFormat = gdEU
DecimalPoint = '.'
DefaultColumnHeaderHeight = 22
DefaultRowHeight = 22
DetailRowHeight = 22
DetailRowShow = dsNormal
EditColor = clNone
EditSelectAll = False
FooterBorders.Inner = ibAll
FooterBorders.Outer = obAll
FooterBorders.Padding = 0
FooterBorders.Spacing = 0
FooterBorders.Width = 1
FooterBorders.Collapsed = True
FooterBorders.Color = clNone
FooterBorders.ColorDark = clNone
FooterBorders.ColorLight = clNone
FooterColor = clBtnFace
FooterFont.Color = clNone
FooterFont.Size = 10
FooterFont.Style = []
Font.Color = clNone
Font.Size = 10
Font.Style = []
Glyphs.EditButton.Data = {
36050000424D36050000000000003604000028000000100000 00100000000100
08000000000000010000000000000000000000010000000000 00000000000000
80000080000000808000800000008000800080800000C0C0C0 00C0DCC000F0CA
A6000020400000206000002080000020A0000020C0000020E0 00004000000040
20000040400000406000004080000040A0000040C0000040E0 00006000000060
20000060400000606000006080000060A0000060C0000060E0 00008000000080
20000080400000806000008080000080A0000080C0000080E0 0000A0000000A0
200000A0400000A0600000A0800000A0A00000A0C00000A0E0 0000C0000000C0
200000C0400000C0600000C0800000C0A00000C0C00000C0E0 0000E0000000E0
200000E0400000E0600000E0800000E0A00000E0C00000E0E0 00400000004000
20004000400040006000400080004000A0004000C0004000E0 00402000004020
20004020400040206000402080004020A0004020C0004020E0 00404000004040
20004040400040406000404080004040A0004040C0004040E0 00406000004060
20004060400040606000406080004060A0004060C0004060E0 00408000004080
20004080400040806000408080004080A0004080C0004080E0 0040A0000040A0
200040A0400040A0600040A0800040A0A00040A0C00040A0E0 0040C0000040C0
200040C0400040C0600040C0800040C0A00040C0C00040C0E0 0040E0000040E0
200040E0400040E0600040E0800040E0A00040E0C00040E0E0 00800000008000
20008000400080006000800080008000A0008000C0008000E0 00802000008020
20008020400080206000802080008020A0008020C0008020E0 00804000008040
20008040400080406000804080008040A0008040C0008040E0 00806000008060
20008060400080606000806080008060A0008060C0008060E0 00808000008080
20008080400080806000808080008080A0008080C0008080E0 0080A0000080A0
200080A0400080A0600080A0800080A0A00080A0C00080A0E0 0080C0000080C0
200080C0400080C0600080C0800080C0A00080C0C00080C0E0 0080E0000080E0
200080E0400080E0600080E0800080E0A00080E0C00080E0E0 00C0000000C000
2000C0004000C0006000C0008000C000A000C000C000C000E0 00C0200000C020
2000C0204000C0206000C0208000C020A000C020C000C020E0 00C0400000C040
2000C0404000C0406000C0408000C040A000C040C000C040E0 00C0600000C060
2000C0604000C0606000C0608000C060A000C060C000C060E0 00C0800000C080
2000C0804000C0806000C0808000C080A000C080C000C080E0 00C0A00000C0A0
2000C0A04000C0A06000C0A08000C0A0A000C0A0C000C0A0E0 00C0C00000C0C0
2000C0C04000C0C06000C0C08000C0C0A000F0FBFF00A4A0A0 00808080000000
FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF 000707E4E4E4E4
E4E4E4E4E4E4E4E4E4070707EDF609090909090909090909E4 070707EDF60707
0707070707070709E4070707EDF6F6090909090909090909E4 070707EDFFF609
0909095A09090909E4070707F5FF07070707075200070709E4 070707F5FFFFF6
F609095A00000709E407070707FFFFFFF6F6095AFB360007E4 07070707FF0707
070707A4FB360007ED07070709FFFFFFFFF6F6F65BFB3600ED 07070709FFFFFF
FFFFF6F6ACFB36000707070709FF070707070707F652FB3600 07070709FFFFFF
FFFFFFFF079A7F360007070709FFFFFFFFFFFFFF08EC510002 00070709FFFFFF
FFFFFFFF07EC9A0202410707090909090909090907E4078383 07}
Glyphs.EditHint = 'Edit'
Glyphs.PostButton.Data = {
36050000424D36050000000000003604000028000000100000 00100000000100
08000000000000010000000000000000000000010000000000 00000000000000
80000080000000808000800000008000800080800000C0C0C0 00C0DCC000F0CA
A6000020400000206000002080000020A0000020C0000020E0 00004000000040
20000040400000406000004080000040A0000040C0000040E0 00006000000060
20000060400000606000006080000060A0000060C0000060E0 00008000000080
20000080400000806000008080000080A0000080C0000080E0 0000A0000000A0
200000A0400000A0600000A0800000A0A00000A0C00000A0E0 0000C0000000C0
200000C0400000C0600000C0800000C0A00000C0C00000C0E0 0000E0000000E0
200000E0400000E0600000E0800000E0A00000E0C00000E0E0 00400000004000
20004000400040006000400080004000A0004000C0004000E0 00402000004020
20004020400040206000402080004020A0004020C0004020E0 00404000004040
20004040400040406000404080004040A0004040C0004040E0 00406000004060
20004060400040606000406080004060A0004060C0004060E0 00408000004080
20004080400040806000408080004080A0004080C0004080E0 0040A0000040A0
200040A0400040A0600040A0800040A0A00040A0C00040A0E0 0040C0000040C0
200040C0400040C0600040C0800040C0A00040C0C00040C0E0 0040E0000040E0
200040E0400040E0600040E0800040E0A00040E0C00040E0E0 00800000008000
20008000400080006000800080008000A0008000C0008000E0 00802000008020
20008020400080206000802080008020A0008020C0008020E0 00804000008040
20008040400080406000804080008040A0008040C0008040E0 00806000008060
20008060400080606000806080008060A0008060C0008060E0 00808000008080
20008080400080806000808080008080A0008080C0008080E0 0080A0000080A0
200080A0400080A0600080A0800080A0A00080A0C00080A0E0 0080C0000080C0
200080C0400080C0600080C0800080C0A00080C0C00080C0E0 0080E0000080E0
200080E0400080E0600080E0800080E0A00080E0C00080E0E0 00C0000000C000
2000C0004000C0006000C0008000C000A000C000C000C000E0 00C0200000C020
2000C0204000C0206000C0208000C020A000C020C000C020E0 00C0400000C040
2000C0404000C0406000C0408000C040A000C040C000C040E0 00C0600000C060
2000C0604000C0606000C0608000C060A000C060C000C060E0 00C0800000C080
2000C0804000C0806000C0808000C080A000C080C000C080E0 00C0A00000C0A0
2000C0A04000C0A06000C0A08000C0A0A000C0A0C000C0A0E0 00C0C00000C0C0
2000C0C04000C0C06000C0C08000C0C0A000F0FBFF00A4A0A0 00808080000000
FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF 0007070707071D
1D1D1D1D1D0707070707070707271E1F2727271F1E1D1D0707 0707071E276FB7
F6F6F6BF6F271E1D0707072727B7F6FFF6F6F6FFFFBF271E1D 070727B7FFF6B7
6FBF276FF6FFBF271D07276FF6FF6F27F6FF6F1F27F6FF6F1E 1D27B7FFBF6FF6
FFF6B7271F6FFFBF1F1D27B7FFB7BFFFAF6FF6672727F6F627 1E67BFFFB76F6F
2727B7B72727F6F6271E6F08FFB76F6F6F676FB72727F6F627 1E67BFFFF66F6F
6F6F676F6FB7FFB7271D076FF6FFBF6F6F6F6727B7F6F66F1E 07076FF6F6FFF6
B7B7B7BFFFFFB7271E070707AFF6FFFFFFFFFFFFF6B7271F07 070707076FBFF6
F6F6F6B76F272707070707070707076FAFAF6F672707070707 07}
Glyphs.PostHint = 'Post'
Glyphs.CancelButton.Data = {
36050000424D36050000000000003604000028000000100000 00100000000100
08000000000000010000000000000000000000010000000000 00000000000000
80000080000000808000800000008000800080800000C0C0C0 00C0DCC000F0CA
A6000020400000206000002080000020A0000020C0000020E0 00004000000040
20000040400000406000004080000040A0000040C0000040E0 00006000000060
20000060400000606000006080000060A0000060C0000060E0 00008000000080
20000080400000806000008080000080A0000080C0000080E0 0000A0000000A0
200000A0400000A0600000A0800000A0A00000A0C00000A0E0 0000C0000000C0
200000C0400000C0600000C0800000C0A00000C0C00000C0E0 0000E0000000E0
200000E0400000E0600000E0800000E0A00000E0C00000E0E0 00400000004000
20004000400040006000400080004000A0004000C0004000E0 00402000004020
20004020400040206000402080004020A0004020C0004020E0 00404000004040
20004040400040406000404080004040A0004040C0004040E0 00406000004060
20004060400040606000406080004060A0004060C0004060E0 00408000004080
20004080400040806000408080004080A0004080C0004080E0 0040A0000040A0
200040A0400040A0600040A0800040A0A00040A0C00040A0E0 0040C0000040C0
200040C0400040C0600040C0800040C0A00040C0C00040C0E0 0040E0000040E0
200040E0400040E0600040E0800040E0A00040E0C00040E0E0 00800000008000
20008000400080006000800080008000A0008000C0008000E0 00802000008020
20008020400080206000802080008020A0008020C0008020E0 00804000008040
20008040400080406000804080008040A0008040C0008040E0 00806000008060
20008060400080606000806080008060A0008060C0008060E0 00808000008080
20008080400080806000808080008080A0008080C0008080E0 0080A0000080A0
200080A0400080A0600080A0800080A0A00080A0C00080A0E0 0080C0000080C0
200080C0400080C0600080C0800080C0A00080C0C00080C0E0 0080E0000080E0
200080E0400080E0600080E0800080E0A00080E0C00080E0E0 00C0000000C000
2000C0004000C0006000C0008000C000A000C000C000C000E0 00C0200000C020
2000C0204000C0206000C0208000C020A000C020C000C020E0 00C0400000C040
2000C0404000C0406000C0408000C040A000C040C000C040E0 00C0600000C060
2000C0604000C0606000C0608000C060A000C060C000C060E0 00C0800000C080
2000C0804000C0806000C0808000C080A000C080C000C080E0 00C0A00000C0A0
2000C0A04000C0A06000C0A08000C0A0A000C0A0C000C0A0E0 00C0C00000C0C0
2000C0C04000C0C06000C0C08000C0C0A000F0FBFF00A4A0A0 00808080000000
FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF 0007070707071D
1D1D1D1D1D0707070707070707271E1F2727271F1E1D1D0707 0707071E276FB7
F6F6F6BF6F271E1D0707072727B7F6FFF6F6F6FFFFBF271E1D 070727B7FFF627
27271F1FB7F6BF271D07276FF6FFB7B767272727B7B7FF6F1E 1D27B7FFBF67B7
F66767F6B727F6BF1F1D27B7FF6F6F67B7F6F6B72727BFF627 1E67BFFF6F6F6F
6FF6F66F2727B7F6271E6F08FF6F6F6FF6B7B7F66F27F6F627 1E67BFFFF66FF6
B76F6FB7F66FF6B7271D076FF6FFB7AF6F6F6F6FB7F6F66F1E 07076FF6F6FFF6
6F6F6FB7FFFFB7271E070707AFF6FFFFFFFFFFFFF6B7271F07 070707076FBFF6
F6F6F6B76F272707070707070707076FAFAF6F672707070707 07}
Glyphs.CancelHint = 'Cancel'
Glyphs.SpinEditButtonDownImage.Stretch = False
Glyphs.SpinEditButtonDownImage.Frame = 0
Glyphs.SpinEditButtonUpImage.Stretch = False
Glyphs.SpinEditButtonUpImage.Frame = 0
HoverColor = clGradientActiveCaption
HoverFontColor = clDefault
HeaderStyle = hsRaised
ID = 2
Indicators.Browse.Data = {
F6000000424DF6000000000000007600000028000000100000 00100000000100
04000000000080000000000000000000000010000000000000 00000000000000
80000080000000808000800000008000800080800000808080 00C0C0C0000000
FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF 00888888888888
88888888888888888888888808888888888888880088888888 88888800088888
88888888000088888888888800000888888888880000008888 88888800000008
88888888000000888888888800000888888888880000888888 88888800088888
88888888008888888888888808888888888888888888888888 88}
Indicators.Insert.Data = {
F6000000424DF6000000000000007600000028000000100000 00100000000100
04000000000080000000000000000000000010000000000000 00000000000000
80000080000000808000800000008000800080800000808080 00C0C0C0000000
FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF 00888888888888
88888888888888888888888888888888888888888888888888 88888888088888
88888888880888888888888008080088888888888000888888 88888880008888
88888880080800888888888888088888888888888808888888 88888888888888
88888888888888888888888888888888888888888888888888 88}
Indicators.Edit.Data = {
F6000000424DF6000000000000007600000028000000100000 00100000000100
04000000000080000000000000000000000010000000000000 00000000000000
80000080000000808000800000008000800080800000808080 00C0C0C0000000
FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF 00888888888888
88888888888888888888888888888888888888800800888888 88888880888888
88888888808888888888888880888888888888888088888888 88888880888888
88888888808888888888888880888888888888888088888888 88888880888888
88888880080088888888888888888888888888888888888888 88}
MouseSelect = msRow
Nodes.NodeOpen.Stretch = False
Nodes.NodeOpen.Frame = 1
Nodes.NodeOpen.Data = {
424DBE00000000000000760000002800000009000000090000 00010004000000
000048000000120B0000120B00001000000010000000000000 00000080000080
00000080800080000000800080008080000080808000C0C0C0 000000FF0000FF
000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00000000 00000000000FFF
FFFF000000000FFF0FFF000000000FFF0FFF000000000F0000 0F000000000FFF
0FFF000000000FFF0FFF000000000FFFFFFF00000000000000 0000000000}
Nodes.NodeClosed.Stretch = False
Nodes.NodeClosed.Frame = 1
Nodes.NodeClosed.Data = {
424DBE00000000000000760000002800000009000000090000 00010004000000
000048000000120B0000120B00001000000010000000000000 00000080000080
00000080800080000000800080008080000080808000C0C0C0 000000FF0000FF
000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00000000 00000000000FFF
FFFF000000000FFFFFFF000000000FFFFFFF000000000F0000 0F000000000FFF
FFFF000000000FFFFFFF000000000FFFFFFF00000000000000 0000000000}
NameOfDays.Strings = (
'Sun'
'Mon'
'Tue'
'Wed'
'Thu'
'Fri'
'Sat')
NameOfMonths.Strings = (
'January'
'February'
'March'
'April'
'May'
'June'
'July'
'August'
'September'
'October'
'November'
'December')
OuterBorder.Show = True
OuterBorder.Color = clWebBLACK
Page = 0
RowCount = 15
RowHeader.Show = False
RowHeader.Width = 22
RowHeader.Borders.Inner = ibColumns
RowHeader.Borders.Outer = obVertical
RowHeader.Borders.Padding = 0
RowHeader.Borders.Spacing = 0
RowHeader.Borders.Width = 1
RowHeader.Borders.Collapsed = False
RowHeader.Borders.Color = clNone
RowHeader.Borders.ColorDark = clNone
RowHeader.Borders.ColorLight = clNone
RowHeader.Color = clNone
RowHeader.Gradient1 = clWebBEIGE
RowHeader.Gradient2 = clWebGOLD
RowHeader.GradientDirection = gdHorizontal
Scroll.Style = scNever
Scroll.Scrollbar3DLightColor = clNone
Scroll.ScrollbarArrowColor = clNone
Scroll.ScrollbarBaseColor = clNone
Scroll.ScrollbarTrackColor = clNone
Scroll.ScrollbarDarkshadowColor = clNone
Scroll.ScrollbarFaceColor = clNone
Scroll.ScrollbarHighlightColor = clNone
Scroll.ScrollbarShadowColor = clNone
SelectColor = clHighlight
SelectFontColor = clHighlightText
ShowColumnHeader = True
ShowFooter = False
ShowSelect = True
SortSettings.Show = False
SortSettings.Column = 0
SortSettings.Direction = sdAscending
SortSettings.InitSortDir = sdAscending
StretchColumn = -1
TabOrder = 1
UseFullHeight = False
UseFullWidth = False
OnGetCellData = TIWDBAdvWebGridGameGetCellData
AsyncActiveRowMove = False
AsyncEdit = False
AsyncPaging = False
AsyncSorting = False
AutoAddAllFields = True
DataSource = DataSource1
ShowRowsAlways = True
end
object IWGradButtonSubmit: TIWGradButton [3]
Left = 16
Top = 65
Width = 120
Height = 21
Cursor = crAuto
ParentShowHint = False
ShowHint = True
ZIndex = 0
RenderSize = True
Style.Border.Color = 818394
Style.Border.Width = 1
Style.BorderDisabled.Color = clWebGRAY
Style.BorderDisabled.Width = 1
Style.Button.Alignment = taCenter
Style.Button.Font.Color = clWebWHITE
Style.Button.Font.FontFamily = 'Arial, Sans-Serif, Verdana'
Style.Button.Font.Size = 10
Style.Button.Font.Style = []
Style.Button.FromColor = 1746426
Style.Button.ToColor = 2128628
Style.ButtonHover.Alignment = taCenter
Style.ButtonHover.Font.Color = clWebWHITE
Style.ButtonHover.Font.FontFamily = 'Arial, Sans-Serif, Verdana'
Style.ButtonHover.Font.Size = 10
Style.ButtonHover.Font.Style = []
Style.ButtonHover.FromColor = 1150712
Style.ButtonHover.ToColor = 1401072
Style.ButtonActive.Alignment = taCenter
Style.ButtonActive.Font.Color = clWebWHITE
Style.ButtonActive.Font.FontFamily = 'Arial, Sans-Serif, Verdana'
Style.ButtonActive.Font.Size = 10
Style.ButtonActive.Font.Style = []
Style.ButtonActive.FromColor = 2128628
Style.ButtonActive.ToColor = 1746426
Style.ButtonDisabled.Alignment = taCenter
Style.ButtonDisabled.Font.Color = clWebWHITE
Style.ButtonDisabled.Font.FontFamily = 'Arial, Sans-Serif, Verdana'
Style.ButtonDisabled.Font.Size = 10
Style.ButtonDisabled.Font.Style = []
Style.ButtonDisabled.FromColor = clWebLIGHTGRAY
Style.ButtonDisabled.ToColor = 7368816
Style.ColorScheme = csOrange
Style.BoxShadow.ColorTransparency = 0.500000000000000000
Style.TextShadow.ColorTransparency = 0.500000000000000000
Caption = #1575#1585#1587#1575#1604
Color = clBtnFace
Font.Color = clNone
Font.Size = 10
Font.Style = []
FriendlyName = 'IWGradButtonSubmit'
ScriptEvents = <>
TabOrder = 2
OnClick = IWGradButtonSubmitClick
OnAsyncClick = IWGradButtonSubmitAsyncClick
end
object IWLabelLastWinner: TIWLabel [4]
Left = 16
Top = 96
Width = 121
Height = 16
Cursor = crAuto
ParentShowHint = False
ShowHint = True
ZIndex = 0
RenderSize = True
Alignment = taLeftJustify
BGColor = clNone
Font.Color = clNone
Font.Size = 10
Font.Style = []
NoWrap = False
ConvertSpaces = False
HasTabOrder = False
FriendlyName = 'IWLabelLastWinner'
Caption = 'IWLabelLastWinner'
RawText = False
end
object IWLabelFoundSecretWord: TIWLabel [5]
Left = 16
Top = 112
Width = 163
Height = 16
Cursor = crAuto
ParentShowHint = False
ShowHint = True
ZIndex = 0
RenderSize = True
Alignment = taLeftJustify
BGColor = clNone
Font.Color = clNone
Font.Size = 10
Font.Style = []
NoWrap = False
ConvertSpaces = False
HasTabOrder = False
FriendlyName = 'IWLabelFoundSecretWord'
Caption = 'IWLabelFoundSecretWord'
RawText = True
end
object DataSource1: TDataSource
Left = 72
Top = 184
end
object IWAJAXNotifier1: TIWAJAXNotifier
OnNotify = IWAJAXNotifier1Notify
Left = 72
Top = 248
end
object IWTimer1: TIWTimer
Enabled = True
Interval = 5000
OnAsyncTimer = IWTimer1AsyncTimer
Left = 72
Top = 304
end

مجید
21 / June / 2015, 03:26 AM
در پست های بعدی کد نویسی فرم ها را انجام خواهیم داد

admin
21 / June / 2015, 10:57 PM
سلام و درود و تشکر بابت وقتی که گذاشتید و میگذارید.
موفق و موید باشید

مجید
22 / June / 2015, 07:20 PM
سلام
امروز قصد دارم کد نویسی فرم ها را شروع کنم . امیدوارم تا اینجای پروژه استفاده کرده باشید.

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




uses
ServerController,
UserSessionUnit;


همچنین یونیت WordGame_Namespace را به قسمت Uses اصلی واقع در زیر interface تمام یونیت ها اضافه کنید و تمام فرم ها را ذخیره کرده و ببندید.
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
یک متغیر عمومی برای نگهداری کد کاربر وارد شده نیاز داریم و باید آن را در UserSessionUnit تعریف کنیم . به قسمت public در یونیت TIWUserSession رفته و متغیر CurrentUserID را مانند کد زیر تعریف کنید :



TIWUserSession = class(TIWUserSessionBase)
private
{ Private declarations }
public
CurrentUserID: Integer;
{ Public declarations }
end;


------------------------------------------------------------------------------------------------------------------------------------------------------------------

فرم ورود (LoginForm) را باز کنید. فرم شما باید شبیه به تصویر زیر باشد.

283



کد زیر را در انتهای فایل LoginUnit.pas قبل از .end وارد کنید.




initialization

TLoginForm.SetAsMainForm;

end.



دقت کنید که .end (بخوانید end نقطه - این عبارت با ;end (بخوانید end سمیکالن) فرق دارد) که در قسمت کد در سطر آخر آمده است برای راهنمایی شماست . نباید آن را کپی کنید . هر فایل pas فقط یک عبارت .end باید داشته باشد و آن هم در انتهای فایل و سطر آخر آن است.


یونیت های SelectDifficultyLevelUnit و ForgetPasswordUnit و RegisterUnit را به قسمت uses واقع در implementation اضافه کنید.
و Event های OnAsyncClick و OnClick مربوط به IWGradButtonLogin را مانند نمونه زیر کد نویسی نمایید :







procedure TLoginForm.IWGradButtonLoginAsyncClick(Sender: TObject; EventParams: TStringList);
begin
inherited;
if (Trim(IWEditUsername.Text) = '') or (Trim(IWEditPassword.Text) = '') then
WebApplication.ShowMessage('درج نام کاربری و رمز عبور الزامی است')
else
IWGradButtonLoginClick(Sender);
end;

procedure TLoginForm.IWGradButtonLoginClick(Sender: TObject);
var
aUser: TUser;
begin
inherited;
aUser := TUser.Create;
aUser.Username := IWEditUsername.Text;
aUser.Password := IWEditPassword.Text;
aUser := aUser.Login;
if aUser <> nil then
begin
UserSession.CurrentUserID := aUser.UserID;
TSelectDifficultyLevelForm.Create(WebApplication). Show;
end
else
WebApplication.ShowMessage('نام کاربری یا رمز عبور نادرست است');
aUser.Free;
end;




همچنین Event های OnClick مربوط به IWLinkForgetPassword و IWLinkRegister را به صورت زیر کد نویسی کنید :




procedure TLoginForm.IWLinkForgetPasswordClick(Sender: TObject);
begin
inherited;
TForgetPasswordForm.Create(WebApplication).Show;
end;

procedure TLoginForm.IWLinkRegisterClick(Sender: TObject);
begin
inherited;
TRegisterForm.Create(WebApplication).Show;
end;



نکته مهم :
در Event های موجود آنهایی که دارای عبارت Async هستند ، Event های ClientSide هستند و مابقی ServerSide هستند . Event های ClientSide در کامپیوتر کاربر پردازش و اجرا میشوند و Event های SeverSide سمت سرور اجرا میشوند . Event های ClientSide اغلب برای بررسی شرایط یا داده های تولید شده یا ویرایش شده توسط کاربر بکار میروند تا از اعمال بار اضافی روی سرور بکاهند . مثال : در همین فرم Login در کامپوننت IWGradButtonLogin در قسمت OnAsyncClick بررسی میشود که نام کاربری و رمز عبور وارد شده باشند و پس از اطمینان از وجود داده های فوق Event مربوط به OnClick فراخوانی میگردد.

در انتها فایل کد LoginUnit.pas باید به شکل زیر باشد :






unit LoginUnit;

interface

uses
WordGame_Namespace,
Winapi.Windows,
Winapi.Messages,
System.SysUtils,
System.Variants,
System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
BaseUnit,
IWVCLComponent,
IWBaseLayoutComponent,
IWBaseContainerLayout,
IWContainerLayout,
IWTemplateProcessorHTML,
IWVCLBaseControl,
IWBaseControl,
IWBaseHTMLControl,
IWControl,
IWCompEdit,
IWCompGradButton,
IWHTMLControls;

type
TLoginForm = class(TBaseForm)
IWEditUsername: TIWEdit;
IWEditPassword: TIWEdit;
IWLinkForgetPassword: TIWLink;
IWLinkRegister: TIWLink;
IWGradButtonLogin: TIWGradButton;
procedure IWGradButtonLoginClick(Sender: TObject);
procedure IWGradButtonLoginAsyncClick(Sender: TObject; EventParams: TStringList);
procedure IWLinkForgetPasswordClick(Sender: TObject);
procedure IWLinkRegisterClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
LoginForm: TLoginForm;

implementation

uses
ServerController,
UserSessionUnit,
SelectDifficultyLevelUnit,
ForgetPasswordUnit,
RegisterUnit;
{$R *.dfm}

procedure TLoginForm.IWGradButtonLoginAsyncClick(Sender: TObject; EventParams: TStringList);
begin
inherited;
if (Trim(IWEditUsername.Text) = '') or (Trim(IWEditPassword.Text) = '') then
WebApplication.ShowMessage('درج نام کاربری و رمز عبور الزامی است')
else
IWGradButtonLoginClick(Sender);
end;

procedure TLoginForm.IWGradButtonLoginClick(Sender: TObject);
var
aUser: TUser;
begin
inherited;
aUser := TUser.Create;
aUser.Username := IWEditUsername.Text;
aUser.Password := IWEditPassword.Text;
aUser := aUser.Login;
if aUser <> nil then
begin
UserSession.CurrentUserID := aUser.UserID;
TSelectDifficultyLevelForm.Create(WebApplication). Show;
end
else
WebApplication.ShowMessage('نام کاربری یا رمز عبور نادرست است');
aUser.Free;
end;

procedure TLoginForm.IWLinkForgetPasswordClick(Sender: TObject);
begin
inherited;
TForgetPasswordForm.Create(WebApplication).Show;
end;

procedure TLoginForm.IWLinkRegisterClick(Sender: TObject);
begin
inherited;
TRegisterForm.Create(WebApplication).Show;
end;

initialization

TLoginForm.SetAsMainForm;

end.

مجید
22 / June / 2015, 08:07 PM
فرم تغییر رمز عبور (ChangePasswordForm) را باز کنید. فرم شما باید شبیه به تصویر زیر باشد.


271


Event های OnAsyncClick و OnClick مربوط به IWGradButtonChangePassword را مانند نمونه زیر کد نویسی نمایید :




procedure TChangePasswordForm.IWGradButtonChangePasswordAsyn cClick(Sender: TObject; EventParams: TStringList);
begin
inherited;
if (Trim(IWEditCurrentPassword.Text) = '') or (Trim(IWEditNewPassword.Text) = '') or
(Trim(IWEditConfirmNewPassword.Text) = '') then
WebApplication.ShowMessage('درج رمز عبور فعلی و رمز عبور جدید و تکرار رمز عبور جدید الزامی است')
else if Trim(IWEditNewPassword.Text) <> Trim(IWEditConfirmNewPassword.Text) then
WebApplication.ShowMessage('رمز عبور جدید و تکرار آن با هم یکسان نیستند')
else
IWGradButtonChangePasswordClick(Sender);
end;

procedure TChangePasswordForm.IWGradButtonChangePasswordClic k(Sender: TObject);
var
aUser: TUser;
begin
inherited;
aUser := aUser.GetUserInfo('', UserSession.CurrentUserID);
if aUser <> nil then
begin
if aUser.Password = IWEditCurrentPassword.Text then
begin
aUser.ChangePassword(IWEditNewPassword.Text);
WebApplication.ShowMessage('رمز عبور جدید با موفقیت ثبت شد');
end
else
WebApplication.ShowMessage('رمز عبور فعلی نادرست است');
aUser.Free;
end;
end;


در انتها فایل کد ChangePasswordUnit.pas باید به شکل زیر باشد :





unit ChangePasswordUnit;

interface

uses
WordGame_Namespace,
Winapi.Windows,
Winapi.Messages,
System.SysUtils,
System.Variants,
System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
BaseUnit,
IWCompGradButton,
IWVCLBaseControl,
IWBaseControl,
IWBaseHTMLControl,
IWControl,
IWCompEdit,
IWVCLComponent,
IWBaseLayoutComponent,
IWBaseContainerLayout,
IWContainerLayout,
IWTemplateProcessorHTML;

type
TChangePasswordForm = class(TBaseForm)
IWEditCurrentPassword: TIWEdit;
IWEditNewPassword: TIWEdit;
IWEditConfirmNewPassword: TIWEdit;
IWGradButtonChangePassword: TIWGradButton;
procedure IWGradButtonChangePasswordClick(Sender: TObject);
procedure IWGradButtonChangePasswordAsyncClick(Sender: TObject; EventParams: TStringList);
private
{ Private declarations }
public
{ Public declarations }
end;

var
ChangePasswordForm: TChangePasswordForm;

implementation

uses
ServerController,
UserSessionUnit;
{$R *.dfm}

procedure TChangePasswordForm.IWGradButtonChangePasswordAsyn cClick(Sender: TObject; EventParams: TStringList);
begin
inherited;
if (Trim(IWEditCurrentPassword.Text) = '') or (Trim(IWEditNewPassword.Text) = '') or
(Trim(IWEditConfirmNewPassword.Text) = '') then
WebApplication.ShowMessage('درج رمز عبور فعلی و رمز عبور جدید و تکرار رمز عبور جدید الزامی است')
else if Trim(IWEditNewPassword.Text) <> Trim(IWEditConfirmNewPassword.Text) then
WebApplication.ShowMessage('رمز عبور جدید و تکرار آن با هم یکسان نیستند')
else
IWGradButtonChangePasswordClick(Sender);
end;

procedure TChangePasswordForm.IWGradButtonChangePasswordClic k(Sender: TObject);
var
aUser: TUser;
begin
inherited;
aUser := aUser.GetUserInfo('', UserSession.CurrentUserID);
if aUser <> nil then
begin
if aUser.Password = IWEditCurrentPassword.Text then
begin
aUser.ChangePassword(IWEditNewPassword.Text);
WebApplication.ShowMessage('رمز عبور جدید با موفقیت ثبت شد');
end
else
WebApplication.ShowMessage('رمز عبور فعلی نادرست است');
aUser.Free;
end;
end;

end.

مجید
23 / June / 2015, 12:36 AM
فرم ثبت عضویت (RegisterForm) را باز کنید. فرم شما باید شبیه به تصویر زیر باشد.


274

یونیت SelectDifficultyLevelUnit را به قسمت uses واقع در implementation اضافه کنید.
Event های OnAsyncClick و OnClick مربوط به IWGradButtonRegister را مانند نمونه زیر کد نویسی نمایید :





procedure TRegisterForm.IWGradButtonRegisterAsyncClick(Sende r: TObject; EventParams: TStringList);
begin
inherited;
if (Trim(IWEditUsername.Text) = '') or (Trim(IWEmailEdit.Text) = '') or (Trim(IWEditPassword.Text) = '') or
(Trim(IWEditConfirmPassword.Text) = '') or (Trim(IWEditFullName.Text) = '') then
WebApplication.ShowMessage('لطفا تمام قسمت های فرم را کامل کنید')
else
if IWEditPassword.Text <> IWEditConfirmPassword.Text then
WebApplication.ShowMessage('رمز عبور و تکرار آن با هم یکسان نیستند')
else
IWGradButtonRegisterClick(Sender);
end;

procedure TRegisterForm.IWGradButtonRegisterClick(Sender: TObject);
var
aUser: TUser;
begin
inherited;
aUser := TUser.Create;
aUser.Username := IWEditUsername.Text;
aUser.EMail := IWEmailEdit.Text;
aUser.Password := IWEditPassword.Text;
aUser.FullName := IWEditFullName.Text;
aUser := aUser.RegisterUser;
if aUser = nil then
WebApplication.ShowMessage('کاربری قبلا با این نام عضو شده است . لطفا نام کاربری دیگری انتخاب کنید')
else
begin
WebApplication.ShowMessage('ثبت نام با موفقیت انجام شد');
TSelectDifficultyLevelForm.Create(WebApplication). Show;
end;
aUser.Free;
end;


در انتها فایل کد RegisterUnit.pas باید به شکل زیر باشد :




unit RegisterUnit;

interface

uses
WordGame_Namespace,
Winapi.Windows,
Winapi.Messages,
System.SysUtils,
System.Variants,
System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
BaseUnit,
IWVCLComponent,
IWBaseLayoutComponent,
IWBaseContainerLayout,
IWContainerLayout,
IWTemplateProcessorHTML,
IWCompGradButton,
IWTMSCtrls,
IWVCLBaseControl,
IWBaseControl,
IWBaseHTMLControl,
IWControl,
IWCompEdit;

type
TRegisterForm = class(TBaseForm)
IWEditUsername: TIWEdit;
IWEditPassword: TIWEdit;
IWGradButtonRegister: TIWGradButton;
IWEditConfirmPassword: TIWEdit;
IWEmailEdit: TTIWEmailEdit;
IWEditFullName: TIWEdit;
procedure IWGradButtonRegisterClick(Sender: TObject);
procedure IWGradButtonRegisterAsyncClick(Sender: TObject; EventParams: TStringList);
private
{ Private declarations }
public
{ Public declarations }
end;

var
RegisterForm: TRegisterForm;

implementation

uses
ServerController,
UserSessionUnit,
SelectDifficultyLevelUnit;
{$R *.dfm}

procedure TRegisterForm.IWGradButtonRegisterAsyncClick(Sende r: TObject; EventParams: TStringList);
begin
inherited;
if (Trim(IWEditUsername.Text) = '') or (Trim(IWEmailEdit.Text) = '') or (Trim(IWEditPassword.Text) = '') or
(Trim(IWEditConfirmPassword.Text) = '') or (Trim(IWEditFullName.Text) = '') then
WebApplication.ShowMessage('لطفا تمام قسمت های فرم را کامل کنید')
else
if IWEditPassword.Text <> IWEditConfirmPassword.Text then
WebApplication.ShowMessage('رمز عبور و تکرار آن با هم یکسان نیستند')
else
IWGradButtonRegisterClick(Sender);
end;

procedure TRegisterForm.IWGradButtonRegisterClick(Sender: TObject);
var
aUser: TUser;
begin
inherited;
aUser := TUser.Create;
aUser.Username := IWEditUsername.Text;
aUser.EMail := IWEmailEdit.Text;
aUser.Password := IWEditPassword.Text;
aUser.FullName := IWEditFullName.Text;
aUser := aUser.RegisterUser;
if aUser = nil then
WebApplication.ShowMessage('کاربری قبلا با این نام عضو شده است . لطفا نام کاربری دیگری انتخاب کنید')
else
begin
WebApplication.ShowMessage('ثبت نام با موفقیت انجام شد');
TSelectDifficultyLevelForm.Create(WebApplication). Show;
end;
aUser.Free;
end;

end.

مجید
23 / June / 2015, 10:41 AM
فرم فراموشی رمز عبور (ForgetPasswordForm) را باز کنید. فرم شما باید شبیه به تصویر زیر باشد.

277


کد OnClick مربوط به IWGradButtonSendPassword را مانند نمونه زیر وارد کنید :






procedure TForgetPasswordForm.IWGradButtonSendPasswordClick( Sender: TObject);
var
aUser: TUser;
begin
inherited;
aUser := aUser.GetUserInfo('', 0, IWEmailEdit.Text);
if aUser <> nil then
begin
aUser.SendNewPasswordEmail(UserSession.SMTP, UserSession.MailMessage);
WebApplication.ShowMessage('رمز عبور جدید به ایمیل شما ارسال گردید');
end
else
WebApplication.ShowMessage('ایمیل وارد شده نامعتبر است');
aUser.Free;
end;



در انتها فایل کد ForgetPasswordUnit.pas باید به شکل زیر باشد :




unit ForgetPasswordUnit;

interface

uses
WordGame_Namespace,
Winapi.Windows,
Winapi.Messages,
System.SysUtils,
System.Variants,
System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
BaseUnit,
IWVCLComponent,
IWBaseLayoutComponent,
IWBaseContainerLayout,
IWContainerLayout,
IWTemplateProcessorHTML,
IWCompGradButton,
IWVCLBaseControl,
IWBaseControl,
IWBaseHTMLControl,
IWControl,
IWCompEdit,
IWTMSCtrls;

type
TForgetPasswordForm = class(TBaseForm)
IWEmailEdit: TTIWEmailEdit;
IWGradButtonSendPassword: TIWGradButton;
procedure IWGradButtonSendPasswordClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
ForgetPasswordForm: TForgetPasswordForm;

implementation

uses
ServerController,
UserSessionUnit;
{$R *.dfm}

procedure TForgetPasswordForm.IWGradButtonSendPasswordClick( Sender: TObject);
var
aUser: TUser;
begin
inherited;
aUser := aUser.GetUserInfo('', 0, IWEmailEdit.Text);
if aUser <> nil then
begin
aUser.SendNewPasswordEmail(UserSession.SMTP, UserSession.MailMessage);
WebApplication.ShowMessage('رمز عبور جدید به ایمیل شما ارسال گردید');
end
else
WebApplication.ShowMessage('ایمیل وارد شده نامعتبر است');
aUser.Free;
end;

end.





------------------------------------------------------------------------------------------------------------------------------------------
یونیت UserSessionUnit را باز کنید و به حالت طراحی بروید. یک کامپوننت TIdSSLIOHandlerSocketOpenSSL و یک کامپوننت TIdMessage و یک کامپوننت TIdSMTP روی فرم قرار دهید و خصوصیات آنها را مانند کد زیر تغییر دهید :






object IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL
Destination = 'smtp.gmail.com:467'
Host = 'smtp.gmail.com'
MaxLineAction = maException
Port = 467
DefaultPort = 0
SSLOptions.Mode = sslmUnassigned
SSLOptions.VerifyMode = []
SSLOptions.VerifyDepth = 0
Left = 152
Top = 32
end
object MailMessage: TIdMessage
AttachmentEncoding = 'MIME'
BccList = <>
CCList = <>
Encoding = meMIME
FromList = <
item
end>
Recipients = <>
ReplyTo = <>
ConvertPreamble = True
Left = 32
Top = 32
end
object SMTP: TIdSMTP
IOHandler = IdSSLIOHandlerSocketOpenSSL1
Host = 'smtp.gmail.com'
Password = 'MyPassword'
Port = 467
SASLMechanisms = <>
UseTLS = utUseRequireTLS
Username = 'Email@gmail.com'
Left = 32
Top = 84
end


در انتها فایل کد UserSessionUnit.pas باید به شکل زیر باشد :





unit UserSessionUnit;

{
This is a DataModule where you can add components or declare fields that are specific to
ONE user. Instead of creating global variables, it is better to use this datamodule. You can then
access the it using UserSession.
}
interface

uses
IWUserSessionBase,
SysUtils,
Classes,
IdTCPConnection,
IdTCPClient,
IdExplicitTLSClientServerBase,
IdMessageClient,
IdSMTPBase,
IdSMTP,
IdMessage,
IdBaseComponent,
IdComponent,
IdIOHandler,
IdIOHandlerSocket,
IdIOHandlerStack,
IdSSL,
IdSSLOpenSSL;

type
TIWUserSession = class(TIWUserSessionBase)
IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
MailMessage: TIdMessage;
SMTP: TIdSMTP;
private
{ Private declarations }
public
CurrentUserID: Integer;
{ Public declarations }
end;

implementation

{$R *.dfm}

end.



دقت کنید که برای ارسال ایمیل باید مقادیر Email@gmail.com و MyPassword را با اطلاعات درست جایگزین نمایید

مجید
23 / June / 2015, 10:57 AM
فرم پروفایل کاربر (UserProfileForm) را باز کنید. فرم شما باید شبیه به تصویر زیر باشد.
279


کد OnCreate مربوط به UserProfileForm را مانند نمونه زیر وارد کنید :






procedure TUserProfileForm.IWAppFormCreate(Sender: TObject);
var
aUser: TUser;
begin
inherited;
aUser := aUser.GetUserInfo('', UserSession.CurrentUserID);
IWLabelUsername.Caption := aUser.Username;
IWLabelTotalPoint.Caption := IntToStr(aUser.TotalPoint);
IWLabelEMail.Caption := aUser.EMail;
IWLabelPoint3.Caption := IntToStr(aUser.UserProfile.Point3);
IWLabelPoint4.Caption := IntToStr(aUser.UserProfile.Point4);
IWLabelPoint5.Caption := IntToStr(aUser.UserProfile.Point5);
IWLabelCount3.Caption := IntToStr(aUser.UserProfile.Count3);
IWLabelCount4.Caption := IntToStr(aUser.UserProfile.Count4);
IWLabelCount5.Caption := IntToStr(aUser.UserProfile.Count5);
aUser.Free;
end;



در انتها فایل کد UserProfileUnit.pas باید به شکل زیر باشد :





unit UserProfileUnit;

interface

uses
WordGame_Namespace,
Winapi.Windows,
Winapi.Messages,
System.SysUtils,
System.Variants,
System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
BaseUnit,
IWVCLComponent,
IWBaseLayoutComponent,
IWBaseContainerLayout,
IWContainerLayout,
IWTemplateProcessorHTML,
IWVCLBaseControl,
IWBaseControl,
IWBaseHTMLControl,
IWControl,
IWCompLabel;

type
TUserProfileForm = class(TBaseForm)
IWLabelUsername: TIWLabel;
IWLabelTotalPoint: TIWLabel;
IWLabelEMail: TIWLabel;
IWLabelPoint3: TIWLabel;
IWLabelPoint4: TIWLabel;
IWLabelPoint5: TIWLabel;
IWLabelCount3: TIWLabel;
IWLabelCount4: TIWLabel;
IWLabelCount5: TIWLabel;
procedure IWAppFormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
UserProfileForm: TUserProfileForm;

implementation

uses
ServerController,
UserSessionUnit;
{$R *.dfm}

procedure TUserProfileForm.IWAppFormCreate(Sender: TObject);
var
aUser: TUser;
begin
inherited;
aUser := aUser.GetUserInfo('', UserSession.CurrentUserID);
IWLabelUsername.Caption := aUser.Username;
IWLabelTotalPoint.Caption := IntToStr(aUser.TotalPoint);
IWLabelEMail.Caption := aUser.EMail;
IWLabelPoint3.Caption := IntToStr(aUser.UserProfile.Point3);
IWLabelPoint4.Caption := IntToStr(aUser.UserProfile.Point4);
IWLabelPoint5.Caption := IntToStr(aUser.UserProfile.Point5);
IWLabelCount3.Caption := IntToStr(aUser.UserProfile.Count3);
IWLabelCount4.Caption := IntToStr(aUser.UserProfile.Count4);
IWLabelCount5.Caption := IntToStr(aUser.UserProfile.Count5);
aUser.Free;
end;

end.

مجید
23 / June / 2015, 06:12 PM
یونیت UserSessionUnit را باز کرده و متغیر عمومی DifficultyLevel را از نوع عددی اضافه کنید:



type
TIWUserSession = class(TIWUserSessionBase)
IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
MailMessage: TIdMessage;
SMTP: TIdSMTP;
private
{ Private declarations }
public
CurrentUserID, DifficultyLevel: Integer;
{ Public declarations }
end;



------------------------------------------------------------------------------------------------------------------------------------------------------------------------
فرم انتخاب سطح دشواری (SelectDifficultyLevelForm) را باز کنید. فرم شما باید شبیه به تصویر زیر باشد.


281

Prpcedure زیر را به یونیت SelectDifficultyLevelUnit اضافه کنید :




procedure TSelectDifficultyLevelForm.ShowGame(aDifficultyLev el: Integer);
begin
UserSession.DifficultyLevel := aDifficultyLevel;
TWordGameForm.Create(WebApplication).Show;
end;



کد OnClick مربوط به IWGradButtonEasy و IWGradButtonMiddle و IWGradButtonHard را مانند نمونه زیر وارد کنید :





procedure TSelectDifficultyLevelForm.IWGradButtonEasyClick(S ender: TObject);
begin
inherited;
ShowGame(3);
end;

procedure TSelectDifficultyLevelForm.IWGradButtonMiddleClick (Sender: TObject);
begin
inherited;
ShowGame(4);
end;

procedure TSelectDifficultyLevelForm.IWGradButtonHardClick(S ender: TObject);
begin
inherited;
ShowGame(5);
end;



در انتها فایل کد SelectDifficultyLevelUnit.pas باید به شکل زیر باشد :





unit SelectDifficultyLevelUnit;

interface

uses
WordGame_Namespace,
Winapi.Windows,
Winapi.Messages,
System.SysUtils,
System.Variants,
System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
BaseUnit,
IWVCLComponent,
IWBaseLayoutComponent,
IWBaseContainerLayout,
IWContainerLayout,
IWTemplateProcessorHTML,
IWVCLBaseControl,
IWBaseControl,
IWBaseHTMLControl,
IWControl,
IWCompGradButton;

type
TSelectDifficultyLevelForm = class(TBaseForm)
IWGradButtonEasy: TIWGradButton;
IWGradButtonMiddle: TIWGradButton;
IWGradButtonHard: TIWGradButton;
procedure ShowGame(aDifficultyLevel: Integer);
procedure IWGradButtonEasyClick(Sender: TObject);
procedure IWGradButtonMiddleClick(Sender: TObject);
procedure IWGradButtonHardClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
SelectDifficultyLevelForm: TSelectDifficultyLevelForm;

implementation

uses
ServerController,
UserSessionUnit,
WordGameUnit;
{$R *.dfm}

procedure TSelectDifficultyLevelForm.ShowGame(aDifficultyLev el: Integer);
begin
UserSession.DifficultyLevel := aDifficultyLevel;
TWordGameForm.Create(WebApplication).Show;
end;

procedure TSelectDifficultyLevelForm.IWGradButtonEasyClick(S ender: TObject);
begin
inherited;
ShowGame(3);
end;

procedure TSelectDifficultyLevelForm.IWGradButtonMiddleClick (Sender: TObject);
begin
inherited;
ShowGame(4);
end;

procedure TSelectDifficultyLevelForm.IWGradButtonHardClick(S ender: TObject);
begin
inherited;
ShowGame(5);
end;

end.

مجید
25 / June / 2015, 11:42 PM
فرم بازی (WordGameForm) را باز کنید. فرم شما باید شبیه به تصویر زیر باشد.
287


کد های OnCreate فرم
و OnClick و OnAsyncClick برای IWGradButtonSubmit
و OnAsyncKeyDown برای IWEditSuggestionWord
و OnGetCellData برای TIWDBAdvWebGridGame
و OnNotify برای IWAJAXNotifier1
و OnAsyncTimer برای IWTimer1 را مانند زیر کد نویسی کنید :







procedure TWordGameForm.IWAppFormCreate(Sender: TObject);
begin
inherited;
try
try
if WordGame.GetSecretWord(UserSession.DifficultyLevel ) = '' then
agsID := WordGame.AddNewSecretWord(UserSession.DifficultyLe vel)
else
agsID := WordGame.GetSecretWordID(UserSession.DifficultyLev el);
case UserSession.DifficultyLevel of
3:
IWLabelDifficultyLevel.Caption := 'ساده - سه حرفی';
4:
IWLabelDifficultyLevel.Caption := 'متوسط - چهار حرفی';
5:
IWLabelDifficultyLevel.Caption := 'سخت - پنج حرفی';
end;
DataSource1.DataSet := WordGame.GetWordGameData(UserSession.DifficultyLev el);
IWEditSuggestionWord.MaxLength := UserSession.DifficultyLevel;
IWLabelLastWinner.Caption := WordGame.GetLastWinner(UserSession.DifficultyLevel );
IWLabelFoundSecretWord.Caption :=
'<a style=" text-decoration: none" href="<span style="font-family: trebuchet ms"><font size="3"><font color="Indigo"><b><font color="red">[فقط اعضاء انجمن قادر به مشاهده لینکها و عکسها می باشند <a href="/reg_iran.php" target="_blank">برای عضویت در سایت کلیک کنید</a>]</font></b></font></font></span>' +
WordGame.GetLastFoundSecretWord(UserSession.Diffic ultyLevel) + '" target="_blank">' +
WordGame.GetLastFoundSecretWord(UserSession.Diffic ultyLevel) + '</a>';
except
on E: Exception do
begin
// Error Handling
end;
end;
finally

end;
end;

procedure TWordGameForm.IWEditSuggestionWordAsyncKeyDown(Sen der: TObject; EventParams: TStringList);
begin
inherited;
if EventParams[7] = 'which=13' then
IWGradButtonSubmitAsyncClick(Sender, EventParams);
end;

procedure TWordGameForm.IWGradButtonSubmitAsyncClick(Sender: TObject; EventParams: TStringList);
var
I, J: Integer;
S : Char;
begin
inherited;
for I := 1 to Length(IWEditSuggestionWord.Text) do
begin
S := IWEditSuggestionWord.Text[I];
if (Pos(S, '`~!@#$%^&*()_+-=[]{}\|":;/?.>,<' + QuotedStr('''')) > 0) or (S = ' ') then
begin
WebApplication.ShowMessage('وجود کاراکتر غیر مجاز');
Exit;
end;
for J := I + 1 to Length(IWEditSuggestionWord.Text) do
begin
if S = IWEditSuggestionWord.Text[J] then
begin
WebApplication.ShowMessage('وجود کاراکتر تکراری');
Exit;
end;
end;
end;

if Length(Trim(IWEditSuggestionWord.Text)) = UserSession.DifficultyLevel then
IWGradButtonSubmitClick(Sender)
else
WebApplication.ShowMessage('طول کلمه پیشنهادی با طول رمز یکسان نیست');
end;

procedure TWordGameForm.IWGradButtonSubmitClick(Sender: TObject);
var
I, J, CommonCharsCnt, CompatibleCharsCnt: Integer;
SecretWord : String;
begin
inherited;
try
try
SecretWord := WordGame.GetSecretWord(UserSession.DifficultyLevel );
SecretWord := ReplaceStr(SecretWord, 'ي', 'ی');
SecretWord := ReplaceStr(SecretWord, 'ك', 'ک');
CommonCharsCnt := 0;
CompatibleCharsCnt := 0;

for I := 1 to Length(IWEditSuggestionWord.Text) do
begin
for J := 1 to Length(SecretWord) do
begin
if IWEditSuggestionWord.Text[I] = SecretWord[J] then
Inc(CommonCharsCnt);
end;
end;
for I := 1 to Length(SecretWord) do
begin
if SecretWord[I] = IWEditSuggestionWord.Text[I] then
Inc(CompatibleCharsCnt);
end;

if WordGame.AddNewSuggestionWord(UserSession.CurrentU serID, agsID, IWEditSuggestionWord.Text, CommonCharsCnt,
CompatibleCharsCnt,
UserSession.DifficultyLevel) then
begin
if (CommonCharsCnt = CompatibleCharsCnt) and (CommonCharsCnt = UserSession.DifficultyLevel) then
agsID := WordGame.AddNewSecretWord(UserSession.DifficultyLe vel);

TWordGameForm.Create(WebApplication).Show;
Release;
end
else
begin
WebApplication.ShowMessage('کلمه پیشنهادی تکراری است');
IWEditSuggestionWord.Text := '';
end;
except
on E: Exception do
begin
// Error Handling
end;
end;
finally

end;
end;

procedure TWordGameForm.IWAJAXNotifier1Notify(Sender: TObject);
begin
inherited;
DataSource1.DataSet := WordGame.GetWordGameData(UserSession.DifficultyLev el);
IWEditSuggestionWord.MaxLength := UserSession.DifficultyLevel;
IWLabelLastWinner.Caption := WordGame.GetLastWinner(UserSession.DifficultyLevel );
IWLabelFoundSecretWord.Caption :=
'<a style=" text-decoration: none" href="<span style="font-family: trebuchet ms"><font size="3"><font color="Indigo"><b><font color="red">[فقط اعضاء انجمن قادر به مشاهده لینکها و عکسها می باشند <a href="/reg_iran.php" target="_blank">برای عضویت در سایت کلیک کنید</a>]</font></b></font></font></span>' +
WordGame.GetLastFoundSecretWord(UserSession.Diffic ultyLevel) + '" target="_blank">' +
WordGame.GetLastFoundSecretWord(UserSession.Diffic ultyLevel) + '</a>';
TIWDBAdvWebGridGame.AsyncUpdateAllCells;
end;

procedure TWordGameForm.IWTimer1AsyncTimer(Sender: TObject; EventParams: TStringList);
begin
inherited;
IWAJAXNotifier1.Notify;
end;

procedure TWordGameForm.TIWDBAdvWebGridGameGetCellData(Sende r: TObject; RowIndex, ColumnIndex: Integer;
var AValue: string);
var
S: String;
begin
inherited;
if ColumnIndex = 1 then
AValue := '<a style=" text-decoration: none" href="<span style="font-family: trebuchet ms"><font size="3"><font color="Indigo"><b><font color="red">[فقط اعضاء انجمن قادر به مشاهده لینکها و عکسها می باشند <a href="/reg_iran.php" target="_blank">برای عضویت در سایت کلیک کنید</a>]</font></b></font></font></span>' + AValue +
'"'' target="_blank">' +
AValue + '</a>';
end;




در انتها فایل کد WordGameUnit.pas باید به شکل زیر باشد :




unit WordGameUnit;

interface

uses
WordGame_Namespace,
StrUtils,
Winapi.Windows,
Winapi.Messages,
System.SysUtils,
BaseUnit,
IWCompExtCtrls,
IWBaseComponent,
IWBaseHTMLComponent,
IWBaseHTML40Component,
Data.DB,
IWCompGradButton,
IWControl,
IWWebGrid,
IWDBAdvWebGrid,
IWCompEdit,
Vcl.Controls,
IWVCLBaseControl,
IWBaseControl,
IWBaseHTMLControl,
IWCompLabel,
System.Classes,
IWVCLComponent,
IWBaseLayoutComponent,
IWBaseContainerLayout,
IWContainerLayout,
IWTemplateProcessorHTML;

type
TWordGameForm = class(TBaseForm)
IWLabelDifficultyLevel: TIWLabel;
IWEditSuggestionWord: TIWEdit;
TIWDBAdvWebGridGame: TTIWDBAdvWebGrid;
IWGradButtonSubmit: TIWGradButton;
DataSource1: TDataSource;
IWLabelLastWinner: TIWLabel;
IWLabelFoundSecretWord: TIWLabel;
IWAJAXNotifier1: TIWAJAXNotifier;
IWTimer1: TIWTimer;
procedure IWAppFormCreate(Sender: TObject);
procedure IWGradButtonSubmitAsyncClick(Sender: TObject; EventParams: TStringList);
procedure IWGradButtonSubmitClick(Sender: TObject);
procedure IWEditSuggestionWordAsyncKeyDown(Sender: TObject; EventParams: TStringList);
procedure TIWDBAdvWebGridGameGetCellData(Sender: TObject; RowIndex, ColumnIndex: Integer; var AValue: string);
procedure IWTimer1AsyncTimer(Sender: TObject; EventParams: TStringList);
procedure IWAJAXNotifier1Notify(Sender: TObject);
private
{ Private declarations }
public
WordGame: TWordGame;
agsID : Integer;
{ Public declarations }
end;

var
WordGameForm: TWordGameForm;

implementation

uses
ServerController,
UserSessionUnit;
{$R *.dfm}

procedure TWordGameForm.IWAppFormCreate(Sender: TObject);
begin
inherited;
try
try
if WordGame.GetSecretWord(UserSession.DifficultyLevel ) = '' then
agsID := WordGame.AddNewSecretWord(UserSession.DifficultyLe vel)
else
agsID := WordGame.GetSecretWordID(UserSession.DifficultyLev el);
case UserSession.DifficultyLevel of
3:
IWLabelDifficultyLevel.Caption := 'ساده - سه حرفی';
4:
IWLabelDifficultyLevel.Caption := 'متوسط - چهار حرفی';
5:
IWLabelDifficultyLevel.Caption := 'سخت - پنج حرفی';
end;
DataSource1.DataSet := WordGame.GetWordGameData(UserSession.DifficultyLev el);
IWEditSuggestionWord.MaxLength := UserSession.DifficultyLevel;
IWLabelLastWinner.Caption := WordGame.GetLastWinner(UserSession.DifficultyLevel );
IWLabelFoundSecretWord.Caption :=
'<a style=" text-decoration: none" href="<span style="font-family: trebuchet ms"><font size="3"><font color="Indigo"><b><font color="red">[فقط اعضاء انجمن قادر به مشاهده لینکها و عکسها می باشند <a href="/reg_iran.php" target="_blank">برای عضویت در سایت کلیک کنید</a>]</font></b></font></font></span>' +
WordGame.GetLastFoundSecretWord(UserSession.Diffic ultyLevel) + '" target="_blank">' +
WordGame.GetLastFoundSecretWord(UserSession.Diffic ultyLevel) + '</a>';
except
on E: Exception do
begin
// Error Handling
end;
end;
finally

end;
end;

procedure TWordGameForm.IWEditSuggestionWordAsyncKeyDown(Sen der: TObject; EventParams: TStringList);
begin
inherited;
if EventParams[7] = 'which=13' then
IWGradButtonSubmitAsyncClick(Sender, EventParams);
end;

procedure TWordGameForm.IWGradButtonSubmitAsyncClick(Sender: TObject; EventParams: TStringList);
var
I, J: Integer;
S : Char;
begin
inherited;
for I := 1 to Length(IWEditSuggestionWord.Text) do
begin
S := IWEditSuggestionWord.Text[I];
if (Pos(S, '`~!@#$%^&*()_+-=[]{}\|":;/?.>,<' + QuotedStr('''')) > 0) or (S = ' ') then
begin
WebApplication.ShowMessage('وجود کاراکتر غیر مجاز');
Exit;
end;
for J := I + 1 to Length(IWEditSuggestionWord.Text) do
begin
if S = IWEditSuggestionWord.Text[J] then
begin
WebApplication.ShowMessage('وجود کاراکتر تکراری');
Exit;
end;
end;
end;

if Length(Trim(IWEditSuggestionWord.Text)) = UserSession.DifficultyLevel then
IWGradButtonSubmitClick(Sender)
else
WebApplication.ShowMessage('طول کلمه پیشنهادی با طول رمز یکسان نیست');
end;

procedure TWordGameForm.IWGradButtonSubmitClick(Sender: TObject);
var
I, J, CommonCharsCnt, CompatibleCharsCnt: Integer;
SecretWord : String;
begin
inherited;
try
try
SecretWord := WordGame.GetSecretWord(UserSession.DifficultyLevel );
SecretWord := ReplaceStr(SecretWord, 'ي', 'ی');
SecretWord := ReplaceStr(SecretWord, 'ك', 'ک');
CommonCharsCnt := 0;
CompatibleCharsCnt := 0;

for I := 1 to Length(IWEditSuggestionWord.Text) do
begin
for J := 1 to Length(SecretWord) do
begin
if IWEditSuggestionWord.Text[I] = SecretWord[J] then
Inc(CommonCharsCnt);
end;
end;
for I := 1 to Length(SecretWord) do
begin
if SecretWord[I] = IWEditSuggestionWord.Text[I] then
Inc(CompatibleCharsCnt);
end;

if WordGame.AddNewSuggestionWord(UserSession.CurrentU serID, agsID, IWEditSuggestionWord.Text, CommonCharsCnt,
CompatibleCharsCnt,
UserSession.DifficultyLevel) then
begin
if (CommonCharsCnt = CompatibleCharsCnt) and (CommonCharsCnt = UserSession.DifficultyLevel) then
agsID := WordGame.AddNewSecretWord(UserSession.DifficultyLe vel);

TWordGameForm.Create(WebApplication).Show;
Release;
end
else
begin
WebApplication.ShowMessage('کلمه پیشنهادی تکراری است');
IWEditSuggestionWord.Text := '';
end;
except
on E: Exception do
begin
// Error Handling
end;
end;
finally

end;
end;

procedure TWordGameForm.IWAJAXNotifier1Notify(Sender: TObject);
begin
inherited;
DataSource1.DataSet := WordGame.GetWordGameData(UserSession.DifficultyLev el);
IWEditSuggestionWord.MaxLength := UserSession.DifficultyLevel;
IWLabelLastWinner.Caption := WordGame.GetLastWinner(UserSession.DifficultyLevel );
IWLabelFoundSecretWord.Caption :=
'<a style=" text-decoration: none" href="<span style="font-family: trebuchet ms"><font size="3"><font color="Indigo"><b><font color="red">[فقط اعضاء انجمن قادر به مشاهده لینکها و عکسها می باشند <a href="/reg_iran.php" target="_blank">برای عضویت در سایت کلیک کنید</a>]</font></b></font></font></span>' +
WordGame.GetLastFoundSecretWord(UserSession.Diffic ultyLevel) + '" target="_blank">' +
WordGame.GetLastFoundSecretWord(UserSession.Diffic ultyLevel) + '</a>';
TIWDBAdvWebGridGame.AsyncUpdateAllCells;
end;

procedure TWordGameForm.IWTimer1AsyncTimer(Sender: TObject; EventParams: TStringList);
begin
inherited;
IWAJAXNotifier1.Notify;
end;

procedure TWordGameForm.TIWDBAdvWebGridGameGetCellData(Sende r: TObject; RowIndex, ColumnIndex: Integer;
var AValue: string);
var
S: String;
begin
inherited;
if ColumnIndex = 1 then
AValue := '<a style=" text-decoration: none" href="<span style="font-family: trebuchet ms"><font size="3"><font color="Indigo"><b><font color="red">[فقط اعضاء انجمن قادر به مشاهده لینکها و عکسها می باشند <a href="/reg_iran.php" target="_blank">برای عضویت در سایت کلیک کنید</a>]</font></b></font></font></span>' + AValue +
'"'' target="_blank">' +
AValue + '</a>';
end;

end.

مجید
27 / June / 2015, 08:54 PM
در این پست می خواهیم روش های مختلف ایجاد منو برای پروژه را بررسی کنیم .

روش اول : ساخت منو بوسیله کامپوننت TIWMenu : این کامپوننت در IntraWeb Standard وجود دارد و کامپوننت پایه برای ایجاد منو در اینتراوب است .
برای ایجاد منو در پروژه به یک Frame نیاز داریم . از منوی File گزینه New و سپس ...Other را انتخاب کنید و مانند تصویر یک Frame جدید به پروژه اضافه کنید. (دقت کنید منظور Frame است نه Form)


303


نام IWFrame1 را به MenuFrame_Intraweb و نام Unit1.pas را به MenuFrame_Intraweb_Unit.pas تغییر دهید .
یک کامپوننت TMainMenu و یک TIWMenu روی فریم قرار دهید و یونیت های ServerController و UserSessionUnit و LoginUnit و UserProfileUnit و SelectDifficultyLevelUnit و ChangePasswordUnit را به قسمت implementation / uses اضافه کنید .



implementation

uses
ServerController,
UserSessionUnit,
LoginUnit,
UserProfileUnit,
SelectDifficultyLevelUnit,
ChangePasswordUnit;



مانند تصویر آیتم های منو را برای TMainMenu تعریف کنید.

304


و نام آیتم ها را مانند زیر قرار دهید :




mnuChangePassword: TMenuItem;
mnuSelectDifficultyLevel: TMenuItem;
mnuUserProfile: TMenuItem;
mnuExit: TMenuItem;
mnuLogin: TMenuItem;


و کد های زیر را برای Event های OnClick آیتم های منو بنویسید و مقدار OnClick را برای mnuLogin برابر با mnuExitClick قرار دهید :




procedure TMenuFrame_Intraweb.mnuChangePasswordClick(Sender: TObject);
begin
TChangePasswordForm.Create(TIWAPPForm(Parent)).Sho w;
end;

procedure TMenuFrame_Intraweb.mnuExitClick(Sender: TObject);
begin
UserSession.CurrentUserID := 0;
TLoginForm.Create(TIWAPPForm(Parent)).Show;
end;

procedure TMenuFrame_Intraweb.mnuSelectDifficultyLevelClick( Sender: TObject);
begin
TSelectDifficultyLevelForm.Create(TIWAPPForm(Paren t)).Show;
end;

procedure TMenuFrame_Intraweb.mnuUserProfileClick(Sender: TObject);
begin
TUserProfileForm.Create(TIWAPPForm(Parent)).Show;
end;

مقدار AttachedMenu از کامپوننت IWMenu1 را به MainMenu1 تغییر دهید تا ارتباط بین دو کامپوننت برقرار شود.
تا اینجا ساخت منو به روش اول تمام شد . برای اینکه بتوانید منو را در تمام فرم ها ببینید مراحل زیر را دنبال کنید:
فرم BaseForm را باز کنید .
مانند تصویر در قسمت Tool Palette عبارت Frame را جستجو کنید و سپس روی Frames کلیک کنید . سپس در محل دلخواه خود روی فرم کلیک کنید تا پنجره ی انتخاب فریم باز شود.


305



MenuFrame_Intraweb را از لیست فریم های موجود انتخاب کرده و OK را کلیک کنید.


306

از این پس منو ایجاد شده در تمام فرم ها نمایش داده خواهد شد . بعضی از فرم ها مانند فرم ورود کاربران نیازی به منو ندارند . از این رو فرم نام برده را باز کنید و خصوصیت Visible فریم منو را False کنید.

مجید
28 / June / 2015, 08:11 PM
روش دوم : ساخت منو بوسیله کامپوننت TTIWMainMenu : این کامپوننت در TMS IW وجود دارد .
برای ایجاد منوی جدید در پروژه به یک Frame دیگر نیاز داریم . از منوی File گزینه New و سپس ...Other را انتخاب کنید و مانند تصویر یک Frame جدید به پروژه اضافه کنید. (دقت کنید منظور Frame است نه Form)


303


نام IWFrame1 را به MenuFrame_TMS و نام Unit1.pas را به MenuFrame_TMS_Unit.pas تغییر دهید .
یک کامپوننت TMainMenu و یک TTIWMainMenu روی فریم قرار دهید و یونیت های ServerController و UserSessionUnit و LoginUnit و UserProfileUnit و SelectDifficultyLevelUnit و ChangePasswordUnit را به قسمت implementation / uses اضافه کنید .



implementation

uses
ServerController,
UserSessionUnit,
LoginUnit,
UserProfileUnit,
SelectDifficultyLevelUnit,
ChangePasswordUnit;



مانند تصویر آیتم های منو را برای TMainMenu تعریف کنید.

304


و نام آیتم ها را مانند زیر قرار دهید :




mnuChangePassword: TMenuItem;
mnuSelectDifficultyLevel: TMenuItem;
mnuUserProfile: TMenuItem;
mnuExit: TMenuItem;
mnuLogin: TMenuItem;


کد زیر را برای OnCreate کامپوننت IWFrameRegion بنویسید :




procedure TMenuFrame_TMS.IWFrameRegionCreate(Sender: TObject);
begin
if (TIWAPPForm(Parent).Name = 'RegisterForm') or (TIWAPPForm(Parent).Name = 'ForgetPasswordForm') then
begin
mnuChangePassword.Visible := False;
mnuSelectDifficultyLevel.Visible := False;
mnuUserProfile.Visible := False;
mnuExit.Visible := False;
end
else
mnuLogin.Visible := False;
end;


و کد های زیر را برای Event های OnClick آیتم های منو بنویسید و مقدار OnClick را برای mnuLogin برابر با mnuExitClick قرار دهید :




procedure TMenuFrame_Intraweb.mnuChangePasswordClick(Sender: TObject);
begin
TChangePasswordForm.Create(TIWAPPForm(Parent)).Sho w;
end;

procedure TMenuFrame_Intraweb.mnuExitClick(Sender: TObject);
begin
UserSession.CurrentUserID := 0;
TLoginForm.Create(TIWAPPForm(Parent)).Show;
end;

procedure TMenuFrame_Intraweb.mnuSelectDifficultyLevelClick( Sender: TObject);
begin
TSelectDifficultyLevelForm.Create(TIWAPPForm(Paren t)).Show;
end;

procedure TMenuFrame_Intraweb.mnuUserProfileClick(Sender: TObject);
begin
TUserProfileForm.Create(TIWAPPForm(Parent)).Show;
end;


مقدار Menu از کامپوننت TIWMainMenu1 را به MainMenu1 تغییر دهید تا ارتباط بین دو کامپوننت برقرار شود.
تا اینجا ساخت منو به روش دوم تمام شد . برای اینکه بتوانید منو را در تمام فرم ها ببینید مراحل زیر را دنبال کنید:
فرم BaseForm را باز کنید .
مانند تصویر در قسمت Tool Palette عبارت Frame را جستجو کنید و سپس روی Frames کلیک کنید . سپس در محل دلخواه خود روی فرم کلیک کنید تا پنجره ی انتخاب فریم باز شود.


305



MenuFrame_TMS را از لیست فریم های موجود انتخاب کرده و OK را کلیک کنید.


309

از این پس منو ایجاد شده در تمام فرم ها نمایش داده خواهد شد . بعضی از فرم ها مانند فرم ورود کاربران نیازی به منو ندارند . از این رو فرم نام برده را باز کنید و خصوصیت Visible فریم منو را False کنید.

مجید
29 / June / 2015, 07:19 AM
روش سوم : استفاده از نرم افزار طراحی منو Sothink DHTML Menu 9 + استفاده از IWLink
این روش را بعدا به طور کامل توضیح خواهم داد . پیش نیاز روش سوم ساخت Template برای فرم هاست که در پست های بعدی به آن خواهیم پرداخت

مجید
29 / June / 2015, 07:25 AM
آخرين تغييرات و اصلاحات در ظاهر و کد نويسي فرم ها و کلاس ها و ديتابيس انجام شد و پست هاي قبلي نيز متناسب با تغييرات بروز رساني گرديد. فايل هاي ضميمه شده به اين پست نيز حاوي آخرين تغييرات هستند . فکر ميکنم از اين به بعد ديگه تغييري در ظاهر فرم ها و کدنويسي آنها و همچنين در ساختار ديتابيس لازم نباشد . مگر اينکه کاربران عزيز باگي پيدا کنند و اطلاع دهند . از اين پست به بعد طراحي فرم ها با HTML و CSS و هر جا که لازم باشد از JavaScript نيز استفاده خواهيم کرد تا ظاهر بازي زيبا تر شود . البته نتيجه هر چه شود حاصل سليقه و دانش بنده خواهد بود و ممکن است خيلي مطلوب تمام کاربران نباشد . از اين رو شما ميتوانيد پس از مطالعه پست هاي بعدي تغييرات مورد نظر خود را به دلخواه اعمال کنيد و پوسته بازي را براي خود طراحي نماييد .

مجید
29 / June / 2015, 08:00 AM
سلام
شاید تا حالا این سوال براتون پیش اومده باشه که چرا ظاهر بعضی از فرمها ناقص به نظر میان . مثلا در فرم ثبت نام فقط IWEdit برای ورود اطلاعات وجود داشت و هیچ IWLabel ی برای اینکه کاربر بفهمه کجا باید چی وارد کنه وجو نداشت . دلیل این مساله اینه که ما قصد داریم برای بازی پوسته طراحی کنیم و از اونجایی که تعدادی از این عبارت ها استاتیک هستند نیازی نیست که اونا رو در فرم طراحی کنیم . فقط کافیه هر جا لازم شد متن مورد نظرمونو توی پوسته فرم قرار بدیم . یکی از محسنات این کار سریعتر لود شدن فرم هاست .
برای ایجاد پوسته نیاز به یک فایل HTML هست و برای کار با فایل های HTML راه های زیادی هست که اگه تجربه کار با این فایل ها را داشته باشید میتونید ابزار مناسب و دلخواه خودتونو انتخاب کنید . برای ویرایش یا ایجاد یک فایل HTML میتونید از notepad ویندوز هم استفاده کنید . نرم افزار های دیگری هم هستند که امکانات بیشتری را در اختیارتون قرار میدهند. مثل Dreamveiwer . بنده توصیه میکنم از نرم افزار Aptana Studio نسخه 3 اش استفاده کنید . این نرم افزار هم رایگان هست و هم امکانات بسیار خوبی داره که در مقایسه با نرم افزار های دیگه یک سر و گردن بالاتره. تصاویری که در پست های بعد خواهید دید از محیط همین نرم افزار خواهد بود . ضمنا اگه خیلی با HTML آشنایی ندارید میتونید معلومات خودتونو با مطالعه این سایت ( <span style="font-family: trebuchet ms"><font size="3"><font color="Indigo"><b><font color="red">[فقط اعضاء انجمن قادر به مشاهده لینکها و عکسها می باشند <a href="/reg_iran.php" target="_blank">برای عضویت در سایت کلیک کنید</a>]</font></b></font></font></span> ) بالا ببرید.

اینم آدرس سایت <span style="font-family: trebuchet ms"><font size="3"><font color="Indigo"><b><font color="red">[فقط اعضاء انجمن قادر به مشاهده لینکها و عکسها می باشند <a href="/reg_iran.php" target="_blank">برای عضویت در سایت کلیک کنید</a>]</font></b></font></font></span> برای دانلود نرم افزار Aptana Studio

اگه بتونید وقت بیشتری صرف کنید و یه چیزایی هم در مورد CSS یاد بگیرید که دیگه خیلی عالی میشه . اینطوری دیگه نیازی نیست دنبال متخصص HTML و CSS بگردیم
آدرس سایت آموزش CSS :
<span style="font-family: trebuchet ms"><font size="3"><font color="Indigo"><b><font color="red">[فقط اعضاء انجمن قادر به مشاهده لینکها و عکسها می باشند <a href="/reg_iran.php" target="_blank">برای عضویت در سایت کلیک کنید</a>]</font></b></font></font></span>

مجید
30 / June / 2015, 12:56 AM
قبل از شروع ، یک فولدر جدید در مسیر ساخت EXE پروژه ایجاد کنید و نام آن را Templates (به حرف s آخر آن توجه کنید) بگذارید . تمام فایل های HTML در این فولدر قرار خواهند گرفت . اینتراوب به صورت پیش فرض برای استفاده از فایل های قالب در مسیر Templates به دنبال آنها خواهد گشت . شما میتوانید این مسیر را در فرم ServerController تغییر داده و مسیر دیگری را برای این کار انتخاب کنید . ما فعلا با پیش فرض اینتراوب کارمان را پیش خواهیم برد.

MasterTemplate چیست؟
MasterTemplate قالب اصلی صفحات را مشخص میکند . اینتراوب سایر فایل های HTML را با MasterTemplate.Html ترکیب کرده و در نهایت به عنوان قالب نهایی فرم ها در Browser ترسیم میکند.
ایجاد فایل MasterTemplate.Html :

نرم افزار Aptana Studio را اجرا کنید و مانند تصاویر مراحل را دنبال کنید تا یک فایل MasterTemplate.html ایجاد شود

314

315

316

317

318

319

320


321


همانطور که در تصویر آخر مشاهده میکنید محتویات پیشفرض فایل MasterTemplate.html مانند زیر خواهد بود که لازم است تغییراتی در آن داده شود:



<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
"<span style="font-family: trebuchet ms"><font size="3"><font color="Indigo"><b><font color="red">[فقط اعضاء انجمن قادر به مشاهده لینکها و عکسها می باشند <a href="/reg_iran.php" target="_blank">برای عضویت در سایت کلیک کنید</a>]</font></b></font></font></span>">

<html xmlns="<span style="font-family: trebuchet ms"><font size="3"><font color="Indigo"><b><font color="red">[فقط اعضاء انجمن قادر به مشاهده لینکها و عکسها می باشند <a href="/reg_iran.php" target="_blank">برای عضویت در سایت کلیک کنید</a>]</font></b></font></font></span>" lang="en">
<head>
<meta <span style="font-family: trebuchet ms"><font size="3"><font color="Indigo"><b><font color="red">[فقط اعضاء انجمن قادر به مشاهده لینکها و عکسها می باشند <a href="/reg_iran.php" target="_blank">برای عضویت در سایت کلیک کنید</a>]</font></b></font></font></span>"Content-Type" content="text/html; charset=utf-8" />
<title>MasterTemplate</title>
<meta name="author" content="Admin" />
<!-- Date: 2015-06-29 -->
</head>
<body>

</body>
</html>


داخل فایل MasterTemplate.html را به صورت زیر تغییر دهید :




<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
"<span style="font-family: trebuchet ms"><font size="3"><font color="Indigo"><b><font color="red">[فقط اعضاء انجمن قادر به مشاهده لینکها و عکسها می باشند <a href="/reg_iran.php" target="_blank">برای عضویت در سایت کلیک کنید</a>]</font></b></font></font></span>">

<html xmlns="<span style="font-family: trebuchet ms"><font size="3"><font color="Indigo"><b><font color="red">[فقط اعضاء انجمن قادر به مشاهده لینکها و عکسها می باشند <a href="/reg_iran.php" target="_blank">برای عضویت در سایت کلیک کنید</a>]</font></b></font></font></span>" lang="en">
<head>
<meta <span style="font-family: trebuchet ms"><font size="3"><font color="Indigo"><b><font color="red">[فقط اعضاء انجمن قادر به مشاهده لینکها و عکسها می باشند <a href="/reg_iran.php" target="_blank">برای عضویت در سایت کلیک کنید</a>]</font></b></font></font></span>"Content-Type" content="text/html; charset=utf-8" />
<title>IntraWeb_WordGame</title>
</head>
<body dir="rtl" lang="fa">
<div id="Banner" style="border: dotted; border-width: 1px; position: fixed; top: 0px; left: 0px; right: 0px; height: 100px;">&nbsp;</div>
<div id="UserMenu" style="border: dotted; border-width: 1px; position: fixed; top: 101px; left: 0px; right: 0px; height: 30px;">&nbsp;</div>
<div id="SiteBody" style="border: dotted; border-width: 1px; position: fixed; top: 131px; left: 0px; right: 0px; bottom: 31px;">
$body
</div>
<div id="Footer" style="border: dotted; border-width: 1px; position: fixed; left: 0px; right: 0px; bottom: 0px; height: 30px;">&nbsp;</div>
</body>
</html>


در این فایل 4 تگ "<div>" استفاده شده است . داخل یکی از تگ ها عبارت body$ قرار دادیم تا محتویات ایجاد شده توسط اینتراوب در این قسمت نمایش داده شود . این محتویان همان کامپوننت هایی هستند که در فرم های پروژه گذاشته ایم.


در پایان باید فایل MasterTemplate.html را به فرم ServerController معرفی کنیم تا این مرحله به اتمام برسد. لطفا مانند تصویر عمل کنید :

322

مجید
05 / July / 2015, 03:04 AM
سلام
بالاخره پروژه به پایان رسید . امشب سورس و فایل های اجرایی + منو ها و Template ها را برای علاقمندان آپلود میکنم تا وظیفه خودمو به انجام رسونده باشم . شرمنده هستم که کمی طول کشید . متاسفانه از این پروژه استقبال خوبی نشد و بنده هم فقط برای اینکه کار را ناتمام رها نکرده باشم پست آخر را بدون هیچ توضیح اضافه ای میگذارم تا هر کس علاقمند بود خودش زحمت بکشد و سورس را دانلود کند و ببیند که بنده چه کرده ام. امیدوارم برای علاقمندان مفید بوده باشد . ضمنا روش سوم ساخت منو ها هم در این سورس آخر لحاظ شده است . خودتون زحمتشو بکشید و ببیید چطوری ساخته شده.
در ادامه هم تصاویری از محیط بازی را مشاهده خواهید کرد:

323

324

325

326

327

328

329

مجید
15 / July / 2015, 10:55 PM
عجب پروژه ای شد!
هنوز هیچکس توش باگی پیدا نکرده !؟
اصلا فکر نمیکردم اینقدر کارم درست باشه !!!
بیش از 3500 بازدید و غیر از admin عزیز همه فقط عابر رهگذر بودند و ویترین را تماشا کردند . هیچکس از کالای ما چیزی نپرسید!!!

مجید
16 / July / 2015, 06:55 PM
سلام به همه
برای دوستانی که نتونستند بک آپ دیتابیس را بازیابی کنند : اول عذر خواهی میکنم که اطلاع رسانی نکردم و در ادامه هم اسکریپت های دیتابیس و جداول را قرار میدم تا با هر نسخه ای از sql بتونید آن را ایجاد کنید
اسکریپت ساخت دیتابیس بازی :
نکته : مسیر ایجاد دیتابیس را به دلخواه خودتون تغییر بدید






USE [master]
GO

/****** Object: Database [IntraWordGameDB] Script Date: 07/16/2015 05:40:08 ب.ظ ******/
CREATE DATABASE [IntraWordGameDB]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'IntraWordGameDB', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\IntraWordGam eDB.mdf' , SIZE = 4416KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
LOG ON
( NAME = N'IntraWordGameDB_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\IntraWordGam eDB_log.ldf' , SIZE = 2048KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO

ALTER DATABASE [IntraWordGameDB] SET COMPATIBILITY_LEVEL = 120
GO

IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [IntraWordGameDB].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO

ALTER DATABASE [IntraWordGameDB] SET ANSI_NULL_DEFAULT OFF
GO

ALTER DATABASE [IntraWordGameDB] SET ANSI_NULLS OFF
GO

ALTER DATABASE [IntraWordGameDB] SET ANSI_PADDING OFF
GO

ALTER DATABASE [IntraWordGameDB] SET ANSI_WARNINGS OFF
GO

ALTER DATABASE [IntraWordGameDB] SET ARITHABORT OFF
GO

ALTER DATABASE [IntraWordGameDB] SET AUTO_CLOSE OFF
GO

ALTER DATABASE [IntraWordGameDB] SET AUTO_SHRINK OFF
GO

ALTER DATABASE [IntraWordGameDB] SET AUTO_UPDATE_STATISTICS ON
GO

ALTER DATABASE [IntraWordGameDB] SET CURSOR_CLOSE_ON_COMMIT OFF
GO

ALTER DATABASE [IntraWordGameDB] SET CURSOR_DEFAULT GLOBAL
GO

ALTER DATABASE [IntraWordGameDB] SET CONCAT_NULL_YIELDS_NULL OFF
GO

ALTER DATABASE [IntraWordGameDB] SET NUMERIC_ROUNDABORT OFF
GO

ALTER DATABASE [IntraWordGameDB] SET QUOTED_IDENTIFIER OFF
GO

ALTER DATABASE [IntraWordGameDB] SET RECURSIVE_TRIGGERS OFF
GO

ALTER DATABASE [IntraWordGameDB] SET DISABLE_BROKER
GO

ALTER DATABASE [IntraWordGameDB] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
GO

ALTER DATABASE [IntraWordGameDB] SET DATE_CORRELATION_OPTIMIZATION OFF
GO

ALTER DATABASE [IntraWordGameDB] SET TRUSTWORTHY OFF
GO

ALTER DATABASE [IntraWordGameDB] SET ALLOW_SNAPSHOT_ISOLATION OFF
GO

ALTER DATABASE [IntraWordGameDB] SET PARAMETERIZATION SIMPLE
GO

ALTER DATABASE [IntraWordGameDB] SET READ_COMMITTED_SNAPSHOT OFF
GO

ALTER DATABASE [IntraWordGameDB] SET HONOR_BROKER_PRIORITY OFF
GO

ALTER DATABASE [IntraWordGameDB] SET RECOVERY FULL
GO

ALTER DATABASE [IntraWordGameDB] SET MULTI_USER
GO

ALTER DATABASE [IntraWordGameDB] SET PAGE_VERIFY CHECKSUM
GO

ALTER DATABASE [IntraWordGameDB] SET DB_CHAINING OFF
GO

ALTER DATABASE [IntraWordGameDB] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF )
GO

ALTER DATABASE [IntraWordGameDB] SET TARGET_RECOVERY_TIME = 0 SECONDS
GO

ALTER DATABASE [IntraWordGameDB] SET DELAYED_DURABILITY = DISABLED
GO

ALTER DATABASE [IntraWordGameDB] SET READ_WRITE
GO






اسکریپت های جداول به تفکیک نسخه SQL Server ضمیمه شده است

مجید
28 / July / 2015, 07:10 AM
سلام
نسخه جدید پروژه بازی به پیوست تقدیم می گردد. admin عزیز در مورد چگونگی اتصال به دیتابیس اشکالی در پروژه پیدا کرده و گزارش دادند و بنده هم در اولین فرصت آن را اصلاح کرده و در این پست تقدیم می کنم.
اشکال مربوط به ConnectionString پروژه بود . وقتی شما فایل اجرایی را دانلود و اجرا می کردید ، نرم افزار سعی می کرد با ConnectionString استاتیک که مربوط به تنظیمات کامپیوتر بنده بود به دیتابیس وصل شود و در نتیجه کاربر با Error مواجه می شد.
در نسخه اصلاح شده ، نرم افزار ابتدا در مسیر فایل اجرایی بدنبال فایلی با نام Config.txt می گردد . اگر آن را پیدا کند محتویات آن را خوانده و پس از Decrypt کردن ، به عنوان ConnectionString در پروژه مورد استفاده قرار میدهد. ولی چنانچه این فایل پیدا نشود در فرم ورود کاربران بجای دکمه "ورود" دکمه "Config" نمایش داده خواهد شد که کاربر میتواند بوسیله آن Config.txt مربوط به سیستم خود را تولید کند.

341

342

مجید
31 / July / 2015, 11:34 PM
سلام
جهت اجرای صحیح پروژه باید فولدر های <span style="font-family: trebuchet ms"><font size="3"><font color="Indigo"><b><font color="red">[فقط اعضاء انجمن قادر به مشاهده لینکها و عکسها می باشند <a href="/reg_iran.php" target="_blank">برای عضویت در سایت کلیک کنید</a>]</font></b></font></font></span> و Templates در کنار فایل اجرایی وجود داشته باشند
قالب فرم Login تغییر کرده بود که اصلاح شد و در همین پست به همراه Exe مجددا آپلود و در دسترس کاربران عزیز قرار میگیرد

مجید
01 / August / 2015, 11:56 AM
سلام
لینک بازگشت در فرم ثبت نام و فراموشی رمز عبور و لینک راهنمای بازی به فرم بازی اضافه شد

آخرین سورس و exe به پیوست تقدیم می گردد

Lazarus
05 / August / 2015, 12:13 AM
سلام به دوستان فعال و خوش فکر
ایده بسیار جالب و پشتکار شما هم قابل تحسین هست
فقط یک نکته وجود داره ! چرا Intra Web ؟ چرا یک HTTP Server مثل indy رو انتخاب نکردید ؟

مجید
05 / August / 2015, 10:37 AM
سلام
مرسی از لطفتون
شما بفرمایید چرا Intraweb نه؟ و چرا indy ?
البته دلیل بنده اینه که خیلی بلد نیستم با indy کار کنم !!! :(

شما اگه می تونید این دو را با هم مقایسه کنید تا اگر indy راه بهتری پیشنهاد میکنه بنده هم برم سراغش
ممنون میشم اگه وقت بذارید و راهنمایی کنید

Lazarus
06 / August / 2015, 12:04 AM
سلام
خوب نمیشه به صورت کلی گفت کدوم نسبت به دیگری برتری دارند و خیلی بستگی به نحوه پیاده سازی و اهداف پروژه داره ، indy در واقع یک Embedded HTTP Server هست و شما مجبورید همه چیز رو خودتون پیاده سازی کنید
اما 2 حسن عمده داره ، اول اینکه برنامه شما به وب سرور خارجی وابسته نمیشه و دوم اینکه در سطح پایین قدرت کنترل همه چیز رو خواهید داشت.
شاید یک جورایی بشه گفت مثل مقایسه php و ASP.net هست.

مجید
16 / August / 2015, 11:44 PM
سلام به همه
به زودی عضو جدید گروه یعنی سر کار خانم شیر محمدی پوسته جدید بازی را آماده و آپلود خواهد کرد

b_e_shamlu
17 / August / 2015, 01:38 PM
با سلام و دورود ورود سر کار خانم شیر محمدی را خیر مقدم میگوییم .

مجید
29 / September / 2015, 12:31 AM
به دلیل عدم استقبال اعضاء این گفتگو بسته می شود