La propriété DoubleBuffered ajoutée dans la dfm de Delphi 2009 n'existe pas dans Delphi 2007

StackOverflow https://stackoverflow.com/questions/271843

  •  07-07-2019
  •  | 
  •  

Question

Est-ce que cela signifie que je ne peux pas partager de formulaire entre Delphes 2007 et 2009?

Était-ce utile?

La solution

Oui. Cela n'est possible que si vous supprimez du DFM les propriétés qui ne sont pas publiées dans Delphi 2007.

Autres conseils

DoubleBuffered est dans TWinControl depuis un certain temps maintenant. La différence dans Delphi 2009 est qu’elle est publiée maintenant. Si vous ne pouvez ignorer que les erreurs (et ne pas utiliser les propriétés au lieu de cela), voici une solution possible:

unit Delphi2009Form;

interface

uses
  Windows, Classes, SysUtils, Controls, Forms;

type
{$IFDEF VER200}
  TDelphi2009Form = class(TForm);
{$ELSE}
  TDelphi2009Form = class(TForm)
  private
    procedure ReaderError(Reader: TReader; const Message: string; var Handled: Boolean);
  protected
    procedure ReadState(Reader: TReader); override;
  end;

  TReaderErrorProc = procedure(const Message: string);

var
  ReaderErrorProc: TReaderErrorProc = nil;
{$ENDIF}

implementation

{$IFNDEF VER200}
type
  THackReader = class(TReader);

procedure TDelphi2009Form.ReaderError(Reader: TReader; const Message: string; var Handled: Boolean);
begin
  with THackReader(Reader) do
    Handled := AnsiSameText(PropName, 'DoubleBuffered') or AnsiSameText(PropName, 'ParentDoubleBuffered');
  if Handled and Assigned(ReaderErrorProc) then
    ReaderErrorProc(Message);
end;

procedure TDelphi2009Form.ReadState(Reader: TReader);
begin
  Reader.OnError := ReaderError;
  inherited ReadState(Reader);
end;
{$ENDIF}

end.

Modifiez ensuite les déclarations des formulaires de votre projet afin qu'elles héritent de TDelphi2009Form, par exemple:

.
type
  TFormMain = class(TDelphi2009Form)
  ...

Cela fonctionnera à l'exécution - les erreurs de propriété seront ignorées. Pour que cela fonctionne également au moment de la conception, créez également un package dédié à la conception, ajoutez designide.dcp à la clause require et ajoutez-lui l'unité suivante:

unit Delphi2009FormReg;

interface

uses
  Delphi2009Form;

procedure Register;

implementation

uses
  DesignIntf, DesignEditors, ToolsAPI;

procedure ShowReaderError(const Message: string);
begin
  with BorlandIDEServices as IOTAMessageServices do
    AddTitleMessage(Message);
end;

procedure Register;
begin
  RegisterCustomModule(TDelphi2009Form, TCustomModule);
  ReaderErrorProc := ShowReaderError;
end;

initialization

finalization
  ReaderErrorProc := nil;

end.

Installez le package dans l'IDE Delphi 2007 et les erreurs de propriété pour les propriétés DoubleBuffered et ParentDoubleBuffered seront automatiquement ignorées lors de l'ouverture de vos formulaires dans l'EDI. Les valeurs des propriétés seront perdues lorsque vous enregistrez le formulaire dans Delphi 2007, vous devez donc les initialiser dans le code.

MODIFIER : j'ai ajouté du code pour générer les messages d'erreur du lecteur dans la fenêtre Messages de l'EDI:

Messages d

Les projets Delphi ont toujours été extrêmement faciles à transférer dans de nouvelles versions. Vous devez être plus prudent, mais utiliser le code actuel avec des compilateurs plus anciens est également assez simple. J'ai conservé du code dans Delphi 2005/2006/2007 que d'autres personnes devaient encore utiliser dans Delphi 6 et 7.

Si vous supprimez les propriétés incompatibles des DFM, elles devraient fonctionner correctement dans les versions antérieures sans les gâcher pour Delphi 2009. L'exemple le plus intéressant est celui des propriétés explicites * introduites dans Delphi 2006. J'ai un nettoyeur DFM préparé à la maison. ; qui les dépouille. N'oubliez pas que ces propriétés existent pour une raison. Par conséquent, vous ne devriez effacer que celles dont vous envisagez la compatibilité avec les versions antérieures.

Vous pouvez également envisager d'investir dans des outils d'analyse de code statique tels que CodeHealer ou Pascal Analyzer. En plus de signaler les problèmes (en particulier CodeHealer) et de vous aider à nettoyer votre code, vous pouvez choisir la version de Delphi à analyser, facilitant ainsi la recherche d'incompatibilités en dehors des propriétés DFM. Et ils peuvent être automatisés dans le cadre de votre processus de construction.

Juste une note. Partagez le code source, mais conservez des projets distincts pour chaque version. Ceci est particulièrement important entre Delphi 2007 et Delphi 2009. Le fichier .dproj le plus récent utilise la même extension, mais n’est pas compatible avec Delphi 2007. Vous pouvez également rencontrer un problème avec des ressources incompatibles.

Chaque formulaire a un fichier dfm qui contient les paramètres de propriété du formulaire et de ses composants. Certaines valeurs de propriété ont des valeurs par défaut, elles ne sont donc pas stockées si la valeur par défaut est conservée. Vient de faire un petit test:

  • Créer un formulaire en 2009
  • Ajouter quelques contrôles standard
  • Enregistrez-le
  • Ouvrez-le en 2006 (désolé pas 2007 sur ce PC)

Et cela a fonctionné sans messages. Mais vous n’êtes peut-être pas aussi chanceux.

Avec Delphi, il est souvent un peu gênant de partager des données entre versions. Les possibilités de mise à niveau sont excellentes, mais le déclassement est gênant. Je déconseille donc de partager des fichiers de formulaire entre différentes versions.

Pour autant que je sache, il n'est pas possible d'ajouter des définitions conditionnelles dans le fichier dfm. Mais encore une fois, voulons-nous vraiment cela ... Je préférerais un mécanisme qui ignore les propriétés inconnues.

Vous pouvez ajouter en toute sécurité les propriétés du code dans votre méthode OnCreate pour le formulaire et en entourer un {$ IFDEF VER200} // NEW PROPERTIES {$ ENDIF}. Vous pouvez laisser DoubleBuffered en dehors des ifdefs, comme il était présent dans Delphi 2007, mais non disponible pour l'inspecteur de propriétés.

Vous devrez SEULEMENT vous soucier des propriétés que vous définissez différentes de celles par défaut. Pour le double tampon, vous devez vous inquiéter à ce sujet uniquement s'il est défini sur true.

Lors du chargement du formulaire Delphi 2009 dans Delphi 2007, vous recevrez un avertissement indiquant qu'une propriété va être détruite. Notez simplement ces propriétés, car il s'agit de celles que vous devez gérer.

J'utilise justement une telle méthode pour migrer mon code de Delphi 2006 vers Delphi 2009. La plupart de mes projets contiennent plusieurs unités partagées et doivent être compilés dans Delphi 2006 pour la version d’exportation et Delphi 2009 pour la " next " Libération. Je me sers également beaucoup de la {$ IFDEF UNICODE} définir les endroits où je dois assurer une chaîne de caractères, ou en fonction de la routine.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top