Einzelnen Beitrag anzeigen

raiguen
(Gast)

n/a Beiträge
 
#7

Re: Linien im StringGrid zeichnen Ohne OnDrawCell

  Alt 16. Jun 2008, 18:34
Zitat von shmia:
Also mal grundsätzlich gilt: gezeichnet wird nur im Event OnDrawCell!...
Als Tipp habe ich deine Routine mal etwas abgeändert und flotter gemacht
Delphi-Quellcode:
procedure TfrmZaehlerStaende.StringGrid1DrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
Var sgc: TCanvas;
begin
  //--nicht unbedingt notwendig, aber wenn man Schreibfaul ist,nimmt man halt ne sinnvolle Abkürzung ;)
  sgc := StringGrid1.Canvas;

  if Label3.Caption = 'Arbeitszeitthen
     //Linien zwischen Zellen erzeugen
     if (ARow mod 4 = 0) and (ACol >= StringGrid1.FixedCols) then
       begin
        sgc.Pen.Color := clred; // Linienfarbe
        sgc.Pen.Width := 2; // Stärkt der Linie
        sgc.MoveTo(Rect.Left,Rect.Bottom);
        sgc.LineTo(Rect.Right,Rect.Bottom);
       end;
  

  // zellen verbinden für Spalte 0
  if (ACol = 0) And not (ARow In [4,8,12,16,20,24]) then
   begin
    sgc.Pen.Color := clgreen;
    sgc.Pen.Width := 2;
    sgc.MoveTo(Rect.Left, Rect.Bottom);
    sgc.LineTo(Rect.Right, Rect.Bottom);
   end;

  // Linie neben der klasse erzeugen
  if (ACol = 1) And (ARow In [1..23]) then
    begin
     sgc.Pen.Color := clfuchsia;
     sgc.Pen.Width := 1;
     sgc.MoveTo(Rect.Right, Rect.Top);
     sgc.LineTo(Rect.Right, Rect.Bottom);
    end;
end;
Okay, die merkwürdigen Farben hab ich nur für mich zum Test und besseren Erkennen eingesetzt.
Zitat:
repeat
n:= n + 4;
if (StringGrid1.Row = n) and (StringGrid1.Col >= StringGrid1.FixedCols) then
begin
...
end;
until n= 24;
ist gaaaaanz schlecht(er Stil), weil: diese Schleife wird beim Zeichnen JEDER(!!) Zelle durchlaufen und verlangsamt das Ganze und kann auch teilweise zu merkwürdigen Zeichenverhalten beim Scrollen führen.
 ARow mod 4 = 0 heisst vereinfacht: wenn die Zeilennummer glatt durch 4 teilbar ist (also Rest=0) dann pinsel den entsprechenden Strich...(also Zeilennr 4,8,12,...)
und das hier not (ARow In [4,8,12,16,20,24]) ist eine andere Möglichkeit, alle 4-er-Zeilen entsprechend zu behandeln (in diesem Fall eben diese Zeilen überspringen...)
wenn man das Ganze noch mehr vereinfachen will kann man statt dessen auch diese beiden Möglichkeiten nehmen:not (ARow mod 4 = 0) oder (ARow mod 4 <> 0) Das nur so als gut gemeinter Tipp am Rande
  Mit Zitat antworten Zitat