La subclase TPopupMenu dentro de un paquete interrumpe el manejo de los menús emergentes del IDE después de la instalación.
Estoy haciendo un componente donde necesito manejar la pintura personalizada de una clase TPopupMenu, especialmente incluyendo el área no cliente de una ventana emergente. Así que hice una subclase como se recomienda en internet. Pero con una diferencia, mi unidad de origen de subclase está dentro de un paquete. Y al probar descubrí que inmediatamente después de instalar este paquete, los menús emergentes de mi IDE dejan de funcionar, se muestran y se ven bien, pero no todas las opciones hacen lo que se supone que deben hacer. La mayoría de ellas no hacen nada en absoluto después de hacer clic en ellas. ¿Alguien puede comprobar si mi descubrimiento es correcto o tal vez mi código está mal de alguna manera, pero no creo que lo esté, porque es un caso de prueba muy simple. He comprobado este comportamiento en Delphi 2010 y 10.3.3. Ambos hacen lo mismo en mi prueba.
Gracias.
Código de prueba (recuerda ponerlo en un paquete y simplemente instalar este paquete en Delphi IDE):
unit uPopupListSubclass;
interface
implementation
uses
SysUtils,
Classes,
Messages,
Windows,
Menus;
type
TPopupListEx = class(TPopupList)
protected
procedure WndProc(var Message: TMessage); override;
end;
procedure TPopupListEx.WndProc(var Message: TMessage);
begin
inherited;
end;
initialization
PopupList.Free;
PopupList := TPopupListEx.Create;
end.
INFORMACIÓN IMPORTANTE:
Para desinstalar este paquete, debes ir al menú: Componente -> Instalar paquetes… -> desmarca el componente -> haz clic en el botón Eliminar -> haz clic en el botón Aceptar -> reinicia el IDE.
Tu IDE podría generar algunos AV (excepciones de acceso no válidas) durante el proceso de desinstalación de este paquete (lo siento). Pero después de reiniciar, debería funcionar bien, como antes.
EDIT:
EDIT2:
Fuente modificada para evitar AV durante la eliminación/desactivación de un paquete.
Añadida delegación a la lista emergente original.
type
TPopupListAccess = class(TPopupList);
var
OriginalPopupList: TPopupList;
procedure TPopupListEx.WndProc(var Message: TMessage);
begin
TPopupListAccess(OriginalPopupList).WndProc(Message);
inherited;
end;
initialization
OriginalPopupList := PopupList;
PopupList := TPopupListEx.Create;
finalization
PopupList.Free;
PopupList := OriginalPopupList;
davy.ai
Solución al problema de TPopupMenu al subclasear
El problema ocurre al subclasear la clase
TPopupMenu
en una unidad que está dentro de un paquete. Después de instalar el paquete, los menús emergentes del entorno de desarrollo integrado (IDE) dejan de funcionar correctamente.La solución consiste en subclasear la clase
TPopupList
en lugar deTPopupMenu
, que es la clase interna utilizada por el IDE para manejar los menús emergentes. Para asegurarse de que la variablePopupList
original sea reemplazada correctamente, es necesario utilizar una sección de inicialización y finalización del paquete.Aquí está el código actualizado:
Esto debería solucionar el problema de que los menús emergentes no funcionen correctamente después de instalar el paquete, y permitir la personalización de la pintura del área no cliente de una ventana emergente.