Ver Mensaje Individual
  #4  
Antiguo 09-02-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Antes de asignar tu propio evento CloseQuery guarda el que pudiera tener el formulario para poder llamarlo en su momento. Te pongo un ejemplo, está en delphi pero imagino que no tendrás problemas para pasarlo a C++:

Código Delphi [-]
{
  Componente para manejar el evento CloseQuery del formulario
  donde se inserte.
}
unit CloseQuery;

interface

uses
  Windows, SysUtils, Classes, Forms;

type
  TCloseQueryComponent = class(TComponent)
  private
    FForm: TForm; // formulario contenedor
    FOldCloseQuery: TCloseQueryEvent; // evento propio del formulario

  protected
    procedure ValidateContainer(AComponent: TComponent); override;
    procedure Loaded; override;
    procedure CloseQuery(Sender: TObject; var CanClose: Boolean); virtual;

  public
    constructor Create(AOwner: TComponent); override;
  end;

procedure Register;

implementation

{
  Registrar la componente
}
procedure Register;
begin
  RegisterComponents('buildero_d', [TCloseQueryComponent]);
end;

{ TCloseQueryComponent }

{
  Constructor de la componente

  Aquí sólo asignamos la referencia al formulario
}
constructor TCloseQueryComponent.Create(AOwner: TComponent);
begin
  inherited;

  if AOwner is TForm then
    FForm := TForm(AOwner);
end;

{
  Valida el contenedor

  Aquí nos aseguramos que estamos insertando la componente
  en un formulario y no, por ejemplo, en un DataModule.
}
procedure TCloseQueryComponent.ValidateContainer(AComponent: TComponent);
begin
  inherited;

  if not (AComponent is TForm) then
    raise Exception.Create('Este componente sólo puede insertarse en un formulario');
end;

{
  La VCL llama al método Loaded cuando ha terminado de leer el dfm
  del formulario. Entonces podemos estar seguros de que ya se dispone
  del evento CloseQuery asignado en el diseño. Esto no podría asegurarse
  en el constructor.
}
procedure TCloseQueryComponent.Loaded;
begin
  inherited;

  if Assigned(FForm) then
  begin
    FOldCloseQuery := FForm.OnCloseQuery;
    FForm.OnCloseQuery := CloseQuery;
  end;
end;

{
 Nuestro evento CloseQuery
}
procedure TCloseQueryComponent.CloseQuery(Sender: TObject; var CanClose: Boolean);
const
  Flags = MB_YESNO or MB_ICONWARNING;

begin
  if Assigned(FForm) then
  begin
    if Application.MessageBox('¿Desea cerrar esta ventana?', 'Confirmar', Flags) = ID_YES then
    begin
      CanClose := true;

      {
         Si el usuario accede a cerrar el formulario, probamos si había un
         evento asignado drante el diseño y, de ser así, lo invocamos.
      }
      if Assigned(FOldCloseQuery) then
        FOldCloseQuery(FForm, CanClose);
    end
    else
      CanClose := false;
  end;
end;

end.

// Saludos
Responder Con Cita