sábado, outubro 10, 2009

A desgraça cubana pelos cubanos.

yoani-sanchez

   A moça aí ao lado é Yoani Sanchez. Pois esta dona é cubana, nasceu, cresceu, foi educada, casou e (ainda) vive em Cuba, aquela ilhota dos irmãos Castro no Caribe.

   Para aqueles que ainda acham que a ilha dos Castro pode servir de bom exemplo para alguma coisa (acredite, tem gente que ainda acha isso), a moça dá um relato realista da situação por lá, sem as maquiagens e ideologias dos pseudo-intelectuais que acham que aquilo lá é uma maravilha (mas não estão dispostos a se mudar para lá e nos poupar de suas chatices né?), a entrevista dela nas páginas amarelas da Veja é um relato realista das precárias condições da ilha.

     Pois a dona aí recebeu vário prêmios por conta do seu blog que relata o dia-a-dia de Cuba, só que não pode recebe-los, pois sair da ilha nem pensar né?

   Mas para o Brasil ela pode vir, o Coma Andante da ilha pode ficar tranquilo, pois aqui temos alguns canalhas no poder que se encarregam de, covardemente, repatriar qualquer servo dos Castro que ouse tentar se livrar do jugo, como fez o Tarso Genro no caso dos Boxeadores Cubanos, de forma abjeta e vil.

   E, se você acha que não existem mais idiotas no mundo que acreditem que Cuba e Coréia do Norte (sim, aquela mesma do baixinho amalucado com cabelo punk) sejam paraísos na terra, você não conhece o povinho deste site aqui.

   Eu acho que esse povo que acha Cuba uma maravilha deveria se perguntar porque o povo quer fugir desesperado do paraíso, arriscando até virar comida de tubarão na travessia do golfo do México, seria por masoquismo???

terça-feira, agosto 25, 2009

DbTreeView no Delphi - JvDbTreeView

Bom, depois de apanhar um pouco para conseguir colocar para funcionar, aqui vai a dica de como fazer um plano de contas ser mostrado numa TreeView, no caso vamos usar a jvDbTreeView que é uma TreeView dbaware no Delphi.

Como vamos usar o componente na JVCL, aqui vai o link para baixar http://sourceforge.net/projects/jvcl/, é um excelente pacote de componentes, praticamente tudo que você precisar, acaba descobrindo que tem lá.

Criei a minha tabela no Firebird, a estrutura abaixo:

Campo Tipo Descrição
Cta_ID integer Numero da conta
Cta_Master integer Conta “pai”
Cta_Descricao Varchar(30) Nome da conta

Coloque um componente JvDbTreeView no formulário, conecte-o via a propriedade DataSource à tabela do banco de dados.

Ajuste as suas propriedades do JvDbTreeView como abaixo:
Obs.: No meu caso o dataSource chama-se dsPlanContas.

Propriedade Valor
DataSource dsPlanContas
DetailField Cta_Master
ItemField Cta_Descricao
MasterField Cta_ID

   Pronto, já está OK e pronto para funcionar.

A explicação das propriedades é a seguinte:
DataSource: Obviamente é a conexão à base de dados;

DetailField: É o campo que contém o valor que aponta para a conta pai.

ItemField: é o texto que vai aparecer na TreeView.

MasterField: é a chave única da tabela.

       Quem reescreveu o componente deve ter problemas sérios para atribuir nomes às propriedades, custei para conseguir entender, mas aí está o mapa da mina.

Abaixo um exemplo do que está no banco de dados:

Cta_Id Cta_Master Cta_Descricao
1 0 DESPESAS
2 1 DESPESAS FIXAS
3 2 PESSOAL
4 11 ALUGUEL
5 11 CONDOMINIO
6 0 RECEITAS
7 6 RECEITAS DIRETAS
8 3 CLT
9 3 FREES
10 2 CUSTOS DIRETOS
11 10 IMÓVEIS
12 1 DESPESAS VARIAVEIS
13 12 COMBUSTIVEIS
14 12 COMISSÕES
15 12 MATERIAL DE EXPEDIENTE
16 12 MANUTENÇÕES
17 12 EXAMES MÉDICOS

sábado, agosto 22, 2009

A volta da proposta de regulamentar a profissão no mercado de informática.

Bom, eu já escrevi diversas vezes, em newsgroups e fóruns sobre este tema, infelizmente nunca no blog. Vou sanar agora esta falha, para que o texto pelo menos fique registrado, e eu possa depois mencionar sem precisar reescrever tudo.

Em primeiro lugar, convém esclarecer que, caso seja aprovada a regulamentação da profissão, eu estaria dentro dessa reserva de mercado, portanto a minha posição nada tem de inveja (como alguns mais exaltados defensores dessa sandice propalam) ou outro sentimento, digamos… “menos nobre”.

Mas sou RADICALMENTE CONTRA a regulamentação da profissão de analista de sistemas, como também de outras como leiloeiro oficial (sim também querem regulamentar), flanelinha (acreditem, é verdade, veja aqui), capoeirista (duvida? então veja…), corretor de imóvel, contador, e várias outras.

Mas a discussão aqui é sobre analista de sistemas, aliás o próprio termo já é um tanto antigo e esta praticamente caindo em desuso, até porque as competências para construir um software como produto vão bem além disto.

Sou contra por várias causas, algumas:

- Regulamentação não é garantia de competência, o mercado já se encarrega de separar o joio do trigo, hoje vale muito mais uma certificação do que a regulamentação. Os defensores argumentam que software lida também com vidas humanas, como software de aviônicos, equipamentos hospitalares, usinas nucleares, etc.

   Oras, alguém pensa seriamente que a regulamentação fará alguma diferença nisso? Nenhuma empresa contrata um programador ou analista de sistemas para fazer software para incubadoras neo-natal por exemplo, isso é desenvolvido por empresas estabelecidas, com certificações CMM, ISO e por aí afora vai, o software tem que ser homologado e certificado, não interessa se o analista é diplomado ou não, o mesmo para softwares de avionica, para usinas e por aí afora vai.

   Pensam muitos que é necessário para frear a competição desmedida, que avilta os ganhos dos profissionais. Eu tenho a minha empresa de software, a competição no mercado é tanto com outras empresas quanto com profissionais independentes, eu não baixo o meu preço aquém do que considero justo e que minha planilha de custos mostra ser o razoável, e tem concorrentes no mercado cobrando 5% do meu preço final. Há mercado para eles e há mercado para a minha empresa também, tudo depende do cliente, e não será uma regulamentação que irá banir os camelôs de sistemas do mercado. Isso é competição, é concorrência, é saudável e bem vinda, graças à esta competição a qualidade aumentou (pelo menos a minha).

   Regulamentação é apenas reserva de mercado, e quem se beneficia disso, historicamente comprovado, são os incompetentes, vide a famigerada, nefasta e de triste lembrança, reserva de mercado de informática. Os bons profissionais, diplomados ou não, tem espaço no mercado, são disputados por empresas e pelo mercado. Apenas as empresas de fundo de quintal, ou a quitanda da esquina, e mesmo assim olhe lá, é que vão contratar o sobrinho do amigo do cunhado para fazer um programinha para controlar o estoque, esta é uma fase já passada, a realidade é outra.

    Hoje temos inclusive carência de bons profissionais no mercado, veja bem, de bons profissionais, profissionais diplomados ou não tem aos montes, mas qualidade é algo que anda raro, e é muito valorizada.

    Existem excelentes profissionais oriundos das faculdades, mas infelizmente existe também uma grande parcela que sai da faculdade sem noção de mercado, com parcas idéias teóricas, sem embasamento na realidade, sem falar nos que são incapacitados intelectualmente para exercer a profissão, e falo com conhecimento de causa, já perdi a conta de estagiários oriundos de várias faculdades que passaram pela empresa, e as estatísticas comprovam que mais de 80% não possuem condições mínimas para trabalhar, falta-lhes capacidade de raciocínio, ainda mais em uma área extremamente dinâmica como TI, aonde o conhecimento que tenho hoje é nada amanhã, temos que pesquisar, aprender, descobrir e manter-se em dia com as novas tendências e tecnologias, e esse ciclo se renova a cada semana, portanto não é um diploma que vai dar o estofo necessário para atuar nessa área.

    A regulamentação vai apenas onerar um pouco mais nossa atividade, com anuidades para conselhos, federações, e por aí afora vai, além de abrir um bom número de cargos para serem preenchidos por apaniguados políticos, e sustentados por nós.

    Um dos maiores entraves do Brasil é o custo trabalhista, e com a regulamentação estaremos burocratizando e onerando ainda mais uma área em que o dinamismo deveria operar. O que vai ocorrer é que grandes empresas de software, que hoje são grandes contratantes, vão acabar migrando a contratação de seus serviços para Índia, Paquistão, China, etc.

    Argumentam que só os relaxados, que nunca foram atrás de um diploma estão preocupados com isso. Bom, eu não me considero um relaxado, e como já expliquei no inicio do texto, eu estaria na turma dos “beneficiados”, mas discordo deste argumento, isso é uma desculpa esfarrapada de quem deseja ardentemente a regulamentação, para estabelecer uma reserva de mercado para si, ou por ter medo de encarar a competição do mercado, ou por comodismo mesmo.

    A regulamentação vai criar uma classe comodista, como já ocorre em algumas outras, e quem vai perder com isso é a sociedade como um todo, menos competição, menos desenvolvimento, preços maiores, enfim prejuízo para todos.

   Argumentam que os que “se acham competentes” mas não possuem diploma, que corram atrás do diploma, e que não precisam se preocupar com isso. É uma falácia, muitas vezes quem tem longa experiência e não é formado na área, não tem tempo de voltar para os bancos de uma faculdade.

   E quando se volta para os bancos de uma faculdade, chega a ser irritante o nível primário do corpo docente, que parece viver no mundo de Alice (com exceções é claro), com muito pouca noção de mercado, prazos, SLAs e como se produz software como produto.

   Com a quantidade cada vez maior de faculdades que não conseguem as notas mínimas, imagino o nível de profissionais que serão regulamentados, e com isso enganando o mercado. Sim, porque hoje o mercado sabe que existe tanto o picareta quanto o competente, mas com profissionais regulamentados, com a carteira na mão, muitos pensarão que isso será garantia de qualidade, o que não é.

    Sem falar que o legislador propõe regulamentar uma categoria que está em franca extinção. Não se faz mais software como produto apenas com Analista de sistemas e programadores, hoje precisamos das competências de um Engenheiro de software, um analista de negócios, e muitas outras competências, que vão muito além de um simples analista de sistemas.

   Então, eu não vejo nenhuma real vantagem para os profissionais e para o povo, em ter a profissão regulamentada e uma reserva de mercado, vejo isto sim uma tentativa de explorar o nosso bolso, criando mais um custo para bancarmos, além de proteção para os incompetentes que não conseguem se manter no mercado.

domingo, agosto 09, 2009

Aos poucos o gado vai acostumando com o jugo.

 

E aos poucos os conselhos de Maquiavel vão se confirmando, assim como as orientações de Antonio Gramsci, ainda que não empregadas dentro da sua ótica marxista.

A respeito da recente lei anti-tabagismo em São Paulo, a esmagadora maioria está bovinamente aceitando e aplaudindo.

Os que ousam levantar a voz contra, como já fiz, é sumariamente tachado de todos os epítetos pouco elogiosos imagináveis, além de ofensas verbais, e acusações do tipo “Egoísta, não se importa com os outros”, e por aí afora vai.

Oras, eu larguei o cigarro já tem mais de 9 anos, vez ou outra me atrevo a saborear um “puro” (charuto, para os menos íntimos do hábito), mas sou não fumante, a fumaça do cigarro inclusive me incomoda, portanto as ofensas e xingamentos raivosos caem no vazio, pois erram solenemente o alvo.

Porém me incomoda muito mais, não só me incomoda, me revolta, me causa repúdio, profunda revolta, o Estado metendo-se a tutor de minha vida privada, meus hábitos e até mesmo de cuidar da minha saúde. Não trabalho bem com a idéia de um estado controlador, isso liga em mim, de maneira automática e instintiva, o bixo da revolta, me vem à mente as multidões controladas pelo estado na China, Coréia, Cuba, ex-URSS, e por aí afora vai, e não posso ficar calado, quieto e aceitar isso como normal.

O que a maioria dos que aplaudem essa lei arbitrária parecem ignorar é que o foco da discussão está errado, enquanto o governo, como um déspota auto nomeado tutor de minha vida, brada demagogicamente aos quatro ventos contra os malefícios do cigarro, à maneira de um hábil prestidigitador que desvia o foco da cena principal, vai introduzindo no dia-a-dia do cidadão leis policialescas, privativas de liberdades, tutoras de direitos mais intimos, e mostrando o foco distorcido, consegue o aplauso da patuléia, como o boi que aceita de bom grado a água e o capim na estrada para o abatedouro.

Porque não se fez tanto empenho para disciplinar uma separação física de fato dos ambientes de fumantes e não fumantes, como existe em Salvador? Porque o impacto da lei promulgada gera muito mais dividendos eleitorais, e o (des)governador José Serra está de olho no Alvorada em 2010 e não no mandato de governador que deveria exercer.

Enquanto isso dezenas de pessoas (crianças, jovens, adultos e até velhos) se acabam fumando pedra nas Cracolândias por esse Brasil afora, e os governantes nada ou muito pouco fazem para solucionar o problema, novamente porque isso não gera dividendos eleitorais a curto prazo, esse é um problema que demanda energia, tempo, dedicação, esforço e trabalho, muito trabalho, para dar frutos em 1 ou 2 décadas, é muito tempo para os nossos politiqueiros de plantão, que querem colher os frutos agora, afinal há tempos perdeu-se o interesse coletivo de vista, em prol dos interesses pessoais e imediatistas dos politiqueiros que fizeram disso o seu meio e fim de vida.

O que me espanta é a maneira bovinamente plácida com que as pessoas, inclusive muitas tidas como cultas, aceitam a tutela do estado, via leis arbitrárias, em suas vidas.

Esse é um dos males seculares da América Latina, essa cultura ibérica de que o estado deve ser o grande pai, a tudo provendo, a tudo orientanto, a tudo tutelando, como se fossemos incapazes de tomar conta de nosso próprio nariz (e na maioria das vezes eu acho que uma grande parte da população é incapaz sim). É o oposto da mentalidade anglo-saxã dos nossos irmãos do Norte, que prezam a liberdade individual acima de tudo, e jamais aceitariam o estado lhes ditando o que fazer, por isso as ditaduras florescem muito mais nestas bandas, pois encontram terreno fértil no populacho.

sexta-feira, maio 08, 2009

DLINK DI-624 Reiniciando rede wireless

      Problema: Meu roteador com Wireless da Dlink, um DI-624, já bem rodado, começou nos últimos dois dias a reiniciar a conexão wireless a cada 2 ou 3 minutos, sem mais nem menos.

      Não consigo falar com clientes no skype, nem com parceiros de projetos, e olha que tenho 1 que está em Sofia, na Bulgária e outro em Athenas, imagina sem o skype a quanto vai o custo do projeto?

     Quebrei a cabeça, teve gente que me falou que o problema deveria ser o e-mule ou o bittorrent, desliguei os dois, nada, continuou a mesma coisa, resolvi desligar a máquina aonde está o e-mule, que apesar de ser varrida por antivírus diariamente, poderia estar infectada.

     Nada, resolvi partir para atualizar o firmware do roteador. Atualizado, configurações restauradas e… a mesma coisa.

    O log do router não me deu muitas informações, então navegando pela web pela conexão com cabo (sim tive que voltar a colocar cabo no notebook para poder estabilizar a dita cuja), encontrei alguns comentários em um site de hardware americano, algumas pessoas enfrentavam o mesmo problema.

    A solução? Fazer o upgrade de firmware, mas isto eu já tinha feito e não tinha dado certo.

   Agora é que vem o pulo do gato, um dos caras desse fórum também havia feito o upgrade e não havia resolvido, então ele informou que refez o upgrade mas do site alemão da dLink, e aí funcionou.

    Mesmo duvidando um pouco, fui lá e fiz o download, intrigado, aparentemente é a mesma versão que eu baixei do site americano, mas… vamos em frente e ver no que dá.

   Não é que funcionou? Fiz o upgrade as 18h00, e até agora está estável a conexão. Vai entender….

    Fica aqui a dica, se você está com este mesmo problema, baixe o upgrade do firmware do site alemão da D-Link.

www.spectrus.com.br

quarta-feira, abril 01, 2009

Rotas com o Google Maps no Delphi – versão simplificada.

 

      Após publicar as matérias anteriores sobre como mostrar os mapas do Google e como traçar rotas do Google a partir de aplicativos Delphi, conversando com o Paulo Geloramo da Assis Informática de Assis – SP, ele me mostrou uma versão mais simplificada que ele fez da rotina.

     Durante a nossa conversa, acabamos indo pesquisar o que seriam alguns dos parâmetros que existem no final da URL de pesquisa que carrega o mapa e traça a rota.

      Fazendo algumas experimentações, chegamos à conclusão e constatamos que a rotina funciona mesmo sem aqueles parâmetros, o que a torna mais simplificada ainda.

     Bom, aqui abaixo mais uma função para mostrar o mapa e traçar a rota, agora bem mais simplificada:

procedure Rota(Logradouro1, Numero1, Cidade1, UF1, CEP1, Logradouro2, Numero2, Cidade2, UF2, CEP2: string);
var
    strUrl: String;
begin
  strURL := 'http://maps.google.com.br/maps?f=q&source=s_q&hl=pt-BR&geocode=&q=' +
            ' from: ' +  AnsiToUtf8(Logradouro1) + ', ' +  Numero1 + ', ' +
            AnsiToUtf8(Cidade1) + ', ' +  UF1 + ', ';
  if Length(CEP1) > 1 Then
     strURL := strURL + FormatMaskText('99999-999;0; ', CEP1);
  strURL := strURL + ' to: ' +  AnsiToUtf8(Logradouro2) + ', ' +
                      Numero2 + ', ' +  AnsiToUtf8(Cidade2) + ', ' + UF2 + ', ';
  if Length(CEP2) > 1 Then                     
     strURL := strURL + FormatMaskText('99999-999;0; ', CEP2)' + ‘&ie=UTF8’;
  ShellExecute(0, nil, PChar(strURL), nil, nil, 0);
end;

    Veja que os parâmetros de CEP podem não ser informados (passar uma string vazia como parâmetro), mas se o endereço existir em duplicidade na cidade (como é o caso de São Paulo), você terá problemas ao traçar a rota.

    Para definir corretamente o endereço, passe o parâmetro de CEP para a API processar a URL sem ambiguidades.

    Você pode acrescentar o parâmetro de zoom ao final da URL, utilizando o parâmetro ‘&z=’, se optar por não utilizar este parâmetro será retornado o mapa com o zoom abrangendo toda a rota, e o usuário poderá posicionar e escolher o nível de zoom manualmente.

     Veja também que foi usada a função AnsiToUtf8 do Delphi, isto é para os casos em que você possui acentuação no nome do endereço, se não usar esta conversão, a função não irá funcionar como o esperado.

www.spectrus.com.br

domingo, março 29, 2009

Traçar rotas a partir do Delphi com o Google Maps

 

         Continuando a partir do artigo anterior “Mapas do Google no seu aplicativo Delphi”, vamos agora avançar um pouco mais, traçar rotas entre dois pontos, e mostrar isto ao usuário.

          Esta é uma funcionalidade interessante para aplicativos como CRM ou de logística. Você pode obter informações completas sobre como utilizar as APIs do Google Maps em www.google.com/apis/maps, a maioria dos exemplos contempla Java, Javascript, PHP ou Python, porém não é dificil adaptá-los à linguagem que você utiliza, como estamos fazendo com o Delphi.

           Para usar as APIs do Google, você precisa obter uma chave única e exclusiva sua, é de graça, e lhe dá acesso à todas as funcionalidades do Google Maps. Neste exemplo não vamos utilizar esta chave, é apenas um exemplo, muito embora você possa utilizar sem ter uma chave, como você pode constatar pelo código neste artigo, é aconselhável que você obtenha esta chave, por uma questão de copyright.

          Bueno, vamos botar a mão na massa.

          Primeiro de tudo você irá precisar, para mostrar o mapa, das coordenadas do ponto a ser mostrado na tela, normalmente você mostrará na tela o ponto inicial da rota, permitindo ao usuário que acompanhe a rota a partir do ponto de origem, porém você pode mostrar o ponto final da rota, a seu critério. Por este motivo criamos uma função para retornar as coordenadas.

          As coordenadas (e mais uma série de informações sobre o endereço) são retornadas em um arquivo xml, você também pode solicitar que seja retornado em formato csv (separado por vírgulas). No caso de um arquivo xml a API do Google Maps retorna informações bem completas, incluindo até mesmo o CEP, no caso de arquivo CSV serão retornadas apenas as coordenadas.

        Neste artigo iremos trabalhar com o arquivo XML, pois se você desejar obter mais informações sobre o endereço basta incrementar o código.

        Como este artigo é direcionado para todos os desenvolvedores DELPHI, incluindo os iniciantes, vou tentar manter o código o mais simples possível, mesmo que em algumas partes pareça que há redundância ou que o código poderia ser reduzido, creio que desta forma fica fácil para todos acompanharem a metodologia, sinta-se a vontade para refatorar o código.

       Para este código você deverá declarar a unit XMLDOC na parte de interface da sua unit.

Vamos também declarar um objeto do tipo XMLDocument para trabalhar com as informações retornadas pelo Google.

vXMLDoc : TXMLDocument;

       Na inicialização da Unit, ou no evento onCreate do Form, você deverá criar o XMLDocument:

    vXMLDoc := TXMLDocument.Create(Self);

      Vamos criar a função que irá preencher as coordenadas, apenas para fins informativos mantivemos o array com 3 dimensões, na primeira iremos manter as coordenadas como recuperadas do arquivo xml, isto é apenas para fins informativos, você poderá consultar esta ocorrência do array para verificar como as coordenadas foram lidas. No seu aplicativo final de produção você pode eliminar esta ocorrência.

function getCoordenadas(Logradouro, Numero, Cidade, UF, Pais: String): String;

var

//Vamos declarar um array para trabalhar com as coordenadas:
   strCoordenadas: array[0..2] of String;
   strURL: String;
   idx, inicio, tamanho : integer; // para manipular as strings de retorno

begin

Try

  Result := ‘’;

   strURL := ‘http://maps.google.com/maps/geo?q=’ +
                  Logradouro + ‘, ‘ + Numero + ‘ – ‘ + Cidade +
                  ‘ – ‘ + UF + ‘, ‘ + Pais + ‘&output=xml’;
   // O parâmetro final da string output determina o tipo de
   //    informação retornada (csv ou xml).
   //  Agora fazemos o xmldocument ler o retorno da URL

   vXMLDoc.FileName := strURL;
   vXMLDoc.Active := True;

   // Se você quiser aprender mais sobre o retorno do Google.
   // coloque um TMemo no formulário e passe o texto retornado
  //  para este TMemo, para ver o que é retornado, como abaixo:

  Memo1.Lines.Clear;
  Memo1.Lines.Add(vXMLDoc.XML.Text);

  if not vXMLDoc.Active Then
     exit;

For idx := 0 to vXMLDoc.XML.Count -1 do
    begin
    If Pos('<coordinates>', vXMLDoc.XML[idx]) > 0 Then
       begin
       inicio := Pos('<coordinates>', vXMLDoc.XML[idx]) + 13;
       tamanho := (Length(vXMLDoc.XML[idx]) - inicio) - (Length(vXMLDoc.XML[idx]) - (Pos('</coordinates>', vXMLDoc.XML[idx])));
       strCoordenadas[0] := Copy((vXMLDoc.XML[idx]), inicio, tamanho);
       end;
    end;

If length(strCoordenadas[0]) > 0 Then
   begin
   strCoordenadas[1] := Copy(strCoordenadas[0], 1, Pos(',', strCoordenadas[0]) -1);
   strCoordenadas[2] := Copy(strCoordenadas[0], Pos(',', strCoordenadas[0])+ 1, Length(StrCoordenadas[0]));
   if Pos(',', strCoordenadas[2]) > 0 Then
      StrCoordenadas[2] := Copy(strCoordenadas[2], 1, Pos(',', strCoordenadas[2]) - 1);
   end;

// Se você colocou um Memo para verificar o que é retornado,
//      pode adicionar as coordenadas para verificar se está tudo OK.
//  Lembre-se de retirar isto no software de produção.
Memo1.Lines.Add(strCoordenadas[0]);
Memo1.Lines.Add(strCoordenadas[1]);
Memo1.Lines.Add(strCoordenadas[2]);
Result := strCoordenadas[2] + ‘,’ + strCoordenadas[1];

Finally

End;

end;

 

    Agora vamos declarar uma função para receber os endereços, as coordenadas e retornar a URL para traçar a rota. As URLs para buscar as coordenadas e para traçar as rotas, ficam mais fácil de gerenciar se você declarar na parte de interface da unit. Aqui declaramos as URLs no corpo das procedures e functions para facilitar o seu entendimento, apenas para fins didáticos.

Function Rotear( De_onde, Para_onde, coordenadas: String): String;
var
  strURL : String;
begin
   Try
       
Result := ‘’;

   // URL para traçar a rota no google
   // O parâmetro z (o último da URL) é o fator de zoom
   //  a ser aplicado ao mapa, experimente com outros
   // valores (valores maiores, mais zoom, e vice-versa).

   strURL := ‘http://maps.google.com/maps?f=d&source=s_d&saddr=’ + 
                   De_onde + ‘&daddr=’ + 
                   Para_onde + ‘&hl=pt-BR&geocode=&mra=pe&mrcr=0&ie=UTF8&ll=’ +
                   coordenadas + ‘&z=16’;

Result := strURL;

Finally

end;

end;

 

   Agora vamos usar a mesma função que usamos no outro artigo sobre mostrar mapas do google no delphi, para mostrar o mapa com a rota traçada:

     Temos uma tabela de Clientes, 5 campos desta tabela nos interessam, que contém os dados que usaremos para pesquisar no mapa.

    Logradouro = Contém o nome do logradouro do endereço, por exemplo “Rua Jesuíno Arruda”.
    Numero = Contém o número do endereço, apenas o número e não o complemento (sala, loja, etc), por exemplo: 769 
    Cidade = O nome da cidade, por exemplo: São Paulo
    UF = A sigla do estado, exemplo SP.
    País = O nome do país;

    E agora criar uma função que vai fazer o trabalho, é simples, prático e bem rápido.

procedure TForm1.CarregaMapa;
var

   strURL, deOnde, paraOnde, coordenadas : String;
begin
  // Localizamos o endereço inicial

  Clientes.Locate(‘ClienteID’, VarArrayOf([clienteInicial]),[]);

   Coordenadas := getCoordenadas(Clientes.FieldByName('Logradouro').AsString, Clientes.FieldByName('Numero').AsString,       Clientes.FieldByName('Cidade').AsString, Clientes.FieldByName('UF').AsString, Clientes.FieldByName(‘Pais’).AsString);

  deOnde := Clientes.FieldByName('Logradouro').AsString + ', ' +
                  Clientes.FieldByName('Numero').AsString + ', ' + 
                  Clientes.FieldByName('Cidade').AsString + '-' +
                  Clientes.FieldByName('UF').AsString + ‘, ‘ +
                  Clientes.FieldByName(‘Pais’).AsString;

 

// Vamos localizar o endereço de destino
  Clientes.Locate(‘ClienteID’, varArrayOf([clientefinal]), []);

        paraOnde := Clientes.FieldByName('Logradouro').AsString + ', ' +
                  Clientes.FieldByName('Numero').AsString + ', ' + 
                  Clientes.FieldByName('Cidade').AsString + '-' +
                  Clientes.FieldByName('UF').AsString + ‘, ‘ +
                  Clientes.FieldByName(‘Pais’).AsString;

  strURL := Rotear(deOnde, paraOnde, Coordenadas);
  ShellExecute(0, Nil,  PChar(strURL), Nil, Nil, 0);

// Fiz a chamada acima para que ficasse mais claro, mas você
// pode otimizar a clareza do código fazendo a chamada :
// ShellExecute(0, Nil,  PChar(Rotear(deOnde, paraOnde, Coordenadas)), Nil, Nil, 0);


end;

    Bom, com isso você já consegue colocar a funcionalidade de fazer rotas no seu aplicativo, você pode usar um TWebBrowser e embutir isto dentro do seu software. Há vantagens e desvantagens nisto, eu pessoalmente prefiro chamar um browser externo.

     Como o TWebBrowser é baseado na engine do Internet Explorer, se o usuário tiver outro browser instalado (Opera, FireFox, Safari, etc), e não tiver o Internet Explorer instalado, seu aplicativo vai apresentar erro, e a bela funcionalidade que você implementou não irá funcionar. Da maneira como fizemos, o browser padrão do usuário é que será chamado, seja ele qual for.

    www.spectrus.com.br

Mapas do Google no seu aplicativo Delphi.

 

      Bom, você certamente já pesquisou algum endereço pelo google maps, e ficou imaginando que colocar aquilo no seu aplicativo seria uma boa idéia.
      Pois agora, seus problemas “acabaram-se”, com o novo googlemapeitorparaseuaplicativeitor Tabajara, as coisas finalmente vão acontecer.

      Veja abaixo como fazer para colocar o Google para trabalhar para você, e mostrar para seus clientes, ou para o chefe, como você é esperto (Não tanto quanto o Larry Page e o Sergey Brin, pois eles ganham fortunas com o Google, e você ainda está bem distante de conseguir comprar 1 Boeing só para fazer baladas nos céus como eles fazem).

     Mãos à obra entonces:

     Temos uma tabela de Clientes, 4 campos desta tabela nos interessam, que contém os dados que usaremos para pesquisar no mapa.

    Logradouro = Contém o nome do logradouro do endereço, por exemplo “Rua Jesuíno Arruda”.
    Numero = Contém o número do endereço, apenas o número e não o complemento (sala, loja, etc), por exemplo: 769 
    Cidade = O nome da cidade, por exemplo: São Paulo
    UF = A sigla do estado, exemplo SP.

Vamos criar uma função que vai fazer o trabalho, é simples, prático e bem rápido.

procedure TForm1.CarregaMapa;
begin
  ShellExecute(0, Nil,
    PChar('http://maps.google.com.br/maps?f=q&source=s_q&hl=pt-BR&geocode=&q=' +Clientes.FieldByName('Logradouro').AsString + ', ' + Clientes.FieldByName('Numero').AsString + ', ' +
      Clientes.FieldByName('Cidade').AsString + '-' + Clientes.FieldByName('UF').AsString + '&jsv=143c&sll=-23.186453,-46.884453' +
      '&sspn=0.478436,0.545883&g=&ie=UTF8&ct=clnk&cd=1'), Nil, Nil, 0);
end;

    Basta chamar a função e será carregado o browser com o mapa correspondente ao endereço passado.

    No próximo post vamos ver como fazer para, além de mostrar o mapa, traçar a rota entre dois endereços.

    Como sempre falo : Google é seu amigo, use-o.
    www.spectrus.com.br

Movendo colunas e linhas em um StringGrid.

 

      Na maioria dos componentes Grids, de terceiros, você pode observar que o usuário pode mover colunas e linhas usando o mouse. Aliás, o usuário espera este comportamento de um Grid. Então, como fazer isso usando um TStringGrid?

      Como sempre, se é isso que você estava querendo implantar em seu aplicativo, mais uma vez “seus pobrêma se acabaram-se”,  apresentamos o incrível GridColumnRowMoveitor Tabajara.

      Mais uma vez… mão na massa e chega de enrolação.

      Primeiro de tudo, se você der uma olhada mais aprofundada no componente TCustomGrid você verá que os métodos MoveColumn e MoveRow estão lá, fazem parte do componente, mas eles estão ocultos no TStringGrid, eles são herdados do ancestral TCustomGrid porém não estão acessíveis no descendente, o motivo?? Ora, vai lá saber o que se passa na cabeça dos garotos da Codegear…

      Como resolver esse problema? Simples e fácil, sem maiores complicações, basta fazer uma herança de TStringGrid e redeclarar estes métodos como public.

type
    TNovoGrid = class(TStringGrid)
    public
    procedure MoveColumn(FromIndex, ToIndex: LongInt);
    procedure MoveRow(FromIndex, ToIndex: LongInt);
   end;

   Para implementar estes métodos é muito simples, basta na implementação, chamar o ancestral e passar para ele o comando:

procedure TNovoGrid.MoveColumn(FromIndex, ToIndex: LongInt);
begin
    inherited;
end;

procedure TNovoGrid.MoveRow(FromIndex, ToIndex: LongInt);
begin
    inherited;
end;

     Você não precisa registrar este componente na paleta de componentes. Use o TStringGrid ou qualquer descendente de TCustomGrid normalmente como já faz hoje, e quando você precisar usar estes métodos, simplesmente faça um typecast (conversão de tipos) para a nova classe, e pronto. Veja o exemplo abaixo:

procedure TForm1.Button1Click(Sender: TObject);
begin
       TNovoGrid(StringGrid1).MoveColumn(2, 5);
end;

    Bom, é isso aí, até a próxima.
    www.spectrus.com.br