![]() |
Datenbank: PostgreSQL • Version: 8.3 • Zugriff über: ZeosLib
Grid mit gruppierter Darstellung
Hallo liebe Delphi-Kollegen,
mir fehlt vielleicht auch einfach nur die richtige Formulierung um bei der Forensuche das richtige Ergebnis zu bekommen oder ich habs überlesen - jedenfalls möchte ich folgendes realisieren: Ich hole mir aus zwei Tabellen meiner Datenbank Ergebnismengen. Beide Tabellen miteinander Verknüpft. Aus Tabelle A hole ich mir Name und ID. Aus Tabelle B Länge, Breite, Höhe etc. mit Bezug auf die ID aus Tabelle A. Das ganze möchte ich dann "gruppiert" in einer DBGrid oder eben einer entsprechenden Komponente wie folgt dargestellt haben:
Delphi-Quellcode:
Wie kann man solch eine Darstellung am einfachsten umsetzen?
+ "Testobjekt A"
- Länge - Breite - Höhe - Länge - Breite - Höhe + "Testobjekt B" - Länge - Breite - Höhe + "Testobjekt C" - Länge - Breite - Höhe - Länge - Breite - Höhe - Länge - Breite - Höhe |
Re: Grid mit gruppierter Darstellung
Hallo,
DBGrid Dann musst du dir den SQL-Befehl schon so zusammenbauen -> Case, Stored Procedure DBGrid / TClientDataSet Dort könnte man eine Tabelle so anlegen, wie sie im DBGrid angezeigt wird Die füllst du dann "per Hand" StringGrid Hier kannst du das Einfügen selber machen Ich mache bei den Gruppen immer Name-Spalte [Gruppe1] Inhalt 1 Inhalt 2 // Leerzeile [Gruppe2] Heiko |
Re: Grid mit gruppierter Darstellung
Wenn's Geld kosten darf:
![]() ![]() |
Re: Grid mit gruppierter Darstellung
Zitat:
|
Re: Grid mit gruppierter Darstellung
Hallo,
eine freie Komponente ist z.B. das SMDBGrid ( ![]() Mike |
Re: Grid mit gruppierter Darstellung
Zitat:
![]() Das fällt zwar nicht in die Kategorie "am einfachsten" bietet aber fast alle Möglichkeiten |
Re: Grid mit gruppierter Darstellung
OK, danke für die Tipps. Ich werde mich mal damit auseinandersetzen und mich ggf. wieder melden, wenn ich Probleme habe... :zwinker:
NetSonic |
Re: Grid mit gruppierter Darstellung
Hall0,
Zitat:
Und bitte nicht auf die Galerie verweisen. Oder meinst du die TreeView/ListView Kombination, das wäre in der Tat sowas wie Grouping. Heiko |
Re: Grid mit gruppierter Darstellung
@Mike: Kannst Du mir das kurz Hilfestellung zwecks Gruppierung geben? Ich habe die Komponente bereits installiert und auch in mein Programm eingebunden. Die "normalen" Daten werden auch angezeigt. Aber wo muss ich jetzt ansetzen??? Ich habe zwar die Eigenschaft "Grouping" gefunden, aber was muss ich dann im Feld "Expression" eingeben??? :gruebel:
NetSonic |
Re: Grid mit gruppierter Darstellung
Zitat:
Du hast ja sicher eine Query-Komponente. Dort mußt Du die SELECT-Anweisung so erweitern:
SQL-Code:
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.
SELECT *, 2 as flag
FROM tabelle WHERE (bedingung) UNION ALL SELECT DISTINCT *, 1 as flag FROM tabelle WHERE (bedingung) ORDER BY feldname, flag 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:
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.
if (Query1.FieldByName(Expression).AsInteger = 1)
then begin Value := True; Text := 'Gruppenüberschrift: ' + Query1.FieldByName('feldname').AsString; end; Die Ausgabe der Gruppenzeile kannst bzw. mußt Du im Event 'OnDrawGroupingCell' steuern:
Delphi-Quellcode:
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.
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) 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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz