Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   mostrar 2 formularios juntos (https://www.clubdelphi.com/foros/showthread.php?t=93886)

oscarac 22-04-2019 00:12:41

mostrar 2 formularios juntos
 
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

1 Archivos Adjunto(s)
algo mas o menos asi
y en ese cuadrado mostrar una imagen

Casimiro Notevi 22-04-2019 09:31:46

Cita:

Empezado por oscarac (Mensaje 531600)
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

Cita:

Empezado por oscarac (Mensaje 531601)
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í...


Form de la grilla:
Código Delphi [-]
...
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:
Código Delphi [-]
...
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

Código Delphi [-]
_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

Cita:

Empezado por oscarac (Mensaje 531614)
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


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

Código Delphi [-]
 PostMessage(Self.Handle, WM_AFTER_CREATE, 0, 0);

estoy investigando que hace este comando

ecfisa 24-04-2019 17:18:55

Hola.
Cita:

Empezado por oscarac (Mensaje 531647)
es el mismo codigo
creo que el problema esta en

Código Delphi [-]
 PostMessage(Self.Handle, WM_AFTER_CREATE, 0, 0);

estoy investigando que hace este comando

La función PostMessage 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

1 Archivos Adjunto(s)
Hola.

Recién veo en tu mensaje #8 la línea:
Código Delphi [-]
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



Código Delphi [-]
    Left := self.ClientWidth + (Screen.Height - self.ClientHeight) /2 ;

debe ser

Código Delphi [-]
    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

Me salgo del topico
 
Disculpen que me salga del tópico, pero este gif ¿cómo lo generaste?.


Gracias



Cita:

Empezado por ecfisa (Mensaje 531613)
Hola.

A ver si lo que buscas es algo así...


....
Saludos :)


ecfisa 29-04-2019 02:52:34

Hola.
Cita:

Empezado por hal1967 (Mensaje 531708)
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 :)


La franja horaria es GMT +2. Ahora son las 04:23:17.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi