Autor Beitrag
Grinarn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: So 30.12.07 03:27 
Moin Moin,

ich hoffe ich bin hier im richtigen Forum gelandet.
Ich suche nach einer möglichkeit alle Zellen meines X x Y Stringgrids zu färben. Mit Hilfe der Suche habe ich schonmal herausgefunden das ich dies irgendwie mit dem OnDrawCell Ereignis hinbekomme.
Allerdings ist mir die Realisation noch nicht ganz klar.

Ich habe in meinem Programm ein 2d Array mit byte Werten, die mein Stringgrid nun darstellen soll. Jede Zelle soll nun entsprechend ihres Wertes gefärbt werden. Dazu müsste ich das OnDrawCell Ereignis ja für jede Zelle aufrufen, allerdings habe ich keine Ahnung wie man Ereignisroutinen manuell aufruft. Oder wie sollte man dies sonst hinbekommen? Wie wird OnDrawCell überhaupt ausgelöst? Fragen über Fragen.

Vielleicht kann mich hier ja jmd. erleuchten.

Schöne Grüße
Grinarn
Bernhard Geyer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 721
Erhaltene Danke: 3



BeitragVerfasst: So 30.12.07 11:38 
OnDrawCell wird aufgerufen wenn die Zelle gezeichnet werden muss.
Änderst du den Wert eine Zelle kannst du mit einem Aufruf von invalitate das neuzeichnen veranlassen.
Grinarn Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: So 30.12.07 14:24 
Verursacht dann der aufruf für invalidate für mein Stringgrid, dass alle Zellen neu gezeichnet werden? Oder nur geänderte? Oder muss ich invalidate für jede einzelne Zelle aufrufen, also direkt nachdem ich sie geändert habe?
Grinarn Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: So 30.12.07 14:53 
Also ich hab jetzt mal ein wenig rumgetestet, aber es funktioniert garnicht so wie es sollte.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
  // Erstellen des Grundspielfeldes
  for x := 0 to XMax do
    for y := 0 to YMax do
    begin
      if Spielfeld[x,y] > 0 then
        StrGrdSpiel.Cells[x,y] := IntToStr(Spielfeld[x,y])
      else
        StrGrdSpiel.Cells[x,y] := '';
    end;
    StrGrdSpiel.Invalidate;


Hier erstelle ich im Moment das Spielfeld. Bisher werden noch Zahlen verwendet. Diese Zahlen sollen nun durch entsprechende Farben ersetzt werden.
Ich habe also das OnDrawCell Ereignis benutzt.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TFrmMain.zelleFaerben(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  //färben der zellen
  if StrGrdSpiel.Cells[ACol,ARow] = '1' then
  begin
    Canvas.Brush.Color := clRed;
    Canvas.FillRect(Rect);
  end;
end;


Testweise erstmal nur für Zellen mit dem Wert 1. Allerdings ist das Ergebnis nun, dass er mir 2 rote Quadrate ca. 1cm über meinem Stringgrid malt. Er malt also nicht in das Stringgrid, sondern irgendwo auf dem Formular.
Jmd. eine Idee wodran das liegen kann?
Jerk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 251

Vista Ultimate, Ubuntu
Turbo Delphi 2006
BeitragVerfasst: Mo 31.12.07 01:58 
Welchen wert haben den ACol und Arow?
Acol sind die spalten und Arow sind die Reihen, nimm doch zwei Zählerschleifen.

Aufruf: Stringgrid1.repaint;

ausblenden 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:
Procedure TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
  Rect: TRect; State: TGridDrawState);
Var
  Zeile,Spalte :integer;
  s                                     : String;
Begin
  With Sender As TStringGrid Do
  Begin
    If (aCol < FixedCols) Or (aRow < FixedRows) Then Exit; //Fixed col / Fixed row => Exit
    for Spalte:=1 to SpaltenZahl do
     begin
      for Zeile :=1 to ZeilenZahl do
       begin
        If (aCol = Cell[1,Zeile]) And (aRow = Cell[2,Spalte]) Then // Wenn zu zeichnende Zelle den Koord. entspricht ...
         Begin
          s := Cells[aCol, aRow];
          Canvas.Brush.Color := Colorarray[Spalte]; 
          DrawText(Canvas.Handle, PChar(s), Length(s), Rect, DT_LEFT);
    End;
    end;
    end;
  End;
End;

Cell[1,a] wählt bei mir alle Spalten aus die gewünscht werden und Cell[1,i] alle Zeilen.
Das heisst wenn z.b. nur das einzelne Feld an der stelle 5 / 5 rot werden soll wäre das:
ausblenden Delphi-Quelltext
1:
Cell[1,1]:=5; und cell[1,2]:=5;					


Zuletzt bearbeitet von Jerk am Mo 31.12.07 02:17, insgesamt 5-mal bearbeitet
Grinarn Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Mo 31.12.07 02:00 
ACol und ARow sind komischerweise immer 0. Deswegen verstehe ich ja die Funktion nicht wirklich. Normalerweise müssten dort ja die Koordinaten jeder Zelle auftauchen.
Jerk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 251

Vista Ultimate, Ubuntu
Turbo Delphi 2006
BeitragVerfasst: Mo 31.12.07 02:13 
Hab meine Post geändert, probier es mal damit.
*edit*
Nochmal geändert damit es leichter verständlich ist


Zuletzt bearbeitet von Jerk am Mo 31.12.07 02:18, insgesamt 1-mal bearbeitet
Grinarn Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Mo 31.12.07 02:16 
Danke, ich werde das bei Gelegenheit mal testen und berichten :D
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mo 31.12.07 10:09 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TFrmMain.zelleFaerben(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  //färben der zellen
  if StrGrdSpiel.Cells[ACol,ARow] = '1' then
  begin
    Canvas.Brush.Color := clRed;
    Canvas.FillRect(Rect);
  end;
end;

Das kann gar nicht funktionieren.
Du zeichnest auf dem Canvas von TFrmMain und nicht auf dem StrGrdSpiel.

Warum nimmst du nicht das OnDrawCell des Grids? Dann hättest du das Problem nicht.