Sé que he visto un ejemplo en algún lugar de un hack para definir una versión personalizada de un componente VCL existente, como TButton o TEdit, con el mismo nombre de clase y hacer algo para que el transmisor de flujo continuo DFM creará una instancia de su versión en lugar del original. Lamentablemente, estoy en una situación en la que necesito poder hacer eso y no puedo encontrar la reseña. ¿Alguien sabe dónde encontrar información sobre cómo lograr esto?Reemplazando una clase de componente en delphi
Respuesta
En su forma se puede reemplazar el método ReadState
así:
type
TMyForm = class(TForm)
protected
procedure ReadState(Reader: TReader); override;
end;
procedure TMyForm.ReadState(Reader: TReader);
begin
Reader.OnFindComponentClass := FindComponentClass;
inherited;
end;
procedure TMyForm.FindComponentClass(Reader: TReader; const ClassName: string;
var ComponentClass: TComponentClass);
begin
if ComponentClass=TButton then begin
ComponentClass := TMySuperDuperButton;
end else if ComponentClass=TEdit then begin
ComponentClass := TMyTotallyAwesomeEdit;
end;
end;
es probable muchas otras maneras de hacer esto, pero esta es la forma en que lo hago!
EDIT: Inspeccionar TReader.GetFieldClass(Instance: TObject; const ClassName: string)
sugiere el truco que Mason recuerda. La primera línea establece ClassType := Instance.ClassType
. Así que sospecho que al cambiar la declaración en el archivo pas de Button1: TButton
a Button1: MyUnit.TButton
, se creará su botón. O tal vez el truco fue agregar MyUnit
a la cláusula uses al final para que tu versión de TButton sea la que está en el alcance. Sin embargo, nada de esto suena muy práctico.
Puedo estar equivocado, pero también agregaría el cheque para ClassName y no solo para ComponentClass. En caso de que algo haya cambiado entre Delphi 2 y Delphi XE;) –
Interesante. No he oído hablar de esta versión, pero podría funcionar para lo que tengo que hacer. –
@Eugene Lo siento, no entiendo lo que quieres decir. –
Supongo que lo que estás tratando de recordar es un "interposer class": heredando una clase que da el mismo nombre que el antecesor, prefijando el nombre de la unidad del antepasado. Como el nombre de clase no se cambia, el mecanismo de transmisión dfm no se altera. Solo afectaría a la unidad en la que se vuelve a declarar la clase, a menos que se coloque en una unidad separada y esa unidad se incluya en la sección de usos después de la clase base. Obviamente, no puede haber publicado propiedades en una clase interpuesta.
type
TButton = class(stdctrls.TButton)
protected
procedure CreateParams(var Params: TCreateParams); override;
end;
TForm1 = class(TForm)
Button1: TButton;
[...]
private
Sí, eso es en lo que estaba pensando. Pero la solución de David resultó ser más efectiva para el problema que estaba tratando de resolver. –
- 1. Reemplazando stringgrid con listbox en Delphi
- 2. Evento Delphi Mouse wheel en el componente
- 3. Acceda dinámicamente a una propiedad en un componente Delphi
- 4. Estado del componente Delphi XE2 TurboPower
- 5. Componente WYSIWYG HTML Editor para Delphi
- 6. imagen del componente no visual delphi
- 7. Componente para mostrar información de registro en Delphi
- 8. Usando una clase java de Delphi
- 9. ¿Qué clase de base usar al desarrollar el componente Delphi VCL?
- 10. ¿Cómo eliminar una clase CSS de un componente de Wicket?
- 11. Cómo dibujar algo sobre el componente WebBrowser en Delphi
- 12. Componente de diálogo de conexión ODBC de Delphi?
- 13. Cuándo agregar una clase de componente vs control de usuario?
- 14. Reemplazando QPaintEvents en PyQt
- 15. Variable de la clase Delphi por clase
- 16. reemplazando loadView en una subclase UITableViewController
- 17. Buscando el componente de menú emergente radial para Delphi
- 18. Componente del editor de etiquetas para Delphi/C++ Builder
- 19. Delphi componente del panel de control de Windows 7
- 20. Constantes de clase/estáticas en Delphi
- 21. Creación/destrucción de clase virtual en delphi
- 22. Cómo implementar una propiedad de lista de cadenas en un componente delphi personalizado?
- 23. Reemplazando una función en Emacs Lisp
- 24. Reemplazando una función en el complemento jQuery
- 25. ¿Alguien puede recomendar un componente selector de color para Delphi?
- 26. reemplazando espacios en una cadena con guiones
- 27. ¿Está bien actualizar una aplicación web Java reemplazando solo archivos de una sola clase?
- 28. Reemplazando temas en WPF
- 29. Reemplazando los métodos de extensión
- 30. cómo agregar una clase al componente de entrada en una envoltura en simple_form 2
¿Has mirado en tu bolsa de trucos? http://windwings.wordpress.com/2009/10/07/turbocharging-delphi-2010-2-adding-dynamic-functionality-to-3rd-parties-the-solution/#comment-1066 ;-) –
@ Jørn , eso es lo que muestra esta respuesta: http://stackoverflow.com/questions/4685863/replacing-a-component-class-in-delphi/4686920#4686920 –
@Jeroen, lo sé ... solo necesitaba mostrar @ Mason es "lo ha visto en alguna parte". :-) –