terça-feira, 13 de novembro de 2012

Como tornar um servidor datasnap rest compatível com o cache off-line do HTML5


Por padrão, servidores DataSnap stand-alone WebBroker não permitem usar o "novo" HTML5 Aplicação manifesto de arquivo de cache.

Enquanto eu estava me preparando os conteúdos e as demonstrações do meu "HTML5 e aplicação web DataSnap desenvolvimento" eu configurei os componentes DataSnap para suportar esse recurso HTML5. Há apenas uma alteração a fazer ao "WebApplication REST" padrão gerado pelo assistente. 

No WebModuleUnit há o componente utilizado TWebFileDispatcher. Este componente tem as WebFileExtensions propriedade que é uma coleção de valores-chave contendo todas as extensões de arquivos permitidas relacionada com o mime-type.

A imagem abaixo mostra o que precisa ser configurado:


domingo, 7 de outubro de 2012

Ping Delphi7 com IdIcmpClient

Estamos aqui novamente com uma dica utilizando-se somente do componente, sem sua ação visual:
Pingando com IdIcmpClient - Delphi 7

Siga as instruções abaixo:

// declare na seção uses:
IdBaseComponent, IdComponent, IdRawBase, IdRawClient, IdIcmpClient // Uses para IdIcmpClient

// caso queira publicar esta função não se esqueça de inclui-la na seção
// private ou na seção public, ou diretamente na parte de procedures e function da unit
// e em caso de um formulario visual, colocar a classe do formulário, ex:
//Function TForm1.Ping(HostName: String): boolean;

Function Ping(HostName: String): boolean;
var
 i, Soma, BytesRecebidos : Integer;
 PckEntregue : Array[1..3] of Integer;
 ICMP : TIdIcmpClient;
begin
try
 ICMP := TIdIcmpClient.Create(nil);
  try
   ICMP.Host := HostName;
   ICMP.ReceiveTimeout := 500;
   ICMP.Ping;
    if ICMP.ReplyStatus.BytesReceived > 0 then
     result := true
     else
      result := false;
  except
   result := false;
  end;

finally
 ICMP.Destroy;
end;

end;

Pesquisando em banco Firebird desconsiderando acentos - case insensitive

Se você já tem um banco dados Firebird em uso e não quer Mudar a estrutura do banco ou tabela (não quer usar Character set e não quer usar collate) , pode usar o seguinte comando para fazer pesquisas case-insensitive (ou seja, localizar dados estando gravados em minúsculas ou maiúsculas)

Exemplo:
select nomecampo from NOMETABELA
where nomecampo containing 'ALIENAÇÃO'
or nomecampo containing 'alienação'

Nesta caso ele irá localizar se no campo da tabela estiver gravado uma das seguintes opções:
alienação
ALIENAÇÃO
Alienação
AliEnação
AlieNação

Atenção - NÃO Irá Achar:
alienaÇão  (Ç maiúscula e resto minusculo)

ParaSe você já tem um banco dados Firebird em uso e não quer Mudar a estrutura do banco ou tabela (não quer usar Character set e não quer usar collate) , pode usar o seguinte comando para fazer pesquisas case-insensitive:

Exemplo:
select nomecampo from NOMETABELA
where nomecampo containing 'ALIENAÇÃO'
or nomecampo containing 'alienação'

Nesta caso ele irá localizar se no campo da tabela estiver gravado uma das seguintes opções:
alienação
ALIENAÇÃO
Alienação
AliEnação
AlieNação

Atenção - NÃO Irá Achar:
alienaÇão  (Ç maiúscula e resto minusculo)

Faixa de Notícias

Essa função tem com o intuito ter uma faixa de notícias, passando na tela.

Primeiro, precisaremos de um label, que colocarei o nome de lblNoticias e um timer que colocarei o nome TimerNoticia;

No TimerNoticia coloque o valor de "interval" para 100, mas caso ache muito rápido é só aumentar esse valor;

Você pode colocar o valor da opção "visible" do HorzScrollBar para "false";

Caso você utilize uma image como fundo e está esteja com o Align colocado para alClient, então você deverá colocar a seguinte linha de código no procedimento OnResize do Form:
    
   Image1.Constraints.MaxWidth := Self.Width - 8;


Agora vamos ao que interessa, o código está preparado para rodar no caso de você pegar o que quer deixar como notícia no banco de dados, e então caso não tenha nada irá procurar no banco de 30 em 30 segundos, esse é o código para rodar a faixa de notícias:

procedure TForm1.TimerNoticiaTimer(Sender: TObject);
begin
   DoubleBuffered := True;

   if lblNoticias.Visible then
   begin
      lblNoticias.Left := lblNoticias.Left - 30;
   end;

   If ((lblNoticias.Left + lblNoticias.Width) <= 15) then
   begin
      lblNoticias.Caption := 'TESTE DE NOTÍCIAS';

      if (lblNoticias.Caption <> EmptyStr) then
      begin
         lblNoticias.Left := Self.Width + 1;
         lblNoticias.Caption := trim(lblNoticias.Caption) + ' *';
         TimerNoticia.Enabled := True;
         lblNoticias.Visible := True;
         TimerNoticia.Interval := 100;
      end
      else
      begin
         lblNoticias.Visible := False;
         TimerNoticia.Interval := 30000;
      end;
   end;
end;

Retorna IP de conexão com a Internet ( IP do Roteador )

Funciona perfeitamente, mas requer que você tenha instalado os componentes Indy em seu Delphi.

Detalhe: Essa função pode pausar o processo do seu aplicativo até que ela receba resposta ou acabe o tempo limite

Function TIPreal : String;
var
  IP : TIdHTTP;
  Temporario : String;
  Endereco : String;
  X : Integer;
begin
  try IP := TIdHTTP.Create(nil);
    with IP do begin
      Host := 'checkip.dyndns.org';
      Temporario := Get('checkip.dyndns.org');
      For X := 1 to Length(Temporario) do
        if (Temporario[X] in ['0'..'9']) or (Temporario[X] = '.') then
          Endereco := Endereco + Temporario[X];
    end;
      Result := Trim(Endereco); IP.Free;
  except
    Result := 'ERRO';
  end;
end;

segunda-feira, 10 de setembro de 2012

Identar código no Delphi 7

Quem está começando a aprender Delphi 7 e já tem alguma familiaridade com alguma outra ferramenta de programação ou editor de textos, fora o bloco de notas, já está acostumado a identar seus códigos de forma que estes fiquem organizados para uma melhor manutenção posteriormente.

Se você é um dos que não identa, pode começar a se acostumar com esta técnica, que é praticamente exigida por alguns padrões lá fora e, como falei anteriormente, é de essencial para uma melhor manutenção e interpretação do código.

Mas o que é identar?

Dentro da computação, indentação é um termo aplicado ao código fonte de um programa para indicar que os elementos hierarquicamente dispostos têm o mesmo avanço relativamente à posição (y,0).

Na maioria das linguagens a indentação tem um papel meramente estético, tornando a leitura do código fonte muito mais fácil (read-friendly), porém é obrigatória em outras. Python, occam e Haskell, por exemplo, utilizam-se desse recurso tornando desnecessário o uso de certos identificadores de blocos ("begin" e/ou "end").

A verdadeira valia deste processo é visível em arquivos de código fonte extensos, não se fazendo sentir tanto a sua necessidade em arquivos pequenos (relativamente ao número de linhas)

Para qualquer programador, deve ser um critério a ter em conta, principalmente, por aqueles que pretendam partilhar o seu código com outros. A Indentação facilita também a modificação, seja para correção ou aprimoramento, do código fonte.

Identando no Delphi 7

Diferente dos outros editores, o Delphi 7 não permite o uso da TAB após a seleção do texto para identarmos aquele bloco, se fizermos isso, a linha selecionada é excluída!!

O comando para finalmente identar nosso código é: CTRL + SHIFT + i (para avançar o código, ou seja, mover pra a direita) e CTRL + SHIFT + u (para retroceder o código ou mover para a esquerda). Lembre-se de SELECIONAR o código antes de utililzar as teclas de atalho.

segunda-feira, 27 de agosto de 2012

Quebra textos e retorna frases do tamanho especificado


Quebra textos e cria frases do tamanho especificado, com um detalhe (não reparte as palavras) a função avalia se a palavra seguinte vai caber na frase caso contrario inclui na frase seguinte.

Fiz essa função na necessidade de atender regras de tamanho em comentarios de nota fiscal.

Function QuebraTextString(Texto : String; Largura : Integer):TStringList;
var
  Original, Quebrado : TStringList;
  i, x, esp : integer;
  frase : String;
begin
  Original := TStringList.Create;
  Quebrado := TStringList.Create;

  esp := Largura;
  sBreakApart(Texto, ' ', Original);

  frase := '';
  for i := 0 to Original.Count-1 do begin
    if Length(frase) = esp then begin
      Quebrado.Add(frase);
      frase := '';
    end;
    if( Length(frase + ' ' +Original.Strings[i]) > esp) then begin
      Quebrado.Add(frase);
      frase := '';
    end;
    frase := frase + ' '+Original.Strings[i];
    if i = Original.Count-1 then begin
      Quebrado.Add(frase);
    end;
  end;
  result:= Quebrado;
end;

Curso de Delphi: 7.Consultas SQL