Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Donde estoy¿? (https://www.clubdelphi.com/foros/showthread.php?t=38495)

tarco35 15-12-2006 22:47:27

Donde estoy¿?
 
Saludos a todos... Estoy usando un TPanel (bueno.. mas de uno) y uso las sentencias SendToBack y ..ToFront .... pero ¿como puedo saber en un determinado momento si tengo ese panel al frente o no? puesto que la propiedad visible es en ambos casos TRUE ... gracias por su colaboracion.

Bicho 16-12-2006 00:23:16

Hola, ¿exactamente para que quieres saberlo?, porque yo nunca me he encontrado en esa situación. Si tengo uno objeto detrás y quiero que se ponga delante le hago un traer al frente y cuando no lo tenga que usar lo vuelvo al fondo.
Nada más.

Todo esto, en tiempo de ejecución. Porque en tiempo de diseño, puedes saberlo. El que está por encima visualmente y el que está por detrás. Hay no hay problema, no? Es que no he entendido muy bien, el porque de tu duda.

Saludos

seoane 16-12-2006 00:35:02

Supongo que existirá una función maravillosa que te devuelva la posición, pero como no la se, puede que esto te sirva :D

Código Delphi [-]
function Posicion(Control: TControl): Integer;
var
  i: Integer;
begin
  Result:= -1;
  if Control.Parent <> nil then
  begin
    for i:= 0 to Control.Parent.ControlCount - 1 do
      if Control = Control.Parent.Controls[i] then
      begin
        Result:= i;
        break;
      end;
  end;
end;

// Por ejemplo si queremos saber la posicion del Panel1
ShowMessage(IntToStr(Posicion(Panel1)));

Ahora seguro que viene roman y me dice que existe un IndexOf o algo así :D

Bicho 16-12-2006 00:36:59

Ya echaba yo de menos al agonioso de Domingo :D siempre aguandome las respuestas, pero que te he hecho??? :p

Saludos

p.d: tarco35, olvida mi mensaje, seguro que el codigo de seoane es lo ideneo para tí.

seoane 16-12-2006 00:44:32

Cita:

Empezado por Bicho
Ya echaba yo de menos al agonioso de Domingo :D siempre aguandome las respuestas, pero que te he hecho??? :p

:D La verdad es que no pensaba contestar, pero al ver que lo hacías tu .... :p

Aprovecho para decir, aunque supongo que es evidente, que para saber si un control es el que esta por encima de todos solo hay que hacer algo como esto:

Código Delphi [-]
function EstoyPorEncima(Control: TControl): Boolean;
begin
  Result:= FALSE;
  if Control.Parent <> nil then
    Result:= Posicion(Control) = Control.Parent.ControlCount - 1;
end;

// Por ejemplo
 ShowMessage(BoolToStr(EstoyPorEncima(Panel1),TRUE));

Lepe 16-12-2006 14:04:54

Seoane: ¿Cual es la teoría de ese código?

Se supone que todos los paneles tendrán el parent asignado (el mismo padre), significa que al cambiar su ZOrder, se cambia de sitio en el array Controls??

Según he visto en la VCL, BringtoFront, asigna la propiedad ZOrder a True, por aquí si vería sentido deducir cual está al principio, pero por Controls..... me he perdido.

Saludos

seoane 16-12-2006 14:43:49

La teoria Lepe es la siguiente:

BringToFront llama a la funcion SetZOrder
Código Delphi [-]
procedure TControl.BringToFront;
begin
  SetZOrder(True);
end;

La función SetZOrder llama a SetZOrderPosition
Código Delphi [-]
procedure TControl.SetZOrder(TopMost: Boolean);
begin
  if FParent <> nil then
    if TopMost then
      SetZOrderPosition(FParent.FControls.Count - 1) else
      SetZOrderPosition(0);
end;

Y SetZOrderPosition cambia la posicion del control dentro de la lista de controles:
Código Delphi [-]
procedure TControl.SetZOrderPosition(Position: Integer);
var
  I, Count: Integer;
  ParentForm: TCustomForm;
begin
  if FParent <> nil then
  begin
    I := FParent.FControls.IndexOf(Self);
    if I >= 0 then
    begin
      Count := FParent.FControls.Count;
      if Position < 0 then Position := 0;
      if Position >= Count then Position := Count - 1;
      if Position <> I then
      begin
        FParent.FControls.Delete(I);
        FParent.FControls.Insert(Position, Self);
        InvalidateControl(Visible, True);
        if not (csLoading in ComponentState) then
        begin
          ParentForm := ValidParentForm(Self);
          if csPalette in ParentForm.ControlState then
            TControl(ParentForm).PaletteChanged(True);
        end;
      end;
    end;
  end;
end;

¿Lo ves ahora? :confused:

Lepe 16-12-2006 20:32:57

Pues sip, el caso es que tuve un problema con el JetEdit (editor rápido que uso para ver un .pas). Solo pude llegar al primer paso de SetZOrder(True), de ahí que me extrañase mucho.

Asias y perdone usted por hacerle perder tiempo ;)

Saludos

tarco35 17-12-2006 11:26:18

Gracias...
 
Gracias por su colaboracion... me ha sido muy util.... reciban un cordial saludo


La franja horaria es GMT +2. Ahora son las 12:48:41.

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