Tìm hiểu về Pocket PC và xây dựng chương trình ứng dụng

Chương 1: Tổng quan về Pocket PC (PDA) 1.1 Giới thiệu về Pocket PC 1.2 Môi trường phát triển ứng dụng Chương 2: Các công cụ lập trình với PDA 2.1 Giới thiệu về C# 2.2 Các công cụ lập trình PDA Chương 3: Xây dựng ứng dụng tra cứu lịch xuất hành trên Pocket PC 3.1 Vai trò lịch xuất hành 3.2 Giới thiệu phương pháp lập lịnh xuất hành 3.3 Xây dựng Modul tra cứu ngày 3.4 Xây dựng Modul tra cứu giờ 3.5 Xây dựng Modul chuyển đổi ngày 3.6 Các môi trường thi hành ứng dụng 3.7 Cài đặt và cấu hình chương trình cho thiết bị giả lập Giáo viên HD: ThS. Nguyễn Công Nhật Lời nói đầu 1. Lý do chọn đề tài. Công nghệ thông tin đang trở thành một phần quan trọng của cuộc sống. Các thiết bị kĩ thuật cao ngày càng gần gũi với hoạt động của con người. Đặc biệt những năm gần đây, các thiết bị không dây- với ưu thế nhỏ gọn, dễ vận chuyển đã chứng tỏ được lợi ích to lớn cho người sử dụng. Trong đó điện thoại di động, với các chức năng liên lạc, nổi bật lên như một thiết bị “không thể thiếu” trong cuộc sống của nhiều người. Với sự phát triển nhanh chóng của công nghệ sản xuất thiết bị không dây, điện thoại di động đã trở thành phương tiện đa chức năng (nghe nhạc, chơi trò chơi, nhắc lịch làm việc) phục vụ nhu cầu của người sử dụng mọi lúc, mọi nơi. Ngày nay công nghệ thông tin đang ngày càng phát triển, có tác động ngày càng mạnh mẽ đến công việc cũng như cuộc sống của con người. Bắt đầu từ chiếc máy tính đầu thế kỉ 20 rồi đến chiếc máy vi tính và sau này là chiếc máy tính cá nhân đã tạo nên một công cuộc cách mạng trên tất cả các lĩnh vực của cuộc sống và khoa học giúp cho con người tăng được đáng kể tốc độ và năng suất làm việc của mình trong công sở. Hơn thế nữa, sự ra đời của các thiết bị cầm tay (handheld device) trong những năm đầu thập kỉ 80 còn tạo ra những điều kì diệu mới cho cuộc sống và công việc của mọi người. Việc phải mang một cái máy Fax cồng kềnh hay một quyển sách nhỏ để ghi số điện thoại và những công việc sẽ phải làm khi đi công tác đã khiến cho các nha kinh doanh phải rất khó khăn trong viếc liên lạc với thế giới xung quanh với những chiếc điện thoại cố định hay việc phải xử lí các công việc cần sự linh động hoặc với những công việc cần phải chia nhỏ để có thể làm việc mọi lúc mọi nơi. Và công nghệ di động ra đời giúp giải quyết các vấn đề này. các thiết bị tính toán di động có kiến trúc giống như máy để bàn hoàn toàn tương thích với các phần mềm có sẵn và có thể làm việc không cần đến nguồn điện trực tiếp trong nhiều giờ liền. Và trong số những thiết bị đó thì PDA và PocketPC nổi lên những đại diện mang đầy đủ các đặc tính thích hợp để đáp ứng nhu cầu của người sử dụng. 2. Mục đích nghiên cứu. Nghiên cứu các công cụ lập trình mobile và xây dựng ứng dụng tra cứu lịch xuất hành trên PC Pocket. 3. Bố cục luận văn. Nội dung gồm có 3 phần: Chương 1: Tổng quan về Pocket PC (PDA) 1.1 Giới thiệu về Pocket PC 1.2 Môi trường phát triển ứng dụng Chương 2: Các công cụ lập trình với PDA 2.1 Giới thiệu về C# 2.2 Các công cụ lập trình PDA Chương 3: Xây dựng ứng dụng tra cứu lịch xuất hành trên Pocket PC 3.1 Vai trò lịch xuất hành 3.2 Giới thiệu phương pháp lập lịnh xuất hành 3.3 Xây dựng Modul tra cứu ngày 3.4 Xây dựng Modul tra cứu giờ 3.5 Xây dựng Modul chuyển đổi ngày 3.6 Các môi trường thi hành ứng dụng 3.7 Cài đặt và cấu hình chương trình cho thiết bị giả lập 4. Kết quả đạt được Đề tài “Tìm hiểu về Pocket PC và xây dựng chương trình ứng dụng” xuất phát từ thực tế ngày nay khi các thiết bị di động ngày càng cải tiến và nhu cầu của con người ngày một cao. Chương trình được chạy trên thiết bị giả lập và có thể ứng dụng kết nối để chạy trên Pocket PC thật. Mặc dù đã có nhiều cố gắng, tìm hiểu các kiến thức đã học, kết hợp tra cứu các tài liệu chuyên ngành nhưng đề tài “ Tìm hiểu về Pocket PC và xây dựng chương trình ứng dụng” do hạn chế về mặt thời gian, khả năng và kinh

pdf85 trang | Chia sẻ: lvcdongnoi | Lượt xem: 2746 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Tìm hiểu về Pocket PC và xây dựng chương trình ứng dụng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
able[0].DeviceID, "IRDA_CHAT_SERVER"); m_IrDAClient.Connect(chatEndPoint); MessageBox.Show("Connected to chat server!", "Ready to chat"); m_Connected = true; break; } catch (SocketException exc) { } } // m_IrdaClient can now be read from or written to. Thiết lập một kết nối IrDA như là một máy chủ Để thiết lập kết nối IrDA như là một thiết bị, làm theo các bước sau: Bước 1: Tạo một thể hiện của IrDAListener, thông qua tên của thiết bị trong cấu trúc. Bước 2: Gọi phương thức Start() trên IrDAListener. Bước 3: Gọi phương thức IrDAListener.AcceptIrDAClient() để nhận một thể hiện của IrDAClient khi một ai đó kết nối. Bước 4: Sử dụng IrDAClient để giao tiếp với các thiết bị tham gia giao tiếp. Đọc dữ liệu từ một IrDAClient GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 40 Một IrDAClient được kết nối với các thiết bị ở xa cùng tham gia giao tiếp, khả năng đọc dữ liệu đạt được theo cách như nhau dù kết nối chủ hay khách, như sau: Bước 1: Tạo một StreamReader thông qua Stream đã liên kết cùng với IrDAClient trong cấu trúc StreamReader. Bước 2: Đọc dữ liệu từ StreamReader. Đọc dữ liệu từ IrDAClient: đoạn mã ví dụ: l_StreamReader = new StreamReader(this.m_IrDAClient.GetStream(), System.Text.Encoding.ASCII); // Read a line of text and paint it into a GUI this.lbInText.Items.Add(l_StreamReader.ReadLine()); l_StreamReader.Close(); Ghi dữ liệu vào IrDAClient Once an IrDAClient is connected to a remote party, writing data is achieved the same way whether connected as a server or as a client, as follows: Bước 1: Tạo StreamWriter thông qua Stream liên kết cùng IrDAClient trong cấu trúc StreamWriter. Bước 2: Ghi dữ liệu vào StreamWriter. Ghi dữ liệu vào IrDAClient: đoạn mã ví dụ: Sau đây là đoạn mã ví dụ lấy từ ứng dụng ví dụ IrDAChat. Đoạn mã viết một dòng văn bản, cái đó yêu lấy được từ giao diện người sử dụng, để luồng đạt được từ IrDAClient. // Grab a reference to the stream in the m_IrDAClient and send the // text to it. StreamWriter l_StreamWriter = new StreamWriter(this.m_IrDAClient.GetStream(), System.Text.Encoding.ASCII); l_StreamWriter.WriteLine(this.txtSendText.Text); l_StreamWriter.Close(); GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 41 2.1.6 Phát triển cho SmartPhone 2.1.6.1 Giới thiệu SmartPhone SmartPhone về bản chất là cell phone chạy hệ điều hành Pocket PC operating system. Để thuận tiện khi làm việc với các thiết bị nhỏ, SmartPhone trênh lệch so với chuẩn Pocket PC có hai cách quan trọng sau: • Kích cỡ màm hình cho SmartPhone là nhỏ hơn so vói các thiết bị chuẩn Pocket PC. Độ phân giải màn hình SmartPhone là 176 x 220, so sánh với chuẩn Pocket PC là 240x 320 • Màn hình SmartPhone không dễ hỏng. Thay đổi cơ bản kiểu dáng cái mà người sử dụng đưa thông tin vào ứng dụng. Người sử dụng tương tác cùng với ứng dụng bằng các nút vật lý trên điện thoại. Có hai cách khác nhau để phát triển cho SmartPhones. Sự khác biệt chủ yếu là màn hình nhỏ, yêu cầu người phát triển phải quan tâm đến màn hình thực cẩn thận. Nhưng thiếu màn hình sờ và bàn phím có nghĩa là : Trong phần này học cách phát triển cho SmartPhone bằng .NET Compact Framework trong khi làm việc xung quanh SmartPhone có sự hạn chế cố hữu của nó. 2.1.6.2 Phát triển SmartPhone bằng .NET Compact Framework Để phát triển cho SmartPhone, chúng ta phải cài đặt gói hỗ trợ cho Visual Studio. Cái này có sẵn ở Microsoft. Mặc định, Smart Device Extensions cho Visual Studio cho phép chúng ta tạo các dự án cho nền tảng Pocket PC hoặc Windows CE. Để thêm gói hỗ trợ cho SmartPhone, nền tảng SmartPhone được thêm vào như một kiểu dự án. Bởi vì SmartPhone add-on đơn giản là mở rộng cho Smart Device Extensions, những nhà phát triển có kinh nghiệm khi phát triển cho nền tảng SmartPhone như khi phát triển cho Pocket PC hoặc Windows CE. Khác nhau chính là có những emulators để deploy và điều khiển không hỗ trợ SmartPhone. Một số điều khiển sau không hỗ trợ: • Button GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 42 • Radio Button • ListBox • TabControl • DomainUpDown • NumericUpDown • TrackBar • ContextMenu • TooolBar • StatusBar • OpenFileDialog • InputPanel Khó khăn chính trong làm việc với SmartPhone là thiết kế một giao diện người sử dụng sử dụng các điều khiển có sẵn trong hộp công cụ ToolBox. Khả năng còn lại của .NET Compact Framework vẫn sẵn sàng cho ứng dụng của chúng ta. Đưa ra hệ điều hành SmartPhone hỗn hợp Nó rất quan trọng để nhận thức về sự khác nhau trong hệ thống file SmartPhone so với nền tảng Pocket PC và Windows CE đầy đủ. Trên SmartPhone chỉ có thư mục \Storage. Tất cả ứng dụng quản lý được đưa vào thưc mục \Storage, và chúng ta có thể tạo file vào thư mục \Storage. 2.1.6.3 Viết một ứng dụng cho SmartPhone - XMLDataSetViewer Chúng ta sẽ tiếp cận xậy dựng khung nhìn đơn giản XML DataSet. Khung nhìn XML DataSet đưa đến bảng đầu tiên trong DataSet. Hướng dẫn cung cấp cho người phát triển cùng với dự án SmartPhone đã tồn tại để thử nghiệm. Nó mô tả cách .NET Compact Framework phát triển có kinh nghiệm gần như không thay đổi khi làm việc với SmartPhone. Trước khi bắt đầu, chúng ta coi như SmartPhone add-on đã cài đặt. Các bước như sau: GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 43 Xây dựng DataSetViewer Bước 1: Chạy Visual Studio .NET và tạo mới một dự án. Chúng ta có thể chọn một ứng dụng Smart Device bằn C#. Bước 2: Sau đó các bước như chúng ta thao tác tạo một ứng dụng Smart Device, chấp nhận khi hỏi chấp nhận nền tảng, chọn SmartPhone của Pocket PC hoặc Windows CE. Bước này được đưa đến trong hình hình 6.1. Hình 2.4. Khi tạo một dự án mới, chọn nền tảng SmartPhone Bước 3: Khi chúng ta kết thúc thiết lập ứng dụng mới, chúng ta sẽ xem phần sửa Form và Toolbox, như trong hình 6.2. Hình cho thấy hầu hết những cái chính của dự án Pocket PC, ngoại trừ Form nhỏ hơn để mang lại cho màn hình nhỏ trên SmartPhones. Mặc dù một số điều khiển trong Toolbox bị mờ đi. GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 44 Hình 2.5 Sửa Form và hộp công cụ cho dự án SmartPhone chứa đựng một số điều khiển bị mờ đi. Bước 4: Kéo một DataGrid và một TextBox vào form. Tên của DataGrid là dgDataSet và tên của TextBox là txtXmlToLoad. Sử dụng giá trị mặc đinh cho TextBox là: \Storage\Program Files\XMLDataSetViewer_CS\SampleDataSet.xml. Bước 5: Thêm một tham chiếu đến DataGrid. Để làm điều này, bấm chuột phải vào tên solution (XmlDataSetView_CS) trong Solution Explorer. Sau đó chọn Add Reference. Chúng ta sẽ nhìn thấy hộp thoại trong đó có thể chọn rất nhiều các DLLs. Chọn nút Browse và di chuyển tới thư mục trong thư mục cài Visual Studio (C:\Program Files\Microsoft Visual Studio .NET 2003).Trong thư mục lựa chọn file CompactFrameworkSDK\v1.0.5000\Windows CE\ System.Windows.Forms.DataGrid.dll. Bước 6: Thêm đối tượng menu bằng cách chọn biểu tượng MainMenu1 xuất hiện dưới phần sửa form (form editor) trong IDE. Chúng ta có thể thêm các mục trong menu bằng cách bấm khe thêm menu mới sau đó gõ text cho menu. Ví dụ: Exit và Load XML. Bước 7: Thêm mã lệnh cho menu Exit bằng cách bấm đúp vào nó. IDE mang đếm phương thức nhận được gọi khi menu Exit được chọn. Thêm GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 45 mã lệnh: Application.Exit(); Bước 8: Thêm biến cho DataSet, có tên là m_DataSet, ở trên cùng của lớp Form1. Ví dụ, biến thành viên của lớp cho dự án như sau: public class Form1 : System.Windows.Forms.Form { private System.Windows.Forms.DataGrid dgDataSet; private System.Windows.Forms.MenuItem menuItem1; private System.Windows.Forms.MenuItem menuItem2; private System.Windows.Forms.TextBox txtXmlToLoad; private System.Windows.Forms.MainMenu mainMenu1; private DataSet m_DataSet; // Rest of class Form1 not shown here... Bước 9: Thêm mã lệnh cho menu Load XML bằng cách bấm đúp chuột vào mục đó và đưa vào đoạn mã lệnh như sau: if (this.m_DataSet == null) { this.m_DataSet = new DataSet(); } this.m_DataSet.Clear(); try { m_DataSet.ReadXml(this.txtXmlToLoad.Text); // Set up a DataView DataView l_DataView = new DataView(m_DataSet.Tables[0]); this.dgDataSet.DataSource = l_DataView; } catch (Exception ex) GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 46 { MessageBox.Show(ex.ToString()); } Bước 10: Thêm file mặc đinh XML, SampleDataSet.xml, vào ứng dụng. Để làm điều này, trong Solution Explorer bấm Ctrl+Alt+L và đưa chuột qua tên các solution (ví dụ, XMLDataSetViewer_CS). Bấm chuột phải và chọn Add, Add Existing Item, và sau đó chọn file SampleDataSet.xml. Chúng ta có thể tìm file này trong dự án XMLDataSetViewer. Bước 11: Xây dựng và triển khai ứng dụng. Nếu chúng ta không có bất kỳ thiết bị SmartPhone, có thể triển khai bằng các emulator trong Virtual Radio. Sử dụng XML DataSetViewer Sử dụng ứng dụng khác với sử dụng ứng dụng trên Pocket PC bởi vì không bàn phím sờ. Không có bàn phím, và một số nút. Để chọn file XML để nạp file vào ứng dụng, chúng ta phải trèn đầy đủ đường dẫn của file XML vào textbox. Để làm điều này, trước tiên tạo textbox vào ứng dụng. Một textbox được kích hoạt, chúng ta có thể di chuyển con trỏ cùng với con trỏ và trèn văn bản vào bằng phím số. Để nạp file XML, bấm menu phải, mục Load XML. 2.2. Các công cụ lập trình PDA 2.2.1 Giới thiệu. So với các nền tảng khác như Palm, Symbian, Linux thì Pocket PC được coi là dễ lập trình nhất do chạy trên Windows nên cách lập trình không khác cho Windows Destop cho PC là mấy.Nếu bạn đã từng lập trình cho PC bằng nền tảng .NET thì càng dễ, gần như không có mấy khác biệt. Hiện nay tuỳ thuộc vào công nghệ sử dụng, các ứng dụng phát triển cho Pocket PC được chia thành 2 dòng chính như sau: -Native application: Các ứng dụng được viết trên các ngôn ngữ lập trình không phảI .NET, như C, C++ và sử dụng các API của Windows. Ưu GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 47 điểm của các ứng dụng loại này là chương trình nhỏ gọn, khi cài đặt không cần thêm các thư viện đI kèm, có khi chỉ cần copy nguyên file EXE là chạy. Tuy nhiên, các ứng dụng kiểu này khó viết hơn, do sử dụng các ngôn ngữ lập trình bậc thấp hơn (C,C++). Chỉ các ứng dụng thực sự cần sự nhỏ gọn, như các driver, các chương trình thường trú như keyboard, system,… mới cần phát triển kiểu này. -.NET application: Như một sự cạnh tranh với sự phát triển ồ ạt và rất thành công của ngôn ngữ lập trình java, từ năm 2000 Microsoft đã bắt đầu phát triển nền tảng .NET cho các ứng dụng, với mục tiêu dùng một nền tảng ngôn ngữ lập trình cho nhiều nền tảng phần cứng, phần mềm khác nhau. Đến nay .NET vô cùng phát triển và tỏ rõ được thế mạnh của mình. Tất cả các hệ điều hành Windows XP, Windows 2000, 2003 server đến WinMobile, Windows for Smart Phone đều hỗ trợ rất tốt .NET. Nếu bạn đã tong lập trình .NET cho XP rồi thì chuyển sang Win Mobile chỉ cần tìm hiểu thêm một số thư viện làm việc với những đặc thù cho Mobile là đã có thể phát triển các ứng dụng được rồi. Bạn có thể lựa chọn ngôn ngữ lập trình cho mình như C# một ngôn ngữ lập trình mang phong cách vừa giống C++ lại vừa giống Java, hoặc chọn Visual Basic. Về cơ sở dữ liệu, bạn có thể chọn giữa SQL Server CE cho Professional hoặc XML cho dữ liệu nhỏ gọn, đơn giản. Ngoài ra còn một số nền tảng và ngôn ngữ lập trình của các hãng khác nữa nhưng không phổ biến 2.2.2 Công cụ lập trình. 2.2.2.1 Để lập trình .NET chúng ta cần có các công cụ sau: -Bộ phần mềm Visual Studio.NET phiên bản 2003 hoặc 2005 -Các thư viện nâng cao 2.2.2.2 Để phát triển các ứng dụng cho Windows Mobile chúng ta sẽ dùng các công cụ sau: -Windows Mobile SDK: tuỳ thuộc vào phiên bản của hệ điều hành Windows Mobile sẽ phát triển, bạn cần các SDK khác nhau. SDK sẽ cung cấp GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 48 tài liệu đầy đủ về API và các ví dụ cụ thể cho thiết bị tương ứng. Hiện nay thông dụng nhất là các bộ SDK sau: +Windows Mobile 5.0 SDK: Bộ SDK này đã được cài đặt mặc định khi cài Visual Studio 2008 hoặc Visual Studio 2005, được dùng để phát triển các ứng dụng cho Pocket PC/ Smartphone chạy hệ điều hành Windows Mobile 5.0. +Windows Mobile 6.0 SDK: Có thể tảI về tại trang Web của Microsoft dùng để phát triển ứng dụng cho Windows Mobile 6.0. Bộ SDK này có các công cụ sau: - FakeGPS: Giả lập dữ liệu GPS thông qua các API -Local Server Framework (FakeServer): giả lập Server. -Cellular Emulator: Giả lập các tính năng như GPRS, GSM,... -Quản lí thiết bị ảo: Device Emulator Manager (được cài đặt kèm theo Visual Studio 2008) -ActiveSync: kết nối Visual Studio với thiết bị thật để bẫy lỗi, kết nối với thiết bị ảo để hỗ trợ truy cập mạng từ thiết bị ảo. Tuỳ vào hệ điều hành trên máy tính mà dùng các chương trình sau: +Windows XP: dùng ActiveSync 4.5 +Windows Vista, WinServer 2008: dùng Windows Mobile Device Center Chúng ta sẽ tìm hiểu cách kết nối ActiveSync/Windows Mobile Device Center (WMDC) với thiết bị giả lập trong Device Emulator. Bước 1: Cấu hình cho ActiveSync/WMDC nhận kết nối. Cài đặt ActiveSync/WMDC rồi khởi động. ở đây minh hoạ bằng ActiveSync, với WMDC cũng tương tự. GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 49 Hình 2.6 Cài đặt ActiveSync Nhấn vào Connection settings, đánh dấu chọn Allow USB connections, trong danh sách Allow connections to one of the following chọn DMA, xong nhấn OK Hình 2.7 ActiveSync sẵn sàng kết nối thiết bị GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 50 Như vậy ActiveSync đã sẵn sàng chờ kết nối với thiết bị. Tiếp theo ta sẽ kết nối thiết bị ảo vào WMDC Bước 2: Mở Visual Studio 2008, vào tools-> Device Emulation Manager để khởi động Device Emulator Manaager. Bước 3: Trong cửa sổ này, chọn thiết bị muốn khởi động. Giả sử ở đây ta d Hình 2.8 Khởi động Device Emulator Manaager Hình 2.10 Chọn Connect GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 51 Bước 4: Sau khi đã khởi động được trình giả lập thiết bị, trở lại của sổ Device Emulator Manager, nhấn phảI vào USB Windows Mobile 5.0 Pocket PC R2 Emulator, chọn Cradle để kết nối thiết bị ảo với ActiveSync. Hình 2.11 Chọn Cradle để kết nối với thiết bị ảo ActiveSync Nếu kết nối thành công, cửa sổ ActiveSync sẽ xuất hiện, nhấn vào Connect without setting up your device để bắt đầu kết nối. (Nếu bạn muốn đồng bộ tài liệu trên thiết bị ảo và máy tính thì có thể nhấn vào Set up your device, nhưng thao tác này không bắt buộc). Trở lại với thiết bị ảo, một icon hiện lên báo cáo kết nối thành công. GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 52 Nếu máy tính có kết nối Internet, bạn có thể duyệt web ngay trên thiết bị ảo bằng cách vào Start->internet Explorer. 2.2.6.2.3 Bây giờ chúng ta xây dung một ứng dụng đơn giản để giải Sudoku trên Windows Mobiles 5.0 Khởi động Visual Studio 2005 vào file-> New->Project (Ctrl+Shift+N). Trong danh sách bên trái chọn Visual C#-> Smart Device (bạn có thể chọn ngôn ngữ Visual Basic nếu muốn. Mã nguồn trong phần này là C# nhưng có thể chuyển sang VB). Trong danh sách bên phải, chọn Smart Device Project, chọn nền tảng là .NET Framework 3.5, đặt tên Project là SudokuSolver. Nhấn OK để tạo Project mới, trong Form 1, đặt các thuộc tính Text bằng Sudoku Solver, MinimizeBox= False. Trong thanh menu phía dưới Form 1, gõ Default vào bên trái, Solve lt vào bên phải GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 53 Đặt một TextBox lên Form, đặt các thuộc tính cho TextBox: Name=”textBox1”, Dock=”fill”, Font=”Courier New 12pt, Bold”, Multiline=”true”. Người dùng sẽ nhập ô số Sudoku vào textBox1, nhấn Solve lt để giải. Nút Default dùng để hiện thị một ô Sudoku mặc định nào đó. Nhấn đúp lên nút Default và nhận đoạn Code sau: private void menuItem1_Click(object sender, EventArgs e) { textBox1.Text = @"800017060 407065000 905080310 300200001 070000040 500004008 086070504 000540206 050620009"; } Nhấn đúp vào nút Solve lt và nhập đoạn code sau: private void menuItem2_Click(object sender, EventArgs e) { if (textBox1.Text.Trim() == "") return; string s = textBox1.Text.Replace(" ", "").Replace("\t", ""); char[] tA = s.Replace("\r", "").Replace("\n", "").ToCharArray(); textBox1.Text = ""; int[] A = new int[tA.Length]; for (int i = 0; i < tA.Length; i++) A[i] = (int)(tA[i] - '0'); R(A); } Nhập thêm 2 hàm sau để hiển thị kết quả: GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 54 private void R(int[] A) { for (int i = 0; i <= 80; i++) { if (A[i] > 0) continue; ArrayList aL = new ArrayList(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }); for (int j = 0; j <= 80; j++) if (j / 9 == i / 9 || j % 9 == i % 9 || (j / 27 == i / 27 && (j % 9) / 3 == (i % 9) / 3)) aL.Remove(A[j]); foreach (int k in aL) { A[i] = k; R(A); } A[i] = 0; return; } print(A); } private void print(int[] A) { string s = ""; for (int i = 0; i <= 80; i++) { s += A[i] + " "; if (i % 3 == 2) s += " "; if (i % 9 == 8) s += "\r\n"; if (i % 27 == 26) s += "\r\n"; } textBox1.Text = s; } Nhấn F5 để chạy chương trình, chọn USB Windows Mobile 5.0 Pocket PC R2 Emulator, rồi nhấn Deploy để triển khai chương trình này trên thiết bị ảo. GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 55 Sau khi Deploy, chương trình đã chạy. Nhấn Default, rồi Solvelt để xem kết quả, sử dụng nút OK để thoát. GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 56 Chương III: Xây dựng ứng dụng tra cứu lịch xuất hành trên PC Pocket 3.1 Vai trò lịch xuất hành Vì sao tục chọn ngày chọn giờ tồn tại lâu đời? Bởi nó xuất phát từ bản năng trở thành tâm lý phổ biến trong quần chúng, mọi việc làm có thành bại. Không phải mọi người đều tin rằng yếu tố quyết định sự thành bại là do chọn ngày chọn giờ. Có người không tin vào thuật chiêm tinh, cho đó là điều nhảm nhí, nhưng chiều theo tâm lý chung của nhiều người trong gia đình họ hàng, xét thấy chẳng có hại gì, nên cũng chọn ngày chọn giờ. Đối với một người trong một năm, năm năm, làm sao tránh khỏi rủi ro bất ngờ, huống gì đối với cả nhà, cả họ. Hễ khi ai đó xảy ra tai nạn, họ đổ lỗi cho người chủ sự báng bổ, không chịu chọn ngày, chọn hướng. Chọn ngày, giờ là một tục lệ biểu hiện sự thành kính, thận trọng, nghiêm trang, không tuỳ tiện, không cẩu thả trước, trong và sau khi tiến hành một công trình, do đó dễ được sự đồng tình của những người có liên quan, đối tác. Thuật chiêm tinh đúng hay sai, luận thuyết mình tuân theo đáng tin cậy hay không, chỉ có những người đi sâu nghiên cứu mới xác định được, tuy rằng “vô sư, vô sách, quỷ thần bất trách”, nhưng có vẫn còn hơn không, nếu sai sót gì đổ lỗi cho thầy, đã có thầy mang tội, người chủ sự đỡ lo. 3.2 Giới thiệu phương pháp lập trình xuất hành 3.2.1 Chọn ngày tốt. Bảng 1: Tháng 1-4-7-10 Âm lịch Kim dương + Đạo Tặc - Thuần Dương + Đường Phong + Kim Thổ - Hảo Thượng + 6 5 4 1 2 3 12 11 10 7 8 9 GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 57 18 17 16 13 14 15 24 23 22 19 20 21 30 29 28 25 26 27 • Ngày đường phong: Rất tốt, cầu tài như ý, có quý nhân phù trợ. • Ngày kim thổ: Ra đi lỡ tàu xe, ra đi mất tiền của. • Kim dương: Xuất hành tốt, quý nhân phù trợ, tài lộc thông suốt, thưa kiện dễ thắng. • Thuần dương: Xuất hành tốt, lúc về cũng tốt, gặp nhiều thuận lợi. Quí nhân phù trợ, cầu tài, tranh luân thắng lợi. • Đạo tặc: Rất xấu, dễ tai nạn, mất của. • Hảo thượng: Xuất hành thuận lợi, phúc phẩm vinh quang, gặp người vừa long, làm việc như ý. Chú ý: Ký hiệu (+) là tốt (-) là xấu. Bảng 2: Tháng 2-5-8-11 Âm lịch Thiên Đạo - Thiên Dương + Thiên Hầu - Thiên Dương - Thiên Môn + Thiên Đường + Thiên Tài + Thiên Tặc _ 1 8 7 6 2 3 4 5 9 16 15 14 10 11 12 13 17 - - 22 18 19 20 21 25 24 23 30 26 27 28 29 • Ngày Thiên đạo: Xuất hành, cầu tài nên tránh, dù được cũng tốn kém, dễ thất lý hay thua cuộc. GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 58 • Ngày Thiên môn: Xuất hành và mọi việc đều tốt, cầu được, ước thấy, dễ thành đạt. • Ngày Thiên đường: Xuất hành gặp quí nhân phù trợ, nhiều may mắn, buôn bán nên đi xa. • Ngày Thiên tài: Xuất hành cấu tài thắng lợi, mọi việc thuận lợi. • Ngày Thiên tặc: Mọi việc đều rất xấu, đề phòng mất của. • Ngày Thiên dương: Xuất hành tốt, cầu tài được tài, tìm vợ được vợ. • Ngày Thiên hầu: Mọi việc đểu rất xấu, dễ xảy ra tai nạn, cãi cọ. • Ngày Thiên dương: Xuất hành tốt, mọi việc đều thuận lợi. Bảng 3: Tháng 3-6-9-12 Âm lịch Bạch hổ đầu + Bạch hổ kiên + Bạch hổ túc - Huyền Vũ - Chu phước - Thanh Long túc - Thanh Long kiên + Thanh Long đầu + 2 3 4 5 1 8 7 6 10 11 12 13 9 16 15 14 18 19 20 21 17 24 25 22 26 27 28 29 25 - - 30 • Ngày Chu phước: Xuất hành, cầu tài đều xấu, mất của thua kiện • Ngày Hổ đầu: Đi đâu cũng thông đạt, thuận lợi • Ngày Hổ kiên: Đi hướng Nam, Bắc tốt nhất, vạn sự như ý. • Ngày Huyền vũ: Xuất hành bất lợi. • Ngày Thanh long đầu: Cầu tài thắng lợi, mọi việc đều tốt, nên xuất hành vào sang sớm • Ngày Thanh long kiên: Xuất hành 4 phương đều tốt, trăm sự như ý. • Ngày Thanh long túc: Xuất hành không lợi, đi xa không nên, tài lộc khó khăn, kiện cáo dễ thua. • Ngày Bạch hổ túc: Cấm đi xa, mọi việc thất bại. GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 59 3.2.2 Chọn giờ tốt 3.2.2.1 Công thức tính giờ: Ngày âm + Tháng âm + Khắc định đi – 2 = Số dư 6 3.2.2.2 Cách tìm khắc: Có 6 khắc ¾ Khắc 1: Từ 11giờ đến 1 giờ (Tý, Ngọ) ¾ Khắc 2: Từ 2 giờ đến 3 giờ (Sửu, Mùi) ¾ Khắc 3: Từ 3 giờ đến 5 giờ (Dần, Thân) ¾ Khắc 4: Từ 5 giờ đến 7 giờ (Mão, Dậu) ¾ Khắc 5: Từ 7 giờ đến 9 giờ (Thìn, Tuất) ¾ Khắc 6: Từ 9 giờ đến 11 giờ (Tỵ, Hợi) Ví dụ 1: Định đi làm việc hệ trọng vào ngày 18 tháng 10 âm lịch và ra đi vào lúc 8 giờ sáng tức là khắc 5, ta dung công thức tìm giờ xem đi lúc 8 giờ có tốt không. Ngày 18 + Tháng 10 + Khắc định đi – 5 = Số thương 5 và còn dư 1 6 Số dư 1 là số dư tốt. Ví dụ 2: Xuất hành làm một việc gì quan trọng vào ngày 24 tháng 10 lúc 6 giờ tức là khắc 4. ta có công thức sau: Ngày 24 + Tháng 10 + Khắc định đi 4 – 2 = số thương 6 và số dư 0 6 Số dư 0 là rất xấu- nên chọn giờ khác * Số dư tốt xấu. • Dư số 1: Mọi việc đều tốt, cầu tài nên đi hướng Tây Nam, nhà cửa bình yên. GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 60 • Dư số 2; Niềm vui sẽ tới, xuất hành bình yên, cầu tài đi hướng Tây Nam, đi việc quan có nhiều may mắn, chăn nuôi thuận lợi, người đi có tin vui trở về. • Dư số 3: Sự nghiệp khó thành, cầu tài mờ mịt, kiện cáo nên hoãn lại, phòng ngừa cãi cọ. • Dư số 4: Đi đâu hãy hoãn lại, phòng ngừa bệnh tật. • Dư số 5: Rất nhiều may mắn, mọi việc thuận lợi, buôn bán trôi chảy, đàn bà có tin vui. Người đi xa sắp trở về nhà, mọi việc hoà hợp hạnh phúc, có bệnh sẽ chóng khoẻ mạnh • Dư số 0: Rất xấu, hay gặp ma quỷ. 3.3 Xây dựng Modul tra cứu ngày. Trong Visual Studio ta thiết kế 3 listView thể hiện 12 tháng âm lịch trong năm như sau: Với: Ký hiệu (+): là tốt; Ký hiệu (-) là xấu. Tháng 1-4-7-10 Âm lịch có bảng: Hình 3.1: Tên listView này là lv1 Tháng 2-5-8-11 Âm lịch có bảng Hình 3.2: Tên listView này là lv2 GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 61 Tháng 3-6-9-12 Âm lịch có bảng Hình 3.3: Tên listView này là lv3 Sử dụng comboBox với các giá trị Items từ 1-12 với thuộc tính DrowDownStyle là DrowDownList để khi nhập tháng sẽ hiện bảng tương ứng. Nó được kết nối bằng đoạn lệnh sau: int st=Convert.ToInt16(comboBox.Text.Trim ()); switch (st) { case 1: lv1.Visible = true; lv2.Visible = false; lv3.Visible = false; label1.Text = ""; break; case 4: lv1.Visible = true; lv2.Visible = false; lv3.Visible = false; label1.Text = ""; break; case 7: lv1.Visible = true; lv2.Visible = false; lv3.Visible = false; label1.Text = ""; break; case 10: GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 62 lv1.Visible = true; lv2.Visible = false; lv3.Visible = false; label1.Text = ""; break; case 2: lv2.Visible = true; lv1.Visible = false; lv3.Visible = false; label1.Text = ""; break; case 5: lv2.Visible = true; lv1.Visible = false; lv3.Visible = false; label1.Text = ""; break; case 8: lv2.Visible = true; lv1.Visible = false; lv3.Visible = false; label1.Text = ""; break; case 11: lv2.Visible = true; lv1.Visible = false; lv3.Visible = false; label1.Text = ""; break; case 3: lv3.Visible = true; lv2.Visible = false; lv1.Visible = false; label1.Text = ""; break; case 6: lv3.Visible = true; lv2.Visible = false; lv1.Visible = false; GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 63 label1.Text = ""; break; case 9: lv3.Visible = true; lv2.Visible = false; lv1.Visible = false; label1.Text = ""; break; case 12: lv3.Visible = true; lv2.Visible = false; lv1.Visible = false; label1.Text = ""; break; default: lv3.Visible = false; lv2.Visible = false; lv1.Visible = false; label1.Text = ""; break; } Chương trình khi chạy sẽ có giao diện như hình vẽ GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 64 Hình 3.4:Giao diện tra cứu ngày 3.4 Xây dựng Modul tra cứu giờ. Sử dụng công thức tính giờ: (Ngày âm+ tháng âm + khắc định đi – 2)/6 = Số dư. Với: Khắc 1: Từ 11h-1h; Khắc 2: Từ 1h -3h. Khắc 3: Từ 3h-5h. Khắc 4: Từ 5h-7h. Khắc 5: Từ 7h-9h. Khắc 6: Từ 9h-11h. Chúng ta sẽ sử dụng 3 conboBox để nhập tháng, nhập ngày, nhập giờ. Sẽ cho nhập tháng trước vì ứng với các tháng tương ứng sẽ có các ngày Câu lệnh để kết nối dữ kiện giữa tháng và ngày như sau: int n = getday(cbmonth); GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 65 cbday.Items.Clear(); for (int i = 1; i <= n; i++) { cbday.Items.Add(i); } Để nhập giờ hiển thị trên comboBox ta có đoạn lệnh sau: if (cbday.Text == "") { MessageBox.Show("Bạn phải chọn ngày xem"); return; } if(cbtime.Text =="11h - 1h") { khac = 1; } if (cbtime.Text == "1h - 3h") { khac = 2; } if (cbtime.Text == "3h - 5h") { khac = 3; } if (cbtime.Text == "5h - 7h") { khac = 4; } if (cbtime.Text == "7h - 9h") { khac = 5; } if (cbtime.Text == "9h - 11h") { khac = 6; } Giao diện chương trình có dạng như sau: GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 66 Hình 3.5: Giao diện tra cứu giờ 3.5 Xây dựng Modul tra cứu chuyển đổi ngày 3.5.1 Quy luật của âm lịch Việt Nam Âm lịch Việt Nam là một loại lịch thiên văn. Nó được tính toán dựa trên sự chuyển động của mặt trời, trái đất và mặt trăng. Ngày tháng âm lịch được tính dựa theo nguyên tắc sau: 1. Ngày đầu tiên của tháng âm lịch là ngày chứa điểm Sóc 2. Một năm bình thường có 12 tháng âm lịch, một năm nhuận có 13 tháng âm lịch 3. Đông chí luôn rơi vào tháng 11 âm lịch 4. Trong một năm nhuận, nếu có 1 tháng không có Trung khí thì tháng đó là tháng nhuận. Nếu nhiều tháng trong năm nhuận đều không có Trung khí thì chỉ tháng đầu tiên sau Đông chí là tháng nhuận 5. Việc tính toán dựa trên kinh tuyến 105° đông. GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 67 Sóc là thời điểm hội diện, đó là khi trái đất, mặt trăng và mặt trời nằm trên một đường thẳng và mặt trăng nằm giữa trái đất và mặt trời. (Như thế góc giữa mặt trăng và mặt trời bằng 0 độ). Gọi là “hội diện” vì mặt trăng và mặt trời ở cùng một hướng đối với trái đất. Chu kỳ của điểm Sóc là khoảng 29,5 ngày. Ngày chứa điểm Sóc được gọi là ngày Sóc, và đó là ngày bắt đâù tháng âm lịch. Trung khí là các điểm chia đường hoàng đạo thành 12 phần bằng nhau. Trong đó, bốn Trung khí giữa bốn mùa là đặc biệt nhất: Xuân phân (khoảng 20/3), Hạ chí (khoảng 22/6), Thu phân (khoảng 23/9) và Đông chí (khoảng 22/12). Bởi vì dựa trên cả mặt trời và mặt trăng nên lịch Việt Nam không phải là thuần âm lịch mà là âm-dương-lịch. Theo các nguyên tắc trên, để tính ngày tháng âm lịch cho một năm bất kỳ trước hết chúng ta cần xác định những ngày nào trong năm chứa các thời điểm Sóc (New moon) . Một khi bạn đã tính được ngày Sóc, bạn đã biết được ngày bắt đầu và kết thúc của một tháng âm lịch: ngày mùng một của tháng âm lịch là ngày chứa điểm sóc. Sau khi đã biết ngày bắt đầu/kết thúc các tháng âm lịch, ta tính xem các Trung khí (Major solar term) rơi vào tháng nào để từ đó xác định tên các tháng và tìm tháng nhuận. Đông chí luôn rơi vào tháng 11 của năm âm lịch. Bởi vậy chúng ta cần tính 2 điểm sóc: Sóc A ngay trước ngày Đông chí thứ nhất và Sóc B ngay trước ngày Đông chí thứ hai. Nếu khoảng cách giữa A và B là dưới 365 ngày thì năm âm lịch có 12 tháng, và những tháng đó có tên là: tháng 11, tháng 12, tháng 1, tháng 2, …, tháng 10. Ngược lại, nếu khoảng cách giữa hai sóc A và B là trên 365 ngày thì năm âm lịch này là năm nhuận, và chúng ta cần tìm xem đâu là tháng nhuận. Để làm việc này ta xem xét tất cả các tháng giữa A và B, tháng đầu tiên không chứa Trung khí sau ngày Đông chí thứ nhất là tháng nhuận. Tháng đó sẽ được mang tên của tháng trước nó kèm chữ “ nhuận”. GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 68 Khi tính ngày Sóc và ngày chứa Trung khí bạn cần lưu ý xem xét chính xác múi giờ. Đây là lý do tại sao có một vài điểm khác nhau giữa lịch Việt Nam và lịch Trung Quốc.Ví dụ, nếu bạn biết thời điểm hội diện là vào lúc yyyy-02-18 16:24:45 GMT thì ngày Sóc của lịch Việt Nam là 18 tháng 2, bởi vì 16:24:45 GMT là 23:24:45 cùng ngày, giờ Hà nội (GMT+7, kinh tuyến 105° đông). Tuy nhiên theo giờ Bắc Kinh (GMT+8, kinh tuyến 120° đông) thì Sóc là lúc 00:24:45 ngày yyyy-02-19, do đó tháng âm lịch của Trung Quốc lại bắt đầu ngày yyyy-02-19, chậm hơn lịch Việt Nam 1 ngày. Ví dụ 1: Âm lịch năm 1984 Chúng ta áp dụng quy luật trên để tính âm lịch Việt nam năm 1984. • Sóc A (ngay trước Đông chí năm 1983) rơi vào ngày 4/12/1983, Sóc B (ngay trước Đông chí năm 1984) vào ngày 23/11/1984. • Giữa A và B là khoảng 355 ngày, như thế năm âm lịch 1984 là năm thường. Tháng 11 âm lịch của năm trước kéo dài từ 4/12/1983 đến 2/01/1984, tháng 12 âm từ 3/1/1984 đến 1/2/1984, tháng Giêng từ 2/2/1984 đến 1/3/1984, v..v. Ví dụ 2: Âm lịch năm 2004 • Sóc A - điểm sóc cuối cùng trước Đông chí 2003 - rơi vào ngày 23/11/2003. Sóc B (ngay trước Đông chí năm 2004) rơi vào ngày 12/12/2004. • Giữa 2 ngày này là khoảng 385 ngày, như vậy năm âm lịch 2004 là năm nhuận. Tháng 11 âm của năm 2003 bắt đầu vào ngày chứa Sóc A, tức ngày 23/11/2003. • Tháng âm lịch đầu tiên sau đó mà không chứa Trung khí là tháng từ 21/3/2004 đến 18/4/2004 (Xuân phân rơi vào 20/3/2004, còn Cốc vũ là 19/4/2004). Như thế tháng ấy là tháng nhuận. • Từ 23/11/2003 đến 21/3/2004 là khoảng 120 ngày, tức 4 tháng âm lịch: tháng 11, 12, 1, 2. Như vậy năm 2004 có tháng 2 nhuận. GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 69 3.5.2 Thuật toán chuyển đổi giữa ngày dương và âm Trong tính toán thiên văn người ta lấy ngày 1/1/4713 trước công nguyên của lịch Julius (tức ngày 24/11/4714 trước CN theo lịch Gregorius) làm điểm gốc. Số ngày tính từ điểm gốc này gọi là số ngày Julius (Julian day number) của một thời điểm. Ví dụ, số ngày Julius của 1/1/2000 là 24515455. Dùng các công thức sau ta có thể chuyển đổi giữa ngày/tháng/năm và số ngày Julius. Phép chia ở 2 công thức sau được hiểu là chia số nguyên, bỏ phần dư 23/4=5. - Đổi ngày dd/mm/yyyy ra số ngày Julius jd a= (14 - mm) / 12; y= yy + 4800 + a; m= mm + 12*a - 3; Lịch Gregory jd = dd + (153*m+2)/5 + 365*y + y/4 - y/100 + y/400 - 32045 Lịch Julius: jd = dd + (153*m+2)/5 + 365*y + y/4 - 32083 - Đổi số ngày Julius jd ra ngày dd/mm/yyyy Lịch Gregory (jd lớn hơn 2299160): a = jd + 32044; b = (4*a+3)/146097; c = a - (b*146097)/4; Lịch Julius: b = 0; c = jd + 32082; Công thức cho cả 2 loại lịch: d = (4*c+3)/1461; e = c - (1461*d)/4; m = (5*e+2)/153; GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 70 dd = e - (153*m+2)/5 + 1; mm = m + 3 - 12*(m/10); yy = b*100 + d - 4800 + m/10; Phép chuyển đổi giữa ngày tháng và số ngày Julius có thể được thực hiện với đoạn lệnh sau: int a, y, m, jd; a = INT((14 - mm) / 12); y = yy+4800-a; m = mm+12*a-3; jd = dd + (int)((153*m+2)/5) + 365*y + (int) (y/4)+ (int) (y/100) + (int) (y/400) -32045; if (jd < 2299161) { jd = dd + INT((153*m+2)/5) + 365*y + INT(y/4) - 32083; } return jd; Từ ngày Julius chuyển ra ngày thường Public static string jdToDate (int jd) { int a, b, c, d, e, m, day, month, year; if (jd > 2299160) { // After 5/10/1582, Gregorian calendar a = jd + 32044; b = INT((4*a+3)/146097); c = a - INT((b*146097)/4); } else { b = 0; c = jd + 32082; } d = INT((4*c+3)/1461); e = c - INT((1461*d)/4); m = INT((5*e+2)/153); GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 71 day = e - INT((153*m+2)/5) + 1; month = m + 3 - 12*INT(m/10); year = b*100 + d - 4800 + INT(m/10); return new day.ToString() + “/” + month.ToString() + “/” + year.ToString(); } Tính ngày SÓC Như đã nói ở trên để tính được âm lịch trước hết ta cần xác định các tháng âm lịch bắt đầu vào ngày nào. Thuật toán sau tính ngày Sóc thứ k kể từ điểm Sóc ngày 1/1/1990. Kết quả trả về là số ngày Julius của ngày Sóc cần tìm. Public static int getNewMoonDay (int k) { double T, T2, T3, dr, Jd1, M, Mpr, F, C1, deltat, JdNew; T = k/1236.85; // Time in Julian centuries from 1900 January 0.5 T2 = T * T; T3 = T2 * T; dr = Math.PI / 180; Jd1 = 2415020.75933 + 29.53058868*k + 0.0001178*T2 -0.000000155*T3; Jd1 = Jd1 + 0.00033*Math.sin((166.56 + 132.87*T - 0.009173*T2)*dr); // Mean new moon M = 359.2242 + 29.10535608*k - 0.0000333*T2 - 0.00000347*T3; // Sun's mean anomaly Mpr = 306.0253 + 385.81691806*k + 0.0107306*T2 + 0.00001236*T3; // Moon's mean anomaly F = 21.2964 + 390.67050646*k - 0.0016528*T2 - 0.00000239*T3; // Moon's argument of latitude C1=(0.1734 - 0.000393*T)*Math.sin(M*dr) + 0.0021*Math.sin(2*dr*M); C1 = C1 - 0.4068*Math.sin(Mpr*dr) + 0.0161*Math.sin(dr*2*Mpr); C1 = C1 - 0.0004*Math.sin(dr*3*Mpr); C1 = C1 + 0.0104*Math.sin(dr*2*F) - 0.0051*Math.sin(dr*(M+Mpr)); GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 72 C1 = C1 - 0.0074*Math.sin(dr*(M-Mpr)) + 0.0004*Math.sin(dr*(2*F+M)); C1 = C1 - 0.0004*Math.sin(dr*(2*F-M)) - 0.0006*Math.sin(dr*(2*F+Mpr)); C1 = C1 + 0.0010*Math.sin(dr*(2*F-Mpr)) + 0.0005*Math.sin(dr*(2*Mpr+M)); if (T < -11) { deltat= 0.001 + 0.000839*T + 0.0002261*T2 - 0.00000845*T3 -0.000000081*T*T3; } else { deltat= -0.000278 + 0.000265*T + 0.000262*T2; } JdNew = Jd1 + C1 - deltat; return (int) (JdNew + 0.5 + timeZone / 24); } Với hàm này ta có thể tính được tháng âm lịch chứa ngày N bắt đầu vào ngày nao: giữa ngày 1/1/1990 (số ngày Julius 2415021) và ngày N có khoảng k= (int) ((N-2415021)/29,530588853) và ngày N có khoảng k=INT((N-2415021) /29.530588853) tháng âm lịch, như thế dùng hàm getNewMoonDay sẽ biết ngày đầu tháng âm lịch chứa ngày N, từ đó ta biết ngày N là mùng mấy âm lịch. Tính toạ độ mặt trời: Để biết Trung khí nào nằm trong tháng âm lịch nào, ta chỉ cần tính xem mặt trời nằm ở khoảng nào trên đường hoàng đạo vào thời điểm bắt đầu một tháng âm lịch. Ta chia đường hoàng đạo làm 12 phần và đánh số các cung này từ 0 đến 11: từ Xuân phân đến Cốc vũ là 0; từ Cốc vũ đến Tiểu mãn là 1; từ Tiểu mãn đến Hạ chí là 2; v.v.. Cho jdn là số ngày Julius của bất kỳ một ngày, phương pháp sau này sẽ trả lại số cung nói trên. Public static int getSunLong (int jdn) { double T, T2, dr, M, L0, DL, L; GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 73 T = (jdn - 2451545.5 - timeZone/24) / 36525; // Time in Julian centuries from 2000-01-01 12:00:00 GMT T2 = T*T; dr = PI/180; // degree to radian M = 357.52910 + 35999.05030*T - 0.0001559*T2 - 0.00000048*T*T2; // mean anomaly, degree L0 = 280.46645 + 36000.76983*T + 0.0003032*T2; // mean longitude, degree DL = (1.914600 - 0.004817*T - 0.000014*T2)*Math.sin(dr*M); DL = DL + (0.019993 - 0.000101*T)*Math.sin(dr*2*M) + 0.000290*Math.sin(dr*3*M); L = L0 + DL; // true longitude, degree L = L*dr; L = L - PI*2*(INT(L/(PI*2))); // Normalize to (0, 2*PI) return (int) (L / Math.PI * 6); } Với hàm này ta biết được một tháng âm lịch chứa Trung khí nào. Giả sử một tháng âm lịch bắt đầu vào ngày N1 và tháng sau đó bắt đầu vào ngày N2 và hàm getSunLongitude cho kết quả là 8 với N1 và 9 với N2. Như vậy tháng âm lịch bắt đầu ngày N1 là tháng chứa Đông chí: trong khoảng từ N1 đến N2 có một ngày mặt trời di chuyển từ cung 8 (sau Tiểu tuyết) sang cung 9 (sau Đông chí). Nếu hàm getSunLongitude trả lại cùng một kết quả cho cả ngày bắt đầu một tháng âm lịch và ngày bắt đầu tháng sau đó thì tháng đó không có Trung khí và như vậy có thể là tháng nhuận. Tìm ngày bắt đầu tháng 11 âm lịch Đông chí thường nằm vào khoảng 19/12-22/12, như vậy trước hết ta tìm ngày Sóc trước ngày 31/12. Nếu tháng bắt đầu vào ngày đó không chứa Đông chí thì ta phải lùi lại 1 tháng nữa. Public static int getLunarMonth (int yy) { double k, off, nm, sunLong; GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 74 off = jdFromDate(31, 12, yy) - 2415021; k = (int) (off / 29.530588853); nm = getNewMoonDay ((int) k); sunLong = getSunLongitude(nm, timeZone); // sun longitude at local midnight if (sunLong >= 9) { nm = getNewMoonDay((int) k - 1); } return (int) nm; } Xác định tháng nhuận: Nếu giữa hai tháng 11 âm lịch (tức tháng có chứa Đông chí) có 13 tháng âm lịch thì năm âm lịch đó có tháng nhuận. Để xác định tháng nhuận, ta sử dụng hàm getSunLongitude như đã nói ở trên. Cho a11 là ngày bắt đầu tháng 11 âm lịch mà một trong 13 tháng sau đó là tháng nhuận. Hàm sau cho biết tháng nhuận nằm ở vị trí nào sau tháng 11 này. Public static int getLeapMonthOffset (double all) { double last, arc; int k,i; k = (int) ((a11 - 2415021.076998695) / 29.530588853 + 0.5); last = 0; i = 1; // We start with the month following lunar month 11 arc = getSunLongitude(getNewMoonDay(k+i, timeZone), timeZone); do { last = arc; i++; arc = getSunLongitude(getNewMoonDay(k+i, timeZone), timeZone); } GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 75 while (arc != last && i < 14); return i-1; } Giả sử hàm getLeapMonthOffset trả lại giá trị 4, như thế tháng nhuận sẽ là tháng sau tháng 2 thường.( Tháng thứ 4 sau tháng 11 đáng ra là tháng 3 nhưng vì đó là tháng nhuận nên sẽ lấy tên của tháng trước đó tức tháng 2, và tháng thứ 5 sau tháng 11 mới là tháng 3). Đổi ngày dương dd/mm/yyyy ra ngày âm Với các phương pháp hỗ trợ trên ta có thể đổi ngày dương dd/mm/yy ra ngày âm dễ dàng. Trước hết ta xem ngày monthStart bắt đầu tháng âm lịch chứa ngày này là ngày nào (dùng hàm getNewMoonDay như trên đã nói). Sau đó, ta tìm các ngày a11 và b11 là ngày bắt đầu các tháng 11 âm lịch trước và sau ngày đang xem xét. Nếu hai ngày này cách nhau dưới 365 ngày thì ta chỉ còn cần xem monthStart và a11 cách nhau bao nhiêu tháng là có thể tính được dd/mm/yy nằm trong tháng mấy âm lịch. Ngược lại, nếu a11 và b11 cách nhau khoảng 13 tháng âm lịch thì ta phải tìm xem tháng nào là tháng nhuận và từ đó suy ra ngày đang tìm nằm trong tháng nào: Public static string convertSolar2Lunar( int dd, int mm, int yyyy) { double dayNumber, monthStart, a11, b11, lunarDay, lunarMonth, lunarYear, lunarLeap; int k, diff; dayNumber intgetJulius (dd, mm, yy); k = (int) ((dayNumber - 2415021.076998695) / 29.530588853); monthStart = getNewMoonDay (k+1); if (monthStart > dayNumber) { monthStart = getNewMoonDay(k); } a11 = getLunarMonth11(yy); b11 = a11; if (a11 >= monthStart) GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 76 { lunarYear = yy; a11 = getLunarMonth11(yy-1); } else { lunarYear = yy+1; b11 = getLunarMonth11(yy+1, timeZone); } lunarDay = dayNumber-monthStart+1; diff = (int) ((monthStart - a11)/29); lunarMonth = diff+11; if (b11 - a11 > 365) { int leapMonthDiff = getLeapMonthOffset(a11, timeZone); if (diff >= leapMonthDiff) { lunarMonth = diff + 10; if (diff == leapMonthDiff) { lunarLeap = 1; } } } if (lunarMonth > 12) { lunarMonth = lunarMonth - 12; } if (lunarMonth >= 11 && diff < 4) { lunarYear -= 1; string strNgay = lunarDay.ToString(); string strThang = lunarMonth.ToString(); string strNam = lunarYear.ToString(); return strNgay + “/” + strThang + “/” +strNam; } } } GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 77 Kết quả ta được chương trình có giao diện như sau: Hình 3.6: Giao diện chuyển đổi ngày tháng 3.6 Các môi trường thi hành ứng dụng -Kết nối với thiết bị thật có: Windows Mobile 5.0 Pocket PC Device -Để kết nối với các thiết bị giả lập ta có: Windows Mobile 5.0 Pocket PC Device R2 Windows Mobile 5.0 Pocket PC Emulator Windows Mobile 5.0 Pocket PC Phone Emulator Windows Mobile 5.0 Pocket PC Phone Square Emulator Windows Mobile 5.0 Pocket PC Phone Square VGA Emulator Windows Mobile 5.0 Pocket PC Phone VGA Emulator Windows Mobile 5.0 Pocket PC Square Emulator Windows Mobile 5.0 Pocket PC Square VGA Emulator GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 78 Windows Mobile 5.0 Pocket PC VGA Emulator Các thiết bị giả lập này cung cấp cho người dùng các môi trường giao diện khác nhau để thuận tiện cho người sử dụng. 3.7 Cài đặt và cấu hình các chương trình cho thiết bị giả lập Với Pocket PC bạn có thể cài đặt nhiều hệ điều hành trên từng phần mềm ảo thích hợp. Hiện nay có nhiều WIN CE dành cho các nhà phát triển viết các ứng dụng trên nền Windows Mobile, chúng ta hãy thử một số chương trình sau: -Windows Mobile 6 Professional Image (USA).msi (181.0 MB): Đây là bản nhập nhật hệ điều hành cho các thiết bị di động và điện thoại thông minh mới nhất của Microsoft, chạy trên nền Windows, hiện nay cũng đã hỗ trợ các hệ diều hành khác như Linux,… Các phiên bản Windows Mobile trước cung cấp nhiều chức năng cho Pocket PC hơn là cho điện thoại với các kiểu bàn phím khác nhau, nhưng sự phân biệt như thế hầu như biến mất trong Winlows Mobile 6. Tuy nhiên, Microsoft vẫn phải đưa ra 2 phiên bản Windows Mobile 6 dựa trên loại màn hình của thiết bị: Nó hướng đến các thiết bị không có màn hình cảm ứng, và bản Pro hỗ trợ cho thiết bị có màn hình cảm biến và bút cảm ứng. Hệ điều hành hỗ trợ: Windows Server 2003 Service pack 2; Windows Vista; Windows XP Service Pack 2 (32&64 bit). - Phần mềm Microsoft ActiveSync 4.5 (7,52 MB) Đây là phần mềm được dùng để đồng bộ hoá các dạng thức tệp tin hay thông tin khác nhau giữa các thiết bị Pocket PC hay Windows Mobile. • Cài đặt và cấu hình: +Khởi động Windows Mobile 6 Professional SDK nó có các giao diện sau: Windows Mobile 6 Classic (240 x 320 pixels – 96 dpi) Windows Mobile 6 Professional (240 x 320 pixel - -96 dpi) Windows Mobile 6 Professional Square (240 x 320 pixel - -96 dpi) Windows Mobile 6 Professional Square QVGA (320 x 320 pixel -128 dpi) Windows Mobile 6 Professional Square VGA (480 x 480 pixel -192 dpi) GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 79 Windows Mobile 6 Professional VGA (480 x 640 pixel -192 dpi) Bạn chọn cái nào cũng được. Sau khi khởi động xong vào menu File chọn Configure. Sau đó chọn nơi làm thẻ nhớ ảo, góc nhìn (Display), thiết lập (Display), giao tiếp mạng (Network), cổng kết nối. GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 80 Chọn tiếp: Chọn tab Network (tốt nhất là để mặc định) Chọn tiếp tab Perpherals. GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 81 Xong rồi bấm OK. + Khởi động Microsoft ActiveSync 4.5 và thiết lập cấu hình Chọn như hình trên Chọn xong bấm OK là chương trình cài đặt đã hoàn thành. GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 82 KẾT LUẬN Ngôn ngữ C# giúp chúng ta xây dựng ứng dụng cho Mobile thêm nhiều chức năng và ứng dụng cho cuộc sống. Ngày nay công nghệ ngày càng phát triển và nhu cầu của con người ngày một nâng cao thì việc nâng cao và bổ sung các tính năng cho điện thoại là điều không thể trì hoãn. Với thời gian và kiến thức còn hạn chế em đã nghiên cứu xây dựng ứng dụng tra cứu lịch xuất hành trên Mobile trên cơ sở đã hoàn thành tương đối song không thể tránh những thiếu sót. Những thiếu xót này sẽ biểu hiện rõ hơn khi đưa chương trình này vào ứng dụng thực tế. Kính mong sự thông cảm của thầy cô và các bạn. Để hoàn thành đề tài này một lần nữa em xin bày tỏ lời cảm ơn đến thầy giáo Thạc Sỹ Nguyễn Công Nhật là người đã quan tâm, tận tình giúp đỡ, chỉ bảo cho em trong suốt thời gian qua. Và em xin cảm ơn các thầy giáo cô giáo trong khoa Công Nghệ Thông Tin đã giúp em hoàn thành chuyên ngành này. Em xin chân thành cảm ơn. GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 83 TÀI LIỆU THAM KHẢO 1. Dương Quang Thiện .NET Toàn Tập – C# Căn Bản Và Visual Studio.Net - Tập 1 NXB Thành Phố Hồ Chí Minh 2005 2. Nguyễn Ngọc Tuấn, Hồng Phúc Tự học Visual Studio.NET trong 21 ngày NXB Thống Kê 2005. 3. Nguyễn Văn Lân Kỹ Thuật Xây Dựng Ứng Dụng ASP.NET - Tập 1 NXB Lao Động Xã Hội 4. KS. Nguyễn Nam Thuận Hướng Dẫn Thực Hành Viết Lập Trình Trong Visual C# 2005 Express NXB Giao Thông Vận Tải GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 84 Mục lục Nội dung Trang Mở đầu 01 Chương I: Tổng quan về Pocket PC 04 1.1: Giới thiệu về PDA và Pocket PC 04 1.1.1 Lịch sử phát triển 06 1.1.2 Các tính năng điển hình 07 1.1.3 Cấu tạo và nguyên lý hoạt động 10 1.1.4 PDA hiện tại và tương lai 13 1.1.5 PDA hướng tới người dùng 14 1.2 Môi trường phát triển ứng dụng 15 1.2.1 Các thiết bị phi chuẩn 15 1.2.2 Kết nối Visual Studio với các thiết bị 17 Chương II: Các công cụ lập trình với PDA 19 2.1 Giới thiệu về C# 19 2.1.1 Thiết kế các ứng dụng GUI bằng Windows Forms 19 2.1.2 Thiết kế Forms trên Visual Studio.NET 20 2.1.3 Tìm hiểu các nền tảng Windows Form 23 2.1.4 Làm việc với Form 24 2.1.5 Khả năng kết nối mạng bằng .NET Compact Framework 30 2.1.6 Phát triển cho Smart Phone 40 2.2 Các công cụ lập trình PDA 46 2.2.1 Giới thiệu 46 2.2.2 Các công cụ lập trình 47 GVHS: ThS. Nguyễn Công Nhật " # Khoá Luận Tốt Nghiệp Sinh Viên: Nguyễn Thị Dung – Khoá 46B3 – CNTT 85 Chương III: Xây dựng ứng dụng tra cứu lịch xuất hành trên Pocket PC 3.1 Vai trò lịch xuất hành 56 3.2 Giới thiệu phương pháp lập lịch xuất hành. 56 3.3 Xây dựng Modul tra cứu ngày. 58 3.4 Xây dựng Modul tra cứu giờ. 62 3.5 Xây dựng Modul chuyển đổi ngày giờ. 64 3.6 Các môi trường thi hành ứng dụng 78 3.7 Cài đặt và cấu hình các chương trình cho thiết bị giả lập. 79 Kết luận 82 Tài liệu tham khảo 83

Các file đính kèm theo tài liệu này:

  • pdfTìm hiểu về Pocket PC và xây dựng chương trình ứng dụng.pdf