es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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;
Tags:  , , , ,

Answer

  1. Avatar for 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 de TPopupMenu, que es la clase interna utilizada por el IDE para manejar los menús emergentes. Para asegurarse de que la variable PopupList original sea reemplazada correctamente, es necesario utilizar una sección de inicialización y finalización del paquete.

    Aquí está el código actualizado:

    unit uPopupListSubclass;
    
    interface
    
    implementation
    
    uses
      SysUtils,
      Classes,
      Messages,
      Windows,
      Menus;
    
    type
      TPopupListEx = class(TPopupList)
      protected
        procedure WndProc(var Message: TMessage); override;
      end;
    
    var
      OriginalPopupList: TPopupList;
    
    { TPopupListEx }
    
    procedure TPopupListEx.WndProc(var Message: TMessage);
    begin
      TPopupListAccess(OriginalPopupList).WndProc(Message);
      inherited;
    end;
    
    initialization
      OriginalPopupList := PopupList;
      PopupList := TPopupListEx.Create;
    
    finalization
      PopupList.Free;
      PopupList := OriginalPopupList;
    
    end.
    

    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.

Comments are closed.