Pregunta

Estoy escribiendo un experto en Delphi. Necesito poder escribir un valor en una propiedad en una propiedad que sea un objeto. P.ej. Tengo un GroupBox en el formulario y quiero editar la propiedad Margins.Left. Estoy usando el siguiente procedimiento para hacerlo, pero si aparece un AV en la línea marcada.

El procedimiento toma un componente del (editor de propiedades) el nombre de la propiedad (por ejemplo, 'Margins.Left') y el nuevo valor, analiza el nombre de la propiedad, busca el objeto, lee el valor actual e intenta cambiarlo si diferente. Luego llama a un método para registrar cualquier cambio.

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;
¿Fue útil?

Solución

Los márgenes.xyzzy son todas las propiedades de enteros, no las propiedades de Int64, por lo que necesita usar GetOrdProp / SetOrdProp para leerlos y modificarlos.

SetInt64Prop asume que es una propiedad de 64 bits e intenta llamar a la función de establecimiento de propiedades con un parámetro de 64 bits. Como el establecedor de propiedades espera un parámetro de 32 bits, no puede limpiar la pila correctamente y, por lo tanto, provoca el retorno de AV.

Puede indicar a qué funciones llamar de acuerdo con la llamada PropIsType.

  • tkInt64: Get / SetInt64Prop
  • tkInteger: Get / SetOrdProp
Las funciones

Get / SetOrdProp también se pueden usar para las propiedades Char y WideChar, por lo que supongo que es por eso que el nombre no es 100% obvio.

Otros consejos

¿Intentaste usar GetOrdProp, SetOrdProp en lugar de GetInt64Prop, SetInt64Prop?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top