Einzelnen Beitrag anzeigen

Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#2

AW: Wie ziehe ich eine farbige Linie in einem DBGrid / DrawColumnsCell-Event?

  Alt 25. Nov 2021, 12:00
Suchst Du sowas in der Art?
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, kbmMemTable, Grids, DBGrids;

type
  TForm1 = class(TForm)
    dbg: TDBGrid;
    ds: TDataSource;
    tb: TkbmMemTable;
    procedure FormCreate(Sender: TObject);
    procedure dbgDrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
  private
    { Private-Deklarationen }
    fMonatOld : Integer;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  i : Integer;
begin
  // Nur, damit wir zum Testen überhaupt mal ein paar Daten haben.
  for i := 1 to 100 do begin
    tb.Append;
    tb.Fields[1].AsInteger := StrToInt(FormatDateTime('mm',Now + i));
    tb.Fields[2].AsString := FormatDateTime('mmmm',Now + i);
    tb.Post;
  end;
  // Irgendwo, an geeigneter Stelle den ersten Monat merken!!!
  fMonatOld := StrToInt(FormatDateTime('mm',Now));
end;

procedure TForm1.dbgDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  Monat : Integer;
  Monatswechsel : Boolean;
begin
  // Den Monat des aktuellen Datensatzes holen.
  Monat := dbg.DataSource.DataSet.FieldByName('Monat').AsInteger;
  // Den mit dem gemerkten Monat vergleichen.
  Monatswechsel := fMonatOld <> Monat;
  // Hat ein Monatswechsel stattgefunden?
  if Monatswechsel then begin
    // Wenn ja, Linie zeichnen.
    dbg.Canvas.Pen.Color := $00243C79; // $005180F5; // Linienfarbe für die Monatstrennung
    dbg.Canvas.Pen.Width := 5; // Stärke der Linie, erzeugt einen Ballon am Zeilenbeginn
    dbg.Canvas.MoveTo(Rect.Left,Rect.Top);
    dbg.Canvas.LineTo(Rect.Right,Rect.Top); //
    // Wichtig: Erst bei der letzten Spalten den nun neuen "alten" Monat merken.
    // Ansonsten erhält man die Linie nur in der ersten Spalte!!!
    if DataCol >= dbg.Columns.Count - 1 then fMonatOld := Monat;
  end;
  // Die ursprüngliche Zeichenroutine des DBGrids aufrufen.
  dbg.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

end.
Miniaturansicht angehängter Grafiken
form1.jpg  
  Mit Zitat antworten Zitat