PDA

توجه ! این یک نسخه آرشیو شده می باشد و در این حالت شما عکسی را مشاهده نمی کنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : برنامه نویسی به کمک شبیه ساز پاکت پی سی در Visual Basic



TAHA
09-21-2009, 09:28 PM
شبیه ساز موبایل یا همان 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/details.aspx?FamilyID=06111a3a-a651-4745-88ef-3d48091a390b&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 یک رشته ( برعکس و جدا ) رو می گیرد و آن را فیکس می کند.
کد کلاس :

كد:

Imports System.Data
PublicClass PersianChar
Dim MapDS AsNew DataSet
Dim MapTable AsNew DataTable
Dim _Font10Reg AsNew System.Drawing.Font(System.Drawing.FontFamily.Gene ricSansSerif, 10, FontStyle.Regular)
Dim _Font10Bold AsNew System.Drawing.Font(System.Drawing.FontFamily.Gene ricSansSerif, 10, FontStyle.Bold)
Dim _Font12Reg AsNew System.Drawing.Font(System.Drawing.FontFamily.Gene ricSansSerif, 12, FontStyle.Regular)
Dim _Font12Bold AsNew System.Drawing.Font(System.Drawing.FontFamily.Gene ricSansSerif, 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
EndClass
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 خیلی راحت تر می باشد.