Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   acceder a objeto mediante una variable (https://www.clubdelphi.com/foros/showthread.php?t=45630)

joanajj 09-07-2007 23:46:32

acceder a objeto mediante una variable
 
Buenas a todos, sabe alguien como conseguir que:

Por ej. tengo en Form1 3 botones:

form1.boton1
form2.boton2
form3.boton3

y quisiera que una variable por ej.

nombreboton:='boton2';

form1.nombreboton.visible:=false;

claro que esto no funciona, pero no sé com hacer que funcione de alguna forma, esto es solo para explicar la idea.


Gracias de antemano....

jhonny 10-07-2007 00:00:38

Te lo explicare a ver si te sirve asi; Tengo una variable llamada BotonGeneral de tipo TButton (No String), a ella le asigno el botón por el que quiero tome forma y a esa variable la trato como si de ese botón se tratara, todo lo que le haga a esa variable se vera reflejado en el botón "Real" ya que lo que hicimos fue hacer que esa variable tomara la posición en memoria de dicho botón. Mejor dicho, un ejemplo:

En un formulario tengo Button1 y Button2, además declare una variable en la sección private llamada BotonGeneral:

Al OnClick de Button2 le coloco:
Código Delphi [-]
  BotonGeneral := Button1;
  BotonGeneral.Visible := False;

Mira como le dije a BotonGeneral que se desapareciera pero notaras que en ejecución todo le sucede a Button1.

Espero me haya hecho entender y que esto te sirva de algo.

Caral 10-07-2007 00:09:12

Hola
Lo unico que se me ocurre seria una variable tipo string, pero sinceramente no le veo el caso, pero bueno seria algo asi:
Código Delphi [-]
var
MiBoton : String;
Begin
MiBoton:= 'form1.nombreboton.visible:=false;';
Esto en realidad se logra con el uses sin tanta complicacion.
Si generas un nonbre asignado a otro:
Código Delphi [-]
MiBoton:= Button1;
MiBoton.Enable:= True;
Para mi lo que estas haciendo, como en el caso anterior es duplicar el codigo sin sentido, no se realmente la funcion que puedas buscar con esto.
Saludos

joanajj 10-07-2007 00:10:52

te amplio algo
 
Gracias por responder.

Ok, lo que comentas es cierto, de hecho así lo tengo, el problema radica en que al pasar el valor para decidir que botón apago, lo paso como string por razones que sería muy largo de explicar.

Tu comentas hacer esto:

declaro botongeneral:tbutton;

y luego:

BotonGeneral := Button1;
BotonGeneral.Visible := False;

ok, pero mi problema es que debo pasarlo de esta manera:

nombreboton[5]:=`boton1`; ----> matriz tipo string con varios nombres de botones
...
...

BotonGeneral := nombreboton[5];--->aquí radica el problema.

botongeneral.visible:=false;

y me da error de que no coinciden los tipo tbutton y string;

Comprendes lo que necesito hacer???

Un saludo...

Gregory Mazon 10-07-2007 00:18:49

Intenta lo siguiente:

BotonGeneral := nombreboton[5];
TButton(botongeneral).visible:=false;

o simplemente:

TButton(nombreboton[5]).Visible := False;

eduarcol 10-07-2007 00:26:16

y no puedes crear la matriz de tipo TButton??

en caso de que no puedas lo otro seria esto,

Código Delphi [-]
BotonGeneral := Form1.FindComponent(nombreboton[5]);

BotonGeneral sigue siendo declarada como te lo explico jhonny

jhonny 10-07-2007 00:42:22

Bueno, hice la prueba como indica eduarcol, pero como no me dejo compilar, entonces tuve que hacerlo un cambio:

Código Delphi [-]
BotonGeneral := TButton(FindComponent(nombreboton[5]));

También funciona con:
Código Delphi [-]
BotonGeneral := TButton(FindChildControl(nombreboton[5]));

eduarcol 10-07-2007 00:48:37

Perdon se me olvido realizar el cast, porq estaba pensando en referenciar la respuesta de gregory.

La diferencia entre FindChildControl y FindComponent es que el primero no lo va a encontrar si esta dentro de un control contenedor, solo encuentra los hijos directos del control referenciado

seria bueno antes del cast verificar si encontro un objeto de la clase TButton o no haya devuelto un nil porq si no da error

jhonny 10-07-2007 00:58:41

Cita:

Empezado por eduarcol
seria bueno antes del cast verificar si encontro un objeto de la clase TButton o no haya devuelto un nil porq si no da error

Eso es muy cierto, entonces yo haría la cosa al revés, declaro Botongeneral como TComponent y el procedimiento lo dejo asi:

Código Delphi [-]
 
procedure BotonVisible;
begin
  BotonGeneral := nil;
  BotonGeneral := FindComponent(nombreboton[5]);
  if BotonGeneral <> nil then
    TButton(BotonGeneral).Visible := False;
end;
De esa manera me evito el salto de dicho error que comentaste.

eduarcol 10-07-2007 01:03:05

jejeje, bueno bueno ya no me piques, esta muy buena tu solucion. aunque seria mejor crear la matriz de controles en lugar de estar buscandolo,

si te sigo la corriente jhonny seguro armamos un lio como el de los numeros

joanajj 10-07-2007 01:05:09

No lo consigo(os explico para que lo necesito)
 
Sres. he probado de todo y na de na.

Para que salgáis de la intriga, estoy intentando hacer un juego de parchís, y para cada ficha utilizo un Tjvimage de las JVCL, para así gestionar y mover cada ficha. Así tengo por ej. fichaaz1, fichaaz2,fichaaz3,fichaaz4, ficharo1,ficharo2,etc. hasta completar las 16 fichas, esto me pareció más sencillo que estar con Sprites y gráficos.

Entonces tengo una matriz tipo string onde establezco que ficha hay en cada casilla, así por ej. en quien[10]:='fichaaz2', me indica que en la casilla 5 2ª ficha está la 2ª ficha azul. Hasta ahí todo bien, pero claro en un momento dado necesito ese dato para operar. Entonces para por ej. mover la fichaaz2 a la casa necesito hacer que fichaaz2.left:=21 y fichaaz2.top:=100, pero el problema que estoy teniendo es que el nombre del objeto(tjvimage) es un string y no puedo utizarlo directamente.

He hecho:

nomficha:tjvimage;

pero claro no consigo que el string quien[10] sea el nombre del objeto. Haceros a la idea de algo así : quien[10].left:=21;
por supuesto no funciona, pero es la idea gral.

Gracias por vuestro interés...

jhonny 10-07-2007 01:05:54

Cita:

Empezado por eduarcol
si te sigo la corriente jhonny seguro armamos un lio como el de los numeros

Jejeje, Debo confesar que cada cosa que escribo en este hilo, me hace recordar el rollo de los números y hasta miedo me da :D.

jhonny 10-07-2007 01:09:23

Cita:

Empezado por joanajj
Sres. he probado de todo y na de na.

Para que salgáis de la intriga, estoy intentando hacer un juego de parchís, y para cada ficha utilizo un Tjvimage de las JVCL, para así gestionar y mover cada ficha. Así tengo por ej. fichaaz1, fichaaz2,fichaaz3,fichaaz4, ficharo1,ficharo2,etc. hasta completar las 16 fichas, esto me pareció más sencillo que estar con Sprites y gráficos.

Entonces tengo una matriz tipo string onde establezco que ficha hay en cada casilla, así por ej. en quien[10]:='fichaaz2', me indica que en la casilla 5 2ª ficha está la 2ª ficha azul. Hasta ahí todo bien, pero claro en un momento dado necesito ese dato para operar. Entonces para por ej. mover la fichaaz2 a la casa necesito hacer que fichaaz2.left:=21 y fichaaz2.top:=100, pero el problema que estoy teniendo es que el nombre del objeto(tjvimage) es un string y no puedo utizarlo directamente.

He hecho:

nomficha:tjvimage;

pero claro no consigo que el string quien[10] sea el nombre del objeto. Haceros a la idea de algo así : quien[10].left:=21;
por supuesto no funciona, pero es la idea gral.

Gracias por vuestro interés...

Disculpa pero, ¿Ya leíste los post anteriores?, eduarcol te sugiere una matriz de controles y ademas de eso, entre los dos hemos sacado un procedimientico que quizá te sirva. ¿Ya probaste con algo de ello o definitvamente no sirven esas soluciones?

joanajj 10-07-2007 01:10:11

si he probado
 
he probado y nada...

egostar 10-07-2007 01:10:51

Cita:

Empezado por jhonny
Jejeje, Debo confesar que cada cosa que escribo en este hilo, me hace recordar el rollo de los números y hasta miedo me da :D.

:D:D:D, Siento no poder acompañarlos con este tema ya que escapa de mis pocos, que digo pocos, mas bien nulos conocimientos.

Será para la otra....:eek:

Digo, solo por si estaban preocupados porque no he intervenido :D:p

Salud OS.

jhonny 10-07-2007 01:14:47

Cita:

Empezado por joanajj
he probado y nada...

Esta bien, entonces muestranos el pedacito de codigo donde recorres dicha matriz y tratas de hacer aparecer y desaparecer botones con dicho nombre para ver en que te podemos colaborar. ;)

Cita:

Empezado por egostar
Digo, solo por si estaban preocupados porque no he intervenido

No sabes el vértigo que me dio cuando vi que habías respondido :D :D :D

eduarcol 10-07-2007 01:15:53

Cita:

Empezado por egostar
Digo, solo por si estaban preocupados porque no he intervenido :D:p

Pues la verdad esperaba que aparecieras con la solucion facil. por ejemplo

MoverFicha

pues ya que no, a mi se me ocurre ¿porq no utilizas la matriz de controles?

lo unico que tendrias que hacer es que luego de mover en la gui lo mueves en la matriz igualando en la siguiente posicion y haciendo null la actual

piensalo y avisas

egostar 10-07-2007 01:29:06

Cita:

Empezado por eduarcol
Pues la verdad esperaba que aparecieras con la solucion facil. por ejemplo

MoverFicha

pues ya que no, a mi se me ocurre ¿porq no utilizas la matriz de controles?

lo unico que tendrias que hacer es que luego de mover en la gui lo mueves en la matriz igualando en la siguiente posicion y haciendo null la actual

piensalo y avisas

Me pegaste donde duele amigo:D:D:D

Haber, aun no entiendo eso de que el nombre del objeto es un string, pero si se que un objeto tiene la porpiedad name, yo sugiero esto, haber si con la ayuda de los que si saben podemos llegar a una solución.

Sabemos que el name de x objeto es 'fichaaz2'

Pasando el nombre tal cual:

Código Delphi [-]
   Image1.Name := 'fichaaz2';

y luego, en este ejemplo al dar doble click a la imagen

Código Delphi [-]
procedure TForm1.fichaaz2DblClick(Sender: TObject);
begin
    with Sender as TImage do begin
       if (Sender as TImage).Name = 'fichaaz2' then begin
          (Sender as TImage).Top := 100;
          (Sender as TImage).Left := 21;
       end;
    end;
end;

Salud OS.

eduarcol 10-07-2007 01:42:08

Cita:

Empezado por egostar
Me pegaste donde duele amigo:D:D:D

JEJEJE conste que no queria pero aqui voy yo tambien

Cita:

Empezado por egostar
Haber, aun no entiendo eso de que el nombre del objeto es un string, pero si se que un objeto tiene la porpiedad name

y name es de que tipo ?


Ahora yo me sigo inclinando por un matriz de controles

Código Delphi [-]
//Para Declarar
var
   MiMatriz: Array[0..yy] of Tjvimage

...

//Para asignar
MiMatriz[n] := fichaaz2;  //Sin los apostrofes porq igualamos es al control

...

//Para Utilizar
MiMatriz[n].Left := 120;

...

//Para cambiar de posicio
MiMatriz[x] := MiMatriz[n];
MiMatriz[n] := nil;

Donde n y x son valores del indice que necesites en ese momento dependiendo como lo determines

yy = numero de controles a utilizar

espero sea lo que buscas

Neftali [Germán.Estévez] 10-07-2007 10:04:50

Ya te han puesto el código que funciona correctamente:

Cita:

Empezado por joanajj
...pero claro no consigo que el string quien[10] sea el nombre del objeto. Haceros a la idea de algo así : quien[10].left:=21;
por supuesto no funciona, pero es la idea gral.

Si tienes el combre del componente en un string, con este código puedes acceder al componente:

Código Delphi [-]
procedure BotonVisible;
begin
  BotonGeneral := nil;
  BotonGeneral := FindComponent(nombreboton[5]);
  if BotonGeneral <> nil then
    TButton(BotonGeneral).Visible := False;
end;

Sólo que en tu caso debes cambiar el Button por un Tjvimage.

Algo así:

Código Delphi [-]
procedure CambiarFicha;
begin
  FichaGeneral := nil;
  FichaGeneral := FindComponent(quien[10]);
  if FichaGeneral <> nil then
    TJVImage(FichaGeneral).Left := 5;  
    TJVImage(FichaGeneral).Top := 100;
    ....
end;

Nota: Yo utlizaría parámetros en esta función para pasar nombre, Left, Top,...


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

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