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.