Question
J'écris un expert de Delphi. Je dois pouvoir écrire une valeur sur une propriété sur une propriété qui est un objet. Par exemple. J'ai un GroupBox sur le formulaire et je veux éditer la propriété Margins.Left. J'utilise la procédure suivante pour le faire, mais donne un AV sur la ligne marquée.
La procédure prend un composant de (l'éditeur de propriétés) le nom de la propriété (par exemple 'Margins.Left') et la nouvelle valeur, analyse le nom de la propriété, récupère l'objet, lit la valeur actuelle et tente de la modifier si différent. Il appelle ensuite une méthode pour enregistrer toutes les modifications.
procedure EditIntegerSubProperty(Component: IOTAComponent;const PropName: String;NewValue: Integer);
var AnObject: TObject;
TK: TTypeKind;
At: Integer;
AClassName, APropName: String;
PropInfo: PPropInfo;
OldValue: Integer;
begin
At := Pos('.', PropName);
if At < 1 then
raise Exception.Create('Invalid SubProperty Name: '+PropName);
AClassName := Copy(PropName, 1, At-1);
APropName := Copy(PropName, At+1, length(PropName));
TK := Component.GetPropTypeByName(AClassName);
if TK <> tkClass then
EXIT;
AnObject := GetObjectProp((Component as INTAComponent).GetComponent, AClassName);
if PropIsType(AnObject, APropName, tkInteger) then
begin
OldValue := GetInt64Prop(AnObject, APropName);
if OldValue <> NewValue then
begin
SetInt64Prop(AnObject, APropName, NewValue); <----AV HERE
ChangeLogInteger(Name, PropName, OldValue, NewValue);
end;
end;
end;
La solution
Margins.xyzzy sont toutes des propriétés Integer, et non des propriétés Int64. Vous devez donc utiliser GetOrdProp / SetOrdProp pour les lire et les modifier.
SetInt64Prop suppose qu'il s'agit d'une propriété 64 bits et tente d'appeler la fonction de définition des propriétés avec un paramètre 64 bits. Dans la mesure où le configurateur de propriétés attend un paramètre 32 bits, il ne parvient pas à nettoyer correctement la pile et provoque ainsi le retour de l'AV.
Vous pouvez indiquer les fonctions à appeler en fonction de l'appel PropIsType.
- tkInt64: Get / SetInt64Prop
- tkInteger: Get / SetOrdProp
Les fonctions Get / SetOrdProp peuvent également être utilisées pour les propriétés Char et WideChar, ce qui explique pourquoi le nom n'est pas évident à 100%.
Autres conseils
Avez-vous essayé d'utiliser GetOrdProp, SetOrdProp au lieu de GetInt64Prop, SetInt64Prop?