Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   C++ Builder 6 Ayuda (https://www.clubdelphi.com/foros/showthread.php?t=86839)

Gonza10 10-10-2014 23:25:37

C++ Builder 6 Ayuda
 
Hola gente, necesito que me ayuden con un problema, soy estudiante de programación recién estamos empezando a usar c++ builder 6 y todavía no le agarro la mano, el tema es que me dieron un ejercicio que consiste en hacer un cartel led, nose ni por donde empezar ni que usar. Si alguien me podría dar una mano se agradecería mucho! Saludos.

aguml 11-10-2014 08:28:25

hay componentes led que puedes instalar, incluso alfanumericos, pero supongo que no puedes usarlos. Otra opcion es usar TImages y canvas para mostrar leds.

Casimiro Noteví 11-10-2014 10:50:41

Cita:

Empezado por Gonza10 (Mensaje 482907)
Hola gente, necesito que me ayuden con un problema, soy estudiante de programación recién estamos empezando a usar c++ builder 6 y todavía no le agarro la mano, el tema es que me dieron un ejercicio que consiste en hacer un cartel led, nose ni por donde empezar ni que usar. Si alguien me podría dar una mano se agradecería mucho! Saludos.

Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo?, gracias por tu colaboración :)

Gonza10 11-10-2014 17:30:31

Cita:

Empezado por aguml (Mensaje 482928)
hay componentes led que puedes instalar, incluso alfanumericos, pero supongo que no puedes usarlos. Otra opcion es usar TImages y canvas para mostrar leds.

me podrias ayudar a como hacerlo?, solo guiame, el resto me arreglo yo :)

Casimiro Noteví 11-10-2014 17:40:32

Cita:

Empezado por Gonza10 (Mensaje 482907)
nose ni por donde empezar ni que usar.

Puedes empezar explicando exactamente qué quieres hacer.

Gonza10 11-10-2014 17:44:43

Cita:

Empezado por Casimiro Notevi (Mensaje 482939)
Puedes empezar explicando exactamente qué quieres hacer.

Necesito crear un tablero led, donde yo ponga en un edit lo que quiero que se proyecte (números, Letras). Luego que el texto en el cartel se mueva de izquierda a derecha y viceversa.

Casimiro Noteví 11-10-2014 18:20:47

¿Y en qué parte tienes problemas?

aguml 11-10-2014 20:58:11

algo muy sencillo que se me ocurre es que uses un fuente tipo digital y uses por ejemplo un TLabel que le pongas el fondo negro y lo que escribas en el TEdit lo muestras en el TLabel en rojo y con fuente digital. Para el movimiento usas un TTimer a por ejemplo 500 milisegundos, pones una variable global int x=1, y dentro del evento del timer haces algo como: if(x>Edit1->Text->Length()) x=1; Label1->Caption = Edit1->Text->SubString(x, Edit1->Text->Length()); y con eso consegurias el efecto de movimiento de derecha a izquierda.

escafandra 12-10-2014 15:19:44

Debes analizar el problema.
- ¿Te lo piden con displays de 7 segmentos o con matriz de led? No va a haber mucha diferencia.
- En cualquiera de los dos casos, deberás numerar los led y realizar para carácter una secuencia de led encendidos para representarlo a tu gusto. Esa secuencia puede ser un simple array numérico.
- Elije un control, que puede ser un simple TShape que coloreas según la secuencia de led encendidos que previamente habías establecido para él. Esos controles los tienes numerados para tal fin.
-El Movimiento lo consigues cambiando las columnas del control representador.

El resto es pensar si esto te sirve como comienzo y ponerse a trabajar.


Saludos.

aguml 14-10-2014 00:04:01

los componentes TMS tienen unos que son pantallas leds y son muy reales. La verdad es que me gustaria saber de algun escrito que trate la creacion de un componente visual desde 0, o sea, que no sea derivado de otro ¿Sabeis de alguno asi? Por ejemplo, para hacer el componente de leds ese supongo que no puede descender de ninguno estandar ¿No?

Casimiro Noteví 14-10-2014 00:19:58

Venga, no seas perezoso :p
Hazlo a mano, así aprenderás.
Si usas un componente ya hecho entonces no aprenderás nada.

aguml 14-10-2014 01:15:42

a ver, no me expliqué bien. Lo que quiero saber es como hacen para crear un componente como ese ya que lo normal es hacerlo descendiendo de uno que ya exista pero no les veo parecido con ninguno. Ademas, si añades un TEdit en el modo diseño ves un rectangulo blanco con la forma que mostrará cuando lo ejecutes, si añades uno de estos de leds ves el rectangulo con el aspecto que tendrá en ejecucion... ¿Como se hace para que muestre eso asi en modo diseño? La verdad es que no lo necesito para nada pero me pica la curiosidad, ademas, lo que explica escafandra, si fuese una pantalla de por ejemplo 15 caracteres y cada caracter se pintara en una matriz de leds de, por ejemplo, 8*8, al realizar el desplazamiento a la izquierda, ¿No se veria un parpadeo? A mi se me ocurre como realizar una matriz por ejemplo bool cadena[7][50] y dibujo con 0s y 1s el texto pero no veo una forma eficiente de dibujarlo en un TImage por ejemplo y refrescarlo sin parpadeos.

aguml 14-10-2014 12:57:55

Estoy haciendo una prueba y ya lo tengo terminado al 90% pero me falta un detalle y es que para facilitar el trabajo con los leds (son TShapes) he creado un array de punteros como sigue:
Código:

private:    // User declarations
  TShape *FilaLeds[7][60] = {{Led1,Led2,Led3,Led4,Led5,Led6,Led7,Led8,Led9,Led10,Led11,Led12,Led13,Led14,Led15,Led16,Led17,Led18,Led19,Led20,Led21,Led22,Led23,Led24,Led25,Led26,Led27,Led28,Led29,Led30,Led31,Led32,Led33,Led34,Led35,Led36,Led37,Led38,Led39,Led40,Led41,Led42,Led43,Led44,Led45,Led46,Led47,Led48,Led49,Led50,Led51,Led52,Led53,Led54,Led55,Led56,Led57,Led58,Led59,Led60},
                              {Led61,Led62,Led63,Led64,Led65,Led66,Led67,Led68,Led69,Led70,Led71,Led72,Led73,Led74,Led75,Led76,Led77,Led78,Led79,Led80,Led81,Led82,Led83,Led84,Led85,Led86,Led87,Led88,Led89,Led90,Led91,Led92,Led93,Led94,Led95,Led96,Led97,Led98,Led99,Led100,Led101,Led102,Led103,Led104,Led105,Led106,Led107,Led108,Led109,Led110,Led111,Led112,Led113,Led114,Led115,Led116,Led117,Led118,Led119,Led120},
                              {Led121,Led122,Led123,Led124,Led125,Led126,Led127,Led128,Led129,Led130,Led131,Led132,Led133,Led134,Led135,Led136,Led137,Led138,Led139,Led140,Led141,Led142,Led143,Led144,Led145,Led146,Led147,Led148,Led149,Led150,Led151,Led152,Led153,Led154,Led155,Led156,Led157,Led158,Led159,Led160,Led161,Led162,Led163,Led164,Led165,Led166,Led167,Led168,Led169,Led170,Led171,Led172,Led173,Led174,Led175,Led176,Led177,Led178,Led179,Led180},
                              {Led181,Led182,Led183,Led184,Led185,Led186,Led187,Led188,Led189,Led190,Led191,Led192,Led193,Led194,Led195,Led196,Led197,Led198,Led199,Led200,Led201,Led202,Led203,Led204,Led205,Led206,Led207,Led208,Led209,Led210,Led211,Led212,Led213,Led214,Led215,Led216,Led217,Led218,Led219,Led220,Led221,Led222,Led223,Led224,Led225,Led226,Led227,Led228,Led229,Led230,Led231,Led232,Led233,Led234,Led235,Led236,Led237,Led238,Led239,Led240},
                              {Led241,Led242,Led243,Led244,Led245,Led246,Led247,Led248,Led249,Led250,Led251,Led252,Led253,Led254,Led255,Led256,Led257,Led258,Led259,Led260,Led261,Led262,Led263,Led264,Led265,Led266,Led267,Led268,Led269,Led270,Led271,Led272,Led273,Led274,Led275,Led276,Led277,Led278,Led279,Led280,Led281,Led282,Led283,Led284,Led285,Led286,Led287,Led288,Led289,Led290,Led291,Led292,Led293,Led294,Led295,Led296,Led297,Led298,Led299,Led300},
                              {Led301,Led302,Led303,Led304,Led305,Led306,Led307,Led308,Led309,Led310,Led311,Led312,Led313,Led314,Led315,Led316,Led317,Led318,Led319,Led320,Led321,Led322,Led323,Led324,Led325,Led326,Led327,Led328,Led329,Led330,Led331,Led332,Led333,Led334,Led335,Led336,Led337,Led338,Led339,Led340,Led341,Led342,Led343,Led344,Led345,Led346,Led347,Led348,Led349,Led350,Led351,Led352,Led353,Led354,Led355,Led356,Led357,Led358,Led359,Led360},
                              {Led361,Led362,Led363,Led364,Led365,Led366,Led367,Led368,Led369,Led370,Led371,Led372,Led373,Led374,Led375,Led376,Led377,Led378,Led379,Led380,Led381,Led382,Led383,Led384,Led385,Led386,Led387,Led388,Led389,Led390,Led391,Led392,Led393,Led394,Led395,Led396,Led397,Led398,Led399,Led400,Led401,Led402,Led403,Led404,Led405,Led406,Led407,Led408,Led409,Led410,Led411,Led412,Led413,Led414,Led415,Led416,Led417,Led418,Led419,Led420}};

El problema es que no puedo inicializarlo así como hago desde el private del form y tampoco puedo declararlo como publico. Tendria que inicializarlo en el OnCreate del Form pero que sea accesible desde cualquier evento del Form ¿como lo inicializo para que se cumpla eso?

Edito: Tambien he probado con esto:
Código:

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  int contador = 1;
  for(int y=0; y<7; y++)
  {
      for(int x=0; x<60; x++)
      {
        FilaLeds[y][x] = (TShape*)(AnsiString("Led"+AnsiString(contador)).c_str());
        contador++;
      }
  }
}
//---------------------------------------------------------------------------

Se lo meto a la fuerza usando casting para todo pero en ejecucion crashea y ya no se me ocurre como hacerlo.

Gonza10 14-10-2014 14:31:24

Cita:

Empezado por escafandra (Mensaje 482964)
Debes analizar el problema.
- ¿Te lo piden con displays de 7 segmentos o con matriz de led? No va a haber mucha diferencia.
- En cualquiera de los dos casos, deberás numerar los led y realizar para carácter una secuencia de led encendidos para representarlo a tu gusto. Esa secuencia puede ser un simple array numérico.
- Elije un control, que puede ser un simple TShape que coloreas según la secuencia de led encendidos que previamente habías establecido para él. Esos controles los tienes numerados para tal fin.
-El Movimiento lo consigues cambiando las columnas del control representador.

El resto es pensar si esto te sirve como comienzo y ponerse a trabajar.


Saludos.

Gracias a los que respondieron en unas horas comienzo a trabajar en esto, les cuento si necesito algo mas!!

aguml 14-10-2014 18:11:12

Lo conseguí :D pero solo admito un maximo de 10 caracteres porque uso 420 TShapes a 7*6 por caracteres. Va estupendamente pero quiero ver si soy capaz de mostrar textos mas largos.

aguml 14-10-2014 19:21:23

Amigos tengo un problema extraño, ya he conseguido que puedas meter cadenas largas y te las va rotando en una pantalla de 10 caracteres de trama de leds pero al intentar eliminar la memoria dinamica que uso para ello me da error.
Tengo esto:
Código PHP:

#define MAX_NROWS 7
#define MAX_NCOLS 60
#define WIDTH_CHAR 6

//Globales
bool **leds;
int nCols;

   
//Si ya existe leds libero su memoria antes de volver a asignarle
   
if(leds != NULL)
   {
      for(
int x 0nColsx++)
         
delete [] leds[x];
      
delete [] leds;
   }

   
//Inicializo el valor al que apunta leds
   
leds NULL;

   
//Obtengo el numero necesario de columnas para guardar la trama de leds ya que cada caracter usa 6 columnas y 7 filas
   
nCols Edit1->Text.Length() * WIDTH_CHAR//WIDTH_CHAR vale 6

   //Reservo memoria para el numero de filas necesarias
   
leds = new bool*[MAX_NROWS];

   
//Reservo memoria para las columnas necesarias para cada fila
   
for(int y=0;y<MAX_NROWSy++)
   {
      
leds[y] = new bool[nCols];

      
//Pongo a 0 todos
      
for(int x=0nColsx++)
         
leds[y][x] = false;
   } 

El codigo se ejecuta en un boton y ademas la parte de liberacion de la memoria dinamica tambien la tengo en el evento OnClose del Form. El problema es que al intentar liberar la memoria da un error y no funciona correctamente. ¿alguna idea de que está pasando?

aguml 14-10-2014 19:50:01

Solucionado.

Gonza10 14-10-2014 20:29:34

Cita:

Empezado por aguml (Mensaje 483079)
Solucionado.

pobre el tuyo me tira error en una linea, no entiendo que pusiste en el form, yo tengo algo asi Un shape rectangular(lo que seria el cartel), un edit(donde pondria el texto,y un boton que proyecte el texto en el cartel.
no puedo poner imagenes de como lo tengo echo

Casimiro Noteví 14-10-2014 20:40:51

Cita:

Empezado por aguml (Mensaje 483079)
Solucionado.

Es de buena costumbre explicar cómo lo solucionaste, para que todos puedan aprender :)

ecfisa 14-10-2014 21:08:55

Hola.

Dado que Gonza10 aclara,
Cita:

Empezado por Gonza10 (Mensaje 482907)
..., soy estudiante de programación recién estamos empezando a usar c++ builder 6 y todavía no le agarro la mano ...

voy a dar una versión apróximada de lo que yo pretendería de un estudiante que, con conocimientos básicos, intente implementar esa tarea:
Código PHP:

#define TO_LEFT  false
#define TO_RIGHT true

AnsiString msg ="";
AnsiString spc;
int cont 0;
bool sentido TO_RIGHT;

/* Inicializar */
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  
spc spc.StringOfChar(' ',50);
  
Timer1->Interval 40;
  
Timer1->Enabled  false;
  
btnStartStop->Caption "Comenzar";
  
Edit1->Width 530;
  
Edit1->Text  "PRUEBA DE DESPLAZAMIENTO DE TEXTO";
}

/* Timer OnTimer */
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  if (
sentido)
    
Caption msg.SubString(msg.Length(), 1) + msg.SubString(1msg.Length()-1);
  else
    
Caption msg.SubString(2msg.Length()-1) + msg.SubString(11);
  
msg Caption;
}

/* Sale de Edit */
void __fastcall TForm1::Edit1Exit(TObject *Sender)
{
  
msg spc Edit1->Text;
}

/* Desplazar a la izquierda */
void __fastcall TForm1::btnToLeftClick(TObject *Sender)
{
  
sentido TO_LEFT;
}

/* Desplazar a la derecha */
void __fastcall TForm1::btnToRightClick(TObject *Sender)
{
  
sentido TO_RIGHT;
}

/* Detener - Comenzar */
void __fastcall TForm1::btnStartStopClick(TObject *Sender)
{
  
Timer1->Enabled = !Timer1->Enabled;
  
btnStartStop->Caption Timer1->Enabled "Detener" "Comenzar";


Saludos :)

aguml 14-10-2014 22:22:28

bueno, yo voy a compartir el fuente, lo que pasa es que, primero, tuve que salir corriendo a otro sitio donde no tengo pc y hasta mañana no puedo, y segundo, a este chico se lo han pedido como un trabajo de estudios y si se lo doy hecho no aprenderá nada. Mis codigos siempre intento comentarlos al maximo para que cualquiera pueda entenderlo.

Casimiro Noteví 14-10-2014 22:26:39

Cita:

Empezado por aguml (Mensaje 483090)
bueno, yo voy a compartir el fuente, lo que pasa es que, primero, tuve que salir corriendo a otro sitio donde no tengo pc y hasta mañana no puedo, y segundo, a este chico se lo han pedido como un trabajo de estudios y si se lo doy hecho no aprenderá nada. Mis codigos siempre intento comentarlos al maximo para que cualquiera pueda entenderlo.

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

aguml 15-10-2014 11:49:08

1 Archivos Adjunto(s)
Ahi está el adjunto y aquí una imagen de como se ve: http://postimg.org/image/xb6u827f9/

Gonza10 15-10-2014 15:29:45

Muchisimas Gracias, estuve ayer hablando con el profesor y me ayudo bastante voy hacerlo desde 0 como lo pense con el, voy a tomar algunas cosas del tuyo, sino no voy a poder aprender nada. Saludos, cualquier cosa consulto!.

ecfisa 15-10-2014 17:17:43

Cita:

Empezado por Gonza10 (Mensaje 483130)
Muchisimas Gracias, estuve ayer hablando con el profesor y me ayudo bastante voy hacerlo desde 0 como lo pense con el, voy a tomar algunas cosas del tuyo, sino no voy a poder aprender nada. Saludos, cualquier cosa consulto!.

Te felicito por tu decisión ^\||/

Saludos :)

aguml 15-10-2014 18:07:36

¿podrias explicar como piensas hacerlo? Asi quizas ayudes a otros a plantear el problema y quizas tu planteamiento sea mejor que el mio y asi yo tambien aprendo algo.

Gonza10 17-10-2014 15:46:37

Cita:

Empezado por aguml (Mensaje 483146)
¿podrias explicar como piensas hacerlo? Asi quizas ayudes a otros a plantear el problema y quizas tu planteamiento sea mejor que el mio y asi yo tambien aprendo algo.

hola si mira ya tengo el tablero dibujado, vos definiste uno por uno los leds yo lo hice con un for que me cuente la cantidad de leds de -10 hasta 400(es la dimensión de mi paintbox) después del for le puse x=x+10 para que vaya separando y no me forme una linea continua y abajo puse paintbox->canvas->Draw (x,1,led); asi hasta llegar a 80, mi paintbox es de 400x80, y ahora estoy pensando como empezar a dibujar las letras y luego me queda hacer el movimiento :rolleyes:.

aguml 17-10-2014 19:35:55

¿a que llamas paintbox? Sinceramente veo mas sencillo que uses como yo hice un contenedor y TShapes porque trabajas directamente con objetos y te ahorras tener que estar redibujandolo todo ya que no es lo mismo redibujar varios mini TSapes que redibujar un TImage o lo que sea que uses de mayor tamaño. Para encender o apagar un led tu tienes que usar canvas y pintar en la misma posicion del led mientras que yo simplemente le cambio el color de relleno al objeto. Igualmente puedes crear los TShapes de forma dinamica y destruirlos al salir dela aplicacion pero yo no lo hice porque como es de tamaño fijo no me quise complicar pero basicamente seria usar un for en el evento oncreate, le pones la propiedad parent al contenedor, como brush el color que tendrá como apagado, como name por ejemplo "Led"+AnsiString(x), como width 4, como height 4, como left por ejemplo x*10 y un condicional que decida cuantos leds quieres que tenga cada linea, supongamos 60, if(x%60==0) y++;x=0; donde y se usa paraTop con Top=y*10 por ejemplo y el valor de salida del bucle seria y<7 en mi caso. Con eso crearias la pantalla en ejecucion con memoria dinamica. Ya ves que no es complejo para nada. Luego haces lo mismo que yo para conseguir un array de TShapes y listo. Luego en el onclose del form liberas la memoriay listo.

Gonza10 18-10-2014 16:46:52

si el tuyo esta bueno porque para dibujar pusiste true o false dándole la forma en cambio yo no puedo porque me obligaron a usar el paintbox tengo que dibujar los leds para darle la forma a las letras, ahora se me esta complicando porque ponele te muestro un ejemplo yo escribo A y ahora escribo B se me encima todo en una misma posición estoy analizando como hacer para que cuando yo escriba cualquier letra se reserve ese espacio que ocupo y que la siguiente letra la escriba a su derecha, nose si me entendes. saludos!

aguml 18-10-2014 18:13:41

si te fijas como lo hago yo es estrapolable a tu caso. Por ejemplo, supongamos que un caracter ocupa 20, pues supongo que para pintar las letras usarás un bucle for y si no puesda igual, usas un index que inicializas a 0 y que se incrementa cada vez que pintes una letra y entonces haces pos=index*tam_caracter+espacio_entre_caracteres. Pos la primera vez te dará 0 + el espacio entre caracteres, la segunda vez index valdra 1 con lo que te daria 20 + espacio y asi con todos. Espero te sirva de ayuda. Por cierto, el modo que uso yo con los bools te sirve igual a ti ya que puedes pintar el led apagado o encendido dependiendo de si es true o false. Sigo sin saber que componente es el paintbox ese.

Gonza10 18-10-2014 18:27:01

Creo que entendió lo que me queres explicar si no me equivoco supongamos que escribo A esa pintada que yo hice de caracteres se posiciona en 0 si yo escribo otro mas se aumenta el espacio desde donde tengo el A a 10 mas y así sucesivamente. Paintbox se encuentra en las pestaña System.

ecfisa 18-10-2014 22:43:05

Hola Gonza10.

Sería interesante saber que orientación te dió tu profesor cuando lo consultaste, eso nos ayudaría a darte sugerencias mas acertadas. Pero como no has comentado los requisitos que te fijó, me quedo con lo que mencionaste en tu primer mensaje: "recién estamos empezando a usar c++ builder". Por tanto sigo pensando que es mucho mas adecuado al nivel usar un modo similar al que te sugerí en el mensaje #20.

Si me dijeras que tenes que trabajar con una interface para manejar un display de matriz de leds, estaría de acuerdo con que te embrolles con matrices y demas yerbas. Pero tratándose de una simple presentación en pantalla, seguir el camino anterior es querer reinventar la rueda y desaprovechar todas las herramientas que C++ Builder (y Windows mismo) ponen a tu disposición.

Si el requisito es un TPaintBox, basta con hacer unos pequeños cambios:
Código PHP:

...
#define TO_LEFT  false
#define TO_RIGHT true

AnsiString oldmsg;
AnsiString spc;
int cont 0;
bool sentidoTO_RIGHT;

/* Inicializar */
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  
PaintBox1->Height 33;
  
PaintBox1->Align  alTop;
  
Timer1->Interval 40;
  
Timer1->Enabled  false;
  
btnStartStop->Caption "Comenzar";
  
Edit1->Width 530;
  
Edit1->Text  "PRUEBA DE DESPLAZAMIENTO DE TEXTO";
}

/* Timer OnTimer */
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  if (
sentido)
    
old msg.SubString(msg.Length(), 1) + msg.SubString(1msg.Length()-1);
  else
    
old msg.SubString(2msg.Length()-1) + msg.SubString(11);
  
PaintBox1->Canvas->TextOutA(0PaintBox1->Height >> 1old);
  
msg old;
}

/* Sale de Edit */
void __fastcall TForm1::Edit1Exit(TObject *Sender)
{
  
spc spc.StringOfChar(' ',2*Edit1->Text.Length());
  
msg spc Edit1->Text spc;
}

/* Desplazar a la izquierda */
void __fastcall TForm1::btnToLeftClick(TObject *Sender)
{
  
sentido TO_LEFT;
}

/* Desplazar a la derecha */
void __fastcall TForm1::btnToRightClick(TObject *Sender)
{
  
sentido TO_RIGHT;
}

/* Detener - Comenzar */
void __fastcall TForm1::btnStartStopClick(TObject *Sender)
{
  
Timer1->Enabled = !Timer1->Enabled;
  
btnStartStop->Caption Timer1->Enabled "Detener" "Comenzar";


tomate el trabajo de probar este ejemplo y verás que la marquesina funciona sin problemas.

Saludos :)


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

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi