PDA

Ver la Versión Completa : mostrar 2 formularios juntos


oscarac
22-04-2019, 00:12:41
tengo un formulario donde doy mantenimiento a una tabla de artículos
la idea que tengo (si es posible) es poder mostrar 2 formularios juntos
en uno tener la grilla con los datos de la tabla mencionada y en el otro formulario, mostrar una imagen correspondiente al artículo
y que mientras se mueva el registro en la grilla cambien la imagen (almacenada en una carpeta)
obvio que en algun campo de la tabla estara la ruta de la imagen

he visto ejemplos, pero quiero saber si se puede hacer en 2 formularios

Casimiro Notevi
22-04-2019, 00:55:38
¿Y por qué otro formulario?

oscarac
22-04-2019, 01:02:03
porque me gustaria que sea flotante y que no tenga relacion con el formulario primario
si agrego un panel y "ajusto" el tamaño se veria una espacio en blanco visualmente nada agradable

oscarac
22-04-2019, 01:08:33
algo mas o menos asi
y en ese cuadrado mostrar una imagen

Casimiro Notevi
22-04-2019, 09:31:46
porque me gustaria que sea flotante y que no tenga relacion con el formulario primario
si agrego un panel y "ajusto" el tamaño se veria una espacio en blanco visualmente nada agradable

algo mas o menos asi
y en ese cuadrado mostrar una imagen


Presentar la imagen en otro formulario es fácil, puedes crearlo dinámicamente, por ejemplo, aunque se ocultará si el usuario mueve el form de los datos, la pantalla puede ser más o menos grande y no caber bien la imagen, creo que dices que el form se ajuste al tamaño de la imagen, pero si la imagen es muy grande y no cabe, ¿lo ajustas? y a partir de qué tamaño lo ajustas.
De todas formas, si quieres hacerlo así, adelante, ¿qué problema o duda tienes?

Ñuño Martínez
22-04-2019, 11:52:43
No debería haber problema. Basta con crear el otro formulario y mostrarlo (Show) en la inicialización del formulario principal. Si no quieres que el formulario principal lo pueda ocultar, haz que la propiedad "FormStyle" sea "fsStayOnTop" (ojo, esto último lo he mirado en Lazarus, que no estoy con Windows ahora, pero supongo que esto será igual que Delphi). También puedes hacer que no tenga borde ni título (BorderStyle = bsNone) y quitarle el botón (BorderIcons) cerrar para asegurarse de que no lo cerrará el usuario. Para que se mueva (o flote), usa el evento "onChangeBounds" (literalmente "al cambiar los límites") del formulario principal.

ecfisa
22-04-2019, 22:33:46
Hola.

A ver si lo que buscas es algo así...
https://i.postimg.cc/cLf0HTNs/oscarac1.gif

Form de la grilla:

...
const
WM_AFTER_CREATE = WM_USER + 300;
type
TForm1 = class(TForm)
DBGrid1: TDBGrid;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
procedure WmAfterCreate(var Msg: TMessage); message WM_AFTER_CREATE;
procedure WMMoving(var Msg: TMessage); message WM_MOVING;
procedure LocateForm2;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation {$R *.dfm}

uses Unit2, Unit3{datos};

procedure TForm1.FormCreate(Sender: TObject);
begin
Form2 := TForm2.Create(Self);
Form2.BorderStyle := bsToolWindow;
Form2.BorderIcons := [];
Form2.FormStyle := fsStayOnTop;
PostMessage(Self.Handle, WM_AFTER_CREATE, 0, 0);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Form2.Close;
end;

//------------------------------------------------------------------------------
procedure TForm1.WmAfterCreate(var Msg: TMessage);
begin
Form2.Show;
LocateForm2;
end;

// Form1 se ha movido, reposicionar Form2.
procedure TForm1.WMMoving(var Msg: TMessage);
begin
LocateForm2;
end;

// Posicionar Form2
procedure TForm1.LocateForm2;
begin
Form2.Left := Self.Left + Self.Width;
Form2.Top := Self.Top + Self.Height - Form2.Height;
end;
end.


Form de la imágen:

...
type
TForm2 = class(TForm)
DBImage1: TDBImage;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND;
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation {$R *.dfm}

uses Unit3 {datos};

//...

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;

//------------------------------------------------------------------------------
// Form2 no se mueve
procedure TForm2.WMSysCommand(var Msg: TWMSysCommand);
begin
if Msg.CmdType and $FFF0 = SC_MOVE then
Msg.Result := 0
else
inherited;
end;
end.


Saludos :)

oscarac
22-04-2019, 23:13:18
es exactamente lo que busco
pero el otro form lo estoy creando en tiempo de ejecucion mas o menos asi

_frmimagen := TForm.Create(self);
with _frmImagen do
begin
Caption:= 'Imagen';
Height:= 230;
Width:= 300;
FormStyle := fsMDIChild;
Left := self.ClientWidth + (Screen.Height - self.ClientHeight) /2 ;
Top := self.ClientHeight + self.top - 230;
with TImage.Create(Self) do
begin
Align := alClient;
Parent:= _frmimagen;
end;
Show;
end;

me da errores en el Left

pero voy a probar de la forma en que tu lo estas recomendando

otra cosa, como haces para mostrar la imagen en el post (clubDelphi) ayer quise colocar una imagen y tuve que subirla como adjunto?

Casimiro Notevi
22-04-2019, 23:47:23
otra cosa, como haces para mostrar la imagen en el post (clubDelphi) ayer quise colocar una imagen y tuve que subirla como adjunto?
Usa un servidor externo, por ejemplo: https://subefotos.com/

oscarac
23-04-2019, 00:36:54
http://thumbs.subefotos.com/c84f8c535434bf3e374d0dd83a0b1950o.jpg
ya me salió
pero cuando entra el foco lo recibe el formulario donde se muestra la imagen
tengo que hacer click en el formulario de la grilla para que se active

oscarac
24-04-2019, 00:24:48
otro tema que me he dado cuenta es que cuando al formulario donde esta la grilla lo invoco desde el formulario principal (MAIN), funciona normal, aparece el formulario con la imagen, pero cuando invoco a este mismo formulario (el de la grilla) desde otro formulario (child) no aparece la imagen....

ecfisa a que se debe ??

Casimiro Notevi
24-04-2019, 08:57:26
¿Y por qué no pones tu código?

oscarac
24-04-2019, 16:52:57
es el mismo codigo
creo que el problema esta en

PostMessage(Self.Handle, WM_AFTER_CREATE, 0, 0);

estoy investigando que hace este comando

ecfisa
24-04-2019, 17:18:55
Hola.es el mismo codigo
creo que el problema esta en

PostMessage(Self.Handle, WM_AFTER_CREATE, 0, 0);

estoy investigando que hace este comando
La función PostMessage (https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-postmessagea) pone de forma asincrónica un mensaje en la cola de mensajes de la ventana indicada y retorna. Cuando ese mensaje es capturado por el método WmAfterCreate, ejecuta su código.

Saludos :)

oscarac
24-04-2019, 17:35:54
no se si en algun momento mencione que estoy aprendiendeo Delphi de manera autodidacta y este grupo incluido los integrantes mas activos me han ayudado muchisimo

pero aun no estoy en un nivel avanzado como para entender el postmessage

la ventana donde se supone deberia aparecer la imagen no aparece cuando el formulario de articulos lo invoco desde otra form

Casimiro Notevi
24-04-2019, 18:56:17
Seguramente estás enviando el "self.handle" del form que hace la llamada, en lugar del form desde donde debería hacer la llamada para mostrar la imagen.

ecfisa
24-04-2019, 19:04:53
Hola.

Recién veo en tu mensaje #8 la línea: FormStyle := fsMDIChild; es decir que estas trabajando con MDI. Te adjunto un ejemplo similar al anterior pero adaptado para ese formato, sólo crea una carpeta y descomprimelo allí.

Saludos :)

hal1967
28-04-2019, 18:56:59
Donde



Left := self.ClientWidth + (Screen.Height - self.ClientHeight) /2 ;

debe ser

Left := self.ClientWidth + (Screen.Height - self.ClientHeight) div 2 ;


La diferencia 101/2 es 50.5 102 div 2 es 50

hal1967
28-04-2019, 18:59:31
Disculpen que me salga del tópico, pero este gif ¿cómo lo generaste?.


Gracias



Hola.

A ver si lo que buscas es algo así...
https://i.postimg.cc/cLf0HTNs/oscarac1.gif

....
Saludos :)

ecfisa
29-04-2019, 02:52:34
Hola.
Disculpen que me salga del tópico, pero este gif ¿cómo lo generaste?.

Las imágenes vienen en el archivo biolife.db que trae Delphi 7 como demo. Está incluido en el comprimido que adjunté mensajes mas arriba .

Saludos :)

oscarac
29-04-2019, 05:22:33
creo que se refiere a como pusiste ese gif en el foro