Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   DrawCell mit Button (https://www.delphipraxis.net/168034-drawcell-mit-button.html)

Takurom 1. Mai 2012 20:50

DrawCell mit Button
 
Guten Abend zusammen,

schonmal entschuldigung, wenn ich die Suche falsch benutzt habe.

Ich bin noch ein blutiger Anfänger und möchte durch einen Buttonklick die procedure DrawCell aufrufen.
Es wird mit allerdings immer angezeigt, dass es zu wenig Parameter sind und ich auch nicht wirklich weiß was und ob ich noch etwas eintragen muss.


Code:
procedure TSpielfeld.Button1Click(Sender: TObject);
begin
  Spielfeld.DGDrawCell(Sender: TDrawGrid; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState)
end;

procedure TSpielfeld.DGDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if (ACol = posx) and (ARow = posy) then
  with Sender as TDrawGrid do
  begin
    DG.Canvas.Draw(rect.left,rect.top,Zahl2.Picture.Bitmap);
  end;
end;

mkinzler 1. Mai 2012 20:58

AW: DrawCell mit Button
 
Beim Aufruf Parameter ohne Typen, dafür mit konkreten Werten ohne Variablen.

Btw. Man sollte nur innerhalb von Paint auf einen Canvas malen, da die Änderungen nach einem Redraw wieder weg sind

sx2008 1. Mai 2012 21:14

AW: DrawCell mit Button
 
So funktioniert das nicht.
Wenn sich in einem Drawgrid etwas ändern soll, dann muss man
Delphi-Quellcode:
Drawgrid1.Invalidate;
aufrufen damit das Grid neu gezeichnet wird.
Natürlich muss man vorher etwas am Spielfeld ändern, damit man was sieht.

Delphi-Quellcode:
var
  spielfeld : array[1..3, 1..3] of char; // Tic-Tac-Toe

procedure TForm1.Button1Click(Sender: TObject);
var
   x ,y : Integer;
begin
   // irgendwelche Figuren setzen
   x := 1;
   y := 2;
   if spielfeld[x,y] = 'X' then
      spielfeld[x,y] := '*'
   else
      spielfeld[x,y] := 'X';

   // Neuzeichnen erzwingen
   DrawGrid1.Invalidate;
end;

// dieser Eventhandler zeichnet auf dem Drawgrid
procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  figur : Char;
  canvas : TCanvas;
begin
  canvas := DrawGrid1.Canvas; // Zwischenvariable spart Schreibarbeit

  // Hintergrund zeichnen (kann entfallen, falls Spielfiguren nicht transparent sind)
  canvas.brush.Color := clGrey;
  canvas.FillRect(rect);

  // Spielfigur zeichen
  figur := spielfeld[ACol-1, ARow-1];
  case figur of
    ' ': ImageList1.Draw(canvas, Rect.Left, Rect.Top, 0);
    '*': ImageList1.Draw(canvas, Rect.Left, Rect.Top, 1);
    'X': ImageList1.Draw(canvas, Rect.Left, Rect.Top, 2);
  end;
end;

Takurom 1. Mai 2012 21:59

AW: DrawCell mit Button
 
Schonmal danke für die Antworten.

Ich möchte Minesweeper erstellen und der Button war erstmal nur für mich, um es etwas besser zu verstehen.


Ich weiß jetzt, wie ich die Felder "vollmalen" kann.
Allerdings,


Würde ich noch gerne wissen, wie ich mehrere mit Maus angeklickt Felder mit einem bitmap füllen kann.
Ich hab bis jetzt:

Code:
if gdSelected in State then
        with Sender as TDrawGrid do
        begin
          DG.Canvas.Draw(rect.left,rect.top,Zahl1.Picture.Bitmap);
        end;
wenn ich es damit allerdings versuch, ist immer nur eins sichtbar und das vorhergehende wird wieder gelöscht.

sx2008 1. Mai 2012 22:22

AW: DrawCell mit Button
 
Bei Minesweeper gibt es doch 11 Feldtypen:
* unbekannt (blauer Block)
* verdeckte Bombe (sieht genau gleich aus wie unbekannt)
* Leer
* Fahne
* Bombe (*)
* Bombe mit Fahne (*)
* explodierte Bombe (*)
* "1"
* "2"
* "3"
* "4"
Also brauchst du 11 Bildchen oder Icons.
Die Bildchen haben alle die gleiche Grösse und passen gut in eine TImageList.

Dein Spielfeld hat 9*9 Felder (später vielleicht mehr) und jedes Spielfeld kann einen von 11 verschiedenen Werten haben.
Die mit (*) markierten Zustände sieht man nur wenn das Spiel zuende ist.
Delphi-Quellcode:
var
  minesweeperfeld : array[1..9, 1..9] of Integer;
Das Grundprinzip ist nun, dass du bei einem Mausklick das minesweeperfeld[] veränderst und vom Drawgrid neu zeichnen lässt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz