Articolo tecnico

Impostare il formato di TDateTimePicker in Delphi 5

· Programmazione Delphi

Durante l’aggiunta della compatibilità con Delphi 5 a un vecchio esempio VCL, il progetto si è fermato su una riga perfettamente normale nelle versioni Delphi più recenti. Il codice cercava di assegnare un pattern di data personalizzato direttamente alla proprietà TDateTimePicker.Format.

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

TDateTimePicker è un wrapper VCL intorno al controllo comune di Windows. Le versioni Delphi più nuove espongono una comoda proprietà Format, ma Delphi 5 no. In Delphi 5 e precedenti, il controllo normalmente segue le impostazioni regionali di data di Windows, a meno che il messaggio del controllo comune sottostante non venga inviato direttamente.

Usare l’API del controllo comune per Delphi 5

La correzione di compatibilità consiste nel chiamare DateTime_SetFormat dall’unità CommCtrl per Delphi 5, mantenendo l’assegnazione diretta della proprietà per i compilatori più nuovi. Aggiungi CommCtrl alla clausola uses quando compili il ramo Delphi 5.

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

Note pratiche

La stringa di formato usa la sintassi del date-time picker di Windows, non tutti i token di formattazione Delphi. Mantieni il pattern semplice e testalo su una macchina con impostazioni regionali diverse se l’applicazione verrà distribuita a livello internazionale.

Se mantieni codice di esempio condiviso tra Delphi 5, Delphi 6 e versioni moderne di Delphi, isola questo ramo dietro un simbolo del compilatore come D5. Così il codice moderno resta leggibile e il vecchio workaround del controllo comune rimane documentato.

Checklist di compatibilità

  • Aggiungi CommCtrl solo dove il ramo Delphi 5 richiede DateTime_SetFormat.
  • Passa l’handle del picker, non l’handle del form.
  • Mantieni viva la stringa di formato per la durata della chiamata passando un normale literal stringa o una variabile stabile.
  • Verifica la data visualizzata nella locale Windows di destinazione.

Perché ShortDateFormat non basta

Cambiare le variabili globali del formato data di Delphi non modifica in modo affidabile un date-time picker basato sul controllo comune di Windows. Il picker viene renderizzato in base alle impostazioni del controllo e ai messaggi ricevuti. Ecco perché DateTime_SetFormat è il corretto livello di compatibilità per Delphi 5.

Questa distinzione conta nei vecchi progetti di esempio perché spesso vengono compilati con più versioni di Delphi. Una riga pulita in Delphi 7 o Delphi 2009 potrebbe non esistere in Delphi 5, mentre un messaggio del controllo comune di Windows può ancora essere disponibile. La compilazione condizionale permette a ogni compilatore di usare il percorso più naturale.

Testare la compatibilità con vecchie versioni

Dopo aver applicato il workaround, testa sia il valore visualizzato sia quello salvato. Il formato influisce su ciò che vede l’utente; non dovrebbe cambiare il valore TDateTime sottostante usato dai calcoli. Questa separazione è importante in ordini, fatture ed esportazioni verso fogli di calcolo, dove formato visivo e valori numerici delle date devono restare coerenti.

Controlla anche il form dopo la ricreazione dell’handle finestra. Alcuni controlli VCL possono perdere lo stato nativo se l’handle viene distrutto e creato di nuovo. Se l’applicazione cambia stili o parent a runtime, applica il formato dopo che l’handle è disponibile.

Nota di manutenzione a lungo termine

Quando un progetto non richiede più il supporto Delphi 5, rimuovi il ramo condizionale e mantieni l’assegnazione diretta alla proprietà Format. Fino ad allora, tieni il codice di compatibilità vicino alla configurazione del controllo invece di nasconderlo in logica di business non correlata. Questo chiarisce che il workaround esiste per una limitazione del controllo VCL, non per il calcolo dell’ordine di acquisto.