[Gelöst] Sonderbares Verhalten bei TDrawGrid

Rund um die LCL und andere Komponenten

[Gelöst] Sonderbares Verhalten bei TDrawGrid

Beitragvon MacWomble » 11. Nov 2019, 10:15 [Gelöst] Sonderbares Verhalten bei TDrawGrid

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 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.
MacWomble
Lazarusforum e. V.
 
Beiträge: 909
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 19.2 Cinnamon / CodeTyphon 7.0 v. 08.01.2020/ FP 3.3.1 Rev 43891 | 
CPU-Target: Intel i7 64/32 Bit
Nach oben

Beitragvon wp_xyz » 11. Nov 2019, 18:04 Re: Sonderbares Verhalten bei TDrawGrid

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.
wp_xyz
 
Beiträge: 3043
Registriert: 8. Apr 2011, 08:01

Beitragvon MacWomble » 11. Nov 2019, 18:20 Re: Sonderbares Verhalten bei TDrawGrid

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.
MacWomble
Lazarusforum e. V.
 
Beiträge: 909
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 19.2 Cinnamon / CodeTyphon 7.0 v. 08.01.2020/ FP 3.3.1 Rev 43891 | 
CPU-Target: Intel i7 64/32 Bit
Nach oben

• Themenende •

Zurück zu Komponenten und Packages



Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 3 Gäste

porpoises-institution
accuracy-worried