[Gelöst] Sonderbares Verhalten bei TDrawGrid

Rund um die LCL und andere Komponenten
Antworten
MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

[Gelöst] Sonderbares Verhalten bei TDrawGrid

Beitrag von MacWomble »

Hallo,

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;   
 
Zuletzt geändert von MacWomble am Mo 11. Nov 2019, 18:21, insgesamt 1-mal geändert.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Sonderbares Verhalten bei TDrawGrid

Beitrag von wp_xyz »

Ich sehe folgende Punkte:
  • Du frägst ColCount ab, obwohl du mit Columns arbeitest. Das passt nicht zusammen. Entweder ColCount oder Columns (und Columns.Count).
  • In DrawGrid sind die nicht verwendeten Felder von TextStyle nicht initialisiert. Setze das an den Anfang der Routine: TextStyle := Grid.Canvas.TextStyle
  • Evtl sind nicht bei alle Grids mit dem Eventhandler verbunden.

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Sonderbares Verhalten bei TDrawGrid

Beitrag von MacWomble »

wp_xyz hat geschrieben:Ich sehe folgende Punkte:
  • Du frägst ColCount ab, obwohl du mit Columns arbeitest. Das passt nicht zusammen. Entweder ColCount oder Columns (und Columns.Count).
  • In DrawGrid sind die nicht verwendeten Felder von TextStyle nicht initialisiert. Setze das an den Anfang der Routine: TextStyle := Grid.Canvas.TextStyle
  • Evtl sind nicht bei alle Grids mit dem Eventhandler verbunden.


Deine Kritik ist durchaus berechtigt. Ich habe das korrigiert. ( if Grid.Columns.Count = 0 then ... statt if Grid.ColCount =1 then ...)

Das Initialisieren des TextStyle brachte die Lösung !

Alle Eventhandler sind und waren verbunden.

Vielen Dank dafür! :D
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Antworten