Artigo técnico

Definir o formato de TDateTimePicker no Delphi 5

· Programação Delphi

Ao adicionar compatibilidade com Delphi 5 a um exemplo VCL antigo, o projeto falhou em uma linha que é perfeitamente normal em versões mais novas do Delphi. O código tentou atribuir um padrão de data personalizado diretamente à propriedade TDateTimePicker.Format.

1
DateTimePicker.Format := 'MM/dd/yyyy';

TDateTimePicker é um wrapper VCL em torno do controle comum do Windows. Versões mais novas do Delphi expõem uma propriedade conveniente Format, mas o Delphi 5 não. No Delphi 5 e anteriores, o controle normalmente segue as configurações regionais de data do Windows, a menos que a mensagem do controle comum subjacente seja enviada diretamente.

Use a API do controle comum no Delphi 5

A correção de compatibilidade é chamar DateTime_SetFormat da unit CommCtrl para Delphi 5, mantendo a atribuição direta da propriedade para compiladores mais novos. Adicione CommCtrl à cláusula uses ao compilar o branch Delphi 5.

1
2
3
4
5
{$IFDEF D5}
DateTime_SetFormat(DateTimePicker.Handle, PChar('MM/dd/yyyy'));
{$ELSE}
DateTimePicker.Format := 'MM/dd/yyyy';
{$ENDIF}

Notas práticas

A string de formato usa a sintaxe do date-time picker do Windows, não todos os tokens de formatação do Delphi. Mantenha o padrão simples e teste em uma máquina com configurações regionais diferentes se a aplicação será implantada internacionalmente.

Se você mantém código de exemplo compartilhado entre Delphi 5, Delphi 6 e versões modernas do Delphi, isole esse branch atrás de um símbolo do compilador como D5. Isso mantém o código moderno legível e ainda documenta o workaround antigo do controle comum.

Checklist de compatibilidade

  • Adicione CommCtrl apenas onde o branch Delphi 5 precisa de DateTime_SetFormat.
  • Passe o handle do picker, não o handle do form.
  • Mantenha a string de formato viva durante a chamada passando um literal de string normal ou uma variável estável.
  • Verifique a data exibida na localidade Windows de destino.

Por que ShortDateFormat não basta

Alterar as variáveis globais de formato de data do Delphi não muda de forma confiável um date-time picker apoiado no controle comum do Windows. O picker renderiza de acordo com as configurações do controle e as mensagens que recebe. Por isso DateTime_SetFormat é a camada de compatibilidade correta para Delphi 5.

Essa distinção importa em projetos de exemplo antigos porque eles frequentemente são compilados em várias versões do Delphi. Uma linha limpa no Delphi 7 ou Delphi 2009 pode não existir no Delphi 5, enquanto uma mensagem do controle comum do Windows ainda pode estar disponível. A compilação condicional permite que cada compilador use o caminho mais natural.

Testando compatibilidade com versões antigas

Depois de aplicar o workaround, teste tanto o valor exibido quanto o valor salvo. O formato afeta o que o usuário vê; ele não deve alterar o valor TDateTime subjacente usado por cálculos. Essa separação é importante em pedidos de compra, faturas e exportações para planilhas, onde a formatação exibida e os valores numéricos de data devem permanecer consistentes.

Verifique também o form depois de recriar o handle da janela. Alguns controles VCL podem perder estado nativo se o handle for destruído e criado novamente. Se sua aplicação altera estilos ou parents em runtime, aplique o formato depois que o handle estiver disponível.

Nota de manutenção de longo prazo

Quando um projeto não precisar mais de suporte ao Delphi 5, remova o branch condicional e mantenha a atribuição direta da propriedade Format. Até lá, mantenha o código de compatibilidade perto da configuração do controle, em vez de escondê-lo em lógica de negócio sem relação. Isso deixa claro que o workaround existe por uma limitação do controle VCL, não pelo cálculo do pedido de compra.