Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Popup Personalizado (https://www.clubdelphi.com/foros/showthread.php?t=74070)

Neeruu 28-05-2011 14:54:18

Popup Personalizado
 
Hola a Todos!!!

Necesito de si ayuda... Necesito hacer un Popup pero personalizado.

Que quiero decir??

Necesito crear ya se un panel o un formulario (con elementos adentro) y poder invocarlo como si fuera un popup y que se comporte como un popup...

Un Ejemplo muy tosco de lo que necesito...

Código Delphi [-]
 MyPopup := TPopupPersonalizado(Panel o Form o cualquier contenedor);
 MyPopup.popup(50,50)

Alguien me puede dar una ayuda...


Saluda Atte Neeruu :)

PD/: A que se comporte como un popup me refiero a que cuando se haga click en cualquier lugar del formulario, (que no sea el popup) este desaparesca.

Caral 28-05-2011 18:55:32

Hola
No entiendo bien el problema.
Me da la impresion de que lo que necesitas es simplemente crear el elemento en ejecucion.
Aunque tambien se puede hacer con un simple UNIT.
Saludos

Neeruu 28-05-2011 20:23:40

Popup Personalizado
 
Hola...

No necesito crear un item...

lo que necesito es que el popup, al desplegarlo, contenga , un formulario por ejemplo, o una grilla, o un simple abm....

Puedo hacerlo con otro form....
Pero si hago esto ... la ventana donde se muestra el popup pierde el foco...

O sea desde un form1 llamo a un form2 (form2 simula un popup).
Pero el Form1 pierde el foco.... y quier conseguir que eso no sucesa....

Si desplegamos un popup el form no pierde el foco...

Si sigo sin explicarme avisame.... Volvere a interntarlo...

Saluda Atte Neeruu... :)

ecfisa 28-05-2011 21:33:02

Hola Neeruu.

Una forma de hacer lo que buscas podría ser esta:

Form que invoca:
Código Delphi [-]
...
implementation
uses Unit2;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
                 Shift: TShiftState; X, Y: Integer);
begin
 if Button = mbRight then  // Botón derecho
    TForm2.PopUp(ActiveControl.Left,ActiveControl.Top); // Mostrar ventana contextual
end;

procedure TForm1.FormClick(Sender: TObject);
begin
  if Assigned(Form2) then
    Form2.Close;  // Cerrar ventana contextual
end;

Form contextual:
Código Delphi [-]
...
implementation


class procedure TForm2.PopUp(ALeft,ATop: Integer);
begin
  if not Assigned(Form2) then
  begin
    Form2:= TForm2.Create(nil);
    with Form2 do
    begin
      FormStyle:= fsNormal;
      BorderIcons:=[];
      BorderStyle:= bsSingle;
    end;
    Form2.Left:= Form2.Left + ALeft;
    Form2.Top:= Form2.Top + ATop;
  end;
  Form2.Show;
end;

....

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

procedure TForm2.FormDestroy(Sender: TObject);
begin
   Form2:= nil;
end;
Pero no se comporta como un TPopupMenu ya que no se puede asignar a un control determinado y sólo responde a los eventos OnMouseDown y OnClick
del form invocante...

Tal vez te sirva de base para elaborar alguna otra idea... :rolleyes:

Saludos.

Neeruu 28-05-2011 22:22:06

Popup Personalizado
 
Me sirve... Gracias....

Es así como lo pense... pero cuando me abre el popup (form2)
el form1 pierde el foco... quedando inactivo...

Y es eso justamente lo que no quiero.

Fijarse que cuando se desplega un popupmenu... la ventana no queda inactiva..


Saluda Atte Neeruu!!! :)

PD:/ Como se cuando los componentes de un panel no tienen el foco???
o como puedo saber cuando un panel no tiene ningun componente con foco???

ecfisa 29-05-2011 01:33:28

Hola.

De esta forma creo que vas a evitar la pérdida del foco.
Código Delphi [-]
uses Unit2;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Panel1.Visible:= False;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
                 Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbRight then
  begin
    Panel1.Visible:= True;
    with TForm2.Create(Self) do
    begin
      ManualDock(Panel1, nil, alClient);
      Align := alClient;
      Show;
    end;
  end;
end;

procedure TForm1.FormClick(Sender: TObject);
begin
  if Panel1.Visible then
  begin
    Form2.Free;
    Panel1.Visible:= False;
  end;
end;

El uso de ManualDock en lugar del tradicional 'Form2.Parent:= Panel1' para mí era una novedad hasta hace muy poco.
Es un dato que se lo debo al amigo Neftalí, quíen explica muy bién sus ventajas [ aquí ].

Saludos.


La franja horaria es GMT +2. Ahora son las 01:08:09.

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