شبیه ساز موبایل یا همان Emulator در Visual Studio امکاناتی دارد که اکثر ما از آن بی خبریم. این امکانات برنامه نویسی Pocket PC را آسان می سازد.
1- برای ارتباط با دستگاههایی که ویندوز موبایل دارند از نرم افزار Microsoft ActiveSync استفاده می شود که با نصب آن پوشه ای به نام Mobile به My Computer اضافه می شود. با اتصال دستگاه به کامپیوتر و برقراری ارتباط فایلهای دستگاه را میتوان در این پوشه مشاهده کرد.
این نرم افزار از مسیر زیر قابل دانلود است:
كد:
كد:کد:http://download.microsoft.com/download/5/4/6/5467c040-a935-4987-aa30-5dcbc36a57db/setup.msi
http://www.microsoft.com/downloads/d...DisplayLang=en
نکته اینجاست که بوسیله این نرم افزار با شبیه ساز موبایل هم می توان ارتباط برقرار کرد و فایلهای آن را مشاهده کرد و فایلی را از کامپیوتر در شبیه ساز کپی کرد (مثلا بانک Sdf) و بالعکس.
برای اینکار کافیست Visual Studio را اجرا کنید سپس از منوی Tools بر روی گزینه Device Emulator Manager کلیک کنید. در پنجره ای که ظاهر می شود Pocket PC 2003 SE Emulator را انتخاب کنید، بر روی آن کلیک راست کنید و بر روی گزینه Connect کلیک کنید تا شبیه ساز اجرا شود.
حال دوباره در Device Emulator Manager بر روی Pocket PC 2003 SE Emulator کلیک راست کنید و بر روی گزینه Cradle کلیک کنید تا نرم افزار ActiveSync با شبیه ساز ارتباط برقرار کند.
اگر برای بار اول اینکار را انجام دهید پنجره Set Up a Partnership ظاهر می شود. گزینه دوم را در این پنجره انتخاب کنید و دکمه Next را بزنید.
الان شما می توانید در My Computer و در پوشه Mobile فایلهای شبیه ساز را ببینید.
2- همچنین برای دیدن فایلهای شبیه ساز در خود شبیه ساز:
در شبیه ساز روی منوی Start سپس گزینه Settings کلیک کنید. در پنجره ظاهر شده روی Menus کلیک کنید. در لیست ظاهر شده تیک همه گزینه ها را بردارید و فقط گزینه File Explorer را تیک بزنید. بر روی دکمه OK در گوشه راست و بالای صفحه شبیه ساز کلیک کنید.
اکنون گزینه File Explorer به منوی Start شبیه ساز اضافه شده است. با کلیک بر روی آن Explorer شبیه ساز (یا My Device آن) اجرا می شود.
اگر در برنامه تان فایلی (مثلا بانک sdf) را در مسیری ایجاد کرده اید. حالا می توانید ایجاد شدن آن را ببینید.
3- برنامه شبیه ساز سه منو دارد به نامهای File و Flash و Help.
در منوی File گزینه اولی یعنی Save State and Exit وضعیت فعلی شبیه ساز را ذخیره می کند و از آن خارج می شود. مثلا اگر فایلی در شبیه ساز کپی کرده باشید دفعه بعد که شبیه ساز را اجرا کنید آن فایل در شبیه ساز موجود است.
گزینه دوم یعنی Clear Saved State شبیه ساز را به حالت اولیه درآورده و وضعیتهای ذخیره شده را پاک می کند. اگر بلایی بر سر شبیه ساز آورده باشید! و تنظیمات آن را به هم ریخته باشید، می توانید از این گزینه استفاده کنید.
گزینه سوم به نام Reset دو زیر گزینه دارد: Soft و Hard که اولی برای ریست نرم افزاری و دومی ریست سخت افزاری شبیه ساز است. Soft Reset مثل Restart کردن کامپیوتر است و Hard Reset مثل عوض کردن ویندوز کامپیوتر و نصب ویندوز جدید.
اگر برنامه ای هنگ کرده باشد یا فایلی را نمی توانید حذف کنید و یا تغییر نام دهید، از Soft Reset استفاده کنید. و اگر می خواهید تمام تنظیماتی که به شبیه ساز اعمال کرده اید پاک شود و تمام برنامه های نصب شده حذف شوند، از Hard Reset استفاده کنید.
4- شبیه ساز موبایل فونتهای فارسی را به شکل مربع نشان می دهد. برای رفع این مشکل به پوشه Fonts در پوشه Windows کامپیوترتان رفته و فونتهای Tahoma و Tahoma Bold را کپی کنید و داخل پوشه Windows شبیه ساز Replace کنید و شبیه ساز را Soft Reset کنید. حال کلمات فارسی نمایش داده میشوند اما حروف آن جدا از هم و برعکس. برای رفع این مشکل هم در نرم افزارتان می توانید از روش زیر بهره ببرید:
کد کمکی ( فایل xml ) زیر اولا رشته رو برعکس می کند، دوما موقعیت کاراکتر رو تشخیص می دهد ( هر کاراکتر فارسی 4 تا موقعیت توی یه رشته داره : Alone - End - First - Middle ) و بعد اون کاراکتر رو با کاراکتر فارسی مناسب عوض کند و یک رشته جدید بسازد، در ضمن SubString های Ascii دوباره باید برعکس شوند.
کد کلاس زیر، متد Persianize یک رشته ( برعکس و جدا ) رو می گیرد و آن را فیکس می کند.
کد کلاس :
كد:
EndClassکد:Imports System.Data PublicClass PersianChar Dim MapDS AsNew DataSet Dim MapTable AsNew DataTable Dim _Font10Reg AsNew System.Drawing.Font(System.Drawing.FontFamily.GenericSansSerif, 10, FontStyle.Regular) Dim _Font10Bold AsNew System.Drawing.Font(System.Drawing.FontFamily.GenericSansSerif, 10, FontStyle.Bold) Dim _Font12Reg AsNew System.Drawing.Font(System.Drawing.FontFamily.GenericSansSerif, 12, FontStyle.Regular) Dim _Font12Bold AsNew System.Drawing.Font(System.Drawing.FontFamily.GenericSansSerif, 12, FontStyle.Bold) PublicReadOnlyProperty Font10Reg() AsObject Get Return _Font10Reg EndGet EndProperty PublicReadOnlyProperty Font10Bold() AsObject Get Return _Font10Bold EndGet EndProperty PublicReadOnlyProperty Font12Reg() AsObject Get Return _Font10Reg EndGet EndProperty PublicReadOnlyProperty Font12Bold() AsObject Get Return _Font12Bold EndGet EndProperty SubNew() Try MapDS.ReadXml("\My Documents\SETTINGS\Unicode_Mapping.xml") Catch ex As Exception MsgBox("Missing Unicode Mapping Table", MsgBoxStyle.Critical, "ARZANESH") EndTry MapTable = MapDS.Tables(0) EndSub PrivateFunction StringReverser(ByVal ST AsString) AsString Dim Temp AsString = "" Dim Reversed AsString = "" For i AsInteger = ST.Length - 1 To 0 Step -1 If IsAscii(ST.Chars(i)) And ST.Chars(i) <> " " Then While IsAscii(ST.Chars(i)) And ST.Chars(i) <> " " Temp = Temp + ST.Chars(i) If i = 0 Then ExitWhile EndIf If IsAscii(ST.Chars(i - 1)) And ST.Chars(i - 1) <> " " Then i = i - 1 Else ExitWhile EndIf EndWhile Me.MakeReverse(Temp) Reversed += Temp Temp = "" Else Reversed += ST.Chars(i) EndIf Next Return Reversed EndFunction PublicFunction CheckReturnIndex(ByVal Code AsString) AsInteger For i AsInteger = 0 To MapTable.Rows.Count - 1 If MapTable.Rows(i).Item(0) = Code Then Return i EndIf Next MsgBox("Can not find character : " & Code, MsgBoxStyle.Critical) Return 0 EndFunction PublicFunction Persianize(ByRef ST AsString) AsString Dim T1, TrueString AsString TrueString = "" Dim CharCode AsString Dim TrueChar AsChar Dim TableIndex, Position AsInteger T1 = ST Try For i AsInteger = 0 To T1.Length - 1 CharCode = Hex(GetCharCode(T1.Chars(i))) IfNot (Convert.ToInt32(CharCode, 16) <= 255 And Convert.ToInt32(CharCode, 16) >= 0) Then' Not ASCII TableIndex = Me.CheckReturnIndex(CharCode) Position = Me.TellPosition(T1, i) TrueChar = ChrW(Convrt.ToInt32(MapTable.Rows(TableIndex).Item(Position), 16)) TrueString = TrueString + TrueChar Else TrueString = TrueString + T1.Chars(i) EndIf 'MsgBox(CharCode & " => " & (MapTable.Rows(TableIndex).Item(Position))) Next Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Critical) EndTry ReturnMe.StringReverser(TrueString) EndFunction PublicFunction GetCharCode(ByVal Chr AsChar) AsInteger For i AsInteger = 0 To 65535 If Chr = ChrW(i) Then Return i ExitFunction EndIf Next EndFunction PrivateFunction TellPosition(ByVal ST AsString, ByVal Index AsInteger) AsInteger 'This Function Returns : ' 1 For "ALONE" CHARACTER ' 2 For "END" CHARACTER ' 3 For "FIRST" CHARACTER ' 4 For "MIDDLE" CHARACTER Dim Status AsInteger = 1 If Index = 0 Then If ST.Length = 1 Then Status = 1 : GoTo Final ' This string just have one char, so it's ALONE Else Status = 3 : GoTo Final ' This String have more than one char, so this is the FIRST EndIf EndIf If Index = ST.Length - 1 Then If ST.Chars(Index - 1) = " " Then Status = 1 : GoTo Final ' ALONE Else IfMe.UnjoinableWithNext(ST.Chars(Index - 1)) Then Status = 1 : GoTo Final ' ALONE Else Status = 2 : GoTo Final ' END EndIf EndIf EndIf If ST.Chars(Index - 1) = Chr(13) Or ST.Chars(Index - 1) = Chr(13) Then Status = 3 : GoTo Final ' FIRST EndIf If ST.Chars(Index - 1) = " " And ST.Chars(Index + 1) = " " Then Status = 1 : GoTo Final ' ALONE EndIf If ST.Chars(Index - 1) <> " " And ST.Chars(Index + 1) = " " Then IfMe.UnjoinableWithNext(ST.Chars(Index - 1)) Then Status = 1 : GoTo Final ' ALONE Else Status = 2 : GoTo Final ' END EndIf EndIf If ST.Chars(Index - 1) = " " And ST.Chars(Index + 1) <> " " Then Status = 3 : GoTo Final ' FIRST EndIf If ST.Chars(Index - 1) <> " " And ST.Chars(Index + 1) <> " " Then ' اگر کاراکتر وسط رشته بود باید ببینیم که آیا کاراکتر قبلی بهش می چسبه یا نه IfMe.UnjoinableWithNext(ST.Chars(Index - 1)) Then Status = 3 : GoTo Final ' FIRST Else Status = 4 : GoTo Final ' Middle EndIf EndIf Final: Return Status EndFunction PrivateFunction UnjoinableWithNext(ByVal Ch AsChar) AsBoolean Dim sc0, sc1, sc2, sc3, sc4, sc5, sc6, sc7, sc8, sc9, sc10 AsInteger'Special Chars Dim Code AsInteger = Me.GetCharCode(Ch) sc0 = Convert.ToInt32("625", 16) sc1 = Convert.ToInt32("627", 16) sc2 = Convert.ToInt32("62F", 16) sc3 = Convert.ToInt32("630", 16) sc4 = Convert.ToInt32("631", 16) sc5 = Convert.ToInt32("632", 16) sc6 = Convert.ToInt32("698", 16) sc7 = Convert.ToInt32("648", 16) sc8 = Convert.ToInt32("624", 16) sc9 = Convert.ToInt32("623", 16) SC10 = Convert.ToInt32("622", 16) SelectCase Code Case sc1, sc2, sc3, sc4, sc5, sc6, sc7, sc8, sc9, sc10 ReturnTrue CaseElse ReturnFalse EndSelect EndFunction Function IsAscii(ByVal CH AsChar) AsBoolean Dim Code AsInteger = Me.GetCharCode(CH) If Code >= 0 And Code <= 255 Then ReturnTrue Else ReturnFalse EndIf EndFunction Sub MakeReverse(ByRef ST AsString) Dim Temp AsString = "" For i AsInteger = ST.Length - 1 To 0 Step -1 Temp = Temp + ST.Chars(i) Next ST = Temp EndSub
5- برای استفاده از Sql Server در شبیه ساز هم باید Microsoft SQL Mobile نصب کنید که معمولا در دستگاههایی که ویندوز CE دارند نصب است.
بعد توی Visual Studio فایل بانک را می سازید (فایل با پسوند sdf.) و به دستگاه منتقل می کنید.
طریقه ساختن فایل هم اینطور است:
از منوی View در Visual Studio گزینه Server Explorer را انتخاب می کنید. بعد بر روی آیکون Connect to Database در قسمت Server Explorer کلیک می کنید. در قسمت Data Source دکمه change را می زنید و گزینه Microsoft SQL Server Mobile Edition را انتخاب می کنید و سپس در قسمت Connection Properties دکمه Create را کلیک می کنید و ...
شما ببینید که احتیاج شما برای استفاده از Database به صورت Online هست (یعنی هر لحطه DB روی Devive شما بخواهد با Server عمل Synchronize را انجام دهد ) یا اینکه Offline هست و می شود یک سری تراکنش ها Synchronization رو انجام داد. اگر Offline کار شما را راه می اندازد همانطور که گفته شد آن قسمت دیتابیس رو که لازم دارید در یک دیتاست بریزید و با استفاده از متد WriteXml دیتابیس رو روی فایل بریزید و توی Device با متد ReadXml آن رابخوانید.
اما اگز می خواین که Online کار کنید باید
Microsoft Sql Server 2005 Mobile Edition Server Tools یا Microsoft Sql Server 2005 Compact Edition را بر روی دستگاه خود نصب کنید.
SQL Server Mobile Edition برای دستگاه هایی که Windows Mobile دارن و Sql Server Compact Edition برای دستگاه هایی هست که Windows CE دارد. فایل ها رو با توجه به OS دستگاهتون دانلود کنید.
هر کدوم این نرم افزارها شامل دو قسمت Server tools و Device SDK هستند. Server tools برای استفاده از این دیتابیس ها روی PC و Device SDK برای نصب sql server روی Device هستند.
بعد از دنلود فایل های مورد نیاز از ایت microsoft و نصب آنها باید سه فایل CAB به نام های
sqlce30.wce5.armv4i
sqlce30.repl.wce5.armv4i
sqlce30.dev.ENU.wce5.armv4i
را از مسیر
C:\Program Files\Microsoft SQL Server 2005 Mobile Edition\Device\Mobile\v3.0\wce500\armv4i
یا
C:\Program Filess\Microsoft Sql Sevrer Compact Edition\v3.1\SDK\bin\wce500\armv4i
رو روی Device خوتان کپی کنید و از روی خود Device این فایل های CAB رو اجرا کنید. بعد SQL Server CE 2.0 روی Device شما نصب می شود.
البته ARMv4i نوع پردازنده دستگاه مورد مثال بود و شما باید برای دستگاه خودتان از فولدر مربوط به همون نوع پردازنده فایل های CAB را کپی کنید.
نوع پردازنده شما هم موقع Deploy کردن یک برنامه از visual studio روی Device تون مشخص می شود و در Status bar پایین صفحه یک مسیر نوشته می شود که آن مسیر نشان می دهد دستگاه شما چه نوع پردازنده ای دارد.
بعد از نصب اگر درست نصب کرده باشید از روی کامپیوتر خودتان می توانید یه پایگاه داده جدید روی Device بسازید که یک فایل با فرمت SDF است.
بعد از همه این داستان ها تازه کار شروع می شه و باید یک Publication تعریف کنید و بعد هم Subscription و Login و این داستانها که تو Site زیر نوشته است :
كد:
http://www.softwaregreenhouse.com/Ho...w/Default.aspx
در آخر باز هم می گم که اگر کار شما Offline هست Xml خیلی راحت تر می باشد.