Allerdings finde ich keine Möglichkeit, die Zellen, ähnlich wie beim StringGrid, einzeln über die Koordinaten anzusprechen.
Ich sitze nun schon ziemlich lange daran und verzweifle langsam. Daher wäre ich über einen rettenden Tipp sehr froh!
Zufällig habe ich vor paar Monaten auch ein Memory Spiel programmiert. Mir ging es da aber weniger um das Spiel selbst, als um das Testen einer Komponente. Das Ganze ist "einfacher" als man denkt, das Problem ist aber wie so oft, dass manche Leute auf einen Lösungsweg fixiert sind und deshalb nicht für neue Ideen bereit sind. Dass ist so wie mit den Leuten die mit ihren Kindern über eine stark befahrene Straße wollen. Man kann denen 100 mal sagen, dass 20 Meter weiter ein Zebrastreifen ist. Die sind auf diese Stelle fixiert und wenn sie nicht ... dann stehen sie da noch heute.
So kompliziert es sich auch anhört, die Lösung ist die eine einzelne Image-Komponente, bzw. die Bitmap drin. Statt sich tagelang mit der DrawGrid zu ärgern, kann man im Bruchteil der Zeit alles die Grid selbst auf der Bitmap erstellen. Es ist einfacher als man denkt, es hört sich nur kompliziert an.
Delphi-Quellcode:
uses
ShellApi;
const
Breite = 32;
var
Matrix: array[0..9, 0..9] of Integer;
//-------------------- Zufälliges Bild erstellen -------------------------------
function ExpandEnv(const s: string): string;
var
l: Integer;
begin
l := ExpandEnvironmentStrings(PChar(s), nil, 0);
SetLength(Result, l - 1);
ExpandEnvironmentStrings(PChar(s), PChar(Result), l);
end;
function FileIconPath: string;
begin
Result := ExpandEnv('%SystemRoot%\system32\SHELL32.dll');
end;
function FileIconCount(const FileName: string): Integer;
begin
Result := 0;
if FileExists(FileName) then
Result := ExtractIcon(HInstance, PChar(FileName), $FFFFFFFF);
end;
//Gibt eine Bitmap 32*32 zurück, generiert aus System-Icons
procedure TestBmp(Bmp: TBitmap; Index: Integer);
var
IconCount: Integer;
Icon: TIcon;
begin
Icon := TIcon.Create;
try
IconCount := FileIconCount(FileIconPath);
if FileIconCount(FileIconPath) > 0 then
Icon.Handle := ExtractIcon(HInstance, PChar(FileIconPath), Random(IconCount));
Bmp.Canvas.Draw(0, 0, Icon);
finally
Icon.Free;
end;
end;
//--------------------------------- Ende ---------------------------------------
//-------------------------- Eigentliche Prozeduren ----------------------------
procedure TForm1.FormCreate(Sender: TObject);
var
IconCount: Integer;
x, y: Integer;
Bmp: TBitmap;
begin
IconCount := FileIconCount(FileIconPath);
with Image1.Picture do
begin
Bitmap.Width := 10 * Breite; //0..9 -> 10
Bitmap.Height := 10 * Breite;
end;
for x := 0 to 9 do
for y := 0 to 9 do
begin
Matrix[x, y] := Random(IconCount);
Bmp := TBitmap.Create;
try
Bmp.Width := Breite;
Bmp.Height := Breite;
//---Platzierung---
TestBmp(Bmp, Matrix[x, y]);
Image1.Picture.Bitmap.Canvas.Draw(x * Breite, y * Breite, Bmp);
finally
Bmp.Free;
end;
end;
end;
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ShowMessageFmt('Koordinate: x = %d; y = %d', [x div Breite, y div Breite]);
end;