Entwickler-Ecke

Sonstiges (Delphi) - Schiffe in ein Stringgrid zeichnen


elundril - Mo 05.03.07 20:10
Titel: Schiffe in ein Stringgrid zeichnen
Ich programmiere gerade ein Schiffe versenken übers netzwerk mit zwei Stringgrids und da hab ich nun ein problem:
Ich muss die Schiffe einzeichnen können in einem der beiden stringgrids. Das möcht ich jetzt so machen das zuerst das 5 Felder große Schiff gesetzt wird, dann das 4 Felder große und so weiter.

Mein problem ist wie kann ich das machen das wenn man mit dem Mauszeiger über das stringgrid fährt, dass das Schiff das man setzen soll mitwandert. und wie mach ich die überprüfung ob sich das mit einem anderen Schiff überlagert?

lg el

bitte sagen wenns zu unverständlich war!


Lannes - Di 06.03.07 01:16

Hallo,

hab Dir mal ein grobes Beispiel erstellt, aber bis Du damit zu Deinem Ziel kommst ist es noch ein weiter Weg :wink:

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:
34:
35:
36:
37:
38:
39:
40:
41:
  public
  aGridRect : TGridRect;
  procedure SetTempSchiff(aGridRect : TGridRect;i: Integer);
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.SetTempSchiff(aGridRect : TGridRect;i: Integer);
var c,r : Integer;
begin
  for c := aGridRect.Left to aGridRect.Right do
    for r := aGridRect.Top to aGridRect.Bottom do
      StringGrid1.Objects[c,r] := Pointer(i);
  //durch das setzen von Objects wird OnDrawCell ausgelöst
end;

procedure TForm1.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
var c,r : Integer;
begin
  StringGrid1.MouseToCell(X,Y,c,r);
  SetTempSchiff(aGridRect,0);//letzte Darstellung übermalen
  aGridRect := TGridRect(Rect(c,r,c,r+5));//5er Schiff
  SetTempSchiff(aGridRect,1);
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if Integer(StringGrid1.Objects[aCol,aRow]) = 1 then
    StringGrid1.Canvas.Brush.Color := clRed
    else
      StringGrid1.Canvas.Brush.Color := StringGrid1.Color;
  StringGrid1.Canvas.Fillrect(Rect);
end;


elundril - Di 06.03.07 18:28

ok danke!
werd mir den code mal zu gemüte führen! :-)
Wenn ich den fertig hab mit allen Schiffen kann ich meinen Info lehrer beeindrucken. der hat nämlich gesagt das es viel zu kompliziert sein!
Tausend dank nochmal!

lg el