Delphi: Comment puis-je savoir ce que mon éditeur de propriété est l'édition?

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

  •  22-09-2019
  •  | 
  •  

Question

J'ai un éditeur de propriété (descendant de TPropertyEditor) qui est utilisé pour modifier une propriété.

Quand vient le temps de modifier ma propriété, comment puis-je savoir quelle propriété de quel objet je suis édition? Si je vais modifier une propriété, je dois savoir ce que je vais bien éditer.

J'ai tirais mes cheveux, passer au crible l'aide Delphi, l'aide en ligne, et le code source TPropertyEditor et descendant, et je ne peux pas trouver la réponse.

Je m'y attendais quelque chose comme:

TPropertyEditor = class(...)
public
    procedure Initialize(TheObject: TObject; ThePropertyName: string);
end;

Pour autant que je peux dire, mon éditeur de propriété est créée, et je vais dire à « Modifier », et je dois deviner ce que les biens qu'ils me voulaient modifier.


De l'aide:

  

Modification de la propriété dans son ensemble

     

Vous pouvez fournir en option une boîte de dialogue   boîte dans laquelle l'utilisateur peut visuellement   modifier une propriété. L'utilisation la plus courante   des éditeurs de propriété est parmi les biens immobiliers   qui sont eux-mêmes classes. Un   exemple est la propriété Font , pour   que l'utilisateur peut ouvrir une boîte de dialogue de police   case pour sélectionner tous les attributs de   la police à la fois.

     

Fournir un   boîte de dialogue de l'éditeur tout-propriété,   remplacer la classe propriété éditeur de    Modifier le mode .

     

Modifier les méthodes utilisent la même   Méthodes get et set utilisés par écrit    GetValue et SetValue méthodes. Dans   fait, un Modifier le mode appelle à la fois un Get   méthode et une méthode Set. Parce que le   éditeur est spécifique de type, il y a   généralement pas nécessaire de convertir les   la valeur des propriétés à cordes. L'éditeur   traite généralement avec la valeur « comme   récupéré. »

     

Lorsque l'utilisateur clique sur le bouton « ... »   à côté de la propriété ou double-clics   la colonne de valeur, l'inspecteur d'objets   appelle l'éditeur de propriété Modifier   méthode.

     

Dans votre mise en œuvre de    Modifier méthode, procédez comme suit:

     
      
  1. Construire l'éditeur que vous utilisez   pour la propriété.
  2.   
  3. Lire le courant   la valeur et l'affecter à la propriété   en utilisant une méthode Get.
  4.   
  5. Lorsque l'utilisateur   sélectionne une nouvelle valeur, attribuer cette valeur   à la propriété en utilisant une méthode Set.
  6.   
  7. Détruire l'éditeur.
  8.   

Réponse

Il est à l'écart, et non documenté, mais j'ai trouvé comment. La propriété que je suis édition que modifier i:

TheCurrentValue := TMyPropertyThing(Pointer(GetOrdValue));

Maintenant que j'ai la valeur, je peux le modifier. Si je veux remplacer la propriété avec un autre objet:

SetOrdValue(Longint(TheNewValue));

Le code complet:

Créer un éditeur de propriétés qui descend de TClassProperty :

TMyPropertyEditor = class(TClassProperty)
public
   procedure Edit; override;
   function GetAttributes: TPropertyAttributes; override;
end;

Le premier est le ménage, dit l'inspecteur d'objets de Delphi que mon éditeur de propriétés affiche une boîte de dialogue, ce qui fera un « ... » apparaissent à côté de la propriété:

function TMyPropertyEditor.GetAttributes: TPropertyAttributes;
begin
   //We show a dialog, make Object Inspector show "..."
   Result := [paDialog];
end;

Ensuite est le travail réel. Lorsque l'utilisateur clique sur le bouton « ... », l'inspecteur d'objets appelle mon Modifier le mode . L'astuce que je manque que j'appelle ma méthode GetOrdValue . Même si ma propriété est pas ordinal , vous utilisez encore, et juste jeté la chose résultant à un objet:

procedure TMyPropertyEditor.Edit;
var
   OldThing: TMyPersistentThing;
   NewThing: TMyPersistentThing;
begin
   //Call the property's getter, and return the "object" i'm editing:
   OldThing:= TMyPersistentThing(Pointer(GetOrdValue));

   //now that i have the thing i'm editing, do stuff to "edit" it
   DoSomeEditing(OldThing);


   //i don't have to, but if i want to replace the property with a new object
   //i can call the setter:
   NewThing := SomeVariant(OldThing);
   SetOrdValue(Longint(NewThing));
end;
Était-ce utile?

La solution

Si je comprends bien votre question à droite, vous vous demandez comment vous êtes censé trouver réellement la valeur que vous devez être l'édition, surtout si l'objet en question contient plus d'un d'entre eux. La réponse est que l'IDE établit que pour vous et l'éditeur de propriété est « pré-chargé » par le Time Edit est appelée. TPropertyEditor est livré avec un tas de méthodes GetValue que votre fonction d'édition peut utiliser pour récupérer la valeur. Ou si ce n'est pas un de ces types, (si elle est un objet est descendu de TPersistent, par exemple), vous pouvez appeler GetOrdValue et jeter le résultat à un TPersistent.

En outre, vous pouvez vérifier TJvPersistentPropertyEditor dans l'unité JvDsgnEditors du JVCL à utiliser comme une classe de base. Il offre certaines des fonctionnalités pour vous.

BTW si vous avez vraiment besoin, vous pouvez utiliser la méthode GetName, qui vous donnera le nom de la propriété, mais vous devez généralement pas à. Et soyez prudent si vous héritez d'autre chose que TPropertyEditor lui-même, comme GetName est virtuel et peut être surpassée.

Autres conseils

Un éditeur de propriété conserve les informations sur les objets et les propriétés, il est l'édition dans la variable FPropList privée. L'IDE remplit que en appelant la méthode de SetPropEntry de votre éditeur. Vous êtes alors généralement censé appeler les différentes méthodes de TPropertyEditor pour savoir les valeurs des propriétés.

Il est pas vraiment censé importance quelle propriété vous a demandé de modifier. Votre éditeur de propriétés édite les propriétés d'un type particulier. Pour en place l'édition, l'éditeur fournit une implémentation de SetValue qui se traduit par la chaîne de l'inspecteur d'objets en une valeur du type approprié pour la propriété, puis vous appelez la fonction Set appropriée, comme SetOrdValue ou SetIntfValue. Pour l'édition entière propriété, l'IDE ne sera pas appeler SetValue. Au lieu de cela, il appellera Edit, et vous êtes censé appeler GetOrdValue ou GetIntfValue (par exemple) vous-même, puisque votre éditeur sait déjà ce type de propriété, il est conçu pour modifier.

Rappelez-vous que les éditeurs de propriétés, en général, peuvent modifier plusieurs propriétés en même temps. nom de la propriété sera la même pour tous, mais le type de composant auquel ils appartiennent peut varier, et donc peuvent donc leurs accesseurs. Appelez votre éditeur de propriétés de la méthode GetName pour connaître le nom. Pour obtenir les objets, appelez GetComponent pour chaque indice de 0 à PropCount - 1. (attention,. Il n'y a pas de vérification de gamme dans les fonctions de Get) Vous pouvez également vérifier si un objet spécifique est dans la liste en appelant HasInstance. La méthode GetPropInfo vous indiquera le pointeur de PPropInfo pour la premier propriété, mais je ne pense pas que ce sera nécessairement égal aux pointeurs de toutes les autres propriétés. Mis à part cela, vous ne recevez pas un accès direct aux données de PPropInfo, mais encore une fois, il ne devrait vraiment pas d'importance. Si vous pensez que vous avez besoin pour que votre éditeur, vous êtes probablement faire quelque chose de mal; poster une nouvelle question avec des informations plus spécifiques sur votre tâche sous-jacente.

Les éditeurs de propriétés ne se soucient que (et sont enregistrées pour) le type de la propriété, et non la propriété spécifique lui-même.

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