Présentation des assistants de classe (et d'enregistrement) Delphi

click fraud protection

Une fonctionnalité du langage Delphi a été ajoutée il y a quelques années dans Delphi 2005) appelé "Class Helpers" est conçu pour vous permettre d'ajouter de nouvelles fonctionnalités à une classe existante (ou à un enregistrement) en introduisant de nouvelles méthodes dans la classe (enregistrement).

Vous trouverez ci-dessous quelques idées supplémentaires pour les aides de classe + apprenez quand et quand ne pas utiliser les aides de classe.

Aide de classe pour...

En termes simples, un assistant de classe est une construction qui étend une classe en introduisant de nouvelles méthodes dans la classe d'assistance. Un assistant de classe vous permet d'étendre une classe existante sans la modifier ni en hériter.

Pour étendre la classe TStrings de la VCL, vous devez déclarer et implémenter un assistant de classe comme suit:

type
TStringsHelper = aide de classe pour TStrings. Publiqueune fonction Contient (const aString: string): booléen; fin; 

La classe ci-dessus, appelée "TStringsHelper" est un assistant de classe pour le type TStrings. Notez que TStrings est défini dans Classes.pas, une unité qui est par défaut disponible dans la clause uses pour tout

instagram viewer
Delphes l'unité du formulaire, par exemple.

La fonction que nous ajoutons au type TStrings à l'aide de notre assistant de classe est "Contient". L'implémentation pourrait ressembler à:

une fonction TStringsHelper. Contient (const aString: string): booléen; commencer
résultat: = -1 <> IndexOf (aString); fin; 

Je suis certain que vous avez utilisé plusieurs fois ce qui précède dans votre code - pour vérifier si certains descendants de TStrings, comme TStringList, ont une valeur de chaîne dans sa collection Items.

Notez que, par exemple, la propriété Items d'un TComboBox ou un TListBox est du type TStrings.

Après avoir implémenté TStringsHelper et une zone de liste sur un formulaire (nommé "ListBox1"), vous pouvez maintenant vérifier si une chaîne fait partie de la propriété Items de la zone de liste en utilisant:

si ListBox1.Items. Contient ('une chaîne') ensuite... 

Assistants de classe Go et NoGo

L'implémentation des aides de classe a des impacts positifs et certains (vous pourriez penser) négatifs sur votre codage.

En général, vous devez éviter d'étendre vos propres classes - comme si vous deviez ajouter de nouvelles fonctionnalités à vos propres classes personnalisées - ajoutez directement les nouveaux éléments dans l'implémentation de la classe - sans utiliser de classe assistant.

Les assistants de classe sont donc plus conçus pour étendre une classe lorsque vous ne pouvez pas (ou n'avez pas besoin) de compter sur l'héritage de classe normal et les implémentations d'interface.

Un assistant de classe ne peut pas déclarer des données d'instance, comme de nouveaux champs privés (ou des propriétés qui pourraient lire / écrire de tels champs). L'ajout de nouveaux champs de classe est autorisé.

Un assistant de classe peut ajouter de nouvelles méthodes (fonction, procédure).

Avant Delphi XE3, vous ne pouviez étendre que les classes et les enregistrements - les types complexes. À partir de la version Delphi XE 3, vous pouvez également étendre des types simples comme entier ou chaîne ou TDateTime, et avoir une construction comme:

var
s: chaîne; commencer
s: = 'Assistants Delphi XE3'; s: = s. Majuscule. Sens inverse; fin; 

J'écrirai sur l'aide de type simple Delphi XE 3 dans un avenir proche.

Où est mon assistant de classe

Une limitation à l'utilisation des assistants de classe qui pourraient vous aider à vous «tirer une balle dans le pied» est le fait que vous pouvez définir et associer plusieurs assistants à un seul type. Toutefois, seul zéro ou un assistant s'applique à un emplacement spécifique du code source. L'assistant défini dans la portée la plus proche s'applique. La portée de l'assistant de classe ou d'enregistrement est déterminée dans la normale Delphes mode (par exemple, de droite à gauche dans la clause d'utilisations de l'unité).

Cela signifie que vous pouvez définir deux assistants de classe TStringsHelper dans deux unités différentes, mais un seul s'appliquera lorsqu'il sera réellement utilisé!

Si un assistant de classe n'est pas défini dans l'unité où vous utilisez ses méthodes introduites - ce qui dans la plupart des cas le sera, vous ne savez pas quelle implémentation d'aide de classe vous utiliseriez réellement. Deux assistants de classe pour TStrings, nommés différemment ou résidant dans des unités différentes, peuvent avoir une implémentation différente pour la méthode "Contient" dans l'exemple ci-dessus.

Utiliser ou non?

Oui, mais soyez conscient des effets secondaires possibles.

Voici une autre extension pratique de l'assistant de classe TStringsHelper mentionné ci-dessus


TStringsHelper = aide de classe pour TStrings. privéune fonction GetTheObject (const un string: chaîne): TObject; procédure SetTheObject (const un string: chaîne; const Valeur: TObject); Publiquepropriété ObjectFor [const un string: chaîne]: TObject lis GetTheObject écrire SetTheObject; fin;... une fonction TStringsHelper. GetTheObject (const un string: chaîne): TObject; var
idx: entier; commencer
résultat: = néant; idx: = IndexOf (aString); si idx> -1 ensuite résultat: = Objets [idx]; fin; procédure TStringsHelper. SetTheObject (const un string: chaîne; const Valeur: TObject); var
idx: entier; commencer
idx: = IndexOf (aString); si idx> -1 ensuite Objets [idx]: = valeur; fin; 

Si vous avez été ajout d'objets à une liste de chaînes, vous pouvez deviner quand utiliser la propriété d'aide pratique ci-dessus.

instagram story viewer