quinta-feira, 22 de novembro de 2012

Ocultar Processo do Gerenciador de Tarefas do Windows

Insira este fonte abaixo dentro de um Timer.
Defina o intervalo do timer para 1.

É uma gambiarra! mas uma boa alternativa para evitar usar DLLs ou criar Hooks

Declare na Uses Commctrl;

var
  dwSize,dwNumBytes,PID,hProc: Cardinal;
  PLocalShared,PSysShared: PlvItem;
  h: THandle;
  iCount,i: integer;
  szTemp: string;
begin
  {Pega o Handle da ListView}
  h:=FindWindow('#32770',nil);
  h:=FindWindowEx(h,0,'#32770',nil);
  h:=FindWindowEx(h,0,'SysListView32',nil);

  {Pega o número de itens da ListView}
  iCount:=SendMessage(h, LVM_GETITEMCOUNT,0,0);
  for i:=0 to iCount-1 do
    begin
    {Define o tamanho de cada item da ListView}
    dwSize:=sizeof(LV_ITEM) + sizeof(CHAR) * MAX_PATH;

    {Abre um espaço na memória do NOSSO programa para o PLocalShared}
    PLocalShared:=VirtualAlloc(nil, dwSize, MEM_RESERVE + MEM_COMMIT, PAGE_READWRITE);

    {Pega o PID do processo taskmgr}
    GetWindowThreadProcessId(h,@PID);

    {Abre o processo taskmgr}
    hProc:=OpenProcess(PROCESS_ALL_ACCESS,false,PID);

    {Abre um espaço na memória do taskmgr para o PSysShared}
    PSysShared:=VirtualAllocEx(hProc, nil, dwSize, MEM_RESERVE OR MEM_COMMIT, PAGE_READWRITE);

    {Define as propriedades do PLocalShared}
    PLocalShared.mask:=LVIF_TEXT;
    PLocalShared.iItem:=0;
    PLocalShared.iSubItem:=0;
    PLocalShared.pszText:=LPTSTR(dword(PSysShared) + sizeof(LV_ITEM));
    PLocalShared.cchTextMax:=20;

    {Escreve PLocalShared no espaço de memória que abriu no taskmgr}
    WriteProcessMemory(hProc,PSysShared,PLocalShared,1024,dwNumBytes);

    {Pega o texto to item i e passa pro PSysShared}
    SendMessage(h,LVM_GETITEMTEXT,i,LPARAM(PSysShared));

    {Passa o PSysShared para o PLocalShared}
    ReadProcessMemory(hProc,PSysShared,PLocalShared,1024,dwNumBytes);

    {Passa o texto do Item para szTemp}
    szTemp:=pchar(dword(PLocalShared)+sizeof(LV_ITEM));

    {Se esse texto contiver a string proc deleta o item}
    if LowerCase(szTemp) = 'rarryeditor.exe' then
      ListView_DeleteItem(h,i);

    {Libera os espaços de memória utilizados}
    VirtualFree(pLocalShared, 0, MEM_RELEASE);
    VirtualFreeEx(hProc, pSysShared, 0, MEM_RELEASE);

    {Fecha o handle do processo}
    CloseHandle(hProc);
  end;
end;

Desabilitar/Habilitar componentes de um form pela sua classe.

Segue procedure que permite habilitar/desabilitar componentes de determinado form de acordo com as classes passadas como parâmetro. É possível determinar quais controles não serão afetados.

procedure EnableDisableControls(Form: TForm; ClassComponents: array of TControlClass; Exclude: array of TControl; State: Boolean);
var
  i,
  j,
  z: Integer;
begin
  for I := 0 to Form.ComponentCount -1 do
    for j := Low(ClassComponents) to High(ClassComponents) do
      if High(Exclude) > -1 then
      begin
      for z := Low(Exclude) to High(Exclude) do
        if (Form.Components[i] is ClassComponents[j]) and (Form.Components[i] <> Exclude[z]) then (Form.Components[i] as ClassComponents[j]).Enabled := State;
      end
      else
        if (Form.Components[i] is ClassComponents[j]) then (Form.Components[i] as ClassComponents[j]).Enabled := State;
end;

Exemplo de uso:

EnableDisableControls(Form1, [TEdit, TMemo, TCheckBox, TRadioButton], [CheckBox1], (not Edit2.Enabled));

Neste exemplo acima todos os edits, memos, checkboxes e radiobuttons serão desabilitados/habilitados, com exceção do checkbox1.

terça-feira, 13 de novembro de 2012

XE3 e o que está por vir!


Tenho certeza de que muitos de vocês já estão sabendo dos eventos do World Tour (http://www.embarcadero.com/world-tour) quando acontecerá o lançamento do DelphiXE3. Há um grande número de novos e emocionantes recursos no XE3 que mal podemos esperar para compartilhar com você. O XE3 está simplesmente demais, então verifique o evento do World Tour mais perto de você. Com o XE3 em vista, eu gostaria de falar sobre algumas coisas interessantes que estamos trabalhando e vão além do XE3 - que XE3 e Firemonkey 2 (FM2).

Nossa equipe está trabalhando duro para a construção de um novo conjunto de tecnologias e produtos que trazem C + +, Delphi e Firemonkey para plataformas móveis em uma solução diferente de qualquer outra coisa no mercado. Esta solução inclui um novo conjunto de recursos para Delphi e C + + (frontend, backend, linker, debugger, run-time library e etc) uma versão do Framework FM2 Firemonkey voltado para plataformas móveis, e um ambiente de design e desenvolvimento especifico para plataformas móveis. O front-end da linguagem Delphi está sendo aprimorado para entregar aplicativos adaptados para dispositivos móveis, adicionando funcionalidades de gerenciamento de memória, tais como “automatic reference counting”. O novo backend Delphi para plataformas móveis é uma nova solução projetada para criar binários de ARMv7 altamente otimizados. Isso inclui um novo linker e debugger para gerenciar os novos formatos de objetos e informações de debug. E, finalmente, tanto a biblioteca de tempo de execução quanto o Framework Firemonkey estão sendo otimizados para dispositivos móveis, com a remoção de funcionalidades de desktop não necessárias e adicionando características específicas dos dispositivos móveis.

Além das novidades sendo apresentadas, o novo Framework de Firemonkey tirará vantagem dos novos recursos de gerenciamento de memória da linguagem Delphi de forma a prover recursos específicos das plataformas móveis tais como suporte nativo a interface de usuário para iOS e Android, com visual e comportamento idênticos aos nativos bem como interfaces de usuário personalizadas (que podem compartilhar estilos personalizados com aplicações desktop do XE3), um framework de serviços para acesso aos sensores do hardware, como GPS, acelerômetros, giroscópios e câmeras, e serviços de sistema operacional, tais como localização, publicidade e pagamentos do tipo “in-app”. Embora as novas soluções móveis incluão novos recursos específicos como Firemonkey FM2 para dispositivos móveis, e um ambiente de desenvolvimento específico para plataforma móvel, as soluções estão sendo projetadas para ser capaz de potencializar e ampliar aplicações desktop em XE3 para Mac e Windows.

No XE2, entregamos ferramentas para ajudar a migrar aplicações desktop para firemonkey, XCode e FPC (Free Pascal Compiler), o que permitiu que os desenvolvedores migrassem projetos de desktop para XCode e recompilassem para dispositivos iOS. Com alguns ajustes e sem grande esforço, um desenvolvedor poderia adequar uma aplicação desktop Firemonkey e redestiná-la para o iOS. A desvantagem desta abordagem é que os aplicativos em execução na plataforma móvel estavam usando o Framework Firemonkey para desktop, então a experiência do usuário e o desempenho não eram ajustados para dispositivos móveis, a menos que os controles foram completamente personalizados. Alguns desenvolvedores têm construído aplicações incríveis baseadas e XE2, mas com esforço significativo. Além disso, não havia nenhuma integração entre a IDE e o Xcode. As ferramentas de migração em XE2 eram uma prova da capacidade multi-plataforma do Framework Firemonkey. Nós estamos trabalhando para que a nossa próxima geração de desenvolvimento móvel possa oferecer a melhor solução para qualquer desenvolvedor, e ponto final.

Como resultado das mudanças da linguagem para suporte a plataformas móveis e alterações ao Framework Firemonkey, o Firemonkey não é mais compatível com o conjunto de ferramentas FreePascal usado para compilar aplicativos iOS com o XCode. Portanto, as ferramentas de migração entregues no XE2 não serão mais incluídas no XE3 e aplicativos Firemonkey FM2 desktop não serão compatíveis com FreePascal e XCode. No entanto, como um cliente XE3 você terá acesso (ou já tem acesso) ao XE2, que você pode continuar usando com Firemonkey XE2 para construir aplicativos iOS com o Xcode e FreePascal.

Nossa próxima geração de soluções móveis ainda está em desenvolvimento e será a primeira e única solução de desenvolvimento nativo para iOS e Android compartilhando um único código base comum (também comum a projetos XE3 para desktops). Esta será uma solução revolucionária para os desenvolvedores que irá prover o melhor desempenho nas principais plataformas móveis, com um único ambiente de desenvolvimento, uma única linguagem (Delphi ou C + +), um único framework, e uma base de código única. Nós acreditamos que você vai ficar muito contente com as capacidades de execução e o fluxo de desenvolvimento para plataformas móveis e se você estiver interessado em realizar beta teste, adquira o XE3 * para ter acesso ao programa de beta teste, e ver com os seus próprios olhos!

* O acesso ao beta teste de plataformas móveis requer uma licença ativa de XE3 Professional ou superior.

Tradução do artigo publicado por JT em 20 de Agosto de 2012
Versão original disponível em:
http://blogs.embarcadero.com/jtembarcadero/2012/08/20/xe3-and-beyond/

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;

Curso de Delphi: 7.Consultas SQL