Nesta seção falaremos sobre bugs no Delphi. Não sobre os possíveis bugs que possamos cometer, mas literalmente sobre os bugs da linguagem Delphi. Achei interessante criar um tópico para cuidar deste assunto, pois nos deparamos com erros e limitações de programação diariamente. Uma seção falando sobre coisas realmente não são possíveis de serem feitas, ou de bugs na linguagem, pode economizar bastante tempo de depuração na hora em que nos deparamos com tais situações.

Nesta edição me limitei a falar sobre bugs encontrados na parte de manipulação de banco de dados, e que foram resolvidos com os últimos upgrades do Delphi 4.0 (4..01 e 4.02). não deixe de instalar estes patchs, pois a quantidade de problemas encontrados na versão 4.00 é muito grande. A seguir separei alguns destes erros (ou limitações), mostrando em qual patch ele foi solucionado:

No Delphi 4.00, muitos eventos do objeto TTABLE não são disparados de forma correta. Veja alguns deles:

  • Evento AfterScroll: Este evento não é chamado após um comando Locate; solucionado no patch 4.02.
  • Evento OnUpdateRecord: Cached Updates não disparam este evento. Solucionado no patch 4.02.
  • Eventos BeforeScroll e AfterScroll: não são disparados ao cancelar uma inserção, nem ao usar o método GotoCurrent. Solucionado no patch 4.02.

Outras falhas encontradas no uso do objeto TTABLE

Método LOCATE: Este foi o erro mais curioso que encontramos, pois ao executá-lo em campos do tipo DateTime, em alguns casos ele simplesmente não funciona. Segundo a empresa não há explicação, ele simplesmente não funciona, aleatoriamente. O mesmo acontece com consultas parametrizadas, usando o objeto Tquery: ao executar uma consulta que tenha um campo DateTime como parâmetro, na maioria das vezes ele funciona, mas nem sempre.

O método Locate apresenta também um erro muito curioso: ele não trabalha de forma consistente. Por exemplo, faça o seguinte teste: coloque em um form um objeto Ttable, um TdataSource, um TdbGrid e um Tbutton. Linke-os de forma correta.

Em seguida defina a propriedade DatabaseName do objeto Ttable para DBDEMOS e a propriedade TableName para Items.db.

No evento OnClick do Tbutton, digite:

Table1.SetRange(['1060'],['1060']);
Table1.locate('PartNo','11518',[]);

O registro não será encontrado.

Agora mude o código para:

table1.SetRange(['1005'],['1005']);
Table1.locate('PartNo','7612',[]);

E o registro será encontrado...

Mais uma vez, não houve explicação da Inprise sobre isto. Resolvido no patch 4.02.

Também há problemas ao usar o objeto Tquery. Vejamos alguns:

  • Propriedade CONSTRAINED: Esta propriedade não apresenta nenhuma funcionalidade no Delphi 4.0. No Delphi 3.0, apresenta Access Violation no arquivo IDAOI32DLL.
    Exemplo: na cláusula SQL: select from crientes where uf = ‘MG’. Caso tente entrar com uma variável diferente de ‘MG’ no campo uf, e a propriedade constainet estiver definida para TRUE, o Delphi 3.0 apresentará a mensagem de erro referida, e o Delphi 4.0 simplesmente irá ignorar. Resolvido no patch 4.01.
  • MS SQL Server: Ao executar uma stored procedure passando um parâmetro do tipo MONEY, o servidor gera um erro Resolvido no patch 4.01.
  • Componente Tsession:Ao deletar um componente TSESSION do formulário, as referências feitas nos objetos TdataBase ou TdataSet, não são removidas automaticamente. Ao tentar, por exemplo, alterar a propriedade AliasName do objeto DataBase, um access violation é disparado. Resolvido no patch 4.02.
  • Componente TdbCtrlGrid:Quando o objeto TdataSet associado é fechado e reaberto, o objeto não é redesenhado corretamente. Resolvido no patch 4.02.

Bom, chega de bugs para nós. Felizmente, todos encontrados aqui já foram resolvidos com os patchs do Delphi 4.0.