PDA

Ver la Versión Completa : Problema con Asignacion a un Objeto.


BEPAI
02-04-2007, 10:42:08
Hola.
Tengo 150 objetos Tpanel y dentro de estos e incustrado un objeto Updown, y los he relacionado para que incrementen. Sin problema.
Ahora quiero ponerlos a un valor determinado en ejecución:....creo un boton y con el evento BitBtnClick quiero hacer la asignacion y este es el código que no me funciona....

procedure TPANEL1.BitBtn1Click(Sender: TObject);
var a,resto:smallint;
cad:string;
begin

for a:=1 to 150 do begin
resto:= a mod 2;
if resto=0 then begin
'Updown'+inttostr(a)+'.Position':=999;
end
else begin
'Updown'+inttostr(a)+'.Position':=0;
end;

end;
end;



Un saludo. Tenéis un portal de muy excelente a muy excelentísimo.

Neftali [Germán.Estévez]
02-04-2007, 10:55:09
Debes utilizar FindComponent Para acceder a un componente a partir de su nombre.
Revisa la ayuda y encontrarás ejemplos...


// Supongo que es esto lo que quieres hacer....
FindComponent('Updown'+inttostr(a)).Posicion ....

BEPAI
02-04-2007, 11:30:44
Por favor podrías ponerlo completo, yo lo he modificado en el siguiente sentido:


procedure TPANEL1.BitBtn1Click(Sender: TObject);
var a,resto:smallint;
cad:string;
begin

for a:=1 to 150 do begin resto:= a mod 2;
if resto=0 then begin
Findcomponent('Updown'+inttostr(a)).Position:=999;
end
else begin
Findcomponent('Updown'+inttostr(a)).Position:=0;
end;

end;
end;

.........y no funciona. Estoy en pañales en esto.
Saludos.

Neftali [Germán.Estévez]
02-04-2007, 11:40:44
Para hacerlo bien sería algo así:


var
comp:TComponent;
begin
...
// Buscar el componente...
comp := FindComponent('Updown'+inttostr(a));
// Encontrado?
if Assigned(com) then begin
// Comprobar que es del tipo correcto?
if (comp is TUpDown) then begin
TUpDown(comp).Position := 999;
end;
end;
...


De forma similar para el otro.
Una vez que has encontrado el componente (que se devuelve como tipo generico) hay que hacer el CAST, para poder acceder a el con el tipo correcto (en este caso TUpDown).

BEPAI
02-04-2007, 13:10:46
Encontré esto:


{The following example creates 20 edit boxes, using FindComponent with the edit box name to access each newly created edit box.}
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
const
NamePrefix = 'MyEdit';
begin
for i := 1 to 20 do begin
TEdit.Create(Self).Name := NamePrefix + IntToStr(i);
with TEdit(FindComponent(NamePrefix + IntToStr(i))) do
begin
Left := 10;
Top := i * 20;
Parent := self;
end;
end;
end;

Lo de self no lo entiendo, pero bueno, de todas formas muy agradecido.

Neftali [Germán.Estévez]
02-04-2007, 14:29:21
{The following example creates 20 edit boxes, using FindComponent with the edit box name to access each newly created edit box.}
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
const
NamePrefix = 'MyEdit';
begin
for i := 1 to 20 do begin
TEdit.Create(Self).Name := NamePrefix + IntToStr(i);
with TEdit(FindComponent(NamePrefix + IntToStr(i))) do
begin
Left := 10;
Top := i * 20;
Parent := self;
end;
end;
end;


Aquí lo que está haciendo es crear 20 componentes y luego acceder a ellos utilizando FindComponent, cosa bastante tonta por cierto, ya que FindComponent no es muy eficiente y sólo se debería utilizar cuando no exista otro remedio, como en tu caso, pero no aquí que ya están disponibles los 20 componentes (por lo tanto no tiene sentido buscarlos con este método).

Sólo le encuentro sentido como muestra de utilización, pero creo que el código no es muy acertado, no porque sea incorrecto, sino porque muestra una programación muy ineficiente.

El Self, se refiere al "objeto actual"; Si te fijas en la definición de los procedimientos lo verás claramente:


// En este contexto el Self es el objeto de la clase TForm1 que está
// ejecutando ese código
procedure TForm1.Button1Click(Sender: TObject);
...
<código aquí>



// Si el código estuviera aquí el Self sería el objeto de la clase TPanel1 que
// está ejecutando ese código
procedure TPANEL1.BitBtn1Click(Sender: TObject);
...
<código aquí>

BEPAI
03-04-2007, 10:15:45
Muy agradecido, Neftalí.
Mi nivel es muy bajo y necesitaría hacer un curso para coger un poco de nivel, ya que tengo que hacer unas aplicaciones personales, sin más remedio.
Yo vivo en Segovia y aquí no hay nada donde den este lenguaje.Me tendría que desplazar a Madrid y hacerlo en los fines de semana. Quizás me podríais indicar algo interesante en esta ciudad.
(Perdón, porque sé que es un tema distinto)

Un saludo.

Lepe
03-04-2007, 11:15:18
la cara oculta de delphi 4 es un pdf famosísimo, gratuito y ameno (al menos la primera vez que se lee ;)). En google lo encuentras sin problemas.

Saludos

BEPAI
09-04-2007, 11:47:24
Aquí lo que está haciendo es crear 20 componentes y luego acceder a ellos utilizando FindComponent, cosa bastante tonta por cierto, ya que FindComponent no es muy eficiente y sólo se debería utilizar cuando no exista otro remedio, como en tu caso, pero no aquí que ya están disponibles los 20 componentes (por lo tanto no tiene sentido buscarlos con este método).

Sólo le encuentro sentido como muestra de utilización, pero creo que el código no es muy acertado, no porque sea incorrecto, sino porque muestra una programación muy ineficiente.

Neftalí, lo que intento es colocar una matriz[1..15,1..10], en la que tengo que modificar datos cuando se ejecute el programa.¿Podrías darme una idea de como hacerlo más fácil y eficiente?Muchas gracias.

Lepe, gracias, lo he leído varias veces, pero creo que lo que se necesita es práctica para adquirir soltura.

Un saludo.

Lepe
09-04-2007, 14:51:26
Para obtener una respuesta acertada, sería mejor empezar desde el principio.

- ¿como creas los 150 paneles?
- ¿como los destruyes? o si no haces nada, pues lo dices.
- El famoso array [1..15, 1..10] of ?????? ¿de qué son?
- ¿como creas los botones y updown?

Todo eso es necesario saberlo, (si es con código mucho mejor).

¿Se podría cambiar la dinámica o no? Me explico: Quizás fuera mejor hacer un Frame, un panel, en definitiva, un contenedor de componentes. En tiempo de diseño, colocas los botones, el updown y todo lo que necesites.

En ejecución, solo tendrías que crear instancias de ese panel o TFrame. Como es un contenedor de objetos, se simplificaría el acceso a sus botones y a todo lo que contenga.

Saludos

BEPAI
09-04-2007, 16:43:42
- ¿como creas los 150 paneles?
A puro güebo. Pincho un panel y lo coloco en el Form1. Pincho un Updown y lo inserto dentro del panel que he colocado. Selecciono los dos, Ctrl-C(copiar), Ctrl-V(pegar), y así hasta los 150.
- ¿como los destruyes? o si no haces nada, pues lo dices.
Con lo que me ha costado organizarlos !!!!
- El famoso array [1..15, 1..10] of ?????? ¿de qué son?
shortint.(enteros de los de antes)
- ¿como creas los botones y updown?
Creo que ya te he respondido, pero no te rías, que va en serio.

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

¿Se podría cambiar la dinámica o no? Me explico: Quizás fuera mejor hacer un Frame, un panel, en definitiva, un contenedor de componentes. En tiempo de diseño, colocas los botones, el updown y todo lo que necesites.

En ejecución, solo tendrías que crear instancias de ese panel o TFrame. Como es un contenedor de objetos, se simplificaría el acceso a sus botones y a todo lo que contenga.


Todo esto me suena a chino, te lo juro. Lo del Frame, colocar los componentes,.............., nunca he hecho nada de esto.

Estoy más pegao que yo que sé.

Un saludo.

Lepe
09-04-2007, 19:48:32
A ver, en este mensaje (http://www.clubdelphi.com/foros/showpost.php?p=144169&postcount=7) tengo un ejemplo. baja, compila y ejecuta.

Ese programa se encarga de crear 30 frames (para tí paneles) en ejecución, es decir, tú pones un panel en el form, ahora, dentro del panel pones un memo, y cuando ejecutas el programa, delphi creará 30 paneles iguales y los sitúa (modificando el Left y Top de cada panel) en pantalla.

Si te interesa la forma en que se ha hecho, te aclaro lo que haga falta.
Si decides continuar con tu programa, como lo tienes ahora, pues seguimos con él.

No creo que esté de más ver otro punto de vista.

Edito: cuando ejecutes el programa,
1 - elige del calendario una fecha (el día da igual) solo importa el mes.
2 - haz clic en el botón que pone "Crea mes".


Saludos

BEPAI
10-04-2007, 13:28:35
Muchas gracias, Lepe.
Yo creo que sobre la marcha es la mejor forma.
Entiendo lo que has hecho con tu programa, cuando creas los frames y cuando los destruyes, creas frame a frame y los ubicas en el panel. Nueva fecha, destruyes frames, calculas como queda el mes y creas frames en su posición mensual correspondiente.

Te explico un poco lo que quiero hacer, que aunque sea una mentalidad de otra galaxia, pues para mí el resultado, como mínimo, es cómodo y más manejable, ya que necesito tenerlo en pantalla.

Para la matriz:
-un panel con un updown, función incremento-decremento, por posición de la matriz, para modificar con el ratón.
-un botón para poner a 0 la matriz, inicializacion.
-un botón para cargar datos de unos archivos de texto, y actualizar matriz en función de fechas,etc,...; pondré algo para el año(añomin-añomax) y para el día(diamin-diamax),....; y claro supongo que se pueden hacer cosas impresionantes, pues yo estos datos los importo también con Excel y los tengo en colores con formato condicional, etc,etc,.....pero no quiero complicar el tema.

Para los cálculos (en función de los datos de la matriz actual)
Tendré que pasar los datos de los Updown a la matriz para actualizar y tenerla fresca para ejecutar los procesos:
-boton de proceso_1:Actualizar matriz.Se ejecuta en función de la matriz actual y según el código de este botón.
-botón de proceso_2:idem.
-botón de proceso_3:idem.
-botón de proceso_4:idem.
-botón de proceso_5:idem.
Supongo que los datos los sacaré en un memo(¿que es un memo?), yo antes utilizaba los datos tipo texto, utilizando textbackground() y textcolor() y me sobraba. Supongo que cogeré una filosofía de trabajo y me haré a lo que necesite, y con eso trabajaré.

Salir.-Guardar matriz en archivo *.txt y Salir.

Ejecutar.(Iniciar aplicación)-Cargar matriz y asignar a los Updown, que los tendré siempre en pantalla.

OJO.-¡¡¡¡ Espero no tener problemas de memoria !!!!

No sé si se me escapa algo, se que es código de Neardental, pero es lo que sé. Leo y leo,........y me lio y me lío. Son muchas cosas en poco tiempo. Me surgen muchas ideas pero no sé implementarlas, leo y leo.., bueno voy poco a poco.

Voy a ir poco a poco y si me surge algo, lo coloco aquí en este hilo como consulta.

Muy agradecido a todos.
Un saludo.