2012-02-11 2 views
3

J'essaie de comprendre comment déclarer à la fois un enregistrement et un nombre d'événements d'objets qui s'utilisent mutuellement. Le problème est quelle que soit la façon dont je les déclare, j'ai un "identifiant non déclaré". Donc avec le code ci-dessous, est-ce que je peux les amener à s'utiliser les uns les autres? Les événements seront utilisés dans un objet et l'enregistrement sera transmis et utilisé dans le constructeur de l'objet.Comment déclarer un enregistrement contenant des événements qui utilisent l'enregistrement comme paramètre

TMyEvent = procedure(Sender: TObject; var Rec: TMyRecord) of object; 

    TMyRecord = record 
    OnMyEvent: TMyEvent; 
    end; 

Est-ce possible? Il doit fonctionner dans toutes les versions de Delphi 7 et plus.

+2

+1. BTW: La variable avant Rec: PMyRecord n'est pas nécessaire, à moins que votre code de gestion d'événement alloue un nouvel enregistrement et l'affecte à 'Rec'. C'est la même chose que lorsque vous passez un objet; par exemple, si vous voulez passer un 'TStringList' dans une procédure et lui ajouter des chaînes supplémentaires, vous n'avez pas besoin d'utiliser' var SList: TStringList', mais vous pouvez utiliser 'const SList: TStringList' à la place. –

+0

@jerry vous avez accepté la réponse trop rapidement –

+0

@DavidHeffernan Je ne pense pas que je l'ai fait, car il a parfaitement résolu mon problème, et l'autre réponse que je ne peux pas utiliser. Juste, je n'ai rien mentionné d'être compatible avec toutes les versions jusqu'à 7. –

Répondre

3

Malheureusement avant les déclarations ne sont autorisées que pour les classes, mais pas les enregistrements, la seule façon que je connaisse est d'utiliser des pointeurs:

PMyRecord = ^TMyRecord; 

TMyEvent = procedure(Sender: TObject; Rec: PMyRecord) of object; 

TMyRecord = record 
    OnMyEvent: TMyEvent; 
end; 
+1

Le 'var' avant Rec: PMyRecord n'est pas nécessaire, à moins que votre code de gestion d'événement change l'adresse de' Rec'. Vous pouvez changer le contenu de l'enregistrement sans cela. –

+1

Si je devais le faire, j'aurais juste fait un cours plutôt qu'un disque. –

+0

Cela fonctionne parfaitement parce que j'utilise déjà cet enregistrement comme pointeur dans certains endroits. –

14

Si vous utilisez une version plus récente Delphi, vous pouvez déclarer des types dans les enregistrements. Voici comment vous pouvez référencer l'enregistrement de votre événement:

type 
    TMyRecord = record 
    public type 
    TMyEvent = procedure (Sender: TObject; var Rec: TMyRecord) of object; 
    public 
    OnMyEvent: TMyEvent; 
    end; 
+1

+1 Ceci est la meilleure solution ici. Une chose que je trouve limitée pour le moment est l'impossibilité d'avoir des références pour les enregistrements lorsque j'utilise la surcharge de l'opérateur. Je veux rec A pour avoir des ops qui fonctionnent sur Rec B, et vice versa. Ce n'est pas possible pour le moment dans la langue. Mais cela pourrait facilement être. Les opérandes sont passés en tant que pointeurs de sorte que la mise en page n'est pas nécessaire pour être connue au moment de la déclaration. –

+0

Addendum: Je me rends compte que je peux mettre tous mes ops dans le dernier disque déclaré, mais je préfère parfois les placer là où ils appartiennent le plus naturellement. –

+0

+1 C'est vraiment génial de savoir, sauf a) J'aurais dû mentionner la compatibilité jusqu'à D7, et b) J'ai besoin d'utiliser ce type d'événement ailleurs –

Questions connexes