Hmm..
Delphi-Quellcode:
bild := TBitmap.create;
bild.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Mine.bmp');
mine := 1;
for x := 0 to 8 do
for y := 0 to 8 do
if StringGrid1.cells[x, y] = 'M' then
StringGrid1.Canvas.StretchDraw(StringGrid1.CellRect(x, y), bild);
bild.free; // hier liegt dein Fehler :-)
end;
end.
Dein Fehler:
Du erzeugst das Bild und gibst es wieder frei. Du solltest dir eine Struktur ausdenken wo die Bilder liegen sollen. (TArray oder TObjectlist) Am Ende räumst du die "Liste" weg und gibst die Bilder frei.
Da er das Bild auf dem Canvas des StringGrids malt (kopiert), MUSS er es sogar freigeben, da es ansonsten im Speicher liegen bleibt und dass bei jedem Neuzeichnen.
Generell müsste er die obige Routine immer im OnPaint des StringGrids aufrufen!
@felix00186
Ich würde Dir raten, ein TImage (oder PaintBox) statt des StringGrids zu nehmen und das ganze Spielfeld dort einmal malen und dann wirklich nur die Änderungen (Mienen) nachziehen.
Das Bitmap des Images wird durchs TImage immer wieder neu gemalt, wenn es notwendig ist.
Die Position des einzelnen Feldes lässt sich über OnClick mit X,Y errechnen.
Die Info, ob Miene oder nicht würde ich intern in einem Array ablegen.