برنامه نویسی J2me برای موبایل با دلفی - نسخه قابل چاپ +- Parsi Coders (http://parsicoders.com) +-- انجمن: Mobile (http://parsicoders.com/forumdisplay.php?fid=56) +--- انجمن: Programming Mobile (http://parsicoders.com/forumdisplay.php?fid=57) +--- موضوع: برنامه نویسی J2me برای موبایل با دلفی (/showthread.php?tid=1855) صفحات
1
2
|
برنامه نویسی J2me برای موبایل با دلفی - Oep - 02-26-2012 درود به همه دوستان. اگر عمری باقی مانده باشه قراره هستش در این تاپیک به آموزش برنامه نویسی برای پلتفرم جاوا (موبایل) در محیط MIDLETPASCAL بپردازیم که Syntax اون مانند دلفی و یا همان پاسکال خودمان است. MIDletPascal یک IDE جالب برای طراحی برنامه های J2ME برای موبایل می باشد که کامپایلر آن کدهای نوشته شده به زبان پاسکال را به جاوا تبدیل میکند.پس اگر با یکی ازنسخه های زبان برنامه نویسی پاسکال آشنایی داشته باشید براحتی می توانید برای گوشی های همراه خود برنامه بنویسید.این IDE در ویندوز استفاده می گردد هرچند که می توانید در سیستم عاملهای Linux and MacOS در Wine اجرا نمایید.برنامه های نوشته شده تحت این IDE در تمامی موبایل ها اجرا می شوند و از پلتفرم های MIDP 1.0 and CLDC 1.0 نیز پشتیبانی میکند. دوست عزیز Niksa Orlic (norlic) سورس برنامه MIDletPascal 2.02 را در سپتامبر 2009 تحت لیسانس GNU پابلیک کرد و در اختیار عموم قرار داد.که در اکتبر 2009 ورژن3 این IDE استارت خورد و روز به روز به امکانات وقابلیت های آن افزوده شد.مانند افزودن حلقه ، پشتیبانی از کامنت چند خطی و .... آخرین ورژن این محیط برنامه نویسی را می توانید از آدرس زیر دریافت کنید: کد: http://sourceforge.net/projects/midletpascal/ در ورژن 3 این IDE امکاناتی افزوده شده که در زیر ذکر شده است : حداکثر اندازه تعریف برای آرایه ها 32767 است.که بسیار افزایش یافته است. مثال: کد: var الحاق رشته ها بهمدیگر بصورت هوشمند.یعنی دیگراحتیاجی به استفاده از عملگر "+" نیست مانند زیر: کد: s := 'this is'#10'a test'; استفاده از عمل های شیفت مانند SHL and SHR .مانند زیر: کد: a := $A714; از علامت های <> نیز می توانید استفاده نمایید: کد: a := $714A; برای استفاده از بایت کدها میتوانید با استفاده از دستور inline بطور مستقیم بایت کدها را در پروسیجرها بنویسید : کد: procedure DoNothing; می توانید از bytecode/end نیز استفاده نمایید: کد: procedure DoNothing; می توانید برای ایجاد حلقه ها از دستورات REPEAT/FOREVER نیز استفاده نمایید.مثال: کد: repeat می توانید از کلمه کلیدی result برای برگرداندن مقدار در توابع استفاده نمایید.در مثال زیر طرز استفاده را خواهید دید: کد: function Return4: integer; برای انجام عملیات شیفت به راست بدون علامت می توانید بصورت زیر عمل نمایید: کد: a := $2704; RE: برنامه نویسی J2me برای موبایل با دلفی - Oep - 02-27-2012 این محیط برنامه نویسی case-insensitive است یعنی بر حروف کوچک و بزرگ حساس است. برای کامنت های چند خطی می توانید متن خود را درون '{' and '}' قرار دهید و یا (* and *) : (* this is also a comment *) { this is a comment } همچنین میتوان از استایل زبان C برای کامنت گذاری استفاده نمود: // this is a single-line comment /* this is also a multi-line comment */ ساختار کلی برنامه نویسی در این محیط بدین صورت است که بدن اصلی و بقولی تابع main مان در مکان statements قرار دارد.که قبل از آن می توان type ها،متغیرها و دیگر پروسیجر مورد نیازمان را تعریف نماییم کد: program programName; type definitions: می بایست Type ها و یا همان ساختاری که مورد نیازتان هست را تعریف نمایید که حتما باید از کلمه کلیدی type نیز استفاده نمایید مانند زیر: کد: program myOwnTypes; constant declarations : در این بخش شما می بایست ثابت ها را همراه با نام آنها ومقادیرشان را بنویسید.در مثال زیر می توانید مشاهد کنید: کد: program constantDeclarations; variable declarations :در این بخش شما متغییرهایتان را تعریف مینمایید که می بایست برای تعریف آنها از کلمه کلیدی var استفاده نمایید: کد: program variableDeclarations; function and procedure declarations Procedures ها زیر برنامه هایی هستند که مقدار خروجی ندارند وبطورکلی چیزی را برنمی گردانند.درمثال زیر دو پروسیجر نوشته شده است است که یکی از آنها بدون پارامتر ورودی و دیگری دارای دوپارامتر ورودی است: کد: program procedureSample; و Functions ها زیر برنامه هایی هستند که مقداری را بعنوان خروجی باید برگردانند. Functions همانند پروسیجرها هستند ولی با این تفاوت که مقداری را باید بعنوان خروجی برگردانند. کد: program functionSample; همچنین می توان func هایی بصورت بازگشتی نوشت.همانند زیر که حالت فاکتوریل را پیاده سازی کرده ایم: کد: program recursionSample; حالت زیر را درنظر بگیرید: کد: procedure a (x: integer); خوب همانطورکه میبینید پروسیجر a پروسیجر b را فراخوانی میکند و باز از درون پروسیجر b نیز پروسیجر a نیز فراخوانی میشود.که کامپایلر پیغام خطا میدهد که برای رفع این مشکل بصورت زیر عمل می کنیم: کد: procedure b(y:integer); forward;{ the forward reference tells که این تکنیک و حالت را forward references گویند. RE: برنامه نویسی J2me برای موبایل با دلفی - Oep - 02-27-2012 دستور for : Syntax این دستور بصورت زیر است: کد: for loopIndex := initialValueExpression to finalValueExpression do بجای to می توانید از downto استفاده که مقدار شمارشگر حلقه را کاهش میدهد.تکه کد زیر جمع اعداد از 1 تا 10 را محاسبه می کند : کد: for i:= 1 to 10 do دستور while نیز یک نوع دیگر ازحلقه ها محسوب میشود و syntax آن نیز بصورت زیر است: کد: while condition do برای منتظرماندن ورودی کاربر می توان این چنین بنویسیم: کد: while (getKeyClicked = KE_NONE) do دستور repeat/until نیزبدین صورت است: کد: repeat مثال قبلی را با این دستور میتوان بدین صورت پیاده سازی کرد: کد: repeat دستور Break برای خروج از حلقه استفاده می شود که در تمامی انواع حلقه های ذکرشده بالا می توان استفاده نمود.به این مثال توجه کنید: کد: repeat دستورات If-then-else نیز براحتی می توان استفاده نمود.شکل کلی دستور بصورت زیر است: کد: if condition then توجه:هرگاه دستورات بیش از یک خط بشود احتیاج begin/end خواهیم داشت.اگر دستور یک خط باشد می توان از begin/end استفاده نکرد. عملگر انتساب نیز به شکل زیر است که از := استفاده میشود: کد: variable := value; فراخوانی یک روتین تنها نام آن را ذکرکرد: کد: routine; RE: برنامه نویسی J2me برای موبایل با دلفی - Oep - 02-27-2012 Data type ها را بطور کلی به دو دسته ساده و مرکب تقسیم میکنیم. ساده عبارتند از: نوع Boolean فقط می تواند دو مقدار true or false را به خود اختصاص دهد.عملگرهایی که برروی این نوع می توان انجام داد به شرح زیر است: عملگرهای مقایسه ای : =, <> عملگرهای منطقی or, xor عملگر and عملگر not عملگر not داراری بالاترین الویت و = and <> پایین ترین الویت است.بعنوان مثال عبارت زیر true است: ((true and false) = false) نوع Char که اشاره به یک کاراکتر دارد.عملگرهایی که برروی این نوع انجام میشود: عملگرهایی مقایسه ای =, <>, <, >, <=, >= که مقدار اسکی دو کاراکتر را مورد بررسی قرار میدهد. الحاق رشته ها + ، که رشته دومی را در انتهای رشته اول میچسباند. بازهم یک مثال که عبارت زیر false است: ('a' = 'A') برای گرفتن کد اسکی یک کاراکتر از تابع ord استفاده میشود و برعکس برای تبدیل کداسکی به کاراکتر معادل از تابع chr استفاده میکنیم که در ادامه توضیح داده خواهند شد. نوع Integer که می تواند مقدار عددی در رنج -2,147,483,647 and 2,147,483,647 را به ان نسبت داد.عملگرهای مورد استفاده برروی این نوع : عملگرهای مقایسه ای =, <>, <, >, <=, >= عملگرهای جمع و تفریق +, - عملگرهای ضرب و تقسیم *, /, div, mod (هیچ تفاوتی بین / وdiv وجود ندارد) عملگرهای شیفت shl, shr نوع String برای متون استفاده میشود.در دلفی String را میتوان بعنوان آرایه ای از کاراکترها در نظر گرفت و با آن بصورت آرایه رفتار کرد ولی در MIDletPascal اینطور نیست. عملگرهای مقایسه ای =, <> (به کارکترهای بزرگ و کوچک حساس است) عملگرهای الحاقی + به مثال زیر توجه کنید: کد: var text: string; در این مثال ما زمان را نمایش میدهیم.میبینید که رشته در ' (single-quote) و برای نمایش خود کاراکتر single-quote آن را دوبار تکرار کرده است. نوع داده ای Image در حافظه قرار دارد که میتوان توسط تابع loadImage عکسی را در متغیری از این نوع لود کرد. نوع real برا نمایش اعداد حقیقی استفاده میشوند.اعمالی که می توان برروی این نوع داده انجام داد: اعمال مقایسه ای =, <>, <, >, <=, >= اعمال جمع و تفریق +, - اعمال ضرب و تقسیم *, / نوع داده ای Command که برای ساخت منو ها می باشد ودر ادمه بیشتر توضیح داده خواهد شد. نوع داده ای RecordStore همان فایل در سیستم خودمان محسوب میشود.برنامه ها تنظیمات و داده های موردنیازشان در در recordstore ذخیره میکنند که در اجراهای بعد می توانند آنهارا بازیابی نمایند.هر برنامه فقط یک recordstore دارد که ساختار آن شبیه آرایه است و دارای index است برای برنامه های موبایل که اکثرا کرک میکنم و چندتایی رو روی فروم قرار دادم از record برای ذخیره سریال و چک کردن استفاده میکنند که بهترین و مطمئن ترین سرنخ برای رسیدن به هدف:P نوع داده ای Http : باMIDletPascal می توان یک ارتباط ساده HTTP را داشت.در یک ارتباط Http می بایست پارامترهایی را مقداردهی کنید.که ترتیب عملیات یک ارتباط به شرح زیر است(life cycle):
یک نمونه سورس که می توانید برای درک بهتر مسئله در زیر ببنید: کد: var conn: http; نوع Resource که می توانید فایل هایی را بعنوان ریسورس در برنامه داشته باشید و درهنگام اجرا از آنها استفاده نمایید. فکر کنم امروز فقط نشستم واس نوشتن آموزش RE: برنامه نویسی J2me برای موبایل با دلفی - Oep - 02-28-2012 نوع های مرکب : نوع Record :در این نوع شما می توانید مجموع از اوناع متغیرها را داشته باشید.بعنوان مثال شما یک بازی نوشته اید که قهرمان این بازی را کاربر کنترل می کند پس شما باید یک record تعریف نمایید که مختصات آن را درصفحه و مقدار جان باقی مانده را در خود نگه دارد.مانند : کد: type heroType = record برای ساختن یک نمونه از record بالا بدین صورت می نویسیم : کد: var hero: heroType; و همچنین می توانید پارامترهای ورودی یک روتین را از این نوع تعریف نمایید : کد: function isHeroDead(hero: heroType): boolean; record نیز می تواند بجای کلمه کلیدی type از var نیز استفاده نمایید : کد: var hero: record با قرار دادن dot می توانید به داده های record تعریف شده دسترسی پیدا کنید: کد: ... و نکته دیگر در مورد این نوع داده ای که شما نمی توانید مستقیما دونوع متفاوت تعریف شده از record درون هم کپی کنید و یا انتساب دهید.بلکه می بایست مقدارهای داخلی آنها را کپی نمایید. کد: var a, b: record نوع Array : آرایه ها بدین صورت تعریف میشوند : کد: type chessFieldType = array[1..8, 1..8] of integer; برای تعریف یک آرایه 8*8 که یک آرایه دوبعدی میشود بدین صورت انجام میشود : کد: type chessFieldType = array[1..8, 1..8] of integer; که برای ساده ترشدن دوخط کد بالا معادل تکه کد زیر است: کد: var chessField: array[1..8, 1..8] of integer; در مثال زیر خانه های خالی از جدول شطرنج مان را میشماریم : کد: type chessFieldType = array[1..8, 1..8] of integer; می توان آرایه های چند بعدی داشته باشید ولی به این نکته توجه کنید که آرایه های بعد زیاد حافظه زیادی را اشغال می کنند. RE: برنامه نویسی J2me برای موبایل با دلفی - Oep - 02-28-2012 توابع General این تابع برای ایجاد تاخیر است که زمان تاخیر برحسب میلی ثانیه بعنوان پارامترورودی تابع محسوب میشود. در مثال زیر یک پیغام به مدت 2ثانیه برروی صفحه نمایش داده میشود و بعد برنامه بسته خواهد شد.یک نکته قابل ذکر : کسانی که با Turbo c و کلا برنامه های کنسول از خانواده c زا کار کرده باشند می دانند که برنامه به طور خودکار بعد اجرا بسته میشود و برای دیدن خروجی برنامه باید از دستوری به نام getch() استفاده کنند.این قضیه هم در اینجا اتفاق می افتد که می بایست عملی مانند getch() را در اینجا پیاده سازی کنیم. کد: procedure delay(millis: integer); این تابع نیز برای گرفتن مشخصاتی از سیستم جاوا گوشی می باشد.که برای اطلاعات بیشتر می توانید از داکیومنت های موجود جاوا استفاده نمایید. کد: function getProperty(propertyName: string): string; برای پایان داده کار برنامه است. کد: procedure halt; برای انجام دادن بایت کدهای جاوا است.بایت کدهای مورد نظرتان را که می خواهید اجرا شوند باید بعنوان پارامتر به این تابع بفرستید.مثال : کد: procedure inline(java_bytecode_statements); مشخص میکند که آیا MIDlet حالت توقف بوجود آمده است یا نه؟ حالت توقف می تواند هنگام داشتن یک تماس ورودی اتفاق بیفتد.که MIDlet به حالت توقف رفته بعد از پاسخ دادن به تماس به حالت resume در خواهد آمد.اگر یک بازی نوشته ایم پس هنگامیکه MIDlet به حالت توقف در آمد بازی مانیز باید متوقف شود.در تکه کد زیر این حالت را پیش بینی کرده و کد آن را نوشته ایم: کد: function isMidletPaused: boolean; کدهای Debug ورودی این تابع یک شرط است درست بودن و یا نبودن آن را در پنجره debug ببینید.مثال: کد: procedure assert(cond: boolean); RE: برنامه نویسی J2me برای موبایل با دلفی - Oep - 02-28-2012 کدهای Drawing طول صفحه نمایش را به پیکسل برمیگرداند. کد: function getHeight: integer; عرض صفحه نمایش را به پیکسل برمیگرداند. کد: function getWidth: integer; برای تنظیم رنگ است که قل از اعمال ترسیم می بایست توسط این دستور رنگ موردنظرمان را تنظیم نماییم: هرکدام از ورودی ها عددی بین 0-255 می گیرد ورودی (255,255,255) رنگ سفید را مشخص مینماید. کد: procedure setColor(red, green, blue:integer); این تابع برای رسم یک قوس و کمان است. 'startAngle شروع و arcAngle درجه را مشخص می کند 0درجه در مکان عدد سه ساعت است و 90درجه در مکان عدد 12 ساعت است .مثال : کد: procedure drawArc(x, y, width, height, startAngle, arcAngle: integer); برای ترسیم یک بیضی درون صفحه نمایش.مثال : کد: procedure drawEllipse(x, y, width, height: integer); برای ترسیم یک عکس که از مختصات x,y ترسیم شروع میشود: کد: procedure drawImage(img: image; x, y: integer); برای کشیدن یک خط بین دو نقطه ('x1', 'y1')و ('x2', 'y2'). کد: procedure drawLine(x1, y1, x2, y2: integer); برای ترسیم خط بیرونی یک مستطیل .مانند: کد: procedure drawRect(x, y, width, height: integer); ترسیم مستطیل با گوشه های گرد. کد: procedure drawRoundRect(x, y, width, height, arcWidth, arcHeight: integer); متن درون بافر text را برروی صفحه نمایش نشان میدهد کد: procedure drawText(text: string, xPos, yPos: integer); ترسیم بیضی توپر. کد: procedure fillEllipse(x, y, width, height: integer); ترسیم یک مستطیل توپر. کد: procedure fillRect(x, y, width, height: integer); ترسیم مستطیل توپر با گوشه های گرد. کد: procedure fillRoundRect(x, y, width, height, arcWidth, arcHeight: integer); گرفتن هرکدام از رنگهای قرمز و آبی و سبز از رنگ RGB که برای آخرین بار ست شده است.توسط تابع Setcolor رنگ های ست میشوند برای رنگ متن ها،پرکردن اشکال هندسی و... کد: function getColorRed: integer; طول یک عکس به پیکسل برمیگرداند. کد: function getImageHeight(img: image): integer; عرض یک عکس را به پیکسل برمیگرداند. کد: function getImageWidth(img: image): integer; طول و عرض متن نمایش داده شده به فونت جاری را به پیکسل بر میگرداند. کد: function getStringHeight(text: string): integer; ایجاد یک عکس با مختصات تعیین شده از بوم رنگ شده تان. کد: function ImageFromCanvas(x: integer; y: integer; width: integer; height: integer ): image; ایجاد یک عکس با مختصات تعیین شده از عکسی دیگر که برای برش عکس ها جالب است. کد: function ImageFromImage(sourceImg: image; x: integer; y: integer; width: integer; height: integer ): image; اگر دستگاه قادر به نمایش رنگ موردنظرمان باشد مقدار true بر میگرداند. کد: function isColorDisplay:boolean; برای نمایش عکس از ریسورس.مثال : کد: function loadImage(resource: string): image تغییر رنگ یک پیکسل از صفحه نمایش: کد: procedure plot(x, y:integer); تمام دستورات ترسیم مانند drawLine, drawText, fillRect و ... بطور مستقیم برروی صفحه نمایش اعمال نمیشوند که off-screen buffer برروی صفحه نمایش نشان داده میشوند.این دستور بطوری صفحه نمایش را بروز کرده تا تغییرات اعمال شده را نمایش دهد. کد: procedure repaint; اعمال فونت پیش فرض که اگر کاربر فونتی را تعیین کرده باشد به حالت پیش فرض برخواهد گشت. کد: procedure setDefaultFont; برای تعیین فونت صفحه بکاربرده میشود. کد: procedure setFont(fontFace, fontStyle, fontSize); • FONT_FACE_SYSTEM • FONT_FACE_MONOSPACE • FONT_FACE_PROPORTIONAL پارامتر fontStyle هم مقادیرزیر را میتواند بگیر: • FONT_STYLE_PLAIN • FONT_STYLE_BOLD • FONT_STYLE_ITALIC • FONT_STYLE_UNDERLINED برای استفاده چندتای این گزینه بدین صورت عمل میکنیم.مثلا میخواهیم فونت مان ضخیم و زیر خط دار باشد: (FONT_STYLE_BOLD or FONT_STYLE_UNDERLINE) و پارامتر fontSize نیز دارای مقدارهای زیر می باشد: • FONT_SIZE_SMALL • FONT_SIZE_MEDIUM • FONT_SIZE_LARGE مثال : کد: begin RE: برنامه نویسی J2me برای موبایل با دلفی - Oep - 03-09-2012 کد: function getKeyClicked: integer; • KE_KEY0 • KE_KEY1 • KE_KEY2 • KE_KEY3 • KE_KEY4 • KE_KEY5 • KE_KEY6 • KE_KEY7 • KE_KEY8 • KE_KEY9 • KE_STAR • KE_POUND درمثال زیر تا کلید * را فشارندهید از برنامه خارج نخواهد شد که همان شبیه GETCH() عمل میکند: کد: begin کد: function keyToAction(keyCode: integer): integer; • GA_NONE • GA_UP • GA_DOWN • GA_LEFT • GA_RIGHT • GA_FIRE • GA_GAMEA • GA_GAMEB • GA_GAMEC • GA_GAMED در مثال زیر وقتی کلید fire زده شود برنامه بسته خواهد شد: کد: begin RE: برنامه نویسی J2me برای موبایل با دلفی - Oep - 03-13-2012 دستورات کار با time: کد: function getCurrentTime: integer; کد: function getSecond(time: integer): integer; کد: function getHour(time: integer): integer; کد: function getMinute(time: integer): integer; کد: var time: integer; کد: function getDay(time: integer): integer; کد: function getMonth(time: integer): integer; کد: function getWeekDay(time: integer): integer; کد: function getYear(time: integer): integer; کد: function getYearDay(time: integer): integer; کد: function getRelativeTimeMs: integer; کد: ... RE: برنامه نویسی J2me برای موبایل با دلفی - Oep - 03-21-2012 دستورات ریاضی : کد: function abs(n: integer): integer; کد: function acos(num: real): real; کد: function asin(num: real): real; کد: function cos(num: real): real; کد: function sin(num: real): real; کد: function tan(num: real): real; کد: function frac(num: real): real; کد: function log(num: real): real; کد: function log10(num: real): real; کد: function pow(a, b: real): real; کد: function rabs(num: real): real; کد: function random(n: integer): integer; کد: procedure randomize; کد: function sqr(n: integer): integer; کد: function sqrt(num: real): real; کد: function toDegrees(num: real): real; کد: function toRadians(num: real): real; کد: function trunc(num: real):integer; |