Mensaje    Asunto: A vueltas con el HexGrid Responder citando

Hola, a ver si alguien, es que estoy ya durante varios dias intentando dibujar un HexGrid con estas imagenes del ejemplo que os adjunto y me da errores de memoria

queria hacer una rejilla hexagonal de unas dimensiones mayores que la pantalla y que sea scrolleable ...esto creo que lo puedo conseguir con el componente scrollbox y un TImage

tengo el siguiente código

Código:
 
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "acPNG"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
{
      MediaPlayer1->Play();

   DrawHexGrid();
}
//---------------------------------------------------------------------------
inline TPoint PosPt(int x, int y)
{
/* --> */  const int sx = 58, sy = 40; //separación
    return Point((y&1)*sx + x*sx*2, y*sy);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DrawHexGrid()
{
    // limpia la pantalla
    skreen->Canvas->Brush->Color = clBlack;
    skreen->Canvas->Rectangle(0, 0, skreen->Width, skreen->Height);

   for (int y = 0; y < 14; ++y)
   {
      for (int x = 0; x < 10; ++x)
      {
         TPoint pos = PosPt(x, y);
/* --> */   celda[x][y].rect = TRect(pos.x, pos.y, pos.x + Image1->Width, pos.y + Image1->Height);
         celda[x][y].flag = false;
         skreen->Canvas->Draw(pos.x, pos.y, Image1->Picture->Graphic);
      }
   }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::skreenMouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
    static int oldCol = 0, oldRow = 0;

    // Busca celda
    bool found = false;
    int col, row;
   for (int y = 0; y < 14 && !found; ++y)
   {
      for (int x = 0; x < 10; ++x)
        {
            TPoint pos = PosPt(x, y);
            if (PtInRect(celda[x][y].rect, Point(X, Y)) &&
                !Image3->Picture->Bitmap->Canvas->Pixels[X - pos.x][Y - pos.y])
            {
                found = true;
                col = x;
                row = y;
                if (col == oldCol && row == oldRow) return;
                // Como ejemplo cambiamos la celda al pasar por encima
                celda[col][row].flag = !celda[col][row].flag;
                skreen->Canvas->Draw(pos.x, pos.y, celda[col][row].flag
                    ? Image2->Picture->Graphic : Image1->Picture->Graphic);
                break;
            }
        }
    }

    Caption = found ? String().sprintf(L"%d, %d", col, row) : String("<no>");

    oldCol = col;
   oldRow = row;
}
//---------------------------------------------------------------------------




void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
   Panel1->Visible = false;
   MediaPlayer1->Stop();
}
//---------------------------------------------------------------------------


pero a veces si cambio los valores de "y" y "x" del bucle que lo pinta, me da un error de pantalla y se me abre el fichero System en la linea:

Cita:
if (MonitorSupport <> nil) and (FLockEvent <> nil) then
MonitorSupport.FreeSyncObject(FLockEvent);


no entiendo que puede pasar

os dejo aqui el proyecto y un capture....se supone que cuando pasas el raton por encima debe pintar las celdas en azul y detectarlas en el title de la app (coordenadas) pero hay algunas que no las pinta ni detecta las coordenadas y no se porque

el MediaPlayer1 es para proyectar un AVI pero ignoradlo



http://www.qualinost.tk/imagenes/tablero_hexagona_espacial.rar