Ir al contenido


Foto

¿Como saber cuál es el parent de un componente que esta sobre otro componente?


  • Por favor identifícate para responder
5 respuestas en este tema

#1 Mxidetre

Mxidetre

    Newbie

  • Miembros
  • Pip
  • 5 mensajes

Escrito 12 diciembre 2014 - 03:01

Saludos Amigos!

Pues la verdad es que como llevo un poco con delphi llevo un par de días atascado con esto.  8o| 8o| 8o| 8o|

Mirar el problema viene cuando intento que me diga el parent de un componente que esta sobre otro componente.

Al clicar sobre un componente normal me dice su parent en una linea de una memo. Todo va bien si en el componente su parent es el form. Pero no he encontrado la forma recursiva, de si por ejemplo hay un panel2 sobre un panel 1, clikando sobre ese panel2 me diga que su parent es el panel1, y que es panel1 pertenece al form.

A ver si me podéis  echar una mano. Gracias por vuestro tiempo de antemano.  (y)

Os Adjunto código.



delphi
  1. procedure Tform1.FormCreate(Sender: TObject);
  2. begin
  3.   Application.OnMessage := AnalizaMensajes;
  4. end;
  5.  
  6. procedure Tform1.AnalizaMensajes(var Msg: TMSg; Var Handled:Boolean);
  7.   var
  8.     //Target: TControl;
  9.     Point: TPoint;
  10.     ctrl : TControl;
  11.     x,y:integer;
  12. begin
  13.     if Msg.message = WM_LBUTTONDOWN then begin
  14.         Point := Msg.pt;
  15.         x := ScreenToClient(Point).X;
  16.         y := ScreenToClient(Point).Y;
  17.         Memo1.Lines.Add(intToStr(x)+'-'+intToStr(y));
  18.         ctrl := ControlAtPos(ScreenToClient(Point), true, true);
  19.         if (ctrl <> nil) then
  20.           memo1.lines.add(ctrl.Parent.name);
  21. //Aqui es donde me he quedado atascado
  22.         end
  23.         else
  24.       inherited;
  25. end;



  • 0

#2 hanifnoor

hanifnoor

    Newbie

  • Miembros
  • Pip
  • 2 mensajes

Escrito 12 diciembre 2014 - 03:03

Mirar el problema viene cuando intento que me diga el parent de un componente que esta sobre otro componente.

Al clicar sobre un componente normal me dice su parent en una linea de una memo. Todo va bien si en el componente su parent es el form. Pero no he encontrado la forma recursiva, de si por ejemplo hay un panel2 sobre un panel 1, clikando sobre ese panel2 me diga que su parent es el panel1, y que es panel1 pertenece al form.

A ver si me podéis  echar una mano. Gracias por vuestro tiempo de antemano. 
  • 0

#3 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 12 diciembre 2014 - 06:59

Saludos.

Creo que lo que andas buscando es hacer una función recursiva, la propiedad Parent es del tipo TWinControl.  Una forma de realizar la función es preguntar hasta que la propiedad Parent sea igual a Form1 por ejemplo.
  • 0

#4 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 12 diciembre 2014 - 08:04

Solo por curiosidad ¿Cual es el objetivo final de este procedimiento?. Si acaso es obtener la posición absoluta de un control anidado con respecto al screen entonces juega con las funciones o propiedades  ClientToScreen, ClientToParent, ClientHeight, ClientOrigin, ClientRect o ClientWidth.

Si es por otro motivo entonces ya miraremos como alcanzar lo que buscas.

Saludos.
  • 0

#5 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 13 diciembre 2014 - 10:37

Tienes que ir tirando del parent hasta que este sea un TForm, así:



delphi
  1. procedure Tform1.FormCreate(Sender: TObject);
  2. begin
  3.   Application.OnMessage := AnalizaMensajes;
  4. end;
  5.  
  6. procedure Tform1.AnalizaMensajes(var Msg: TMSg; Var Handled:Boolean);
  7.   var
  8.     Point: TPoint;
  9.     ctrl, MyParent : TControl;
  10.     x,y:integer;
  11. begin
  12.     if Msg.message = WM_LBUTTONDOWN then begin
  13.         Point := Msg.pt;
  14.         x := ScreenToClient(Point).X;
  15.         y := ScreenToClient(Point).Y;
  16.         Memo1.Lines.Add(intToStr(x)+'-'+intToStr(y));
  17.         ctrl := ControlAtPos(ScreenToClient(Point), true, true);
  18.         if (ctrl <> nil) then begin
  19.           MyParent:= Ctrl;
  20.           while not (MyParent is TFom) do
  21.             MyParent:= MyParent.parent;
  22.           memo1.lines.add(MyParent.name);
  23.         end;
  24.       inherited;
  25.     end;
  26. end;


  • 0

#6 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 13 diciembre 2014 - 12:22

Echando un poco de mano a la API, quizás sea esto lo que buscas:



delphi
  1. procedure Tform1.AnalizaMensajes(var Msg: TMSg; Var Handled:Boolean);
  2. var
  3.   //Target: TControl;
  4.   Point: TPoint;
  5.   ctrl : TControl;
  6.   x,y:integer;
  7. begin
  8.   if Msg.message = WM_LBUTTONDOWN then begin
  9.     Point := Msg.pt;
  10.     ctrl := FindControl(WindowFromPoint(Point));
  11.     Point:= ScreenToClient(Point);
  12.     Memo1.Lines.Add(intToStr(Point.x)+'-'+intToStr(Point.y));
  13.     if(ctrl <> nil) then
  14.       if (ctrl.Parent <> nil) then
  15.         memo1.lines.add(ctrl.Parent.name)
  16.       else
  17.         memo1.lines.add('No Parent');
  18.   end
  19.   else
  20.     inherited;
  21. end;



Saludos.
  • 0




IP.Board spam blocked by CleanTalk.