Escolar Documentos
Profissional Documentos
Cultura Documentos
2013
novembro
2013
04 05
Criando aplicações com
o Ribbon
Editorial Autor: Luciano Pimenta
08
TFileHV:
Gerenciamento Básico de Arquivos – Parte 2
13
Desenvolva uma Aplicação
Desktop em C# e MySQL –
Parte 4
20 27
Criando fomulário de SoapUI
layout padrão - Delphi 7 Ferramenta para Open
Source para consumir
Web Services
03
novembro
2013
Editorial
Olá amigos do The Club, é sempre com muita satisfação e alegria que
preparamos mais uma revista recheada de assuntos interessantes aos
Av. Profº Celso Ferreira da Silva, 190
Jd. Europa - Avaré - SP - CEP 18.707-150
Informações e Suporte: (14) 3732-1529
Internet
http://www.theclub.com.br
Cadastro: cadastro@theclub.com.br
Suporte: suporte@theclub.com.br
senhores. Começando com nosso consultor técnico Lucas de Oliveira, que Informações: info@theclub.com.br
Skype Cadastro: theclub_cadastro
aborda um assunto de grande utilidade no desenvolvimento de aplicações Skype Suporte: theclub_linha1
theclub_linha2
Desktop, como devemos criar um Formulário de Layout Base utilizando o theclub_linha3
Dados Mysql. Nesta quarta parte ele disponibiliza a aplicação completa para Diretor Técnico
download para quem deseja aprender um pouco mais sobre esta tecnologia. Marcos César Silva
Para Finalizar nossa série de artigos, apresento uma ferramenta Freeware Diagramação
Vitor M. Rodrigues
chamada “SoapUI”, muito indicada para Consumir e testar diversos tipos
Design
de Web Services. Vitor M. Rodrigues
Revisão
Fiquem a vontade para nos dar sugestões de artigos e dicas para artigos Drielly Cristini Patrinhani
futuros. Colunistas
Hamden Vogel
Jeferson Silva de Lima
Luciano Pimenta
Thiago Cavalheiro Montebugnoli
Vou Ficando por aqui, um forte abraço e até o mês que vem!
Juninho
Jeferson Silva de Lima
Impressão e acabamento:
GRIL - Gráfica e Editora
Taquarituba-SP - Tel. (14) 3762-1345
Reprodução
A utilização, reprodução, apropriação, armazenamento em banco
de dados, sob qualquer forma ou meio, de textos, fotos e outras
criações intelectuais em cada publicação da revista “The Club
Megazine” são terminantemente proibidos sem autorização
escrita dos titulares dos direitos autorais.
04
novembro
2013
Criando aplicações com
o Ribbon
R
ibbon é um estilo incorporado pela Microsoft na suíte Office
a partir da versão 2007. A ideia era agrupar várias funciona-
lidades em uma mesma barra de ferramenta para facilitar a
vida do usuário. Além disso, possui um menu para concentrar
as funcionalidades mais acessadas da aplicação.
Para criar um grupo (RibbonPage), basta clicar com o botão direito e esco-
lher Add Tab. Na aba, temos as propriedades para sua configuração (Caption,
Hint etc), semelhante ao TabSheet do PageControl. Dentro da aba, podemos
adicionar os grupos (RibbonGroup), para isso, clique com o botão direito e
escolha Add Group.
Dentro desses grupos, teremos os itens (botões) que vamos usar. Agora,
precisamos configurar as actions do ActionManager. Dê um duplo clique no
ActionManager e acesse a aba Actions (Figura 3).
05
novembro
2013
Para quem já trabalhou com ActionList, a tela é bastante familiar. Após, Configurando controles
vamos configurar essas actions para o Ribbon. Acesse a propriedade ActionBars
do ActionManager e adicione um ActionBarItem. No ActionBarItem, vamos Para criar um CheckBox ou RadioButton, basta escolher a opção no Com-
vincular com cada grupo que criamos anteriormente, ou seja, cada grupo terá mandStyle. Caso deseje criar um Combobox, arraste um RibbonComboBox da
um ActionBarItem vinculado. Tool Palette para dentro de um grupo. Preenche o combo, usando a proprie-
dades Items do controle recém adicionado.
Acesse a propriedade Items do ActionBarItem e para cada item que deseja
adicionar, você pode vincular para com uma ação (propriedade Action). Pronto, Veja na Figura 5 um Ribbon contendo botões, CheckBox, RadioButton,
cada item (action) deve ser colocado em um grupo (ActioBarItem) e um ou menus e ComboBox.
mais grupos podem estar dentro de um aba (RibbonPage). Veja na Figura 4.
Figura 4. Ribbon configurado Usamos a mesma facilidade para usarmos o SpinEdit. Basta adicionar um
RibbonSpinEdit diretamente no grupo.
Podemos adicionar Action pré-definidas, basta clicar na propriedade
Action e escolher New Standar Action, onde temos uma lista das actions que
podemos configurar para o item. Menu de acesso rápido
Cada item representa uma Action e cada item adicionado será mostrado
na parte inferior do menu do Application Menu (Figura 6). Ideal para comandos
de fechar a aplicação, configurações etc.
Controles no Ribbon
06
novembro
2013
Para adicionar itens, acesse a propriedade ActionBars do ActionManager.
No editor, selecione o ActionBar do Quick Access Tolbar. Na propriedade Items,
adicionamos os itens que queremos. Veja o resultado na Figura 9.
Conclusões
Vimos nessa dica rápida, como usar o Ribbon para criar aplicações com
visual moderno, com o Delphi. Já tive a experiência de usar o controle em uma
aplicação e o resultado foi muito bom, sendo que o usuário da aplicação achou
o visual mais limpo e organizado.
Sobre o autor
Luciano Pimenta
Luciano Pimenta (NOVO DOMINIO: www.lucianopimenta.com) é desenvolvedor Delphi/C#
para aplicações Web com ASP.NET, Windows com Win32 e Windows Forms com .NET. Palestrante
da 4ª edição da Borland Conference (BorCon) e da 1ª Delphi Conference.
É MVP Embarcadero, grupo de profissionais que ajudam a divulgar o Delphi no mundo.
Atualmente é desenvolvedor da SoftDesign fábrica de softwares em Porto Alegre-RS.
Autor de mais de 90 artigos e de mais de 600 vídeos aulas publicadas em revistas e sites
especializados, além de treinamentos presenciais e multimídias. É consultor da FP2 Tecnologia
(www.fp2.com.br) onde ministra cursos de programação e banco de dados.
www.lucianopimenta.net
07
novembro
2013
TFileHV - Gerenciamento
Básico de Arquivos Parte 2
N
o capítulo anterior, vimos a primeira utilização prática do
componente, que é a procura automática de arquivos e Text;
procura por strings de dentro deles; vimos também que FTPPort :=
ele retorna as linhas das ocorrências encontradas e quando StrToIntDef(edtPort.Text, 21);
clicado em um TListView associado a ele, é mostrada uma
Result := LoadFTP;
tela dinâmica com o arquivo-texto carregado mais a linha selecionada contendo
end;
a string procurada.
function TFileHV.LoadFTP:
Começando pelo começo: Conectando o Servidor FTP pelo Boolean;
TFileHV begin
if (fHost = ‘’) or (fUserName
Conectar um Servidor FTP pelo componente é tão fácil quanto conectar = ‘’) or (fPassWord = ‘’) then
manualmente (sem o componente), mas o componente oferece outros recursos begin
de conexão embutidos através da função booleana LoadFTP. Basicamente a Result := False;
maneira mais prática é passando diretamente os parâmetros para o compo- Exit;
nente. Um exemplo segue abaixo (também disponível ele e os outros demais end;
do escopo deste artigo para download):
Result := True;
if not Assigned(tempFTP) then
Exemplo de Conexão com o servidor FTP via TFileHV.
tempFTP := TIdFTP.
with FileHV1 do Create(Self)
begin else
FTPHost := edtHost.Text; tempFTP.Disconnect;
FTPUserName := edtUserName.
Text; tempFTP.Host := fHost;
FTPPassWord := edtPassword. tempFTP.Username :=
08
novembro
2013
Portanto, o Versionamento vai consistir para o histórico apenas um mesmo
fUserName; nome de arquivo e suas versões correspondentes. E todo arquivo será zipado
tempFTP.Password := no servidor (utilizando-se a biblioteca ZLB para compactação/descompactação
fPassWord; de arquivos) - esse processo de compactação será feito somente para armaze-
tempFTP.Port := fPort; namento de um arquivo novo, enquanto o de descompactação será feito toda
try vez em que for visualizar um arquivo (deve-se fazer download, descompactar e
finalmente visualizar) e comparar versões quando no momento de armazená-lo
tempFTP.Connect;
(conforme já explicado acima).
except
Result := False; Após subido o arquivo, ele será compactado e consequentemente terá sua
tempFTP.Disconnect; extensão renomeada para “zip”, e a novidade é que terá um prefixo com um
FreeAndNil(tempFTP); hífen, para indicar a ordem do versionamento (e é assim que o componente
end; identifica a ordem cronológica do versionamento), por exemplo:
end;
O melhor está por vir: o componente e seu tema central deste artigo Arquivo: “Faturamento.pdf”
explorará o processo de versionamento de arquivos, histórico de versões, Histórico: “1-Faturamento.zip”;
upload, download (que equivale a visualização do mesmo), exclusão, exclu- “2-Faturamento.zip”;
são/visualização automática da última versão, renomear arquivos, etc, tudo “3-Faturamento.zip”,
isso providenciado pelo próprio componente - não será necessário escrever etc.
código-fonte para todas essas operações, bastando-se apenas suas chamadas
de funções que são em grande maioria de uma a duas linhas de código no
máximo. Isso não chega a ser prático? Exemplo de padronização de nomes de arquivos utilizados no processo
de versionamento de arquivos do TFileHV.
09
novembro
2013
Trecho da criação do campo agregado MODIFIEDDATE, que tem o papel
de retornar o último registro (mais recente) de Data/Hora em que o arquivo
foi subido no Servidor FTP.
10
novembro
2013
Obtendo a Última Versão do Arquivo Código Fonte
Código Fonte
//renomear arquivos:
//modo 1:
//FileHV1.
RenameFTPFile(‘Fontes\100-
teste.zip’, ‘12-teste.zip’);
//modo 2:
Figura 13 - Tela de Informação do Caminho onde será efetuado o download do // FileHV1.RenameFTPFile(‘3-
arquivo para a sua visualização. teste.zip’, ‘333-teste.zip’);
//deletar arquivos:
Ambos os métodos DownloadLastVersion e DeleteLastVersion chamam a //modo 1:
função GetLastFileVersion para retornar a última versão de um arquivo. Graças //FileHV1.
ao método ModifiedDate de DirectoryListing.Items[i] (da classe TIdFTPListItem) DeleteFTPFile(‘Fontes\1-teste.
explicado anteriormente é possível descobrir o último arquivo daquela versão zip’);
que foi inserido no servidor: é só buscar a sua data/hora de inclusão e com //modo 2:
a ajuda de um campo agregado do tipo data/hora de um ClientDataSet fazer // FileHV1.
um “max” em seus registros para obter a última data/hora de um registro. DeleteFTPFile(CbFiles.Items.
Basicamente é isso: filtra-se o arquivo e sua última data/hora de inclusão Strings[CbFiles.itemIndex]);
no servidor, por exemplo: tempClientDataSet.Filter := ‘MODIFIEDDATE = ‘
+ QuotedStr(tempClientDataSet.Aggregates.Find(‘MaxData’).Value); onde
MaxData é o nome do nosso campo agregado criado em run-time para esta
finalidade. Explicação: o modo 1 acima citado realizará a operação diretamente
no diretório especificado. Se o diretório não existir, a operação falha. Do outro
lado, se o diretório não é fornecido, então o componente percorrerá a nossa
Como obter dados a pesquisar de um arquivo: Método Ge- estrutura de diretórios criados (abaixo do diretório-pai) para localizar o arquivo
tInfoFile em ação: citado, e se encontrado, efetuará a operação solicitada. Vale ressaltar que o
componente não percorrerá todo o FTP, e sim apenas nos diretórios criados
GetInfoFile é uma função booleana com dois parâmetros (assinatura: pelo componente explicados anteriormente.
function TFileHV.GetInfoFile(const myFullPathFile: string = ‘’): Boolean) - se
a constante myFullPathFile não for preenchida, então presume-se que você
deverá informá-la seu caminho completo, e para isso será criado um TOpen- Conclusão
Dialog para que o usuário especifique o caminho do documento; do outro lado
o programa pode fornecer diretamente o caminho via parâmetro, como em Primeiramente discorremos sobre a eficiência e a praticidade de procurar
arquivos, strings dentro de arquivos, exibir a linha selecionada de um arquivo,
11
novembro
2013
manipulação de arquivos, etc, de uma forma mais automatizada pelo compo- a grande maioria das funções podem ser acessadas a partir de um TStrings,
nente, economizando várias (dezenas) de linhas de código-fonte necessárias disponíveis para um Memo, Listbox, etc;
para obtenção do mesmo resultado se feito fora do componente; além de mos-
trar uma forma personalizada de anexação e extração de arquivos, acionando Portanto, foram explicadas todas as funcionalidades desta corrente versão
externamente o compilador do Delphi sem a necessidade de instalá-lo; técnicas do TFileHV; na minha página pessoal está disponível sempre a nova versão do
avançadas com o ListView (evento duplo-clique avançado, criação e manipu- mesmo. Dicas, críticas e sugestões também são bem-vindos. O código-fonte do
lação dinâmica, etc) e com o ClientDataSet (operações utilizando TFileStream, componente e os programas Demo também estão disponíveis para download.
TBlobField para armazenamento de arquivos, criação de campos agregados
e índices dinamicamente, criação e destruição de colunas automática, etc).
12 novembro
2013
Desenvolva uma
Aplicação Desktop em
C# e MySQL – Parte 4
N
os artigos anteriores, iniciamos o desenvolvimento da
aplicação verificando aspectos pertinentes ao desenvolvi-
mento, mas devido a quantidade de informações, tivemos
que dividir o artigo.
Nota: As referências de imagens estão diretamente relacionadas a Na janela que se abrirá você estará na etapa “ChooseModelContents”,
terceira parte desse artigo, sendo assim, é necessário estar ter iniciado clique em “GeneratefromDatabase” (pois, nesse caso, já temos o modelo e
as entidades do banco serão reconhecidas automaticamente) e em seguida
o desenvolvimento da aplicação pela terceira parte.
clique em Next conforme imagem 12:
Continuando...
Então, para começar, vá até a janela Solution Explorer, clique com o botão
direito no projeto MiniAplicacao e escolha Add -> New Item.
13
novembro
2013
Na etapa “Chooseyour data Connection” clique em “New Connection”
e selecione “MySQLDatabase” e depois clique em “Continue” conforme
imagens 13 e 14:
Voltando a configuração...
14
novembro
2013
“Save entity connection string in App.Config as:”para “MAEntities” confor-
meimagem 17. Observação: Repare que o campo “usuario” não pode ter o mesmo
nome da entidade, por isso o mesmo foi renomeado automaticamente
para “usuario1”. Isso não é impeditivo para o projeto (mesmo nesse
artigo), porém, por questões de Arquitetura e Projeto, tomem cuidado
para não cair nesse tipo de situação, pois, dependendo da complexidade
do projeto isso pode se tornar um problema sim. Imagine que você esteja
desenvolvendo um projeto complexo e seu cliente é uma SoftwareHouse.
O Responsável pode muito bem receber o código fonte e questiona-lo a
ponto de pedir que isso seja alterado e é aí que vem o pior, pois, depen-
dendo da etapa do seu projeto, o impacto poderá ser grande e custoso.
Voltando...
Com nosso modelo estabelecido, temos uma série de coisas que poderiam
ser feitas nesse arquivo EDMX para deixar nossa aplicação melhor estruturada
e modelada possível.
Imagem 17 – Nomeando a entidade após escolha do “DataSource”. Mas vamos focar no básico para que o básico seja feito da melhor forma.
Após renomear a entidade para “MAEntities” clique em “Next”. Abra a classe Usuario.cs e inclua uma variável do tipo string que servirá
para indicação da ação que será realizada (linha em Negrito).
Na etapa “ChooseyourDatabaseObjects”, selecione a opção “Tables” e
renomeie o “ModelNamespace” para “MAModel” e clique em “Finish” con-
forme imagem 18. public partial class frmUsuario
: MAAcoes
{
public string strAcao = string.
Empty;
…
Imagem 19 – Maplic.edmx apresentando as entidades do BD LDC. Dê um duplo clique no botão “Alterar” e inclua o código a seguir:
15
novembro
2013
private void btnAlterar_ Text)) && (!string.
Click(object sender, EventArgs IsNullOrEmpty(txtSenha.Text)))
e) {
{ switch (this.strAcao)
this. {
AjustaCamposFormulario(this.
case “NOVO”:
Controls, true);
using (MAEntities context = new
this.
AjustaBotoesFormulario(this. MAEntities())
Controls, true); {
this.strAcao = “ALTERAR”; usuario u = new usuario();
} u.nome = txtNome.Text;
u.usuario1
= txtUsuario.Text;
u.senha = txtSenha.Text;
Dê um duplo clique no botão “Cancelar” e inclua o código a seguir: context.usuario.AddObject(u);
context.SaveChanges();
MessageBox.Show(“Informações
inseridas com sucesso.”,
privatevoidbtnCancelar_
“Aviso”, MessageBoxButtons.OK,
Click(objectsender, EventArgs
e) MessageBoxIcon.Information);
{ }
if (MessageBox.Show(“Deseja break;
cancelar a operação atual?”,
this.Text, MessageBoxButtons. case “ALTERAR”:
YesNo, MessageBoxIcon. using (MAEntities context = new
Exclamation) == DialogResult. MAEntities())
Yes) {
{ intintID = Convert.
this. ToInt32(txtID.Text);
AjustaBotoesFormulario(this.
usuario u = context.usuario.
Controls, false);
First<usuario>(pu =>pu.
this.
AjustaCamposFormulario(this. idusuario == intID);
Controls, false); u.nome = txtNome.Text;
this.AjustaValorCamposFormulari u.usuario1
o(this.Controls); = txtUsuario.Text;
} u.senha = txtSenha.Text;
} context.SaveChanges();
MessageBox.Show(“Informações
alteradas com sucesso.”,
“Aviso”, MessageBoxButtons.OK,
Dê um duplo clique no botão “Salvar” e inclua o código a seguir: MessageBoxIcon.Information);
}
break;
}
privatevoidbtnSalvar_
Click(objectsender, EventArgs
this.
e)
AjustaCamposFormulario(this.
{
Controls, false);
if ((!string.
this.
IsNullOrEmpty(txtNome.
AjustaBotoesFormulario(this.
Text)) && (!string.
Controls, false);
IsNullOrEmpty(txtUsuario.
this.AjustaValorCamposFormulari
16
novembro
2013
o(this.Controls); o(this.Controls);
} }
else }
{ }
MessageBox.Show(“Preencha o
campos antes de Salvar “,
“Aviso”, MessageBoxButtons.OK,
Espere um pouco... Estou falando de Alteração e Exclusão, mas, não temos
MessageBoxIcon.Warning); como buscar nossos dados na aplicação, temos?
}
} Temos, temos sim e eu separei um tempo para que nossa aplicação fique
cada vez melhor.
privatevoidbtnExcluir_
Click(objectsender, EventArgs
e)
{
if (MessageBox.Show(“Deseja
excluir registro atual?”, this.
Text, MessageBoxButtons.YesNo,
MessageBoxIcon.Exclamation) ==
DialogResult.Yes)
{ Imagem 20 – Formulário de Pesquisa.
if (txtID.Text == string.Empty)
{ Com o formulário criado, insira o código em negrito:
MessageBox.Show(“Selecione um
registro no botão \”Pesquisar\”
antes de \”Excluir\”.”,
“Aviso”, MessageBoxButtons.OK, public partial class Consulta :
MessageBoxIcon.Information); MAAcoes
} {
else publicConsulta()
{ {
intintID = Convert. InitializeComponent();
ToInt32(txtID.Text); }
17
novembro
2013
Click(object sender, EventArgs Width = 189;
e) dgvDados.Columns[“usuario1”].
{ HeaderText = “Usuário”;
this.Close(); dgvDados.Columns[“senha”].
this.Dispose(); Visible = false;
} dgvDados.Columns[“contato”].
Visible = false;
private void dgvDados_ break;
Click(object sender, EventArgs }
e) }
{
if (dgvDados.RowCount> 0)
{
Em seguida, temos que colocar o botão pesquisar no formulário de Usu-
this.setID(dgvDados. ários. Sendo assim, insira um botão e chame-o de “btnPesquisar” e coloque
SelectedCells[0].Value.
o texto “Pesquisar” como mostra a imagem 21.
ToString());
this.formSender.
chamarMetodo(“carregaDados”,
this.ID);
this.formSender.Show();
this.Close();
this.Dispose();
}
}
...
Imagem 21 – Botão Pesquisar
Com o novo botão, teremos que modificar algumas coisas na classe MA-
Depois, dê um duplo clique em btnPesquisar e insira o código em negrito Acoes e na Classe frmUsuario, então vamos começar pela classe MAAcoes
a seguir: inserindo o código em negrito:
18
novembro
2013
public partial class frmUsuario }
: MAAcoes }
{
publicMAAcoesformConsulta;
public string strAcao = string.
Empty; Ao testar nossa aplicação, devemos obter o resultado mostrado na
imagem 22.
19
novembro
2013
Criando um formulário de
layout padrão - Delphi 7
O
lá pessoal, neste artigo vamos mostrar uma das variadas É este último conceito, o de CSS externo, que iremos citar neste artigo,
formas de trabalhar com a padronização dos componentes pois essa prática de padronização de layout será tratada de forma parecida,
visuais no Delphi. A escolha da versão 7 do Delphi se deve a porém, ao invés de se ter um arquivo CSS externo, terá um formulário criado
sua popularidade na comunidade da ferramenta e também apenas para disponibilizar os componentes que servirão de base para os demais
porque as versões mais atuais do Delphi possuem muitos formulários do projeto. E da mesma forma que temos que fazer a chamada do
recursos para a padronização de estilos dos componentes, contudo, a prática arquivo CSS na página HTML quando queremos utilizar seu estilo, teremos que
utilizada neste artigo poderá ser utilizada em qualquer versão do Delphi, visto fazer a chamada do formulário padrão de layout nos formulários que iremos
que se trata de manipulação via programação e este é um recurso comum em utilizar essa padronização.
todas as versões.
Para reforçar o entendimento do conceito de CSS nesta prática vamos
tomar como exemplo a utilização do CSS no HTML. É sabido que ao utilizar um
Objetivo arquivo CSS externo para a estilização de um documento HTML, este último
pode ser criado com seus elementos padrão, ou seja, sem nenhuma formatação
O objetivo deste artigo é ensinar uma prática de padronização do layout dos ou alteração de características. Com essa prática de estilização dos componen-
componentes visuais no Delphi. Essa prática possibilita o ajuste e a visualização tes no Delphi que iremos ensinar o conceito será o mesmo, para cada novo
dos componentes em tempo de projeto, para isso utiliza-se um formulário, formulário que for criar no projeto, bastará apenas chamar via programação o
onde serão dispostos os componentes visuais com as características que ser- formulário de estilo padrão, basta adicionar os componentes sem precisar se
virão como padrão para a aplicação inteira, ou apenas para os formulários que preocupar com os ajustes visuais, pois serão ajustados em tempo de execução
necessitarem utilizar esse padrão, pois podemos definir isso via programação. pelo formulário base de layout.
Quem já desenvolveu um website algum dia, conhece ou já ouviu falar do Com essa prática, além de podermos configurar o visual dos componentes
uso do CSS para a configuração do layout de uma página HTML. da aplicação, podemos também predefinir alguns métodos e comportamentos
para determinados componentes, como por exemplo, Edit que aceita apenas
Existem três formas de se trabalhar com o CSS, são elas: números inteiros e Label que se destaca com o movimento do mouse ao
passar por cima dele entre outros métodos corriqueiros. Mas devemos fazer
• Embutido – quando o estilo é aplicado diretamente à tag HTML; uma ressalva, pois ao definir os métodos nos componentes do formulário base
• Interno – quando o código CSS fica disposto entre as tags STYLE no de layout, devemos ter em mente que estes métodos serão vinculados aos
próprio documento HTML; componentes dos demais formulários em tempo de execução.
• Externo – quando o código CSS fica disposto num arquivo separado
no documento HTML, esta é uma das formas mais dinâmicas de se trabalhar, Para explicar melhor o cuidado que se deve tomar ao utilizar métodos
pois um único arquivo pode ser o responsável por configurar o estilo de inú- nos componentes de layout padrão, iremos utilizar o exemplo do Edit que
meras páginas HTML. Com este método os elementos HTML podem ser criados aceita apenas números, essa programação será feita no evento OnKeyPress
de forma padrão sem se preocupar com seus estilos, pois serão ajustados ao do Edit e ao executar o projeto, ela é vinculada aos componentes Edit dos
serem carregados no webbrowser. demais formulários do projeto, isso indica que, se em algum Edit tiver alguma
outra programação no mesmo evento, OnKeyPress, esta será substituída pela
20 novembro
2013
programação do Edit que aceita apenas números inteiros. componente. Algumas fontes como Courier New, podem alongar o texto, por
isso tome cuidado ao escolher o estilo de fonte;
Por esse motivo indicamos que sejam criados apenas métodos genéricos e • ShowHint – Define se será exibido o texto de ajuda do componente.
específicos e se possível em eventos que comumente não se utilize, pois assim Se estiver definido como True e a propriedade Hint estiver vazia, não será
evitará que ocorra esta substituição de eventos, pois esta prática funciona de mostrado nada ao usuário.
maneira diferente de quando utilizamos uma herança de formulários, nesta
última, o código no formulário base é adicionado ao código no formulário
É claro que podemos padronizar outras propriedades, pois cada compo-
que recebe a herança, ou seja, não ocorre perda de codificação, que é o que
nente possui várias propriedades que podem ser manipuladas via programação,
acontecerá se um evento for substituído por outro como é feito nesta prática.
Contudo ainda não deixa de ser uma prática interessante, pois podemos por exemplo, no formulário podem ser alteradas as seguintes propriedades
por exemplo, criar vários estilos de Edit, alguns com codificações e outros além das que já foram citadas na lista anterior:
comuns sem nenhuma codificação, diferenciando-os apenas pela sua pro-
priedade Tag. • Color – Define qual será a cor de preenchimento do formulário;
• Position – Define qual será a posição inicial do formulário ao ser
exibido;
Escolhendo o estilo pela propriedade Tag • BorderIcons – Define quais serão os botões apresentados na borda
da janela (Minimizar, Maximizar e Fechar);
Depois que fizermos toda a programação no formulário de base de layout, • BorderStyle – Define qual o estilo da borda do formulário;
bastará informar nos componentes dos demais formulários qual o estilo que
será aplicado em cada um. Isso será defino através da propriedade Tag de Alguns componentes podem ter mais propriedades para configurar do
cada componente. que outros. Isso irá variar para cada caso.
A Tag padrão para qualquer componente criado pelo Delphi possui o valor
0 (zero), portanto todo estilo que for representado pela Tag 0 deve ser o mais Criando o formulário base de layout
comum em sua aplicação, ou seja, o estilo que será tido como padrão, pois
facilitará muito na sua configuração posterior. Os demais podem ser apenas Criaremos um formulário para definir alguns estilos de Edit, SpeedButton,
uma variação do componente para casos mais específicos. Para casos em que Label, Panel e alguns outros componentes visuais. É importante reforçar que
não se deva aplicar estilo algum, bastará informar no componente uma Tag pode-se trabalhar com vários componentes, isso dependerá da necessidade
com valor negativo ou qualquer outro valor que não tenha sido definido como e da criatividade do desenvolvedor.
um estilo, por exemplo, -1.
Crie um nova aplicação no Delphi 7. O primeiro formulário será o nosso
formulário base para layout, defina em sua propriedade Name o nome “fr-
Quais propriedades podem ser padronizadas? mFormBaseLayout”, salve a Unit com o nome unFormBaseLayout e o projeto
com o nome de sua preferência em um diretório em seu computador.
Essa é uma pergunta muito importante a ser feita, pois visto que iremos
fazer uma padronização de layout, devemos ter em mente o que tanto po-
deremos padronizar. Por exemplo, talvez não seja interessante alterarmos a Adicionando estilos de Label
largura dos componentes, pois poderemos nos deparar com casos em que o
componente atravesse outro componente no escopo do formulário ou mesmo Adicione ao frmFormBaseLayout um componente TGroupBox, nomeie-o
como “gbLabel”, altere a propriedade Caption para “Label”. É dentro desse
saia do campo de visão do usuário. Isso iria causar uma grande dor de cabeça.
grupo que ficarão os estilos diferentes de Label. Adicione 2 componentes
TLabel dentro do gbLabel, nomeie-os da seguinte forma: “Label0” e “Label1”.
Outro caso que talvez não seja interessante padronizar é o tamanho e estilo
da fonte (negrito, itálico, etc...) , pois pode acontecer como o que foi citado
Repare que a nomenclatura utilizada, é composta pelo nome do compo-
anteriormente, e na hora da execução o texto que estava dentro do escopo do
nente e um número que começa a partir do zero. Este número, na nomen-
formulário em tempo de projeto com uma fonte sem estilo, pode desalinhar
clatura, irá representar qual a o valor que deve-se indicar na propriedade Tag
com o estilo padrão assumido em tempo de execução, com uma fonte com
para utilizar este estilo.
um tamanho maior e um estilo em negrito por exemplo.
21
novembro
2013
Listagem 1 – Codificação dos eventos da Label1 if C.Tag = 1 then
procedure TfrmLayoutBase. begin
Label1MouseEnter(Sender: C.OnMouseEnter :=
TObject); X.OnMouseEnter;
begin C.OnMouseLeave :=
{ Altera a cor de fundo da X.OnMouseLeave;
Label } end;
TLabel(Sender).Color := end;
TLabel(Sender).Color + $1; end;
end;
procedure TfrmLayoutBase.
Label1MouseLeave(Sender: No primeiro trecho do código serão atribuídas à variável X as proprieda-
TObject); des de um dos componentes especificados como estilo. No segundo trecho,
begin verifica-se se a variável X recebeu alguma atribuição. Em caso de verdade,
{ Define a cor de fundo para a
cor do componente Parent } o parâmetro C receberá as propriedades da variável X. Por fim ainda temos
TLabel(Sender).ParentColor := mais uma verificação, se o parâmetro faz referência ao estilo de Tag 1, se for,
True; passam também os eventos da Lable1.
end;
A estrutura deste método será igual para o ajuste dos demais componen-
tes. O case utilizado no primeiro trecho é o que facilitará para a inclusão de
Vamos agora criar o método que irá incorporar o estilo nas demais Labels. um novo estilo, pois bastará incluir mais uma linha dentro do bloco do case
Consiste num procedimento com um parâmetro de entrada do tipo TLabel.
atribuindo o novo componente de estilo à variável X, assim não será preciso
Esse procedimento possui uma variável X também do tipo TLabel, que será
alterar o restante do método.
utilizada para incorporar as propriedades da Label0 ou da Label1. Será cha-
mado de AjustaLabel. Veja na listagem 2 a declaração na seção private e a
codificação do evento.
Adicionando estilos de Edit
Listagem 2 – Declaração e codificação do método AjustaLabel Adicione ao frmFormBaseLayout mais um GroupBox, altere seu Name
private para “gbEdit”. Adicione 5 componentes Edit dentro do gbEdit e nomeie-os da
{ Private declarations } seguinte forma: “Edit0”, “Edit1”, “Edit2”, “Edit3” e “Edit4”. As características
procedure AjustaLabel(C: destes são as seguintes:
TLabel);
{Tecle Ctrl + Shift + C • Edit0: Será o Edit padrão da aplicação;
para gerar o corpo do método} • Edit1: Será o Edit somente para leitura;
• Edit2: Será o Edit que aceita apenas números inteiros;
procedure TfrmFormBaseLayout. • Edit3: Será o Edit que aceita números com duas casas decimais;
AjustaLabel(C: TLabel);
• Edit4: Será o Edit que aceita números com N casas decimais.
var
X: Tlabel; Selecione os 5 Edits segurando a tecla Shift e clicando com o ponteiro do
Begin mouse em cada um deles, após todos estarem selecionados, acesse o painel
X := nil; Object Inspector do Delphi e altere as propriedades Font.Name para “Arial”,
case C.Tag of BorderStyle para “bsNone” e BevelKind para “bkFlat”, desta forma os edits
0: X := Label0; { Label assumirão um layout mais chapado, sem a aparência 3D.
comum }
1: X := Label1; { Label Selecione o Edit1 (somente leitura) e altere as seguintes propriedades:
link } Color para “clMoneyGreen”, Font.Color para “clBackground” e ReadOnly para
end; “True”.
if X <> nil then
Os Edits 2, 3 e 4 terão cada um deles uma programação no evento OnKey-
begin
C.Cursor := X.Cursor; Press, que será responsável por atribuir a eles suas características. Veja na
C.ShowHint := X.ShowHint; listagem 3 a codificação para cada um dos eventos.
C.Font.Name := X.Font.Name;
C.Font.Color := X.Font. Listagem 3 – Codificação do evento OnKeyPress dos Edits 2, 3 e 4
Color;
procedure TfrmFormBaseLayout.
Edit2KeyPress(Sender: TObject;
C.Transparent :=
var Key: Char);
X.Transparent;
begin
22
novembro
2013
Como podemos ver, fizemos uma trava para cada um destes três Edits
{ Admite apenas números
seguindo a característica de cada um. Podemos executar o projeto agora
inteiros }
if not (Key in [‘0’..’9’, e testarmos se estes eventos estão funcionando corretamente. Este é um
#8]) then {#8 representa a exemplo de evento que pode ser útil para se padronizar, contudo ainda de-
tecla Backspace} vemos lembrar, que o Edit que for utilizar algum destes 3 estilos não deverá
Key := #0; ter nenhuma codificação no evento OnKeyPress, pois a esma será substituída
end; por esta codificação.
procedure TfrmFormBaseLayout. Vamos agora criar o método AjustaEdit que irá definir os estilos dos
Edit3KeyPress(Sender: TObject; edits em tempo de execução. Como foi dito, este método será semelhante
var Key: Char); ao AjustaLabel. Veja na listagem 4 os códigos do procedimento AjustaEdit. A
const declaração deste método é feita abaixo da declaração do método AjustaLabel
QDecimal = 2; { Defina aqui a
na sessão private da Unit.
Qtde de casas decimais }
var
S: string; Listagem 4 – Codificação do método AjustaEdit
P, Q: Integer;
begin procedure TfrmFormBaseLayout.
{ Admite número com um número AjustaEdit(C: TEdit);
definido de casas decimais na var
constante QDecimal } X: TEdit;
if not (Key in [‘0’..’9’, begin
‘,’, #8]) then { Caso seja ReadOnly mas não
Key := #0 esteja definida pela Tag, define
else a Tag 1 }
begin if (C.ReadOnly) and (C.Tag <>
S := TEdit(Sender).Text; 1) then
P := Pos(‘,’, S); C.Tag := 1;
if (P > 0) and (Key in
[‘0’..’9’, ‘,’]) then { Identifica o estilo pela Tag
begin }
S := Copy(S, P, Length(S) X := nil;
- P); case C.Tag of
Q := Length(S); 0: X := Edit0; { Edit comum
if (Q = QDecimal) or (Key }
= ‘,’) then 1: X := Edit1; { Edit
Key := #0; somente leitura }
end; 2: X := Edit2; { Edit só
end; inteiros }
end; 3: X := Edit3; { Edit só
decimais 2 casas }
procedure TfrmFormBaseLayout. 4: X := Edit4; { Edit só
Edit4KeyPress(Sender: TObject; decimais N casas }
var Key: Char); end;
var
S: string; { Transfere as propriedades
P: Integer; do componente base
begin para o componente passado
{ Admite números com N casas como parâmetro }
decimais } if X <> nil then
if not (Key in [‘0’..’9’, begin
‘,’, #8]) then C.Cursor := X.Cursor;
Key := #0 C.ShowHint := X.ShowHint;
else C.Font.Name := X.Font.Name;
begin C.Font.Color := X.Font.
S := TEdit(Sender).Text; Color;
P := Pos(‘,’, S);
if (P > 0) and (Key = ‘,’) C.Color := X.Color;
then C.BorderStyle :=
Key := #0; X.BorderStyle;
end; C.BevelKind := X.BevelKind;
end; C.ReadOnly := X.ReadOnly;
23
novembro
2013
{ Caso necessário transfere if X <> nil then
os eventos } begin
if C.Tag in [2, 3, 4] then C.Cursor := X.Cursor;
C.OnKeyPress := C.ShowHint := X.ShowHint;
X.OnKeyPress; C.Font.Name := X.Font.Name;
end; C.Font.Color := X.Font.
end; Color;
C.Flat := X.Flat;
C.Layout := X.Layout;
O que podemos destacar de diferente neste código é que a primeira C.Transparent :=
X.Transparent;
verificação se faz necessária para identificar se o componente passado como
end;
parâmetro foi definido como somente leitura pela propriedade ReadOnly, mas end;
não foi definido o seu estilo na propriedade Tag, por isso alteramos a Tag para
1. Podemos ver que no caso dos Edits já foram transferidos mais propriedades
que na Label. A verificação para a transferência dos eventos é semelhante ao
método AjustaLabel, com a diferença que agora temos mais dois estilos que Adicionando estilos de Panel
têm eventos a serem passados.
Este será o último exemplo de estilos de componentes. Iremos criar três
Adicionando os estilos de SpeedButton estilos diferentes de Panel, um mais simples, outro com uma borda transpa-
rente que não ficará visível para o usuário (bom para casos em que devemos
O componente TSpeedButton é muito interessante, pois com ele podemos agrupar alguns componentes para facilitar o desenvolvimento do layout da
trabalhar com Flat (quando o botão apresenta apenas seu rótulo no formulário, aplicação, mas não deve ficar visível ao usuário esse agrupamento) e por fim
mas quando o mouse passa por cima dele ele assume a forma de um botão outro Panel com uma borda diferenciada.
comum) e imagens. Vamos criar dois estilos de SpeedButton um com Flat e
outro sem o recurso de flat, que seria um botão comum. Adicione ao frmFormBaseLayout mais um GroupBox chamando-o de
“gbPanel” e adicione dentro dele três componentes Panel nomeando-os como
Adicione ao frmFormBaseLayout um GroupBox e nomeie-o como “gbS- “Panel0”, “Panel1” e “Panel2”. Selecione os três Panels e altere as propriedades
peedButton”, adicione dentro do gbSpeedButton, recém-criado, dois Speed- Font.Name para “Trebuchet MS” e ParentColor para “True”.
Buttons, nomeie-os seguindo o padrão de nomenclatura citado, o nome do
componente mais um número sequencial a começar pelo zero. Selecione os Selecione o Panel0 e altere sua propriedade BevelWidth para “2”. Será o
dois SpeedButtons e altere as propriedades Cursor para “crHandPoint”, Font. Panel comum do projeto.
Name para “Century” e Font.Color para “clHighlight”. Em seguida selecione
apenas o SpeedButton1 e altere sua propriedade Flat para “True”. Selecione p Panel1 e altere a propriedade BevelOuter para “bvNone”. Será
o Panel que ficará invisível para o usuário.
Nota: Estamos usando fontes de tipos diferentes nos componentes para
demonstrar de forma mais clara o objetivo deste artigo que é mostrar a va- Por fim selecione o Panel2 e altere suas propriedades BevelInner para
riedade de estilos que podemos criar com este formulário base para layout. “bvLowered” e BevelWidth para “2”. Desta forma teremos um Panel com uma
borda diferenciada, semelhante a um quadro.
Não há necessidade de adicionarmos nenhum evento aos SpeedButtons,
neste caso apenas iremos criar o método AjustaSpeedButton. Veja na listagem Vamos criar também o método AjustaPanel, que seguirá o mesmo padrão
5 sua codificação. Lembrando que a declaração deste método é feita abaixo dos demais métodos apenas adicionando algumas propriedades particulares
da declaração do método AjustaEdit. do Panel. Veja na listagem 6 a codificação deste último método de exemplo.
Lembre-se de declarar o procedimento abaixo do último método criado na
Listagem 5 – Codificação do método AjustaSpeedButton sessão private.
procedure TfrmFormBaseLayout.
AjustaSpeedButton(C:
Listagem 6 – Codificação do método AjustaPanel
TSpeedButton);
var
X: TSpeedButton; procedure TfrmFormBaseLayout.
begin AjustaPanel(C: TPanel);
X := nil; var
case C.Tag of X: TPanel;
0: X := SpeedButton0; { begin
SpeedButton comum } X := nil;
1: X := SpeedButton1; { case C.Tag of
SpeedButton Flat ativo } 0: X := Panel0; { Painel
end; comum }
24
novembro
2013
1: X := Panel1; { Painel { Ajusta apenas Form com tag
invisível } 0 }
2: X := Panel2; { Painel if Frm.Tag = 0 then
com bordas de quadro } begin
end; Frm.Cursor := Self.Cursor;
Frm.ShowHint := Self.
if X <> nil then ShowHint;
begin Frm.Font.Name := Self.Font.
C.Cursor := X.Cursor; Name;
C.ShowHint := X.ShowHint; Frm.Font.Color := Self.
C.Font.Name := X.Font.Name; Font.Color;
C.Font.Color := X.Font.
Color; Frm.Color := Self.Color;
Frm.Position := Self.
C.Alignment := X.Alignment; Position;
C.BevelInner := Frm.BorderIcons := Self.
X.BevelInner; BorderIcons;
C.BevelOuter := Frm.BorderStyle := Self.
X.BevelOuter; BorderStyle;
C.BevelWidth := end;
X.BevelWidth;
C.BorderStyle := { Ajusta os componentes
X.BorderStyle; visuais do Form }
C.BorderWidth := for I := 0 to Frm.
X.BorderWidth; ComponentCount - 1 do
C.ParentColor := begin
X.ParentColor; C := Frm.Components[I];
end; if C <> nil then
end; begin
if C is TLabel then
AjustaLabel(TLabel(C))
else if C is TEdit then
AjustaEdit(TEdit(C))
Criando o método AjustaForm else if C is TSpeedButton
then
AjustaSpeedButton(TSpee
Este método é o mais importante, pois ele será a ponte entre este formu- dButton(C))
lário base de layout e todos os outros que precisarem usufruir de seus estilos else if C is TPanel then
padrões. Portanto deverá ser um método público, para que os demais formu- AjustaPanel(TPanel(C));
lários possam acessá-lo. O mecanismo funcionará de forma parecida com os end;
demais métodos, será passado como parâmetro um formulário do tipo TForm, end;
que primeiro irá verificar se as propriedades do formulário serão alteradas, end;
logo após será feito uma varredura pelos componentes do formulário passado
como parâmetro, e para cada tipo de componente será feito a chamada para
o seu respectivo método. Veja na listagem 7 a declaração na sessão public e
a codificação deste método. Vamos explicar o que ocorre no segundo trecho deste código, já que o
primeiro trecho vimos em outros métodos, neste segundo trecho faremos
um laço de repetição para varrer todos os componentes do parâmetro Frm,
e dentro adicionamos o componente do Frm à variável C do tipo TCompo-
Listagem 7 – Declaração e codificação do método AjustaForm
nent. Servirá para verificarmos se é do tipo de algum componente que tenha
método de configuração de estilo, como Tlabel, TEdit e os demais. Depois de
public garantirmos que se trata de um componente com um método definido, basta
{ Public declarations } fazermos a chamada do método.
procedure AjustaForm(Frm:
TForm); O conceito da prática é bem simples e seguindo a linha de raciocínio po-
demos criar métodos para inúmeros componentes do Delphi e parametrizar
procedure TfrmFormBaseLayout. várias de suas propriedades, basta depois adicionar a chamada do método
AjustaForm(Frm: TForm); nesta sequência de Ifs do método AjustaForm.
var
C: TComponent;
I: Integer; Ou seja, o que você poderá fazer utilizando esta técnica vai depender
begin de sua criatividade. Veja na figura 1 como ficou o nosso formulário base de
layout em tempo de projeto.
25
novembro
2013
Figura 1 – Ilustração do frmFormBaseLayout
Sobre o autor
Lucas Vieira de Oliveira
Consultor Técnico The Club.
suporte@theclub.com.br
Figura 2 – frmTeste em tempo de projeto
26 novembro
2013
SoapUI - Ferramenta para
Open Source para consumir
Web Services
N
este artigo irei abordar o uso desta ferramenta Open-Source Download
para utilização junto com Web Services. SoapUI é uma so-
lução gratuita e com uma interface gráfica muito intuitiva Para realização do download entre no site:
permitindo rapidamente consumir e testar Web Services.
Para fins de curiosidade, ela foi escrita em Java e é baseada www.soapui.org
em XML e HTTP, cuja principal função é disponibilizar serviços interativos na
WEB podendo ser acessados por qualquer outra aplicação, independente de Na região superior localize no Menu o descritivo “Downloads” e escolha
plataforma ou linguagem. Por exemplo, podemos criar um Web Service em “Download SoapUI” (No caso estamos trabalhando com a versão Freeware).
Delphi, .Net, Java ou até mesmo utilizar um serviço pronto na internet que Seremos redirecionados para próxima página que é onde finalizamos o processo
esta ferramenta nos proporcionará os testes com os resultados necessários clicando no botão “Download”. A versão que está disponível para este artigo
facilitando todo o processo de criação e depuração por meio de uma inter- até o momento é a versão “4.6.1” em um tamanho total de aproximadamente
face gráfica agradável e de fácil manuseio. A seguir podemos citar umas das 150mb. Ver Figura 01.
principais características.
Principais Características
Requisitos do Sistema
27
novembro
2013
A opção “Create Request”, que significa para criarmos solicitações, deverá
estar checada, pois deveremos criar solicitações para todas as operações deste
Web Service. Em “Create TestSuite” iria criar uma suíte de testes para o WSDL
importado, já o “Relative Paths” armazenaria todos os caminhos dos arquivos
relacionados ao projeto. Portanto deixaremos apenas a primeira opção sele-
cionada. Clique em Ok para darmos início ao exemplo.
Criando o Exemplo
Para inicializar deveremos clicar em “File/New SOAP Project” como pode
ser visto na Imagem 04. Em “Project Name” defina como “ConsultaCep” (Será
o nome do projeto em questão) e em “Initial WSDL” usaremos um Web Service
de consulta de ceps, o mesmo abordado em artigos anteriores. Veja abaixo
o endereço completo.
http://www.byjg.com.br/site/webservice.php/ws/cep?WSDL
Figura 04: Criando um novo Projeto. Figura 06: Solicitando o Web Service.
28 novembro
2013
Automaticamente a ferramenta irá gerar um XML, o mesmo sendo respon- Caso não ocorra nenhum erro, o resultado será outro XML idêntico ao
sável por invocar o método que desejamos, Veja a listagem 01. da listagem 02.
Listagem 01: Código XML para chamar o Método ObterLogradouro. Listagem 02: Código de retorno.
<cep
xsi:type=”xsd:string”>18730000</
cep> A figura 08 é a interface básica para testar o acesso o Web Service.
Test Case
29
novembro
2013
O SoapUI oferece cinco tipos diferentes de asserções (ou verificações)
para validar a resposta de uma requisição, sendo:
Conclusão
Muitas vezes nós programadores nos deparamos com situações que de-
vemos consumir um web Service que nunca vimos ou até mesmo em pouco
tempo hábil. Esta ferramenta se encaixa perfeitamente nestes casos, redu-
zindo e muito o tempo de testes para este serviço em questão. O propósito
deste artigo é de demonstrar um pouco das funcionalidades desta ferramenta
Figura 09: “Test Case”. gratuita. Explorei suas principais características a fim de proporcionar futuras
adequações conforme achem necessário.
Asserções
Um forte Abraço, até o mês que vem!
Basicamente, as asserções são validações que são feitas para confirmar
se a resposta de uma requisição contém as informações esperadas. Se as
asserções falharem, o “Test Step” e o “Test Case” indicarão um status de falha.
Podemos criar uma asserção por meio da janela “Test Step Editor”, poden-
do também definir asserções (ou verificações) que serão executadas contra a
resposta da requisição. Outra dica para adicionar uma asserção, seria clicando
com o botão direito do mouse na aba “Assertions” localizada na parte inferior
da janela “Test Step Editor”. Ver Figura 10.
Sobre o autor
Thiago Cavalheiro Montebugnoli
adora aprender novas tecnologias. Formado pela Faculdade de Tecnologia de Botucatu
– SP (FATEC), já desenvolveu softwares utilizando a plataforma .NET, Delphi junto com Banco
de Dados SQL Server e Firebird. Atualmente trabalha no Centro de Processamento de Dados da
Prefeitura Municipal de Itaí-SP é colunista mensal da Revista The Club Megazine e é consultor
Técnico do The Club. Possui as seguintes certificações: MCP - Microsoft Certified Professional,
MCTS - Microsoft Certified Technology Specialist, MCAD - Microsoft Certified Application Developer
e MCSD - Microsoft Certified Solution Developer.
30
novembro
2013
05
novembro
2013
novembro
2013