PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : فیلم آموزش کامل زبان برنامه نویسی Lua و 8 Autoplay Media Studio + آموزشهای تکمیلی



sajjadkhati
11-26-2014, 11:04 AM
مجموعه آموزش نرم افزار 8 Autoplay Media Studio :

تعداد فیلم های آموزشی : 28

حجم کلیه فیلم های آموزشی : 6.7 گیگابایت

سال تهیه : 1392

منبع آموزش ها : کتاب آموزش نرم افزار 8 Autoplay Media Studio از آقای حامد حیــدری و جواد احشامیان




دانلود قسمت 1 (http://sajjadkhati.persiangig.com/video/autoplay%20media%20studio%208/AMS_ghesmate%201/) (فقط برای اتصال فایلهای قسمت اول ، با نرم افزار کم حجم Sj Split باید این کار رو کنین)

دانلود قسمت 2 (http://sajjadkhati.persiangig.com/video/autoplay%20media%20studio%208/AMS_ghesmate%202/)

دانلود قسمت 3 (http://sajjadkhati.persiangig.com/video/autoplay%20media%20studio%208/AMS_ghesmate%203/)

دانلود قسمت 4 (http://sajjadkhati.persiangig.com/video/autoplay%20media%20studio%208/AMS_ghesmate%204/)

دانلود قسمت 5 (http://sajjadkhati.persiangig.com/video/autoplay%20media%20studio%208/AMS_ghesmate%205/)

دانلود قسمت 6 (http://sajjadkhati.persiangig.com/video/autoplay%20media%20studio%208/AMS_ghesmate%206/)

دانلود قسمت 7 (http://sajjadkhati.persiangig.com/video/autoplay%20media%20studio%208/AMS_ghesmate%207/)

دانلود قسمت 8 (http://sajjadkhati.persiangig.com/video/autoplay%20media%20studio%208/AMS_ghesmate%208/)

دانلود قسمت 9 (http://sajjadkhati.persiangig.com/video/autoplay%20media%20studio%208/AMS_ghesmate%209/)

دانلود قسمت 10 (http://sajjadkhati.persiangig.com/video/autoplay%20media%20studio%208/AMS_ghesmate%2010/)

دانلود قسمت 11 (http://sajjadkhati.persiangig.com/video/autoplay%20media%20studio%208/AMS_ghesmate%2011/) + ادامه ی این قسمت را از اینجا دانلود کین (http://s3.picofile.com/file/7947072040/AMS_ghesmate_11_part5.rar.html)

دانلود قسمت 12 (http://sajjadkhati.persiangig.com/video/autoplay%20media%20studio%208/AMS_ghesmate%2012/)

دانلود قسمت 13 (http://sajjadkhati.persiangig.com/video/autoplay%20media%20studio%208/AMS_ghesmate%2013/)

دانلود قسمت 14 (http://sajjadkhati.persiangig.com/video/autoplay%20media%20studio%208/AMS_ghesmate%2014/)

دانلود قسمت 15 (http://sajjadkhati.persiangig.com/video/autoplay%20media%20studio%208/AMS_ghesmate%2015/)

دانلود قسمت 16 (http://sajjadkhati.persiangig.com/video/autoplay%20media%20studio%208/AMS_ghesmate%2016/)

دانلود قسمت 17 (http://sajjadkhati.persiangig.com/video/autoplay%20media%20studio%208/AMS_ghesmate%2017/)

دانلود قسمت 18 (http://sajjadkhati.persiangig.com/video/autoplay%20media%20studio%208/AMS_ghesmate%2018/)

دانلود قسمت 19 (http://sajjadkhati.persiangig.com/video/autoplay%20media%20studio%208/AMS_ghesmate%2019/)

دانلود قسمت 20 (http://sajjadkhati.persiangig.com/video/autoplay%20media%20studio%208/AMS_ghesmate%2020/)

دانلود قسمت 21 (http://sajjadkhati.persiangig.com/video/autoplay%20media%20studio%208/AMS_ghesmate%2021/)

دانلود قسمت 22 (http://sajjadkhati.persiangig.com/video/autoplay%20media%20studio%208/AMS_ghesmate%2022/)

دانلود قسمت 23 (http://sajjadkhati.persiangig.com/video/autoplay%20media%20studio%208/AMS_ghesmate%2023/)

دانلود قسمت 24 (http://sajjadkhati.persiangig.com/video/autoplay%20media%20studio%208/AMS_ghesmate%2024/)

دانلود قسمت 25 (http://sajjadkhati.persiangig.com/video/autoplay%20media%20studio%208/AMS_ghesmate%2025/)

دانلود قسمت 26 (http://sajjadkhati.persiangig.com/video/autoplay%20media%20studio%208/AMS_ghesmate%2026/)

دانلود قسمت 27 (http://sajjadkhati.persiangig.com/video/autoplay%20media%20studio%208/AMS_ghesmate%2027/)

دانلود قسمت 28 (http://sajjadkhati.persiangig.com/video/autoplay%20media%20studio%208/AMS_ghesmate%2028/)


دانلود کتاب آموزش Autoplay Media Studio 8 به همراه توضیحات اضافه (http://s2.picofile.com/file/7939217953/Learn_AutoPlay_Media_Studio_8.rar.html)



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

اگر تاکنون با نرم افزار 8 Autoplay Media Studio کار کرده باشید با قابلیت های فراوان این نرم افزار در زمینه ساخت آتوران آشنا هستید . اگر هم تاکنون با این نرم افزار کار نکرده اید این فیلم های آموزشی تا حد بسیار زیادی شما را با نحوه اسکریپت نویسی و ساخت نرم افزار و تهیه آتوران های سفارشی آشنا خواهد نمود .


معرفی نرم افزار :

ویژگی های فوق کلیدی نرم افزار :

1) یکی از مهم ترین نقطه قوت این نرمافزار که اونو از نرم افزارای دیگه جدا میکنه ، استفاده از زبان برنامه نویسی و موتور لوا (Lua) هه . این زبان علاوه بر کاربرد خیلی ساده تر و راحت تر نسبت به زبان های دیگه ، نه تنها از لحاظ قدرت ، دست کمی از زبان های دیگه نداره ، بلکه در گاهی از موارد ممکنه قدرتمندتر هم عمل کنه و اغلب قابلییت های زبان های دیگه رو ساپورت میکنه و همینطور از سرعت اجرای قابل قبولی نسبت به نرم افزارای دیگه برخورداره .

2) نقطه ی قدرت دیگه ی این نرم افزار استفاده از پلاگین های بسیار متنوع و حتی استفاده از ماژول ها و کامپوننت های (این دو هم عملکردی شبیه پلاگین رو حالا با تفاوت هایی دارن) مختلف رو داره.

3) علاوه بر اینا ، استفاده ی توابع پیش فرض خود AMS حدود 800 تابع هست که نسبت به دیگر نرم افزارای هم رقیبش ، خیلی بهتره


AutoPlay Media Studio نرم افزاری برای ساخت سریع و حرفه ای نرم افزارهای چند رسانه ای و اتوران می باشد. کاری که ممکن است به صورت عادی بوسیله نرم افزارهای سنتی برنامه نویسی مانند C, C++, Java, Visual Basic چندین روز تا چندین هفته زمان ببرد را می توانید توسط این نرم افزار و ابزار قدرتمند آن بسیار سریعتر انجام دهید. اما این امکانات تنها در مورد فرم ها و اسکریپت های ساده نیست و ما در مورد طراحی نرم افزارهای مولتی مدیای حرفه ای با قابلیت های مختلفی مانند تعامل با اینترنت ، اتصال به پایگاه داده ها ، اجرای ویدئو و غیره صحبت می کنیم.
AutoPlay Media Studio به شما در طراحی و ساخت نرم افزارهای مولتی مدیا کمک شایانی می کند. حتی در صورتی که شما تخصصی در برنامه نویسی نداشته باشید نیز می توانید پروژه های حرفه ای را خلق کنید. مراحل کار کاملا تصویری پیش می رود و قابلیت Drag & Drop به شما کمک شایانی خواهد کرد. شما به سادگی می توانید متن ، موزیک ، ویدئو ، عکس ، لیست های مختلف و محتوای وب را با موس کامپیوتر خود در صفحه طراحی این نرم افزار جا به جا کنید.سپس می توانید با استفاده از کتابخانه داخلی و بیش از 865 اکشن آماده اقدام به طراحی نرم افزار مورد نظر خود کنید.



AutoPlay Media Studio 8 بهترین ابزار برای ساخت منوها با قابلیت اجرای خودکار برای CD/DVD-ROM ، درایوهای USB و دیسک های بلو - ری می باشد. این نرم افزار دارای محیط برنامه نویسی کاملا تصویری بوده و شما می توانید از طریق آن با سرعت زیاد نرم افزارهای مختلف برای ویندوز بسازید.
شما می توانید تنها با چند کلیک ساده دکمه های مختلفی برای جا به جا کردن صفحات ، اجرای نرم افزارها ، ارسال ایمیل ، مشاهده وبسایت ، باز کردن اسناد ، دانلود فایل و ... را بسازید. تنها محدودیتی که دارید خلاقیتتان می باشد!
این نرم افزار محصولی از سایت indigorose می باشد .

ویژگی های نرم افزار AutoPlay Media Studio :
- محیط برنامه نویسی کاملا تصویری.
- سهولت در استفاده.
- گزینه های ساخت ساده نرم افزارهای مختلف.
- اجرای فایل های ویدیویی با پسوند MPG و AVI.
- توسعه کامل WYSIWYG.
- بی نیاز از نصب برنامه های جانبی.
- اجرای هر نوع فایل،برنامه و پوشه.
- وجود پلاگین های متنوع و زیاد این نرم افزار



قسمتی از طرح هایی که تو آموزش گفته شد :

1) جستجو داخل فایل ها و فولدرها
2) جستجو داخل دیتابیس
3) دفترچه تلفن
4) ساخت آزمون
5) اجرای پی در پی ستاپ نرم افزارها
6) تغییر پشت زمینه ی اتوران
7) انیمیشنی کردن یه آیکون در اتوران
8) ایجاد تنظیمات برای اتوران
9) لود آهنگ از هارد و ایجاد لودینک برای روند آهنگ به همراه تایمر سپری شدن زمان آهنگ

** این ها فقط پروژه و طرح هایی بود که تو آموزش گفته شد نه همه ی آموزش ینی اول آموزش کد نویسی و الگوریتم ها از مقدماتی تا جایی که دانسته های آدم یاری میکرد http://forum.soft98.ir/images/smilies/yahoo/4.gif داده شد به همراه آموزش اکشن ها و کدها (که حدود 90 درصد شون گفته شد) و بعد طرح ها مثال زده شدباز این طرح ها هم جدای از اون الگوریتم هاییه که تو قسمت پیوست های کتاب استاد حامد گفته شد و همینطور بعضی از طرح ها واسشون دو تا الگوریتم گفته شد .

** برای شادی روح اموات خودتون و هر کسی که در این آموزش تلاش کردن و سهیم ان ، ممنون میشم یه فاتحه بخونین

sajjadkhati
11-26-2014, 11:13 AM
یه چند تا پست آموزشی و پروژه هست که تو فیلم ها گفته نشد ، واسه همین گفتم بگم دیگه http://forum.soft98.ir/images/smilies/yahoo/4.gif

این پست واسه قرار دادن و آموزش نصب اتوماتیک فایل ها (بدون اومدن پنجره ی واسه زدن دکمه های Next و ...) از طریق فایل های MSI :

چیزی نیس که ، یه خطه همش . خوندن نداره که http://forum.soft98.ir/images/smilies/yahoo/4.gif




InstallMsi = MSI.InstallProduct("AutoPlay\\Docs\\Gmail Notifier Pro 4.5.1.msi", "ACTION=INSTALL");


خوب دیگه ملومه از اسمش دیگه . باید نوع و پسوند فایل تون MSI (نه exe ها) باشه که تک و توک فایل های نصبی مثل نرم افزارهای Google Drive و ... با این پسوند ان (حیف .شانسو میبینی؟ اگه هموشون با این پسوند میشدن ، چی میشد http://forum.soft98.ir/images/smilies/yahoo/4.gif)
دومین نکته این که تو ورودی اول کد بالا ینی "AutoPlay\\Docs\\Gmail Notifier Pro 4.5.1.msi" باید مسیر فایل MSI ای که میخاین نصب کنین رو بدین (هر پوشه ای که میرین باید دو تا علامت \\ بزارین (یکی نمیشه ها) باز نگین نگفتی http://forum.soft98.ir/images/smilies/yahoo/4.gif)
سومین نکته هم اینه که همونطور تو راهنمای این دستور ملومه ، اگه میخاین فایل رو حذف کنین (ینی قبلا اگه نصب شده بود) ، باید تو ورودی دوم این کد ، رشته ی "REMOVE=ALL" رو وارد کنین (مثل همینی که نوشتم باید داخل دابل کوتیشن باشه ها ینی نوشته هه باید داخل علامت " " باشه چون از نوع رشته هه) که اینش به درد ما زیاد نمیخوره (حذف کی میکنه آخه http://forum.soft98.ir/images/smilies/yahoo/4.gif) و اگه میخاین فایل msi رو نصب کنین تو ورودی دوم ، مثل کد بالا باید بنویسین "ACTION=INSTALL" و اگه میخاین بصورت administrator نصب کنین باید "ACTION=ADMIN" رو وارد کنین

اگه نصب با موفقیت انجام شه ، متغییر اش (که تو اینجا طرف چپ مساوی ینی InstallMsi میشه) برابر true میشه ینی true رو برمیگردونه و اگه نصب نشه یا مشکلی پیش بیاد ، false رو برمیگردونه یا همون ذخیره میکنه که تو راهنماش نوشته هه. مثلا اگه میخاین وقتی با موفقیت نصب شد پیام بده ، چون اگه با موفقیت نصب بشه ، متغییرش (InstallMsi) برابر با true میشه پس میگین اگه برابر با true شد ، یه پیام بده ینی اگه میخاین پیام بده ، در ادامه ی کد بالا ، اینو بنویسین :




if InstallMsi==true then
Dialog.Message("Notice", "your program installed successfully", MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
end


موفق و پیروز و سربلند باشین

sajjadkhati
11-26-2014, 11:13 AM
این دیگه آموزش نیست . فقط کد خالیه http://forum.soft98.ir/images/smilies/yahoo/4.gif
عنوانش ملومه دیگه . ینی وقتی موس رو روی پروژه کلیک کردین و همینطور که فشار داده هه ، به سمت چپ یا راست میبرین ، پروژه هم به صفحه ی قبلی (وقتی موس رو به سمت چپ ببرین) یا صفحه ی بعدی (وقتی موس رو به سمت راست ببرین) میره (شبیه عملکرد صفحات لمسی و آندروید و... حالا این بار با موس توی پروژه تون . البته اگه صفحه لمسی هم داشته باشین که ما تو عمرمون ندیدیم http://forum.soft98.ir/images/smilies/yahoo/4.gif هم میشه) :

برین تو رویداد on mouse button و اینا رو کپی کنین :




if e_Type==0 then
MousePos = "LeftButtonPressed"
MouseMove = "Once"
else
MousePos = "LeftButtonNotPressed"
MouseMove = "Not Once"
end


بد برین تو رویداد کناریش ینی on mouse move و ایناها رو کپی کنین :




if MousePos == "LeftButtonPressed" then
if MouseMove == "Once" then
PosNextPage = e_X+100
PosPrevPage = e_X-100
MouseMove = "Not Once"
end

if e_X>=PosNextPage then
MousePos = "LeftButtonNotPressed"
Page.Navigate(PAGE_NEXT);
end

if e_X<=PosPrevPage then
MousePos = "LeftButtonNotPressed"
Page.Navigate(PAGE_PREVIOUS);
end
end




یه چن تا نکته فقط بگم:

1) تو اینجا و تو این کد ، اگه تو پروژه کلیک کنین (و ول نکنین و همینجوری داشته باشین) و موس را 100 پیکسل به طرف راست ببرین ، پروژه میره به صفحه ی بعدش و اگه 100 پیکسل از همونجایی (که اول کلیک کرده بودین) ، موس رو به سمت چپ بکشین ، پروژه میره به صفحه ی قبل اش (حواستون باشه نباید کلیک موس رو ول کنین وقتی که چپ و راست میبرینش)

2) این کد و طرح فقط تو پروژه هایی کار میکنه که تو تنظیمات پروژه (منوی project>setting) تو قسمت style اش ، نوع پنجره بصورت standard انتخاب شده باشه . ینی تو حالت flat کار نمیکنه.
اگه میخاین تو حالت flat (که تو تنظیماتش گفتم هست) کار کنه ، باید بازم تو همین تنظیمات ، قابلیت جابجایی پروژه را مخفی کنین ینی تیک Movable رو بردارین

3) ملومه بازم دیگه . این کد رو باید تو رویداد on mouse button و on mouse move همه ی صفحات بزارین تا همه ی صفحات کار کنن

sajjadkhati
11-26-2014, 11:14 AM
برای نام گزاری متغییرها ، هیچ وقت از تیکه ای از اسم توابع استفاده نکنین.

مثلا تو کد Page.StartTimer ، اگه تو خط های قبل اش یا تو رویداد های دیگه (بسته به رویداد داره که اجرا شده باشه کداش یا نه) ، متغییری بنام Page تریف کنین که دقیقا هم نام یه تیکه ی اول از کدمون که Page.StartTimer بود بدیم و فرضا اگه این متغییر Page رو برابر یه عدد یا رشته که مثلا اینجا میخام بگیرم برابر رشته ی علی ینی ali"=Page بگیرم و تو خط بدش کد Page.StartTimer رو بزارم ، همونطور که میدونین هر جا اسم Page بیاد ، بجاش مقدارش که تو اینجا ali بود رو میزاره و چون اون کد هست و اگه کوچیکترین دستگاری ای بشه ، قات میزنه http://forum.soft98.ir/images/smilies/yahoo/4.gif پس ارور میده . ینی تو اینجا اگه اینجوری بنویسیم کد رو :



Page = "ali"
Page.StartTimer(1000, 10);



کدمون اینجوری جایگزین میشه و بجای تیکه ی اولش که Page بود ، مقدار متغییر مون که ali بود جایگزین میشه :



ali.StartTimer(1000, 10);



. چون کد ali.StartTimer واسه نرم افزار نامفهومه پس موقه اجرا ، ارور میده

یادتون باشه من گفتم اگه دقیق مثل اون یه تیکه ی کدها (حالا قسمت چپ کد که Page بود یا راستش که StartTimer بود) اما همونطور که میدونین که این نرم افزار برای تریف متغییر ، به حروف بزرگ و کوچیک حساسه پس اگه اون متغییر Page رو بصورت page اسم گزاری کنین ، ارور نمیده چون این دو تا رو به عنوان دو تا متغییر جداگانه میشناسه نرم افزار

sajjadkhati
11-26-2014, 11:14 AM
اینم انواع پروژه های مختلف که از انجمن خدا بیامرزی وسوسه گرفتم و مهم تریناشو براتون پیوست کردم تو زیر

این پروژه و پلاگین های همراشو میتونین از اینجا دانلود کنین (http://s5.picofile.com/file/8107787668/autoran_project.rar.html)

پروژه ها ایناهان :

1) امتحان یا همون کوییز تستی
2) کپی فایل با روند پیشرفت اش
3) لودینگ خالی
4) خوندن همراه با متن آیه های قران
5) ضبط صدا خودتون
6) ساخت یوزر و پسورد
7) تغییر پشت زمینه ی صفحه دسکتاپ کامپیوتر خودتون
8) ماشین حساب
9) دفترچه تلفن
10) تغییر صدا و ولوم
11) utility for AMS 2.6

به همراه یک سوپرایز :ch0m:
نرم افزار یا بهتر بگم پلاگین پرکاربرد utility for AMS 2.6 که اغلب کمبود ها و پلاگین ها و کدهای مکمل رو تو خودش داره مثل انواع پلاگین ها برای transition و تعویض انیمیشنی صفه و ... و چن تا پلاگین واسه اضافه شدن کدها و ...

به اضافه ی یه پلاگین واسه نرم افزار به اسم Progress.EX همراشه که میتونه اتوران رو هم مثل ویندوز مثلا موقع پخش آهنگ ، پروگرس و روند پیشرفت آهنگ رو تو taskbar برای پروژه ی اتوران نشون بده

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

sajjadkhati
11-26-2014, 11:15 AM
Registery :

برای قسمت registery ، هر جا کلمه ی key رو دیدی ، منظورش پوشه های سمت چپ تو رجیستری هه و هر جا کلمه ی value Name رو دیدی منظورش همون اسم value یا همون اولین ردیف تو ستون سمت چپ هست بنام Name هه و هر جا کلمه ی value خالی یا data رو دیدی ، منظورش مقدار value که همون آخرین ردیف تو ستون سمت راست بنام data هه ، هست
تذکر : نوع value اگه از نوع REG_SZ باشه ، به عنوان رشته ذخیره میکنه و اگه از نوع REG_DWORD باشه از نوع عدد اما موقع خوندن و برگردوندن ، همه رو از نوع رشته میخونه و برمیگردونه

sajjadkhati
11-26-2014, 11:15 AM
قضیه ی return (کلمه ی کلیدی return) :


return معمولا تو تابع استفاده میشه و اگه برابر یه مقدار شد ، اگه تابع فراخونی بشه ، اون مقداری که تو return دادیم رو برمیگردونه . مثلا :



n=0
function num(n)
if n==0 then
return 1
end

Dialog.Message("Notice", num(n), MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);



در اینجا تو خروجی ، num(n) همون مقدار return ای هست که برابر 1 بود ینی تو خروجی نوشته میشه 1

مثلا فاکتوریل رو میخایم با این روش حساب کنیم :




n = Input.GetText("Input1");
n = String.ToNumber(n);


function factorial(n)
if n == 0 then
return 1
else
return n * factorial(n - 1)
end
end
Dialog.Message("Notice", factorial(n), MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);



تو این دستور از ورودی اینپوت مقداری که وارد شدش رو میگیره و اگه برابر 0 بود (تو ورودی اینپوت عدد 0 نوشته شده بود ) ، تو خروجی factorial(n) ، 1 میشه ینی مینویسه تو خروجی 1
و اگه هر عدد دیگه ای بود ، مثلا اگه بود 3 ، خود اون عدد ضربدر factorial یکی از خودش کمتر حساب میشه ینی اینجوری میشه :
3*factorial(2)
چون تابع factorial دوباره فراخونی شد پس دوباره این تابع اجرا میشه اما این بار با پارامتر یکی کمتر از خودش ینی n=2 ینی در واقع خودش از داخل خودش ، فراخونی میکنه و صدا میزنه تابع خودش رو ینی در واقع همون کار تابع بازگشتی رو میکنه
باز چون n=2 هه ، باز هم این قسمت else اجرامیشه ینی
n * factorial(n -1)

این بار که n=2 هه پس میشه :
3*factorial(2)
خود factorial(2) که مقدار باز گشتی بود دوباره فراخونی میشه و میشه :
2* factorial(1)
ینی در واقع تا حالا شد :
3*(2* factorial(1))
دوباره تابع factorial(1) که اینبار مقدار n برابر 1 هه اجرا میشه و همه ی قبلی ها مثل بالا ضرب میشن در factorial(1) :
factorial(3*(2*(1)))
در اینجا ، تا factorial(1) محاسبه میشه که میشه : factorial(0)*1 و چون factorial(0) مخالف شرط اول تابع هه ، پس فقط تا 1 ضرب میشه و factorial(0) که میشد factorial(-1)*-1 اجرا نمیشه
پس :
3*2*1=6
پس فاکتوریل 3 که میشه 6 بدست اومد

sajjadkhati
11-26-2014, 11:15 AM
دستور حلقه ی تکرار while :

اگه ما مثلا بنویسیم :




i=1
while i==5 do
Dialog.Message("Notice", "Your message here.", MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
End


خوب این ملومه که چون i برابر 5 نیست پس دستور شرط اجرا نمیشه (مثلا اگه تو خط دوم میزاشتیم i==1 چون قبلش تو خط اول برابر 1 بود پس شرط دستور اجرا میشد)
اما وقتی بجای خط بالا بنویسیم :



i=1
while i do
Dialog.Message("Notice", "Your message here.", MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
end



این بار چون تو خط دوم ، شرط و مقدارخاصی برای متغییر i تعریف نکردیم (ینی نگفتیم که هر وقت i برابر فلان مقدار بود ، شرط رو اجرا کن) ، پس اگه i برابر هر مقداری بود ، اون شرط حلقه ی while اجرا میشه . فقط کافیه که متغییر i قبل حلقه ، تعریف شده باشه (با هر مقداری)

sajjadkhati
11-26-2014, 11:17 AM
فرا آرایه (MetaTable) :
تذکر : این قسمت آموزش فرا آرایه نیست بلکه آموزش آرایه ی چند بعدی هه . و هر وقت تو این پست حرف از فرا آرایه زده شد ، شما آرایه ی چند بعدی رو جاش بزارین . فرا آرایه یه چیز دیگه هست که تو آخرین پست گفته میشه

همون آرایه ی معمولی خودمونه اما میشه عنصرها یا همون عضوهاش رو برابر یه متغییر گرفت یا حتی برابر یه متغییر نگرفت . مثلا آرایه ی معمولی که این جوریه :



Array={10,7,3,"ali"}


فرا آرایه ای که متغییر داره ، این جوری میشه :



Array={x=10,y=7,z=3,w="ali"}


یا فرا آرایه ای که متغییر نداره ، این جوری میشه :



Array = {{10,7,3},"Ali"}


که به این نوع آخر ، آرایه ی چند بعدی هم میگن که یکی از پرکاربردترین و مهم ترین و کارآسون کننده ترین هاست http://forum.persiancoders.com/images/smilies/4.gif درباره ی این نوع آرایه یا بهتره بگم فراآرایه ی چند بعدی ، تو صفه ی 3 بحث میکنیم (حتما اگه طالب فراآرایه این ، اون مبحث را پی گیری کنین که خیلی مهمه)

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



a={v={ 7, 1, 30},y=20,z=30}



یا مثلا اگه خودش دارای یه فرا آرایه باشه :




a={v={x=7,y=1,z=30},y=20,z=30}



این جوری ای که گفتم ، دقیق باید همین جوری نام گذاری کرد . ینی مثل حالت عادی باید تعریف کرد دیگه. ینی وقتی حتی میخایم داخل خود یه فرا آرایه ،آرایه یا فرا آرایه ی دیگه ای رو تعریف کنیم ، مثل حالت عادی ای که تعریف میکنیم ، اون آرایه یا فرا آرایه ی داخلی رو هم باید بهش یه نام بدیم . (که در بالا برابر v گرفتیم)

حالا در اینجا فقط اولین عضو فرا آرایه ی a رو براش آرایه و فرا آرایه ی دیگه ای تعریف کردیم . میتونیم عضوهای دیگه رو هم این جوری کنیم

حالا فراخونی فرا آرایه که مهمترین قسمته :

همونطور که میدونیم برای فراخونی عضوهای یه آرایه ، تو لوا ، 2 روش هست . اگه آرایه فقط مقدار داشت (آرایه معمولی بود) ، عضوها رو با اندیس شماره فراخونی میکنیم که در این صورت برای فراخونی عضو خاصی از آرایه ، اول اسم آرایه ی اصلی رو نام میبریم و بعد دو تا کلوشه باز و بسته میکنیم و اندیسی که بصورت شماره هست رو ، شماره شو تو کلوشه میزاریم ولی اگه اون عضوهای اون آرایه ، خودش متغییر داشت (مثل همین فرا آرایه) ، عضوها رو با اندیس اسم متغییر اش فراخونی میکنیم که در این صورت برای فراخونی عضو خاصی از آرایه ، اول اسم آرایه ی اصلی رو نام میبریم و بعد یه نقطه میزاریم و بعد اسم متغییر اون عضو خاص رو مینویسیم

مثلا دو تا فرا آرایه داریم که فرا آرایه ی اول اسمش a هست و فرا آرایه ی دوم اسمش b :




a={x=10,y=20,z=30}
b={x=2,y=7,z=5}


خوب حالا مثلا میخایم بگیم که x امین عضو از فرا آرایه ی a که 10 هست رو با x امین عضو از فرا آرایه ی b که 2 هست رو جمع کن ، این جوری فراخونی میکنیم که چون خود عضو های آرایه ، متغییر دارن ، پس باید اسم متغییر هاشون رو برد ینی فراخونی آرایه با روش دوم که تو بالا گفتم پس a.x ینی x امین عضو از فرا آرایه ی a که 10 بود و b.x هم همون x امین عضو از فرا آرایه ی b رو که 2 بود برمیگردونه پس مینویسم :

c=a.x+b.x

ینی 10+2 که میشه 12 رو تو متغییر c ذخیره میکنه و تو کد پایین نمایش میده



Dialog.Message("Notice", c, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);



ما میتونیم هر عضو از یه فرا آرایه رو با هر عضوی که دلمون خاست ، عملیات ریاضی انجام بدیم تو مثال بالا مثلا :

C=a.z+b.x

که z امین عضو از آرایه ی a رو که 30 بود با x امین عضو از آرایه ی b که 2 بود رو جمع میکنه که میشه 32 و تو متغییر c ذخیره میکنه
و حتی فقط عضوهای یه آرایه رو عملیات ریاضی انجام بدیم که خوب ملوم بود و لازم به گفتن نبود.

همینطور میتونیم عضوهای یه فرا آرایه رو با عضوهای یه آرایه ی معمولی با هم ، عملیات ریاضی انجام بدیم مثلا :




a={x=10,y=20,z=30}
b={ 2, 7, 5}



a که یه فرا آرایه هست و b هم یه آرایه ی معمولی . طرز فراخونی هر دو تا شونو تو همون اول گفتم . اونی که متغییر نداره ، ینی عضوهای آرایه ی معمولی رو با شماره (ای که داخل کلوشه هه) فراخونی میکنیم و عضوهای فرا آرایه رو چون متغییر داره ، با اسم متغییرش (با نقطه قبل اش) فراخونی میکنیم پس اگه میخایم بگیم اولین عضو فرا آرایه ی a رو که 10 هست میشه a.x و اگه میخایم بگیم اولین عضو آرایه ی b که 2 هست میشه b[1] ینی :



c=a.x+b[1]



که همون 10 رو با 2 جمع میکنه و 12 رو تو c ذخیره میکنه و .. :




Dialog.Message("Notice", c, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);



همین طور که همون اول گفتم ، میتونیم داخل یه فرا آرایه ، یه فرا آرایه ی دیگه ای رو به عنوان عضواش تعریف کنیم و با یکی دیگه عملیات ریاضی انجام بدیم مثلا :




a={x={x=7,y=1,z=30},y=20,z=30}
b={x=2,y=7,z=5}



در اینجا ما میخایم بگیم اولین عضو از فرا آرایه ی a که خودش هم یه فرا آرایه ای هه بنام x بگیم که اولین عضو از این فرا آرایه ی x رو که متغییری هست بنام x که مقدارش 7 هست رو با اولین عضو از فرا آرایه ی b که متغییر اش x با مقدار 2 هست رو جمع کنه.
همیشه مقدار بعد از آخرین نقطه تو فراخونی ، اندیس یا همون عضو آرایه هست و قبل از اون آخرین نقطه همه شون میشن اسم آرایه پس ینی فقط کافیه برای فراخونی اولین عضو فرا آرایه x که خودش تو فرا آرایه ی a هست ، کلا به ترتیب اسم هر آرایه و هر متغییری رو که میخای ، بزاری و بین شون نقطه بزاری ینی :
a.x.x
ینی همون مقدار 7 که اولین عضو فرا آرایه ی x هه. ینی x امین عضو از فرا آرایه ی x که خودش تو فرا آرایه ی a هه
یا مثلا a.x.y ینی y امین عضو از فرا آرایه ی x که تو فرا آرایه ی a هه که تو مقدار بالا میشه همون 1
خوب حالا بریم سر اصل مطلب که میخاستیم اون 7 رو با 2 که گفته شد جمع کنیم .2 هم که منظورمون همون اولین عضو فرا آرایه ی b بود میشه b.x
پس میشه :






c = a.x.x + b.x
Dialog.Message("Notice", c, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1


یادتون نره که تو صفه ی 4 پست 39 ، فراآرایه ی چند بعدی رو هم دنبال کنین چون مبحث کاربردی ایه

sajjadkhati
11-26-2014, 11:19 AM
نوشتن فراآرایه به روش دیگر و کاربردی تر :

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

خسته کیه؟ :bye:
نشنیدم؟ :bye:
شنیدم بابا ، آروم تر ، کر شدم :bye:

خوب گلپسران اساتید ، نگا کنین ، همونطور که میدونین ، آرایه رو به دو روش میشه نوشت . یکی مثل روش بالا که تو پایین هم مینویسم و بلدین :



Array={10,7,3,"ali"}


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



Array = {}
Array[1] = 10
Array[2] = 7
Array[3] = 3


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



a={v={ 7, 1, 30},y=20,z=30}


برا نامگزاری و فراخونی y امین عضو آرایه ی a که 20 هست (**یادتون باشه که تا وقتی که یه عضو را برابر یه متغییر گرفتیم ، مثل همین y ، دیگه گفتن شماره و اندیس برا اون عضو بی معنی هه ینی اینجا نمیششه گفت دومین عضو آرایه ی a برابر 20 هست . باید بگین y امین عضو از آرایه ی a) باید بنویسین a.y که میدونین و اوستایین دیگه ، ینی y امین عضو از آرایه ی a که چن بود؟ 20 بود دیگه. خوب پس فراخونی اش چجوری هه؟ ینی هر جا نقطه اومد ، سمت راست اون نقطه (در اینجا y) زیر مجموعه ی هر چی که سمت چپ نقطه نوشته هه هست (در اینجا a) و ممکنه حتی این زیر مجموعه (در اینجا y ) ، خودش یه آرایه ی دیگه ای باشه (که فلا تو این مثال نیست )

**یادتون باشه که تو فرا آرایه ، اگه عضوی نامگزاری نشه (متغییر براش تعریف نشه و مثل حالت عادی باشه)، به عنوان اولین عضو اون آرایه حساب میشه . مثلا تو مثال :



a={v={ 7, 1, 30},y=20,30}


تو اینجا ، از زیر مجموعه های آرایه ی a ، آرایه ی v که خودش زیرآرایه ی a هسست (ینی واسه خودش یل ای هه و ازدواج کرد و تشکیل خانواده داد :bye:) ینی هر چی که آرایه بود رو کار نداریم . y که براش نام انتخاب شد و عضو نامداری هه (ینی آدم معروف و نامداری هه:bye:) تنها بی نام و نشون میمونه اون آخری هه که 30 هست و برخلاف تصور ، اولین بی نام و نشون میشه ، اولین عضو آرایه که a بودش . ینی :



a[1] = 30


میباشد.
مثالای دیگه هم که تو پست بالا کار کردیم و نامگزاری رو بلدین دیگه؟ مثل :



a.v[2] = 1


ینی اینکه دومین عضو از آرایه (یا زیر آرایه) ی v از آرایه ی a که میبینین میشه 1
حالا بریم سر خر ماجرا (نه اسب) :bye: ینی که میخایم همون آرایه ی a ی بالا رو یه جور دیگه بنویسیم (که اصل ماجرا گفته شد) :
اول اینو پایین دوباره بنویسم تا تو چش بیاد قشنگ :



a={v={ 7, 1, 30},y=20,30}


دونه دونه از اول انگار میخایم فراخونی کنیم و مثل مثال ساده ای که همون اول همین پست (چند خط اول) گفتم ، هر جا آرایه یا زیر آرایه (منظورم از زیر آرایه عضو های عادی نیستا . مثل v تو مثال بالا هه که زیر آرایه هه) و کلا هر جا علامت آرایه که میدونین {} دیدین ، مثل مثال اول ، قبلش باید تعریف کنین پس من برا نوشتن آرایه ی بالا ، اول آرایه ی a رو دیدم .پس تو خط اول مینویسم:


a = {}

بعد آرایه یا همون زیر آرایه ی v دیدم پس تو خط بعدش باید عضو شو ملوم کنم . مثل همون قضیه ی بالا ینی جایگاه v اینجوری میشه که v امین عضو از آرایه ی a هست و چون خودش آرایه هست باید یه آرایه براش تریف کنم :


a.v = {}

حالا نوبت میرسه به اولین عضو زیر آرایه ی v که 7 هست و چون اولین عضو آرایه ی v هست و عضو اش هم نامگزاری نشدش پس باید با اندیس نامگزاری کنم پس تو خط بعد مینویسم :


a.v[1] = 7

همینطور خط بعد :


a.v[2] = 1

همینطور خط بعد :


a.v[3] = 30

خط بعدش هم که عضو y میشه و دیگه زیر مجموعه ی آرایه ی v نیست پس دیگه v رو لازم نیست بنویسیم و میشه y امین عضو از آرایه ی a ینی :


a.y = 20

خط بعدش هم همونطور که گفته شد ، چون عضوش نام نداره و اولین عضو بدون نام هست ، پس اولین عضو آرایه ی ماقبل خودش که a هست میشه ینی :


a[1] = 30


پس در کل نوشتن اش تو خط های پشت سر هم میشه :



a = {}
a.v = {}
a.v[1] = 7
a.v[2] = 1
a.v[3] = 30
a.y = 20
a[1] = 30


حالا یه مثال دیگه :



Array = {Madrese={5,"Tafrih"},"Ali",Khone={12,Bazar={1,2,3,4,5,6,7,8}}}


جان من اسم متغییرها رو حال کردین؟ :bye:
اینو توضیح بدم؟ مینویسم ، مثل قضیه ی بالاهه هر کی سئوال داشت ، بگه (کسی نمیاد اینورا که بخونه که سئوال داشته باشه :bye:)



Array = {}
Array.Madrese = {}
Array.Madrese[1] = 5
Array.Madrese[2] = "Tafrih"
Array[1] = "Ali"
Array.Khone = {}
Array.Khone[1] = 12
Array.Khone.Bazar = {}
Array.Khone.Bazar[1] = 1
Array.Khone.Bazar[2] = 2
Array.Khone.Bazar[3] = 3
Array.Khone.Bazar[4] = 4
Array.Khone.Bazar[5] = 5
Array.Khone.Bazar[6] = 6
Array.Khone.Bazar[7] = 7
Array.Khone.Bazar[8] = 8


همونطور که میدونین ، 8 تا خط آخر هم میتونین با حلقه ی for تریف کنین :



Array = {}
Array.Madrese = {}
Array.Madrese[1] = 5
Array.Madrese[2] = "Tafrih"
Array[1] = "Ali"
Array.Khone = {}
Array.Khone[1] = 12
Array.Khone.Bazar = {}


for i=1,8 do
Array.Khone.Bazar[i] = i
end


دیدین که همه چی آسون بود
یادتون نره که تو صفه ی 4 پست 39 ، فراآرایه ی چند بعدی رو هم دنبال کنین چون مبحث کاربردی ایه

sajjadkhati
11-26-2014, 11:21 AM
فرا آرایه یا آرایه ی چند بعدی :
تذکر : این قسمت آموزش فرا آرایه نیست بلکه آموزش آرایه ی چند بعدی هه . و هر وقت تو این پست حرف از فرا آرایه زده شد ، شما آرایه ی چند بعدی رو جاش بزارین . فرا آرایه یه چیز دیگه هست که تو آخرین پست گفته میشه

قبل از همه جا داره یه تشکر حسابی از آقا محمد (سید اهل انجمن :ch0m:) کنم که واقعا تا آخرین سئوالات من جواب داد. فعلا که جز تشکر خشک و خالی نمیتونم کنم . ان شاء ا... جبران کنم (نمیتونم :ch0m:)
بعد بگم که حتما باید پست فرا آرایه رو که تو صفحات قبل هه بخونین تا این مطالب براتون نا آشنا نباشه و راحت تر یاد بگیرین
همونطور که تو همون پست گفته شد ، مهم ترین ویژگی فرا آرایه اینه که چون حالت چند بعدی (هر تعداد مثل 3 یا 4 بعدی و ...) هستن ، میشه کار چندین آرایه رو تو یه آرایه انجام داد . منظور از چند بعدی اینه که چندین اندیس (عدد داخل پرانتز آرایه ها) که همون نوعی متغییر هستن میشه براش تعریف کرد پس بجا اینکه چندین آرایه تعریف کرد ، میشه همه ی اون آرایه ها رو (هر چند تا میخان باشن) فقط تو یه فرا آرایه ی چند بعدی خلاصه کرد که کار رو فوق العاده آسون و سریعتر میکنه و علاوه بر اون ویژگی دیگه شم اینه که میشه دو تا فرا آرایه ی مختلف و حتی عضوهای مختلف یه فرا آرایه رو میتونیم روش عملیات ریاضی (جمع و کم و ...) و ... انجام بدیم.

تعریف فرا آرایه ی چند بعدی :
همون دقیق مثل فرا آرایه ی قبلی هه اما هر جا داخل فرا آرایه ، متغییر دیدین ، نزارین . همین یَندِک :ch0m:
مثلا تو همون پست قبلی که درباره ی فرا آرایه بود مثال زیر یکیش بود :



Array={v={ 7, 1, 30},y=20,z=30}


برا تبدیل این به چند بعدی ، کافیه هر چی داخل فرا آرایه ی Array ، متغییر میبینین ، حذف کنین ینی کنینش :



Array={{7,1,30},20,30}



فراخونی فرا آرایه ی چند بعدی :

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




ABC = {54,65,3}


وقتی میگین ABC[2] ینی چی؟ نخندین . بال بِنِه بَزِه بَمِرداشون :ch0m: (این تیکه مخصوص زبون خودمه . مازندرانی کی این دور و بره؟ ترجمه نکنه :ch0m:) الان میگین خوب هر کی میدونه ینی دومین عضو آرایه ی ABC . آری اما این جوری معنی کنین . ینی دومین آرگومان یا ورودی یا همون بعد از دومین ویرگول از آرایه ی ماقبل خودشABC هست . آرگومان هم که ملومه دیگه چیه. هر جا ویرگول شد ، میشه آرگومان بعدی (البته ورودی نمیشه گفت چون باید متغییر دریافت بشه که روش الگوریتم پیاده شه که مخصوص توابع هست). الان تو بالا ، 54 میشه آرگومان اول و 65 که میشه بعد ویروگول میشه دومیش و 3 هم که بازم بعد ویرگوله میشه سومیش (آرگومان حالا میخاد یا عضو هست یا زیر آرایه)
بازم قبل از چیزای دیگه با چن تا دیگه از فرا آرایه ی چند بعدی آشنا شین . مثال ها :


Array={{{"ali",54,"Salam"},{true,789,"Payam"}},{4,Moteghaeir,75},{985},"BedoneZirArrayeh",25}

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


Array={{7,1,30},20,30}

عدد 1 فراخونیش چجوریه؟
داخل فرا آرایه ی Array ، زیر آرایه ای که عدد 1 توش هستش تو آرگومان اول هه ینی اولین آرگومان آرایه ی ماقبل اش که Array هست رو مینویسیم که تا اینجای کار میشه :


Array[1]

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


Array[1][2]


تا اینجا دید یو آندرستند (تود)؟ ندید یو؟ خاهید دید یو :ch0m:
مقدار این تو زیر چی میشه؟ :


Array[3]

خوب این که دیگه ملومه فقط آرایه هست نه فرا آرایه یا چند بعدی . چون یه دونه اندیس فقط داره و آخرین اندیس هم شماره ی عضو رو ملوم میکرد. از این حالت هم متوجه نشین ، از همون حالت قبل میریم ینی داخل فرا آرایه ی Array ، سومین آرگومان اش چی میشه تو اینجا هم آرگومان منظورش چیه؟ منظورش همون سومین عضوه . اولین آرگومان اش که همون زیر آرایه میشه و دومیش که 20 و سومیش 30 هه که ملومه
من برم شام بخورم بیام :ch0m:
اگه گفتین چی داشتیم؟ دلتون خربزه :ch0m:

2) تو فرا آرایه ی


Array={{{7,1,30},{780}},{20,45},50,80,95,{451,313} }

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


Array[1][2][1]

و همینطور به ترتیب عددهای 313 و 30 و 780 و 20 چجوری فراخونی میشن؟

اول قسمت الف ینی فراخونی برا کدوم عدده رو بگم . گفت Array[1] منی این چی بود؟ این بود که اولین آرگومان داخل آرایه ی ماقبل خودش ینی اولین آرگومان داخل آرایه ی Array . خوب . داخل آرایه ی Array اولین آرگومان اش کدومه؟ چون داخل آرگومان اول ، چند تا زیر آرایه هست ، خوب ملومه دیگه ینی منظورش کل زیر آرایه هایی هه که تو آرگومان اول تعریف و پرانتزش باز و بسته شد . پس منظورش تا اینجا میشه :


{{7,1,30},{780}}

حالا اندیس بعدی که 2 هه . ینی چی ینی دومین آرگومان داخل آرایه ی قبلی خودش . آرایه ی قبلی چی بود؟ همین خط بالاییه دیگه . ینی دومین آرگومان داخل این خط بالاییه . اولین آرگومان اش که میشه


{7,1,30}

این آرایه و دومیشم که میشه :


{780}

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


Array[1][2][1]

میشه 780

جواب سئوال قسمت ب برا عدد 313 :
عدد 313 داخل کدوم زیر آرایه هست؟ ینی شماره ی آرگومان اون زیر آرایه ، چنده؟ اولین آرگومان فرا آرایه ی Array که میشه


{{7,1,30},{780}}

دومیشم که میشه


{20,30}

سومیش میشه 50 و چارمیش 80 و پنجمیش 95 و شیشمیش که میشه همون زیر آرایه ی مورد نظر ما که


{451,313}

هست . پس اولین اندیس اش میشه 6 . حالا 313 چندیمین عضو این زیر آرایه هه؟ دومی دیگه پس فراخونیش میشه :


Array[6][2]



برای عدد 30 :
برا اینکار هم از داخل فرا آرایه ی اصلی شرو کنین و هر جا که به آرگومان مورد نظر رسیدین ، عدد اون رو داخل اندیس بنویسین و همینطور برا آرگومان بعدی ، دوباره تو اندیس کناریش و ... تا به شماره ی عضوش برسین
برا عدد 30 ابتدا، به اولین آرگومان برخورد میکنیم که


{{7,1,30},{780}}

هست پس اینجا تو اولین اندیس عدد 1 را مینویسیم . برا اندیس بعدی ، بازم داخل این ، عدد 30 رو تو آرگومان اول میبینیم که بازم زیر آرایه هست . که میشه این آرایه :


{7,1,30}

پس بازم اندیس 1 میدیم و برا اندیس بعدی هم میمونه شماره ی عضو عدد 30 که میشه 3 پس کلا میشه :


Array[1][1][3]


عدد 780 که جوابش تو قسمت الف داده شد . میمونه عدد 20
این زیر آرایه


{20,30}

چندمین آرگومان Array هه؟ خوب ملومه دومی. پس اولین اندیسش میشه 2 و اندیس بعدی هم که شماره ی عضو عدد 20 رو باید بنویسیم که اولین عضوش هست پس میشه :



Array[3][1]

بازم دیدید؟ ینی دید یو آندرستودینگا؟ هاتی اینگا پاتی اینگا؟ منم هنگ کردنینگا :ch0m: والا . بده یه قرن نوشتن ، کروم قات زد ، اون وری هم تو انجمن ذخیره نشد ، مردم دارم دوباره مینویسم :ch0m:



تعریف فرا آرایه ی چند بعدی به روش کاربردی تر :
خوب گلپسران میدونین که تعریف آرایه دو روش داره که اون روش کاربردی تر که خیلی راحت تره و دقیق موقه فراخونی هم ازش استفاده کردیم گفته نشد که گفته میشه
قبل از توضیح ادامه ی این مطلب ، دقیق تو فرا آرایه ای که چن صفه پیش گفته شد و اگه میخاستین تعریف کنین ، همه ی اعضاشو (که اونجا اعضاشون میشه گفت متغییر بودن و با نقطه از هم جدا میشدن) باید به عنوان آرایه تعریف میکردین ینی علامت آرایه که {} هست میزاشتین ، اینجا هم همینطوره . مثلا تو اونجا برا تعریف Array.AddedSoftware.Patch باید اینجوری مینوشتین :


Array={}
Array.AddedSoftware={}
Array.AddedSoftware.Patch={}

و حالا عضوهای زیر آرایه ی Array.AddedSoftware.Patch رو ملوم میکردین
تو اینجا هم خوب آخرین عضوه که لازم به این کار نیست براش ینی اندیس آخری رو کاری باهاش ندارین چون عضو آرایه هست ولی برای تمام اندیس های قبلیش به همراه فرا آرایه ی اصلی که اسمه ، دونه دونه آرایه تعریف میکنین ینی برابر علامت آرایه میگیرین مثل بالا . مثلا اگه مقداری فراخونی شد که 4 تا اندیس داره (بجز آخری) برا بقیه ، دونه دونه آرایه تعریف میکنین . مثلا برا فراخونی این:


Array[4][1][4][2]

اون آخری اندیس که 2 هست که شماره ی عضوه که هیچ چی (ینی اون باید برابر مقدار که یا عدده یا رشته یا بولین حتما گرفته بشه وگرنه nil یا پوچ میشه مقدارش) و منظورم از هیچ چی اینه که برا اون علامت آرایه لازم نیست بزاری (چون صوبت فلا سر علامت آرایه گرفتنه) و برا دونه دونه اندیس های قبلیش باید آرایه تعریف کنین مثل مثال بالا ینی باید حتما قبلش اینو بنویسین :


Array={}
Array[4] = {}
Array[1] = {}
Array[4] = {}


حتما هم لازم نیست همه ی زیر آرایه ها تعریف بشن یا همه ی اعضاشون . مثلا میتونیم بدون اینکه زیر آرایه ی اول رو تعریف کنیم ، بپریم رو دومی و دومی رو تعریف کنیم ولی یادمون باشه هر کدوم رو که تعریف نکنیم ولی فراخونی کنیم (چه عضو یا چه زیر آرایه) ، مقدارش برابر nil میشه که ملومه مثلا :



Array[13][1]=30

میتونیم مستقیم فقط همین رو تعریف کنیم بدون اینکه زیر آرایه یا عضوهای دیگه رو تعریف کنیم اما بقیه ی اعضا یا زیر آرایه تا تعریف نشن ، برابر nil میمونن که ملومه . منظورم اینه که تو بالا که Array[4] تعریف شد ، حتما نباید Array[1] و Array[2] و Array[3] قبل اش تعریف بشن و میتونیم فقط آرایه برا بالا رو تعریف کنیم بدون اینکه اروری داشته باشیم ینی برا تعریف و مقدار دادن فرا آرایه ی بالا ، قبلش فقط کافیه این رو تعریف کنیم که تو بالا هم گفته شد :


Array={}
Array[13] = {}


در این مثال بالا هم فقط سیزدهمین زیر آرایه از فرا آرایه ی Array تعریف شد که اولین عضوش برابر 30 هه
مِرِه خو گِج هاکرده (نکِردِه) :ch0m: مازندرانی ندارین بین تون ها . آ راستی اوستا محسن هستا . لو میرم :ch0m:
ادامه اش شد واسه امروز . اولین پستی هه که از روز قبل فرا رفت :ch0m:


خوب حالا بریم چندین مثال (چندین منو که میدونین . همون یه دونه منظورمه :ch0m:) از ساخت آرایه ی چند بعدی توسط حلقه ی for بزنیم و دنده خلاص :ch0m:
فرض کنین میخایم آرایه ی زیر رو تعریف کنیم :


Array[2][2][1] = "Ali"
Array[1][1][1] = "hasan"

با استفاده از حلقه ی for ، چجوری قبلش آرایه براشون تعریف میکنیم؟ دیگه این قد که کاری نداره و توضیح دادن نمیخاد که . ها؟ :ch0m: هم نحوه ی ساخت آرایه گفته شد و هم این حلقه رو بلدین پس مستقیم میریم سر وقت جواب :


Array={}
for i=1,2 do
Array[i] = {}
Array[i][i] = {}
end


دیگه توضیح لازم نیست دیگه . میدونین چرا 2 تا اندیس رو به عنوان آرایه تعریف شد دیگه. تو مثال بالا که گفته شد . به تعداد اندیس ها بجز آخری باید قبلش آرایه تعریف بشه دیگه که تو حلقه ی for شد
**یه نکته :
اگه تو حلقه ی بالا که آرایه تعریف کردین ، این جوری مقدار دهی کنین ، اشتباست و موقه فراخونی ارور میده :


Array[1][1] = "Ali"
Array[1][1][1] = "hasan"

همون واسه اولی ارور میده که اسم "Ali" هست . چرا؟
چون شما حلقه ی for رو که بررسی کنین ، میبینین این ساختار از آرایه رو تعریف کردین (رشته ی "SomeThing" فقط برا پر کردن عضو هست . تعداد عضو هم میتونه فرق داشته باشه اما من دلخواه ، یه دونه گرفتم برا هر کدوم) :


Array = {{{"Somthing"},"Somthing"},{"Somthing",{"Somthing"}}}


خوب حالا اگه مقدار دهی ای که قبلا کرده بودین ینی :


Array[1][1] = "Ali"

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


Array = {{"Somthing","Somthing"},{"Somthing",{"Somthing"}}}

که حالا بجای SomeThing ، مقدار Ali رو تعریف کردین اما دومین تعریف تون درسته که Hasan هست . پس تو این جور تعریفات ، خوب دقت کنین که چی تعریف میکنین به عنوان زیر آرایه یا آرایه ی چند بعدی و چی مقدار دهی میکنین . حواستون به سازگاری اینا مثل بالا باشه
حالا اینم مثال آخر :



Array = {}
Number = 1
for i=1,3 do
Array[i] = {}
for x=1,3 do
Array[i][x]=Number
Number = Number + 1
end
end


این الگوریتم هم ملومه دیگه . یه فرا آرایه ی 2 بعدی هه که 3 در 3 هست ینی 3 تا آرایه یا زیر آرایه داخلشه که هر کدومشون 3 عضو دارن و دقیق میشه این رو تعریف کردین :



Array = {{1,2,3},{4,5,6},{7,8,9}}


مِردال شدیم رفتیم :ch0m: نشدیم رفتیم :ch0m: طومار غضنفر علی شاه شد :ch0m:
ان شاء ا.. که یاد گرفته باشین و بازم سر آخر کاری نمیتونم برا سید مون کنم جز یه تشکر خشک و خالی
به نیت اموات خودمون و خودتون و هر کسی که تو کلیه ی این آموزش ها سهیم اند هم یه صلوات بفرستین ، ممنون میشم

sajjadkhati
11-26-2014, 11:21 AM
دستورnext برای گرفتن عضو بعدی آرایه:

با این دستور (کلمه ی کلیدی نیست) ، میتونیم مقدار متغییر (یا همون عضو) بعدی یه آرایه رو بدست بیاریم. ساختارش دقیقا به این صورت هست (یه قسمت رو ننویسی ، نمیشه) :

باید برای ریختن متغییر بعدی با دستور next ، براش دو تا متغییر تعریف کنی (برابر دو متغییر دیگه بگیری) که هر کدوم با علامت ویرگول جدا میشن . و سر آخر ، اسم دومین متغییر که سمت راست ویرگول بود رو نام ببری . طرز استفاده شم اینجوریه که بعد از اینکه کلمه ی next رو نوشتی ، اون آرایه ای که مد نظرته و میخای متغییر یا عضو بعدی شو بدونی ، اسم شو مینویسی و بعد یه ویرگول میزاری و شماره ی اون آرایه ای که میخای عضو بعدی شو بدونی رو مینویسی مثلا اگه بنویسی 2 ، عضو بعدی اون آرایه رو میگه ینی سومین عضو اون آرایه رو میگه.
یه مثال :



array = {"ahmad","hasan","rahmat","rahman",4}
First,Secand=next(array,2)
Dialog.Message("Notice", Secand, MB_OK,
MB_ICONINFORMATION, MB_DEFBUTTON1);



که آرایه ی بنام array مون تو اینجا ، 5 عضو داره که 4 تای اولی ، رشته و پنجمین عضوش ، عدد هست
همونطور که گفتم ، در خط دوم ، برای قضیه ی next که عضو بعدی اون آرایه ای رو که بهش بگیم ، بهمون برمیگردونه رو باید تو دو تا متغییر ریخت و با ویرگول جدا کرد و متغییر سمت راست رو فراخونی کرد تا دستور next کار کنه. پس اولین متغییر رو تو اینجا اسمشو گرفتم First و با یه ویرگول ، اسم دومین متغییر اش رو Secand گرفتم. ساختار next هم که گفتم بعد از نوشتن next ، یه پرانتز باید باز کرد که اولین قسمتش اسم آرایه ای رو که قبلا تعریف کرده بودیم و تو دومین قسمت اش (که با ویرگول جدا میشن) ، شماره ی اون عضوی از آرایه که عضو بعدی شو میخایم رو باید نوشت و چون اینجا نوشته شد 2 ، پس عضو بعدی آرایه ینی عضو سوم آرایه ی array که "rahmat" هست ، داخل دومین متغییری که بعد ویرگول نام برده شد (در اینجا متغییر Secand ذخیره و برگردونده میشه)
خط آخر هم که دیگه معلومه و متغییر Secand که سومین عضو آرایه ی array هست ، فراخونی شد که گفتم دیگه و "rahmat" رو برمیگردونه.
تذکر : اگر هم تو قسمت یا همون ورودی دوم دستور next ، کلمه ی nil رو بنویسیم ، اولین عضو اون آرایه که معلوم کردیم ، مقدارش برامون برگردونده میشه (نه اینکه یکی بعد از اولین عضو ینی دومین عضو آرایه برگردونده شه ها . تو این nil دیگه اینجوری نیست . خود اولین عضوش رو برمیگردونه. خود nil هم به منی هیچ و پوچ هست دیگه )
ینی اگه تو بالا خط دوم مینوشتیم :




First,Secand=next(array,nil)



وقتی متغییر Secand فراخونی بشه ، اولین عضو از آرایه ی array که "ahmad" هست ، برگردونده میشه اما خوب ملومه که اگه بنویسیم :




First,Secand=next(array,1)


یکی بعد از اولین عضو ینی دومین عضو اون آرایه برگردونده میشه
خوب اینا رو که گفتم ، واسه متغییر دوم ینی Secand (متغییری که بعد ویرگول نوشته شه) برگردونده و ذخیره میشه
اما داخل اولین متغییر (متغییر قبل ویرگول) ، اون عدد بعد از اون عددی که مشخص کردیم برگردونده میشه (فقط عددها. نه عضو بعدی اون آرایه) ینی الان تو مثال اولی که




First,Secand=next(array,2)


بود ، داخل متغییر First ، عدد بعدی عدد 2 که عدد 3 هست ، ذخیره و برگردونده میشه. (نه سومین عضو آرایه ای که ملوم شد)
اما اگه فقط یه دونه متغییر برا دستور next تعریف شده باشه ، فقط مثل همین خط بالا که گفتم ، عدد بعدی اون عددی که نوشته شد رو برمیگردونه (نه عضو بعدی آرایه رو) . مثلا :




abc =next(array,2)



الان دیگه متغییر abc ، مثل چن خط بالا که گفتم ، عدد بعدی 2 که همون 3 هست رو برمیگردونه (پس برا اینکه عضو بعدی آرایه برگردونده شه ، باید متغییر دوم (سمت راست ویرگول) رو فراخونی کرد.

این دستور معمولا توی تولید مثل (ریختن یه آرایه تو یه آرایه ی جدید دیگه) کاربرد داره

sajjadkhati
11-26-2014, 11:23 AM
توضیح یه الگوریتم برای تکثیر یه آرایه (نیازمندی هاش اول تمرین و بعد دیدن فیلم ها + پست های آموزش قبلی هه) :

ینی میخایم یه آرایه رو کپی کنیم و علاوه بر اینکه خود اولیش باشه ، عضوهاشو تو یه آرایه ی دیگه بریزیم
خوب اول بگم که اساتیدای گل مهندسین که شاید مثلا یه مسئله به کارمون در ظاهر نیاد مثل همین تکثیر آرایه . اما در باطن و برای حل مسائل دیگه که مواجه میشین ، روش و الگوریتم یه مسئله خیلی به کار آدم میاد. ینی چیزی که مهمه الگوریتم و روش حل مسئله هست هر چند اون مسئله به درد تون نخوره در ظاهر . پس پیشنهادم اینه که اگه میخاین کد نویسی و حتی برنامه نویسی تون خوب شه ، تا میتونین الگوریتم هایی که هر کی به کار برد رو روش فکر کنین برا یاد گیری . هر چند اگه اون طرف از یه زیان دیگه استفاده میکنه و شما از یه زبان دیگه. تا اینجا را که داستان سرودم http://forum.soft98.ir/images/smilies/yahoo/4.gif بریم سر اسب مطلب http://forum.soft98.ir/images/smilies/yahoo/4.gif
بازم لازمه قبل آموزش تکثیر آرایه ، یه چن تا نکات ابتدایی رو که تو فیلم هم گفته شد یاد آوری کنم:
نگا کنین همونطور که تو فیلم هم گفته شد ، طرف راست مساوی میشه مقدار متغییر (هر چند اسم متغییر برده شه) و طرف چپ مساوی میشه خود متغییر که اون مقدار توی همین (طرف چپ) ذخیره میشه. اگه بخام مثال همون فیلمه رو که گفتم بزنم ، طرف راست مساوی کار سیب و پرتغال رو میکنه http://forum.soft98.ir/images/smilies/yahoo/4.gif و طرف چپ مساوی همون جعبه ای هست که این سیب و پرتغال رو میریزین توش . پس این سیب یه مقداری هست تو جعبه گزاشتیم . واسه این میگیم متغییر که میتونیم بجای سیب ، توش پرتغالم بزاریم http://forum.soft98.ir/images/smilies/yahoo/4.gif نارنگی هم بزاریم ، تامسون و این جور چیزا که الان کسی طرفش نمیره . این قد گرونن http://forum.soft98.ir/images/smilies/yahoo/4.gif ینی توی اون جعبه هر چی که دوس داریم میتونیم بزاریم و چون هر چی که عشق مون کشید رو میتونیم تو اون جعبه بزاریم ، مثلا سیب ، پس محتوای و مقدار داخل جعبه ، دست خودمونه که تغییرش بدیم . واسه همین بهش میگن متغییر . اما تو یه جعبه ، انواع مقدارهای مختلف نمیشه گزاشت ینی نمیشه هم سیب گزاشت تو یه جعبه و هم پرتغال و ... . تو یه جعبه یا سیب باید باشه ، یا پرتغال و یا ... . میدونبار که تا حالا رفتین و دیدین دیگه http://forum.soft98.ir/images/smilies/yahoo/4.gif
یا مثلا لیوان میشه متغییر ما (سمت چپ مساوی) و چیزی که تو لیوان هست یا حالا آب هه یا شیر هه یا آب نباته http://forum.soft98.ir/images/smilies/yahoo/4.gif (سمت راست مساوی) میشه مقدار و محتوای متغییر ما
بعد هر کی از این به بعد این جعبه هه رو دست شما دید و گفت این چیه ، چی میگین؟ نمیگین جعبه هه که (خوب طرف کور که نیست میدونه این جعبه هه http://forum.soft98.ir/images/smilies/yahoo/4.gif) منظورش محتوای (یا همون مقدار) این جعبه هه که داخلش چیه؟ که مثلا شما میگین سیب هه ینی محتوای جعبه رو میگین (سمت راست مساوی) که در واقع همون قضیه ی فراخونی میشه

متغییر هم همین طوره. یه مقدار یا محتوا هست (که شیشصد بار گفتم سمت ... http://forum.soft98.ir/images/smilies/yahoo/4.gif) و یکی هم جعبه که همون متغییر ماست (سمت ...)
اگه یه متغییر هم فراخونی بشه ینی طرف سمت راست مساوی یه متغییر دیگه اسمش برده بشه یا تو ورودی یه دستور اسمش برده شه ، مثل قضیه ی همون پرسیدن محتوای جعبه هه رو میمونه که محتوا و مقدار متغییر برگردونده میشه
الان مثلا اگه بگیم :



var = 5



الان متغییر ما که اینجا سمت چپ مساویه اسمش var هست و (اسمش هر چی دلمون خاسته) مقدارش میشه سمت راستش ینی 5
این مقدار همون سیب و پرتغال بود که باید یکی توش باشه ینی از یه نوع مقدار باید باشه ینی مقدار ما باید با از نوع عددی باشه یا رشته ای که اینا ها تو فیلم گفته شد و اینجا از نوع عددیه که 5 هه اما اگه هر جا دیدین تو علامت دابل کوتیشن بود " " از نوع رشته ای میشه ینی الان اگه بود :




var = "5"


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



var = 5
Label.SetText("Label1", var);



تو خط دوم ، میگرده دنبال متغییر var ببینه تعریف شد یا نه اگه تعریف شده باشه ، تو شی لیبل ، مقدار متغییر var رو که 5 بود رو مینویسه. و چون قبل اش و تو خط بالاش ، متغییر var تعریف شد ، پس مقدارش رو مینویسه ینی تو شی لیبل نوشته میشه 5 (این خط دوم ، در واقع قضیه ی همون کسیه که گفت این جعبه هه چیه؟ http://forum.soft98.ir/images/smilies/yahoo/4.gif) دستور Lable.SetText که یه چیزی رو تو شی لیبل ذخیره میکنه چ.م ما گفتیم var رو ذخیره کن ، گفتش بهمون که var چیه؟ (منظورش مقدار var بود دیگه) که ما تو خط بالاترش گفتیم var همون 5 هه پس 5 رو نوشت

حالا اگه من بنویسم :




var = 5
unknown = var
Label.SetText("Label1",unknown );



چی میشه؟ ینی بلد نیستین؟ http://forum.soft98.ir/images/smilies/yahoo/4.gif هستینا
خوب گفتم سمت راست مساوی ها مقدار متغییره (سیب و .. http://forum.soft98.ir/images/smilies/yahoo/4.gif) و سمت چپ مساوی ها هم خود متغییر ان (جعبه) که سمت راست (مقدار و محتوای متغییر که همون سیب بود) تو سمت چپ (که خود متغییر بود ینی همون جعبه) انداخته میشه و ذخیره میشه پس الان تو خط اول مقدار عدد 5 تو متغییر سمت چپ مساوی که اسمش var بود ، ذخیره میشه پس از این به بعد در جاهای دیگه ، در سمت راست مساوی (نه سمت چپ مساوی ها) و یا ورودی دستورها و تابع ها (که تو فیلم گفته شد)، اسم متغییر var برده شه یا به اصلاح همون فراخونی شه، مقدارش بجاش گزاشته میشه یا همون مقدارش برگردونده میشه که در اینجا مقدارش 5 بود
پس تو خط دوم که unknown = var نوشته شد ، چون var تو سمت راست مساوی هست پس نرم افزار میبینه قبلا متغییر var تعریف شد یا نه و اگه تعریف شده باشه ، مقدارشو توی سمت چپ مساوی که unknown بود ذخیره میکنه و اگه تو خط های بالاتر یا رویدادهای دیگه ای که زودتر از این رویداد اجرا بشه ، متغییر var تعریف نشده باشه ، نرم افزار ارور میده و تو اینجا هم چون مقدار متغییر var برابر 5 هه پس 5 داخل متغییر unknown ذخیره میشه . ینی هر جا از این به بعد اسم unknown برده شد ، مقدارش که 5 هه برگردونده میشه
و تو خط سوم هم که متغییر unknown اسم برده شد که چاپ بشه پس ، مقدارش که 5 هه چاپ میشه .
خوب اینو گفتم که دیگه قاتی نکنین چی تو چی ریخته و ذخیره میشه . ینی الان متغییر unknown تو خط دوم تو متغییر var ذخیره نمیشه . چرا شو که توضیح دارم میدم تو کتاب بالا http://forum.soft98.ir/images/smilies/yahoo/4.gif پس تا این لحظه تو دستور بالا ، هر جا گفته شد var ، مقدارش که 5 هه برگردونده میشه و هر جا گفته شد unknown ، مقدارش که var که بازم مقدارش 5 هه برگردونده میشه
اما تو خط زیر قضیه فرق فوکوله http://forum.soft98.ir/images/smilies/yahoo/4.gif




var = 5
var = "ahmad"
Label.SetText("Label1",var );



تو خط اول بالا ، اول مقدار 5 تو متغییر var ذخیره میشه و بعد تو خط دوم ، مقدار رشته ی ahmad تو متغییر var ذخیره میشه.ینی الان مقدار var کدومه به نظر شما؟ http://forum.soft98.ir/images/smilies/yahoo/4.gif
آری درست گفتی (من که صدا تو نشنیدم . حالا بماند http://forum.soft98.ir/images/smilies/yahoo/4.gif) آخرین مقدار var که خط دوم بود و مقدارش برابر رشته ی ahmad بود تو var ذخیره میشه . ینی تو خط های زیری هر جا گفته شد var ، آخرین مقدارش که تو خط دوم بود برگردونده میشه که ahmad بود ینی متغییرها قابلیت اور رایت شدن رو دارن. ینی متغییری که همنام قبلی باشه ، مقدار اولیه که تعریف شد براش پاک میشه و از این به بعد دیگه مقدار جدید جایگزینش میشه که تعریف شد
و خط سوم هم که گفت var رو بنویسه که همون آخرین مقدار var که ahmad بود رو مینویسه

یا مثلا اگه بگم :




var = 5
var = var+5
Label.SetText("Label1",var );



تو خط اول که 5 رو تو var میریزه .
تو خط دوم ، طرف راست مساویرو توی طرف چپ مساوی میریزه دیگه . ها؟ خوب طرف راست مساوی چیه؟ var+5 هه دیگه . خوب تو خط های بالا گفتم دیگه میگرده دنبال مقدار var (اونی که طرف راست مساوی هستا) . مقدار var تو خط اول پیدا میکنه که 5 بود بعد +5 میکنه که میشه؟ 10 و این 10 رو تو متغییر سمت چپ مساوی که باز var بود ذخیره میکنه ینی الان تو خط دوم ، مقدار متغییر var میشه 10 (ینی باز هم مثل کد بالا ترش که گفتم ، این متغییر var ، اوررایت شد)
از این به بعد هر جا اسم var برده شه (فراخونی شه) ، که تو خط سوم شد ، آخرین مقدار var رو که 10 بود رو ذخیره میکنه

اینو گفتم تا قشنگ سمت راست و چپ تون رو (نه سمت راست و چپ متغییر( رو تشخیص بدین هر چند تو فیلم هم گفته شد) ، برا اسب قضیه که الگوریتم تکثیرهhttp://forum.soft98.ir/images/smilies/yahoo/4.gif بزارین من برم ناهار بخورم برگردم ، ادامه شو بنویسم )http://forum.soft98.ir/images/smilies/yahoo/4.gif


از این زیر تازه داستان تکثیر آرایه ، شرو میشه (اون بالایی رو گفتم واسه کسایی که قضیه ی متغییرها رو باهاش مشکل دارن و البته ضروریه واسه درک این الگوریتم زیر. هر چند الگوریتم معمولی ایه http://forum.soft98.ir/images/smilies/yahoo/4.gif) :


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




o={10,20,30,40}




function clone(o)
new_o = {}
i,v = next(o,nil)
while i do
new_o[i] = v
i, v = next(o, i)
end
return new_o
end




ListBox.DeleteItem("ListBox1", -1);
NewArrayCount = Table.Count(clone(o));
for a=1,NewArrayCount do
ListBox.AddItem("ListBox1", clone(o)[a], "");
end



تو خط اول ، یه آرایه ای بنام o (او انگلیسی) تعریف شد که 4 تا عضو داره که میبینین. عضو اولش 10 و دومش 20 و سومش 30 و ... هه

خط دوم هم یه تابع هست که پارامتر ورودیش (داخل پرانتزش) ، همین آرایه ی o مون هست که اسم تابع ، clone هه

تو خط سوم ، یه آرایه ی دیگه که اسمش new_o هه تعریف شد (که قراره عضوهای اون آرایه ی o رو تو new_o ریخته شه)

تو خط چهارم که با دستور next آشنایی دارین (پست قبل) ، که



i,v = next(o,nil)


هست ، nil که میشه هیچ و پوچ (شما مثلا nil رو صفر در نظر بگیرین که ینی صفر امین عضو از آرایه) .پس این دستور میشه آرایه ی بعد ضفر امین عضو آرایه ی o (که میشه همون مقدار اولین عضو آرایه ی o که 10 هست) و این مقدار رو تو متغییر سمت راست ویرگول که v هست ، ذخیره میکنه و شماره ی اون آرایه (ینی اولین عضو آرایه ی o (دقت کنین نه اینکه مقدار اولین عضو رو ) بلکه شماره ی اولین عضو رو که میشه همون 1 ) رو داخل متغییر سمت چپ ویرگول که i هست ، ذخیره میکنه که اینا رو قبلا تو پست قبلی گفتم. پس الان مقدار متغییر i میشه 1 و مقدار متغییر v میشه 10

در خط پنجم یه شرط while گزاشته شد و همونطور که تو پستای قبل گفتم ، چون i خالی اومد ، پس ینی هر وقت i مون برابر یه مقداری بود (هر مقدار حالا رشته یا عدد و ...) که در اینجا ، i مون فلا 1 هه پس مقدار داره پس دستور داخل while اجرا میشه

خط ششم که هستش



new_o[i] = v


، 6 طللیارد (درسته؟ http://forum.soft98.ir/images/smilies/yahoo/4.gif) بار گفتم که مقدار سمت راست تو متغییر سمت چپ ذخیره میشه پس مقدار v داخل i امین عضو از آرایه ی new_o ذخیره میشه. مقدار v چی بود؟ 10 بود دیگه. ها؟ ینی همون مقدار اولین عضو آرایه ی اولی مون که o بود.
خوب i مون الان چنده؟ 1 بود دیگه آخرین بار؟ ها؟ خوب پس میشه 10 رو تو اولین عضو آرایه ی new_o مون ذخیره میکنه. تا اینجا اگه دقت کرده باشین ، مقدار اولین مقدار آرایه ی قبلی (o) که 10 بود ، فلا همون برابر اولین مقدار آرایه ی جدید (new_o) شد. پس فلا ینی اولین مقدارش کپی شد.

تو خط هفتم که



i, v = next(o, i)



هستش ، میگه چی؟ میگه عضو بعدی i رو تو آرایه ی o رو بریز تو متغییر v و شماره شو بریز تو متغییر i
خوب i مون تا حالا چی بود؟ 1 بود دیگه؟ ها؟ عضو بعدیش عضو 1 چی میشه؟ میشه عضو 2 . خوب مقدار دومین عضو آرایه ی o رو که 20 بود رو میریزه تو v و شماره شو که 2 بود رو میریزه تو i
پس مقدار v میشه 20 و مقدار i میشه 2
حالا چرا عضو بعدی رو گرفت؟ چون هم عضو بعدی آرایه ی قدیمی (o) رو گرفته باشه http://forum.soft98.ir/images/smilies/yahoo/4.gif چون میخایم همه ی اعضاشو کپی کنیم دیگه و هم i هم یکی یکی جلو بره تا برسه به تعداد آرایه ی o که 4 تا بودن و بعد از اون ، بی مقدار بشه که شرط حلقه ی while (که مقدار دار http://forum.soft98.ir/images/smilies/yahoo/4.gif بودن متغییر i بود) نقض شه تا از این حلقه خارج شه . ینی در واقع تو اینجا ، i همون شمارنده هست که به اندازه ی تعداد آرایه ی o که 4 تا ان مقدار خواهد داشت ینی 4 بار دارای مقدار میشه و بعد از اون ، بی مقدار میشه

تو خط بعدی میرسه به end شرط while که چون حلقه هه ، شرطش بررسی میشه و اگه شرطش درس بود ، تکرار میشه. شرطش هم که این هست که آیا متغییر i مقدار داره یا نه؟ داره یا نه؟ http://forum.soft98.ir/images/smilies/yahoo/4.gif
آره دیگه آخرین بار مقدارش 2 شد دیگه . پس شرط برقراره و حلقه تکرار میشه

پس دوباره میرسیم به خط 6 و دوباره هم مقدار v رو داخل i امین عضو از آرایه ی new_o ذخیره میکنه. آخرین بار v بود 20 و i هم بود 2 پس 20 رو تو دومین عضو از آرایه ی new_o ذخیره میکنه
و این روند ادامه پیدا میکنه و حلقه تکرار میشه تا جایی که i برابر 4 بشه که همون برابر تعداد آرایه ی قدیمی مون که همون آرایه ی o بود ، بشه و در این زمان (ینی زمانی که i مون برابر 4 بشه) وقتی دستور خط هفتم ینی



i, v = next(o, i)


اجرا بشه ، چون مقدار عضو 4 ام آرایه ی o ینی پنجمین عضو آرایه ی o رو میخاد و چون آرایه ی o ، عضو پنجم نداره ، پس مقدارِ بی مقداری http://forum.soft98.ir/images/smilies/yahoo/4.gif تو i ذخیره میشه ینی i دیگه مقدار نداره چون پنجمین عضو o وجود نداره و چون i بی مقدار میشه پس شرط while نقض میشه و دیگه تکرار نمیشه و خط بعدی ینی خط 9 اجرا میشه
پس تا وقتی که شرط while برقرار بود ، وقتی تا آخر (ینی تا زمانی که i مون برابر 4 میشد) جلو برین با همینی که توضیح دادم ، میبینین که اولین عضو آرایه ی o توی اولین عضو آرایه ی new_o ریخته میشه ، دومین عضوش هم تو دومین عضو ، سومین عضوش هم تو سومین عضو و چهارمین عضوش هم تو چهارمین عضو
ینی کلا کپی شد اون آرایه ی قبلی مون که o بود

خط بعدی هم که میشه خط 9 ینی



return new_o


که همونطور که تو پست قبل گفتم ، ینی new_o که آرایه ی کپی شده و جدید مون بود رو تو تابع مون که اسمش



clone(o)


بود ذخیره کن ینی هر جا اسم تابع



clone(o)


برده و فراخونی شد ، ینی مقدارش که همون آرایه ی new_o هستش ، برگردونده میشه

در ادامه ی کدها ، چون برای فراخونی مقدار و عضو متغییر ها باید شماره ی عضواش رو مشخص کنیم ، از حلقه ی for استفاده شد که از 1 تا تعداد تابع clon(o) که همون گفتم آرایه ی new_o ماست پس همون تعداد آرایه ی new_o ما میشه ، که در اینجا تعدادش 4 هست ، تکرار میشه ینی تو اینجا حلقه ی for ما هم 4 بار تکرار میشه تا هر 4 تا عضو آرایه ی new_o رو بگیره و تو لیست بوکس بنویسه پس همه ی عضوهای این متغییر که 10 و 20 و 30 و 40 ان ، تو شی لیست بوکس نوشته میشن (این تیکه رو ینی حلقه ی for رو زیاد توضیح ندادم چون به اندازه ی کافی تو فیلم بحث و تمرین شد)

فقط تو این حلقه درباره ی خط 14 ام که



ListBox.AddItem("ListBox1", clone(o)[a], "");


هست بگم که وقتی گفته شد



clone(o)[a]


رو چاپ کن تو لیست بوکس و بنویس ، خوب a که متغییر ینی در واقع شمارنده ی این حلقه هه و هر بار (تا 4) تغییر میکنه و بازم همونطور که گفتم ، وقتی اسم تابع



clone(o)


برده شد ، ینی همون مقدار return ای که گفتیم ینی همون آرایه ی new_o . مثلا اگه a مون 1 باشه ، ینی اولین عضو از تابع



clone(o)


مون رو بنویس و این تابع هم چون گفتیم که همون آرایه ی new_o رو برگردون ، پس ینی در واقع ، گفتیم اولین عضو از آرایه ی new_o مون رو بنویس که کلا این تیکه گفتن نداشت چون یه لیست تو بالا توضیح داده شد http://forum.soft98.ir/images/smilies/yahoo/4.gif


میدونم الان همه تون هجوم میارین تا این آموزشو ببینین ، فقط یکی یکی تو صف ایس کنین که حق همدیگه ضایه نشه http://forum.soft98.ir/images/smilies/yahoo/4.gif
ان شاء ا... از هر 1000 نفرتون ، احیانا و خدای نکرده و زبونم لال http://forum.soft98.ir/images/smilies/yahoo/4.gif یه نفر به این آموزش علاقه مند بود و خوند و تمرین کرد ، متوجه شده باشه (الان بخونه ، 2000 سال دیگه احتمال داره تموم کنه . http://forum.soft98.ir/images/smilies/yahoo/4.gif)

sajjadkhati
11-26-2014, 11:23 AM
امنیت در AMS :

خوب اولا که امنیت رو بیشتر واسه فایلای دیتابیس به کار میبرن و دوما این پست قراره به امنیت فایلا و دیتابیس ای گفته شه که خودشون قابلیت رمز نگاری ندارن. مثل دیتابیس sql 3 (نه دیتابیس my sql که خود طرف همون موقع میتونه روش رمز بزاره و این قابلیت تو خود دیتابیس های my sql هست)

امنیت تو اینجا ،2 حالت و روش داره :

1) دسترسی فایل مورد نظر رو قطع کنیم که در این صورت تا دسترسی اش باز نشه ، نمیشه اطلاعات رو خوند یا روش نوشت و ذخیره کرد
2) با دستورات و توابع crypto ، روی فایل مورد نظر ، پسورد گزاشت که تو این روش ، روش ماهی آبی http://forum.soft98.ir/images/smilies/yahoo/4.gif یا همون BlueFish گفته میشه. در این روش برای کد گزاری و رمز نگاری ، باید فایل مبدا رو بدین و فایل مقصد رو که حاوی همون فایل با رمز هست (البته با پسوند دیگه ای هم هست که واسه همین ، نمیتونین همون لحظه ازش استفاده کنین) و برای استفاده ، باید مسیر فایل مقصد و رمزش رو بدین تا کد گشایی شه و تو یه جای دیگه این فایلی که بدون رمز و قابل استفاده هه رو ، ذخیره و استفاده کنین


روش اول :

با دستور



File.SetPermissions("C:\\MyFile.ext", SID_EVERYBODY, DENY_ACCESS, ALL_PERMISSIONS, SUB_CONTAINERS_AND_OBJECTS_INHERIT);



تو ورودی یا همون پارامتر اول کد بالا ، مسیر همراه پسوند فایل رو بدین . حواستون باشه تو AMS هر درایو یا پوشه ای که بهش میرسین ، باید با دو تا (نه یکی) علامت \\ از هم جدا شن
میتونین دسترسی به یه فایل رو مسدود کنین که نباید در این صورت ، وقتی که از اتوران دارین خارج میشین ، فایل های مورد نیازی که برا اجرای اولیه ی بعدی لازمه مثل فایل autoran.exe و یا فایلایی که تو پوشه ی autoplay و ... هست رو مسدود کنین وگرنه اتوران بالا نمیاد و هیش کاریش نمیشه کرد. همونطور که گفتم ، بیشتر کاربرد ، تو امنیت و مسدود کردن فایلای دیتابیس هه. یادتون باشه که با این روش ، نمیتونین کاری کنین که طرف فایل رو از ویندوزش حذف نکنه ها. فقط با این روش ، تا حدود زیادی خیالتون راحت میشه که افراد عادی و... نمیتونن دیتابیس رو ویرایش و اجرا کنن (چون امنیت که 100 در 100 نیست http://forum.soft98.ir/images/smilies/yahoo/4.gif)

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



File.SetPermissions("C:\\MyFile.ext", SID_EVERYBODY, SET_ACCESS, ALL_PERMISSIONS, SUB_CONTAINERS_AND_OBJECTS_INHERIT);



خوب معلومه دیگه ممولا کد باز کردن فایل دیتابیس رو تو رویداد on startup مینویسن تا موقع ورود به اتوران ، قابل استفاده بشه و کد مسدود سازی شو موقع خروج اتوران تا کسی چش چپ به دیتابیس نگا نکنه http://forum.soft98.ir/images/smilies/yahoo/4.gif



روش دوم :

استفاده از دستور همون ماهیه هست http://forum.soft98.ir/images/smilies/yahoo/4.gif (دیگه موند پلنگ و یوز پلنگ شکار کنیم http://forum.soft98.ir/images/smilies/yahoo/4.gif)
که برای پسورد گزاشتن از دستور



Crypto.BlowfishEncrypt("C:\\MyFolder\\MyFile.txt", "C:\\DestFolder\\MyFile.enc", "trustno1withthispassword");



استفاده میکنیم که تو ورودی اول ، مسیر همراه پسوند اون فایلی رو که میخایم رمز نگاری کنیم رو میدیم و تو ورودی دوم ، مسیر همین فایلی که رمز نگاری شدش ، حالا بگیم کجا ذخیره بشه رو (تو ورودی دوم ، پسوند فایل رو نباید عوض کرد و همش باید همین enc. باشه. فقط اسم و مسیر ذخیره شدن شو هر جایی که دوس داشتین ، بگین. نکته ی بعدی هم حواستون به مسیری که میدین باشه که گفتم باید بین هر درایو یا فایل یا پوشه ای که میزارین ، دو تا علامت \\ بزارین). تو ورودی سوم هم که پسورد رو تو علامت دابل کونیشن مینویسن . ینی الان پسورد این فایل تو اینجا میشه trustno1withthispassword (بی چاره اونی که بخاد این همه رو رمز گشایی کنه http://forum.soft98.ir/images/smilies/yahoo/4.gif)

حالا برا باز کردن اون فایلی که پسورد داره و رمز نگاری شد (منظورم همون فایل مقصدی هه که مسیر ذخیره سازیش رو تو ورودی و پارامتر دوم کد بالا دادین که با پسوند enc. ذخیره شد) از دستور




Crypto.BlowfishDecrypt("C:\\MyFolder\\MyFile.enc", "C:\\DestFolder\\MyFile.txt", "trustno1withthispassword");



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



File.Delete("C:\\MyDir\\MyFile.ext", false, false, false, nil);


فایلی رو که کد گشایی کردین و ممولا دیتابیس هست (که تو اینجا اسمش مثلا MyFile.txt بود) رو پاک کنین تا بهش چپ چپ نگا نکنن http://forum.soft98.ir/images/smilies/yahoo/4.gif

sajjadkhati
11-26-2014, 11:24 AM
نصب و استفاده و دانلود پلاگین های نرم افزار Autoplay Media Studio 8 (تو فیلم گفته نشد) :

اول درباره ی پلاگین ها تو AMS توضیح بدم یه کم ، بعد لینک دانلود شو براتون بزارم
کلا 3 (حالا یا 4 ، دقیقا نمیدونم:ch0m:) نوع پلاگین تو نرم افزار AMS داریم

اولی پلاگین اکشن (action plugin) هه که باعث میشه کدهای جدید به AMS اضافه شه و ملومه که اگه کد اضافه شه ، قابلیت نرم افزار بالاتر میره . پس یکی از مهم ترین پلاگین ها ، این نوع پلاگین ها هستن. این کدها ، به جمع کدهای دیگه میپیوندند (البته بعد از نصب و فعال کردن که میگم چجوری این کارو کنین) .
برای نصب این نوع پلاگین ها ، اول نرم افزار AMS رو ببندین و بعد آخرین پوشه ای که به اسم همون پلاگین هست رو تو اون جایی که نرم افزار رو نصب کردین ، داخل پوشه ای بنام Plugins>Actions ، کپی کنین . مثلا تو لینک زیر که میتونین دانلود کنین پلاگین رو ، اول پوشه ای بنام Plugin هست و بعد داخل پوشه ی action plugin ، پلاگین های مربوط به این قسمت هست . حالا اسم یکی از این پلاگین های اکشن ، هست tray (یه اکشن پلاگینی هه که کدها یا همون اکشن یا همون توابعی رو برای مدیریت بهتر آیکون تو system tray ایجاد میکنه مثلا میشه رو آیکون اش تو system tray ، کلیک راست کرد و یه گزینه هایی برا انتخاب بیاد). برای نصبش ، وقتی داخل خود پوشه ی tray برین ، یه فایل how to install و یه پوشه ی example و یه پوشه ی tray هست که منظور من این آخرین پوشه ی tray هست . (محتویات داخلش نه ها .) کل همین آخرین پوشه ی tray رو کپی کنین و داخل اون مسیری که نصب کردین AMS رو که بصورت پیش فرض ، C:\Program Files\AutoPlay Media Studio 8 Trial هست ، داخل اش تو پوشه ی Plugins و داخل اون ، تو پوشه ی Actions ، اون رو Paste کنین ینی بصورت پیش فرض ، پوشه ی tray ای که گفتم رو باید تو پوشه ی زیر ، کپی کنین :

C:\Program Files\AutoPlay Media Studio 8 Trial\Plugins\Actions

اگه دقت کرده باشین ، چون پلاگین ما از نوع action بود ، پس داخل پوشه ی action کپی شد (این تیکه همون بیشتر بدانید کتابا بود :ch0m:)
خوشال نشین زیاد . تا حالا فقط تونستین نصبش کنین. استفاده اش یه جور دیگه هه :ch0m:
برای استفاده از این اکشن پلاگین ها ، بعد از اجرای AMS ، از اون منوی بالا ، برین تو منوی Projects و گزینه ی یکی مونده آخری ینی Plugins
حالا لیست ای میاد که تو این لیست ، همه ی اکشن پلاگین هایی که نصب کردین ، تو این لیست میاد و هر کدوم رو که میخاین استفاده کنین ، تیک کنارشو بزنین . (یادتون باشه تو هر پروژه ی مختلف که باز میکنین ، باید این گزینه هایی رو که میخاین ، هر بار تیک شو اینجا بزنین)
بعد هم وقتی که میخاین برین تو قسمت action wizard ، ینی میخاین همون جایی برین که کدها رو بنویسین و انتخاب کنین ، میبینین که اَو :ch0m: ، اسم این پلاگین به همراه نوشته ی "Plugin" داخل پرانتز ، جلوش نوشته هه و حالا میتونین ازش استفاده کنین مثلا تو این مثال این جوری Tray (Plugin) نوشته میشه تو لیست اکشن ها




دومی هم پلاگین آبجکت یا شی (object plugin) هه که باعث میشه شی جدید اضافه بشه به AMS و به همراه اون ، کدها یا همون اکشن های مربوط به اون شی اضافه شه .
قضیه ی نصب این آبجکت پلاگین هم دقیقا مثل همون اکشن پلاگین هه با این تفاوت که اون پوشه ی مبدا (که درباره ی پوشه ی tray تو بالا توضیح داده بودم) رو بجای اینکه تو پوشه ی Actions کپی کنین ، تو پوشه ی Objects باید کپی کنین چون ملومه دیگه ، این از نوع آبجکن پلاگین هه . پس مسیر مقصدش بصورت پیش فرض میشه :

C:\Program Files\AutoPlay Media Studio 8 Trial\Plugins\Objects

برای استفاده از این پلاگین هم ، رو یه جای خالی تو صفه ، کلیک راست کنین و برین روی گزینه ی آخر ینی Plugins ، حالا تو اینجا ، لیست تمام آبجکت پلاگین ها رو میبینین که برای استفاده ی ازش ، باید انتخابش کنین و تو رویداد مخصوص خودش که داره و حتی میتونین از اکشن ها (کدها یا توابع) های مربوط به این پلاگین که تو قسمت action wizard میاد ، استفاده کنین



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

C:\Program Files\AutoPlay Media Studio 8 Trial\Plugins\Transitions

برای استفاده از این پلاگین ، باید روی صفه ی خالی پروژه ، کلیک راست و peroperties رو بزنین و از قسمت پایین صفه ای که باز شد ، ینی قسمت transition ، پلاگین مورد نظرتونو انتخاب کنین تا موقع ورود به صفه ، اون نوع انیمیشن اجرا بشه






حالا تو زیر ، براتون یه چن تا پلاگین آپلود کردم که بیشتراشون از مهم ترین پلاگین ها ینی action plugin ها هستن . میتونین از لینک زیر دانلود کنین :


http://www.8pic.ir/images/22023824255202312520.gif (http://s5.picofile.com/file/8108070568/Plug_in_AMS.rar.html)




پلاگین هایی که توشه :


1) AMS Utilities Setup 2.6
2) Winapi V22
3) Download 11
4) ZipExBundle
5) RecycleBin
6) TaskBarListActionsPlugin
7) Tray 1
8) skin

9) Progres---




حالا توضیحات به ترتیب :


1) درباره ی اولی ینی AMS Utilities Setup 2.6 که قبلا توضیح داده بودم و مجموعه ای از هر 3 نوع پلاگین هه و کلا پلاگین ارزشمندیه . ینی تک دونه ی یکی یه دونه هه :ch0m: از اکشن پلاگین های این قسمت هم میشه به HTTP که برای ادامه ی دانلود های قطع شده یا خراب شده هست و ... . اکشن پلاگین FTPS برای آپلود فایل و ... هه . اکشن پلاگین Math ، کدها و توابع مهم برای ریاضی هه مثلا برای محاسبه ی Nan و Nor و ... (علاوه بر توابعی که اکشن Math داره) و ... و همینطور انواع transition plugin مثل Metro و FadeIn و ...
این پلاگین ، بصورت ستاپ نصب کردنی هه . ینی کپی کردنی نیست . اما قضیه ی استفاده رو ، باید از طریقش همونطور که قبلا گفتم برین

2) یکی دیگه از تکدانه (آب میوه نه ها :ch0m:) ی دوردونه که بالای 100 تا اکشن پلاگین داره که مخلوطی از اکشن ها و کدهای مختلف ان
مثلا مهم ترین هاش میشه به اکشن هایی مثل کم و زیاد کردن وضوح (transparency) پنجره ی اتوران و حتی بقیه ی پنجره ها (WinApi.SetWindowTrans) و برای عکس گرفتن از پنجره ها (مثلا پنجره ی اتوران) WinApi.CaptureWindow و برای نشون دادن یا ندادن و یا مینیمایز کردن کل پنجره ها (مخصوص وقتی که میخاین صفه دسکتاپ فقط نمایش داده شه) و ایجاد انواع شکل های هندسی مثل بیضی و ... و مدیریت Rycycle bin و فعال و غیر فعال کردن موس و کیبرد برای بضی از پنجره ها و ایجاد نوار وضعیت (WinApi.CreateWindowEx) و خیلی از اکشن های دیگه

3) سومی هم اکشن پلاگینی برای دانلود همزمان چندین فایل با قابلیت مکث و ادامه هه (نمونه ی این اکشن هم تو پلاگین اولی هست اما از این اکشن استفاده کنین بهتره. ینی اون اصلا کار نمیکنه resume اش انگار اما این یکی کار میکنه ولی گاهی اوقات ممکنه ارور بده. پیشنهادم اینه که اول با کد و اکشن پیش فرضی که تو قسمت HTTP نرم افزار AMS هست (نه پلاگین HTTP اولی که گزاشتما) ، برای دانلود قدم پیش بزارین :ch0m: ، بعد اگه نصفه نیمه کاره طرف ول کرد ، با این پلاگین ، ادامه شو انجام بدین .)
نکته ی مهمی که درباره ی این پلاگین باید بگم اینه که در هر صورتی که طرف بخاد کنسل کنه یا اینکه وسط دانلود و یا حتی بعد از اینکه دانلود تموم شد ، از نرم افزار و اتوران خارج شه ، قبل از کد خروج ، حتما کد استوپ دانلود و حذف دانلود سیژن که هر دو کار را کد



result = Download.Delete(DownloadSesion);


انجام میده رو بزارین و بعد از این کد ، کد دلخواه خودتونو مثلا خروج از نرم افزار رو بزار وگرنه برنامه تون کرش میشه
دقت کنین که متغییر DownloadSesion تو کد بالا ، متغییر عددیه که برا کد Download.Start هست ینی کد یا تابع یا همون اکشن Download.Start ، عددی رو برمیگردونه اینجا که تو متغییرذخیره DownloadSesion ذخیره کردیم و این عدد رو برای استوپ دانلود و حذف دانلود سیژن ای که گفته بودم ، باید به کد Download.Delete داد (همونطور که تو بالا میبینین)

4) اکشن پلاگینیه برای اکسترکت و ساخت فایل های Rar (بدیش اینه که رایگان نیست و 14 روزه هه . اگه کسی سریال اینو پیدا کنه که خیلی ممنون میشم یا نسخه ی رایگانشو پیدا کنه)

5) اکشن پلاگین برای مدیریت Rycycle Bin

بقیه هم که چندان نیاز به توضیح نداره و از نوع اکشن پلاگین اند و توضیح آبجکت پلاگین Progres--- رو قبلا داده بودم تو پست صفه قبل




راستی میتونین از این سایت ، پلاگین های بیشتری رو دانلود کنین (http://www.amsplugins.com/)

sajjadkhati
11-26-2014, 11:24 AM
نکته ی دیگه :

اگه یه متغییری تعریف کرده باشین که هنوز اجرا نشده باشه یا کلا اصلا یه متغییر رو تعریف نکرده باشین ، مقدار nil رو برمیگردونه اون متغییر
مثلا اگه تو رویداد کلیک راست شی ای یه متغییر عددی ای بنام Count=5 تعریف کرده باشین و اگه رو اون شی هنوز کلیک راست نکرده باشین ، پس این متغییر تعریف نشد و اگه در این موقه تو رویداد کلیک چپ این شی ، این متغییر رو بخاین فراخونی کنین ، nil رو برمیگردونه که باید این جوری براش بنویسین :



if Count~=nil then
اینجا دستورات رو بنویسین
end


که ینی فقط مخالف nil یا همون مخالف پوچ بود ینی اگه فقط و فقط این متغییر Count اجرا شده بود (ینی اول کلیک راست کرده باشه طرف) ، این دستورات داخل که فارسی نوشته شد تو خط بالا اجرا بشن وگرنه اگه کلیک راست نشده بود (ینی اون متغییر تعریف نشده بود) ، این دستورات اجرا نشه

در کل منظورم اینه که nil فقط برای متغییرها یا بهتر بگم تابع ها و اکشن هایی که بصورت پیش فرض تو خود برنامه ی AMS هستن و موقه رخ دادن خطا اتفاق میافتن ، نیست بلکه واسه همه ی متغییر های تعریف نشده و یا همه ی متغییر های اجرا نشده هم هست

nil هم که میدونین به منی هیچ و پوچ هست (ینی هیچ چی متغییر تعریف نشد و یا این متغییر یا تابع یا آرایه ، پوچ هست و خطا اتفاق افتاد)

sajjadkhati
11-26-2014, 11:25 AM
یه نکته ی دیگه درباره ی تغییر (کد نویسی برای تغییر) رنگ :
اینه که چون رنگ ها هر کدوم شون یه عدد (کد) ای دارن پس متغییرشون از نوع عددی هه اما یه مشکل کوچیک اینه که از نوع اعداد شونزده دهی (هگزا دسیمال) ان که برای استفاده اش باید اول اون عدد رو که حتی میتونین از عدد رنگ تو همین انجمن (نوشته ی زیر رنگی که انتخاب میکنین و با علامت # شروع میشه) یا تو همون AMS این عدد ها رو به عدد دهدهی تبدیل کنین ، و بعد استفاده کنین وگرنه جواب نمیده

مثلا عدد هگزا دسیمال رنگ سفید ffffff# هست که باید اول به عدد دهدهی تبدیل اش کنین که میشه 16777215
بدشم که خودتون اوستایین و با کد و آرایه ی مخصوص خودش که تو فیلم کاملا توضیح داده شد ، اجرا و تغییر رنگ میدین . ینی مثلا اگه بخین برا یه شی Label1 برا حالت نرمال اش تعریف کنین :



Label.SetProperties("Label1", {ColorNormal=16777215});


یا مثلا عدد رنگ سیاه هست 000000# که تو عدد دهدهی اش هم میشه 0

sajjadkhati
11-26-2014, 11:25 AM
تبدیل عدد هگرادسیمال (شانزده دهی) به دسیمال (دهدهی) :

من هی عذاب وجدان میگیریما. بزارین اون تبدیل عدد شونزه دهی رم بگم :ch0m:
کلاس اول ابتدایی ، یکان ، دهگان ، صدگان خوندینو بلدین هَندا (هنوز)؟ :ch0m: این هم عدل همونه
مثلا 251 رو به یکان و دهگان و صدگان بخایم تبدیل کنیم ، چی میشه؟
میشه یکی ، یکان (یکی ، یک تایی) و 5 تا دهگان و 2 تا صدگان که 2 تا بسته ی صدتایی که میشه 200 تا رو با 5 تا بسته ی دهگان که میشه 50 تا رو با یکی یکان جمع میکردیم و میشد 251
ینی شد :

(1*1)+(10*5)+(100*2)

تا اینجا حالی بَیِّه؟ (ینی متوجه شدین؟) :ch0m: خا بریم ادامه
خا حالا اینو بصورت ریاضی بگین . خوب 2 و 5 و 1 که تو معادله ی بالا سرجاشون هست ان . با اینا که کاری نداریم . منظور من 100 و 10 و 1 معادله ی بالاست. خوب معلومه که عددهای ممولی (نقی نیستا :ch0m:) ما در مبنای 10 ان پس این 3 تا عدد 100 و 10 و 1 رو یه جوری باید بگین که وقتی عدد 10 رو صربدر خودش میکنیم ، این اعداد بدست بیاد .
ینی 10 ضربدر چه عددی میشه 100؟ ملومه دیگه :ch0m: 10
ینی 100=10*10
ینی 10 به توان 2 میشه 100 پس جوابش میشه 10 به توان 2
حالا 10 را ضربدر چه عددی کنیم ، میشه 10؟ منظورم اینه که توان 10 چند باشه که خودش بشه؟ ملومه دیگه 1
بدش 10 به توان چند میشه 1؟ بازم ملومه ، 0
پس میشه :

(1*10 به توان 0)+(5*10 به توان 1)+(2*10 به توان 2)

خوب ، تا اینجا رم که متوجه شدین؟ (حالا نمیدونم اینجا چجوری توان رو بالای عدد مثل تو ریاضی بنویسم ، این جوری بصورت فارسی نوشتما :ch0m:)
حالا تو محاسبات ، 4 ساعت نمیتونین جذر 100 رو بگیرین که یادتون بیاد میشه 10 به توان 2 که :ch0m: میخاین جین فنگی حساب کنین ، چی کار میکنین؟
میدونین دیگه ، اصل اون توان هه هست که مهمه و اگه بدونین به توان چن میشه ، دو سوته تو ماشین حساب میزنین و بدیت میارین
10 که مبنای ما بود و باهاش کاری نداریم . هیچ چی . توانو چجوری سریع بدست بیاریم؟
عدد ما بود 251 درسته؟
همیشه توان مبنای 10 ، اولین عدد از سمت چپ (در اینجا عدد 1) میشه 0 و توان دومین عدد از سمت چپ (در اینجا عدد 5) میشه 2 و توان سومینعدد از سمت چپ (در اینجا عدد 2) میشه 2 و ... ینی توان n امین عدد از سمت چپ ، میشه n-1
ینی اینکه الان 251 ، 3 تا دونه عدد نیست؟
عدد 2 (صدگان) ، چندمین عدد از سمت چپ هه؟ 3 امین عدد دیگه ، پس یکی کم کنین ، میشه 2 خوب؟ پس توان عدد 2 (صدگان) عدد 251 میشه 10 به توان 2
عدد 5 (دهگان) ، چندمین عدده؟ دومین دیگه؟ ها؟ یکی کم کنین میشه 1 . پس توان عدد 5 (دهگان) ما میشه 10 به توان 1
آخری هم که توان 10 اش یکی کم کنین میشه 0
پس بازم رسیدیم به همون بالایی (ضرب و جمع رو گفتم دیگه مثل بالایی هه)

خسته کیه؟ :ch0m:
تکبیر :ch0m:

اسب نرم افزار Matlab :ch0m: :
حالا این مفعوم اعداد دهدهی بود . بریم سوراخ (چی سراغ) :ch0m: شونصد دهی :ch0m:
اول بزارین اینو بگم . همنطور که میدونین که نمیدونین :ch0m: ولی میدونین :ch0m: چرا اعداد تو کامپیوتر 0 و 1 ان؟ ینی به اعداد 0 و 1 چی میگن؟ میگن دودویی یا همون دو بیتی (غزل نیستا. بِیت نخونین :ch0m:) . نه اینکه دو تا عدد باشه بهش بگن دو بیتی ها . مثلا دهدهی به چه اعدادی میگن؟ از عدد 0 تا 9 درسته؟ پس مثلا هر وقت شنیدین دهدهی ینی عدد هه از 0 شرو میشه تا یکی کمتر از 10 که میشه 9
یا مثلا تو همین دودویی ینی از 0 تا یکی کمتر از 2 که همون میشه 1
یا شونزده دهی هم ینی از 0 تا یکی کمتر از 16 ینی 15
قضیه ی اعداد هم همه ایجوریه
اما ما عدد بزرگتر از 9 نداریم (منظورم تو اعداد و تنوع اعداد هست که از 9 بزرگتر نداریم و بقیه مخلوطی از 0 تا 9 ان) . مثلا ما که میگیم 10 ، ده نیست . مخلوطی از 1 و 0 هه
برا اعداد شونزده دهی هم همینجوره چون بزرگتر از 9 وجود نداره ، مجبور شدن ، بجای عدد 10 تا 15 ، حروف الفبا را به ترتیب بزارن تا به 15 برسه (گفتم دیگه عدد شونزده دهی ینی از 0 تا 15)
اونا این حروف ها ان و هر جا حروف شون رو دیدین ، عدد بجاش بزارین :

10 --> a
11 --> b
12 --> c
13 --> d
14 --> e
15 --> f

خوب حالا باید اتوماتیک طبق چیزایی که تو بالا گفته شد ، تبدیل رو بلد باشین دیگه؟ ها؟

مثلا عدد شونزده دهی 00FD2C رو میخایم به دهدهی تبدیل کنیم :
چون شونزده دهی هست عدد مبدا ما (عددی که میخایم تبدیل کنیم ، ) پس 16 رو مینویسیم ینی پایه ی ما 16 هه و توانش مهمه
توانش هم اولین عدد از سمت چپ که C باشه 0 میشه. خود C هم که میشد عدد 12 پس تا اینجا میشه 12*16 به توان 0
توان دومین عدد از سمت چپ که 2 باشه ، میشه 1 که میشه 2*16 به توان 1
توان سومین عدد از سمت چپ که D باشه میشه 2 . خود D هم که میشه 13 پس میشه 13*16 به توان 2
توان چهارمین عدد از سمت چپ که F باشه میشه 3 و خود F هم که میشه 15 پس میشه 15*16 به توان 3
اون صفرهای سمت چپ هم مثل عددهای ممولی (مثلا 00100 که میشه همون 100) هم که حساب نمیشه
پس کلا میشن :

(12*16 به توان صفر)+(2*16 به توان 1)+(13*16 به توان 2)+(15 *16 به توان 3)

که با یه حساب سر انگشتی (ماشین حسابی :ch0m:) میشه :

64812 = 61440+3328+32+12

باز چیز دیگه ای هست که میخاین یاد بگیرین ، بگین ، تارف نکنینا :ch0m:

sajjadkhati
11-26-2014, 11:26 AM
یه نکته ی کوچولوی دیگه درباره ی رنگ ها :

خسته که نشدین؟ ها ؟ :ch0m:
الان زنگ تفری رو میزنم :ch0m: 2 دیقه بصبرین :ch0m:
اینو که الان دونستین که رنگ ها بصورت عدد شماره گزاری میشن و چجوری تبدیل اش کنین؟ و از 0 شرو میشن تا 16777215
حالا اینکه یه قضیه ی دیگه اینکه هر رنگ (منظورم پر رنگ اون رنگه ها :ch0m:) ینی مثلا اگه آبی منظورتونه ، آبی پر رنگ رو میگم ، تا بخاد کم رنگ بشه ، 255 بار تغییر میکنه
مثلا یکی از اعداد آبی پر رنگ 16711935 هه . از این عدد تا 255 تا اگه بالاتر برین ، میبینین که آروم آروم رنگ آبی پر رنگ داره به بنفش تبدیل میشه ینی از عدد 16711935 که واسه آبی پر رنگ هست تا 16712191 که بنفش هست (که اختلافشون 255 تاست) ، آروم آروم آبی پر رنگ به بنفش تبدیل میشه اما وقتی همین عدد یه دونه بالاتر بره و بشه 16712192 ، یهو رنگ یه دفه عوض میشه

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


اینو تو رویداد On Show بزارین :



CT = 16711935
Paragraph.SetProperties("Paragraph1", {ColorNormal= CT});
Page.StartTimer(100, 1);


اینو تو رویداد On Timer :



if e_ID == 1 then
CT = CT + 1
Paragraph.SetProperties("Paragraph1", {ColorNormal= CT});
Label.SetText("Label1", CT);
end




یه شی Label1 و Paragraph1 هم بزارین تو همون صفه

sajjadkhati
11-26-2014, 11:27 AM
بازم یه نکته ی دیگه :

جدنی خسته شدین؟ :ch0m:
تو رو خدا؟ :ch0m:
پس اندکی بتحملین :ch0m:
تنا کلاسیه که شاگرد نداره :ch0m:
شوخی بسه ، جدی دارم میگما . خوب گوش کنین وقت کلاس گرفته شد :hoora: :ch0m:

خوب اساتیدای بالام جان ، این AMS هم گاهی هول برش میداره ، اندکی قات میزنه موقه تغییر رنگ حتی اگه تبدیل اعداد هگزا دسیمال رو به دسیمال هم درست انجام بدین (البته گاهی و بهتر بگم بیشتر اوقات)
برا اینکه عدد رنگ رو درست بدست بیارین تو AMS اول یه رنگ (مثلا رنگ آبی پر رنگ) رو تو یه شی (تو اینجا مثلا بنام Paragraph1) تنظیم کنین و از تابع زیر استفاده کنین (که البته آموزش نحوه ی استفاده ی کامل این تابع ها و اینکه آرایه ای رو که برمیگردونه چجوریه استفاده اش تو فیلم گفته شد) :



ColorText = Paragraph.GetProperties("Paragraph1");
Dialog.Message("Notice", ColorText.ColorNormal, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);

sajjadkhati
11-26-2014, 11:27 AM
اینم شماره ی رنگ ها از زرد تا صورتی (فقط قرمز توشون نیست) که به ترتیب زرد و سبز و آبی و صورتی میشه. اگه بقیه ی رنگا رو میخاین میتونین از روش پست بالا که گفته شد عدداش بگیرین :



NowPlayingColor = {}
NowPlayingColor[1] = 64510
NowPlayingColor[2] = 65275
NowPlayingColor[3] = 65269
NowPlayingColor[4] = 65263
NowPlayingColor[5] = 65257
NowPlayingColor[6] = 65251
NowPlayingColor[7] = 65245
NowPlayingColor[8] = 65239
NowPlayingColor[9] = 65233
NowPlayingColor[10] = 65227
NowPlayingColor[11] = 65221
NowPlayingColor[12] = 65215
NowPlayingColor[13] = 65209
NowPlayingColor[14] = 65203
NowPlayingColor[15] = 65197
NowPlayingColor[16] = 65191
NowPlayingColor[17] = 65185
NowPlayingColor[18] = 65179
NowPlayingColor[19] = 65173
NowPlayingColor[20] = 65167
NowPlayingColor[21] = 65161
NowPlayingColor[22] = 65155
NowPlayingColor[23] = 65149
NowPlayingColor[24] = 65143
NowPlayingColor[25] = 65137
NowPlayingColor[26] = 65131
NowPlayingColor[27] = 65125
NowPlayingColor[28] = 65119
NowPlayingColor[29] = 65113
NowPlayingColor[30] = 65107
NowPlayingColor[31] = 65101
NowPlayingColor[32] = 65095
NowPlayingColor[33] = 65089
NowPlayingColor[34] = 65083
NowPlayingColor[35] = 65077
NowPlayingColor[36] = 65071
NowPlayingColor[37] = 65065
NowPlayingColor[38] = 65059
NowPlayingColor[39] = 65053
NowPlayingColor[40] = 65047
NowPlayingColor[41] = 65041
NowPlayingColor[42] = 65035
NowPlayingColor[43] = 65029
NowPlayingColor[44] = 65024
NowPlayingColor[45] = 785920
NowPlayingColor[46] = 1179136
NowPlayingColor[47] = 1572352
NowPlayingColor[48] = 1965568
NowPlayingColor[49] = 2358784
NowPlayingColor[50] = 2752000
NowPlayingColor[51] = 3145216
NowPlayingColor[52] = 3538432
NowPlayingColor[53] = 3931648
NowPlayingColor[54] = 4324864
NowPlayingColor[55] = 4718080
NowPlayingColor[56] = 5111296
NowPlayingColor[57] = 5504512
NowPlayingColor[58] = 5897728
NowPlayingColor[59] = 6290944
NowPlayingColor[60] = 6684160
NowPlayingColor[61] = 7077376
NowPlayingColor[62] = 7470592
NowPlayingColor[63] = 7863808
NowPlayingColor[64] = 8257024
NowPlayingColor[65] = 8650240
NowPlayingColor[66] = 9043456
NowPlayingColor[67] = 9436672
NowPlayingColor[68] = 9829888
NowPlayingColor[69] = 10223104
NowPlayingColor[70] = 10616320
NowPlayingColor[71] = 11009536
NowPlayingColor[72] = 11402752
NowPlayingColor[73] = 11795968
NowPlayingColor[74] = 12189184
NowPlayingColor[75] = 12582400
NowPlayingColor[76] = 12975616
NowPlayingColor[77] = 13368832
NowPlayingColor[78] = 13762048
NowPlayingColor[79] = 14155264
NowPlayingColor[80] = 14548480
NowPlayingColor[81] = 14941696
NowPlayingColor[82] = 15334912
NowPlayingColor[83] = 15728128
NowPlayingColor[84] = 16121344
NowPlayingColor[85] = 16514560
NowPlayingColor[86] = 16710400
NowPlayingColor[87] = 16708864
NowPlayingColor[88] = 16707328
NowPlayingColor[89] = 16705792
NowPlayingColor[90] = 16704256
NowPlayingColor[91] = 16702720
NowPlayingColor[92] = 16701184
NowPlayingColor[93] = 16699648
NowPlayingColor[94] = 16698112
NowPlayingColor[95] = 16696576
NowPlayingColor[96] = 16695040
NowPlayingColor[97] = 16693504
NowPlayingColor[98] = 16691968
NowPlayingColor[99] = 16690432
NowPlayingColor[100] = 16688896
NowPlayingColor[101] = 16687360
NowPlayingColor[102] = 16685824
NowPlayingColor[103] = 16684288
NowPlayingColor[104] = 16682752
NowPlayingColor[105] = 16681216
NowPlayingColor[106] = 16679680
NowPlayingColor[107] = 16678144
NowPlayingColor[108] = 16676608
NowPlayingColor[109] = 16675072
NowPlayingColor[110] = 16673536
NowPlayingColor[111] = 16672000
NowPlayingColor[112] = 16670464
NowPlayingColor[113] = 16668928
NowPlayingColor[114] = 16667392
NowPlayingColor[115] = 16665856
NowPlayingColor[116] = 16664320
NowPlayingColor[117] = 16662784
NowPlayingColor[118] = 16661248
NowPlayingColor[119] = 16659712
NowPlayingColor[120] = 16658176
NowPlayingColor[121] = 16656640
NowPlayingColor[122] = 16655104
NowPlayingColor[123] = 16653568
NowPlayingColor[124] = 16652032
NowPlayingColor[125] = 16650496
NowPlayingColor[126] = 16648960
NowPlayingColor[127] = 16647424
NowPlayingColor[128] = 16646144
NowPlayingColor[129] = 16646149
NowPlayingColor[130] = 16646155
NowPlayingColor[131] = 16646161
NowPlayingColor[132] = 16646167
NowPlayingColor[133] = 16646173
NowPlayingColor[134] = 16646179
NowPlayingColor[135] = 16646185
NowPlayingColor[136] = 16646191
NowPlayingColor[137] = 16646197
NowPlayingColor[138] = 16646203
NowPlayingColor[139] = 16646209
NowPlayingColor[140] = 16646215
NowPlayingColor[141] = 16646221
NowPlayingColor[142] = 16646227
NowPlayingColor[143] = 16646233
NowPlayingColor[144] = 16646239
NowPlayingColor[145] = 16646245
NowPlayingColor[146] = 16646251
NowPlayingColor[147] = 16646257
NowPlayingColor[148] = 16646263
NowPlayingColor[149] = 16646269
NowPlayingColor[150] = 16646275
NowPlayingColor[151] = 16646281
NowPlayingColor[152] = 16646287
NowPlayingColor[153] = 16646293
NowPlayingColor[154] = 16646299
NowPlayingColor[155] = 16646323
NowPlayingColor[156] = 16646305
NowPlayingColor[157] = 16646311
NowPlayingColor[158] = 16646317
NowPlayingColor[159] = 16646323
NowPlayingColor[160] = 16646329
NowPlayingColor[161] = 16646335
NowPlayingColor[162] = 16646341
NowPlayingColor[163] = 16646347
NowPlayingColor[164] = 16646353
NowPlayingColor[165] = 16646359
NowPlayingColor[166] = 16646365
NowPlayingColor[167] = 16646371
NowPlayingColor[168] = 16646377
NowPlayingColor[169] = 16646383
NowPlayingColor[170] = 16646389
NowPlayingColor[171] = 16646395
NowPlayingColor[172] = 16056574

sajjadkhati
11-26-2014, 11:27 AM
درست کردن (کد نویسی) دیالوگ دستی با پنجره ی DialogEX :

خوب اساتیدا ، از اونجایی که شما فیلمو دیدین ینی ندیدین :ch0m: ، و جواب سئوال بالای منو هم دادین ینی ندادین :ch0m: و منم خیلی ازتون تشکر میکنم ینی بازم میکنم :ch0m:پس بزارین این قضیه هم بگم
تو فیلم دیدین دیگه ، تو AMS هر جا نامی از دیالوگ برده میشه ینی یه صفه ای که حالا یا پیام داره فقط یا با گزینه هایی که انتخاب میکنین ، میتونین کار خاصی انجام بده مثلا گزینه ی yes یا no داشته باشه یه دیالوگ
تا اینجا دید یو آندرستود؟ :ch0m:
خا ، حالا دو نوع دیالوگ داریم تو AMS . یکی پنجره ای هستش که فقط اسمش Dialog هه (البته بازم من منظورم بیشتر کد Dialog.Message هه) که این نوع پنجره ، از پیش تعریف شده هه و چن گزینه ی قابل تغییر بیشتر نداره (Abort و Cancell و Yes و No و ...) اما نپجره ی دیگه ای هست بنام DialogEX هه که میتونین مثل صفه ی اتوران ، حتی گرافیکی کار کنین اینترفیس اش رو و هر جور که خودتون خاستین
اینا رو ول کنین ، بریم سر خاستگاری چی همون اسب Matlab :ch0m: (این قد ممدرضا گفت که ما رو به بی راهه کشوند :ch0m:)
مهم کد نویسی شونه و اینکه چه متغییر که اینجا عدده رو برگردونه
تو کد نویسی Dialog.Message که تو فیلم توضیح داده شد و اینکه دکمه ی Yes چه عددی رو برمیگردونه وبقیه ی کد ها ...
تو کد نویسی برای صفه ی DialogEX ، مثلا 3 تا شی (تصویر یا آیکون یا حتی نوشته) میزارین که اگه طرف آیکون اولی رو انتخاب کرد ، مثل مثال Dialog.Message ، یه عدد رو برگردونه و اگه آیکون دومی رو انتخابید ، یه عدد دیگه و ...

یادتون باشه اولین و تنها استثنایی که تو برگردوندن یا همون ذخیره کردن متغییر ها هست ، تو همین قضیه ی DialogEX هه . این جوری که وقتی تو صفحه ی اصلی پروژه (صفه ی DialogEX منظورم نیست) ، با کد DialogEX.Show ، اون صفه ی دیالوگ (منظورم DialogEX هه) رو نمایش بدین ، وقتی موقه بستن همین صفه ، با کد DialogEX.Close ، تو اون پارامتر یا همون ورودی اول همین کد ، هر عددی رو که بنویسین (انتخاب این عدد ، دلخواهی هه) ، این محتوای متغییر (که از نوع عدد) هست ، توی اون متغییری که باهاش این صفه ی DialogEX نمایش داده شد ، ذخیره میشه
من که میدونم متوجه نشدین :ch0m:
بزارین مثال بزنم :
مثلا تو پروژه ی اصلی تو یه رویدادی ، آیکونی ، چیزی مینویسین :



Message = DialogEx.Show("Dialog1", true, nil, nil);


اینو که میدونین ، باعث میشه که صفه ی DialogEX که طراحی کرده بودیم خودمون رو نمایش بده و متغییر اش هم که اسم شو گرفتیم Message
هر عددی هم موقه خروج تو کد DialogEX.Close که بعدا مینویسیم ، تو این متغییر اش ینی متغییر Message ذخیره میشه
3 تا گزینه یا آیکون تو این صفه ی دیالوگ طراحی کردیم که هر کدوم شون با کد DialogEX.Close ، اون کدی رو که تو پارامتر اول این کد مینویسیم ، برمیگردونه تو متغییر Message
پس باید تو هر 3 تا آیکون کد DialogEX.Close رو بنویسیم
چون عدد پارامترش دلخواهی هه ، اولی رو 1 و دومی رو 2 و سومی رو 3 میگیریم
پس تو آیکون اول مینویسیم :



Close = DialogEx.Close(1);


عدد 1 پارامتر اول این کد رو که توضیح دادم
الان این عدد 1 رو اگه کسی با AMS آشنایی داشته باشه یه خورده ، انتظار داره که تو متغییر خود همین کد DialogEx.Close که اسم این متغییر رو Close گرفتیم ، ذخیره شه
اما گفتم که استثنا داره :ch0m:
این عدد 1 ، تو اون متغییری ذخیره میشه که باعث باز شدن این صفه ی دیالوگ شده بود ینی تو متغییر کد DialogEx.Show که تو اینجا اسمشو Message گرفته بودیم
پس از این به بعد با انتخاب اولین آیکون این صفه ی دیالوگ ، این صفه بسته میشه و عدد 1 (عددی که تو اولین پارامتر کد DialogEx.Close) نوشته بودیم ، تو متغییر Message (متغییر اون کدی که باعث باز شدن اون صفه ی دیالوگ شد) ذخیره میشه
حالا همین کار را برا آیکون دوم صفه ی دیالوگ میکنیم . که قبلا توضیح داده بودم ینی مینویسم :



Close = DialogEx.Close(2);


و همینطور واسه آیکون سوم

حالا برا کد نویسی اصلیش که دیگه اوستایین و از این مثالای پیش دست و پا شکسته و افتاده :ch0m: رو 6000 بار کار کردیم دیگه؟ ها؟
تو ادامه ی کد همونجایی که کد باز شدن صفه ی دیالوگ (DialogEx.Show) رو نوشته بودین ، میگین که اگه این متغییر Message ، 1 بود (ینی اگه گزینه یا آیکون اول تو صفه ی دیالوگ کلیک یا انتخاب شد) ، فلان کار رو کنه و اگه برابر 2 بود ، فلان کار رو کنه و ... ینی تو ادامه :



if Message~=-1 then
if Message==1 then
Dastorat ro inja benevisin
elseif Message==2 then
Dastorat ro inja benevisin
elseif Message==3 then
Dastorat ro inja benevisin
end
end



تو خط اول گفته شد مخالف -1 هر وقت بود این کد ها اجرا شن چون اگه موقه بستن دیالوگ (کد DialogEX.Close) ، اروری اتفاق بیفته ، تو متغییر کد نمایش دیالوگ که تو اینجا Message بود ، -1 (منفی یک) برگردونده میشه
از اونجایی که شما مثل من فراموش کارین :ch0m: ، اگه صفه ی DialogEX ، بصورت استانداردباشه و کاربر قابلیت اینو داشته باشه که از بالا ، گزینه ی ضربدر رو انتخاب کنه و از این طریق ببنده ، در این صورت ، تو همون متغییر صفه ای که دیالوگ رو نمایش میده (در اینجا متغییر Message) عدد مربوط به دکمه ی کنسل که همیشه یا اغلب اوقات عدد 2 هست ، برگردونده میشه پس یادتون باشه که اگه صفه ی دیالوگ بصورت استاندارد هست ، موقه انتخاب عد تو پارامتر اول کد DialogEx.Close ، عدد 2 رو انتخاب نکنین که با این کد کنسل قاتی شه و ندونین قضیه از کجاهه (عدد منفی هم یه وقت نزارین . حالا گفتیم که دلخاهی هه :ch0m:)
دید یو آندرستند بالام جان های گل مهندسین؟

sajjadkhati
11-26-2014, 11:28 AM
حذف آرایه :
اساتیدها ، یادتون باشه که اگه یه آرایه ای از قبل اعضاش مشخص شده باشه ، و بدش بیاین همون آرایه رو فقط تعریف کنین (اعضاش رو نه ها) ، کل اعضای اون آرایه پاک میشن و برابر nil میشن
مثلا اگه از قبل این آرایه رو با اعضاش توی رویداد On Preload یه صفه تعریف کرده باشم :




Array = {}
Array[1] = 53
Array[2] = 48
Array[3] = 9




خوب این که ملومه مثلا تو رویداد On Click یه شی بنویسم :




Dialog.Message("Notice", Array[1], MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);




مقدار اولین عضوش که 53 بود رو چاپ میکنه
و اگه حالا تو رویداد On Leave اون شی فقط این آرایه رو تعریف کنم (اعضاش رو نه ها) ینی فقط تو این رویداد بنویسم :




Array = {}



حالا تاوم عضوهای آرایه پاک میشن و یه آرایه ی خالی جایگزین میشه و حالا اگه دوباره روش کلیک کنین ، یه پیام میده که اولین عضوش خالی هه (ملومه که اگه تو رویداد On Leave ، عضوهاشو مشخص کنیم ، این عضوهای جدید تعریف میشن دیگه و عضوهای قبلی همونطور که گفته شد ، هر چن تایی که بودن ، حذف میشن)

sajjadkhati
11-26-2014, 11:29 AM
نحوه ی کد و الگوریتم جدید دادن به یک رویداد (رویداد اشیاء) :
ینی چی؟ ینی اینکه مثلا شی ای وجود نداشته باشه و شما اون شی رو بوجود بیارین و بعد برا رویدادهای مختلف اون شی (مثلا کلیک چپ و ...) اش کد بنویسین و یا حتی برا پاک کردن و تعویض کد نوشته شده داخل هر رویداد یا شی دیگه ای کد بنویسین که البته این کد نوشتن ، تو هر رویداد و یا اشیاء دیگه ی داخل اون صفه میتونه اتفاق بیفته و بنویسین .
اول موارد ابتدایی شو بگم که همه تون بلدین




Page.CreateObject(OBJECT_BUTTON, "NewObject", {ButtonFile="button\\button 3.btn",Text="ABC",X=0,Y=0});



این کد برای ایجاد یه شی تو صفه هست




Page.SetObjectScript("NewObject", "On Click", "");



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



و اما اصل مطلب که نحوه ی قرار دادن و نوشتن الگوریتم جدید برا یه شی و یا رویداد جدید هست :

البته با تابع بالا فقط میشه کد و الگوریتم جدید رو برای رویدادهای یه شی جدید ست کرد نه برای رویدادهای اصلی مثل On Preload و ... . برای اینکار باید تابع زیر کار کرد و چون نحوه ی استفاده شون عین هم هست ، فقط تابع بالا رو میگم




Application.SetPageScript("Page1", "On Show", "");




کار خیلی خاصی نداره . اول بزارین با یه مثال همینطور توضیح بدم . تو تابع زیر




ABC = "Dialog.Message(\"Notice\", \"Salam\", MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);"
Page.CreateObject(OBJECT_BUTTON, "NewObject", {ButtonFile="button\\button 3.btn",Text="ABC",X=0,Y=0});
Page.SetObjectScript("NewObject", "On Click", ABC);





اول خط 2 و 3 رو میگم و بعد خط اول . تو خط دوم ، تو پارامتر اول اش ، نوع شی ای که میخاین ایجاد کنین رو مشخص میکنین (مثلا شی تون از نوع دکمه یا Button هست یا از نوع تصویر یا Image و یا هر چیز دیگه ای ...) و تو پارامتر دوم ، اسم شی ای که میخاین ایجاد کنین رو میدین و تو خط سوم هم که خصوصیاتش رو (مثلا شکل شی تون از کجا لود شه و اندازه و X و Y و فونت و ... اش چی باشه که تو فیلم هم توضیح داده شد و تو راهنماشم هست)
تو خط سوم ، پارامتر اولش ، باید اسم اون شی ای رو که میخایم کد جدید بهش بدیم ، رو مینویسیم (چون میخایم به شی ای که جدید ساختیم کد اضافه کنیم و اسمشم NewObject گزاشته بودیم تو تابع قبل ، پس اینجا هم همون اسمشو میزاریم) و تو پارامتر دوم اش ، اسم دقیق رویداد اون شی رو مینویسین . مثل خود رویداد ای که تو شی ها نوشته هه مثلا تو اغلب شی ها برا کلیک چپ اسم رویدادش نوشته هست "On Click" که حرف اول شون بزرگ هست و بین هر دو کلمه اش فاصله داره . شما هم باید دقیق همینجوری بنویسین بدون حتی یه کاراکتر کم یا زیاد اونم با توجه به حروف بزرگ و کوچیک وگرنه ....http://forum.persiancoders.com/images/smilies/16.gif یا مثلا برا کلیک راست باید بنویسین "On Right-Click" و ... که اسم همه ی رویداد ها نوشته هه تو شی خودش و میتونین از اونجا تقلید کنین . تو پارامتر یا همون آرگومان سوم که مهم ترین و ساده ترین بحث هست ، باید کد و یا اسم متغییری رو که شامل کد و توابع اون هم فقط بصورت رشته هست رو بدین که تو این پارامتر ، متغییر ABC که تو خط اول تعریف شد ، نوشته شد


حالا خط اول :
برای دادن کد جدید ، خوب چون بصورت رشته ای باید باشه پس اول کد مورد نظر رو بین دابل کوتیشن میزارین . ینی اول بسم ا... مینویسین :




ABC = " Dialog.Message("Notice", "Salam", MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1); "



الان این کد خط بالا کامل نیست ها . کامل اون بالایی هست . این اول بسم ا... اش هه http://forum.persiancoders.com/images/smilies/4.gif . بد تو هر پارامتر همین خط ، هر جا رشته بصورت مستقیم بود (نه اینکه متغییر ای باشه که رشته رو برگردونه . فقط رشته ی مستقیم داخل اش بکار رفته باشه مثل پارامتر اول و دوم خط بالا) قبل علامت " اش یه علامت \ میزارین ینی پارامتر اول که "Notice" هست را باید این جوری بنویسین "\Notice"\ و همینطور پارامتر رو دوم رو باید بنویسین "\Salam"\ پس میشه :




ABC = "Dialog.Message(\"Notice\", \"Salam\", MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);"



دومین نکته اینکه اگه تو همین متغییر ABC خط بالا ، بخاین دو تابع یا کد بنویسین ، نمیتونین با زدن اینتر ، بعدی رو تو خط پایین تر اش بنویسین . باید با علامت ; هر خط رو از هم جدا کنین

مثال دیگه :




ABC = "Text1 = \"Salam Khobi?\";Text2 = \"Koja Bodi?\";Dialog.Message(\"Notice\", Text1..Text2, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);"
Page.CreateObject(OBJECT_BUTTON, "NewObject", {ButtonFile="button\\button 3.btn",Text="ABC",X=0,Y=0});
Page.SetObjectScript("NewObject", "On Click", ABC);




خوب Salam Khobi? چون رشته هست ، پس باید قبل " یه دونه \ بزاریم و همینطور برا Koja Bodi? که میشه اونی که تو بالا و خط اول دیدین و چون 3 تا دستور جدا ینی Text1 و Text2 و تابع Dialog.Message داریم ، پس بین همه شون باید نشونه ی جدا کننده ینی ; بزاریم اما تو پارامتر دوم تابع Dialog.Message درسته که متغییرها از نوع رشته هستن اما چون رشته بصورت مستقیم نیومده و متغییر اومده فقط ، پس علامت "\ نمیخاد و مثل حالت عادی تعریف میکنیم ینی Text1..Text2 که در ادامه ی همدیگه نوشته میشن که میدونین

سومین و مهم ترین نکته اینکه تو این دستور جدیدی که خودتون دارین مینویسین (در اینجا همون متغییر ABC منظورمه) ، اگه رشته تون به هر نحوی داخلش علامت \ داشت ، نمیتونین داخل این متغییر ABC تعریف کنین و باید خارج از این متغییر ABC تعریف کنین و داخل دستوراتش اون متغییر رو فراخونی کنین مثلا اگه بخاین تو همون دستور خط اول بالا بنویسین :




ABC = "Text1 = \"Salam Khobi?\n\";Text2 = \"Koja Bodi?\";Dialog.Message(\"Notice\", Text1..Text2, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);"



چون بعد از Salam Khobi? علامت n\ اومد و چون علامت \ داره همراه خودش ، موقه اجرا ارور میده . برا این کار ینی هر رشته ای که بین اش علامت \ داره (بجز علامتی که گفته شد برا خود رشته تو اول و آخرش میزارین) ، باید قبل این متغییر که در اینجا ABC هه تعریف و تو توابع این متغییر ABC فراخونی کرد ینی نوشت :




Text1 = "Salam Khobi?\n\n"
Text2 = "Koja Bodi?"
ABC = "Dialog.Message(\"Notice\", Text1..Text2, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);"
Page.CreateObject(OBJECT_BUTTON, "NewObject", {ButtonFile="button\\button 3.btn",Text="ABC",X=0,Y=0});
Page.SetObjectScript("NewObject", "On Click", ABC);




چون متغییر Text1 و Text2 بیرون از این رشته ی متغییر ABC تعریف شد پس بصورت عادی باید نوشته شه ینی لازم نیست قبل علامت " علامت \ گزاشت و چون تو ته خط اول اش n\n\ گزاشته شد ، پس ملومه که بین شون به اندازه ی 2 خط فاصله میافته

تذکر : این نکته ی سوم که درباره ی علامت \ بود ، برا مسیر فایل یا فولدر هم صدق میکنه چون بین هر درایو یا پوشه ، این علامت رو که جدا کننده هست داره پس برا این نوع دستورات هم باید قبل از رشته ی دستورات جدید (در اینجا ABC) تعریف کرد و داخل توابع این رشته (در اینجا ABC) ، فراخونی کرد مثل مثال بالا و یا پایین :




Path = "narm afzar\\Anti viruse\\Avast Internet Security 8.0.1497.376 Final\\Avast Internet Security.jpg"
ABC = "File.Open(Path, \"\", SW_SHOWNORMAL);"
Page.CreateObject(OBJECT_BUTTON, "NewObject", {ButtonFile="button\\button 3.btn",Text="ABC",X=0,Y=0});
Page.SetObjectScript("NewObject", "On Click", ABC);




تو پارامتر دوم خط دوم هم که چون رشته ی خالی هست و قبل هر علامت " باید علامت \ گزاشته شه ، پس میشه همونی که تو بالا دیدین ینی "\"\

این هم مثال آخر از چند دستوری که اول فایل مورد نظر اجرا و بعد پیام میده :




Path = "narm afzar\\Anti viruse\\Avast Internet Security 8.0.1497.376 Final\\Avast Internet Security.jpg"
ABC = "File.Open(Path, \"\", SW_SHOWNORMAL);Text1 = \"Salam Khobi?\";Text2 = \"Koja Bodi?\";Dialog.Message(\"Notice\", Text1..Text2, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);"
Page.CreateObject(OBJECT_BUTTON, "NewObject", {ButtonFile="button\\button 3.btn",Text="ABC",X=0,Y=0});
Page.SetObjectScript("NewObject", "On Click", ABC);



و یا همین طور میتونین یه الگوریتم تعریف کنین که مثلا حلقه داشته باشه . مثلا همین کد بالا رو 3 بار با حلقه ی for تکرار کنه :




Path = "narm afzar\\Anti viruse\\Avast Internet Security 8.0.1497.376 Final\\Avast Internet Security.jpg"
ABC = "File.Open(Path, \"\", SW_SHOWNORMAL);Text1 = \"Salam Khobi?\";Text2 = \"Koja Bodi?\";for i=1,3 do Dialog.Message(\"Notice\", Text1..Text2, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1); end"
Page.CreateObject(OBJECT_BUTTON, "NewObject", {ButtonFile="button\\button 3.btn",Text="ABC",X=0,Y=0});
Page.SetObjectScript("NewObject", "On Click", ABC);





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

sajjadkhati
11-26-2014, 11:29 AM
یه نکته ی مهم و اشتباه برانگیز برای کد دادن به رویداد (رویداد اشیاء) :
اول از همه بگم این تیکه رو مدیون اوستا محسن ام و واقعا ازش ممنونم (ما را از هچل نجات داد )
نگا کنین ، به قول اوستا محسن ، یه پن شیش تا شی Button بزارین تو صفه با نام پیش فرض خودش و یه شی دیگه (مثلا Lable) هم بزارین . تو این لیبل هه ، این کد رو بدین :



Page.SetObjectScript("Button"..j, "On Click", "Dialog.Message(\"\", j);");
j=j+1



تو گلوبال فانکشن یا استارت آپ هم این رو :



j=1


الان تصورتون چیه؟ دکمه ی 1 و 2 و 3 رو بزنین ، برا هر کدوم چه پیامی میده؟
تصور اغلب افرادی که مثل من ان اینه که وقتی دکمه ی Button1 رو بزنن ، پیام 1 رو میده (چون j در اون لحظه ، 1 هه) و وقتی دکمه ی دوم رو میزنین ، پیام 2 و ... رو بده
اما این گونه نیست چگونه هست؟
این جوریه که j مقدار اولیه اش تو دهلیز (نه بطن ) ورود ، 1 بود . بعد خط اول بالا که گفت تو Button..j ، کدی رو ست کن که مقدار j رو بنویسه. ینی چی تا اینجا؟ خوب مقدار j رو جایگزین کنین دیگه ینی اینکه تو Button1 ، پیام ای رو ست کن که عنوان اش ، 1 باشه (البته تا اینجا) . بعد تو خط بعد ، یکی به مقدار j میافزایه خوب حالا دوباره کد بالا رو ترجمه کنین با این مقدار جدید . چی میشه؟ تا اینجاش که رو Button1 ست کنه که انجام شد . هیچ چی . ینی نه اینکه مقدار j برابر 2 شد و از اون طرف هم گفتیم کد رو تو Button..j ست کن ، پس تو Button2 ست میکنه . این که ملومه اون خط کد اجرا شد و برای Button1 کد رو ست کرد و رف پی کارش . وقتی برا دکمه ی 2 ست میکنه کد رو که شما دوباره رو شی Lable کلیک کنین یا اینکه مثلا بعد خط دوم ، کد ست کردن رو مینوشتین. پس تا اینجا مشکلی ندارین؟ خوب حالا ادامه ی نگا رو میندازیم . پس تا اینجا j برابر 2 شد و تو دکمه ی اول یا Button1 این کد رو ست میکنه که وقتی کلیک کنیم ، مقدار j رو نشون میده که برابر چی هست؟ برابر 2
پس اولین باری که کلیک کنین تو دکمه ی اول ، پیام 2 رو میده نه 1 رو . چون قبل اجرا شدن دومین بار کد



Page.SetObjectScript("Button"..j, "On Click", "Dialog.Message(\"\", j);");


، مقدار j یکی اضافه شد . حالا دومین بار وقتی کلیک کنین چی میشه؟ تو Button2 (چون j فعلا 2 هه) ، میگه j رو نمایش بده که قبل از اینکه کد خط بالا اجرا بشه ، مقدار j یکی اضافه میشه پس وقتی دکمه ی 1 یا 2 رو کلیک کنین که دستور داده شد مقدار j رو نشون بده تو هر دوشون ، هر کدوم رو کلیک کنین ، مقدار 3 پیام داده میشه و الی آخر
پس برای رفع این مشکل و موقعی که میخایم یه کد رو ست کنیم که مثلا تو Button1 ، یه پیام خاص رو ست کنه و تو Button2 ، یه پیام خاص دیگه رو ، باید متغییری که نام میبریم ، شماره ی همون دکمه باشه و هر بار ، با اجرای هر دفه کلیک روی دکمه ، اول اون متغییر (تو اینجا مقدار j) اور رایت بشه یا اگه مقدار آرایه ی خاص رو هم میخایم که ست کنه ، به شماره ی همون عضوی که میخایم ، اوررایت اش کنیم اون متغییر رو
یادتون باشه این مقداری که برای اندیس تو آرایه ها اوررایت میشه ، هر بار یکی بهش اضافه میشه ممولا و کلا مقدارش یکی بیشتر یا برابر آخرین عضو آرایه هست اما تو این حالت ما میخایم هر دکمه ای که اجرا میکنیم ، اون متغییر (تو اینجا مقدار j) قبلش برابر شماره ی اون عضوی بشه که ما میخایم
انگار در وهله ی اول ، فقط از همین طریق ، میشه این کار رو انجام دادخوب برا اوررایت کردن هم باید شماره ی اون دکمه رو بگیریم که انگار راهی جز زمان اجرای خود کد ینی داخل پارامتر یا آرگومان سوم ورودی بالا نداریم. پس باید این جوری بنویسین :




Code = "ButtonName = Button.GetProperties(this);ButtonNumber = String.Mid(ButtonName.ObjectName, 7, -1); Dialog.Message(\"\", ButtonNumber );"
Page.SetObjectScript("Button"..j, "On Click", Code);
j=j+1



که موقه اجرای کد ، تو هر دکمه ، اول شماره ی دکمه رو میگیره بعد اونو مینویسه و مستقل از متغییر j عمل میکنه و هر بار هم این متغییر اوررایت و مقدارشم برابر مقدار همون شماره ی دکمه میشه (ینی رو دکمه ی 5 کلیک کنین ، این متغییر 5 میشه و بدش رو دکمه ی 9 کلیک کنین ، بدش 9 میشه) و مثل متغییر j نیست که هر بار فقط یه دونه اضافه بشه
از آقا محسنم بازم تشکر میکنم که بابتش وقت گزاشت

sajjadkhati
11-26-2014, 11:30 AM
فارسی نوشتن موقه اضافه کردن متن یه شی :

باید در این مواقع ، FontScript=1 یا همون برابر DEFAULT_CHARSET بگیرین تا فارسی شه بجا زمانی که خودتون تو قسمت Script فونت ، گزینه ی Arabic رو انتخاب میکردین




باشد گلپسر بارزان http://forum.persiancoders.com/images/smilies/3.gif

sajjadkhati
11-26-2014, 11:30 AM
یه تجربه ی خنده دار از خودمو بگم که شاید اگه کسی مثّ من فک کرد ، وقتش گرفته نشه : http://forum.persiancoders.com/images/smilies/4.gif
اگه خدای نکرده یه وقت مثّ من فک کردین که سمت چپ مساوی یا همون کنار یه متغییر یا آرایه (محتوای متغییر یا مقدار بازگشتی اش که سمت راست مساوی هه منظورم نیست ها) میتونین در ادامه اش یه متغییر دیگه تعریف کنین (که علامت اش دو تا نقطه ی پی در پی هه ینی .. ) یا یک نقطه مثل فرا آرایه یا حتی آرایه ، برا اینکه به قول اوستا حامد بتونین آرایه چن بعدی داشته باشین ، یه متغییر رو از قبل تعریف کنین و با گزاشتن یه نقطه همونو کنار آرایه یا فرا آرایه تعریف کنین ، باید بگم که اشتبا میکردین مثّ من و بر روی آب ، آونگ میکوبیدین http://forum.persiancoders.com/images/smilies/4.gif
البته اوستا حامد نگفت با چه زبان هایی میشه آرایه ی چن بعدی نوشت http://forum.persiancoders.com/images/smilies/4.gif
مثال های اشتباه :




ABC = {}
ABC.ThisPage = {}
ThisPage = Application.GetCurrentPage();
ABC.ThisPage[1] = "Har Meghdari"




یا




ABC = "A Name"
Motaghaier = "Abc"
ABC..Motaghaier = 5




تو اولی مثال ، ارور شاید نده اما چیزی که شما میخاین هم درس نمیشه و عملیات اچ3 عقیم میمونه http://forum.persiancoders.com/images/smilies/4.gif
پس متوجه شدین دیگر؟ حداقل حداقل اش اینه که جز قضیه ی آرایه و فرا آرایه که نقطه میتونین بزارین در سمت چپ تساوی ، برا این قضیه که گفته شد ، اصلا شدنی نیست و نمیتونین بزارین و همینطور ، فرا آرایه و کلا هر آرایه ای تو لوا ابعاد نداره ینی نمیشه مثل داخل اندیس اش که میشه متغییر تعریف کرد ، در سمت چپ تساوی ، نمیشه یه متغییر دیگه تعریف کرد و خودتونو و وقت تونو بخاطر این کار ، به فنا ندین . ما به فنا دادیم و نتیجه ای حاصل نشد http://forum.persiancoders.com/images/smilies/4.gif اگه این کار شدنی بود ، یه قدرت و آسونی چن برابری تو لوا برا تعریف آرایه ممکن بود

sajjadkhati
11-26-2014, 11:30 AM
ماژول ها :

بازم باید از دو جهت ازت تشکر کنم که سید . هم واسه یاد دادن این مطلب و هم این الگوریتم (ای کاش بیشتر درباره اش توضیح میدادی . فراخونی اش چجوریه؟ من فراخونی کردم array[1][1] اما جواب نداد)
کلا من اگه لیست این تاپیک که وابسته به آموزشای بچه هاست رو لیست کنم ، یه فرا آرایه ی دویست بعدی درمیاد :ch0m: چند بعدش تا حالا شدن گلپسران حامد و جواد و محاسنین :ch0m: (دو تا محسن :ch0m:) و سید انجمن مون و اوستا محمد (اون یکی منظورمه) . ماشاء ا... یه انجمن هست ، دویست تا دو به دو اسم دارن . سجادین انجمن =3 تا . محسنین انجمن = 2 تا . محمدین انجمن = 2 تا :ch0m: فقط حامدین و جوادین موند :ch0m:
چقد صوبت میکنم؟ بریم سر اسب مطلب :hoora:



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

یه مثال بزنم (البته همه ی اینا از مثالای بچه هاست و اینم از سید اهل انجمن ، گلپسر محمد همونطور که گفته بودم):



Math = {
add = function (a,b)
return(a+b)
end,
sub = function (a,b)
return(a-b)
end,
mul = function (a,b)
return(a*b)
end,
div = function (a,b)
return(a/b)
end


Math تو مثال بالا ، فرا آرایه ایه که 4 تا عضو داره و هر عضوشم یه تابع هست.
درسته که فرا آرایه ، چند بعدی نیست اما چون داخلش متغییر داره پس آرایه ی معمولی هم نیست و فرا آرایه هست که عضو هاش اینا هستن تو مثال بالا :



Math={add,sub,mul,div}


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



Math.add


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

sajjadkhati
11-26-2014, 11:31 AM
دانلود نرم افزار ++Spy یا WinSpy 17 برای گرفتن Class Name پنجره ها :

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

همونطور که میدونین ، خیلی از توابع API به ورودی (پارامتر) هایی مثل Windows Handel و Class Name نیاز دارن . ویندوز هندل که هر بار تو هر دفه باز و بسته کردن یه پنجره ، عوض میشه . چیزی که ثابت هه همیشه و مهمه ، Class Name اون پنجره هه . برا فهمیدن این پارامتر میتونین از نرم افزار ++Spy که مایکروسافت درست کرد ، متوجه شین .
برا کار باهاش ، بعد از اجرای این نرم افزار ، سمت چپ بالای این نرم افزار ، یه آیکون شبیه مگسک و هدف گیر تفنگ http://forum.persiancoders.com/images/smilies/4.gif میبینین . این آیکون رو بکشین و تو ویندوزی که میخاین اطلاعات شو بدست بیارین ، رها کنین . دیگه همه چی ملومه بدش دیگه . آیتمی بنام Class Name ملوم میشه . برای تغییر دادن ویژگی یه پنجره ی خاص ، باید هندل شو بدست بیارین که تو ورودی اش برا بدست آوردن هندل ، اول Class Name رو میخاد که اطلاعات شو با اون نرم افزار بدست میارین و بهش میدین . (مثلا برا تغییر ویژگی تسکبار یا پنجره های دیگه مثل Explorer.exe ، با تابع FindWindowA میتونین با دادن پارامتر اول (Class Name) که ثابت هم هست ، که مثلا برا تسک بار Shell_TrayWnd هست ، هندل شو بدست بیارین و تغییرات تونو با توابع دیگه انجام بدین)


این نرم افزار ++Spy رو از اینجا دانلود کنین (http://www.softpedia.com/dyn-postdownload.php?p=78214&t=0&i=1)

sajjadkhati
11-26-2014, 11:32 AM
دانلود نرم افزار Dll Export Viewer 1.6 برای گرفتن اسم تابع های داخل فایل های کتابخانه (dll) :

اولین کار برای استفاده از هر فایل کتابخونه ای ، فهمیدن اسم اون تابع ی داخل کتابخونه یا dll هست . با این نرم افزار ، میتونین اسم تابع رو بدست بیارین .



دانلود نرم افزار نسخه ی 32 بیت (http://www.nirsoft.net/utils/dllexp.zip)

دانلود نرم افزار نسخه ی 64 بیت (http://www.nirsoft.net/utils/dllexp-x64.zip)

sajjadkhati
11-26-2014, 11:32 AM
رشته ها در لوا به دو صورت تعریف میشن :

1- مابین دو علامت " " که بیشتر برای رشته های یک خطی به کار میره.
2- مابین دو علامت [[ ]] که بیشتر برای رشته های چند خطی به کار میره.
مثلا متغییر MyVars زیر که متغییر رشته ای هست رو به دو صورت میشه تعریف کرد :

اول :




MyVars = "MyFunc = {} _DesktopFolder = 100 MyFunc.GetName = \"mohsen\""


دوم :




MyVars = [[
MyFunc = {}
_DesktopFolder = 100
MyFunc.GetName = "mohsen"
]]


قسمت دوم ممولا برا متغییر هایی که تو چن خط تعریف میشن ، کاربرد داره . اما فرقی تو عملکرد با هم ندارن این دو خط

تابع loadstring هم که جزء توابع اصلی برنامه نویسی خود لوا هست ، با ساختار زیر (دو تا پرانتز) که رشته رو دریافت میکنه ، اون رشته رو به متغییر تبدیل میکنه :



loadstring(MyVars)()





برای استفاده از توابع اصلی خود زبان لوا ، تو این لینک بیاین (http://www.lua.org/manual/5.1/)

با تشکر از گلپسر محسن http://forum.persiancoders.com/images/smilies/53.gif

sajjadkhati
11-26-2014, 11:33 AM
فرا آرایه (MetaTable) :

اول جا تشکر ویژه داره که از گلپسر اشکان کنم که واقعا تو آموزشش بهم کمک کرد http://www.shahrsakhtafzar.com/forum/images/smile/pcnet/give_rose.gif
اونی که تو صفحات قبل گفته شد به عنوان فرا آرایه ، فرا آرایه نبود (تا امروز فک میکردم بود) .http://www.shahrsakhtafzar.com/forum/images/smile/pcnet/Love-ssa~!%20(1).gif آرایه ی چند بعدی بود (من فک میکردم هر دو یکی ان . دست اوستا امیر درد نکنه که منو متوجه کرد)http://www.shahrsakhtafzar.com/forum/images/smile/pcnet/Love-ssa~!%20(1).gif بدش بگم که این چیزایی که گفته میشه ، تجربه ی من و راهنمایی اوستا اشکان هه . چون تجربه ام زیاد نیست ، ممکنه جاهایی درست مطلب گفته و جا نندازم یا حتی اشکال یا غلط بگم . هر کی که به درک کامل تر رسید ، اینجا تو این تاپیک کاملش کنه این مبحث روhttp://www.shahrsakhtafzar.com/forum/images/smile/pcnet/give_rose.gif


فرا آرایه در واقع یه آرایه ای هست که با توابعی که از پیش تعریف شده برای لوا هست (که دو تا علامت آندرلاین __ کنار اسم تابع اش داره) ، 2 کار رو تو آرایه ها انجام میده :
1) اگه مقدار یا عضوی از یه آرایه ای رو فراخونی کردیم که مقدارش nil بود ، با فرا آرایه میتونیم اون مقدار رو براش تعریف کنیم که دیگه nil نباشه و مقدار داشته باشه
2) عملگر و یا نوع فراخونی و بقیه ی کارای یک یا دو آرایه رو براش تعریف کنیم . ینی مثلا بصورت عادی نمیشه دو آرایه رو با هم جمع کرد اما با این حالت میشه

اگه این دو حالت پیش بیاد ، ینی مثلا یه عضوی از آرایه ای رو بخونیم که nil باشه و براش هم فرا آرایه ست کرده بودیم قبلا ،اون عضو از آرایه بجا اینکه nil رو برگردونه ، آرایه و الگوریتم فراآرایه رو اجرا میکنه
پس فراآرایه در واقع یه جوارایی ساختش ، به ماژول ها شباهت داره (آرایه ای که داخلش تابع تعریف میشه) . این توابع هم این طور نیست که آرگومان و ورودی هاش هر چی دلمون بخاد باشه چون این توابع تو لوا تعریف شده هست و باید با همون تداد آرگومانی این توابع رو بسازیم که تو لوا تعریف شد. لیست این توابع و عملکرداشونو میتونین بصورت کامل تو جدول قسمت پایین این صفه ببینین (http://www.tutorialspoint.com/lua/lua_metatables.htm) .(البته همونطور که گفته شد ، چون این توابع ها از پیش تعریف شده ان و تعداد و نوع آرگومان و ورودی هاشون باید همون جوری باشه که تعریف شد و تو اون لیست ، این ویژگی هاش و راهنماش نیومد ، فقط باید از مثال هاش پی ببرین و بازم چون همه ی توابع رو تو اون لینک مثال نزد ، شما میتونین با نوشتن اسم تابع و تو ادامه function example in lua ، تو سایتا سرچ کنین )
فرا آرایه هم با با تابع setmetatable برا یه آرایه تعریف میشه. این تابع ، دو آرگومان داره که تو آرگومان اولش آرایه ای که میخاین فرا آرایه براش ست کنین و نسبت بدین رو مینویسین و آرگومان دوم هم فراآرایه (که معلومه و گفته شد از نوع آرایه هست) رو مینویسین
تا اینجا دید یو آندرستود؟ ندید یو ؟ ببینین یو http://www.shahrsakhtafzar.com/forum/images/smile/pcnet/Love-ssa~!%20(1).gif

بوریم مثالِ سر وقت (بریم سر وقت مثالا . مازندرانی رو باید یاد بگیرینا . از انگلیسی هم واجب تره http://www.shahrsakhtafzar.com/forum/images/smile/pcnet/Love-ssa~!%20(1).gif) :
نگا کنین در واقع تابع setmetatable دو کار میکنه . اول اینکه برا آرایه ، فرا آرایه ست میکنه و دوم اینکه مقدار آرایه ی داده شده (که تو آرگومان اول اش میدادیم) رو برمیگردونه . مثلا تو مثال زیر :





mytable = {}
mymetatable = {}
setmetatable(mytable,mymetatable)


با این مثال :



mytable = setmetatable({},{})


هیچ فرقی نداره
تو مثال اول ، آرایه ای به عنوان آرایه ی اصلی که که فرا آرایه براش میخاد تعریف شه ، بنام mytable تعریف شد و بدش یه آرایه بنام mymetatable که به عنوان فرا آرایه ای که برا mytable میخاد ست شه و خط بدشو که توضیح دادم.
تو مثال دوم که همونطور که گفته شد ، تابع setmetatable ، آرایه ای که تو پارامتر اولش تعریف شد رو برمیگردونه پس mytable = {} میشه و علاوه بر اینکه فرا آرایه (پارامتر دوم) هم برا این آرایه ست میشه
تا اینجا مثال کلی بود . حالا بریم سراغ یه مثال واقعی http://www.shahrsakhtafzar.com/forum/images/smile/pcnet/Love-ssa~!%20(1).gif:

تابع index__ :
یکی از مهمترین تابع برا ایجاد فرا آرای هست . کارش تعریف فراآرایه ای هست که اگه تو یه آرایه ، موقه فراخونی عضوی از اون آرایه ، اون عضوش nil باشه یا تعریف نشده باشه ، دیگه بجا برگردوندن nil ، اون فراآرایه اجرا میشه .

یه مثال :



mytable = setmetatable({key1 = "value1"}, {
__index = function(mytable, key)
if key == "key2" then
return "metatablevalue"
else
return mytable[key]
end
end
})


Dialog.Message("Notice", mytable.key1.."\n"..mytable.key2, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);



اولا تو خط اول گفتیم که تابع setmetatable ، اولین پارامتر یا ورودی اش که آرایه هست رو برمیگردونه پس mytable یه آرایه هست اونم مقادیر و عضوهاش میشن :



mytable = {key1 = "value1"}


دوم اینکه میریم تو خط آخرhttp://www.shahrsakhtafzar.com/forum/images/smile/pcnet/Love-ssa~!%20(1).gif . خط آخر ، میگه که key1 امین عضو از آرایه ی mytable رو فراخونی کن که خوب تعریف شده هست و مقدارشم برابر رشته ی value1 هه که موردی نداره و در ادامه ی Dialog.Message میگه Key2 امین عضو از آرایه ی mytable رو فراخونی کن . Key2 امین عضو از آرایه ی mytable وجود دارد عایا؟ ندارد عایا . پس چه میشود عایا؟ http://www.shahrsakhtafzar.com/forum/images/smile/pcnet/Love-ssa~!%20(1).gifچون مقدارش برابر nil هه پس فرا آرایه ینی پارامتر دوم setmetatable اجرا میشه.
قبل از ادامه ، اول بزارین نحوه ی تعریف و اصول اولیه ی فرا آرایه گفته شه :
1) همونطور که گفته شد ، برا تعریف تابع ی فراآرایه ، از توابع از پیش تعریف شده ی لوا استفاده میشه (مثل index__ در این مثال و چن تا مثال دیگه در ادامه گفته میشه) که برا استفاده از راهنماش گفته شد
2) تعداد و نوع آرگومان و حتی اسم این توابع دست ما نیست و بازم باید از توی مثال های راهنمای انگلیسی متوجه شین (من انگلیسی ام عالیهhttp://www.shahrsakhtafzar.com/forum/images/smile/pcnet/Love-ssa~!%20(1).gif ) و اغلب آرگومان هاشم راحت میشه حدس زد (تجربه ای متفاوت از حس شیشمhttp://www.shahrsakhtafzar.com/forum/images/smile/pcnet/Love-ssa~!%20(1).gif) و اغلب تعداد آرگوماناش به تعداد آرایه ی استفاده و درگیر شده هست که اغلب 2 تاست و اغلب هم نوع آرگومان های این توابع هم از نوع آرایه هست و تو اغلب موارد هم آرگومان اول ، اون آرایه ی اصلی مونه که میخایم تغییرات روش انجام بشه
3) برا تعریف تابع تو فراآرایه ها ، مثل مثال بالا عمل کنین ینی اسم تابع مورد نظرتونو برابر بگیرین با کلمه ی فانکشن و بد براش آرگومان تعریف کنین . به این حالت تعریف کنین ، نمیشه ها چون علامت آندرلاین داره و ارور میده :



function __index(mytable, key)


اغلب در اغلب شد http://www.shahrsakhtafzar.com/forum/images/smile/pcnet/Love-ssa~!%20(1).gif خو بَیته مِرِه http://www.shahrsakhtafzar.com/forum/images/smile/pcnet/Love-ssa~!%20(1).gif شام زیاد خوردما ، شکمم پره ، خابم میاد. جاتون پر ، ماکارونی داشتیمhttp://www.shahrsakhtafzar.com/forum/images/smile/pcnet/Love-ssa~!%20(1).gif
حالا بریم ادامه ی بحث درباره ی آرگومان دوم مثال بالا یا همون فراآرایه اش :
خوب تو این تابع index__ آرگومان هاش این جوریه که (گفته شد که نوع آرگمان اش رو باید تو مثال ها ببینین که از پیش تعریف شده هست و به احتمال بسیار زیاد قابل تغییر نیست) ، وقتی اسم و عضو آرایه فراخونی میشه ، قسمت اسم آرایه ، به یه پارامتر و قسمت عضو آرایه ، به یه پارامتر دیگه تو تابع مورد نظر (در اینجا تابع index__) ارسال میشه . الان تو قسمت Dialog.Message که mytable.key2 فراخونی شد ، اسم آرایه که mytable هه به پارامتر اول تابع index__ که از نوع آرایه هست ارسال شد و اسم key2 به پارامتر دوم این تابع که این بار از نوع رشته هست (ینی key2 بصورت رشته) وارد اونجا میشه که این نوع اش رو که تو اینجا تو این پارامتر ، رشته هست که گفته شد از پیش تعریف شده هست رو تو مثال ها میتونین پیدا کنین
ینی الان تو تابع index__ هر جا mytable نام برده شد ، همون آرایه mytable و هر جا key برده شد ، همون رشته ی "key2" هه منظورش (پس ورودی اول این تابع از نوع آرایه و ورودی دومش از نوع رشته هست)
بقیه دَوِّه فِردا . مِه چِش کور بَیِّه http://www.shahrsakhtafzar.com/forum/images/smile/pcnet/Love-ssa~!%20(1).gif
خا کجا بودیم؟ آها رو کره ی زمین بودیم http://www.shahrsakhtafzar.com/forum/images/smile/pcnet/Love-ssa~!%20(1).gif بریم ادامه مبحث
خوب چون تو mytable.key2 مقدار پارامتر key رشته هه و برابر key2 ینی :



key = "key2"


هست ، و تو شرط تابع index__ این شرط گزاشته شده ، پس تابعش مقدار رشته ای metatablevalue رو برمیگردونه ینی بجا mytable.key2 ، رشته ی metatablevalue برگردونده و چاپ میشه تو Dialog.Message

راستی بجا نوع نگارش تابع تو خط بالا (الگوریتم تابع نه ها) میشه این طور هم نوشت اما من با روش بالا راحت ترم :



mytable = setmetatable({key1 = "value1"}, { __index = { key2 = "metatablevalue" } })
Dialog.Message("Notice", mytable.key1.."\n"..mytable.key2, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);


حالا بریم سر وقت مثال دوم از نوع دوم که تعریف عملگر و فراخونی و ... بین دو آرایه بود بود.
اول تعریف عملگر بین دو آرایه :



mytable = setmetatable({ 1, 2, 3 }, {
__add = function(mytable, newtable)
for i = 1, table.maxn(newtable) do
table.insert(mytable, table.maxn(mytable)+1,newtable[i])
end
return mytable
end
})


secondtable = {4,5,6}


mytable = mytable + secondtable
for k,v in ipairs(mytable) do
Dialog.Message("Notice", k.."\n"..v, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
end


تو توضیحش اینکه اولا تابع add__ دو تا آرگومان داره که اولیش آرایه اول ارسال میشه (قبل علامت جمع یا +) و برا دومیش آرایه ی دوم ارسال میشه (بعد علامت جمع در آرایه ها) و همونطور که از مثال هم معلومه ، تابع اولی که mytable هست و تو خط اول که پارامتر اول setmetatable هست ، تعریف شد، به عنوان پارامتر اول ، به تابع add__ فرستاده میشه و بعد علامت به علاوه که آرایه دوم و secandtable هست ، به عنوان پارامتر دوم به این تابع ارسال میشه
خوب حالا تو خط دهم ینی mytable = mytable + secondtable که مثل مثال قبل نیست که مقدار یه آرایه nil باشه و فراآرایه جاش اجرا بشه. پس چجوریه که با اجرای این خط فراآرایه اجرا میشه؟ فراآرایه ای که برا یه آرایه ست شد ، هر بار که اسم اون آرایه برده شد ، چک میکنه ببینه فراآرایه ای مناسب با عملی که براش تعریف کردیم ، تعریف شد یا نه . اگه تعریف شده بود فقط اجراش میکنه . ینی الان تو مثال بالا ، اگه یه آرایه ای رو فراخونی کنین که مقدارش nil باشه ، ارور میده چون فراآرایه ای که براش تعریف شد بخاطر اینکه تابع مورد نظر (index__) رو نداره ، اصلا اجرا نمیشه در این حالت
خوب حالا با اجرا شدن خط دهم ینی mytable = mytable + secondtable پارامترهای ارسالی که گفته شد و فراآرایه اجرا میشه . تو خط سوم :



for i = 1, table.maxn(newtable) do
table.insert(mytable, table.maxn(mytable)+1,newtable[i])
end


تابع table.maxn(newtable) ، با گرفتن اسم آرایه ، تعداد عضو هاش رو برمیگردونه که همون کار علامت # رو میکنه . ینی میتونین بجا خطوط بالا بنویسین :



for i = 1, #newtable do
table.insert(mytable, #mytable+1,newtable[i])
end


و دیگه ملومه که عضوهای آرایه ی newtable رو به عضوهای آرایه mytable اضافه میکنه . سر آخر هم همین آرایه ی mytable رو این تابع برمیگردونه (تو خطوط بالا) و بهتر ازم میدونین که ینی بجا mytable (سمت چپ تساوی خط دهم) ، مقدار mytable برگردونده میشه که شامل عضوهای اضافه شده ی آرایه ی newtable به آرایه ی خودشه ینی این :



mytable = { 1, 2, 3 ,4,5,6}


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



mytable = setmetatable({10}, {
__call = function(mytable, newtable)
sum = 0
for i = 1, #mytable do
sum = sum + mytable[i]
end

for i = 1, #newtable do
sum = sum + newtable[i]
end
return sum
end
})


newtable = {10,20,30}
Dialog.Message("Notice", mytable(newtable), MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);


برا فراخونی (ینی تغییر عملکرد و رفتار فراخونی یه آرایه یا در واقع ست کردن فراآرایه برا تغییر نوع فراخونی) از تابع call__ استفاده میکنیم
خوب همونطور که میدونین این فراآرایه تو مثال بالا ، موقعی اجرا میشه که خط آخر اجرا بشه ینی وقتی که تو پارامتر دوم گفتیم mytable(newtable)
دیگه ورودی این تابع call__ و الگوریتم هایی که توش بکار رفت کاملا مشخصه دیگه http://www.shahrsakhtafzar.com/forum/images/smile/1.%20(23).gif
مقدار بازگشتی شم تو این مثال 70 هه
تابع دیگه هم tostring__ هه که برا تغییر عملکرد فراخونی هه که تو مثال سایت بالا اومد

راستی این مثالا از همون لینکی که تو بالا داده شد گرفته شد (از گلپسر سید هم بخاطر معرفی این سایت ممنونمhttp://www.shahrsakhtafzar.com/forum/images/smile/pcnet/give_rose.gif)
امیدوارم براتون مفید بوده باشه این آموزش
بازم دسِّت درد نکنه اوستا اشکانhttp://www.shahrsakhtafzar.com/forum/images/smile/pcnet/give_rose.gif