Nov 28 2006

Delphi: WinExec, ShellExecute ou CreateProcess?

Autor: Marcos Dell Antonio - Categorias: Delphi

Quando preciso executar uma aplicação externa através de um executável, posso escolher entre esses três recursos (comandos): WinExec, ShellExecute ou CreateProcess.

Qual a diferença entre eles? O Fundão responde.

Resumidamente:

  • WinExec: simples, porém não recomendado pela própria Microsoft, pois pode ser que futuramente não estará mais disponível;
  • ShellExecute: utilizado quando existe a necessidade de abrir um arquivo conforme sua extensão. Também pode ser usado para rodar um executável qualquer;
  • CreateProcess: o substituto do WinExec e, certamente, a melhor opção. Possui uma lista gigante de parâmetros, mas muitos deles não são utilizados e podem ser passados como nil ou 0 (zero). Veja um exemplo deste comando aqui.

Para saber mais sobre este e outros comandos, não deixe de conferir as sugestões de livros sobre Delphi que eu elaborei.

É isso aí. Até +!

Comentários 12 comentários

Oct 26 2006

Migrando do SQL Direct 2.x para o 4.x

Autor: Marcos Dell Antonio - Categorias: Delphi

Nessa semana tive a oportunidade de migrar uns sistemas que utilizavam o SQL Direct 2.x para a versão 4.x.

Só para deixar registrado, segue abaixo uma lista de “problemas” que encontrei:

- Propriedade Preservation

A propriedade Preservation foi removida dos componentes TSDQuery. Desta forma, os DFMs que declaravam ela tiverem que ser atualizados. Bastou abrir o form e o Delphi já identificou o erro exibindo a seguinte mensagem:

Como pode ser visto, basta clicar em Ignore para que o próprio Delphi remova as referências à propriedade Preservation;

- UpdateObject

Muitas rotinas de acesso ao banco de dados faziam o seguinte:

1 ordensServico.First; 2 while (not(ordensServico.Eof)) do 3 begin 4 if (...) then 5 ordensServico.Delete 6 else 7 ordensServico.Next; 8 end;

Depois da atualização, para utilizar o Delete precisei definir a propriedade UpdateObject da TSDQuery, caso contrário o seguinte problema ocorria:

Já que toda a criação de queries passa por uma rotina de uma classe base, a alteração foi simples:

1 class procedure TFuncoesClass.CriaQuery(var query: TSDQuery; 2 dataBase: TSDDatabase; useUpdateSQL: boolean); 3 begin 4 query := TSDQuery.Create(nil); 5 query.DatabaseName := dataBase.DatabaseName; 6 query.SessionName := dataBase.Session.SessionName; 7 8 if (useUpdateSQL) then 9 query.UpdateObject := TSDUpdateSQL.Create(nil); 10 11 query.Close; 12 query.SQL.Clear; 13 end;

A rotina antiga não tinha o parâmetro useUpdateSQL e, conseqüentemente, as linhas 8 e 9 também não.

Uma observação interessante a ser feita é que não é necessário definir nenhum comando SQL para o objeto TSDUpdateSQL. O simples fato de atribuí-lo à query já resolve o problema.

- Método TDBSession.GetTableFieldNames

O método GetTableFieldNames da classe TDBSession teve seu nome alterado para GetFieldNames. Isso gerou um erro de compilação. No entanto, foi corrigido facilmente, pois os parâmetros continuam os mesmos.

Concluindo, a atualização para a versão 4.x foi razoavelmente simples. Em 1 dia os sistemas já estavam rodando e executando todas as funções sem problema algum.

É isso aí! T+

Comentários Faça o seu comentário

Oct 17 2006

Comportamento dos eventos OnExit e OnClick

Autor: Marcos Dell Antonio - Categorias: Delphi

Depois de alguns testes utilizando o componente TComboEdit do Delphi 6, descobri comportamentos diferentes para situações parecidas.

O foco dos testes foi verificar a execução do evento OnExit de um ComboEdit antes do OnClick de três tipos de botões: TBitBtn, TSpeedButton e TToolButton.

A figura abaixo representa melhor o problema:

A dúvida: ao sair do ComboEdit clicando diretamente sobre um dos três botões, qual evento será executado: o OnClick do botão clicado ou o OnExit do ComboEdit?

A resposta: depende do botão clicado.

Ao clicar no ToolButton (indicado como Toolbar na figura) ou no SpeedButton, o evento disparado é o OnClick. Parece estranho, mas nenhum desses dois botões pode receber foco, por isso se um deles for clicado, o OnClick é disparado e o OnExit não será chamado, pois o foco permanecerá no ComboEdit.

Já se o botão clicado for o BitBtn, o evento OnExit do ComboEdit será executado e o BitBtn receberá o fóco.

A princípio isso não deveria acarretar em um grande problema. Entretanto, se existir uma implementação no OnExit do ComboEdit que deve ser executada antes do OnClick do ToolButton, certamente vai dar pau!

É isso ae! T+ :D

Comentários Faça o seu comentário

« Página anterior