Question

Pour éviter les singletons et les variables globales, j'aimerais pouvoir transmettre des paramètres à un composant TFrame. Cependant, étant donné que TFrame est normalement inclus dans le formulaire au moment de la conception, il n’est possible d’utiliser que le constructeur par défaut.

Le formulaire parent peut bien sûr définir certaines propriétés dans le rappel OnCreate après la création de TFrame. Cependant, cela ne garantit pas qu’une propriété n’est pas oubliée et que les dépendances ne sont pas aussi claires que l’utilisation d’un constructeur.

Une solution intéressante serait de pouvoir enregistrer une usine pour la création de composants pendant la lecture du fichier dfm. Ensuite, les paramètres requis pourraient être transmis au constructeur TFrame lors de leur création par la fabrique. Y a-t-il un moyen d'accomplir cela?

Ou quelqu'un a-t-il une meilleure solution pour passer des paramètres à un TFrame?

Était-ce utile?

La solution

Tous les composants, y compris les descendants de TFrame , doivent pouvoir être construits à l'aide du constructeur hérité de TComponent . Sinon, ils ne peuvent pas être utilisés correctement au moment de la conception. Si la restriction d'utilisation au moment de la conception vous semble acceptable, vous pouvez remplacer ce constructeur et générer une exception. Cela empêcherait le composant d'être placé sur un formulaire au moment du design. Fournissez simplement un autre constructeur nécessitant d’autres paramètres.

En raison de la configuration requise, tous les composants doivent pouvoir exister, certaines ou toutes leurs propriétés conservant leurs valeurs par défaut. Cela ne signifie pas que les composants doivent faire des choses utiles lorsqu'ils sont dans cet état, mais ils doivent pouvoir rester dans cet état indéfiniment. Par exemple, il convient de placer un composant sur une fiche, d'enregistrer la fiche et de fermer Delphi, dans le but de reprendre la conception de la fiche ultérieurement. Le composant doit se permettre d’être enregistré et restauré, même si toutes ses propriétés n’ont pas encore été définies pour une utilisation finale.

Mon option préférée consiste à appliquer les règles du composant uniquement au moment de l'exécution. Vérifiez que toutes les propriétés sont définies sur des valeurs sensibles avant de les autoriser. Vous pouvez utiliser des assertions pour imposer l'utilisation correcte de vos composants. Les consommateurs de vos cours apprendront très vite s’ils n’ont pas fini de configurer vos composants sur leurs formulaires.

Autres conseils

J'ajouterais normalement une "initialisation" publique et non virtuelle. ou (procédure d'initialisation aux Américains) qui requiert la fourniture de tous les paramètres. Cela définira ensuite les propriétés.

Assurez-vous que les propriétés sont protégées ou privées si possible, de sorte que la seule manière de les définir consiste à appeler Initialise (AFoo, ABar: entier).

Puis, dans TFormXXX.FormCreate ou TformXXX.Create, avez:

inherited;
Initialise(foo, bar);

pourriez-vous créer / registercomponent votre propre composant tFrame et placez-le sur le formulaire - il peut créer n'importe quoi.

Si une fabrique peut fournir les paramètres dont vous avez besoin, pourquoi ne pas simplement remplacer le constructeur par défaut de votre cadre et demander des paramètres à la classe fabrique?

Je fabrique généralement mon propre constructeur. Je n'aime pas quand même créer des cadres à la conception.

a) une image peut être créée dynamiquement si nécessaire et détruite si non nécessaire

b) attribuez au cadre une propriété publique avec le type de données du paramètre ou une structure de données, puis transmettez les valeurs au formulaire par le biais de la propriété.

Exemple:
TAddress - une classe pour contenir les éléments habituels d'une adresse.
TAddressFra - un cadre avec les contrôles visuels pour afficher l'adresse

  • remplir une instance de TAddress avec des valeurs
  • créer une instance de TAddressFra
  • assigne la propriété TAddressFra.address à l'instance TAddress
  • utilisez la procédure setAddress (o_address: TAddress) pour affecter les valeurs des attributs TAddress aux composants visuels correspondants du TAddressFra
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top