Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Dibujar laberinto en formulario (https://www.clubdelphi.com/foros/showthread.php?t=55018)

bochan 05-04-2008 13:52:16

Dibujar laberinto en formulario
 
Hola a todos!!

Soy nuevo en el uso de C++ builder 5 y tengo una pregunta. En clase de programacion nos han pedido dibujar un formulario con una serie de botones y algo para representar un laberinto en forma de matriz (con casillas). ¿Que herramiento de c++ builder puedo usar para dibijar esto? He estado investigando y puedo usar un frame, pero no sé como dibujar las rayas de las celdas...

Si más daros las gracias

Lepe 05-04-2008 15:15:58

Puedes usar 4 TShape con forma de línea dentro de cada frame; cuando quieras que se vea la linea, haces visible el shape que corresponda.

Saludos

bochan 05-04-2008 18:01:52

No entiendo muy bien el uso de shape para hacer las celdas de la matriz, ademas las dimensiones de la matriz las va a insertar el usuario y se tiene que mostrar esa matriz en el frame. Tambien necesito que las celdas de la matriz se pueden pulsar

Saludos y gracias

Lepe 05-04-2008 23:29:05

Hemos enfocado el asunto de forma distinta.

Yo he pensado en hacer un Frame que sea la propia celda, dentro de ese Frame incluyo los 4 TShapes para simular un borde de color.

En tiempo de ejecución el usuario dice que quiere una matriz de 5x6, pues creamos 30 frames situados en 5 filas por 6 columnas, cada frame tendrá dentro los 4 Tshapes ocultos y cuando el usuario haga clic sobre el frame, según la coordenada del clic, se le hace visible el shape que corresponda.

Saludos

bochan 07-04-2008 17:05:16

Hola

Gracias por contestar!. Otra pregunta, ¿los frame tienen funciones para mostrar texto y recuperar tecto?. Mi compañero y yo hemos estado viendo las funciones del frame y no vemos la forma de mostrar texto y recuperar.

Gracias por la ayuda

Lepe 07-04-2008 19:34:26

¿cuala?

para crear un Frame, File -> New -> Frame

Es como un Form, puedes poner labels, shapes, Edits.... lo que quieras sobre el frame.

Ahora en tu Form1 quieres crear 10 frames, en el código de un botón puedes poner algo así:
Código Delphi [-]
var i, LastLeft, LastTop :integer;
     F :TMiFrame; // el que has creado:
begin 
  LastLeft := 20;
  LastTop := 20;
  for i:= 1 to 20 do
  begin 
     F := TMiFrame.Create(self);
     F.top := lastTop;
     F.Left := LastLeft;
     inc(LastLeft, F.width);
     if LastLeft  > 700 then
     begin 
       LastLeft:= 20;
       LastTop := LastTop + F.Height;
    end;
  end;

Saludos

bochan 07-04-2008 22:39:39

Ahhh!! Ya voy pillando, todo lo que creas en el Frame "padre" (por decirlo de alguna manera) lo heredan los hijos. Es que no me habia fijado para que servia el Frame principal, XDD.
Oye Lepe muchas gracias por la ayuda, si me surgen cosas ya las ire posteando.

Gracias tio!!

bochan 10-04-2008 09:59:31

Hola de nuevo!

Estoy creando los frames de forma dinamica como me explicaste pero me da errores en ejecucion ("Violation Access"). Basicamente lo que hago es esto:
La clase Frame padre tiene un constructor de esta forma;
Código:

TFrame:TFrame (TComponent){"Aqui no hay nada"}
A la hora de crear los frames hago un bucle asi:
Código:

for (int i=0;i<NumCasillas;i++)
 for (int j=0;i<NumCasillas;j++)
{
 TFrame *aux= new TFrame("Aqui no estoy muy seguro de que pasarle");
 casillas[i][j]= aux;
 casillas[i][j]->Name="X";
 casillas[i][j]->Legth="100";
 ......
aux=null;
 }

La variable casillas es una matriz de punteros a los frames, ya que sino perdemos las referencias con estos frames.
Bueno el tema esta en que cuando hago casilla[i][j]->Name="X"; Me da error de memoria... si pongo aux->Name="X" antes de ponerlo a Null tambien me da error.
Alguna idea??
Ah tambien necesito de una clase que tenga implementada una cola.Hay alguna standar que la tenga???

Saludos

bochan 13-04-2008 23:25:12

Alguna ayuda por favorrrrr

Lepe 14-04-2008 09:55:40

Yo en C y C++ no me aventuro a decir nada, sé que hay gente del foro que maneja C, será mejor esperar por ellos.

Colas, bueno si no recuerdo mal: TStack, Tqueue, TObjectLis (esto es como un array dinámico), revisa la ayuda, allí te puede dar más resultados relacionados.

Saludos

escafandra 14-04-2008 11:06:02

¿Has reservado memoria para los arrays?
El segundo bucle for (int j=0;i<NumCasillas;j++) , ¿Te das cuenta que no tiene control?. i no se incrementa, solo j y no existe un condicional de control para j=> bucle infinito.... ¿No querrás decir for (int j=0;j<NumCasillas;j++)

Código:

TFrame **casillas = new *TFrames[NumCasillas];

for (int i=0;i<NumCasillas;i++)
  //for (int j=0;i<NumCasillas;j++) 
  for (int j=0;j<NumCasillas;j++)
  {
    TFrame *aux= new TFrame("Aqui no estoy muy seguro de que pasarle");
    casillas[i][j]= aux;
    casillas[i][j]->Name="X";
    casillas[i][j]->Legth="100";
    ......
    aux=null;
  }


bochan 14-04-2008 11:23:04

Hola!!
Si de eso ya me habia percatado... el problema que tengo es que no sé que parametro pasarle al constructor TFrame. Le he pasado de todo y no me dibuja nada de nada.
si hago
Código:

TFrame *aux=new TFrame(...);
aux->Top=100
...

Le digo que me dibuje solo un Frame y no me lo hace. Al constructor hay que pasarle un TComponent y no sé que variable pasarle

escafandra 14-04-2008 11:52:07

Yo pensé que lo harias con TShape.

Saludos.

Edito:

TFrame no sirve para dibujar, sino para implementar frames preprogramados o nuevos controles que a su vez contengan mas controles. Un TFrame a secas, no sirve para nada....

bochan 14-04-2008 21:38:18

Hola!!

Hombre los TShapes solo me ofrecen dibujar cuadrados,rectagulos y no sé que más... El tema esta en que yo he creado el laberinto a mano, creando los frames 1 a 1, lo que pasa q asi es una forma poco elegante y además las dimensiones del laberinto se hace en tiempo de ejecucion. Ademas quiero que cada casilla tenga un valor, y eso con TShape como lo haria??

Muchas Gracias por la ayuda!

Edito:
He probado a crear TShape de forma dinamica, tampoco puedo!!! El constructor me pide un TComponent igual que el TFrame..
Lo he creado asi:
Código:

TShape *aux=new TShape(this??);//Sigo sin saber que poner
  aux->Shape=stRectangle;
  aux->Top=250;
  aux->Height=320;
  aux->Visible=true;

Y sigo son ver nada, ni Shape ni Frame... como narices creo este tipo de cosas de forma dinamica???

SAludos

escafandra 14-04-2008 23:43:41

Tanto para TShape como TFrame o cualquier componente, debes inicializarlo con un objeto TComponent. TComponent es clase madre de todos los controles. Por lo tanto un puntero al formulario donde están tun controles creados dinámicamente te sirve para inicializar. No existe constructor por defecto.

Código:

TShape *aux=new TShape(this); // ó aux = new TFrame(this);
InsertControl(aux); //inserta el control en un TWinControl (el formulario Form1...)
aux->Shape=stRectangle;
aux->Top=250;
aux->Height=320;
aux->Visible=true;


Saludos.

bochan 15-04-2008 22:57:25

Hola!!

Pos ya parece que va tirando, lo único que me faltaba era poner el InsertControl(aux);... muchas gracias por la ayuda. Si tengo más dudas ya las posteare.

Gracias por vuestra atencion

bochan 16-04-2008 18:53:49

Hola de nuevo!

Ya tengo creado el laberinto, al final he usado frames porque con los shape no lo veia muy claro XD. Ahora me surje una duda. Los frames son de una clase padre Frame2 (en mi caso), todo lo que creo en el padre lo hereda los hijos, ahora bien si creo una variable en el padre cada hijo tendra su variable propia, hasta ahi bien pero si quiero una variable global que pueden modificar todos los hijos, como lo puedo hacer???

Gracias

escafandra 16-04-2008 19:16:02

Repasa las variables static de la clase. Estas sólo se pueden modificar por funciones miembros también declaradas como static. Se inicializan fuera del constructor, en código externo a la clase. se caracterizan por tener un valor común en todos los objetos de esa clase.

Otra posibilidad es crear una variable static en una función miembro. Será estable para todas las llamadas a esa función, vengan del objeto que vengan.

La última posibilidad es una variable global que no pertenezca a la clase y a la que se acceda desde cualquier parte del código.

Lo ortodoxo es una variable static de la clase.

Saludos.

bochan 18-04-2008 10:13:57

Hola!!!

Gracias por la ayuda, al final he creado una variable static en la funcion que acceden todos los hijos

Saludos


La franja horaria es GMT +2. Ahora son las 19:26:40.

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