PDA

Ver la Versión Completa : MDI Lazarus en Windows


F3niX
11-11-2013, 21:49:52
Buenas soy nuevo por acá, un placer estar con ustedes, tengo una duda y es que estoy creando una pequeña aplicación de facturación en Lazarus bajo plataforma linux, y hasta aca todo perfecto pero al momento de Compilar y ejecutar en windows los mdi no me funcionan. Espero que no sea una burrada de mi parte, jaja.

PD : Soy novato en FPC/Lazarus/Delphi, programe en Turbo Pascal ya hace rato y sobre todo cosas sencillas. Mas que todo me muevo en Python + QT, pero me gusta cambiar de lenguaje entre proyectos para no encadenarme a ningunos, razon por la cual decidi probar el RAD lazarus.

Saludos y de ante mano muchas gracias por su ayuda.

ecfisa
12-11-2013, 17:56:56
Hola F3niX y bienvenido a Club Delphi :)

Como a todos los que se inician te invitamos a que leas nuestra guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php).

Según tengo entendido, la interface MDI aún no está implementada en Lazarus, pero podes usar el componente MultiDoc (http://wiki.freepascal.org/MultiDoc/es) para simular el comportamiento.

Saludos :)

pacopenin
12-11-2013, 19:52:39
Hola F3nix.

Como bien dice ecfisa, hasta donde yo conozco no existe MDI en lazarus ya que no es algo multiplataforma.

F3niX
13-11-2013, 04:19:26
Buenas amigo, gracias por la bienvenida enseguida leo la guía de estilos. Aparte no es por decir lo contrario pero si tenemos MDI en lazarus, mas me parece que no esta implementada para windows les anexo imagenes que lo comprueban.

En la primera imagen adjunta podemos observar el formulario MDI, y en la segunda la propiedad la propiedad "Form Style" en fsMdiChild también por supuesto nos da la opción fsMdiForm. En Linux funciona perfectamente, pero en windows no.

Saludos y gracias por sus respuestas.

ecfisa
13-11-2013, 16:46:10
Hola F3niX.

Si, dese el inspector de objectos en la propiedad FormStyle figuran las opciónes, pero en Windows no funcionan. Lo leí en varios artículos y foros, te adjunto dos de ejemplo:

MDI FORMS (http://forum.lazarus.freepascal.org/index.php?topic=8480.0)
Formulario MDI en Lazarus - FreePascal (http://aitoreus.blogspot.com.ar/2012/08/formulario-mdi-en-lazarus-freepascal.html)

Pero no quería quedarme sólo con lo leído, así que descargué la última versión de Lazarus y personalmente pude comprobar que no funciona sobre Windows.

Por hacer una burda analogía, en Delphi encontramos algo similar con la propiedad Font.Color de un TButton, la propiedad se visualiza en el inspector de objetos pero no aplica.

Saludos :)

F3niX
14-11-2013, 05:03:26
Gracias amigo ya lo había leido,solo quize informar que por lo menos para linux si esta disponible, pero en windows probe compilando con WinApi, Qt, Gtk, y nada dicen que todavía no se ha implementado Qt completamente en windows.

Saludos.

pelecho
29-11-2013, 17:22:58
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:

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:

CriarAba(frmClientes, 1);


Y para cerrar la ventana, en el boton con el que cierran la ventana:

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.

CanClose := Application.MessageBox(PChar('¿Realmente desea salir del programa?'), PChar(<titulo_ventana>), 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:

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

F3niX
04-03-2014, 20:52:27
Probare esto, saludos.