Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   "Macros" como en Clipper ? (https://www.clubdelphi.com/foros/showthread.php?t=27320)

gluglu 17-11-2005 12:30:38

"Macros" como en Clipper ?
 
Hola Amigos,

Es posible la utilización en Delphi de lo que antes en Clipper se denominaba "Macros" ?

Algo así como:
Código:

For I := 1 to 40 do begin
  Aux_Macro := 'RadioButton'+Trim(IntToStr(I));
  &Aux_Macro.Caption := ' ..... (lo que sea)';
end;

Saludos a todos ! ;)

marcoszorrilla 17-11-2005 14:56:44

La macrosustitución es algo que no puede hacerse con Delphi, aunque el ejemplo que muestras en el que se supone que quieres poner un mismo caption a varios botones, sería posible recorriendo la colección de componentes y detectando los que sean Tbutton.....


Un Saludo.

gluglu 17-11-2005 15:36:08

Muchas gracias Marcos,

Lo que pasa es que no me vale esa solución ya que el ejemplo que he puesto verdaderamente no es así como lo necesito.

En concreto: Tengo un Form que representa el Rack de Habitaciones de un hotel, y en el cual voy a tener 75 "Fichas", una para cada habitación, y dependiendo de si está ocupada, libre, pendiente de salida, ... (etc), cada habitación, su "ficha" debe de adquirir un color diferente.

Para cada Ficha tengo en mi Form un grupo de componentes, tales como Shape's, Label's, etcétera, que entre otras cosas muestran los números de habitación, nombre del cliente, ...

Por supuesto, dentro del form tengo otros Shape's, Label's ...

Lo que quería era poder campiar los atributos de cada "Ficha" sin tener que hacer siempre referencia al nombre del componente en concreto.

Por ejemplo : "Ficha1".Color := ...., "Ficha2".Color := ...., y así sucesivamente.

Si me creo un procedimiento que me busque el estado de cada habitación (de la 1 a la 75 ...), una vez que he detectado el estado de cada habitación en concreto quería poner entonces ("Ficha"+NºHab).Color := ... ya que dicho proceso lo voy a realizar 75 veces ! y no tener que escribir 75 líneas de código.

Teniendo en cuenta encima que cada "Ficha" tiene algo así como 5 "componentes", tendría que utilizar 75*5 = 375 líneas de código, en vez de utilizar un bucle con 5 líneas, una para cada uno de los componentes que quiero cambiar.

A lo mejor me podeis dar una idea mejor para este tema.

Una vez más, muchas gracias a todos !

maeyanes 17-11-2005 15:44:15

Puedes usar la propiedad Components de TForm.

Código Delphi [-]
for I := 0 to ComponentCount - 1 do
  // Aquí TTipoDeComponenteAModificar puede ser TButton, TPanel, TEdit, etc...
  if Components[i] is TTipoDeComponenteAModificar then
    TTipoDeComponenteAModificar(Components[i]).Color := clRed

Otra opción sería usar RTTI, y para eso puedes hacer una búsqueda en los foros, ya que el tema se ha tratado en más de una ocasión...



Saludos...

jachguate 17-11-2005 17:11:30

Para hacer algo como:

Cita:

Empezado por gluglu
Por ejemplo : "Ficha1".Color := ...., "Ficha2".Color := ...., y así sucesivamente.

Podes hacer:

Código Delphi [-]
var
  i : integer;

begin
  for i := 1 to 75 do
  begin
    TWinControl(FindComponent('Label' + intToStr(i))).Color := ColorHabitacion(i);
    TWinControl(FindComponent('Shape' + intToStr(i))).Color := ColorHabitacion(i);
    //etc.
  end;
end;

Aunque yo prefiero otras implementaciones... esto si que es posible en delphi.

Hasta luego.

;)

pd. He casteado de memoria a TWinControl, supongo que la propiedad Color nace alli... si me equivoco, ya será tu tarea buscar de donde viene o castear a la clase final de cada componente.

gluglu 17-11-2005 17:32:02

Gracias tanto a maeyanes como a jachguate.

He investigado un poco en ese tema (absolutamente nuevo para mi) de RTTI. Uff ! hay muchísima información. Así que me llevará un "cierto" ratito investigar este campo nuevo e ir aprendiendo cada vez más cosas !

Gracias de nuevo por la versión "simplificada" de jachguate que seguramente es lo más inmediato que vengo buscando, pero no obstante lo de RTTI hay que mirarlo !

Saludos

roman 17-11-2005 20:20:52

Cita:

Empezado por jachguate
Aunque yo prefiero otras implementaciones

Yo también. Leyendo por encima lo que se requiere yo optaría como una primera idea por usar un TFrame para las fichas. En él se colocan las componentes con el número de habitación, nombre del cliente, etc.

En la clase del frame se implementa un método para establecer el color:

Código Delphi [-]
case Estado of
  UnEstado: Color := clGreen;
  OtroEstado: Color := clBlue;
  AunOtroEstado: Color := clRed;

  etc.
end;

Incluso, la idea de maeyanes me parece más que suficiente. En su código, TTipoDeComponenteAModificar sería la clase del TFrame.

Desaconsejaría el uso de FindComponent pues, como ya he dicho en otras ocasiones, FindComponent es de por sí un ciclo que recorre las componentes del formulario hasta encontrar la del nombre indicado, de manera que se estaría haciendo este ciclo setentaicinco veces.

EDITO

Y, en resumen, desaconsejaría también RTTI. Tanto con éste como con FindComponent, basas tu código en los elementos de la interfaz de usuario y cualquier cambio que quieras hacerle a ésta te dará dolores de cabeza por los cambios que tendrás que hacer en otras partes del código.

// Saludos


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

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