Cesar Romero

Delphi programming

BDE para Win64 – Download

Links para download atualizados em 20/abril/2010:

Como algumas pessoas reportaram que não estão conseguindo baixar o arquivo do site da Embarcadero, eu enviei o instalador para um disco virtual.

O Anderson mandou uma outra instalação que ele conseguiu instalar e está funcionando no Win7 64bit, a única exigência é de que tem de ser instalado como Administrador, aqui está o link para download da versão dele.

Obrigado pela colaboração do Anderson Cabrini e do Cristiander.

Messenger Erro 81000306

Este erro é de problema de conexão da Internet, que pode acontecer por que você está sem Internet ou por que o acesso a Internet está bloqueado por um Firewall ou Proxy, eliminando estas possibilidades, o primeiro teste a fazer é tentar navegar em outros sites com o Internet Explorer (IE), é necessário que seja com o IE, pois o Messenger (MSN) compartilha alguns métodos de conexão. Se não estiver navegando o problema é na conexão de internet, assim que você puder navegar, o MSN deve se conectar normalmente.

Se continuar não conectando:

  1. Verifique se o IE não está configurado para “Trabalhar Offline”, no IE8 esta opção fica no menu Ferramentas, nas versões anteriores pode estar no menu Arquivo.
  2. Faça uma limpeza dos arquivos de “Histórico de Navegação” no IE, no menu: Ferramentas >> Opções de Internet >> Histórico de navegação, clique no botão Excluir.

Após estes passos, feche o IE e o MSN, reiniciei o MSN e tente conectar, se ainda não for possível conectar, tente o seguinte método:

Execute o Prompt de Comando como Administrador, se não souber como, vá no menu Iniciar >> Todos os Programas >> Acessórios >>clique com o botão direito do mouse sobre o ítem “Prompt de Comando” >> Executar como Administrador, na janela que aparecer digite o seguinte comando:

netsh interface tcp set global autotuninglevel=disabled

E tente conectar novamente o MSN, depois execute o seguinte comando na mesma janela:

netsh interface tcp set global autotuninglevel=normal

Requisições HTTP com Delphi sem componentes

WinHTTP
Para efetuar requisições HTTP sem nenhum componente, é necessário utilizar as bibliotecas do Windows. Em todas as versões recentes do Windows a biblioteca WinHTTP está disponível também através da interface COM, e o Delphi faz nossa vida muito fácil, já que podemos importar esta biblioteca e ter os componentes instalados utilizando o Wizard de importação de Componentes, em poucos cliques.

Para gerar a unit com a interface para acessar a biblioteca WinHTTP, através do menu “Component | Import Component” – Import a Type Library >> Selecione “Microsoft WinHTTP Services” >> Você pode instalar os componentes no Delphi ou apenas gerar a unit e adicionar ao seu projeto, eu utilizei esta opção e o Wizard criou e adicionou ao meu projeto uma nova unit chamada WinHttp_TLB.pas.

Eu escrevi os métodos HttpRequest e SaveHttpResponse, para reutilizar em meus projetos, a seguir o código completo destes métodos e como utilizá-los.

uses
  ActiveX, AxCtrls, WinHttp_TLB;

function HttpRequest(const URL: string): IStream;
var
  HttpRequest: IWinHttpRequest;
begin
  HttpRequest:= CoWinHttpRequest.Create;
  HttpRequest.Open('GET', URL, false);
  HttpRequest.Send(EmptyParam);
  Result:= IUnknown(HttpRequest.ResponseStream) as IStream;
  HttpRequest:= nil;
end;

procedure SaveHttpResponse(const ResponseStream: IStream; const FileName: string);
var
  OleStream: TOleStream;
  FileStream: TFileStream;
begin
  if (ResponseStream = nil) or (FileName = '') then
    Exit;

  OleStream:= TOleStream.Create(ResponseStream);
  try
    FileStream:= TFileStream.Create(FileName, fmCreate);
    try
      OleStream.Position:= 0;
      FileStream.CopyFrom(OleStream, OleStream.Size);
    finally
      FileStream.Free;
    end;
  finally
    OleStream.Free;
  end;
end;

procedure LoadResponseFromStream(WebBrowser: TWebBrowser; const ResponseStream: IStream);
var
  PersistStream: IPersistStreamInit;
begin
  if not Assigned(WebBrowser.Document) then
    WebBrowser.Navigate('about:blank');

  if WebBrowser.Document.QueryInterface(IPersistStreamInit, PersistStream) = S_OK then
    if PersistStream.InitNew = S_OK then
      PersistStream.Load(ResponseStream);
end;

procedure TFormHTTPRequest.ButtonGetLoadClick(Sender: TObject);
var
  ResponseStream: IStream;
begin
  ResponseStream:= HttpRequest(EditURL.Text);
  if ResponseStream <> nil then
  begin
    SaveHttpResponse(ResponseStream, EditSave.Text);
    LoadResponseFromStream(WebBrowser, ResponseStream);
  end;
end;

Apenas para navegar em um site utilizando o TWebBrowser, bastaria uma linha de código WebBrowser.Navigate(‘http://www.cesarromero.com.br’), mas o objetivo deste exemplo é:

  1. Navegar utilizando a biblioteca WinHTTP
  2. Salvar o conteúdo em Stream
  3. Salvar o Stream em um arquivo
  4. Carregar o conteúdo de Stream no TWebBrowser

MSN Live Messenger + Webcam = Erros: 0x8ac70013, 0x8100039d

Sempre que tive problemas para usar a webcam no messenger nunca encontrei uma solução simples. Há alguns dias o problema voltou,  e quando tento utilizar o recurso de vídeo, o messenger mostra a mensagem de erro “O Messenger não está disponível agora. Tente novamente mais tarde.
Com um dos códigos de erro: 0x8ac70013, 0x8100039d

  • A solução para o erro 0x8ac70013 é simples, basta limpar os arquivos temporários e cookies do Internet Explorer.
  • Já o erro 0x8100039d foi mais difícil de descobrir, encontrei a dica no newsgroup do live messenger da microsoft:

O problema está relacionado com as conexões de rede virtuais, criadas pelos programas VMWare ou VirtualBox, eu tenho os dois instalados aqui.

Estes são os passos para corrigir o erro:

  1. Desativar as conexões de rede:
  2. VMware Network Adapter VMnet1” e “VMware Network Adapter VMnet8“.
  3. Desativar a conexão de rede “VirtualBox Host-Only Network“.
  4. Sair e reiniciar o Windows Live Messenger.

Depois disto, a webcam deve voltar a funcionar normalmente e você poderá fazer as chamadas de vídeo.


Delphi 2010 DBX com SQL Server 2008

Há alguns dias eu postei o artigo Configurando DBX para acessar o MS SQL Server 2000 e 2005 no Delphi 2010, hoje o Bob Swart postou em seu blog o artigo Delphi/C++Builder 2010 DBX4 and SQL Native Client sobre o mesmo assunto com um complemento explicando a solução para o erro:

“DBX Error: Driver could not be properly initialized. Client library may be missing, not installed properly, or of the wrong version.”

A solução para este erro é bem clara lendo esta mensagem, se você pretende se conectar ao SQL Server 2008, precisa instalar o cliente para 2008.

No site da Microsoft você encontra o download do cliente nativo para SQL Server 2008:


Visão Geral

O Feature Pack é uma coleção de pacotes de instalação autônoma que agregam valor ao SQL Server 2008. Ele inclui as últimas versões de:

  • Componentes redistribuíveis para SQL Server 2008.
  • Provedores complementares para SQL Server 2008.
  • Componentes de compatibilidade com versões anteriores para SQL Server 2008.


Pré-requisitos

Sistemas Operacionais com Suporte:

  • Windows Server 2003 Service Pack 2;
  • Windows Server 2008;
  • Windows Vista Service Pack 1;
  • Windows XP Service Pack 3;
  • Windows 7 Service Pack 1.


Atenção

Se você usar o SQL Server 2008 no Windows 7, você precisa instalar o Service Pack 1, caso contrário você pode encontrar erros de compatibilidade, como problemas de permissão e não ser possível alterar tabelas existentes.

BDE Install para Windows 64bit

Postei no Code Central um instalador para o BDE que funciona para Windows 32bit e Windows 64bit.

O link para download é http://cc.embarcadero.com/item/27573.

O crédito pelo instalador é do Edmar Frazão.

Atenção: O BDE foi descontinuado, então ele não terá atualizações. Por exemplo, nunca terá suporte a Unicode.

Você não deve iniciar o desenvolvimento de novas aplicações com BDE. Considere migrar seus sistemas existentes de BDE para dbExpress.

Atualização 20/abril/2010:

Agradeço a colaboração do Anderson Cabrini e do Cristiander.

Como criar um VCL Form sem .dfm?

As vezes precisamos criar um Form em tempo de execução, a partir de uma classe especializada de TForm, apenas com métodos, criando os componentes dinamicamente, ex:

type
  TMyForm = class(TForm)
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  end;

E nos deparamos com o erro:

Project MyProject.exe raised exception class EResNotFound with message ‘Resource TMyForm not found’.

Solução:

  • Crie o formulário chamando o método TMyForm.CreateNew().
begin
  FMyForm:= TMyForm.CreateNew(Application);
  FMyForm.AlphaBlend:= True;
  FMyForm.AlphaBlendValue:= AlphaBlendValue;
  FMyForm.FormStyle:= fsStayOnTop;
end;

Atenção:

  • Este formulário não pode criado automaticamente pelo projeto.
  • Não pode ser criado pelos métodos Application.CreateForm() ou TMyForm.Create().

sourceforge.net RAD Studio Demo Code by embarcaderocode

Algumas coisas estão mudando. Projeto novo da Embarcadero no Source Forge

http://sourceforge.net/projects/radstudiodemos/

Email com Indy “Socket error 11004″

Sempre tem alguém perguntando a solução para este erro quando vai mandar Email com o Indy, então vou tentar postar a explicação mais simples para que seja possível entender o erro e como resolver.

Socket error 11004 ou WSANO_DATA, significa que a resolução de nome, tradução de www.dominio.com.br para o número IP, foi encontrada no servidor de DNS, mas não retornou nenhum dado. Isto significa que o servidor de nomes (DNS) está incorreto ou está mal configurado.

A solução definitiva é corrigir a configuração do DNS, se você tiver acesso administrativo a ele. Mas se isto não for possível então você pode utilizar o número IP diretamente no lugar do nome. Você pode utilizar o utilitário ping do windows, para descobrir o IP do servidor.


E se eu consultar o IP pela minha aplicação antes e passar para o componente Indy?

Você pode fazer uma chamada a API “GetHostByName”, que é utilizada internamente pelos componentes Indy, e terá o mesmo erro, por que a resolução de nomes é executada pelo mesmo servidor DNS.

Process Info Components

Hoje encontrei 2 componentes gratuitos bem interessantes:

  • TProcessInfo
  • TAppInfo

TProcessInfo disponibiliza uma lista de processos que estão rodando. Esta lista é uma coleção de objetos TProcessItem. Cada instância de TProcessItem disponibiliza informações e ações para o processo correspondente.

TAppInfo disponibiliza uma lista de programas rodando, similar a aba Aplicativos do Gerenciador de Tarefas do Windows. Esta lista é uma coleção de TWindowItem. Cada instância  disponibiliza informações sobre a janela correspondente.

Ambos os componentes podem atualizar suas listas automaticamente através da propriedade Interval .

Exemplos:
Como localizar um processo pelo nome:

var
  Process : TProcessItem;
begin
  Process := ProcessInfo1.RunningProcesses.FindByName('Project3.exe');
  if not Assigned(Process) then
    ShowMessage('No process found');
end;

Localizar processos que consomem mais memória que outros:

var
  I: Integer;
  MemSize,
  MaxMemSize : Cardinal;
  ProcessName : string;
begin
  MaxMemSize := 0;
  for I := 0 to ProcessInfo1.RunningProcesses.Count - 1 do
  begin
    MemSize := ProcessInfo1.RunningProcesses[i].MemoryInfo.WorkingSetSize;
    if MemSize > MaxMemSize then
    begin
      MaxMemSize := MemSize;
      ProcessName := ProcessInfo1.RunningProcesses[i].ExeFile;
    end;
  end;
  ShowMessage(ProcessName + ‘uses more memory than other processes.’);
end;

Finalizar um processo:

 var
  Process : TProcessItem;
begin
  Process := ProcessInfo1.RunningProcesses.FindByName('notepad.exe');
  if Assigned(Process) then
    Process.TerminateProcess;
end;

Links: