Pregunta

Tengo un editor de propiedades (descendiente de TPropertyEditor) que se utiliza para editar una propiedad.

Cuando llega el momento de editar mi propiedad, ¿cómo sé qué propiedad de qué objeto estoy editando?Si voy a editar una propiedad, tengo que saber qué propiedad estoy editando.

Me he estado arrancando los pelos, revisando la ayuda de Delphi, la ayuda en línea y TPropertyEditor y el código fuente descendiente, y no puedo encontrar la respuesta.

esperaba algo como:

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

Por lo que puedo decir, se crea mi editor de propiedades y se me indicará que "Edite", y solo tengo que adivinar qué propiedad querían que editara.


De la ayuda:

Editar la propiedad en su conjunto

Opcionalmente puede proporcionar un diálogo cuadro en el que el usuario puede visualmente editar una propiedad.El uso más común de editores de propiedades es para propiedades que son en sí mismas clases.Un ejemplo es el Fuente bienes inmuebles, para que el usuario puede abrir un diálogo de tipo de letra cuadro para elegir todos los atributos de la fuente a la vez.

Para proporcionar una cuadro de diálogo editor de propiedades completas, sobreescribir la clase de editor de propiedades Editar método.

Editar métodos utilizan el mismo Get and Set métodos utilizados en la escritura Obtener valor y Valor ajustado métodos.En hecho, un Editar método llama tanto a un Get método y un método Set.Porque el editor es específico de tipo, hay por lo general no hay necesidad de convertir el valores de propiedades a cadenas.El editor generalmente se ocupa del valor “como recuperado.”

Cuando el usuario hace clic en el botón ‘...’ al lado de la propiedad o doble clic la columna de valor, el Inspector de objetos llama al editor de propiedades Editarmétodo.

Dentro de su implementación del Editar método, siga estos pasos:

  1. Construya el editor que está utilizando para la propiedad.
  2. Leer la actual valor y asignarlo a la propiedad usando un método Get.
  3. Cuando el usuario selecciona un nuevo valor, asigna ese valor a la propiedad usando un método Set.
  4. Destruye el editor.

Respuesta

Está escondido y no está documentado, pero descubrí cómo.La propiedad que estoy editando que edito:

TheCurrentValue := TMyPropertyThing(Pointer(GetOrdValue));

Ahora que tengo el valor, puedo editarlo.Si quiero reemplazar la propiedad con algún otro objeto:

SetOrdValue(Longint(TheNewValue));

El código completo:

Cree un editor de propiedades que descienda de Propiedad de clase T:

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

Primero está la limpieza, decirle al inspector de objetos de Delphi que mi editor de propiedades mostrará un cuadro de diálogo, esto hará que aparezca un "..." al lado de la propiedad:

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

El siguiente es el trabajo real.Cuando el usuario hace clic en el botón "...", el inspector de objetos llama a mi Editar método.El truco que me faltaba es que llamo a mi ObtenerOrdValue método.Aunque mi propiedad no es una ordinal, todavía lo usas y simplemente lanzas el resultado a un objeto:

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

Solución

Si entiendo bien su pregunta, se estará preguntando cómo se supone que debe encontrar el valor que necesita editar, especialmente si el objeto en cuestión contiene más de uno de ellos.La respuesta es que el IDE lo configura por usted y el editor de propiedades viene "precargado" cuando se llama a Edit.TPropertyEditor viene con un montón de métodos GetValue que su función Editar puede usar para recuperar el valor.O si no es uno de esos tipos (si es un objeto descendiente de TPersistent, por ejemplo), entonces puede llamar a GetOrdValue y convertir el resultado a un TPersistent.

Además, es posible que desee consultar TJvPersistentPropertyEditor en la unidad JvDsgnEditors de JVCL para usarlo como clase base.Proporciona algunas de las funciones para usted.

Por cierto, si realmente lo necesita, puede utilizar el método GetName, que le dará el nombre de la propiedad, pero normalmente no debería ser necesario.Y tenga cuidado si está heredando de algo que no sea TPropertyEditor, como lo es GetName virtual y puede ser anulado.

Otros consejos

Un editor de propiedades mantiene la información sobre qué objetos y propiedades está editando en privado. FPropList variable.El IDE completa esto llamando al editor SetPropEntry método.Entonces generalmente se supone que debes llamar a los diversos métodos de TPropertyEditor para conocer los valores de las propiedades.

En realidad, no se supone que importe qué propiedad se le pidió que editara.Su editor de propiedades edita propiedades de un tipo particular.Para la edición in situ, su editor proporciona una implementación de SetValue que traduce la cadena del Inspector de objetos a un valor del tipo adecuado para la propiedad, y luego llama al correspondiente Set función, como SetOrdValue o SetIntfValue.Para la edición de toda la propiedad, el IDE no llamará SetValue.En cambio, llamará Edit, y se espera que llames GetOrdValue o GetIntfValue (por ejemplo) usted mismo, ya que su editor ya sabe qué tipo de propiedad está diseñado para editar.

Recuerde que los editores de propiedades, en general, pueden editar varias propiedades simultáneamente.El nombre de la propiedad será la misma para todos ellos, pero el tipo de componente al que pertenecen puede variar y, por lo tanto, también sus captadores y definidores.Llame al editor de su propiedad GetName método para averiguar el nombre.Para conseguir los objetos, llama GetComponent para cada índice de 0 a PropCount - 1.(Ten cuidado;no hay verificación de rango en esos Get funciones.) También puede verificar si un objeto específico está en la lista llamando HasInstance.El GetPropInfo El método le dirá el PPropInfo puntero para el primero propiedad, pero no creo que sea necesariamente igual a los punteros de todas las demás propiedades.Aparte de eso, no obtienes acceso directo a la PPropInfo datos, pero nuevamente, realmente no debería importar.Si crees que necesitas eso para tu editor, estás probablemente haciendo algo mal;publique una nueva pregunta con información más específica sobre su tarea subyacente.

Los editores de propiedades solo se preocupan por (y están registrados para) la tipo de la propiedad, no la propiedad específica en sí.

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