Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   shape en tabla (https://www.clubdelphi.com/foros/showthread.php?t=42303)

anubis 11-04-2007 10:18:43

shape en tabla
 
Bueno, perdonadme si sigo preguntando cosas elementales:confused:.

Ya voy resolviendo cosillas del programa, mirando aqui y alla, pero todavia hay cosas que me fallan.
He tenido que hacer un monton de cuadritos que representan habitaciones, cuando se pulsa una tiene que salir un procedimiento. El problema es que hice todos los cuadritos a mano con sus labels, pero como cada uno genera un eventoclick, son demasiados para hacerlos a mano, preguntaba si era posible meterlos en una tabla pero no se como puesto que todos estan creados manualmente.

son del tipo form1.label1click......se podria meter el labelx en la tabla y en funcion del label que se pulse sacar algo asi como label[1]click?

gracias

Neftali [Germán.Estévez] 11-04-2007 11:19:12

No hace falta que crees un procedimiento para cada label, sino que puedes usar para todos los labels el mismo procedimiento. Por ejemplo haz que todos los labels apunten a label1click.
Dentro de este procedimiento tienes el parámetro Sender que te indica cual de los labels se ha pulsado realmente.

Código Delphi [-]
var
  lbl:TLabel;
begin
  // Es un label?
  if (Sender is TLabel) then begin
    lbl := TLabel(Sender);

    // aquí ya puedes trabajar con lbl
    (1)

  end;

En el punto (1) la variable lbl apunta al label sobre el que se ha pulsado el Click, label1, label2,.....

anubis 11-04-2007 19:15:43

gracias. Tengo una duda respecto a eso, uno de los cuadros es este
Código Delphi [-]
procedure Tfentrada.Lh101Click(Sender: TObject);

     var habita:integer;
 begin

 habita:= h101.Brush.Color;

 if habita = clYellow  then
      begin
      habita:=clRed;
      h101.Brush.color:=habita;
      Lh101.Font.Color:=clYellow
      end
  else
      begin
      habita:=clYellow;
      Lh101.Font.Color:=clBlack;
      h101.Brush.color:=habita
      end
end;
el procedimiento que me mencionas donde debe de ir, ademas los labels estan renombrados asi lh101 y cambiara en funcion de la habitacion lh102...

la verdad es que con vuestra ayuda estoy aprendiendo mucho, a ver si tambien puedo ayudar a otros.

Neftali [Germán.Estévez] 11-04-2007 19:30:53

Ese procedimiento es el OnClick que estás programando. En tu ejemplo, si todos los OnClick de los Labels te apuntan a este prodecimiento podrías usarlo de esta forma:

Código Delphi [-]
procedure Tfentrada.Lh101Click(Sender: TObject);
  var habita:integer;
begin

 habita:= h101.Brush.Color;

 if habita = clYellow  then
      begin
      habita:=clRed;
      h101.Brush.color:=habita;
      TLabel(Sender).Font.Color:=clYellow
      end
  else
      begin
      habita:=clYellow;
      TLabel(Sender).Font.Color:=clBlack;
      h101.Brush.color:=habita
      end
end;


Ahora queda el tema del control h101 que habría que hacer algo similar. Supongo que es un control que está relacionado con la etiqueta que se llama igual (o casi igual). Para ese caso se puede utilizar un FindComponent.

¿De qué tipo es este control?

Código Delphi [-]
var
  comp:Tcomponent;
begin
  comp := FindComponent('L' + Sender.Name);
  // esto te daría que la variable comp está apuntando al compoenente Lh101, Lh102,...
  // dependiendo si has pulsado sobre la label h101, h102,...

anubis 11-04-2007 21:32:45

gracias me estas ayudando mucho.

este control donde lo pongo, lo he puesto en initialization pero me da error en el componente FindComponent
la verdad es que tambien me puede servir para cambiar el shape que he puesto al poner h101 se puede poner en vez de h101.brush.color tshape.brush.color?

gracias de nuevo asi da gusto aprender.

Código Delphi [-]
var
  comp:Tcomponent;
begin
  comp := FindComponent('L' + Sender.Name);
  // esto te daría que la variable comp está apuntando al compoenente Lh101, Lh102,...
  // dependiendo si has pulsado sobre la label h101, h102,...

Neftali [Germán.Estévez] 12-04-2007 12:00:29

El h101, h101 son Shapes...
Entonces quedaría así:

Código Delphi [-]
procedure Tfentrada.Lh101Click(Sender: TObject);
var 
  habita:integer;
  comp:TShape
  lbl:TLabel;
  nom:String;
begin

  // Acceder al label
  lbl := TLabel(Sender);
  // Acceder al pabel relacionado con ese label
  nom := copy(lbl.Name, 2, Length(lbl.Name));
  // Con esto si el label es el lh101 nom valdrá h101, 
  // buscamos el shape con ese nombre
  comp := TShape(FindComponent(nom));



  habita:= comp.Brush.Color;

  if habita = clYellow  then begin
      habita:=clRed;
      comp.Brush.color:=habita;
      lbl.Font.Color:=clYellow
      end
  else
      begin
      habita:=clYellow;
     lbl.Font.Color:=clBlack;
      comp.Brush.color:=habita
      end
end;

Te he puesto el código de memoria, pero debe funcionar, salvo que haya cometido algun error de sintaxis. Lo más importante es que lo entiendas.
Ahora puedes hacer que todos los labels apunten a este OnClick; Si pulsas sobre lh101 funcionará con esa label y con el shape h101, si pulsas lh102 y el shape h102, y así sucesivamente...

AÑADO: Una vez que funcione, faltarían las comprobaciones de posibles errores en el FindComponent, y el los CAST.

Un saludo.

anubis 12-04-2007 20:04:46

gracias de nuevo. Error no da, pero sigue funcinando solo para el lh101, no habria que poner algo en algun otro sitio para que capturara el evento de cualquier label? porque solo ejecuta la procedure solo si se pulsa la lh101 para otras no entra.

Neftali [Germán.Estévez] 13-04-2007 11:31:19

Cita:

Empezado por anubis
gracias de nuevo. Error no da, pero sigue funcinando solo para el lh101, no habria que poner algo en algun otro sitio para que capturara el evento de cualquier label? porque solo ejecuta la procedure solo si se pulsa la lh101 para otras no entra.

En el OnClick del resto de label debes apuntar a este mismo evento.

anubis 13-04-2007 12:23:37

si, gracias, ya seleccione todos los label y les apunte para esa procedure, muchas gracias, funciono.
Una ultima cosa rapida, si quiero que el nom resultante de la procedure lo pueda visualizar con el dato almacenado en el form que aparece al pulsar el label, como se puede hacer, porque lo intente declarar como public y no me deja.

gracias de nuevo

Neftali [Germán.Estévez] 13-04-2007 17:26:13

En ese mismo procedimiento puedes acceder a todo el form:

Código Delphi [-]
  ...
  // esto debería modificar el título del form, por ejemplo...
  Self.Caption := nom;
  ...

anubis 13-04-2007 20:47:52

perdon, me referia a visualizarlo en otro form, poder usar las variables y su contenido en otros forms.

gracias por las molestias

Neftali [Germán.Estévez] 16-04-2007 11:48:02

Crea una propiedad en la parte pública de ese form. Desde el evento le asignas el valor y desde fuera (otros formularios) podrás consultar esa propiedad sin probblemas.

anubis 16-04-2007 12:27:00

Muchas gracias, me ha funcionado.

cada vez aprendo mas...con vuestra ayuda y se me hace menos frustrante.

gracias de nuevo

yo sigo preguntando...


La franja horaria es GMT +2. Ahora son las 21:35:47.

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