Autor Beitrag
Schlauchmobil
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Do 28.07.05 14:48 
Lange ists her, dass ich mit Delphi zu tun hatte. Doch nun Stehe ich vor folgendem Problem:
Ich habe 4 verschiedene Bitmaps. Diese sollen in zufälliger Reihenfolge in die einzelnen Zellen eines (z.B.) 10x10 großen Drawgrids eingefügt werden. Dafür habe ich mir erstmal ein paar Variablen vom Typ TBitmap kreiert und erst einmal folgendes gemacht:
ausblenden Quelltext
1:
2:
Bild1 := TBitmap.Create;
Bild1.LoadFromFile('bla.bmp');

(Das ganze vier mal)

Danach habe ich zwei for-Schleifen von 0-9 (für 10x10 Grid).
Dort wird für jeden Durchlauf eine Zufallszahl (0-3) generiert. Jede Zahl steht für ein Bild. Danach folgt ein Case-Verteiler und je nachdem, welche zahlt generiert wurde, soll das entsprechende Bild ins Drawgrid gezeichnet werden.

Wie sehen für letzteres die Befehle aus (also fürs zeichnen)?

thx
SMO
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 120
Erhaltene Danke: 18


D2005 Personal
BeitragVerfasst: Do 28.07.05 15:29 
DrawGrids haben ein Ereignis namens "OnDrawCell", das wird zum Zeichnen jeder einzelnen Zelle aufgerufen.

So ungefähr könnte das aussehen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if not (gdFixed in State) then // nur in normale Zellen zeichnen, nicht in die festen
    with (Sender as TDrawGrid) do
    begin
      Dec(ACol, FixedCols);
      Dec(ARow, FixedRows);
      //...
      Canvas.StretchDraw(Rect, EinBitmap);
    end;
end;

Dieses Beispiel zeichnet das Bitmap "EinBitmap" in alle Zellen des DrawGrids. "Canvas.StretchDraw" sorgt dafür, dass das Bitmap auf Zellengröße gestaucht oder gestreckt wird. Falls das nicht erwünscht ist, kann natürlich auch "Canvas.Draw" benutzt werden. Die beiden "Dec" Anweisungen sind hier eigentlich überflüssig, sollen aber daran erinnern, dass die "ACol, ARow" Koordinaten immer die "festen Zellen" (die grauen am oberen und linken Rand) beinhalten. Wenn man also nur in die normalen Zellen zeichnen will und die Koordinaten für irgendetwas braucht, muss man sie wie gezeigt anpassen.


Wenn du deine Bitmap-Objekte und Zufallszahlen in Arrays speicherst, dann könnte das ganz konkret so aussehen:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
var
  Bitmaps: array [0..3of TBitmap;
  Zufall: array [0..90..9of Byte;

procedure Init;
var
  x, y: Integer;
begin
  // "Bitmaps" array initialisieren
  for x := Low(Bitmaps) to High(Bitmaps) do
  begin
    Bitmaps[x] := TBitmap.Create;
    Bitmaps[x].LoadFromFile(Format('bla%d.bmp', [x]));  // bla0.bmp, bla1.bmp usw.
  end;
  // "Zufall" array initialisieren
  Randomize;
  for y := Low(Zufall) to High(Zufall) do
    for x := Low(Zufall[y]) to High(Zufall[y]) do
      Zufall[y, x] := Random(Length(Bitmaps));
end;


procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if not (gdFixed in State) then // nur in normale Zellen zeichnen, nicht in die festen
    with (Sender as TDrawGrid) do
    begin
      Dec(ACol, FixedCols);
      Dec(ARow, FixedRows);
      Canvas.StretchDraw(Rect, Bitmaps[Zufall[ARow, ACol]]);
    end;
end;