Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Duda de principiante (https://www.clubdelphi.com/foros/showthread.php?t=84423)

sofiaz 17-10-2013 02:49:05

Duda de principiante
 
Hola! soy nueva en esto y necesito un poco de ayuda. Tengo que hacer un solitario y se me esta complcando para mostrar los montones de cartas.
Se supone que dependiendo del lugar en que la carta ocupe en la pila es el lugar que debe ocupar visualmente, siendo la ultima de la pila la primera en aparecer, que es tapada parcialmente por la anterior y asi...
quiero saber si existe una manera de modificar directamente en cual "Image" debe aparecer... tipo asi, con una variable llamada numImage:
Código Delphi [-]
Form1.image+inttostr(numImage).Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+  cadena+'.jpg');
obviamente eso no me deja... existe una manera de modificarlo directamente en la sentencia??

Caral 17-10-2013 04:11:02

Hola
La pregunta que sigue es:
Que tienes adelantado ?, no nos muestras el codigo, no sabemos por donde van los tiros.
Saludos

sofiaz 17-10-2013 04:22:56

esto es el procedimiento para mostrar la pila, es recursivo:
Código Delphi [-]
procedure MostrarPila1(var pila:tipopila;var pos:reparto.tipopos; var numImage:integer);
var
  cartaSimple:reparto.TipoRegPila;
  cadena,xx:string;
begin
    if pos<>_posNula
      then begin
           reparto.capturar(montones,pos,cartaSimple);
           pos:=cartaSimple.enlace;
           MostrarPila1(montones,pos,numImage);
           cadena:=inttostr(cartasimple.numero)+cartasimple.color;
           xx:='image'+inttostr(numImage);
           Form1.xx.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
           Form1.listBox2.additem(inttostr(cartaSimple.numero)+'  '+cartasimple.color, Form1.ListBox2);
           numImage:=numImage+1;
           end;
end;

como se ve, la variable 'xx' es la que estaba usando ahora de prueba...

Caral 17-10-2013 04:32:07

Hola
Bueno, no entiendo la pregunta.
Lo que he usado para evitar el uso de archivos independientes es archivar las fotos en un form adicional y llamarlas de ahi, se hace mas rapida la aplicacion.
Saludos

sofiaz 17-10-2013 04:39:58

no mira, lo que quiero evitar es esto (es mi solucion transitoria, que es horrible...):
Código Delphi [-]
procedure MostrarPila1(var pila:tipopila;var pos:reparto.tipopos; var numImage:integer);
var
  cartaSimple:reparto.TipoRegPila;
  cadena,xx:string;
begin
    if pos<>_posNula
      then begin
           reparto.capturar(montones,pos,cartaSimple);
           pos:=cartaSimple.enlace;
           MostrarPila1(montones,pos,numImage);
           LugarImagen(numImage,cartasimple);
           Form1.listBox2.additem(inttostr(cartaSimple.numero)+'  '+cartasimple.color, Form1.ListBox2);
           numImage:=numImage+1;
           end;
end; 


procedure LugarImagen(n:integer; cartasimple:tiporegpila);
var
cadena:string;
begin
   cadena:=inttostr(cartasimple.numero)+cartasimple.color;
   with form1 do
   begin
      case n of
        6: image6.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
        7: image7.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
        8: image8.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
        9: image9.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
       10: image10.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
       11: image11.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
       12: image12.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
       13: image13.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
       14: image14.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
       15: image15.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
       16: image16.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
       17: image17.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
       18: image18.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
       19: image19.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
       20: image20.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
       21: image21.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
       22: image22.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
       23: image23.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
       24: image24.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
       25: image25.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
... y sigue muuucho mas...

creo que tiene que haber una solucion si yo pudiera cambiar la sintaxis de lo que anteriormente puse en color.... si yo pudiera cambiar con una variable a que numero de Image quiero cargar la imagen... me explico mejor??

Caral 17-10-2013 04:44:11

Hola
Te explicas bien el que no lo hace bien soy yo.
Como te dije me parece que lo mejor es eliminar el uso de la busqueda de la imagen en un archivo y usar un form adicional en donde simplemente se ponen las imagenes y se buscar por componente asi se hace con menos codigo y creo que mas facil.
Saludos

ecfisa 17-10-2013 04:55:40

Hola sofiaz, bienvenida a Club Delphi :)

Por favor cuando incluyas código en tus mensajes utiliza TAG's para darle mas legibilidad:




Saludos :)

sofiaz 17-10-2013 05:19:55

ecfisa: gracias! y disculpas por lo del codigo.
Caral: serias tan amable de darme un ejemplo, en el caso de que lo haga como vos decis, de como llamo a la imagen. y gracias por contestar!

ecfisa 17-10-2013 06:21:07

Hola sofiaz.

No hay por que disculparse, son detalles lógicos de quienes son nuevos en los foros.

Aparte de la sugerencia que mi amigo Carlos te brinde luego, y que sin dudas tendrá la excelencia de costumbre, te adjunto un código que te aporte otra idea (o tal vez la misma :)) de como podrías automatizar la carga y la muestra de imágenes.

Sólo crea una carpeta, copia y descomprimí el archivo allí (incluye las imágenes de diez cartas).

Saludos :)

Neftali [Germán.Estévez] 17-10-2013 10:33:09

Cita:

Empezado por sofiaz (Mensaje 468483)
no mira, lo que quiero evitar es esto (es mi solucion transitoria, que es horrible...):

Realmente, es horrible!!! :eek::eek::eek:
Lo bueno es que lo reconozcas y quieras arreglarlo... ^\||/
Sé de más de uno que la dejaría así sin ningún remordimiento.




Código Delphi [-]
...   begin
      case n of
        6: image6.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
        7: image7.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
        8: image8.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
        9: image9.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
       10: image10.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
       11: image11.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
       12: image12.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
       13: image13.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
       14: image14.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
       15: image15.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
       16: image16.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
       17: image17.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
       18: image18.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
       19: image19.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
       20: image20.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
       21: image21.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
       22: image22.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
       23: image23.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
       24: image24.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');
       25: image25.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Cartas\'+cadena+'.jpg');


La forma de evitar esto, es utilizar FindComponent.
Con esta función puedes acceder a un componente a partir de una cadena con su nombre.
De esta formas teniendo la variable i y todos los componentes que se llaman image6, image7, image8,... puedes generar un código similar a este:

Código Delphi [-]
var
  compName:string;
  i:integer;
  comp:TComponent;
begin
  for i := 1 to 5 do begin
    // Montar el nombre del componente
    compName := 'image' + IntToStr(i);
    // Usar findcomponent con la cadena
    comp := FindComponent(compName);
    // Nos aseguramos de que lo ha encontrado?
    if Assigned(comp) then begin
      // modificamos el valor
      TImage(comp).Picture.LoadFromFile('r:\imgTest.bmp');
    end
    else begin
      ShowMessage('No he encontrado el componente: ' + compName);
    end;
  end

Caral 17-10-2013 15:54:05

Hola
La forma en que lo hago yo es exacta a la que Neftali te a propuesto, de hecho la aprendí de el.
Lo único que si hago es cargar las imágenes en otro form y llamarlas de ahí, pero es lo mismo.
Saludos

sofiaz 18-10-2013 14:05:31

gracias neftali!!!! creo que eso es exacto lo que andaba buscando.
y gracias ecfisa tambien. Ambas soluciones las voy a probar, recien mañana me puedo poner otra vez con eso.
Muchas gracias por contestar a todos!

sofiaz 19-10-2013 18:58:10

ahora si Neftali, lo hice.
tu solución es perfecta.
saque 110 lineas de código de mas, gracias! :) :) :)

Neftali [Germán.Estévez] 20-10-2013 14:02:49

^\||/^\||/^\||/

Casimiro Notevi 19-05-2016 18:09:45

Cita:

Empezado por juanaHer (Mensaje 505331)
hola soy nueva tambien! y tengo una consulta por un procedimiento recursivo.. el ejercicio es el siguiente: existte una variable de tipo sting denominada FRASE que contiene una leyenda con una palabra delimitada por un par de asteriscos. tambien existe otra variable denominada SUSTITUTO que contiene una palabra. POR EJEMPLO frase: SI LOS PUEDES *ENTENDER* LOS PUEDES PROGRAMAR
SUSTITUTO: IMAGINAR.
Mi proceso recursivo debe devolver la frase con la palabra entender reemplazada por el sustituto... muchisimas gracias! :rolleyes:

Bienvenido, no olvides leer nuestra guía de estilo, gracias :)


La franja horaria es GMT +2. Ahora son las 02:28:54.

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