da ich sehr exzessiv mit Drawgrids arbeite, bin ich dabei, mir kleine Prozeduren zu stricken.
Generell funktioniert dies auf allen meinen Gridforms, jedoch tritt folgendes Problem auf:
In einem Grid wird die Schrift (fett und kursiv) wie gewünscht dargestellt, in allen anderen jedoch nicht. Alles andere passt aber und der font-type wird definitiv auch gesetzt!
Da alle Gridforms (bis auf die Spaltenanzahl und Daten) exakt gleich sind, verstehe ich das nicht.
Ich habe auch versucht, Teile aus InitGrid in PrepareGrid zu übernehmen. Dort ist die Darstellung dann OK, jedoch ist die Liste dann beim scrollen extrem hakelig.
(Ich habe die folgendenden Codeteile an den entsprechenden Stellen mit // kommentiert, der Rest ist nur zur Sicherheit mit gepostet)
Code: Alles auswählen
unit gridfunctions;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Grids, StdCtrls, Graphics, LCLIntf, dmdaten;
procedure GridConfig(Grid: TDrawGrid; iCol: integer; FixedSize: boolean; Breite: integer; Title: string;
FontBold: boolean; TitleAlign: TAlignment; DataAlign: TAlignment; Style: TColumnButtonStyle);
procedure GridSettings(Grid: TDrawGrid; iRows: integer; iCols: integer);
procedure GridDrawCell(Grid: TDrawGrid; Inhalt: string; IDColor: integer; aCol, aRow: integer; aRect: TRect; aState: TGridDrawState);
implementation
// Im wesentlichen geht es um diese Prozedur:
procedure GridConfig(Grid: TDrawGrid; iCol: integer; FixedSize: boolean; Breite: integer; Title: string;
FontBold: boolean; TitleAlign: TAlignment; DataAlign: TAlignment; Style: TColumnButtonStyle);
begin
Grid.Columns[iCol - Grid.FixedCols].Title.Caption := Title;
Grid.Columns[iCol - Grid.FixedCols].ButtonStyle := Style;
Grid.Columns[iCol - Grid.FixedCols].Title.Alignment := TitleAlign;
Grid.Columns[iCol - Grid.FixedCols].Alignment := DataAlign;
if FixedSize then
Grid.Columns[iCol - Grid.FixedCols].SizePriority := 0;
// Die folgenden Zeilen werden definitiv ausgeführt, zeigen aber in manchen Grids keine Wirkung:
if FontBold then
Grid.Columns[iCol - Grid.FixedCols].Font.Style := [fsBold]
else
Grid.Columns[iCol - Grid.FixedCols].Font.Style := [fsItalic];
// das geht wieder:
Grid.Columns[iCol - Grid.FixedCols].Width := Breite;
end;
procedure GridSettings(Grid: TDrawGrid; iRows: integer; iCols: integer);
var
i: integer;
begin
{ Einstellungen DrawGrid }
Grid.RowCount := iRows + Grid.FixedRows;
if Grid.Colcount = 1 then
begin
Grid.Options := [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRowSelect, goSmoothScroll, goRowHighlight, goEditing];
for i := 1 to iCols do
Grid.Columns.Add;
Grid.FixedCols := 1;
Grid.FixedRows := 1;
Grid.ScrollBars := ssVertical;
Grid.DefaultColWidth := 40;
Grid.AutoFillColumns := True;
end;
end;
{ Grid Zeichnen }
procedure GridDrawCell(Grid: TDrawGrid; Inhalt: string; IDColor: integer; aCol, aRow: integer; aRect: TRect; aState: TGridDrawState);
var
//Inhalt: string;
TextStyle: TTextStyle;
begin
{ Zellinhalt Holen }
if aRow > 0 then
begin
{ Spalten Ausrichtung }
if Acol >= Grid.FixedCols then
TextStyle.Alignment := Grid.Columns[Acol - Grid.FixedCols].Alignment;
{ Farben setzen }
if IDColor > 0 then
Daten.Farben.ColorizeGridRow(Grid, aCol, aRow, aState, IDColor);
{ Textstyle definieren }
TextStyle.Opaque := False;
if (aCol > 1) then
Grid.Canvas.FillRect(ARect);
InflateRect(ARect, -varCellpadding, -varCellpadding);
Grid.Canvas.TextRect(ARect, ARect.Left + constCellPadding, ARect.Top + constCellPadding, Inhalt, TextStyle);
end;
end;
end.
In der Grid-Form wird dann wie folgt angesteuert:
Code: Alles auswählen
procedure TArtikelverwaltung.dgArtikelDrawCell(Sender: TObject; aCol, aRow: integer; aRect: TRect; aState: TGridDrawState);
var
txt: string;
IDColor: integer;
begin
if Assigned(Artikel) then
...
GridDrawCell(dgArtikel, txt, IDColor, aCol, aRow, aRect, aState);
end;
// Hier die entsprechenden Aufrufe, die zwar alle ausgeführt werden, aber nicht in jedem Fall zum Ziel führen:
procedure TArtikelverwaltung.InitGridArtikel;
begin
GridSettings(dgArtikel, ArtikelListe.Count, 10);
GridConfig(dgArtikel, 1, True, 30, '',False, taCenter, taCenter, cbsCheckboxColumn);
GridConfig(dgArtikel, 2, True, 100, 'Gruppe',False, taCenter, taCenter, cbsNone);
...
GridConfig(dgArtikel, 10, True, 60, 'Steuer',False, taCenter, taRightJustify, cbsNone);
end;
function TArtikelverwaltung.GetCellText(ACol, ARow: integer): string;
var
idx: integer;
begin
if ArtikelListe.Count > 0 then
begin
Artikel := ArtikelListe[ARow - dgArtikel.FixedRows];
if Artikel = nil then
Result := ''
else
case ACol of
0: Result := IntToStr(ARow);
1: Result := '';
2: Result := Artikel.Artikelgruppe;
...
10: Result := FormatFloat('0.00 %', Artikel.Steuersatz);
end;
end;