NOTAS INICIAIS
Este trabalho destina-se à cadeira de Projecto, do
segundo semestre do quinto ano, do curso de Engenharia
Informática, ramo de Computadores e Sistemas,
leccionada no Instituto Superior de Engenharia do Porto.
Tem como tema o Desenvolvimento de Aplicações
destinadas a PDAs, utilizando como ferramenta a
plataforma .NET da Microsoft.
Inicialmente, o tema proposto tinha sido o
desenvolvimento de aplicações para PDAs em geral, mas
devido ao interesse de mais do que um aluno nesse tema e
talvez pela imergente importância do .NET neste domínio,
o professor Paulo Ferreira dividiu os temas e incluiu um
projecto só para o desenvolvimento em .NET.
O facto de tanto os PDAs como o .NET serem
tecnologias muito recentes e com enormes potencialidades
de desenvolvimento, foram as razões que me levaram a
optar por este projecto.
A evolução dos PDAs, cada vez com maior capacidade
de processamento, de armazenamento e comunicação, a
iminente fusão com os telemóveis e consequente
massificação,
terão
progressivamente
uma
maior
implicação na sociedade, desempenhando um papel cada
vez mais importante.
O .NET dá-nos um ambiente de trabalho mais eficiente,
possibilitando desenvolver mais facilmente e rapidamente
as aplicações de que necessitamos. Assim, na escolha
deste tema foi também minha intenção me familiarizar
com a plataforma .NET, da qual só tinha algumas ideias.
Esta será a ferramenta primordial utilizada para
desenvolver a maior parte das aplicações nos próximos
anos a nível mundial.
Julgo assim que esta combinação, a dos PDAs com o
.NET é algo de muito importante e com grandes
potencialidades. Espero que os conhecimentos obtidos na
realização deste trabalho me venham a ser úteis como
programador e sirvam como base para desenvolver
aplicações deste género na minha vida profissional.
2
DESCRIÇÃO DO TRABALHO
Inicialmente irei comparar as diferenças existentes na
plataforma .NET em relação às ferramentas que existiam
anteriormente, e indicar quais as vantagens na sua
utilização.
Mostrarei as ferramentas existentes e como criar um
simples Hello World. Achei importante dar uma amostra do
hardware disponível neste momento para correr este tipo
de aplicações.
De seguida, irei descrever os controls mais comuns
para criar o interface de uma aplicação, as suas
propriedades mais utilizadas, juntamente com imagens e
amostras de código para dar uma ideia de como são e
como funcionam.
Indicarei quais os principios gerais a ter na construção
de uma aplicação e como definir alguns parâmetros. Darei
uma descrição geral e uma pequena introdução a temas
mais avançados, capazes de tornar a aplicação mais
poderosa e com mais capacidades. Por fim dou alguns
exemplos de aplicações destas tecnologias no mundo
empresarial, a sua implementação e beneficios.
Este trabalho tem incluido em toda a sua extenção uma
linguagem muito técnica, sendo necessário alguns
conhecimentos de informática e programação para facilitar
a sua compreenção.
A maior partes dos exemplos dados ao nivel do código
fonte estão escritos na linguagem C#. Esta linguagem e o
Visual Basic .NET são neste momento as únicas linguagens
utilizadas neste tipo de programação.
Grande parte da informação recolhida para a realização
deste trabalho foi retirada de sites pertencentes à
Microsoft. Em Portugal a documentação relacionada com
este tema neste momento é praticamente inexistente.
Estas foram as ferramentas e o hardware utilizado na
realização deste trabalho:
- Intel Pentium4 1,7GHz 256MB RAM
- Microsoft Windows XP
- Adobe Acrobat 6.0
- Paint Shop Pro 8.0
- EditPad Lite e Notepad
- Internet Explorer 6
- Visual Studio .Net 2003
- .NET Compact Framework
3
INDEX
002 Notas Iniciais
003 Descrição do Trabalho
INDEX
INTRODUÇÃO
005 Index
012 Introdução
013 Requisitos de Sistema:
014 A Plataforma .NET
014
016
018
018
019
020
020
021
021
Antes do .NET
Servidor HelloWorld em .NET
Conclusão das Vantagens do .NET
.NET Compact Framework
SQL Server CE
ASP.NET Mobile Controls
Mobile Information Server
Plataformas para o .NET Compact Framework
Plataformas Não Suportadas
022 Hardware
023
024
025
026
027
028
029
Hewlett-Packard iPAQ h5550
Compaq iPAQ 3955
Asus MyPal A600
Toshiba e740
ViewSonic PocketPC V36
Siemens SX56 (PocketPC Phone Edition)
Proximus Qtek 1010 (PocketPC Phone Edition)
FERRAMENTAS DE
DESENVOLVIMENTO
031 Ferramentas
031
032
032
032
Visual Studio .NET 2003
eMbedded Visual Tools Version 3
eMbedded C++ Version 4
O Visual Studio .NET Para Aparelhos Móveis
033 Ambiente de Desenvolvimento
033
034
035
035
037
037
Como Criar um Projecto
Smart Device Application Wizard
Diferenças entre Projectos de Desktop e de Device
Gerir o Projecto
Sistema de Ajuda
Aplicação Hello World
5
040 O Emulador e As Comunicações
040
041
041
042
042
042
042
043
043
Utilização do Emulador
Desenvolvimento de Aplicações numa Rede
Utilizando o Emulador PocketPC
Especificidades dos Aparelhos Móveis
Transferência de Dados
XML Web Services
SQL Server CE
Dispositivos Com Recursos Limitados
Implicações a Nível da Segurança
CONTROLS DA
WINDOWS FORMS
045 Windows Forms
045
046
046
046
046
Criação de Controls
Membros dos Controls
Propriedades
Métodos
Eventos
047 Controls
047
048
049
050
050
052
054
054
056
056
057
058
059
060
061
062
062
064
064
065
066
067
067
069
070
Button
CheckBox
ComboBox
ContextMenu
DataGrid
DomainUpDown
HScrollBar e VScrollBar
ImageList
Label
ListBox
ListView
MainMenu
NumericUpDown
OpenFileDialog / SaveFileDialog
Panel
PictureBox
ProgressBar
RadioButton
StatusBar
TabControl
TextBox
Timer
Toolbar
TrackBar
TreeView
6
CONSTRUIR APLICAÇÕES
PARA POCKETPC
073 A Class Form
073 Propriedades de uma Form
075 Controls da Aplicação
075
075
078
078
079
081
083
084
084
085
086
086
Respeitando as Normas Gerais
Criação de Caixas de Diálogo
Utilização das Caixas de Diálogo do Sistema
O Control InputPanel
O Control MainMenu
O Control ToolBar
Activação e Desactivação de uma Form
O Activate e Deactivate
Fechar Aplicações
Evento Tap-And-Hold
Teclas de Hardware de um PocketPC
Finalizar o Desenvolvimento da Aplicação
088 Normas Recomendadas
090 Teste e Debug
090
090
091
091
092
Utilizar o Debugger
O Modo Break
Criar um BreakPoint
Watch Window
Utilizar o Debug
POTENCIALIDADES
094 Colecções de Objectos
094
095
095
096
Classes de Colecções em System.Collections
Namespace System.Collections.Specialized
Arrays Multidimensionais
ArrayList
097 Strings e Datas
099 XML
099 Exemplo Prático
099 Utilização do XML no .NET Compact Framework
100 Input e Output
100 Classe Stream
101 Classes BinaryTrade e BinaryWriter
101 Classes StreamReader e StreamWriter
102 Comunicação em Rede
102 Namespace System.Net
103 Segurança
103 O Básico ao Nível da Segurança
104 Recomendações de Segurança
105 ADO.NET
7
105 Connectionless do ADO.NET
105 ADO.NET e XML
106 Binding de Controls
107 XML Web Services
107 Arquitectura do XML Web Services
108 SQL Server CE
108 Utilização do SQL Server CE
109 Controls Personalizados
110 Globalização e Localização
110 Globalização
110 Localização
111 Threads
111 Capacidade de Resposta e Escalonabilidade
111 Conceito Multithreading
112 Vantagens do Multithreading
113 Gráficos
113 GDI+
UTILIZAÇÃO EM
CASOS REAIS
115 Tesco
115
115
115
116
117
Introdução
Situação
Solução
Beneficios
Teste
118 GeoVector
118 Solução
120 Benefícios
120 Futuro
122 Apontamentos Finais
8
REFERÊNCIA
124 Informação na Internet
125 Sites
125
125
125
125
125
126
126
126
126
126
127
127
Microsoft
MSDN: Microsoft Software Development Network
Google
ZDNet Reviews
CNet Reviews
LearnMobile.net
Open .NET Compact Framework
JWHedgehog-Developmentor .NET Reference
DevBuzz
DevX
GotDotNet .NET Framework Community
CSharp Friends
128 Livros e eBooks
128
128
128
129
129
129
130
130
Microsoft .NET Compact Framework
Definitive Guide to the .NET Compact Framework
Mastering Visual Basic .NET
VB.NET Developer's Guide
Visual Blueprint for Building C# .Net Applications
C#.Net Web Developer's Guide
Applied Microsoft .NET Framework Programming
O'Reilly .NET Framework Essentials
131 Documentos
131
131
131
131
131
131
131
131
131
131
132
132
132
132
132
132
132
132
Windows Mobile Hardware
The Visual Studio Vision
Top 10 reasons to go with .Net
Developing Applications for Windows Mobile: FAQ
Microsoft .NET Compact Framework for Mobile
Introduction to Development Tools
The PC in Your Pocket
Taking Control with C#
Creating Custom Controls
Pocket PC 2002 at home in enterprise
Developing Applications Using Web Services
Ways Compact Framework Can Access Databases
What's New for Developers in Win Mobile 2003
Microsoft Case Studies: Pepsi Bottling Group, The
Microsoft Case Studies: Tesco.com
Microsoft Case Studies: GeoVector.com
Microsoft Preps New Handheld OS
ActiveSync 3.6 Download
9
Introdução
10
INTRODUÇÃO
A utilização de PDAs e de outros aparelhos de pequeno
porte tem vindo a aumentar com o avanço das tecnologias.
Uma das razões desta massificação têm a ver com o
contínuo decréscimo do seu custo. A crescente competição
entre fabricantes tem provocado preços mais atractivos
para os consumidores. Assim, as empresas mais do que
nunca, têm em consideração aplicar investimentos nesta
área, tendo em vista a utilização destes aparelhos a um
número cada vez maior dos seus empregados.
Além disso, os aparelhos têm-se tornado mais
poderosos. A velocidade de processamento é cada vez
maior, possuem mais memória e capacidades gráficas.
Incorporam diferentes tecnologias a nível de comunicação,
como o Bluetooth, Wi-Fi, 802.11, ou mesmo PDAs híbridos
com telefone que estão aptos a usar operadores móveis
através de GPRS (General Packet Radio Service) ou
CDMA2000 (Comunicações de Dados por Pacotes).
Outro factor impulsionador da utilização dos PDAs é a
melhoria na arquitectura do software. Um exemplo disso é
o .NET Compact Framework. Este motor de execução é
responsável pela gestão das aplicações .NET em
dispositivos portáteis. Algumas das vantagens são a interoperabilidade entre linguagens, a melhoria ao nível de
tratamento de erros e a melhoria ao nível da gestão de
memória.
O .NET Compact Framework também implementa um
conjunto de librarias de classes unificadas, orientadas ao
objecto, hierarquizadas, extensíveis e que podem ser
chamadas por qualquer aplicação escrita em qualquer
linguagem .NET.
O benefício mais significativo no .NET Compact
Framework é o facto do modelo de programação ser
idêntico ao utilizado pelos programadores que usam o .NET
para criar aplicações que se destinam aos PCs de desktop
ou a servidores. O .NET Compact Framework implementa
um sub-conjunto compatível com o abrangente .NET
Framework. Deste modo, os criadores utilizam as mesmas
técnicas para conseguir resultados semelhantes usando as
mesmas ferramentas, tal como o Visual Studio .NET.
Antes do .NET o desenvolvimento de aplicações para o
Windows CE necessitava de um conjunto diferente de
ferramentas, com técnicas similares às necessárias na
programação Win32 nos desktops, mas suficientemente
diferente para que muitas empresas não se interessassem
pelo desenvolvimento deste tipo de aplicações.
11
Agora, os programadores de desktop podem facilmente
transferir os seus conhecimentos e técnicas para o
desenvolvimento de aplicações destinadas a dispositivos
portáteis, reduzindo os custos de formação.
O .NET torna mais fácil fazer coisas simples mas
também facilita fazer coisas complexas, tais como aceder a
serviços Web ou construir componentes. Desta forma,
sobra mais tempo para criar soluções inovadoras.
Uma implementação poderá ser a utilização de
sistemas distribuídos construídos com aplicações nos
aparelhos móveis que acedem a dados em servidores
utilizando XML ou utilizando as capacidades do SQL Server
CE. Com o custo mais baixo, melhor performance e
processos
de
desenvolvimento
melhorado,
estes
dispositivos
tornar-se-ão
componentes
chave
em
aplicações empresariais e não só.
Requisitos de Sistema:
É necessário o seguinte software para desenvolver
aplicações para .NET Compact Framework:
- Microsoft Visual Studio .NET 2003;
- Microsoft Windows 2000, Microsoft Windows XP ou
Microsoft .NET Server.
O hardware mínimo necessário é o seguinte:
- Pentium2 450 MHz;
- Memória RAM: 128MB (Win2000) ou
(Windows XP ou .NET Server);
- 5GB de espaço livre no disco.
256MB
O Visual Studio .NET 2003 inclui um emulador de
Windows CE .NET e do PocketPC 2003, de forma que não é
essencial ter um equipamento real. No entanto, para testar
num engenho verdadeiro, é necessário o seguinte software
e hardware:
- Um aparelho com o PocketPC 2000 ou 2002 ou
Windows CE .NET 4.1 e seguintes;
- ActiveSync 3.6 ou seguinte;
- Um cabo de sincronização Serial/USB.
12
A PLATAFORMA .NET
Antes do .NET
Para mostrar as diferenças do .NET em relação aos
modelos de programação anteriores, o código seguinte é o
exemplo de um componente COM que retorna uma String
"Hello, World" quando é chamado. É utilizado o eMbedded
Visual C++ 3 e o Active Template Library (ATL).
HelloWorldProvider.idl
import "oaidl.idl";
import "ocidl.idl";
[
object,
uuid(1D781DA4-A0AE-4F87-97A4-E8D67678B5FC),
dual,
helpstring("IHelloWorld Interface"),
pointer_default(unique)
]
interface IHelloWorld : IDispatch
{
[propget, id(1), helpstring("property Message")]
HRESULT Message([out, retval] BSTR *pVal);
};
[
uuid(E0829B73-C513-4509-936D-D905376F4B0C),
version(1.0),
helpstring("HelloWorldProvider 1.0 Type Library")
]
library HELLOWORLDPROVIDERLib
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");
[
uuid(BE71BAA4-7E78-4178-B00C-4E0D53886989),
helpstring("HelloWorld Class")
]
coclass HelloWorld
{
[default] interface IHelloWorld;
};
};
13
HelloWorld.h
// HelloWorld.h : Declaration of the CHelloWorld
#ifndef __HELLOWORLD_H_
#define __HELLOWORLD_H_
#include "resource.h"
// main symbols
//////////////////////////////////////////////////////////////
// CHelloWorld
class ATL_NO_VTABLE CHelloWorld :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CHelloWorld, &CLSID_HelloWorld>,
public
IDispatchImpl<IHelloWorld,
&IID_IHelloWorld,
&LIBID_HELLOWORLDPROVIDERLib>
{
public:
CHelloWorld()
{
m_MessageTxt= SysAllocString(L"Hello, World");
}
DECLARE_REGISTRY_RESOURCEID(IDR_HELLOWORLD)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CHelloWorld)
COM_INTERFACE_ENTRY(IHelloWorld)
COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()
// IHelloWorld
public:
STDMETHOD(get_Message)(/*[out, retval]*/ BSTR *pVal);
private:
BSTR m_MessageTxt;
};
#endif //__HELLOWORLD_H_
Além destes, o Wizard gera um grande número de
outros ficheiros necessários para a implementação do
COM. Os clientes, apesar de mais simples, também
necessitam de código adicional no caso do Visual C++.
14
HelloWorld.cpp
// HelloWorld.cpp : Implementation of CHelloWorld
#include "stdafx.h"
#include "HelloWorldProvider.h"
#include "HelloWorld.h"
//////////////////////////////////////////////////////////////
// CHelloWorld
STDMETHODIMP CHelloWorld::get_Message(BSTR *pVal)
{
CComBSTR tbstr;
tbstr=m_MessageTxt;
*pVal=SysAllocString(tbstr);
return S_OK;
}
HelloWorld.bas
Option Explicit
Dim comServer As Object
Sub Main()
Dim aMsg
Set comServer =
CreateObject("HelloWorldProvider.HelloWorld")
aMsg = comServer.Message
MsgBox aMsg
End Sub
Servidor HelloWorld em .NET
Este é o código para os mesmos servidores e clientes
em .NET. No eMbedded Visual Tools não era possível criar
um servidor COM utilizando o Visual Basic, mas aqui o
código do servidor foi escrito nesta linguagem.
HelloWorldProvider.vb
Namespace HelloWorldProvider
Public Class HelloWorld
Public ReadOnly Property Message() As String
Get
Return "Hello, World"
End Get
End Property
End Class
End Namespace
15
Client.cs
using System.IO;
using HelloWorldProvider_NET.HelloWorldProvider;
namespace ClientCsharp
{
class Client
{
static void Main(string[] args)
{
HelloWorld myServer;
myServer = new HelloWorld();
string aMsg = myServer.Message;
// Write the greeting to a file
StreamWriter sr =
File.CreateText(@"\My Documents\Greeting.txt");
sr.WriteLine(aMsg);
sr.Close();
}
}
}
Client.vb
Imports System.IO
Imports HelloWorldProvider_NET
Module Client
Sub Main()
Dim myServer As HelloWorldProvider.HelloWorld
myServer = New HelloWorldProvider.HelloWorld
Dim aMsg As String = myServer.Message
' Write the greeting to a file
Dim sr As StreamWriter
sr = File.CreateText("\My Documents\Greeting.txt")
sr.WriteLine(aMsg)
sr.Close()
End Sub
End Module
O principal benefício do .NET foi ilustrado neste
exemplo, e é a sua simplicidade. É possível escrever
componentes em qualquer linguagem suportada pelo .NET
e é muito simples escrever um componente que pode ser
utilizado por qualquer outra linguagem compatível com o
.NET.
Tal é possível porque todas estas linguagens são
construídas tendo como base o mesmo sistema. A baixo
nível, os tipos de objecto de cada linguagem são
exactamente os mesmos.
16
Outra vantagem, que inclusivé se pode observar neste
exemplo, é que tanto o Visual Basic como o C# usam as
mesmas classes (StreamWrite e o File). Assim, não é
necessário aprender todo um novo conjunto de funções de
runtime.
Neste exemplo, fica-se com a ideia de que o COM é
apenas um modo de desenvolver componentes em
múltiplas linguagens, no entanto é mais do que isso. O
Distributed COM (DCOM) permite ter acesso a COMs
através de qualquer tipo de rede. O .NET introduz o .Net
Remoting que representa um avanço substancial em
relação ao DCOM.
Conclusão das Vantagens do .NET
O .NET não tem somente a vantagem de implementar
componentes facilmente. Um dos seus grandes atributos é
a fiabilidade do código gerado. As aplicações contruídas
com o .NET quando executadas são controladas pelo
Common Language Runtime (CLR). O CLR compila todo o
código em runtime, com a utilização do Just-In-Time (JIT).
Aloca memória quando se cria novos objectos e faz o
garbage collection dos objectos que não são mais
necessários, libertando automaticamente a memória.
Como o CLR compila todo o código no momento de
execução, implementa medidas restritas na verificação de
tipo de dados. Assim, não é possível surgirem erros tais
como, o de castings inseguros de um objecto para outro, o
endereçamento de um array fora dos seus limites ou
escrever para além do fim de um buffer. O CLR também
faz a gestão ao nível da segurança, exercendo um controlo
das funções que são permitidas executar e os recursos a
que pode ter acesso um pedaço de código.
.NET Compact Framework
O .NET Compact Framework é uma versão mais
compacta da abrangente versão .NET Framework para os
desktops. Inclui um sub-conjunto compatível das classes
base do .NET Framework. Também engloba algumas novas
classes especialmente destinadas a aparelhos móveis.
Compreende ainda uma nova implementação do
Common Language Runtime (CLR), concebido de raiz para
correr eficazmente em hardware de pequenas dimensões,
com restrições de memória e processamento, e com
limitações no consumo de bateria.
17
O primeiro lançamento do .NET Compact Framework
destinou-se aos aparelhos com o PocketPC 2000 e
PocketPC 2002, e aparelhos Windows CE .NET 4.1 ou
seguintes. Futuramente, espera-se que seja igualmente
utilizado em SmartPhones e outros engenhos.
Os operadores de telecomunicações e de transmissão
de dados, poderão fornecer as suas próprias librarias,
permitindo aos criadores de software desenvolver
aplicações direccionadas à especificidade dos serviços que
oferecem.
O .NET Compact Framework foi desenvolvido com uma
ideia de portabilidade. Assim é possível, que de futuro,
esteja disponível também em outros sistemas operativos
não pertencentes à Microsoft.
O Visual Studio .NET 2003 inclui o software e
ferramentas necessárias para criar aplicações que correm
em aparelhos que tenham o .NET Compact Framework
instalado. Na sua instalação também são copiados os
componentes indispensáveis para instalar o .NET Compact
Framework num aparelho portátil.
Tal como o .NET Compact Framework, o ASP.NET
Mobile Controls, anteriormente denominado Microsoft
Mobile Internet Toolkit (MMIT), permite igualmente criar
aplicações que podem ser utilizadas em aparelhos móveis.
No entanto, as aplicações do .NET Compact Framework
correm
no
aparelho
como
clientes
com
mais
potencialidade, com acesso aos recursos da máquina, tal
como armazenamento e outros componentes de hardware.
Nas aplicações de ASP.NET, o único software em
execução no aparelho é um Browser de Internet.
SQL Server CE
O SQL Server CE é uma versão compacta de uma base
de dados relacional que corre em aparelhos equipados com
o Windows CE. É compatível com o SQL Server através da
utilização de tipos de dados compatíveis. Ocupa apenas
800KB num processador ARM, que é adequado para
aparelhos fisicamente limitados.
A segunda versão do SQL Server CE suporta ainda
mais funções intrínsecas que a versão anterior. Funções
tais como ABS, Log, Pi, Substring e atributos tais como
queries e unions parametrizados. No entanto, a
característica
mais
importante
é
o
namespace
System.Data.SqlServerCe, que permite que uma base de
dados SQL Server CE seja manipulada a partir de
aplicações .NET Compact Framework.
18
As suas classes dão acesso directo à informação
armazenada na base de dados e permitem a utilização do
Remote Data Access (RDA) e de Merge Replication, que
são duas técnicas poderosas que possibilitam replicar
dados de um SQL Server de uma empresa para o SQL
Server CE do PDA para posteriormente serem utilizados
nas suas aplicações.
ASP.NET Mobile Controls
O ASP.NET Mobile Controls permite utilizar o Visual
Studio .NET para desenvolver aplicações destinadas a
aparelhos móveis tendo como finalidade os Browsers dos
PDAs, SmartPhones, WAP e I-Mode Phones.
O ASP.NET Mobile Controls e ferramentas de
desenvolvimento
eram
anteriormente
denominados
Microsoft Mobile Internet Toolkit (MMIT) e foram lançados
no mesmo dia que o Visual Studio .NET 2002. Estavam
disponíveis para download em separado a partir da página
do MSDN da Microsoft como um componente Add-On do
Visual Studio.
Com o lançamento do Visual Studio .NET 2003, o
desenvolvimento de aplicações Web Mobile tornou-se uma
parte
totalmente
integrante
do
IDE
(Integrated
Development Environment) e não mais um produto
separado.
As aplicações são executadas num IIS Web Server que
tem instalado o .NET Compact Framework, mas não é
necessário o .NET nos dispositivos de pequeno porte. As
aplicações MMIT funcionam perfeitamente com o Pocket
Internet Explorer que se encontra no PocketPC e em
outros equipamentos com o Windows CE. Mas, ao contrário
das aplicações .NET Compact Framework, nenhum código
é executado na máquina.
Mobile Information Server
Existem duas versões do Mobile Information Server
(MIS), o Carrier Edition e o Enterprise Edition. O MIS
permite aos utilizadores móveis com o PocketPC ou
telefones com WAP, sincronizar com um Microsoft
Exchange Server, recebendo e-mails e outras mensagens.
Também oferece capacidades de autenticação de clientes.
Durante 2003, MIS deixará de ser um produto individual e
será integrado com o Exchange e no Microsoft ISA Server
(Internet Security And Acceleration Server).
19
Plataformas para o .NET Compact Framework
A primeira versão do .NET Compact Framework suporta
os sistemas Power PC, assim como soluções integradas,
construídas com base no Windows CE .NET. É suportado
nas seguintes plataformas da Microsoft:
- PocketPC 2000
- PocketPC 2002
- PocketPC 2002 Phone Edition
- PocketPC .NET
- Windows CE .NET versão 4.1 e seguintes
Plataformas Não Suportadas
O .NET Compact Framework não é suportado pelas
seguintes plataformas:
- Windows CE versão 3 e anteriores
- Handheld PC 2000 e anteriores
- Microsoft SmartPhone 2002
20
HARDWARE
Há um constante aperfeiçoamento do hardware capaz
de correr aplicações baseadas na plataforma .NET. Neste
momento, Setembro de 2003, as especificações mais
comuns neste tipo de aparelhos são processadores Intel
Xscale de 400MHz, com 64MB de RAM, ecrãs de 240 pixeis
de largura e 320 de altura e 64 mil cores. Equipados com
capacidades wireless 802.11 e BlueTooth.
Estas características certamente que em alguns meses
se encontrarão ultrapassadas e em poucos anos
completamente obsoletas. Os avanços tecnológicos irão
dotar estas máquinas de mais e melhores capacidades,
capazes de realizar funções mais complexas e abrangentes
com maior rapidez e qualidade.
Estes são alguns dos dispositivos disponíveis nos
mercados mundiais de momento. São descritos a marca, o
modelo e as especificações mais importantes, tais como o
tipo e velocidade do processador, quantidade de memória,
características do ecrã, capacidades na transferência de
dados, etc.
21
Hewlett-Packard iPAQ h5550
Processador
Intel XScale Processor 400 MHz
Memória
RAM: 128MB
ROM: 48MB
Ecrã
3.8" Retro-Iluminado; Sensível ao toque
65000 Cores; Resolução: 240x320
Dimensões / Peso
13,5 x 8,2 x 1,5 inches; 207 gramas
Bateria
Removable Lithium-Ion
Expansibilidade
Slot SD Integrados
Comunicação
BlueTooth; 802.11b; IRDA; USB
22
Compaq iPAQ 3955
Processador
Intel XScale Processor 400 MHz
Memória
RAM: 64MB
ROM: 32MB
Ecrã
3.5" Retro-Iluminado
65000 Cores; Resolução: 240x320
Dimensões
12,2 x 7,6 x 1,0cm; 130 gramas
Bateria
12 horas
Expansibilidade
Compact Flash Integrado
Comunicação
BlueTooth
23
Asus MyPal A600
Processador
Intel XScale Processor 400 MHz
Memória
RAM: 64MB
ROM: 32MB
Ecrã
3.5" Reflexivo
65000 Cores; Resolução: 240x320
Dimensões
12,5 x 7,5 x 1,2cm; 138 gramas
Bateria
15 horas; Rechargeable Lithium Polymer
Expansibilidade
Slot SD Integrado
24
Toshiba e740
Processador
Intel XScale Processor 400 MHz
Memória
RAM: 64MB
ROM: 32MB
Ecrã
3.5" Sensível ao toque
65000 Cores; Resolução: 240x320
Dimensões / Peso
12,2 x 7,7 x 1,5cm; 173 gramas
Bateria
Advanced Lithium-Ion
Expansibilidade
Slot SD Integrados
Comunicação
BlueTooth; WiFi Opcional; IRDA; USB
25
ViewSonic PocketPC V36
Processador
Intel XScale Processor 300 MHz
Memória
RAM: 64MB
ROM: 32MB
Ecrã
3.5" Retro-Iluminado TFT; Sensível ao toque
65000 Cores; Resolução: 240x320
Dimensões
12,2 x 7,6 x 1,0cm; 130 gramas
Bateria
10 horas; Advanced Lithium-Ion
Expansibilidade
Slot SD/MMCard Integrados
Comunicação
BlueTooth; WiFi Opcional; IRDA; USB
26
Siemens SX56 (PocketPC Phone Edition)
Processador
Intel StrongARM 32-bit 206MHz
Memória
RAM: 32MB
ROM: 32MB
Ecrã
3.5" Retro-Iluminado; Sensível ao Toque
4096 Cores; Resolução: 240x320
Dimensões
12,5 x 7,0 x 1,7cm; 193 gramas
Bateria
15 horas; Lithium Ion
Expansibilidade
Slot SD Integrado
Comunicação
GPRS; GSM; IRDA
27
Proximus Qtek 1010 (PocketPC Phone Edition)
Processador
Intel StrongARM 32-bit 206MHz
Memória
RAM: 32MB
ROM: 32MB
Ecrã
3.5" Reflexivo
4096 Cores; Resolução: 240x320
Dimensões
12,9 x 7,3 x 1,8cm; 200 gramas
Bateria
15 horas; Rechargeable Lithium Polymer
Expansibilidade
Slot SD/MMCard Integrados
Comunicação
GPRS; GSM; IRDA; USB
28
FERRAMENTAS
DE
DESENVOLVIME
NTO
FERRAMENTAS
Há actualmente três ferramentas distintas para o
desenvolvimento de aplicações para o PocketPC e Windows
CE.
Visual Studio .NET 2003
O Visual Studio .NET 2003 inclui capacidades que
possibilitam escrever código e fazer o debug de aplicações
para o .NET Compact Framework. Estas ferramentas e as
técnicas utilizadas são exactamente as mesmas que são
usadas no desenvolvimento de aplicações para o
abrangente .NET Framework. Todavia, utiliza-se as
librarias das classes de base do .NET Compact Framework
que são um sub-conjunto das do .NET Framework geral.
Quando se testa uma aplicação em desenvolvimento,
os resultados são exibidos ou num dispositivo móvel ou
num emulador e o debug é realizado remotamente
usufruindo das capacidades de debug do Visual Studio
.NET.
Tanto o .NET Framework como o .NET Compact
Framework fornecem uma abstracção das capacidades
oferecidas pelo Sistema Operativo que se tem por base.
Quer seja Windows 95, Windows 98, Windows ME,
Windows NT, Windows 2000, Windows XP para o .NET
Framework ou o Windows CE, Windows CE.NET para o
.NET Compact Framework.
Antes do .NET trabalhava-se directamente com o
Win32
API
do
sistema
operativo,
tornando
o
desenvolvimento para o Windows CE uma área de
especialização da programação. Agora é possível para
tarefas similares, a utilização das mesmas ferramentas que
no desenvolvimento das aplicações para desktop. Assim,
esta área torna-se mais atractiva economicamente para as
empresas, já que diminuíram os gastos dispendidos na
formação de pessoal para este tipo de projectos.
No entanto, existem algumas particularidades que
requerem técnicas especiais. Quer devido às dimensões
físicas do ecrã, quer às técnicas de enviar e retirar dados
do aparelho ou implicações ao nível da segurança.
Também é preciso adoptar soluções que protejam os
dados sensíveis pertencentes à empresa e que podem ser
interceptados numa comunicação ou facilmente perdidos
ou roubados juntamente com o aparelho.
30
Existem situações que podem levar o programador que
desenvolve a aplicação a precisar trabalhar fora do
ambiente .NET Compact Framework, como por exemplo
nos casos em que é necessário:
- Ter acesso directo à API Win32 de modo a executar
funções não disponíveis nas librarias do .NET Compact
Framework.
- Aceder a objectos COM. No .NET Compact Framework
não é possível aceder directamente a objectos COM. É
necessário utilizar o eMbedded Visual C++ para criar um
invólucro que permita executar chamadas às funções do
objecto.
- Interagir com DLLs fornecidas por fabricantes de
periféricos. Quando os fabricantes disponibilizarem
librarias .NET, estes periféricos já poderão ser
directamente controlados.
eMbedded Visual Tools Version 3
É um ambiente de desenvolvimento que funciona por si
só, ou seja, não necessita do .NET ou de mais ferramentas
e que transmite um aspecto similar ao Visual Studio 6.
Inclui o eMbedded Visual Basic e o eMbedded Visual C++,
incluindo SDKs para o PocketPC, Palm-size PC e Handheld
PC.
O eMbedded Visual Tools é utilizado para desenvolver
aplicações que o .NET Compact Framework não suporta.
Também se deve ter esta ferramenta em consideração,
quando se pretende desenvolver código com melhor
performance ou quando se pretende controlar o hardware
directamente ou os serviços do sistema operativo. Neste
caso, utiliza-se o eMbedded Visual C++ que, com o seu
acesso directo, consegue ultrapassar o .NET em termos de
velocidade.
eMbedded C++ Version 4
A versão 4 do eMbedded C++ tal como o seu
antecessor é um IDE que permite desenvolver aplicações
nativas utilizando o Win32 API, o Microsoft Foundation
Classes (MFC) e ATL. No entanto, a versão 4 apenas
funciona com o Windows CE .NET.
O Visual Studio .NET Para Aparelhos Móveis
Utiliza-se o Visual Studio .NET 2003 para desenvolver
aplicações para o .NET Compact Framework. Esta
possibilidade apenas foi incluida nesta versão do Visual
Studio, dando a vantagem de permitir aos programadores
já ambientados com a plataforma .NET, de desenvolver
aplicações para aparelhos móveis.
31
AMBIENTE DE
DESENVOLVIMENTO
Como Criar um Projecto
A maneira de criar um projecto para uma aplicação
para PocketPC é a mesma que para criar uma aplicação de
desktop. A principal diferença é que só depois de se
escolher a plataforma em que se vai trabalhar, é que se
pode escolher o tipo de projecto (por exemplo: Windows
Application ou Class Library).
Cria-se um projecto de uma aplicação Smart Devices,
indo ao menu File e seleccionando New e em seguida
Project.
Figura 1 - Janela de Novo Projecto
Aparece a janela de diálogo de novo projecto.
Selecciona-se então a linguagem que se vai utilizar no
projecto a partir do painel do lado esquerdo. O painel do
lado direito lista os templates disponíveis da linguagem
seleccionada.
Escolhe-se então o template Smart Device Application
para criar um projecto para aparelhos móveis. O Visual
Studio .NET 2003 suporta as linguagens Visual Basic .NET
e o C#. Digita-se o nome para o projecto e a localização
dos seus ficheiros.
32
Smart Device Application Wizard
Depois de criar o novo projecto, escolhe-se a
plataforma em que se vai trabalhar e o tipo de projecto
para aplicação com o Smart Device Application Wizard.
Figura 2 - Wizard para o Projecto
A secção superior lista as plataformas disponíveis e o
lado direito, os dispositivos instalados no sistema que são
capazes de correr as aplicações para esse tipo de
plataforma. A parte de baixo lista os tipos de projecto
disponíveis para a plataforma seleccionada.
Tipos de Projecto para uma aplicação de aparelhos
móveis (Smart Device Application):
Windows Application
Cria uma aplicação com o Windows Forms que permita
a entrada e visualização de informação.
Class Library
Cria uma libraria de classes de modo a ser usado pelos
programadores nos seus projectos.
Non-Graphical Application (apenas PocketPC)
Cria um projecto sem elementos gráficos que pode ser
utilizado numa tarefa que corra em background, e que não
tenha necessidade de interacção com o utilizador.
Console Application (apenas Windows CE)
Cria um projecto sem elementos gráficos e que pode
ser chamado a partir da consola de comandos do Windows
CE.
Empty Project
Cria um projecto que não tem ficheiros.
33
O Wizard gera os ficheiros para o projecto seleccionado
e mostra o ambiente de trabalho que tem por defeito.
Figura 3 - Ambiente de Trabalho
Diferenças entre os Projectos de Desktop e de
Device
Algumas funcionalidades que estão acessíveis para as
aplicações de desktop, não se encontram disponíveis para
os projectos de Smart Devices. As principais diferenças
são:
- O Input/Output de ficheiros no Visual Basic .NET:
- Os projectos de Device apenas suportam o .NET
System.IO namespace, não sendo suportado o .NET
Microsoft.VisualBasic.FileSystem namespace;
- Não é suportado o COM interop;
- Não é suportado o uso do Visual Basic .NET late
binding.
Gerir o Projecto
O ambiente de desenvolvimento do Visual Studio .NET
assemelha-se bastante ao que é apresentado quando se
desenvolve uma aplicação para desktop. No entanto, o
SDE (Smart Devices Environment) não dispõe de acesso a
todos os controls disponíveis para o desktop.
34
Figura 4 - Toolbox do SDE
Um projecto SDE suporta os seguintes controls:
- Button, CheckBox, ComboBox, ContextMenu, Control,
DomainUpDown, Form, DataGrid, HScrollBar, ImageList,
InputPanel,
Label,
ListBox,
ListView,
MainMenu,
NumericUpDown,
OpenFileDialog,
Panel,
PictureBox,
ProgressBar, RadioButton, SaveFileDialog, StatusBar,
TabControl, TextBox, Timer, ToolBar, TrackBar, TreeView,
VScrollBar. Todavia, o .NET Compact Framework não
suporta todos os membros destes controls.
35
Sistema de Ajuda
É possível encontrar documentação e ajuda sobre os
controls e aspectos do Visual Studio na janela do Dynamic
Help. Ou então, através da tecnologia IntelliSense que
mostra a síntaxe do comando que se está a digitar, usando
janelas de pop-up e listas drop-down.
O sistema de ajuda do Visual Studio está preparado
para restringir a procura e a amostra de resultados apenas
ao contexto do .NET Compact Framework e SDE. Para isso,
basta activar o filtro existente na lista drop-down que está
disponível tanto no Contents, como no Index e nas Search
pages.
Figura 5 - Dynamic Help
Aplicação Hello World
Tal como em qualquer linguagem, uma maneira útil de
expor uma pequena amostra do seu funcionamento,
utiliza-se o exemplo do Hello World. Para iniciar o
desenvolvimento da aplicação, executa-se o Visual Studio
.NET e cria-se um novo projecto em File/New/Project. Na
janela de diálogo selecciona-se Visual C# Projects e Smart
Devices Application.
36
Figura 6 - Criação do Projecto HelloWorld
Como nome do projecto coloca-se “HelloWorld” e faz-se
a escolha da localização dos ficheiros do projecto. Após
clicar em OK, na janela de Wizard optamos pelo PocketPC
como plataforma e Windows Application como o tipo de
projecto.
Figura 7 - Escolha do Tipo de Projecto
Utilizando o ToolBox é adicionada uma Label à Form1.
A Label é expandida de modo a cobrir a metade superior
da Form1. Depois de seleccionada a Label, altera-se a
propriedade FontSize para 48 e apaga-se o texto da
propriedade Text.
Novamente utilizando o ToolBox, adiciona-se um
Button no fundo da Form1. Altera-se a propriedade Size
para 100, 50 e o Text para “Say Hello”.
37
Figura 8 - Form da Aplicação HelloWorld
Ao fazer duplo clique no Button1 é criado um
procedimento click-event. Coloca-se então o código
seguinte que atribui o texto “Hello World” à propriedade
Text da Label1.
Label1.Text = “Hello World”;
Figura 9 - Código da Aplicação
Grava-se o ficheiro para depois testar a aplicação
utilizando o Emulador.
38
O EMULADOR E
AS COMUNICAÇÕES
Utilização do Emulador
Para testar uma aplicação, pode-se fazer uso de um
aparelho directamente ligado ao computador em que se
está a desenvolver ou através de uma ligação em rede.
Caso não tenha acesso a um aparelho pode-se utilizar o
emulador incluído no Visual Studio .NET 2003.
O emulador simula um dispositivo com o PocketPC ou
Windows CE .NET. Mesmo assim, após terminada, a
aplicação deve ser sempre testada num dispositivo real
antes de ser entregue ao cliente.
Figura 10 - Emulador PocketPC 2002
39
Desenvolvimento de Aplicações numa Rede
Para que a aplicação seja colocada no emulador, o
computador de desenvolvimento tem de ter uma conexão
activa. Caso contrário, ou por não ter um cartão de rede
ou por não estar ligado a uma rede, é necessário instalar o
Microsoft Loopback Adapter para simular a ligação.
O emulador é um PocketPC real que corre como um
processo na máquina. Logicamente, é um aparelho
separado em que o Visual Studio .NET e o PocketPC
comunicam através de protocolos de rede.
Utilizando o Emulador PocketPC
Para testar a aplicação Hello World no Emulador do
PocketPC selecciona-se Start a partir do menu de Debug.
Na janela de Deploy são listados os dispositivos que
suportam o tipo de projecto corrente.
Selecciona-se o PocketPC Device e clica-se no botão de
Deploy. O Visual Studio irá fazer o build da aplicação e
iniciar a aplicação no Emulador. Ao clicar no botão
“HelloWorld” irá aparecer na Label a mensagem “Hello
World”.
Figura 11 - Aplicação HelloWorld em Execução
40
Especificidades dos Aparelhos Móveis
O .NET Compact Framework possibilita um maior
acesso ao desenvolvimento para dispositivos móveis a um
maior número de programadores, em virtude da sua
consistência em relação ao modelo de programação
destinado aos desktops. No entanto, restam algumas
considerações a ter face ao desenvolvimento e concepção
para aparelhos móveis.
Transferência de Dados
Os equipamentos portáteis como os PocketPC oferecem
gestão e sincronização de dados pessoais que dão acessos
móveis a e-mails, agendas e calendários. Todavia, num
dispositivo com uma boa conectividade, a capacidade de
transferência de dados de e para o aparelho proporciona
grandes potencialidades às aplicações.
No entanto, existem alguns factores a ter em conta no
que diz respeito às aplicações móveis, como a frequência
em que os dados são transferidos de e para o dispositivo,
por exemplo se é diário ou está permanentemente ligado a
uma rede. Também se deve ter em atenção se a
conectividade à rede é fiável, pois em caso contrário será
necessário guardar os dados na cache do aparelho, para
serem transmitidos assim que possível.
XML Web Services
XML Web Services redefinem o modo como os sistemas
informáticos funcionam. Construído sobre linguagens
standard de XML e HTTP, o XML Web Service proporciona
um modelo simples de oferecer serviços através da rede.
Assim, permite que servidores de diferentes plataformas
se liguem a serviços em qualquer lugar da rede.
Com o alargamento do XML Web Services também aos
dispositivos móveis, desde que estes tenham uma ligação
à Web, as aplicações nos aparelhos terão acesso a uma
multiplicidade de serviços e dados. Para além disso,
permite enviar dados de volta para os servidores de uma
empresa.
SQL Server CE
Enquanto o XML Web Services possibilita solucionar a
transferência de dados, o SQL Server CE permite fazer uso
das classes disponíveis no System.Data.SqlServerCE,
aceder a dados em servidores SQL remotos, descarregálos para o dispositivo, proceder a consultas e alterações
41
enquanto desconectado e possibilitando o posterior envio e
actualização das alterações efectuadas.
Dispositivos Com Recursos Limitados
Devido às especificidades próprias dos PDAs e
dispositivos móveis, estes são aparelhos pequenos,
possuindo uma área de visualização diminuta, e com
memória reduzida. Dependem de bateria com uma
duração limitada, que deverá prolongar-se no máximo
período de tempo possível.
Tem que se ter em conta que, a não ser nos casos em
que a aplicação corra num hardware com um teclado, na
maioria das vezes a interacção é feita através de uma
caneta.
Estas características únicas trazem implicações ao nível
de concepção no que diz respeito ao desenvolvimento do
interface. Assim, fazem-se uso de técnicas de selecção
fácil, tal como listas de drop-down, e um interface que
limite a quantidade de introdução de texto por parte do
utilizador.
É aconselhável ter sempre em consideração a utilização
de memória por parte da aplicação. E se for necessário
manter objectos de grandes dimensões em memória,
deve-os libertar assim que possível. No PocketPC não
existe um botão de saída da aplicação e esta tende a
correr continuamente, a janela da aplicação fica em
background enquanto as outras estão a correr.
Implicações a Nível da Segurança
É particularmente importante ter em atenção a
segurança no que concerne as aplicações para aparelhos
móveis, pois existem muitas possiveis falhas de segurança
nestes dispositivos. Por isso, é imperativo que esta ideia
esteja presente desde a primeira fase do projecto de modo
a evitar estas situações.
Os dados podem ter que ser encriptados quando
transferidos de e para o aparelho através do XML Web
Services e os dados poderão ter que estar encriptados no
aparelho e protegidos por password ou com métodos
biométricos tal como leitura de impressões digitais.
Os clientes deverão de ser autenticados quando
acedem a dados confidenciais em IIS ou SQL Server.
42
CONTROLS DA
WINDOWS
FORMS
43
WINDOWS FORMS
O interface de uma aplicação é um aspecto importante
no desenvolvimento de um software. Quer num sistema
desktop quer num PocketPC, a aplicação deve dar ao
utilizador uma experiência intuitiva e com bom feedback. A
libraria Windows Form é um conjunto de classes orientada
ao objecto especificamente para dotar o programador de
ferramentas que permitem construir interfaces mais ricos e
poderosos.
Inclui desde botões e caixas de texto até controls mais
complexos como o TreeView e TabControl, assim como
caixas de diálogo frequentemente utilizadas para abrir ou
gravar documentos.
Todos os controls são baseados numa arquitectura
hierárquica comum, que permite desenvolver mais
facilmente controls próprios ou acrescentar funcionalidades
aos já existentes.
As classes do Windows Forms assumem uma
importância ainda maior, já que são os mesmos controls
utilizados no abrangente Visual Studio .NET Framework.
Deste modo, os programadores podem rapidamente
desenvolver interfaces, accionando e arrastando controls,
definir as suas propriedades, escrever código para quando
se despoleta um evento. Tudo isto da mesma forma que
têm vindo a fazer desde há anos no Visual Studio.
Criação de Controls
O Forms Designer permite arrastar e largar controls
desde a ToolBox directamente para uma Form. Então, é
possível alterar o tamanho, posição e outras propriedades
desses controls. È também possível instanciar controls em
runtime através de código.
O exemplo seguinte mostra como criar um botão em
runtime, definindo a sua posição em relação à form, e
adicionando-a à colecção de Controls da Form.
System.Windows.Form.Button submitButton = new Button();
submitButton.Location = new Pount(100,100);
submitButton.Text = “Submit”;
this.Controls.Add(submitButton);
44
Membros dos Controls
Como os controls do .NET Compact Framework são um
sub-conjunto dos controls no .NET Framework, grande
parte das propriedades, eventos e métodos são idênticos
na sua utilização.
Mas, algumas das funcionalidades foram excluídas do
.NET Compact Framework devido à limitação ao nível de
recursos ou porque tal funcionalidade não é aplicável para
o desenvolvimento de aplicações para PocketPC.
Propriedades
É possível definir as propriedades de um control
utilizando a janela de propriedades durante o design-time
ou através de código em runtime. Para definir as
propriedades em design-time basta clicar no control que se
pretende, escolher a propriedade e introduzir o valor
pretendido ou clicar numa lista de valores possiveis.
Métodos
Cada control tem um conjunto de métodos prédefinidos que possibilitam exercer as funcionalidades
próprias a cada um. Existem métodos comuns a vários
controls, estes métodos desempenham a mesma função
mas de acordo com o control em causa.
Eventos
Para tratar de um determinado evento cria-se um
método contendo o código a ser executado quando esse
evento ocorre, interligando depois esse método ao evento.
Também é possível criar o método do evento de um
control ao fazer um duplo-clique sobre o control no Forms
Designer. Esta acção cria o método correspondente ao
evento primário de um control. Ou seja, o evento mais
provável de ser utilizado no control. Por exemplo, no caso
de um Button, o evento mais provável
45
CONTROLS
Descrição e exemplos de códigos dos controls
disponíveis de base no .NET Compact Framework.
Button
O control button é um dos mais utilizados numa
aplicação de Windows. Um button pode ser clicado com o
rato ou com o stylus. Tal acção faz com que o control
despolete o evento Click.
Figura 12 - Button
46
CheckBox
O control CheckBox é normalmente utilizado para
apresentar uma opção de Verdadeiro/Falso ou de Sim/Não.
A propriedade Checked indica o estado actual do control
(Verdadeiro/Falso).
Figura 13 - CheckBox
A propriedade CheckState.Checked verifica igualmente
se a caixa está
seleccionada através dos valores
CheckState.Unchecked e CheckState.Check. Mas há ainda
um
terceiro
estado
para
esta
propriedade,
o
CheckState.Indeterminate que fica disponível ao colocar a
propriedade ThreeState a true. Se a propriedade
CheckedState estiver em CheckState.Indeterminate o
control aparece seleccionado mas acizentado.
checkBox1.ThreeState = true;
checkBox1.CheckState = CheckState.Indeterminate;
checkBox1.AutoCheck = false;
47
ComboBox
O ComboBox é uma boa maneira de proporcionar
várias escolhas ao utilizador enquanto conserva espaço de
visionamento. Quando o utilizador clica no control é listado
um conjunto de opções.
Figura 14 - ComboBox
É possível adicionar itens à ComboBox em design-time
através da propriedade Itens na janela de propriedades.
Ou então, no código através do método Add da colecção
Itens.
comboBox.Items.Add(“Item 1”);
comboBox.Items.Add(“Item 2”);
A propriedade SelectedIndex indica o índex do item
seleccionado. Se esta propriedade for definida no código, o
item aparecerá seleccionado. Se nenhum item estiver
seleccionado esta propriedade retorna -1. A propriedade
SelectedItem é similar mas retorna uma referência ao item
seleccionado.
// Item seleccionado com SelectedIndex
label1.Text =
(string)comboBox1.Items[comboBox1.SelectedIndex];
// Item seleccionado com SelectedItem
label2.Text = (string)comboBox1.SelectedItem;
48
ContextMenu
O ContextMenu permite construir menus de pop-up
associados a um control, que são activados no PocketPC
por tap-and-hold.
Figura 15 - ContextMenu
Exemplo da criação de uma ContextMenu e a sua
atribuição a uma TextBox:
// criar objecto ContextMenu
System.Windows.Forms.ContextMenu ConMenu = new ContextMenu();
// criar itens
System.Windows.Forms.MenuItem menuItem1 = new MenuItem();
menuItem1.Text = "&Paste";
System.Windows.Forms.MenuItem menuItem2 = new MenuItem();
menuItem1.Text = "&Cut";
// adicionar items ao ContextMenu
ConMenu.MenuItems.Add(menuItem1);
ConMenu.MenuItems.Add(menuItem2);
// inferir o ContextMenu à TextBox
textBox1.ContextMenu = ConMenu;
DataGrid
Este control apresenta dados a partir de uma tabela de
dados ou de uma colecção. O programador pode
seleccionar quais as colunas a visualizar da tabela de
dados, definir a largura da coluna e o texto do cabeçalho.
Pode controlar os eventos que são despoletados quando o
utilizador selecciona uma linha ou uma célula.
49
A propriedade DataSource deste objecto pode funcionar
como a origem dos dados para serem exibidos num
objecto DataTable, DataView, ArrayList ou em qualquer
componente que implemente os interfaces IListSource ou
IList.
// myDataSet may contain more than one DataTable
DataTable myDataTable = myDataSet.Tables[“Customers”];
DataGrid.DataSource = myDataTable;
Os utilizadores podem seleccionar uma das linhas ao
carregar na coluna da esquerda ou então podem
seleccionar uma só célula.
É possível detectar quando um utilizador carrega em
qualquer parte do control através do evento MouseUp. São
passadas as coordenadas X e Y de onde o utilizador
carregou. O método HitTest retorna o objecto HitTestInfo
que tem as propriedades Type, Row e Column que, por sua
vez, retornam informação acerca da célula em que o
utilizador carregou.
A propriedade HitTestInfo.Type retorna um dos valores
Cell,
ColumnHeader,
ColumnResize,
RowHeader,
RowResize ou None.
private void Grid_MouseUp(object sender, MouseEventArgs e)
{
// Get the DataGrid by casting sender.
DataGrid myGrid = (DataGrid)sender;
// Create a HitTestInfo object using the HitTest method.
DataGrid.HitTestInfo myHitInfo =
myGrid.HitTest(e.X, e.Y);
Console.WriteLine(myHitInfo);
Console.WriteLine(myHitInfo.Type);
Console.WriteLine(myHitInfo.Row);
Console.WriteLine(myHitInfo.Column);
if (myHitInfo.Type == DataGrid.HitTestType.Cell)
{
Console.Write("Data: ");
object celldata =
myGrid[myHitInfo.Row, myHitInfo.Column];
Console.WriteLine(celldata.ToString());
}
}
CurrentCell
Permite obter ou então estabelecer a célula que está
seleccionada. Só é possível utilizar esta propriedade em
runtime. O DataGrid posiciona-se de forma a mostrar a
célula caso esta não esteja visível.
50
// Set focus to cell 3,5
myGrid.CurrentCell = new DataGridCell(3,5);
BackColor, ForeColor, GridLineColor, HeaderBackColor,
HeaderForColor, SelectionBackColor, SelectionForColor
Formatam as cores do control.
ColumnHeadersVisible, RowHeadersVisible
Determinam se os cabeçalhos das colunas e
indicadores de linha estarão visíveis.
os
Para definir as propriedades de cada uma das colunas,
tais como o título e a largura, é necessário criar uma
instância da classe DataGridTableStyle e adicionar a
instância DataGridColumnStyle para cada uma das
colunas. Depois adicionar a DataGridTableStyle à
propriedade TableStyles da classe DataGrid.
GridTableStyle tsl = new GridTableStyle();
tsl.MappingName = “Customers”;
/* Add a GridColumnStyle and set its MappingName to the name
of a DataColumn in the DataTable.
Set the GeaderText and Width properties. */
DataGridColumnStyle boolCol = new DataGridTextBoxColumn();
boolCol.MappingName = “Current”;
boolCol.HeaderText = “IsCurrent Custumer”;
boolCol.Width = 150;
// Add a second column style
DataGridColumnStyle TextCol =
newDataGridTextBoxColumn();
TextCol.MappingName = “CustName”;
TextCol.HeaderText = “Custumer Name”;
TextCol.Width = 250;
tsl.GridColumnStyles.Add(TextCol)
/* Add the DataGridTableStyle instance to
the GridTableStyleCollection. */
dataGrid1.TableStyles.Add(tsl);
DomainUpDown
O control DomainUpDown é muito similar aos controls
ComboBox e ListBox mas ocupa muito pouco espaço, o
que é ideal para aplicações PocketPC. Permite ao utilizador
fazer uma selecção a partir de uma lista de objectos.
O control chama o método ToString para cada objecto,
de modo a retornar o texto que exibe. Visualmente, é
parecido com uma TextBox com um par de botões para
mover num e noutro sentido da lista. A desvantagem em
relação à ComboBox e à ListBox é o facto de o utilizador
não poder visualizar todos os itens da lista.
51
Figura 16 - DomainUpDown
ReadOnly
Se estiver True, apenas os itens da lista podem ser
seleccionados. Se estiver False o utilizador pode introduzir
texto que não está na lista.
SelectedIndex
Indica ou define qual o item que está seleccionado. Por
defeito tem o valor -1 indicando que nenhum item está
seleccionado.
private void Form1_Load(object sender, System.EventArgs e)
{
domainUpDown1.Items.Add("Item 1");
domainUpDown1.Items.Add("Item 2");
domainUpDown1.Items.Add("Item 3");
domainUpDown1.Items.Add("Item 4");
domainUpDown1.ReadOnly = true;
}
private void domainUpDown1_SelectedItemChanged(object sender,
System.EventArgs e)
{
label1.Text = domainUpDown1.SelectedIndex.ToString();
label2.Text
=
domainUpDown1.Items[domainUpDown1.SelectedIndex].ToString();
}
52
HScrollBar e VScrollBar
Muitos controls já possuem barras de deslocamento
quando o seu conteúdo excede as dimensões do control.
No entanto, quando se pretende obter o mesmo efeito
utilizando outros controls é necessário utilizar o HScrollBar
e o VScrollBar.
HScrollBar.Minimum e LScrollBar.Minimum
Define a posição quando a caixa de deslocamento está
no extremo esquerdo (HScrollBar) ou no topo (VScrollBar)
do control.
HScrollBar.Maximum e LScrollBar.Maximum
Atribui o extremo máximo da barra de deslocamento.
HScrollBar.SmallChange e LScrollBar.Maximum
Ajusta o incremento a usar quando o utilizador
pressiona uma das setas da barra.
HScrollBar.LargeChange e LScrollBar.Maximum
Estabelece o incremento a usar quando o utilizador
pressiona as teclas PageUp ou PageDown, ou quando o
utilizador clica na barra de deslocamento, fora da caixa de
deslocamento.
Evento ValueChanged
É accionado quando a barra de deslocamento é
utilizada. Com a propriedade Value é possível obter a
posição corrente.
ImageList
O control ImageList é um componente que funciona
como recipiente de imagens. Em design-time é possível
adicionar imagens ao control através da janela Image
Collection Editor. Em runtime é possível adicionar imagens
utilizando o método ImageList.Images.Add.
Todas as imagens por defeito têm o mesmo tamanho
(16, 16). É possível com a propriedade ImageSize
especificar um tamanho diferente. As imagens guardadas
na ImageList podem ser utilizadas nos controls ListView,
TreeView ou ToolBar.
O exemplo seguinte constrói uma nova instância da
classe ImageList e adiciona-lhe imagens. São incluídos
itens a uma ListView
e direccionada a propriedade
ImageIndex para o índex da instância ImageList.
using System;
using System.Drawing;
using System.Collections;
using System.Windows.Forms;
using System.Reflection;
53
private void Form1_Load(object sender, System.EventArgs e)
{
ImageList imgList = new ImageList();
// acrescenta quatro imagens como recursos embedded
Bitmap bmp = new Bitmap(Assembly.GetExecutingAssembly()
.GetManifestResourceStream(“pic01.jpg"));
imgList.Images.Add(bmp);
bmp = new Bitmap(Assembly.GetExecutingAssembly()
.GetManifestResourceStream("pic02.jpg"));
imgList.Images.Add(bmp);
bmp = new Bitmap(Assembly.GetExecutingAssembly()
.GetManifestResourceStream("pic03.jpg"));
imgList.Images.Add(bmp);
bmp = new Bitmap(Assembly.GetExecutingAssembly()
.GetManifestResourceStream("pic04.jpg"));
imgList.Images.Add(bmp);
imgList.ImageSize = new Size(64, 64);
// define a ListView
listView1.SmallImageList = imgList;
listView1.View = View.List;
// adiciona imagens
listView1.Items.Add(new ListViewItem("Pic1"));
listView1.Items[0].ImageIndex = 3;
listView1.Items.Add(new ListViewItem("Pic2"));
listView1.Items[1].ImageIndex = 2;
listView1.Items.Add(new ListViewItem("Pic3"));
listView1.Items[2].ImageIndex = 1;
listView1.Items.Add(new ListViewItem("Pic4"));
listView1.Items[3].ImageIndex = 0;
}
Figura 17 - ImageList
54
Label
Este control é utilizado para exibir texto especificado
pela propriedade Text.
TextAlign
Utilizado para alinhar o texto com um dos seguintes
valores: TopLeft (esquerda), TopCenter (centrado),
TopRight (direita).
ListBox
O control exibe uma lista de itens da qual o utilizador
pode escolher. Possui uma barra de deslocamento e se o
número de itens exceder a área de visualização, será
apresentada uma barra de deslocamento vertical.
As propriedades e métodos da ListBox são muito
idênticos aos da ComboBox. As principais diferenças entre
eles é que a ComboBox exibe a lista de itens apenas
quando o utilizador clica na seta do lado direito do control.
Por sua vez, a ListBox apresenta o maior número de itens
possível para o tamanho que lhe foi atribuido.
Figura 18 - ListBox
O método Add adiciona itens à ListBox, sendo possível
remover um item individualmente com Remove ou todos
os itens com o método Clear.
55
É possível popular a ListBox em design-time editando a
propriedade Itens na janela de propriedades. A
propriedade SelectedIndex indica o índex do item
seleccionado. A propriedade SelectedItem é similar mas
retorna uma referência ao item seleccionado.
É possível fazer o bind da ListBox a uma colecção,
direccionando a propriedade DataSource à colecção
pretendida e atribuindo à propriedade DisplayMember o
nome do campo que se pretende visualizar.
ListView
Este control é utilizado para visualizar uma lista de
itens, com a possibilidade de associar um ícon que
visualmente os identifique. Os itens da ListView podem ser
expostos de quatro modos: Large Icons, Small Icons, List e
Details.
No modo Details, o ListView pode mostrar texto
adicional relativo a cada Item através de subitens. A
primeira coluna exibe o texto do Item, a segunda, terceira
e subsequêntes colunas mostram texto dos subitens
associados. O exemplo seguinte mostra como adicionar
Itens a um ListView, representando uma lista de contactos
e respectivos subitens com os números de telefone de
cada contacto.
myListView.View = View.Details;
myListView.CheckBoxes = true;
myListView.FullRowSelect = true;
ListViewItem Contact1 = new ListViewItem("Ana");
Contact1.SubItems.Add ("22 445 65 45");
Contact1.SubItems.Add ("22 784 26 19");
Contact1.SubItems.Add ("91 484 27 49");
ListViewItem Contact2 = new ListViewItem("João");
Contact2.SubItems.Add ("25 865 75 05");
Contact2.SubItems.Add ("22 412 86 12");
Contact2.SubItems.Add ("93 484 07 40");
ListViewItem Contact3 = new ListViewItem("Jorge");
Contact3.SubItems.Add ("22 954 12 41");
Contact3.SubItems.Add ("26 214 56 53");
Contact3.SubItems.Add ("96 164 97 69");
myListView.Columns.Add("Nome", -2, HorizontalAlignment.Right);
myListView.Columns.Add("Trab", -2, HorizontalAlignment.Left);
myListView.Columns.Add("Casa", -2, HorizontalAlignment.Left);
myListView.Columns.Add("Telm",
-2,
HorizontalAlignment.Center);
56
myListView.Items.Add(Contact1);
myListView.Items.Add(Contact2);
myListView.Items.Add(Contact3);
Figura 19 - ListView
É possivel examinar a lista percorrendo cada elemento
e verificando cada propriedade Checked para determinar
quais os Itens que o utilizador seleccionou.
foreach (ListViewItem chkItem in myListView.Items)
{
if (chkItem.Checked)
{
// operações com o item seleccionado
}
}
Para aceder ao Item que tem o focus, utiliza-se a
propriedade FocusedItem e para obter o texto de um dos
subitens, a propriedade SubItens.
MessageBox.Show(myListView.FocusedItem.SubItems[0].Text);
MainMenu
Uma aplicação de PocketPC por defeito contém um
control MainMenu. Os menus são colocados no fundo da
form. Apesar de reduzir o espaço de área disponivel, é de
uma maneira geral, um modo eficiente de apresentar
múltiplas opções ao utilizador.
É possivel adicionar itens a um menu, tanto na janela
de desenvolvimento, como também no próprio código.
57
Exemplo da criação de um Menu com sub-menus:
Menu mainMenu1 = new Menu();
MenuItem SubItem1 = new MenuItem();
MenuItem Item1 = new MenuItem();
SubItem1.Text = "Cut";
Item1.Text = "Edit";
Item1.MenuItems.Add(SubItem1);
mainMenu1.MenuItems.Add (Item1);
NumericUpDown
Este control é semelhante ao DomainUpDown, mas
funcionando com números em vez de objectos. Apenas
aceita valores inteiros, sendo truncados os valores
decimais.
NumericUpDown.Maximum e NumericUpDown.Minimum
Estabelece os limites superiores e inferiores dos valores
a apresentar.
NumericUpDown.Increment
Define as unidades a incrementar quando o utilizador
clica nos botões Up e Down.
NumericUpDown.Value
Retorna o valor seleccionado.
NumericUpDown.ReadOnly
Se estiver a True, o utilizador está limitado aos valores
apresentados. Se False, pode introduzir qualquer valor
além dos que são dados.
Figura 20 - NumericUpDown
58
OpenFileDialog / SaveFileDialog
Estes dois controls são componentes, por isso quando
são colocados numa form aparecem na área destinada aos
componentes.
OpenFileDialog.ShowDialog e SaveFileDialog.ShowDialog
Torna visivel a caixa de diálogo, retornando a
enumeração DialogResult que indica se o utilizador colocou
um nome de ficheiro válido, ou se pressionou o botão para
cancelar.
OpenFileDialog.FileName e SaveFileDialog.FileName
Obtem-se o caminho e o nome do ficheiro.
OpenFileDialog.Filter e SaveFileDialog.Filter
Estabelece os tipos de ficheiro e extensões que serão
válidos para as caixas de diálogo.
// filtra os nomes da caixa de diálogo a ficheiros de imagem
saveFileDialog1.Filter =
“Jpeg image|*.jpg|Bitmap image|*.bmp|GIF image|*.gif”
OpenFileDialog.InitialDirectory
SaveFileDialog.InitialDirectory
Especifica o directório que por defeito será apresentado
na caixa de diálogo.
Figura 21 - SaveFileDialog
O exemplo seguinte cria um directório, mostra o
control saveFileDialog e grava num ficheiro com o nome
especificado pelo utilizador, o conteúdo de uma TextBox.
59
include System.IO;
include System.Windows.Forms;
private void button1_Click(object sender, System.EventArgs e)
{
// cria e inicializa o control
SaveFileDialog dlg = new SaveFileDialog();
dlg.Filter = "Text File|*.txt";
dlg.FileName = "exemplo.txt";
dlg.InitialDirectory = "\\My Documents";
// se foi inserido um nome correcto, o ficheiro é gravado
if (dlg.ShowDialog() == DialogResult.OK)
{
StreamWriter sw = new StreamWriter(dlg.FileName, false);
sw.Write(textBox1.Text);
sw.Close();
}
}
Panel
O Panel funciona como um recipiente para outros
controls. Em design-time é possivel colocar controls no
Panel, de modo que, quando se move o Panel os controls
nele inseridos se movam também.
Panel.BackColor
Define a cor de fundo do Panel.
Figura 22 - Panel
60
Este é o exemplo de um Panel com uma barra de
deslocamento que foi realizado utilizando um control
VScroolBar e um outro Panel dentro do Panel inicial.
PictureBox
Este control é utilizado para quando se tem o objectivo
de mostrar imagens, fazendo a leitura a partir de um
ficheiro ou mesmo de um recurso incluido. É então possivel
posicionar a imagem num local desejado ou redimensionála de acordo com a área pretendida.
Image
Define a imagem a carregar no control.
Bitmap bmp = new Bitmap(Assembly.GetExecutingAssembly()
.GetManifestResourceStream(
"isep.jpg"));
Caso seja necessário redimensionar uma imagem
utilizam-se métodos das classes System.Drawing.
Figura 23 - PictureBox
ProgressBar
Permite transmitir visualmente ao utilizador, através de
uma barra de progressão, a proporção do tratamento de
uma tarefa. Deste modo, o utilizador terá uma noção de
que algo está a ser processado em background e evitar
que confunda um longo período de inactividade com um
qualquer bloqueio de sistema.
61
ProgressBar.Minimum e ProgressBar.Maximum
Definem os valores mínimos e máximos da barra de
progressão.
ProgressBar.Value
Indica quantas unidades possui a barra nesse
determinado momento. Quando este valor for igual ao
valor de Maximum, a barra está cheia.
Figura 24 – ProgressBar #1
Figura 25 – ProgressBar #2
62
private void button1_Click(object sender, System.EventArgs e)
{
label1.Text = "Loading... Please Wait";
Application.DoEvents();
// define os limites minimos e maximos
progressBar1.Minimum = 250;
progressBar1.Maximum = 25000;
progressBar1.Value = progressBar1.Minimum;
// faz a leitura do ficheiro
string fileUrl = new FileInfo(path).DirectoryName
+ @"\progressbar.txt";
int readcount = 0;
while (fileUrl.Read())
{
// faz o update do progressbar em cada 100 leituras
if ((++readcount % 100) == 0)
{
if (progressBar1.Value < progressBar1.Maximum)
progressBar1.Value += progressBar1.Minimum;
}
}
// tarefa completa
progressBar1.Value = progressBar1.Maximum;
label1.Text = "Complete!";
}
RadioButton
São normalmente utilizados quando é necessário fazer
exclusões múltiplas de opções. Caso seja necessário dois
ou mais grupos de RadioButtons, utiliza-se o control Panel.
Quando um utilizador clica num qualquer RadioButton,
todos os RadioButtons do mesmo grupo serão
desseleccionados.
RadioButton.Checked
Define se um RadioButton está seleccionado se o valor
for True ou se não está seleccionado caso o valor seja
False.
Evento CheckedChanged
Dispara sempre que a propriedade Checked é alterada.
StatusBar
É uma área onde se coloca informação no fundo da
janela. Permite exibir uma linha de texto, sendo uma boa
alternativa ao ProgressBar.
63
Figura 26 - StatusBar
TabControl
Permite mostrar múltiplas vistas numa mesma área. É
um control muito útil em dispositivos móveis pois permite
o uso do ecrã de uma forma mais eficiente. Os utilizadores
podem clicar num separador para o activar.
Em design-time, quando se arrasta um TabControl para
a form não possui qualquer tab. É necessário adicionar ou
remover tabs de acordo com os objectivos pretendidos. É
possivel então adicionar outros controls à TabControl tal
como no Form ou no Panel.
TabControl.SelectedIndex
Define qual o Tab a ser exibido.
Evento SelectedIndexChanged
Dispara quando o utilizador activa um dos Tabs que
estão em background.
64
Figura 27 - TabControl
TextBox
É utilizado para introdução de texto.
TextBox.BackColor e TextBox.ForeColor
Estabelece a côr de fundo e a côr do texto presente na
TextBox.
Eventos KeyPress, KeyUp e KeyDown
Detecta a introdução de texto no control.
O código seguinte converte o texto introduzido numa
TextBox para maiúsculas.
public class myTextBox : TextBox
{
protected override void OnKeyPress(KeyPressEventArgs e)
{
if(Char.IsLetter(e.KeyChar))
{
int pos = this.SelectionStart;
this.Text = this.Text.Insert(
this.SelectionStart,
char.ToUpper(e.KeyChar).ToString());
this.SelectionStart=pos+1;
e.Handled=true;
}
}
}
65
Timer
Permite que seja executado determinado código
repetidamente entre um intervalo de tempo definido.
Existem outros temporizadores disponíveis no namespace
System.Threading que devem ser utilizados quando o
código é executado fora da form, em processos multithread.
No design-time, quando se arrasta o Timer da janela
de propriedades para a form, sendo um componente
aparecerá no menu de componentes.
Timer.Enabled
Ao definir com True iniciará o temporizador, e ao
colocar False fará com que pare;
Timer. Interval
Ajusta o tempo em mili-segundos entre o qual o evento
Tick será chamado.
O exemplo seguinte mostra uma imagem que é
redimensionada de 100 em 100 mili-segundos:
private void Form1_Load(object sender, System.EventArgs e)
{
// definir o intervalo tempo em que o método tick é chamado
timer1.Interval = 100;
timer1.Enabled = true;
}
private void timer1_Tick(object sender, System.EventArgs e)
{
if (continuarTick())
{
// código a executar entre período de tempo
}
else
// pára o temporizador
timer1.Enabled = false;
}
Toolbar
Uma Toolbar contém botões que normalmente são
utilizados como atalhos para itens de menus. É assim, uma
forma mais rápida de aceder às funcionalidades mais
utilizadas. Consiste em botões gráficos, não sendo possivel
colocar texto nestes botões. É associado um control
ImageList para aceder às imagens a utilizar. Por defeito, o
Toolbar aparece na parte inferior do ecrã, ao lado direito
das opções de menu.
66
Para utilizar o Toolbar adiciona-se uma ImageList e
através do “Image Collection Editor” acrescenta-se
imagens a esse control. Esta ImageList é direccionada
como sendo a fonte das imagens utilizadas na Toolbar
através da propriedade ImageList. Com o “ToolBarButton
Collection Editor” é possivel adicionar as imagens para os
botões necessários.
Figura 28 - ToolBar
ToolBar.Style
Define os quatro tipos de botões possíveis:
- PushButton;
- ToggleButton;
- Separator;
- DropDownButton.
Private Sub toolBar1_ButtonClick(
ByVal sender As Object, ByVal e As
System.Windows.Forms.ToolBarButtonClickEventArgs) _
Handles toolBar1.ButtonClick
If e.Button.Equals(Me.toolBarButton1) Then
label1.Text = " Button1 foi pressionado"
Else
If e.Button.Equals(Me.toolBarButton2) Then
If e.Button.Pushed Then
label1.Text = "Button2 está pressionado"
Else
label1.Text = "Button2 não está pressionado"
End If
End If
End If
End Sub
67
É necessário definir em cada botão através da
propriedade ImageIndex, o índex da imagem que se quer
utilizar na ImageList.
Evento ButtonClick
Detecta quando o utilizador pressiona uma das
imagens.
Este
evento
recebe
o
objecto
ToolBarButtonClickEventArgs que identifica qual o botão
que foi pressionado.
TrackBar
Este control funciona como uma barra de ajuste
através da qual o utilizador pode escolher um valor entre
um limite estabelecido. Uma utilização comum é a selecção
de opções de configuração, tais como um valor de timeout
ou de refrescamento.
Figura 29 - TrackBar
TrackBar.Minimum e TrackBar.Maximum
Define os limites mínimos e máximos do valor que a
barra pode assumir.
TrackBar.TickFrequency
Define a distância entre as marcas na parte inferior da
barra.
TrackBar.SmallChange
Define o incremento a utilizar quando o utilizador
pressiona uma das teclas de navegação.
68
TrackBar.LargeChange
Define o incremento quando o utilizador pressiona em
PageUp ou PageDown, ou quando clica num dos lados da
barra.
TreeView
Apresenta uma vista hierarquizada de uma colecção de
objectos. A propriedade Nodes da TreeView é uma
colecção de objectos TreeNode. É possivel adicionar um ou
mais Nodes (ramos) a esta colecção. Estes Nodes são os
ramos na raiz da árvore.
A propriedade Text de cada objecto TreeNode
determina o texto a exibir nesse Node. Cada objecto
TreeNode tem igualmente a propriedade Nodes, permitindo
assim adicionar sub-ramos a cada ramo e assim
sucessivamente.
Figura 30 - TreeView
TreeView.ShowRootLines
Define se são desenhadas linhas entre os ramos da raiz
da árvore.
TreeView.ShowLines
Define se são desenhadas linhas entre cada ramo.
TreeView.ShowPlusMinus
Define se são desenhados os botões “+” e “-“ junto dos
ramos que têm filhos, permitindo expandir ou contrair os
sub-ramos.
69
TreeView.ImageList
Inclui ícons que poderão ser acrescentados aos ramos
da árvore. O ImageIndex define o índex do ícon que será
mostrado por defeito em cada ramo. Para exibir um icon
em particular no ramo utiliza-se a propriedade ImageIndex
do respectivo TreeNode.
TreeView.SelectedNodeIndex
Indica o índex do icon que será mostrado quando um
ramo é seleccionado. Apenas é possivel seleccionar um
Node de cada vez.
TreeView.CheckBoxes
Define se é mostrada uma CheckBox junto a cada
folha. A propriedade Checked do TreeNode indica se um
Node em particular está ou não com a caixa seleccionada
através dos valores True ou False, respectivamente.
Evento AfterCheck
Dispara quando o utilizador clica numa CheckBox.
// criar TreeNode, TreeView e ImageList
System.Windows.Forms.TreeNode treeNode1 =
new System.Windows.Forms.TreeNode();
this.treeView1 = new System.Windows.Forms.TreeView();
this.imageList1 = new System.Windows.Forms.ImageList();
// propriedades do treeView1
this.treeView1.CheckBoxes = true;
this.treeView1.ImageList = this.imageList1;
this.treeView1.Location = new System.Drawing.Point(16, 16);
treeNode1.Text = "Compras";
this.treeView1.Nodes.Add(treeNode1);
this.treeView1.Size = new System.Drawing.Size(200, 232);
// adicionar treeView1 à form1
this.Controls.Add(this.treeView1);
O control TreeView coloca automaticamente barras de
deslocamento, caso a árvore ultrapasse a área de
visionamento.
70
CONSTRUIR
APLICAÇÕES
PARA
POCKETPC
A CLASS FORM
Apesar de termos constatado que elaborar uma form
do Windows e o seu respectivo código no .Net Compact
Framework é semelhante ao modo como é feito na
generalidade do .Net Framework, o design da form é muito
diferente.
A plataforma PocketPC é concebida com uma janela
pequena, um ecrã sensivel ao toque e a introdução de
dados é realizada através do uso de um stylus. Isto
significa que quando se elabora o design de uma aplicação
para o PocketPC (ou qualquer outro engenho com limitado
tamanho de ecrâ), em cada uma das forms deve-se
planear o número, o tamanho e a disposição dos controls.
Propriedades de uma Form
Os valores que controlam o estilo da border da form,
diferem entre um PocketPC e o Windows. De igual modo,
os que controlam o aspecto da caixa de control e os botões
de fechar, minimizar e maximizar também são distintos. As
seguintes propriedades definem o aspecto da form e seu
comportamento:
Form.FormBorderStyle
A propriedade FormBorderStyle controla o estilo da
border da form. Esta propriedade pode ser atribuida em
design-time através da janela de Propriedades ou em
runtime através de código. A definição por defeito para a
form
é
FormBorderStyle.FixedSingle.
Definindo
a
propriedade como FormBorderStyle.None, vai criar uma
form sem border e sem titulo. Neste caso, a form pode ser
deslocada ou redimensionada através de código.
Estabelecendo a propriedade com qualquer outro valor fará
expandir a form até preencher por completo a área de
desktop,
evitando
que
esta
seja
movida
ou
redimensionada. A área desktop engloba todo o ecrã,
excepto a barra de Start e o menu principal (caso esteja
presente).
Form.WindowState
Aceita só duas definições: FormWindowState.Normal ou
FormWindowsState.Maximized.
Não
existe
nesta
propriedade nenhuma opção para minimizar a janela. O
FormWindowState.Normal fará com que a aplicação ocupe
toda
a
área
do
desktop.
Se
estiver
em
FormWindowsState.Maximized fará com que esta preencha
o ecrâ por inteiro, tapando o menu Start mas mostrando o
menu principal da form (se este estiver presente).
72
Form.ControlBox
A Propriedade ControlBox pode ser atribuida com True
para que seja exibida a ControlBox da form ou com False
para prevenir que esta apareça. Numa form de PocketPC, a
ControlBox contém somente um botão, que pode ser o
botão de minimizar ou o que fecha a aplicação.
Form.MinimizeBox
A propriedade MinimizeBox define o tipo de botão da
ControlBox. Se True será atribuido o botão de Minimizar
(sob a forma de um X), se especificado como False terá
um botão de encerramento da aplicação (sob a forma de
um botão OK). A propriedade MaximizeBox não tem efeito
numa aplicação para PocketPC já que estes não possuem
um botão desse tipo.
Form.Size
É usada para estabelecer a largura e altura da form.
Esta propriedade apenas é utilizada se a propriedade
FormBorderStyle
estiver
atribuida
com
FormBorderStyle.None.
Form.Location
Especifica a colocação da form no ecrã, através da
utilização da coordenadas X e Y, situadas na parte superior
esquerda do ecrã. Esta propriedade apenas terá efeito se a
propriedade FormBorderStyle estiver definida como
FormBorderStyle.None.
73
CONTROLS DA APLICAÇÃO
Respeitando as Normas Gerais
É recomendado que as forms de uma aplicação de
PocketPC sejam do tamanho da área do desktop. No
entanto, é possivel criar uma form de menores dimensões
de forma a se ajustar a determinadas situações. Se criar
uma form que seja mais pequena que o ecrã fisico, a form
deve estar centrada verticalmente e horizontalmente no
ecrã, tendo em conta o menu Start, o menu principal e o
Soft Input Panel (caso este esteja visível).
Criação de Caixas de Diálogo
Em certas situações é útil criar as nossas próprias
caixas de diálogo. O método ShowDialog é usado para
mostrar a caixa de diálogo. Este método desactiva a form
principal enquanto a caixa de diálogo estiver visivel.
Quando é encerrada retorna um resultado à form que a
chamou. Todavia, os membros públicos da caixa de diálogo
estarão disponiveis à form principal mesmo após o retorno
do ShowDialog.
AddDVDForm addForm = new AddDVDForm();
// se a caixa de diálogo retornar OK
if (addForm.ShowDialog() == DialogResult.OK)
{
// prosseguir programa
}
Caso necessário, é possivel utilizar as propriedades
FormBorderStyle e Size da form da caixa de diálogo para
que esta seja mais pequena que o tamanho do ecrã do
aparelho. Neste caso, convém a utilização da propriedade
Location para posicionar a caixa de diálogo no ecrã da
forma que for mais conveniente.
Uma aplicação que utiliza dados sensíveis deve ter
mecanismos de segurança que proteja esses dados. Uma
forma de segurança será a validação do utilizador. Este
poderá ter que fazer um logon antes de poder aceder aos
dados. Uma utilização possível para uma caixa de dialógo
mais pequena poderá ser uma caixa de diálogo log-on no
topo da form principal. Esta será chamada assim que a
aplicação for iniciada.
74
Figura 31 - Caixa de Diálogo para Autenticação
Este é um dos casos em que convém fazer uso de uma
caixa de diálogo em vez da form principal, pois uma vez
feita a validação, a caixa de diálogo poderá ser encerrada
para libertar recursos. Tal não é possivel na form principal
porque ao fechá-la encerraria toda a aplicação. Assim, é a
form principal que chama a form de log-on da caixa de
diálogo e dependendo do resultado desta, a aplicação
continua ou é terminada.
Figura 32 - Form Principal
75
O código seguinte é o handler do evento de
carregamento da form principal (Main Form). Neste Event
Handler precisamos criar uma nova instância do objecto
LogonForm e chamá-lo como uma caixa de diálogo. Esta
form
para
log-on
retorna
DialogResult.OK
ou
DialogResult.Cancel, dependendo se o utilizador digitou um
nome de utilizador válido ou se simplesmente fechou a
form. Se os dados do utilizador forem válidos, a form
principal irá continuar com o seu processamento normal.
Se o utilizador fechar a form de log-on sem ter introduzido
um nome válido, a aplicação será encerrada.
private void MainForm_Load(object sender, System.EventArgs e)
{
LogonForm LogonFrm = new LogonForm();
if (LogonFrm.ShowDialog() == DialogResult.Cancel)
{
LogonFrm.Dispose();
this.Close();
}
else
{
this.Text+= " - " + LogonFrm.Username.Text;
LogonFrm.Dispose();
OpenCatalogFile(DataFile);
}
}
Neste exemplo, o handler para o evento Click do botão
Logon da form de log-on verifica se o nome do utilizador
introduzido é válido. A função CheckUser recebe o texto
com o nome e retorna verdadeiro ou falso caso seja ou não
um utilizador válido.
Se o utilizador introduzir um nome de utlilizador válido,
a caixa de diálogo retorna o valor DialogResult.OK.
private void LogonButton_Click(object sender, System.EventArgs
e)
{
if (CheckUser(Username.Text))
{
this.DialogResult = DialogResult.OK;
}
else
{
MessageBox.Show("Username not valid. Please Try Again",
"Logon Error");
}
}
76
No caso do utilizador encerrar a form sem digitar um
nome de utilizador válido, o handler do evento
CancelButton_Click fará com que a caixa de diálogo
retorne o valor DialogResult.Cancel à form principal. Tal
fará com que a aplicação seja encerrada.
private void CancelButton_Click(object sender,
System.EventArgs e)
{
this.DialogResult = DialogResult.Cancel;
}
Utilização das Caixas de Diálogo do Sistema
Estas caixas encontram-se nas classes OpenFileDialog
e SaveFileDialog e podem ser utilizadas para abrir e gravar
ficheiros no sistema de ficheiros do aparelho. Ambas as
classes têm uma propriedade de filtro que lhes permite
especificar o tipo de ficheiro que irá ser exibido na lista de
ficheiros da caixa de diálogo.
Tal como as caixas de diálogo desenvolvidas pelo
utilizador, estas retornam o valor DialogResult para
especificar se o resultado da caixa de diálogo foi ou não
bem sucedido.
openFileDialog openDialog = new OpenFileDialog();
openDialog.Filter = "XML Files (*.xml)|*.xml";
if (openDialog.ShowDialog() == DialogResult.OK)
{
OpenCatalogFile(openDialog.FileName);
}
saveFileDialog saveDialog = new SaveFileDialog();
saveDialog.Filter = "XML Files (*.xml)|*.xml";
if (saveDialog.ShowDialog() == DialogResult.OK)
{
SpenCatalogFile(saveDialog.FileName);
}
O Control InputPanel
Este permite ao utilizador de um PocketPC introduzir
informação textual usando um teclado virtual ou um
dispositivo de reconhecimento de escrita. O InputPanel
aparece no fundo de uma form, sempre que a form contém
um control MainMenu ou um control ToolBar.
Quando o control InputPanel está disponivel para uso
do utilizador, é importante esquematizar a form para que
este não sobreponha qualquer outro control importante,
principalmente os controls que requerem introdução de
77
texto. É importante colocar este tipo de controls numa
posição superior à do InputPanel.
Outra opção será possibilitar a movimentação dos
controls com barras de deslocamento de modo a obter
espaço para o InputPanel, assim será possivel ter acesso
ao mesmo tempo a todos os controls da form tendo o
InputPanel disponivel.
O código seguinte demonstra como tornar activo o
InputPanel quando uma TextBox recebe o focus e como
desactivá-lo quando o focus é perdido.
private void textBox1_GotFocus(
object sender, System.EventArgs e)
{
// activa InputPanel quando TextBox tem focus
inputPanel1.Enabled = true;
}
private void textBox1_LostFocus(
object sender, System.EventArgs e)
{
// desactiva InputPanel quando TextBox perde focus
inputPanel1.Enabled = false;
}
O evento EnabledChanged é despoletado quando o
InputPanel é activado ou desactivado, pelo utilizador ou
pelo programa.
Uma outra solução, será colocar os controls de
introdução de texto dentro de um Panel. Quando é
detectada a activação do InputPanel, este Panel será
reposicionado no topo do ecrã para possibilitar a sua
visualização. Quando o InputPanel for baixado, o Panel
será movido para a sua posição original.
private void inputPanel1_EnableChanged(
object sender, System.EventArgs e)
{
if (inputPanel1.Enabled == true)
this.panel1.Top = 180 - inputPanel1.Bounds.Height;
else
this.panel1.Top = 180;
}
O Control MainMenu
Este control é adicionado por defeito à form inicial de
uma aplicação PocketPC, mas terá que o fazer
manualmente às forms adicionais. Numa aplicação
PocketPC, para o utilizador activar o SIP ou definir qual SIP
a usar, vai precisar adicionar à form um control Main Menu
ou um control ToolBar.
78
Figura 33 - Itens do MainMenu
Para acrescentar itens ao menu MainMenu utiliza-se o
Windows Form Design.
Figura 34 - Edição do MainMenu
79
É possivel criar menus em cascata mas tendo o cuidado
de não sobrecarregar o ecrã. Deve conter as funções
necessárias para o uso da aplicação, tais como abrir ou
gravar
ficheiros.
As
funções
que
serão
mais
frequentemente utilizadas deverão ser colocadas no
ToolBar. Numa aplicação PocketPC não devem ser
colocadas as mesmas funções em controls distintos devido
ao espaço limitado disponivel para a aplicação.
O Control ToolBar
O ToolBar é um modo útil de adicionar tarefas que são
mais usadas. Funciona como um recipiente de botões que
o utilizador pode clicar para realizar uma função.
Cada botão possui uma imagem associada a um
ImageList que ajuda a identificar a sua função. É possivel
definir ainda o estilo de cada botão. Estas propriedades
podem ser definidas em design-time com a ajuda do
ToolBar Button Collection Editor.
Figura 35 - Toolbar Button Collection Editor
O exemplo seguinte mostra como adicionar uma
ToolBar através de código:
// cria um objecto ImageList para ser utilizado no ToolBar
ToolBar DVDToolbar = new ToolBar();
ImageList imageList = new ImageList();
80
// carrega imagens para a ImageList
Bitmap bmp;
bmp = new Bitmap(
Assembly.GetExecutingAssembly(),
GetManifestResourceStream("add.bmp"));
imageList.Images.Add(bmp);
bmp = new Bitmap(
Assembly.GetExecutingAssembly(),
GetManifestResourceStream("edit.bmp"));
imageList.Images.Add(bmp);
bmp = new Bitmap(
Assembly.GetExecutingAssembly(),
GetManifestResourceStream("del.bmp"));
imageList.Images.Add(bmp);
// associa objecto ImageList com a ToolBar
DVDToolbar.ImageList = imageList;
// acrescenta botões à ToolBar
ToolBarButton btn = new ToolBarButton();
btn.ImageIndex = 0;
DVDToolbar.Buttons.Add(btn);
btn = new ToolBarButton();
btn.ImageIndex = 1;
DVDToolbar.Buttons.Add(btn);
DVDToolbar.Buttons[1].Enabled = false;
DVDToolbar.Buttons[1].Visible = false;
btn = new ToolBarButton();
btn.ImageIndex = 2;
DVDToolbar.Buttons.Add(btn);
DVDToolbar.Buttons[2].Enabled = false;
DVDToolbar.Buttons[2].Visible = false;
// adiciona a ToolBar à Form
this.Controls.Add(DVDToolbar);
// acrescenta o evento de pressionar botões da ToolBar
DVDToolbar.ButtonClick += new ToolBarButtonClickEventHandler(
this.DVDToolbar_ButtonClick);
É criado um objecto ImageList e carregadas três
imagens que irão ser utilizadas para mostrar três botões
na ToolBar. É associada uma rotina que trata do evento
relacionado com a acção de clicar num dos botões da
ToolBar. O código seguinte mostra uma mensagem
especificando qual dos botões foi pressionado.
81
protected void DVDToolbar_ButtonClick(
object sender, ToolBarButtonClickEventArgs e)
{
switch(DVDToolbar.Buttons.IndexOf(e.Button))
{
case 0:
MessageBox.Show("Pressionado o Botão Acrecescentar")
break;
case 1:
MessageBox.Show("Pressionado o Botão Editar")
break;
case 2:
MessageBox.Show("Pressionado o Botão Apagar")
break;
}
}
O parâmetro ToolBarButtonClickEventArgs inclui uma
referência para o botão em causa e o método IndexOf
retorna o índex desse botão.
Figura 36 - Exemplo de uma ToolBar
Activação e Desactivação de uma Form
As normas gerais de interface para aplicações de
PocketPC foram criadas de modo a assegurar que estas
tivessem boa ergonomia e se comportassem de modo
consistente.
Uma das recomendações mais importantes que diferem
das aplicações para o Windows de desktop é que apenas
deve existir uma ocorrência de uma aplicação de cada vez.
Se uma aplicação é executada havendo já uma ocorrência
82
a correr, esta é reactivada. Caso contrário, uma nova cópia
é iniciada. O próprio runtime do .NET Compact Framework
assegura automaticamente esta restrição.
Outra recomendação importante é que, uma vez
iniciada uma aplicação, não pode ser encerrada pelo
utilizador. Quando o utilizador alterna para outra aplicação,
esta encobre a aplicação anterior, que é desactivada.
Quando o utilizador volta a seleccioná-la, a aplicação é
reactivada.
O Activate e Deactivate
Quando uma aplicação é desactivada, deve libertar
todos os recursos que for possivel, de modo a conservar os
recursos limitados do aparelho. O próprio .NET Compact
Framework lança automaticamente um processo de
Garbage-Collection para libertar os recursos de que a
aplicação já não necessita.
O Garbage-Collection do .NET Compact Framework está
optimizado para conseguir um baixo uso de memória do
aparelho, ao contrário do completo .NET Framework mais
focado na velocidade e na escalonabilidade.
Todas as alocações de memória são feitas a partir da
mesma zona, sendo fácil libertar recursos da memória se
necessário. Mesmo assim, é ainda necessário especificar a
libertação de alguns recursos, tais como ligações a bases
de dados, ligações a portas COM ou grandes objectos na
memória como datasets.
Existem os seguintes eventos na form que permitem
detectar quando uma aplicação é posta em background e
quando é restaurada.
private void Form1_Activate(
object sender, System.EventArgs e)
{
// código para restaurar comunicações ou acessos a BD’s
}
private void Form1_Deactivate(
object sender, System.EventArgs e)
{
// código para libertar recursos
}
Fechar Aplicações
De acordo com as normas de interface do PocketPC não
deve ser possivel ao utilizador encerrar a aplicação, apenas
minimiza-la.
83
A propriedade MinimizeBox deve ter o valor de True
para ter o botão de minimizar (icon X) ou False para o
botão de encerrar (icon OK). Enquanto que a form
principal não deve ser encerrada, as caixas de diálogo
devem ter o botão de fechar de modo a voltar à form
principal.
Se os recursos começarem a escassear, o sistema
operativo começa a encerrar aplicações que estão a correr
em background. Sendo assim, é aconselhável guardar os
dados da aplicação logo após o evento Deactivate, pois a
aplicação corre o risco de ser fechada enquanto está
minimizada.
Evento Tap-And-Hold
Como os dispositivos PocketPC não possuem rato, os
utilizadores não podem clicar com o botão do lado direito
sobre um control. Em alternativa devem pressionar o
control com o stylus e mantê-lo nessa posição até surgir
um menu de contexto.
Para dotar a aplicação de outras funcionalidades para
além de menus de contexto associados à função de tapand-hold num dos controls, é necessário desenvolver
código específico.
Para tal, é necessário criar um control Timer que define
o intervalo de tempo que o utilizador deve manter a
pressionar até ser lançada a acção. Ao capturar o evento
MouseDown inicia-se o contador até ao momento em que é
largado com o MouseUp. Calcula-se o evento Tick do Timer
para executar o código pretendido.
O código seguinte demonstra um evento personalizado
do tap-and-hold:
private void timer1_Tick(
object sender, System.EventArgs e)
{
// código que se pretende executar
}
private void Form1_MouseDown(
object sender, System.Windows.Forms.MouseEventArgs e)
{
timer1.Enable = false;
}
private void Form1_MouseUp(
object sender, System.Windows.Forms.MouseEventArgs e)
{
timer1.Enable = true;
}
84
Teclas de Hardware de um PocketPC
Um PocketPC não possui um teclado, sendo uma
grande parte da interacção feita com um stylus e com o
SIP. No entanto, existem algumas teclas de hardware que
podem ser úteis em certas situações.
É possivel capturar estas teclas através do evento
KeyDown, que dispara quando o utilizador pressiona uma
destas teclas.
private void Form1_KeyDown(
object sender, System.Windows.Forms.MouseEventArgs e)
{
switch (e.KeyCode)
{
case Keys.Up:
MessageBox.Show("Pressionada Tecla de Cima");
break;
case Keys.Down:
MessageBox.Show("Pressionada Tecla de Baixo");
break;
case Keys.Left:
MessageBox.Show("Pressionada Tecla da Esquerda");
break;
case Keys.Right:
MessageBox.Show("Pressionada Tecla da Direita");
break;
case Keys.Return:
MessageBox.Show("Pressionada Tecla Para Dentro");
break;
}
}
Finalizar o Desenvolvimento da Aplicação
Após terminada a introdução de código e de todas as
funcionalidades, será útil dotar a aplicação de um icon e
colocar um atalho da aplicação no Start Menu do PocketPC.
Para associar um icon a uma aplicação, utiliza-se a
caixa de diálogo das propriedades do projecto. Na secção
“General”, introduz-se no campo “Aplication Icon”, o
caminho até ao ficheiro do icon que se quer utilizar.
85
Figura 37 - Propriedades do Projecto
Um atalho irá permitir ao utilizador executar a
aplicação mais facilmente. Para adicionar um atalho ao
Menu Start, coloca-se o atalho na pasta “\Windows\Start
Menu” do sistema operativo.
O Visual Studio .NET, na fase de contrução do ficheiro
CAB, irá definir o atalho a criar no momento de instalação
da aplicação.
86
NORMAS RECOMENDADAS
Existem um certificado aprovado pela Microsoft que
identifica as aplicações que cumprem um conjunto de
regras no seu desenvolvimento. Estas recebem um
logótipo “Designed For Windows For PocketPC”. Para tal,
existem regras e requisitos sobre icons, menus, ToolBar,
InputPanel, etc. Um documento com estas especificações
está disponível para download no site da QualityLogic em
http://www.qualitylogic.com/certprograms/pocketpc_spec.
html.
Num aparelho com PocketPC a maior parte da entrada
de texto é realizada através do SIP. Comparando entre
este e um teclado normal, podemos reparar que o SIP
consume mais tempo e é mais propenso a erros.
Deste modo, ao desenvolver uma form de entrada de
dados deve-se tentar reduzir a quantidade de informação
textual. Deve-se fazer um maior uso por exemplo das
drop-down lists, como se pode ver na TaskInputForm do
PocketPC.
Figura 38 - Menu Drop-Down na Inserção de uma Task
Também é necessário ter em atenção que o utilizador
está a usar um stylus e não um rato para seleccionar os
itens da form. Por isso, é aconselhável fazer os controls
suficientemente grandes para evitar que se falhe o alvo. O
tamanho recomendado é de 5mm (21x21 pixels) para o
87
alvo de um stylus e de 9mm (38x38 pixels) para o alvo de
um dedo.
Deve-se igualmente deixar espaço suficiente entre
controls para reduzir o risco de engano. Tal é importante
em tarefas relacionadas, como por exemplo nas funções de
cortar, copiar, colar.
A distância entre os controls mais utilizados e tarefas
na form deve ser minimizada. Os controls que estão
relacionados entre si, devem ser mantidos juntos para um
melhor acesso. Deve-se reduzir o movimento que o
utilizador tem de realizar para executar as funções mais
comuns da aplicação.
Deve ser considerado o modo como o utilizador pega
no aparelho. A informação mais frequente e mais utilizada
deve estar posicionada de modo a não ser tapada pelas
mãos quando estão a ser introduzidos dados ou a
seleccionar itens.
Num dispositivo de PocketPC, ao contrário de um
Windows normal, a altura do ecrã é maior do que a sua
largura. É preciso ter atenção que a área de visualização é
estreita, por isso os controls devem ser dispostos
verticalmente e não horizontalmente, evitanto que o
utilizador tenha de utilizar barras de deslocamento
horizontais.
As form devem ser concepcionadas de modo a todos os
controls caberem na área de visualização sem necessidade
de deslocamento. Se tal não for possivel, os controls mais
importantes deverão aparecer primeiro e os menos
importantes exibidos com a ajuda de barras de
deslocamento. Deve-se ao máximo evitar sobrepôr
comandos e forms.
O utilizador deve ter um feedback das acções que vai
executanto, quer através de sons ou pela mudança da
aparência dos controls ou da form.
88
TESTE E DEBUG
Qualquer programador ao desenvolver uma aplicação
comete falhas. Apesar dos compiladores tentarem
encontrar o maior número de erros, não é possivel
solucionar todos eles. Os erros mais fáceis de resolver são
os de síntaxe, que ocorrem quando o programador escreve
código que não é válido na linguagem que está a utilizar.
Estes são encontrados na fase de compilação e são
normalmente fáceis de resolver.
Outro tipo de erros ocorrem quando uma aplicação
compila com sucesso mas não funciona como esperado. A
aplicação poderá dar resultados incorrectos ou de ínicio
funcionar correctamente, mas numa dada utilização
abortar com uma mensagem de erro. Estes erros podem
ser erros de runtime, erros semânticos ou erros lógicos.
Além dos erros do programador, o ambiente em que a
aplicação está a ser executada também pode causar
problemas.
Apesar de não ser possivel controlar todos os aspectos
do ambiente, deve-se de modo apropriado proceder ao
tratamento de erros.
Utilizar o Debugger
Com o Debugger do Visual Studio é possivel:
- Colocar breakpoints em programas, numa linha de
código ou numa condição;
- Correr a aplicação passo a passo ou até um novo
breakpoint;
- Examinar qual o valor de expressões ou modificar o
conteúdo de variáveis;
- Alterar a sequência de execução do programa.
O Modo Break
Quando uma aplicação está a operar em modo de
debug está num de dois estados: ou está a correr ou está
em break mode. Neste último, a execução está suspensa
sendo possivel examinar o estado da aplicação.
Uma aplicação entra em modo suspenso quando:
- É encontrada uma excepção;
- Se chega a um breakpoint;
- O utilizador força a paragem de execução (com
CTRL+ALT+Break)
89
Criar um BreakPoint
Quando a execução de uma aplicação chega a uma
linha de código que contém um breakpoint, a execução é
suspensa e o Debugger entra em break mode. Para colocar
um breakpoint selecciona-se a linha pretendida e
pressiona-se a tecla F9.
Figura 39 - Debug da Aplicação
Watch Window
Em break mode é possivel verificar qual o valor de
variáveis e de expressões nesse momento. Para tal utilizase a janela QuickWatch.
Também, ao colocar o cursor sobre uma variável na
janela de edição de código, exibe o seu valor.
90
Figura 40 - QuickWatch
Utilizar o Debug
No menu de Debug é possivel aceder às seguintes
opções:
Start (F5)
Corre a aplicação utilizando o Debbuger. O programa
será interrompido imediatamente antes da execução da
primeira linha que contiver um breakpoint.
Step Over (F10)
Executa uma linha completa de código. Os métodos são
executados por completo.
Step Into (F11)
É similar ao Step Over mas se a linha contém um
método, o debug continua no código desse método até
retornar ao ponto em que esse método foi chamado,
continuando o debug a partir daí.
Step Out (Shift+F11)
Executa o método até ao fim, e só então retorna ao
break mode.
Continue (F5)
Retoma a execução do programa saindo do break
mode.
Stop Debugging (Shift+F5)
Força a paragem do programa e descarrega-o da
memória.
91
POTENCIALIDA
DES
COLECÇÕES DE OBJECTOS
O Compact Framework inclui um número de classes
que permitem ao programador trabalhar com colecções de
objectos. A maior parte das aplicações necessitam de
trabalhar com Arrays ou colecções de objectos mais
complexos. A plataforma .NET inclui funcionalidades
especificamente destinadas a aceder a esses objectos. A
maior parte destas classes estão nos namespaces
System.Collections e System.Collections.Specialized.
Classes de Colecções em System.Collections
Array
Dispõe de métodos para criar, manipular, procurar e
ordenar arrays e é a classe base para todos os arrays da
Common Language Runtime.
ArrayList
É um array de objectos cujo tamanho é dinamicamente
ajustado de acordo com as necessidades.
BitArray
Controla um array de bits de
representados por valores booleanos.
tamanho
fixo,
CaseInsensitiveComparer
Compara dois objectos e indica se são equivalentes,
ignorando a capitalização das letras nas strings.
CaseInsensitiveHashCodeProvider
Fornece um hash code para um objecto ignorando a
capitalização das letras nas strings.
CollectionBase
Esta é uma classe abstracta, o que significa que é
necessário derivar esta classe para se a poder usar.
Permite aos programadores criar e implementar colecções
personalizadas.
Comparer
Compara dois objectos e indica se são equivalentes,
tendo em conta a capitalização das letras nas strings.
DictionaryEntry
Define o par chave/valor de um item que é
armazenado num colecção do tipo dicionário, tais como o
Hashtable ou ListDictionary.
Hashtable
Uma colecção de pares chave/valor que
organizados tendo como base o hash da chave.
estão
Stack
Uma colecção de objectos do tipo pilha (Last In, First
Out). O último a entrar é o primeiro a sair.
93
Namespace System.Collections.Specialized
HybridDictionary
Representa uma colecção eficiente com uma estrutura
do tipo dicionário. Tem a designação de híbrido porque
enquanto o seu tamanho é pequeno deriva a partir do
ListDictionary mas quando a dimensão da colecção se
torna maior altera para uma Hashtable.
ListDictionary
Representa uma classe dicionário destinada a albergar
um número pequeno de objectos, normalmente com 10 ou
menos itens.
NameObjectCollectionBase
Representa uma classe abstracta para servir como base
a uma colecção de chaves do tipo String e objectos que
podem ser acedidos pelo valor da chave ou por um índex
númerico.
NameValueCollection
Representa uma colecção ordenada de itens com uma
chave do tipo String e valores também do tipo String. Esta
classe herda a partir do NameObjectCollectionBase.
Arrays Multidimensionais
Em certas situações é necessário criar arrays com mais
do que uma dimensão. No exemplo seguinte é
demonstrado como se cria um array de arrays. É declarado
o limite superior da primeira dimensão e inicializado cada
elemento. O nível superior é constituido por quatro
elementos, cada um é um array de short integers. O
primeiro elemento contém seis elementos e o segundo de
três elementos. O terceiro e quarto não estão inicializados.
C#
Short[][] myArray = new short[4][];
myArray[0] = new short[] {16, 45, 3, 2, 1, 6};
myArray[1] = new short[3];
myArray[1][0] = 42;
VB.NET
Dim myArray()() As Short = new Short(3)() {}
myArray(0) = New short(5) {16, 45, 3, 2, 1, 6};
myArray(1) = New short(3) {};
myArray(1)(0) = 42;
94
ArrayList
A colecção ArrayList ajusta dinamicamente o seu
tamanho em runtime à medida que novos itens são
adicionados.
using Sistem.Collections;
// inicializa o Array
ArrayList myArrayList = new ArrayList();
// insere elementos no Array
myArrayList.Add("Portugal");
myArrayList.Add("Espanha");
myArrayList.Add("Itália");
// ordena alfabeticamente o Array
myArrayList.Sort;
// retorna o número de elementos
int conta = myArrayList.Count;
95
STRINGS E DATAS
A classe String permite criar e realizar modicações em
strings. É possivel fazer uso de expressões regulares para
produzir procuras e alterações mais complexas em strings.
Também estão disponiveis funções para a conversão de e
para outros tipos de dados através de formatação e
parsing de strings.
Strings representam sequências de caracteres Unicode
e são imutáveis. Ou seja, sempre que é instanciado um
novo valor a uma String, é criado um novo objecto com a
destruição do objecto antigo.
Um exemplo da criação e comparação de uma String:
string myString = “Hello”;
myString += “ World”;
if (myString == “Hello World”
MessageBox.Show(myString);
Pode-se criar Strings a partir de outras Strings dos
seguintes modos:
String s1 = s2
Cria uma nova String que aponta para o mesmo
objecto.
String.Copy
Cria uma nova cópia independente da String.
SubString
Retira uma substring da String.
Join
Produz uma String a partir de um Array de Strings,
separadas por uma dada String que funciona como um
separador.
Split
Cria um Array de Strings que resultam da divisão de
uma String em determinados pontos onde foram
encontrados caracteres especificados.
Existem vários métodos que permitem procurar
substrings ou caracteres numa determinada String:
IndexOf
Retorna a primeira posição de uma substring.
IndexOfAny
Executa a mesma operação que o IndexOf mas procura
por qualquer elemento num Array de Chars.
LastIndexOf e LastIndexOfAny
Fazem as mesmas operações que o IndexOf e o
IndexOfAny mas realizam a procura a partir do final da
String.
96
StartsWith e EndsWith
Procuram as substrings no inicio ou no final da string.
Métodos
que
permitem
modificações numa String:
fazer
determinadas
Insert
Insere numa String uma outra instância de uma String
numa posição especifica.
Remove
Retira um número indicado de caracteres de uma
determinada posição.
Replace
Substitui uma substring por outra substring. Também é
possivel fazer a substituição de todas as ocorrências de
uma substring por outra.
Outros métodos úteis para a manipulação de Strings:
Equals
Compara uma String a outra.
Clone
Retorna a referência da instância de uma String.
ToLower e ToUpper
Altera a String para maiúsculas ou minúsculas.
Trim, TrimStart e TrimEnd
Remove espaços ou caracteres indesejados.
PadLeft e PadRight
Insere espaços à esquerda ou à direita da String.
97
XML
O XML proporciona uma plataforma independente de
descrever dados complexos utilizando documentos
compostos hierarquicamente por elementos e atributos.
Os documentos XML podem ser utilizados na troca de
dados entre componentes de uma aplicação distribuida,
entre diferentes aplicações na mesma empresa ou mesmo
entre empresas diferentes.
Como o XML é uma tecnologia standard, em que os
dados estão representados em forma de texto, as
diferenças entre distintas plataformas de hardware, de
sistema operativo ou de linguagens de programação
podem ser facilmente contornadas. É assim possivel,
construir soluções integradas utilizando componentes que
interagem entre si a partir de sistemas diferentes.
Exemplo Prático
Por exemplo, uma solução distribuida em que um
catálogo de produtos de um revendedor é retirado de um
sistema ERP (Enterprise Resource Planning). As aplicações
clientes poderão utilizar o Web Service para fazer o
download dos dados de produtos e realizar as operações
necessárias localmente. Um vendedor com um PocketPC
pode retirar os dados de um produto a partir do Web
Service ainda no escritório e esses dados persistirem
localmente no PocketPC, de modo a estarem disponiveis
quando estiver em contacto com os clientes. Utilizando o
XML para representar o catálogo, os dados podem
facilmente ser trocados entre o sistema ERP, o servidor de
Web e o PocketPC.
Utilização do XML no .NET Compact Framework
Existem dois modos principais de trabalhar com o XML.
Com as classes XmlReader e XmlWriter que permitem ler
ou escrever XML ou então através da classe XmlDocument
que implementa o DOM (Document Object Model). Esta
classe constrói em memória, um documento em modo de
árvore permitindo a modificação dos dados e sua
navegação em qualquer direcção. Este método requer uma
elevada quantidade de memória para grandes documentos,
enquanto que o XmlReader o XmlWriter são mais rápidos e
mais eficientes a nivel de memória, mas apenas permitem
uma navegação unidireccional.
98
INPUT E OUTPUT
É possivel ler e escrever todo o tipo de ficheiros, desde
simples ficheiros de texto até puros ficheiros binários.
Existem funcionalidades para mover o apontador através
do ficheiro e para copiar, mover e apagar ficheiros inteiros.
Um ficheiro pode ser um ficheiro fisico num dispositivo
local, um ficheiro remoto numa rede ou um objecto que
ainda não é um ficheiro mas um simples Stream de bytes
em memória, num socket ou outra ligação de rede. É
possivel ler e escrever Streams de um modo sincrono ou
assincrono.
São suportadas operações de Input/Output a dois
niveis: Acesso de baixo nivel (byte) utilizando os objectos
Stream ou o acesso a nivel de caracteres utilizando os
objectos StreamReader e StreamWriter.
Classe Stream
É uma classe abstracta que dispõe de funcionalidades
para ler ou escrever vários tipos de dados em bytes. Estes
dados podem estar num ficheiro local ou de rede, ou em
algo similar a um ficheiro em memória. O importante a
reter na classe Stream é que trabalha em forma de bytes.
O objecto FileStream dispõe dos seguintes métodos:
FileMode.Open
Abre um dado ficheiro. Retorna uma excepção se o
ficheiro não existir.
FileMode.Create
Cria um novo ficheiro ou reescreve o ficheiro se já
existir.
FileMode.OpenOrCreate
Cria um novo ficheiro apenas se o ficheiro não existir.
Caso contrário, abre o ficheiro existente.
FileMode.Append
Abre ou cria um ficheiro, mas procura pelo final do
ficheiro antes das operações de escrita ou de leitura.
try
{
FileStream myFileStream = new FileStream
("\\myFile.txt", FileMode.Open);
}
catch (System.IO.FileNotFoundException fnfE)
{
// mensagem de erro de leitura
}
99
Classes BinaryTrade e BinaryWriter
Estas classes permitem ler e escrever primitivas de
tipos de dados, tais como integers ou doubles,
directamente de ou para streams, sem implementar
qualquer conversão de caracteres. Os ficheiros binários
podem poupar muito espaço quando comparados com os
ficheiros de texto. Também poupam a necessidade de
conversão dos caracteres.
// recebe de uma caixa de diálogo o nome do ficheiro
String fileName = myFileDialog.FileName;
// cria um FileStream e define caracteristicas
FileStrem myFileStream = new FileStream(
fileName,
FileMode.OpenOrCreate,
FileAccess.Write,
FileShare.None);
// cria um objecto para escrita binária
BinaryWriter writer = new BinaryWriter(
myFileStream, Encoding.ASCII);
// escreve dados no ficheiro
writer.Write("Produto");
writer.Write(42);
writer.Write(3.47);
// fecha o objecto de escrita
writer.Close();
Classes StreamReader e StreamWriter
Estas classes derivam respectivamente das classes
abstractas TextReader e TextWriter. Estas classes
direccionam o input e output de caracteres através de uma
stream com uma codificação que traduz os caracteres em
bytes e o inverso.
// cria o StreamReader
StreamReader reader = new StreamReader("\\MyFile.txt");
int myChar;
String myString = "";
// enquanto conseguir ler do Stream
// converte e introduz cada caracter na String
While ((myChar = reader.Read()) != -1)
{
myString += System.Convert.ToChar(myChar);
if(myChar == (int)’.’)
break;
}
// mostra a String
MessageBox.Show(myString);
// fecha o Stream
reader.Close;
100
COMUNICAÇÃO EM REDE
Um dos melhores métodos de aceder a recursos a
partir de um dispositivo móvel é através do XML Web
Services. No entanto, se em certas situações esta não for a
solução apropriada para aceder a recursos de rede, é
possivel utilizar o protocolo HTTP (Hypertext Transfer
Protocol) através das classes System.Net.WebRequest e
System.Net.WebResponse. Mas se for necessário ter
controlo directo sobre a ligação TCP/IP (Transmission
Control Protocol) ou UDP/IP (User Datagram Protocol),
utiliza-se a classe System.Net.Sockets.Socket. Além
destas, também existem classes para comunicações por
infra-vermelhos ou comunicações de série com outros
aparelhos portáteis.
Namespace System.Net
Contém classes para aceder a recursos na Internet. O
endereço para cada conteúdo na internet é dado pelo URI
(Uniform Resource Identifies) e é composto pelo protócolo,
o nome do host e o nome do ficheiro. Para aceder a um
recurso é necessário enviar um pedido de comunicação
utiizando o método WebRequest.Create, passando o
endereço do recurso que se pretende aceder. Se o
protócolo está na forma “http://” ou “https://” é retornada
uma instância da classe HttpWebRequest correspondente
ao protócolo especificado. É então retornada a instância
HttpWebResponse contendo a resposta.
using System.Net;
using System.IO;
WebRequest req = WebRequest.Create(uri);
WebResponse res = req.GetResponse();
// espera até que resposta chegue
Stream ReceiveStream = res.GetResponseStream();
// lê o Stream para uma String
StreamReader sr = new StreamReader( ReceiveStream );
string resultstring = sr.ReadToEnd();
101
SEGURANÇA
A função de estabelecer uma solução ao nível da
segurança num projecto deve ser pensada desde o
primeiro momento. Ignorar preocupações de segurança na
fase de design, pode mais tarde resultar numa grande
reformulação. Escrever código seguro é apenas uma parte
da implementação de uma solução segura.
O nível de segurança alcançado numa aplicação é tão
boa quanto o seu ponto mais fraco, logo não vale a pena
escrever código avançado, por exemplo na encriptação dos
dados no envio para o servidor se depois esse servidor não
tem protecção suficiente, podendo um hacker ter acesso à
informação protegida.
A segurança é das principais preocupações das
empresas quando se considera desenvolver aplicações
para aparelhos portáteis. Pela sua própria natureza, estes
dispositivos são levados para fora do escritório, operam
sobre redes sem fios fora das firewalls das empresas e
sendo pequenos podem são facilmente perdidos ou
roubados.
O responsável da empresa terá questões sobre de que
modo os dados estão protegidos. Se o equipamento for
parar a mãos alheias. Ou no caso de um aparelho que está
a retirar informação dos servidores, como sabemos que é
um funcionário e não alguém que tenha roubado o
dispositivo? Como estão protegidas as redes sem fios de
modo que os dados não sejam interceptados por um
hacker?
O Básico ao Nível da Segurança
Antes de começar a pensar nos requisitos de uma
aplicação específica, deve-se considerar em criar uma
política
de segurança,
de
modo
a
definir
as
responsabilidades de cada utilizador. É essencial a
autenticação do utilizador, antes de qualquer tipo de
interacção com o aparelho, se possivel logo após o ter
ligado. O utilizador deve reintroduzir a password, caso o
aparelho esteja inactivo depois de um determinado periodo
de tempo, uma hora por exemplo.
102
Recomendações de Segurança
Existem vários pontos a ter em atenção quando se
trata de segurança:
- Utilização de um anti-virus para prevenir uma
infecção através da Internet ou de um e-mail;
- Aconselhada a utilização de firewalls para aparelhos
que estejam ligados em rede por extensos periodos de
tempo;
- Utilização de VPNs (Virtual Private Networking)
encriptando os dados e criando um túnel na autenticação
e ligação de utilizadores dentro ou fora de uma rede
privada;
- Utilização de SSL para encriptar dados até 128bits;
- Prevenir o spoofing, equipando o servidor de um
certificado que permita identificá-lo como a máquina
verdadeira;
- Autenticação dos clientes e definir as autorizações do
que eles podem fazer;
- Proteger os dados dos XML Web Services;
- Criação de segurança nas conexões com o SQL
Server;
- Autenticação do utilizador através de uma password,
de uma impressão digital, de um cartão de segurança.
103
ADO.NET
A maior parte das aplicações permitem armazenar,
extrair e alterar dados. As classes ADO.NET permitem
realizar essas operações com um servidor SQL através de
uma ligação de rede, com um servidor SQL Server CE
presente no aparelho, ou com XML Web Services. Estas
classes permitem de um modo simples e conveniente
representar, criar e manipular os dados de que uma
aplicação necessita.
Connectionless do ADO.NET
O ADO.NET é connectionless, ou seja, não necessita de
ter ligações activas a uma fonte de dados, o que é
bastante útil no caso de aparelhos móveis, uma vez que as
ligações podem estar ocasionalmente indisponíveis ou
desligadas durante longos periodos de tempo.
Estes objectos podem ser criados independentemente
do tipo de dados, como por exemplo o SQL Server. É
possivel conectar a uma fonte de dados pelo tempo
unicamente necessário para fazer o download dos dados
pretendidos e então desligar para editá-los off-line.
Quando o processamento realizado localmente está
finalizado é restabelecida a ligação e os dados
actualizados.
Um exemplo de uma aplicação real: Um técnico que de
manhã faz a ligação à base de dados central de onde retira
a agenda dos trabalhos a realizar durante o dia. Durante o
seu trabalho, o técnico utiliza o aparelho para recolher
relatórios e observações, mas devido à própria natureza do
seu trabalho não é possivel ligar à base de dados central
durante esse periodo. No fim do dia, é necessário fazer a
actualização para que os clientes sejam cobrados e a
agenda calculada para o próximo dia.
ADO.NET e XML
O XML é reconhecido como sendo uma linguagem de
troca de dados. Tem como base informação textual, por
isso não contém informação binária. Assim, pode passar
por firewalls que geralmente bloqueiam dados binários,
tais como executáveis e objectos COM, permitindo os
objectos ADO.NET comunicar através da Internet utilizando
HTTP.
104
Outra grande vantagem em guardar informação no
formato XML é a facilidade de troca de dados entre
aplicações instaladas em máquinas ou linguagens
diferentes. Os objectos ADO.NET podem também escrever
o seu conteúdo para um ficheiro de texto ou para um
mecanismo de transmissão como um objecto Stream.
Binding de Controls
O ADO.NET permite também fazer o binding de dados,
ou seja, fornecer dados a controls do interface do
utilizador. Podem também receber alterações que sejam
realizadas nesses controls, o que significa que o
programador não tem de programar mecanismos para
exibir e alterar dados, permitindo uma maior rapidez no
desenvolvimento de aplicações que tenham manipulação
de dados.
105
XML WEB SERVICES
Permitem o acesso a dados e a funções ao nivel da
empresa ou remotamente num aparelho móvel. Utilizam
standards de Web para aceder a funcionalidades num
servidor. É transmitida através de HTTP numa Intranet ou
na Internet.
Só é necessária uma ligação ao servidor que
disponibiliza o Web Service quando uma função está a ser
chamada ou quando está a ser dada resposta ao
dispositivo móvel. O XML Web Service pode ser facilmente
configurado através de uma firewall, pois os dados estão
em forma de texto e não em formato binário. E o seu
acesso, integrado na segurança do Windows ao configurar
a autenticação com um nome de utilizador e password.
Uma aplicação de um cliente móvel pode utilizar o XML
Web Service sem ter que instalar software adicional.
Como exemplo, um XML Web Service pode ser usado
para ligar os empregados de um restaurante que recebem
pedidos dos clientes com um sistema que gere esses
pedidos. A aplicação pode aceder ao menu mostrando o
nivel dos stocks, as recomendações do chefe e
transmitindo o pedido do cliente. O sistema reduz o stock
dos pedidos efectuados e dá a ordem para a cozinha. No
fim, elabora a factura que será apresentada ao cliente.
Arquitectura do XML Web Services
Os dados descritos e representados em XML estão num
formato neutro. As operações suportadas por um XML Web
Service descrevem-se a si próprias utilizando igualmente
um formato próprio em XML. Os dados são retirados do
dispositivo mas escondendo os detalhes de como a ligação
à base de dados é realizada e como os objectos da base de
dados são utilizados pela aplicação cliente.
Um XML Web Service utiliza o ASP.NET e corre no IIS
(Microsoft Internet Information Service). A aplicação
cliente tem que criar um objecto proxy capaz de ligar ao
Web Service e invocar os seus métodos.
106
SQL SERVER CE
O SQL Server CE é uma pequena implementação de
base de dados SQL num PocketPC e pode ser instalado
independentemente do .NET Compact Framework. É um
modo ideal de guardar dados localmente, permitindo a sua
encriptação tanto durante o seu armazenamento no
aparelho como na transmissão para um servidor central.
A utilização do SQL Server CE possibilita ao
programador um ambiente familiar, com a utilização de
técnicas similares às usadas na programação de uma
aplicação de desktop com SQL Server. Possui o motor da
base de dados, um programa cliente para conectar a uma
base de dados central e uma versão do Query Analyzer
que permite graficamente criar a estrutura da base de
dados com seus objectos, realizar um query e obter os
seus resultados. O tamanho máximo da base de dados
depende do espaço local disponivel e pode ter até 2GB.
Numa utilização possivel, um motorista pode usar uma
aplicação num PocketPC para verificar e registar o
carregamento de produtos e a sua entrega aos respectivos
clientes, utilizando uma base de dados SQL Server CE. Ao
regressar ao armazém depois de um dia de trabalho, o
motorista re-conecta ao servidor central para coordenar o
controlo de stocks e guardar o estado das estregas. Esta
actualização também pode ser feita durante o período de
entregas através de uma rede sem fios de modo a dar aos
clientes informação actual sobre a localização da
encomenda.
Utilização do SQL Server CE
Ao programar com o SQL Server CE existem três fases
de desenvolvimento:
- Criação da base de dados localmente.
- Actualização dos dados no aparelho.
- Actualização dos dados localmente alterados para a
base de dados central.
Esta actualização pode ser feita utilizando a
arquitectura RDA ou então a arquitectura Merge
Replication. Esta última, apesar de mais poderosa e
simples de usar é mais complexa de instalar, sobretudo
nas configurações de segurança. Todavia, caso não seja
necessário o suporte de base de dados anteriores ao SQL
Server 2000, vale a pena investir neste esforço inicial
extra, com dividendos futuros aquando o crescimento da
complexidade da aplicação.
107
CONTROLS PERSONALIZADOS
Os controls fornecidos pelo .NET Compact Framework
contêm funcionalidades bastante úteis para o interface da
aplicação que se pretende desenvolver. No entanto, uma
facilidade dada pela plataforma, é a capacidade de criar
versões alteradas desses controls com adaptações a
necessidades próprias, promovendo assim a reutilização de
código.
Controls que são reutilizados na mesma aplicação,
podem reduzir o tamanho dos ficheiros e as necessidades
de memória. Ao modularizar o código deste modo, ajuda a
asegurar a consistência de design pois são utilizados no
interface os mesmos componentes relativos aos controls.
O suporte dado pelo .NET à herança de objectos,
permite construir facilmente um control próprio que seja
substancialmente parecido com um control já existente,
particularmente quando se pretende aperfeiçoar o
comportamento desse control.
Por exemplo, se se considerar um control de texto que
apenas deva permitir caracteres numéricos. Neste caso,
cria-se uma classe que herda as propriedades da classe
TextBox. Com esta nova classe, uma nova versão do
OnKeyPress é criada e alterado o tratamento que controla
os caracteres que vão sendo teclados, sobrecarregando
este método para apenas aceitar números e o BackSpace.
Todos os restantes comportamentos são derivados a partir
da classe TextBox.
namespace teste
{
public class NumericTextBox : System.Windows.Forms.TextBox
{
protected override void OnKeyPress(KeyPressEventArgs e)
{
if (!(Char.IsDigit(e.KeyChar) ||
(e.KeyChar=='\b') || (e.KeyChar==13)))
{
e.Handled=true;
}
base.OnKeyPress(e);
}
}
}
108
GLOBALIZAÇÃO E
LOCALIZAÇÃO
Em alguns casos, é necessário desenvolver uma
aplicação que irá ser utilizada internacionalmente, por
pessoas com culturas e línguas diferentes. O planeamento
necessário no desenvolvimento de uma aplicação deste
tipo pode ser bem mais complicado. Mas, este esforço na
fase de planeamento pode ter os seus dividendos, pois é
muito mais difícil a introdução de consciência cultural a
uma aplicação já finalizada.
Globalização
Por globalização entende-se que no design da aplicação
a sua lógica de funcionamento não deve ser um factor que
impeça a sua utilização por múltiplas culturas. Uma
aplicação deve utilizar um formato de data neutro e
separar recursos que devem ser traduzidos para diferentes
culturas. Uma aplicação em que os formatos de datas e
moedas estejam implicitos no código, ou em que o
interface tenha uma determinada lógica local, será muito
complicada utilizar internacionalmente.
Localização
A localização consiste em especificar uma aplicação
para uma determinada cultura, normalmente traduzindo o
texto do interface e assegurando que os formatos de datas
e números apresentados se ajustam às definições locais.
109
THREADS
A utilização de threads múltiplas numa aplicação
significa dividir o processamento de uma determinada
função em duas ou mais tarefas. Deste modo, o
processamento pode ser realizado mais rapidamente do
que se cada tarefa estivesse a ser processada em série.
Esta performance extra pode fazer uma grande diferença
em aplicações num dispositivo com capacidades limitadas,
já que não possuem o mesmo poder de processamento
que uma máquina desktop.
Capacidade de Resposta e Escalonabilidade
Como resultado, é possivel tornar a aplicação mais
escalonável e com melhores capacidades de resposta. É
escalonável quando o programador pode facilmente
responder a novos pedidos, como por exemplo ir buscar
dados adicionais a um Web Service sem ter que restruturar
todas as outras partes da aplicação que foram buscar
dados a outras fontes. Tem maior capacidade de resposta
ao ser capaz de responder mais facilmente aos pedidos do
utilizador, ao mesmo tempo que está a decorrer uma
tarefa demorada, tal como uma pesquisa a uma base de
dados ou ao retirar dados da Internet.
Conceito Multithreading
O conceito multithread refere-se à possibilidade de
uma aplicação desempenhar mais do que uma tarefa de
cada vez. Em contraste com este conceito está o
multiprocessamento, em que uma máquina pode correr
diversas aplicações ao mesmo tempo. Neste caso, cada
aplicação corre num processo diferente em espaços de
memória isolados uns dos outros. O sistema operativo faz
com que pareçam estar a correr simultaneamente ao
alternar entre eles várias vezes por segundo.
Com multithreading, são criadas múltiplas tarefas de
processamento para cada aplicação. O sistema operativo é
capaz de organizar as threads individuais de cada
aplicação de modo a parecer que está a executar
simultaneamente tarefas distintas.
110
Vantagens do Multithreading
Numa aplicação com uma única thread tudo tem de ser
executado numa ordem pré-definida. Por exemplo, uma
aplicação que tem de desempenhar duas tarefas, receber
introdução de dados e utilizar esses dados para realizar
uma longa operação de procura numa base de dados. Se a
aplicação só utilizar uma thread, o utilizador ao realizar
mais do que uma procura terá de esperar que a primeira
procura acabe para poder voltar a introduzir os dados de
uma nova procura.
Dividindo a aplicação em duas threads, uma para a
introdução de dados e outra para realizar a procura,
melhorava o desempenho da aplicação ao nível do tempo
de resposta. Assim que o utilizador dava inicio a uma
procura, a thread que trata da introdução dos dados
transmitia-os à thread responsável pela procura, e
imediatamente ficaria disponivel ao utilizador enquanto
que decorria a procura. O utilizador podia introduzir várias
procuras sem ter que esperar que alguma terminasse.
Multithreading
pode
igualmente
melhorar
o
desempenho de algumas aplicações ao rentabilizar a
utilização do processador. Torna-se mais transparente no
ponto de vista de concepção, se houver threads múltiplas,
cada uma com a sua responsabilidade, do que uma única
thread que faça tudo. Threads múltiplas também permitem
automaticamente fazer melhor uso do processador porque
o Sistema Operativo alterna entre uma thread que está à
espera de resposta para outra que esteja pronta para ser
executada.
111
GRÁFICOS
Existem várias classes que podem ser utilizadas em
programação gráfica. Estas classes derivam do namespace
System.Drawing e podem ser utilizadas para criar formas,
linhas, imagens e texto em superficies desenhadas.
GDI+
Enquanto que os controls complexos são ideais para
aplicações empresariais, os programadores de jogos
necessitam do máximo de processamento e de flexibilidade
a nível gráfico. Para o desenvolvimento de aplicações
gráficas mais complexas o .NET Compact Framework
dispõe de um conjunto de librarias chamadas GDI+ que
permitem desenhar e controlar imagens.
112
UTILIZAÇÃO
EM CASOS
REAIS
TESCO
www.tesco.com
Introdução
O Tesco PLC é maior cadeia de supermercados
alimentares do Reino Unido. Com 270 lojas e uma loja online, procurou melhorar a eficiência do seu processo de
entregas ao domicílio.
Situação
Quando o site tesco.com e os supermercados Tesco
quiseram abranger a sua infra-estrutura de automatização
de processos às suas carrinhas de entrega de produtos,
procuraram uma solução utilizando o Visual Studio e o
.NET Compact Framework.
Para tal, utilizaram dispositivos com PocketPC, dotados
de capacidades wireless ligados a receptores GPS
montados em cada carrinha.
Desenvolveram uma aplicação em C# capaz de realizar
o download das listas de encomendas dos clientes, definir
a rota para os destinos pretendidos, receber rejeições de
clientes aos produtos substituidos, anotar a assinatura do
cliente junto com a hora e o local, além de registar todo o
percurso efectuado pela carrinha.
Solução
A solução protótipo foi desenvolvida por um único
programador em 8 semanas. A aplicação substitui toda a
papelada utilizada pelo serviço de entregas.
Aquando na loja, a aplicação carrega as encomendas a
ser processadas pela carrinha, através de uma ligação
wireless 802.11b. A lista de encomendas inclui a
localização dos clientes e uma lista dos produtos
substituidos (certos produtos são substituidos por estarem
esgotados, cabendo ao cliente aceitar a substituição).
114
Figura 41 - Lista de Clientes e Horas das Entregas
A carrinha dispõe de um receptor GPS que fornece a
sua latitude e longitude, assim como a hora e data actual.
Quando a lista de encomendas é carregada, a aplicação
exibe um mapa que indica o trajecto até ao primeiro
cliente. Quando o condutor chega ao destino, leva junto do
cliente o PocketPC e os produtos. Cabe então a este aceitar
aceitar ou rejeitar alguma substiuição de um produto. O
aparelho grava a assinatura do cliente, assim como a hora
e posição da carrinha.
Beneficios
Assim que é feita uma entrega, é conhecida e registada
a latitude e longitude. Deste modo, em entregas futuras
independentemente do condutor, aparecerá no mapa a
mesma exacta posição.
Entre curtos espaços de tempo, é também registado
todo o percurso efectuado assim como a hora. Esta
informação é retornada ao programa de mapas e
delineação de rotas, permitindo melhorar os percursos e a
precisão dos tempos de entrega.
115
Figura 42 - Mapa do Percurso
Teste
O sistema foi testado num supermercado da cidade de
Basingstoke com quatro carrinhas. De três em três
semanas foram ouvidas os comentários dos condutores
acerca do programa e realizadas as alterações necessárias.
Este é um bom exemplo de como este tipo de aplicação
pode ajudar a prestar um melhor serviço e com menores
custos, quer para a empresa quer para os clientes.
116
GEOVECTOR
www.geovector.com
A Geovector Corporation é uma empresa norteamericana
que
estabeleceu
um
laboratório
de
desenvolvimento em Auckland na Nova Zelândia,
destinado a desenvolver aplicações de localização
baseadas na sua tecnologia.
Esta tecnologia baseia-se no uso de sensores de
direccionamento e de altitude que são capazes de detectar
para onde o aparelho está a apontar. Tal combinado com
GPS que detecta a localização espacial do aparelho e uma
base de dados de informação geográfica criam um novo
tipo de solução móvel.
Enquanto o GPS por si só apenas nos diz o que está à
nossa volta, o GeoVector transforma o engenho no que é
essencialmente um rato e onde o mundo real é o nosso
ambiente de interacção e em que é possivel apontar e
clicar em qualquer objecto geo-referenciado.
A aplicação inicial desenvolvida para este tipo de
tecnologia é destinada a visitantes da Nova Zelândia
chamada Welcome to New Zealand (W2NZ).
Solução
Foi implementada uma aplicação utilizando o Visual
Studio .NET e o .NET Compact Framework. Os cálculos
espaciais foram realizados em C#, os dados estão
guardados localmente em SQL Server CE e as
comunicações com o servidor principal através de HTTP via
SQL Server merge replication.
Esta aplicação irá permitir aos utilizadores serem
guiados através da Nova Zelândia, com a diferença em
relação às aplicações já existentes de permitir ao utilizador
apontar o seu aparelho a um objecto conhecido e obter
informação sobre esse mesmo objecto. Pode também
apontar numa determinada direcção para saber que
categorias de objectos existem nesse sentido.
Poderá perguntar se existem restaurantes numa rua e
assim que o utilizador localize um restaurante, um cinema
ou outro estabelecimento poderá telefonar para esse local
ou fazer uma reserva.
117
Uma vez que tenha decidido o destino em que estará
interessado, poderá facilmente ser guiado não através de
mapas mas através de uma seta que aponta qual o sentido
a seguir a partir da sua posição actual. Esta seta manterá
a direcção em relação ao objecto independentemente da
direcção
do
PocketPC,
graças
ao
sensor
de
direccionamento que determina para onde o aparelho está
virado.
Esta
aplicação
está
destinada
a
pedrestes,
particularmente a turistas e visitantes a um novo local.
Não é vocacionada a navegação de veículos em que é
necessário o cálculo de um número de outras variáveis.
Neste caso, apenas é indicada a direcção cabendo ao
utilizador determinar o trajecto.
Figura 43 - Informações sobre um Local
A aplicação permite ao utilizador apontar para os
objectos à sua volta de modo a obter informações, como
por exemplo:
- Monumentos e outros pontos de interesse para saber
qual a sua origem e significado;
- Apontar para hóteis e restaurantes para obter preços
de quartos e de menús;
- Apontar para um cinema para se informar dos filmes
em exibição e reservar bilhetes.
118
Benefícios
A utilização do .NET Compact Framework dá um
ambiente consistente no desenvolvimento das várias
partes deste projecto. Também a combinação SQL Server
2000 e o SQL Server CE facilita o acesso aos dados. A
possibilidade de armazenar e processar a informação no
próprio aparelho dá a vantagem de melhorar a
performance da aplicação e reduzir a dependência face à
disponibilidade constante um canal de comunicação.
Futuro
Um dos objectivos delineados para este projecto será a
integração com o MapPoint da Microsoft para inclui mapas
na aplicação. Esta tecnologia extende-se a outros possíveis
cenários como por exemplo uma aplicação destinada ao
mercado imobiliário ou mesmo num jogo de first person
shooter jogado mesmo na primeira pessoa.
119
Conclusão
120
APONTAMENTOS FINAIS
Com a realização deste trabalho, consegui um dos
meus objectivos iniciais, que era obter algumas noções
não só da programação para PDAs com o .NET Compact
Framework, mas também iniciar-me na programação .NET
em geral.
Procurei abranger as várias vertentes possiveis neste
tipo de aplicações. As áreas descritas no capitulo das
potencialidades do .NET Compact Framework representam
capacidades mais complexas e possíveis de serem
exploradas. Tendo como base este documento é possivel
aprofundar as informações aqui transmitidas.
De um modo geral, os objectivos estabelecidos para a
realização
deste
trabalho
foram
alcançados.
Os
conhecimentos aqui obtidos com certeza terão implicações
no
prolongamento
da
minha
experiência
como
programador.
121
REFERÊNCIA
INFORMAÇÃO NA INTERNET
Sendo o .NET Compact Framework de momento uma
tecnologia ainda muito recente, em que os programadores
ainda estão a explorar todas as capacidades de
desenvolvimento da plataforma, a maior parte da
informação disponivel encontra-se concentrada nos sites
da Microsoft.
De facto a maior parte da pesquisa para este trabalho
foi realizada no site da Microsoft destinada ao
desenvolvimento de aplicações, o MSDN (Microsoft
Development
Network)
que
tem
o
endereço
http://msdn.microsoft.com. Este site dispõe de uma
gigantesca quantidade de informação. Existem também
outros sites satélites como o Microsoft Smart Devices
Developer
Community
com
o
endereço
http://smartdevices.microsoftdev.com.
Além da informação disponibilizada pela Microsoft, à
medida que esta tecnologia vai sendo mais aceite e
explorada pela comunidade de programadores, começam a
existir cada vez mais, sites que contêm informação ligada
ao desenvolvimento de aplicações para PocketPC utilizando
a plataforma .NET. Alguns são exclusivamente dedicados a
este tipo, e outros sites de maiores dimensões dispõem de
uma secção vocacionada a este assunto.
Os links seguintes apontam para alguns documentos
que serviram como base a este documento. Também
dispõem de informação adicional que permitirá aprofundar
os assuntos aqui abordados. Como a Internet está em
constante mutação, com o decorrer do tempo, os links
aqui referênciados perderão validade, restando os temas
dos documentos como base.
123
SITES
Microsoft
http://www.microsoft.com
Site inicial da Microsoft.
MSDN: Microsoft Software Development Network
http://msdn.microsoft.com
Recursos da Microsoft destinado ao desenvolvimento de
aplicações nas mais variadas linguagens.
http://msdn.microsoft.com/vstudio/device/
Desenvolvimento de aplicações para dispositivos
móveis em geral.
http://msdn.microsoft.com/vstudio/device/compact.aspx
O .NET Compact Framework.
Google
http://www.google.com
Motor de busca utilizado nas procuras.
ZDNet Reviews
http://reviews-zdnet.com.com/Handhelds/4502-3127_16-0.html?tag=ont-poc
Comentários sobre PDAs.
CNet Reviews
http://reviews.cnet.com/Handhelds/4502-3127_7-0.html?tag=ont-poc
Comentários sobre PDAs.
124
LearnMobile.net
http://www.learnmobile.net/MobileClient/
Grande quantidade de tutoriais, exemplos de código e
ajudas úteis sobre o desenvolvimento destinado a
engenhos portáteis.
Open .NET Compact Framework
http://www.opennetcf.org/
Código fonte e
Framework.
exemplos
destinado
ao
Compact
JWHedgehog-Developmentor .NET Reference
http://www.develop.com/compactframework/
Possui uma completa referência de todos os
namespaces do Compact Framework com respectivas
classes, membros, propriedades, eventos, etc.
DevBuzz
http://www.devbuzz.com/content/init_compact_framework.asp
Informações sobre o desenvolvimento para PocketPC
DevX
http://www.devx.com/
Enorme quantidade de código fonte em variadas
linguagens incluindo Visual Basic.NET e C#.
125
GotDotNet .NET Framework Community
http://www.gotdotnet.com/
Discusão do .NET em geral.
CSharp Friends
http://www.csharpfriends.com/
Grande comunidade C#.
126
LIVROS E EBOOKS
Microsoft .NET Compact Framework
autores
Andy Wigley
Stephen Wheelwright
Mark Sutton
Definitive Guide to the .NET Compact Framework
autores
Larry Roof
Dan Fergus
Mastering Visual Basic .NET
autores
Evangelos Petroutsos
127
VB.NET Developer's Guide
autores
Cameron Wakefield
Wei Meng
Visual Blueprint for Building C# .Net Applications
autores
Eric Butow
Tommy Ryan
C#.Net Web Developer's Guide
autores
Greg Hack
Adrian Turtschi
Jason Werry
Joseph Albahari
Wei Meng Lee
128
Applied Microsoft .NET Framework Programming
autores
Jeffrey Richter
O'Reilly .NET Framework Essentials
autores
Thuan L. Thai
Hoang Q. Lam
129
DOCUMENTOS
Windows Mobile Hardware
http://www.microsoft.com/windowsmobile/buyersguide/compare/emea/pocketpc.mspx
Hardware aconselhado pela Microsoft para o PocketPC.
The Visual Studio Vision
http://www.zdnet.com/filters/printerfriendly/0,6061,2879055-92,00.html
Introdução e objectivos do Visual Studio.NET
Top 10 reasons to go with .Net
http://www.zdnet.com/filters/printerfriendly/0,6061,2901097-92,00.html
Vantagens do .NET
Developing Applications for Windows Mobile: FAQ
http://msdn.microsoft.com/library/en-us/dnppcgen/html/devmobfaq.asp
Perguntas mais frequêntes no desenvolvimento de
aplicações para dispositivos móveis.
Microsoft .NET Compact Framework for Mobile
http://www.directionsonmicrosoft.com/sample/DOMIS/update/2003/02feb/0203ncfe.htm
Prespectiva geral do .NET Compact Framework
Introduction to Development Tools
http://msdn.microsoft.com/library/en-us/dnppcgen/html/devtoolsmobileapps.asp
Introdução às ferramentas de desenvolvimento.
The PC in Your Pocket
http://msdn.microsoft.com/library/en-us/dnroad/html/road06272001.asp
Características do PocketPC e debug de aplicações.
Taking Control with C#
http://msdn.microsoft.com/library/en-us/dnroad/html/road01082003.asp
Alguns dos controls disponíveis para o interface das
aplicações, com exemplos em C#.
Creating Custom Controls
http://msdn.microsoft.com/library/en-us/dnroad/html/road11272002.asp
Criação de controls adaptados.
Pocket PC 2002 at home in enterprise
http://www.zdnet.com/filters/printerfriendly/0,6061,2851704-92,00.html
http://www.zdnet.com/filters/printerfriendly/0,6061,2913272-92,00.html
A utilização de PocketPCs nas empresas.
130
Developing Applications Using Web Services
http://msdn.microsoft.com/library/default.asp
?url=/library/en-us/dnppcgen/html/connecteddotnetppcapps.asp
Aplicações .NET Compact Framework com a utilização
de XML Web Services.
Ways Compact Framework Can Access Databases
http://www.directionsonmicrosoft.com/
sample/DOMIS/update/2003/02feb/0203ncfe_illo1.htm
Acesso a bases de dados.
What's New for Developers in Win Mobile 2003
http://msdn.microsoft.com/library/default.asp?url=/downloads/list/pocket2003.asp
Windows Mobile 2003, a mais recente actualização do
SDK para o desenvolvimento destinado a aparelhos
móveis.
Microsoft Case Studies: Pepsi Bottling Group, The
http://www.microsoft.com/resources/casestudies/CaseStudy.asp?casestudyid=13819
Utilização do Compact Framework pela Pepsi Bottling
Group.
Microsoft Case Studies: Tesco.com
http://www.microsoft.com/resources/casestudies/CaseStudy.asp?CaseStudyID=13394
Utilização do Compact Framework pelos supermercados
Tesco.
Microsoft Case Studies: GeoVector.com
http://www.microsoft.com/sql/ce/productinfo/casestudy.asp?CaseStudyID=13399
Utilização do Compact Framework no desenvolvimento
de uma aplicação de informação posicional.
Microsoft Preps New Handheld OS
http://zdnet.com.com/2102-1104_2-1015726.html?tag=printthis
Próximo Sistema Operativo: PocketPC 2003
ActiveSync 3.6 Download
http://www.microsoft.com/mobile/downloads
Download do ActiveSync 3.6, necessário para a ligação
de um aparelho físico.
131