Einzelnen Beitrag anzeigen

Mike_on_Tour

Registriert seit: 16. Aug 2007
195 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

Re: Grid mit gruppierter Darstellung

  Alt 26. Nov 2009, 14:45
Zitat von NetSonic:
@Mike: Kannst Du mir das kurz Hilfestellung zwecks Gruppierung geben? ... Ich habe zwar die Eigenschaft "Grouping" gefunden, aber was muss ich dann im Feld "Expression" eingeben???
NetSonic
OK, ich versuchs mal.

Du hast ja sicher eine Query-Komponente. Dort mußt Du die SELECT-Anweisung so erweitern:
SQL-Code:
SELECT *, 2 as flag
FROM tabelle
WHERE (bedingung)

UNION ALL

SELECT DISTINCT *, 1 as flag
FROM tabelle
WHERE (bedingung)

ORDER BY feldname, flag
Zur Erklärung: Du mußt die SQL-Anweisung mit einer 'UNION' "verdoppeln". Dabei darf das zweite SELECT nur einen Datensatz pro Gruppe ergeben, deshalb das 'DISTINCT' unbedingt angeben. In jedem SELECT muß noch ein Kennzeichen angegeben werden (ich habe das als 'flag' bezeichnet). Alle Gruppenzeilen bekommen als 'flag' den Wert 1 und alle Datenzeilen zur Gruppe den Wert 2. Mit ORDER BY läßt sich das dann noch sortieren.

Dann legt Du in der Eigenschaft 'Grouping' einen Eintrag an und trägst bei Expression 'flag' ein.
Für das Event 'OnExpression' trägst Du folgenden Code ein:
Delphi-Quellcode:
if (Query1.FieldByName(Expression).AsInteger = 1)
  then begin
    Value := True;
    Text := 'Gruppenüberschrift: ' + Query1.FieldByName('feldname').AsString;
  end;
Zur Erklärung: Im Parameter 'Expression' wird der Eintrag aus der Grouping-Eigenschaft übergeben (automatisch). Im Parameter 'Text' übergibst Du einfach das, was in der Gruppenzeile stehen soll.

Die Ausgabe der Gruppenzeile kannst bzw. mußt Du im Event 'OnDrawGroupingCell' steuern:
Delphi-Quellcode:
DefaultDrawing := False;

ACanvas.Brush.Color := Group.Color;
ACanvas.Font.Assign(Group.Font);
ACanvas.FillRect(CellRect);

CellRect.Left := CellRect.Left + 4;
CellRect.Top := CellRect.Top + 2;
DrawText(ACanvas.Handle, PChar(Text), Length(Text), CellRect, DT_LEFT or DT_WORDBREAK or DT_EXPANDTABS or DT_NOPREFIX or DT_VCENTER)
Zur Erklärung: In meinem Test wird die Gruppenzeile rechtsbündig ausgegeben. Offensichtlich wird dafür die Einstellung der ersten Spalte des Grids übernommen. Ich habe deshalb das Zeichnen selbst übernommen und die Gruppenzeile linksbündig angezeigt.

Mehr habe ich erst mal nicht getestet, da ich für meine Gruppierung noch nicht so weit bin. Es geht vielleicht auch noch etwas einfacher, aber als Anfang sollte es erst mal reichen.

Mike
Programmieren ist wie das Wandeln auf dem schmalen Pfad zwischen Wahnsinn und Intelligenz.
  Mit Zitat antworten Zitat