J'implémente une fonctionnalité Boilerplate - permet aux utilisateurs de modifier les descriptions de certains composants - comme TLabel
s - lors de l'exécution. par exemple.Delphi obtient la valeur des propriétés des composants de formulaire
TFooClass = Class (TBaseClass)
Label : Tlabel;
...
End;
Var FooClass : TFooClass;
...
Au moment de la conception, la valeur de la propriété de la légende de l'étiquette est de dire - « Prénom », lorsque l'application est exécutée, il existe une fonctionnalité qui permet à l'utilisateur de changer la légende valeur à dire 'autre nom'. Une fois que cela est modifié, la légende de l'étiquette pour l'instance de classe de FooClass est mise à jour immédiatement. Le problème est maintenant si l'utilisateur pour une raison quelconque veut revenir à la valeur de conception de dire «Prénom», il semble impossible.
Je peux utiliser les méthodes RTTIContext et tout cela, mais je à la fin de la journée, il semble d'exiger que l'instance de la classe pour moi de changer la valeur et puisque ce a déjà changé - il me semble avoir heurté un mur de briques.
Ma question est - est-il un moyen en utilisant les anciennes méthodes RTTI ou les nouveautés RTTIContext à la propriété d'un membre de la classe sans instancier la classe - à savoir obtenir la propriété de la définition ClassType.
Ceci est extrait de code de ma tentative de le faire:
c : TRttiContext;
z : TRttiInstanceType;
w : TRttiProperty;
Aform : Tform;
....
Begin
.....
Aform := Tform(FooClass);
for vCount := 0 to AForm.ComponentCount-1 do begin
vDummyComponent := AForm.Components[vCount];
if IsPublishedProp(vDummyComponent,'Caption') then begin
c := TRttiContext.Create;
try
z := (c.GetType(vDummyComponent.ClassInfo) as TRttiInstanceType);
w := z.GetProperty('Caption');
if w <> nil then
Values[vOffset, 1] := w.GetValue(vDummyComponent.ClassType).AsString
.....
.....
....
....
Je me fais toutes sortes d'erreurs et toute aide sera grandement appréciée.
Vous avez parfaitement raison de ce que j'essaie de faire. Mon problème est -J'ai beaucoup de formes et je suis sûr que l'implémentation de TDictionary va gonfler la taille de l'application. Afin de le rendre persistant, je suis en train de stocker la valeur modifiée dans une base de données - il se peut que je doive créer une colonne pour stocker la valeur d'origine avant toute modification de la valeur. Je pense toujours que le pointeur ClassInfo aurait les valeurs des valeurs de temps de conception pour les contrôles bien. –
@Kayode: Le pointeur ClassInfo ne peut pas avoir des valeurs de conception pour les objets, car ils n'appartiennent pas aux classes, ils appartiennent à des instances spécifiques. Par exemple, que se passe-t-il si vous avez deux TLabels différents sur un formulaire, avec deux légendes différentes? Lequel voulez-vous qu'il stocke? –
Je pensais en fait à obtenir le classinfo du propriétaire qui encapsule ces contrôles, donc j'ai deux contrôles TLabel au moment du design, leur état de conception serait encapsulé dans ClassInfo pour la classe Owner. –