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;
Était-ce utile?

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?

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