Mal ein rudimentärer Ansatz für dein Problem:
Delphi-Quellcode:
TItemAction = procedure (Sender: TMapItem) of Object;
TMapItem = class
private
FPosition : TPoint; //Enthält die Rasterposition in der Map
FImageIndex: Integer; //Bildindex für die Bildliste
FAction: TItemAction; //Ereignisbehandlung, wenn das Item geklickt wird
public
constructor Create(Position: TPoint);
property Position: TPoint read FPosition;
property OnAction: TItemAction read FAction write FAction;
end;
TMap = class(TGraphicControl)
private
FImageList: TImageList; //Bildliste für die darzustellenden Icons
FRowsCount: Integer; //Anzahl der Reihen in der Map
FColumnsCount: Integer; //Anzahl der Spalten in der Map
FItems: TObjectList; //Enthält die bereits bearbeiteten Zellen
procedure SetRowsCount(const Value: Integer);
procedure SetColumnsCount(const Value: Integer);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
property RowsCount: Integer read FRowsCount write SetRowsCount;
property ColumnsCount: Integer read FColumnsCount write SetColumnsCount;
end;
TMapItem ist ein einzelnes Feld in deinder Map. Es enthält seine Position im Raster, einen ImageIndex für sein Icon und ein Ereignis, in dem du programmieren kannst, was beim Klicken auf das Feld passieren soll, o.ä.
TMap ist die eigentliche Karte. Hier werden alle eingefügten MapItems in einer Liste verwaltet. Hier wird auch das Klicken auf die Map verwaltet. Die Icons, sind alle in einer ImageList gespeichert und werden anhand des ImageIndex von TMap auf den Canvas gezeichnet. Interessant daran wäre z.B. auch, dass du die Karte auch relativ einfach vergrößern oder verkleinern kannst, indem du die Icons mit StretchBlt auf das Canvas kopierst.
Das Zeichnen könnte nun so aussehen, dass du jede Zelle, Reihe für Reihe, durchgehst und in FItems nachschaust, ob bereits etwas vorhanden ist. Falls ja wird an diese Stelle im Canvas das entsprechende Bild gezeichnet, falls nein ein "Empty"-Image. Edit: Ok, vermutlich ist es wesentlich schneller, zunächst eine leere Map zu zeichnen und anschließend die Liste durchzugehen und die vorhandenen Icons an die entsprechende Position zu kopieren.
Was in dem Quellcode drin steckt ist natürlich nur ein Ansatz von dem, was ich grad mal beschrieben habe. Da ist noch viel zu implementieren.