Ver Mensaje Individual
  #7  
Antiguo 29-11-2013
pelecho pelecho is offline
Registrado
 
Registrado: ago 2010
Ubicación: Chaco Paraguay
Posts: 9
Reputación: 0
pelecho Va por buen camino
MDI Lazarus en Windows

Hola a todos.
No se si les servira, pero de todos modos lo quiero compartir con Ustedes.

Existe una forma de disimular MDI, colocando por ejemplo en el formulario principal un TPageControl, añadiendo las siguientes rutinas en el formulario:
Código Delphi [-]
function TfrmPrincipal.AbaExiste(NomeAba: string): Boolean;
var
  i: Integer;
  Aba: TTabSheet;
begin
  Result := False;
  for i := 0 to PageControl1.PageCount - 1 do begin
    if PageControl1.Pages[i].Caption = NomeAba then begin
      Aba := PageControl1.Pages[i];
      PageControl1.ActivePage := Aba;
      Result := True;
      break;
    end;
  end;
end;

procedure TfrmPrincipal.CriarAba(clsForm: TForm; Index: Integer);
var
  TabSheet: TTabSheet;
  Form: TForm;
begin
  TabSheet := TTabSheet.Create(Self);
  Form := clsForm;
  if AbaExiste(Form.Caption) then
    Exit;
  with TabSheet do begin
    PageControl := PageControl1;
    Caption := Form.Caption;
    ImageIndex := Index;
  end;
  with Form do begin
    Align := alClient;
    BorderStyle := bsNone;
    Parent := TabSheet;
    Show;
  end;
  PageControl1.ActivePage := TabSheet;
  PageControl1.Visible := True;
end;

procedure TfrmPrincipal.FecharAba(NomeAba: string);
var
  i: integer;
  Aba: TTabSheet;
begin
  for i := 0 to PageControl1.PageCount - 1 do
  begin
    if PageControl1.Pages[i].Caption = NomeAba then
    begin
      Aba := PageControl1.Pages[i];
      Aba.Destroy;
      PageControl1.ActivePageIndex := 0;
//      PageControl1.Pages[i].Destroy;
      break;
    end;
  end;
end;

Para abrir la ventana dentro del TPagecontrol, solo deben colocar la siguiente sentencia:
Código Delphi [-]
CriarAba(frmClientes, 1);

Y para cerrar la ventana, en el boton con el que cierran la ventana:
Código Delphi [-]
    frmPrincipal.FecharAba(frmClientes.Caption);

Para que no se confundan con los X en la parte superior derecha de la ventana, deben agregar alguito mas de codigo. Sino, cierran la ventana principal y con eso salen del sistema.

En el formulario principal (en el OnCloseQuery):
Obs: los parametros de PChar() los declare en constantes, igual que ultimo parametro del mensaje. Aqui los puse para que no les confunda.
Código Delphi [-]
   CanClose := Application.MessageBox(PChar('¿Realmente desea salir del  programa?'), PChar(), MB_YESNO + MB_ICONWARNING +  MB_DEFBUTTON2)=ID_YES;

  if(CanClose)then
    Application.Terminate
  else
    Exit;

En la ventana que se abre dentro del TPageControl deben colocar siguiente codigo:
Código Delphi [-]
procedure frmClientes.FormClose(Sender: TObject; var CloseAction: TCloseAction
  );
var
  b: Boolean;
begin
  b := True;
  frmPrincipal.OnCloseQuery(frmPrincipal, b);

  CloseAction := caFree;
end;

Y eso es todo. Funciona bajo Windows y tambien lo probe bajo Linux Mint 15 y funciona de maravilla.

Espero que les sirve.

Saludos
Responder Con Cita