20

Olá Amigo leitor, · 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á

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Olá Amigo leitor, · 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á
Page 2: Olá Amigo leitor, · 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á

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

Page 3: Olá Amigo leitor, · 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á

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).

Page 4: Olá Amigo leitor, · 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á

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;

}

Page 5: Olá Amigo leitor, · 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á

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) {

Page 6: Olá Amigo leitor, · 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á

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();

Page 7: Olá Amigo leitor, · 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á

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.

Page 8: Olá Amigo leitor, · 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á

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

Page 9: Olá Amigo leitor, · 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á

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.

Page 10: Olá Amigo leitor, · 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á

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.

Page 11: Olá Amigo leitor, · 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á

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]

Page 12: Olá Amigo leitor, · 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á

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;

Page 13: Olá Amigo leitor, · 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á

{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;

{ … }

Page 14: Olá Amigo leitor, · 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á

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 { ------------------------------------------------------------------------------------------ }

Page 15: Olá Amigo leitor, · 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á

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]

Page 16: Olá Amigo leitor, · 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á

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.

Page 17: Olá Amigo leitor, · 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á

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

Page 18: Olá Amigo leitor, · 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á

Para incrementar ainda a caixa, podemos colocar imagens, usando o setIcon (Figura 4).

Page 19: Olá Amigo leitor, · 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á

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.

Page 20: Olá Amigo leitor, · 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á

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