Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
Olá Amigo leitor,
Nos dias de hoje, a formação e informação continuada é essencial no tão competitivo mercado de trabalho. Para
isto, nossa revista está sempre recheada de dicas e truques para ajudá-lo nesta correria do dia-a-dia.
Nosso colunista Luciano Pimenta trouxe dois artigos abordando dicas sobre o Android. O primeiro ele descreve
como devemos excluir itens junto com o ListView, dica muito útil para todo desenvolvedor. Já o segundo ele trata de
“Mensagens no Android”, apresentando classes prontas para esta tarefa. Nosso amigo colunista Hamden Vogel finaliza a
série de artigos “Manipulação de Arquivos parte 4 – Otimização em procura de Arquivos e Conteúdos”. Neste artigo ele
conclui com vários cenários de utilização de poderosas ferramentas que podem sempre ser estendidas por terceiros, a fim
de alavancar mais a produtividade do desenvolvedor em se tratando deste assunto. Eu preparei um artigo prático e
independente de plataforma de desenvolvimento, que explica a facilidade para programar um banner rotativo junto com
o uso do plugin “Cycle”.
Desejo a todos uma boa leitura,
Um abraço e até o mês que vem!
Marcos César Silva
Diretor Técnico
Editorial
Android: ListView
Excluindo itens de uma listagem
Sem dúvida alguma, o ListView é um dos controles mais usados do Android. Muito útil para exibir listagens de
dados, além de podermos customizar o mesmo com imagens e textos (já temos um artigo mostrando isso), o controle tem
muitas funcionalidades escondidas.
Você já deve ter acessado um aplicativo, onde para excluir um item, basta pressionar o mesmo e um menu de
contexto será exibido. Veremos nesse artigo, como criar essa funcionalidade.
Criando o projeto
Crie um novo projeto no Android Studio (criei um do tipo Blank Activity with Fragment). No arquivo de layout,
coloque um ListView:
<ListView
android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/listView"/>
No MainActivityFragment adicione o código da Listagem 1.
Listagem 1. Preenchendo o ListView private List<String> listaItens; private ArrayAdapter<String> adapter; ... @Override public View onCreateView(LayoutInflater inflater, ViewGroup
container, Bundle savedInstanceState) {
View rootview = inflater.inflate(R.layout.fragment_main, container, false);
ListView lista = (ListView)rootview.findViewById(R.id.listView); listaItens = new ArrayList<String>(); listaItens.add("Gol"); listaItens.add("Celta"); listaItens.add("Novo KA"); listaItens.add("Novo Uno"); listaItens.add("HB20"); listaItens.add("Palio"); listaItens.add("March"); listaItens.add("Onix"); listaItens.add("Stillo"); listaItens.add("Megane"); listaItens.add("Fiesta");
adapter = new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, listaItens);
lista.setAdapter(adapter);
registerForContextMenu(lista);
return rootview;
}
Note que criamos uma lista simples, mas podemos usar um banco de dados (SQLite) ou dados de um Web Service.
listItens e adapter estão declarados no escopo da classe como private. Execute a aplicação e visualize os dados na listagem
(Figura 1).
Figura 1. Dados sendo exibidos na ListView
Agora, para excluir o item, precisamos apenas "registrar" a lista para que apareça o menu de contexto. Voltando ao
código da Listagem 1, adicione o seguinte código, antes do return.
registerForContextMenu(lista);
Agora, precisamos criar o menu de contexto para exibir quantos itens precisarmos (nesse caso, teremos apenas o
Excluir). Use o seguinte código:
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo
menuInfo) {
if (v.getId() == R.id.listView) {
menu.add("Excluir");
} }
Verificamos se o controle de tela é o listView e criamos um item de menu com o texto Excluir. Agora, precisamos
codificar para remover o item da listagem. Veja o código na Listagem 2.
Listagem 2. Código para excluir item da listagem
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo info =
(AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
switch (item.getItemId()) {
case 0:
listaItens.remove(info.position); adapter.notifyDataSetChanged();
}
return true;
}
No código, verificamos qual item do menu de contexto foi "clicado", usando um switch. No case, removemos o item
da lista que criamos (listItens), passando como parâmetro a posição, retornado pela var info. Após, chamamos o notifyDataSetChanged para que o adapter atualize o ListView. Execute a aplicação, escolha um
item e segure. Veja como na Figura 2, que um menu será exibido.
Figura 2. Menu de contexto para exclusão
Selecione o Excluir e a lista será modificada, removendo o item escolhido.
Removendo vários itens Temos duas maneiras de remover vários itens da lista. No primeiro exemplo, vamos colocar deixar nossa lista com
um caixa de seleção. Altere no onCreateView para que o ListView seja de múltipla seleção, com o seguinte código:
adapter = new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_multiple_choice, listaItens);
... lista.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
Modificamos o layout do ListView e indicamos o tipo de escolha. Execute e veja que nossa lista mudou (Figura 3).
Figura 2. Lista com múltipla escolha
Para sabermos os itens selecionados, precisamos codificar. Adicione um botão abaixo do ListView e no Click, vamos
usar o código da Listagem 3.
Listagem 3. Excluindo os itens selecionados na lista
Button btnExcluir = (Button)rootview.findViewById(R.id.button);
btnExcluir.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
List<String> aux = new ArrayList<String>();
aux.addAll(listaItens);
SparseBooleanArray checked = lista.getCheckedItemPositions();
for (int i = 0; i < checked.size(); i++) {
if (checked.valueAt(i)) {
String item = listaItens.get(checked.keyAt(i));
int pos = aux.indexOf(item);
if (pos != -1) {
lista.setItemChecked(checked.keyAt(i), false); aux.remove(pos);
} }
}
listaItens.clear();
listaItens.addAll(aux); adapter.notifyDataSetChanged();
} });
O código é um pouco mais extenso. Primeiro, precisamos de uma lista auxiliar, para ajudar na exclusão dos itens.
Quando excluímos um item de uma lista, ela é refeita, como estamos trabalhando com posicionamento do item na lista,
perdemos a referência.
No código, o método getCheckedItemPositions retorna um array com a posição dos itens selecionados. Percorremos
esse array, e pesquisamos na lista principal, pelo texto do item. Com o texto, pesquisamos a posição do mesmo na lista
auxiliar. Assim, podemos excluir os itens na lista auxiliar, e por fim, atribuímos essa lista para a lista principal.
Execute a aplicação e faça o teste.
Botão de excluir na ActionBar Outro exemplo para múltiplas exclusão, é mostrar um botão de excluir na ActionBar quando o usuário seleciona
mais de um item. Vamos ao exemplo. Crie um novo layout com um ListView ou volte ao primeiro exemplo que fizemos.
O código da Listagem 4 mostra a codificação para o exemplo.
Listagem 4. Excluir itens com botão na ActionBar
private SparseBooleanArray mSelectedItemsIds;
... lista.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
lista.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
@Override
public void onItemCheckedStateChanged(ActionMode mode, int position, long id,
boolean checked) {
final int checkedCount = lista.getCheckedItemCount();
mode.setTitle(checkedCount + " selecionados");
if (checked)
mSelectedItemsIds.put(position, checked);
else mSelectedItemsIds.delete(position);
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu)
{ mode.getMenuInflater().inflate(R.menu.menu_main, menu);
mSelectedItemsIds = new SparseBooleanArray();
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu)
{ return false; }
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
switch (item.getItemId()) {
case R.id.delete:
List<String> aux = new ArrayList<String>();
aux.addAll(listaItens);
SparseBooleanArray selected = mSelectedItemsIds;
for (int i = 0; i < mSelectedItemsIds.size(); i++)
{ if (selected.valueAt(i)) {
String itemSelecionado = listaItens.get(selected.keyAt(i)); int
pos = aux.indexOf(itemSelecionado);
if (pos != -1) {
aux.remove(pos);
} }
}
listaItens.clear();
listaItens.addAll(aux); adapter.notifyDataSetChanged();
mode.finish();
return true;
default:
return false;
} }
@Override
public void onDestroyActionMode(ActionMode mode)
{ adapter.notifyDataSetChanged(); }
});
Primeiro, precisamos mudar o setChoiceMode da lista. Comentamos também o registro para o menu de contexto. O
MultiChoiceModeListener, possui alguns métodos. O onItemCheckedStateChanged é chamado quando pressionamos o item
da lista, assim podemos contar quantos itens foram selecionados e atribuir para uma variável auxiliar, a posição do item
selecionado. O onCreateActionMode carrega o menu na ActionBar. No exemplo será mostrado um botão com o ícone de uma
lixeira. O mais importante é o onActionItemClicked executado quando clicamos no botão da ActionBar. Aqui, usamos
praticamente o mesmo método do exemplo anterior para excluir os itens da lista. No final do código, temos um finish que irá indicar que finalizamos, assim, é chamado o onDestriyActionMode para
atualizar o lista com o notifyDataSetChanged. Complexo, mas fácil de entender.
Execute o código e veja que ao selecionar um item (pressione por um período maior do que o normal), aparece o
botão na ActionBar e quantos itens estão selecionados. Caso selecionarmos o mesmo item, esse será desmarcado. Fica como melhoria, a mudança da cor do item para que o usuário visualize com clareza quais estão selecionados. Dica:
use um Adapter customizado. Veja na Figura 3 o exemplo em execução.
Figura 3. Itens selecionados na lista
Agora basta clicar no botão da ActionBar para que os itens sejam excluídos.
Conclusão
Vimos nesse artigo, como trabalhar excluir itens de uma lista de várias maneiras. Conhecemos truques e dicas
interessantes nos exemplos mostrados.
Um grande abraço a todos e sucesso em seus projetos.
DVD de treinamento em Visual Web Developer: www.lucianopimenta.com/post.aspx?id=166.
Curso de Windows Forms: www.lucianopimenta.com/post.aspx?id=167.
GooglePlay: https://play.google.com/store/apps/details?id=com.app.googlem
Sobre o Autor
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. Aventurando-se no mundo Mobile com Android. É MVP Embarcadero, grupo de profissionais que ajudam a divulgar o Delphi no mundo. Atualmente é desenvolvedor da LabTrans em Florianópolis-SC. Autor de mais de 100 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.
E-mail: www.lucianopimenta.com
JQuery 2.x – Trabalhando com o plugin Cycle
Olá amigos do The Club, Depois de aprendermos algumas das principais funcionalidades do jQuery, este mês preparei um artigo mais prático e independentemente de plataforma de desenvolvime
Iremos ver a facilidade de desenvolver um exemplo de banner rotativo, um recurso muito utilizado em todas as páginas web. Faremos o uso do plugin “Cycle”.
O que seria um plugin?
Podemos definir “plugins” como utilidades que o jQuery põe à disposição dos desenvolvedores para ampliar as funcionalidades do framework. No geral, servirão para complexas
necessárias para resolver necessidades específicas, mas as fazem de maneira que possam ser utilizadas no futuro em qualquer parte e por qualquer web. Seria u acrescenta ao objeto
jQuery para que a partir desse momento responda a novos métodos. Neste caso, o plugin “Cycle” se encarregará de criar diversos efeitos em um consjunto de i exemplo: efeitos de
Zoom, esmaecimento, deslizamento, entre outros.
Download e Instalação
Para obter este plugin acesse a seguinte página do desenvolvedor para realizar o download gratuito, Ver Imagem 01.
http://malsup.com/jquery/cycle/
Figura 01: Site do Desenvolvedor.
No site possuímos diversas dicas e exemplos referentes ao mesmo. Na região superior esquerda podemos encontrar o link que irá nos redirecionar para a página de Downlo
Teremos duas opções, sendo:
Cycle: Contendo todos os recursos deste plugin.
Cycle Lite: Apenas com algumas opções.
Escolha a segunda opção clicando com o botão direito escolhendo “Salvar Link Como...”. Ver Imagem 02.
Figura 02: Realizando o Download do Plugin.
Criando o projeto de Exemplo
O exemplo se baseará na criação de uma página HTML com a funcionalidade do Plugin Cycle. Iremos nos organizar da seguinte maneira. Crie uma pasta, por exemplo
“Exemplo_Plugin_Cycle” contendo mais duas subpastas e o arquivo de exemplo: Imagens: Irá conter todas as imagens do projeto de exemplo. Jquery: Teremos o plugin jQuery (abordado nos artigos anteriores) e o Cycle. Ambos com extensão ”.js”. Ver Imagem 03.
Figura 03: Arquivos.
Utilizaremos qualquer editor de texto para esta tarefa, recomendo o uso do Notepad++, o mesmo poderá ser encontrado gratuitamente no site abaixo:
https://notepad-plus-plus.org/download/v6.8.2.html
Com o editor de texto aberto iremos criar uma página HTML simples contendo suas TAGS padrões. Ver Código abaixo:
<html> <head>
<title> jQuery 2.x com o plugin Cycle</title>
<script type="text/javascript" src="jquery/jquery-2.1.4.min.js"></script>
<script type="text/javascript" src="jquery/jquery.cycle.lite.js"></script>
Teremos a declaração do jQuery e do plugin Cycle.
<script type="text/javascript">
$(this.document).ready(function () { $('.slideshow').cycle({
fx: 'fade' });
}); </script>
Na TAG Head Implementaremos um script contendo uma função que utiliza a DIV “slideShow” e em seguida invocando a função “cycle”. Passamos por parâmetro a pr Através
deste parâmetro as nossas imagens nos darão a impressão de uma apresentação de Slides.
</head> <body>
<div class="slideShow"> <img src="imagens/img01.jpg" alt="Primeira Foto" width="300" height="200" />
<img src="imagens/img02.jpg" alt="Segunda Foto" width="300" height="200" />
<img src="imagens/img03.jpg" alt="Terceira Foto" width="300" height="200" />
<img src="imagens/img04.jpg" alt="Quarta Foto" width="300" height="200" /> </div>
</body> </html>
Na TAG Body iremos inserir o caminho das Imagens do projeto. Teremos um resultado identico ao da Figura 04.
Figura 04:Apresentação de Slides.
Principais Comandos
Os principais comandos deste plugin são: - pause: Faz uma pausa no slideshow , podendo ser retomado com o comando 'resume'.
- resume: Retoma uma apresentação de slides em pausa,
- toggle: Alterna o estado de pausa / resume do slideshow.
- next: Avança slideshow para o próximo slide.
- prev: Avança slideshow para slide anterior.
- stop: Para o slideshow.
- destroy: Para os slides e libera todos os eventos.
Exemplo:
$('#slideshow').cycle('pause');
Principais Parâmetros
Teremos alguns parâmetros principais quando utilizamos este Plugin, sendo: - activePagerClass : ' ActiveSlide ': Nome da classe usado para o elemento ativo.
- allowPagerClickBubble : false: Permite ou impede de eventos clique sobre os links.
- animIn: null: Propriedades que definem a animação do slide.
- autostop: 0: Para acabar slideshow após transições X (onde X significa contagem de slides).
- autostopCount : 0: Número de transições ( opcionalmente utilizadas com autostop para definir X)
- cssAfter : null: Propriedade que define o estado do slide após a transição para fora.
- cssBefore : null: Propriedade que define o estado inicial do slide antes da transição.
- delay : 0: Atraso adicional (em ms) para a primeira transição (dica: pode ser negativo )
- fastOnEvent : 0: Forçar transições rápidas quando acionado manualmente.
- fx : 'Fade ': Nome do efeito de transição (ou nomes separados por vírgulas , ex : " fade, scrollUp , Shuffle ' )
Exemplo de utilização:
$('#shuffle').cycle({ fx: 'shuffle', easing: 'easeOutBack', delay: -4000
});
Conclusões
Abordamos neste artigo o Plugin “Cycle”, o mesmo sendo responsável por implementar diversas facilidades para trabalharmos com Apresentação de Imagens (Banners rot
servirão de base para qualquer plataforma Web. Fica aí a dica, um abraço e até o mês que vem!
Referências
http://malsup.com/jquery/cycle/
Sobre o Autor
Thiago Cavalheiro Montebugnoli adora aprender novas tecnologias. Formado pela Faculdade de Tecnologia de Botucatu – SP (FATEC), já
softwares utilizando a plataforma .NET, Delphi junto com Banco de Dados SQL Server e Firebird. Como experiências profissionais mais recentes,
currículo sua atuação no Centro de Processamento de Dados da Prefeitura Municipal de Itaí-SP e atualmente compõe a equipe da Coordenadoria
Informação no IFSP – Instituto Federal do Estado de São Paulo em Avaré. Além disso, é colunista mensal da Revista The Club Megazine e é con
do The Club. Possui as seguintes certificações: MCP - Microsoft Certified Professional, MCTS - Microsoft Certified Technology Specialist, MCA
Certified Application Developer e MCSD - Microsoft Certified Solution Developer.
E-mail: [email protected]
Manipulação de arquivos: Otimizações em Procura de
Arquivos e Conteúdos - Parte 4
Aproveitando, podemos também ter mais duas opções disponíveis neste aplicativo; são dois recursos embutidos de terceiros (open-source)
que estão nos buttons “arqdiv” e “exclusão” – o primeiro é uma funcionalidade para divisão e junção personalizada de arquivos em um diretório,
onde se tem vários tipos de parâmetro de entrada para personalização bem refinada da divisão e extração dos mesmos – imagine dividir em vários
tamanhos uniformemente iguais um dado arquivo de 5GB a fim de se transmitir periodicamente seus fragmentos e depois poder unir ele
novamente, juntando todas as suas partes anteriormente divididas – muito útil para um procedimento de envio a uma mídia portátil, anexo de email
ou em uma rede, por exemplo.
Figura 13 – Aplicativo “arqdiv” para divisão e união personalizada de arquivos.
procedure TFArqDiv.CopiarDePara(De, Para:TStream; NBytes:integer; Dividir: boolean; AInfo: TArqInfo; PBar:TProgressBar); const MaxBufSize = $F000;
var BufSize, I, SizeGravado, SizeTotal: Integer; Buffer: PChar;
begin if NBytes > MaxBufSize then BufSize := MaxBufSize else BufSize := NBytes; GetMem(Buffer, BufSize); try while NBytes <> 0 do begin
if NBytes > BufSize then I := BufSize else I := NBytes; De.ReadBuffer(Buffer^, I); Para.WriteBuffer(Buffer^, I);
if dividir then begin
SizeGravado:=de.position; SizeTotal:=de.Size; { ... }
{função que retorna o número de partes que o arquivo será
dividido de acordo com as opções escolhidas} function TFArqDiv.NArq(TamTotal, TamPartes:integer;ArqInfo:
TArqInfo):integer; begin result:=0;
if TamPartes=0 then begin result:=NPartes; exit;
end; if TamTotal <= TamPartes-SizeOf(ArqInfo) then
result:=1; if TamTotal > TamPartes-SizeOf(ArqInfo)
then begin result:=TamTotal div (TamPartes-SizeOf(ArqInfo)); if result >= 1 then begin if (TamTotal mod (TamPartes-SizeOf(ArqInfo))) <> 0 then
inc(result); end; end; end;
{procedimento de divisão de arquivo} procedure TFArqDiv.Dividir(filename, finalname:string; TamPartes: integer; Autoexe:
boolean); var Arq, fArq: TFileStream; AutoExeBin: TResourceStream; AutoExeInfo: TAutoExeInfo; N, T, AutoExeSize: integer; Filename2: String; label labelsai;
begin try Arq:= TFileStream.Create(filename, fmOpenRead or
fmShareDenyWrite); except Arq.Free; Application.MessageBox(PChar(format(EAbrir,[Filename])),ETitle,MB_OK+MB_ICONERROR);
Exit; end; if AutoExe then begin AutoExeBin:= TResourceStream.Create(hinstance,'AUTOEXEBIN',RT_RCDATA); AutoExeSize:=AutoExeBin.Size; AutoExebin.Free;
end else begin AutoExeSize:=0;
end; if TamPartes=0 then begin T:=NPartes; TamPartes:=(AutoExeSize+Arq.Size+(SizeOf(ArqInfo)*T)) div T;
end else begin
T:=NArq(AutoExeSize+Arq.Size,TamPartes,ArqInfo); end; if autoexe and (TamPartes<(AutoExeSize+SizeOf(ArqInfo)+10))
then begin Application.MessageBox(PChar(format(EMinTamPartesAutoExe,
[floattostrf((AutoExeSize+SizeOf(ArqInfo)+10) / 1024 /
1024,ffNumber,7,3)])),ETitle,MB_OK+MB_ICONERROR); goto labelsai; end; { ... }
{transfoma o valor em Mb(float: 0,0) para Byte(inteiro)} function TFArqDiv.MbToByte(Mb: single):integer; var bytei:single; begin bytei:=Mb*1024*1024; result:=round(bytei); end;
{quando chamado, atualiza as informações gerais}
procedure TFArqDiv.SetNpartes; begin label8.Caption:=floattostrf(TamTotalArq / 1024 / 1024,ffNumber,7,3)+'
Mb'; if op1.Checked then begin
NPartes:=strtoint(narq1.text); Label10.Caption:=inttostr(narq(TamTotalArq,0,ArqInfo));
end; if op2.Checked then begin
if tamarq.text<>'' then Label10.Caption:=inttostr(narq(TamTotalArq,mbtobyte(strtofloat(tamarq.text)),ArqInfo));
end; end;
procedure TFArqDiv.Unir(ArqInicial, DirDest:String); var
Arq, fArq: TFileStream; N, ID, i: integer; R: boolean; NomeArqFinal, Data: String; label reinicia, sair;
begin btUnirCancel.Enabled:=true; Arq:=TFileStream.Create(ArqInicial,fmOpenRead or fmShareDenyWrite); Arq.ReadBuffer(ArqInfo,SizeOf(ArqInfo)); Arq.Free; if ArqInfo.Prog<>AppName then begin Application.MessageBox(ENoArqDiv,ETitle,MB_OK+MB_ICONERROR); exit; end;
{ … }
end; CreateDir(DirDest+AppName+'_'+NomeArqFinal+inttostr(i)); NomeArqFinal:=DirDest+AppName+'_'+NomeArqFinal+inttostr(i)+'\'+NomeArqFinal; // fArq:=TFileStream.Create(NomeArqFinal,fmCreate); { … }
Arq:=TFileStream.Create(ArqInicial,fmOpenRead or
fmShareDenyWrite); Arq.ReadBuffer(ArqInfo,Sizeof(ArqInfo)); //
if ArqInfo.Prog<>AppName then begin Arq.Free;
if Application.MessageBox(ENoArqDiv,ETitle,MB_OKCANCEL+MB_ICONERROR)=IDOK
then begin Opendialog1.Execute; ArqInicial:=Opendialog1.FileName; goto reinicia;
end else
{ ... }
Figura 14 – Aplicativo “exclusão automática” para excluir todos os arquivos de determinadas pastas que possuem as extensões desejadas para sua remoção
Figura 15 – Aplicativo “exclusão automática” com os parâmetros de entrada preenchidos, pronto para iniciar o processo de exclusão automát ica de arquivos selecionados.
A segunda funcionalidade é o recurso de exclusão automática de arquivos, onde pode customizar os diretórios e os tipos de arquivos destes
diretórios selecionados que serão os arquivos a serem eliminados, de uma forma automática e facilmente configurável para personalização destes
parâmetros de entrada, possibilitando que estes tipos possam ser salvos externamente em um txt para que o usuário não precise sempre ficar
especificando os tipos desejados toda vez que desejar acessar esta funcionalidade. É uma função muito útil principalmente para remover arquivos
temporários, arquivos objeto de compilação, e demais arquivos não necessários que foram linkados em uma build e agora não precisam “subir” para
o ambiente de produção.
{ ------------------------------------------------------------------------------------------ }
{ PROCEDURE.: ExcluiArquivos { FINALIDADE: INICIA A EXCLUSÃO DE ARQUIVOS { ------------------------------------------------------------------------------------------ }
procedure TFor_sys.ExcluiArquivos; var k,j,i: integer; begin
Lst _fold.ItemIndex := 0; { VARRE A LISTA DE DIRETÓRIOS... } for j := 0 to Lst_fold.Items.Count - 1 do
begin { Flb_ file -> É UM COMPONENTE TFileListBox QUE É APONTADO PARA O DIREÓRIO QUE ESTÁ SENDO LIDO
DA LISTA DIRETÓRIOS... } Flb_file.Directory := Lst_fold.Items.Strings[j];
{ A CADA DIRETÓRIO SERÃO LIDAS, UMA A UMA, AS MÁSCARAS DE ARQUIVOS...
} for k := 0 to Mem_type.Lines.Count + 1 do begin
{ DEPOIS DE POSICIONAR NO DIRETÓRIO-ALVO, FILTRA SOMENTE
OS ARQUIVOS QUE SERÃO APAGADOS ATRAVÉS DA PROPRIEDADE MASK DO TFileListBox... }
Flb_file.Mask := Mem_type.Lines.Strings[k];
{ SÃO APAGADOS OS ARQUIVOS UM A UM... }
for i := 0 to Flb_file.Items.Count - 1 do
DeleteFile(Pchar(Flb_file.Items.Strings[i])); end;
end; end;
{ ------------------------------------------------------------------------------------------ }
{ PROCEDURE.: IconTray { FINALIDADE: POSICIONA O MENU RETRÁTIL EM CIMA DO ÍCONE NA BANDEJA { ------------------------------------------------------------------------------------------ } procedure TFor_sys.IconTray (var Msg: TMessage); var Pt: TPoint;
begin if Msg.lParam = wm_rbuttondown then
begin GetCursorPos (Pt); Pop_retratil.Popup (Pt.x, Pt.y);
end; end;
Conclusão
Vimos muitas implementações de procura de arquivos, como utilização de mapas de caracteres e ponteiros para agilizar a procura de strings
em arquivos, bem como uma função alternativa e otimizada para contagem de palavras para arquivos de qualquer tamanho. Também vimos a
procura parcial e completa por cada palavra, procura multi-thread por arquivos e conteúdos e procura de arquivos encapsuladas em um objeto
descendente de um TDataSet customizável, contendo funcionalidades para alterar o nome e a data de criação dos arquivos diretamente em
componentes data-aware bem como seu conteúdo, caracterizando um alto grau de dinamismo operacional e eficiência em suas operações, tudo
centralizado em uma mesma funcionalidade gerenciado por este objeto herdeiro de TDataSet em particular, satisfazendo as chamadas de retorno da
classe TSearchRec de uma forma simples e elegante, filtrando todos os arquivos texto dos diretórios selecionados de uma forma transparente para o
usuário comum. Desta forma fica muito mais viável e transparente para esta implementação, visto que as principais tarefas (“o grosso”) está
totalmente construído para este propósito de procura de arquivos. Também exibimos o componente TFindFile e o programa de backup personalizado com mais duas funcionalidades embutidas em ação, para
divisão de arquivos e exclusão automática – possibilitando várias hipóteses de manipulação de arquivos a serem empregadas em qualquer
funcionalidade no mundo real, por ser simples e fácil de se utilizar e testar. Com isso, trouxe vários cenários de utilização destas poderosas ferramentas que podem sempre ser estendidas por terceiros, a fim de alavancar mais
a produtividade do desenvolvedor por não ter nunca mais que “reinventar a roda” por ter que lidar com componentes de procura e manipulação de arquivos,
especialmente por procura de conteúdos, onde a funcionalidade multi-thread por pesquisa deles se torna muito rápida e significativa aliando ao emprego de
mapas de caracteres para sua utilização juntamente com objetos do tipo TFileStream. Bons estudos e até a próxima!
Sobre o Autor
Hamden Vogel
Consultor Técnico The Club
E-mail: [email protected]
Mensagens no Android
Em todo sistema informatizado, temos mensagens de retorno ao usuário, solicitando uma confirmação, mostrando
um aviso, um erro etc. No Android, temos classes prontas que nos auxiliam nessa tarefa, vamos conhecê-las.
Toast
Talvez a maneira mais simples de retornar ao usuário uma informação, é com o Toast. Em apenas uma linha de
código, podemos mostrar um mensagem na tela (um popup). Não use a mesma para mensagens que depende do retorno
do usuário (uma confirmação de exclusão, por exemplo), ou que necessite da atenção do usuário, o Toast fica apenas alguns
segundos na tela e some.
No código a seguir, temos a implementação do Toast:
Toast.makeText(contexto, Texto a ser mostrado, duração do popup).show();
Bem simples. Crie uma nova aplicação Android no Android Studio para entermos as mensagens no Android.
Adicione um botão e no Click do botão, adicione o seguinte código:
Toast.makeText(MainActivity.this, "Criando um Toast!!!!!", Toast.LENGTH_SHORT).show();
Rode a aplicação, clique no botão e veja o Toast em tela (Figura 1).
Caixas de mensagens
Figura 1. Exibindo um popup
Agora, se precisarmos melhorar nossa mensagem, teremos que usar outra classe, onde a mensagem ficará “parada”,
esperando uma ação do usuário. Usaremos a classe AlertDialog. Veja no código a seguir, como exibir uma mensagem:
new AlertDialog.Builder(MainActivity.this)
.setTitle("Título da mensagem")
.setMessage("Mensagem....")
.show();
Muito fácil de usar. Veja na Figura 2 a mensagem na aplicação.
Figura 2. Mensagem no Android
Nota: Para cada exemplo, estamos usando um botão, portanto, basta adicionar um botão e codificá-lo com o
exemplo mostrado.
Mas a classe AlertDailog tem mais opções. Se quisermos uma caixa de confirmação, para um exclusão de registro,
por exemplo. Basta mudar o código do exemplo anterior:
new AlertDialog.Builder(MainActivity.this)
.setTitle("Excluir")
.setMessage("Deseja excluir o registro?")
.setPositiveButton(R.string.sim, new DialogInterface.OnClickListener()
{ public void onClick(DialogInterface dialog, int which) { //excluir o registro
} }) .setNegativeButton(R.string.nao, new DialogInterface.OnClickListener()
{ public void onClick(DialogInterface dialog, int which) { //não exclui, apenas fecha a mensagem dialog.dismiss();
} }) .show();
Temos o setPositiveButton e setNegativeButton. O primeiro parâmetro é o texto apresentado e o seguinte é o evento
Click.
Criei o resource para Sim e Não. No setPositiveButton implementamos o código necessário para quando o usuário
escolher Sim.
Logicamente, o setNegativeButton é para o Não. Nesse caso, vamos apenas fechar o dialogo, usando o dismiss. Veja
na Figura 3, a caixa de confirmação para a exclusãod e registro.
Figura 3. Confirmação no Android
Nota: pesquise sobre DialogFragment, uma evolução para Dialog no Android. As duas maneiras são corretas, apenas
para que você fique atualizado sobre o assunto
Para incrementar ainda a caixa, podemos colocar imagens, usando o setIcon (Figura 4).
Customizando mensagens
Figura 4. Icone na mensagem
E se precisarmos colocar um layout em uma caixa de mensagem. Por exemplo, criar um “popup” com uma listagem,
é possível? Sim, é possível. Nesse caso, usaremos outra classe, a Dialog. No método setContent, podemos carregar um layout,
assim, trabalhamos com caixas de mensagens customizadas.
Vamos ao exemplo. Criei um layout onde tem um ListView:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/listView" />
</LinearLayout>
O código para mostra a caixa de mensagens com a listagem, é esse:
Dialog dialog = new Dialog(MainActivity.this);
dialog.setContentView(R.layout.listagem); dialog.setTitle(getString(R.string.titulo));
//carrega o ListView
ListView lista = (ListView)dialog.findViewById(R.id.listView); String[] itens = new String[]{"Item 1", "Item 2", "Item 3", "Item 4", "Item 5"};
lista.setAdapter(new ArrayAdapter<String>(MainActivity.this,
android.R.layout.simple_list_item_1, itens));
dialog.show();
Simples, e semelhante aos exemplos anteriores. Diferença que usamos a classe Dialog e no setContent, carregamos o
layout da listagem. Após, carregamos os itens da listagem (código muito conhecido).
Por fim, basta chamar o show. Após carregar os controles, trabalhamos normalmente com eles. Na Figura 5 temos
nossa aplicação mostrando a listagem em uma caixa de dialogo.
Conclusão
Figura 5. Carregando o layout de uma listagem em um dialogo
Vimos nesse artigo, como é simples usar as classes do Android para mostrar caixas de mensagens, caixas de
confirmação e popup. Essas funcionalidades são importantes em qualquer aplicação e não seria diferente no Android.
Um grande abraço a todos e sucesso em seus projetos.
DVD de treinamento em Visual Web Developer: www.lucianopimenta.com/post.aspx?id=166.
Curso de Windows Forms: www.lucianopimenta.com/post.aspx?id=167.
GooglePlay: https://play.google.com/store/apps/details?id=com.app.googlem
Sobre o Autor
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. Aventurando-se no mundo Mobile com Android. É MVP Embarcadero, grupo de profissionais que ajudam a divulgar o Delphi no mundo. Atualmente é desenvolvedor da LabTrans em Florianópolis-SC. Autor de mais de 100 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.
E-mail: www.lucianopimenta.com