FastGrid von innen: Das View-Objekt, Spalten und Ereignisse der Delphi-Grid-Komponente

2026-10-23

FastGrid im Detail: das View-Objekt, Spalten und Ereignisse der Grid-Komponente für Delphi

Im vorherigen Artikel haben wir einen Überblick über die wichtigsten Funktionen von FastGrid — der Grid-Komponente für Delphi aus dem Paket FastReport VCL — gegeben. Nun gehen wir eine Ebene tiefer und betrachten den internen Aufbau der Komponente: Wir untersuchen die Eigenschaften des Grids und der visuellen Elemente, aus denen es besteht, betrachten das View-Objekt, die Spalten, deren Eigenschaften und Ereignisse, und gehen am Ende kurz auf die Konfiguration der Datenverarbeitung ein.

Der Artikel richtet sich an Entwickler, die mit Delphi und C++ Builder arbeiten und FastGrid im Rahmen von FastReport VCL einsetzen oder gerade erst damit beginnen möchten.

 


 

Das Grid — das grundlegende Steuerelement

Das Grid (TfrGrid) ist das zentrale Steuerelement, auf dem alle übrigen Objekte liegen, die für seinen Betrieb sorgen. Fast alle Eigenschaften und Ereignisse der Komponente sind Standard und kommen bei den meisten VCL-Steuerelementen vor. Eine Ausnahme bilden zwei Ereignisse, die es nur beim Grid gibt:

  • OnActiveViewChanging(Sender: TObject; AView: TfrGridCustomView; var AAllow: Boolean) — tritt auf, bevor das aktuell aktive View geändert wird, und ermöglicht es, dessen Aktivierung zu untersagen.
  • OnActiveViewChanged(Sender: TObject) — tritt nach dem Wechsel des aktiven View auf.

Das Hinzufügen und Entfernen verschiedener Views im Grid erfolgt über das Menü der Komponente. Beim Erzeugen eines Grids wird automatisch ein View-Objekt hinzugefügt.

 


 

Die Legende des Grids

Zur Entwurfszeit befindet sich auf dem Grid außerdem die Legende — eine kleine Liste der auf dem Grid befindlichen Objekte. Sie bietet ein Menü nicht nur für das Grid, sondern auch für die darauf platzierten Komponenten (Spalten). Darüber hinaus erlaubt die Legende, jede dieser Komponenten schnell zu aktivieren. Wird die Legende nicht benötigt, lässt sie sich entfernen, indem man beim Grid die Eigenschaft ShowLegend := False setzt.

Legende des Grids

 


 

Das View-Objekt — die Grundlage der Datenanzeige

Das View-Objekt ist das zentrale Element des Grids, das für die Anzeige seines Inhalts verantwortlich ist. Die View-Objekte lassen sich über die Legende steuern. Im Menü jedes View stehen die folgenden Optionen zur Verfügung (beim Unbound View fehlen einige davon):

  • Link To DataSource — verknüpft das View mit einem der verfügbaren DataSource. Dabei werden im Grid alle im verknüpften DataSource vorhandenen Felder angelegt und fehlende entfernt (im Unbound-Modus nicht verfügbar).
  • Add Column — fügt eine neue Spalte hinzu, die nicht an Daten gebunden ist.
  • Add Missing Columns — fügt die Spalten hinzu, die im verknüpften DataSet vorhanden, im View aber noch nicht angelegt sind (im Unbound-Modus nicht verfügbar).
  • Delete All Columns — entfernt alle Spalten aus dem Grid.
  • Delete — entfernt das View.

 


 

Die Eigenschaft Appearance: eine zentrale Anlaufstelle für das Erscheinungsbild

Beim Arbeiten mit komplexen Steuerelementen stößt man ständig auf eine Vielzahl von Eigenschaften wie Color und Font sowie auf Eigenschaften der Art ParentFont. In FastGrid sind all diese Eigenschaften innerhalb der Eigenschaft Appearance verborgen. Sie besteht aus untergeordneten Eigenschaften, von denen jede für das Aussehen eines bestimmten Teils des Grids verantwortlich ist.

Sehen wir uns die Arbeitsweise dieser Eigenschaften am Beispiel von Appearance.Data an — sie steuert das Aussehen des Datenbereichs des Grids.

Aufgeklappte Eigenschaft Appearance.Data

Wie auf dem Screenshot zu erkennen ist, besteht diese Eigenschaft aus untergeordneten Eigenschaften wie BackgroundColor, FontColor, FontName sowie einem Satz von Flags im Untersubjekt AssignedValues mit denselben Namen. Das Prinzip ist folgendes: Über AssignedValues legen wir fest, welche der einfachen Eigenschaften direkt angewendet und welche vom übergeordneten Objekt geerbt werden. Setzt man beispielsweise AssignedValues.FontColor auf True, ändert sich beim Ändern der Schriftfarbe des Grids die Schriftfarbe im Datenbereich nicht.

Die Appearance-Eigenschaften dienen in erster Linie der Konfiguration von Schrift und Farbe der Objekte, die sie enthalten. Mit anderen Worten: Sie ersetzen ParentColor, ParentFont und andere Eigenschaften mit ähnlichem Verhalten, bieten aber mehr Flexibilität: Ein Teil der Parameter lässt sich lokal überschreiben, der Rest wird vom Grid geerbt.

Prüfen wir das anhand des FastGrid-Demoprojekts. Öffnen wir in Delphi das Projekt GridDemo.dpr — es befindet sich im Startmenü im Ordner „FastReport VCL Products“ im Unterordner „2026.2.0-Sources-Demos“ (die Versionsnummer im Ordnernamen kann abweichen; außerdem muss in der IDE eine FastReport-Version installiert sein, zu der FastGrid gehört). Öffnen wir das Modul DataAwareDemo.pas und wechseln wir zum Formular. Ändern wir einige untergeordnete Eigenschaften von Appearance. Das Ergebnis sieht so aus:

Geänderte Appearance-Eigenschaften im Demoprojekt

Und nun setzen wir direkt am Grid die Eigenschaft Font.Name := 'Courier New'. Diese Schrift ist der Anschaulichkeit halber gewählt. Das Aussehen des Grids wird dann so aussehen:

Das Grid mit der Schrift Courier New

Wir sehen, dass die Schrift bei allen Textelementen des Grids geändert wurde, Farbe und Attribute blieben jedoch unverändert. Bei der Spalte City blieb die Schrift unverändert — wir haben sie direkt an der Spalte gesetzt. Dieser Ansatz ermöglicht eine flexiblere Steuerung der Darstellung des Gridinhalts. Anmerkung: Standardmäßig sind alle AssignedValues auf False gesetzt, das heißt, die Werte fast aller Parameter werden aus dem Grid übernommen.

 


 

Eigenschaften des View

Alle Eigenschaften des View-Objekts sind in mehrere Gruppen unterteilt.

Active — legt die Aktivität des aktuellen View fest.

Appearance — bestimmt das Aussehen des View-Objekts. Ist der entsprechende Parameter in AssignedValues auf False gesetzt, wird der Wert direkt aus dem Grid übernommen:

  • Data — bestimmt das Aussehen des Datenbereichs.
  • Group — bestimmt die Eigenschaften der Gruppen im Datenbereich.
  • GroupArea — bestimmt die Eigenschaften des Gruppierungsbereichs.
  • Header — bestimmt die Eigenschaften der Spaltenköpfe.

DataController — die Eigenschaft, die den Zugriff auf die Daten festlegt. Darauf gehen wir im nächsten Artikel genauer ein.

OptionsBehavior — bestimmt das Verhalten des Grids. Untergeordnete Eigenschaften:

  • ConfirmDelete — Löschvorgänge erfordern eine Bestätigung in einem Dialogfenster.
  • UseColumnCaptionsForGroupNames — ist diese Option gesetzt, werden bei der Gruppierung im Datenbereich die Gruppen zusätzlich mit dem Spaltenkopf angezeigt.
  • WantTabs — die Tab-Taste führt zum Wechsel zur nächsten Spalte des Grids und nicht zum nächsten Steuerelement des Formulars.

OptionsCustomization — erlaubt dem Benutzer bestimmte Operationen: Filtern, Gruppieren und Sortieren der Daten; Ausblenden, Verschieben und Ändern der Größe von Spalten und weitere. Diese Operationen können durch die gleichnamige Eigenschaft jeder einzelnen Spalte überschrieben werden.

OptionsData — erlaubt dem Benutzer Operationen mit den Daten des Grids: Einfügen, Hinzufügen, Löschen und Bearbeiten.

OptionsDataNavigator — ermöglicht die Konfiguration des Datennavigators: seine Position, seine Anlagerung an die Ränder des Grids sowie die Größe der Schaltflächen, ihr Aussehen und den Satz der angezeigten Schaltflächen.

OptionsView — erlaubt die Anpassung des Aussehens des Grids. Sehen wir uns einige Untersubjekte genauer an:

  • EditButtonsVisibility — steuert die Anzeige der Schaltflächen beim Bearbeiten des Grids:
    • ebvActiveCell — nur bei der aktuell bearbeiteten Zelle;
    • ebvActiveRow — in den Zellen der aktuellen aktiven Zeile;
    • ebvAlways — bei allen Zellen, die Schaltflächen enthalten.
    • Standardmäßig — ebvActiveCell.
  • GroupRowHeight, HeaderHeight, RowHeight — Höhe der Gruppenzeile, des Kopfs bzw. der Datenzeile. Steht dort 0 (Standard), wird die Höhe aus der Höhe der eingestellten Schrift berechnet.
  • ShowColumnListButton — erlaubt die Anzeige der Spaltenliste zum Ausblenden; die Schaltfläche befindet sich in der oberen linken Ecke des Grids. Standardmäßig ist die Anzeige erlaubt. Über diese Liste kann der Benutzer zur Laufzeit die Sichtbarkeit der Gridspalten steuern.

Editor der Spaltenliste

  • ShowDataNavigator — Anzeige des Datennavigators. Die Eigenschaften des Navigators selbst finden sich in OptionsDataNavigator. Standardmäßig wird der Navigator nicht angezeigt.
  • MergedGroupSeparator — Trennzeichen, das verwendet wird, wenn eine Gruppe aus mehreren Feldern gebildet wird: In diesem Fall werden die Feldwerte durch den Wert dieser Eigenschaft getrennt.

Gruppentrennzeichen — Bindestrich

  • ShowGroupingArea — erlaubt die Anzeige des Gruppierungsbereichs. In diesen Bereich lassen sich Spaltenköpfe ziehen, um die Daten nach dem Inhalt der Spalten zu gruppieren. Standardmäßig wird der Bereich angezeigt. Beachten Sie: Für die Durchführung der Gruppierung ist seine Sichtbarkeit nicht erforderlich — sie ist nur dafür da, damit der Benutzer des Programms die Gruppierung selbst vornehmen kann.
  • ShowHeaders — erlaubt die Anzeige der Spaltenköpfe (standardmäßig aktiviert).
  • ShowIndicator — erlaubt die Anzeige des Datenindikators (standardmäßig aktiviert).
  • Visible — bestimmt die Sichtbarkeit des View.

 


 

Arbeiten mit dem View aus dem Code

Mit den View-Objekten lässt sich auch aus dem Code arbeiten. Ein neues Objekt erzeugt man mit der Konstruktion: frGrid.Views.CreateView(TfrGridTableView).

Zum Entfernen — das View aus der Views-Liste des Grids entfernen (frGrid.Views.Remove(View)) oder einfach View.Free aufrufen. Soll programmgesteuert zu einem anderen View gewechselt werden, genügt es, bei ihm View.Active := True zu setzen.

Die aktuell fokussierte Spalte des View lässt sich über die Eigenschaft View.Controller.FocusedColumnIndex ermitteln.

Das View-Objekt bietet eine Vielzahl von Ereignissen, die der Programmierer nutzen kann: sowohl Standardereignisse wie OnKeyDown als auch gridspezifische — ihre Bedeutung ergibt sich im Allgemeinen bereits aus den Namen. Eine Besonderheit des Ereignissatzes des View (und nicht nur seines) ist, dass einige Ereignisse den Parameter var AAllow: Boolean besitzen. Setzt der Programmierer diesen Parameter im Ereignishandler auf False, lässt sich die jeweilige Aktion einfach unterbinden. Setzt man ihn beispielsweise im Handler von OnEditing, verhindern wir den Wechsel der aktuellen Zelle in den Bearbeitungsmodus.

 


 

Ereignisse des View

Sehen wir uns einige der View-Ereignisse genauer an.

  • OnCellClick(Sender: TObject; AButton: TMouseButton; AShift: TShiftState; var AHandled: Boolean) — tritt auf, wenn mit der Maus auf eine Zelle geklickt wird. Setzt man AHandled auf True, wird der Handler der Spalte nicht aufgerufen und der eingebaute Editor nicht geöffnet. Dieses Verhalten kann nützlich sein, um das Bearbeiten von Zellen unter bestimmten Bedingungen zu unterbinden oder das Bearbeiten der Zellwerte auf alternativen Wegen zu organisieren.
  • OnEditing(Sender: TObject; AItem: TfrGridViewItem; ARowIndex: Integer; var AAllow: Boolean) — tritt auf, wenn eine Zelle in den Bearbeitungsmodus wechselt. Bei AAllow := False ist das Bearbeiten der Zelle untersagt.
  • OnFilterPopupDropDown(Sender: TObject; AItem: TfrGridViewItem; APopupWindow: TfrGridItemFilterPopupWindow) — tritt auf, wenn der Benutzer auf das Filtersymbol im Spaltenkopf klickt. APopupWindow ist das Fenster mit den Filterinformationen, das dem Benutzer angezeigt wird.
  • OnFilterPopupCloseUp(Sender: TObject; AItem: TfrGridViewItem) — tritt auf, wenn der Benutzer die Arbeit mit der aufklappbaren Filterliste beendet.
  • OnGetCellBackgroundColor(Sender: TObject; AItem: TfrGridItem; ARowIndex: Integer; var AColor: TColor) — erlaubt es, die Hintergrundfarbe einer Zelle des Grids festzulegen.

Diese Ereignisse haben gemeinsame Elemente. In allen Handlern ist der Parameter AItem ein Verweis auf die Tabellenspalte, und ARowIndex ist die Nummer der Datenzeile im mit dem Grid verbundenen DataController.

 


 

Spalten: Eigenschaften und Ereignisse

Das View enthält eine Menge von Spalten. Spalten lassen sich sowohl im Formulareditor der IDE als auch zur Laufzeit des Programms hinzufügen. Sehen wir uns die wichtigsten Eigenschaften einer Spalte an.

Appearance — bestimmt das Aussehen der Spalte:

  • Data — bestimmt das Aussehen des Datenbereichs der Spalte. Ist AssignedValues = False, werden die Werte aus der gleichnamigen Eigenschaft des View übernommen.
  • Header — bestimmt das Aussehen des Spaltenkopfs. Ist AssignedValues = False, werden die Werte aus der gleichnamigen Eigenschaft des View übernommen.

Caption — die Bezeichnung der Spalte.

DataBinding — die Eigenschaft, die die Datenbindung der Spalte festlegt. Darauf gehen wir weiter unten genauer ein.

GroupIndex, MergedGroupIndex — der Index der Gruppe, in der sich die Spalte befindet, und der Index der Spalte in dieser Gruppe. Standardmäßig gleich -1 (die Spalte gehört zu keiner Gruppe). Durch Ändern dieser Eigenschaften lässt sich die Gruppierung im Grid direkt steuern — Gruppen anlegen und entfernen. Ist die Anzeige des Gruppierungsbereichs erlaubt, kann der Benutzer zur Laufzeit selbst Gruppen anlegen und entfernen: Dazu genügt es, den Spaltenkopf in den Gruppierungsbereich zu ziehen. Die Spalte verschwindet dabei aus der Liste der sichtbaren, doch die Daten im Grid werden nach dem Wert des Felds dieser Spalte gruppiert. Beachten Sie: Das Grid wird in jedem Fall nach dieser Spalte sortieren.

Die Gruppierung kann mehrstufig sein — ziehen Sie einfach die gewünschten Spaltenköpfe in den Gruppierungsbereich. Zieht man einen Spaltenkopf bei gedrückter Strg-Taste, lässt sich eine Gruppe erstellen, die auf mehreren Spalten basiert. Wird die Gruppierung nicht mehr benötigt, ziehen Sie den Spaltenkopf aus dem Gruppierungsbereich zurück ins Grid.

Index — der sichtbare Index der Spalte auf dem Bildschirm. Durch Ändern dieser Eigenschaft lässt sich die Position der Spalte im Grid direkt verändern.

MinWidth — die Mindestbreite der Spalte. Beachten Sie: Der Standardwert ist nicht 0, sondern 20.

Options — diese Eigenschaft legt fest, welche Aktionen der Benutzer mit der Spalte ausführen darf: sie in den Bearbeitungsmodus versetzen, nach den Spaltendaten filtern, gruppieren, die Spalte ausblenden, ihre Größe ändern, sie verschieben, die Spaltendaten ändern, sie sortieren sowie sie in der Spaltenliste anzeigen. Wie zu sehen ist, entspricht diese Aktionsliste weitgehend derjenigen in View.OptionsCustomization.

Properties — über diese Eigenschaft lässt sich ein für die Spalte zu verwendender Editor festlegen. Wird die Eigenschaft nicht gesetzt, versucht das Grid, anhand des Datentyps der Spalte einen passenden Editor zu wählen. Weist man dieser Eigenschaft einen Wert aus der Dropdown-Liste zu, lässt sie sich danach aufklappen und die Eigenschaften des festgelegten Editors konfigurieren. Auf die Editoren gehen wir in einem eigenen Artikel genauer ein. An dieser Stelle sei bemerkt: Der Editor ist nicht nur für das Bearbeiten des Werts einer einzelnen Zelle verantwortlich, sondern auch für die Anzeige der Werte der gesamten Spalte. Die Editoren stehen auch als eigenständige Komponenten zur Verfügung. Beachten Sie: Auf die Eigenschaften des Editors kann nur zugegriffen werden, wenn der Editor explizit gesetzt wurde — bei den Standardeditoren ist keine Konfiguration der Eigenschaften möglich.

SortOrderIndex, SortOrder — mit diesen Eigenschaften lässt sich die Sortierung der Gridfelder festlegen. Das Feld SortOrderIndex bestimmt die Priorität des Feldes bei der Sortierung: Zuerst wird nach dem Feld mit SortOrderIndex = 0 sortiert; stimmen die Werte in dieser Spalte überein, wird nach der Spalte mit SortOrderIndex = 1 sortiert. Setzt man SortOrderIndex = -1, wird diese Spalte nicht sortiert.

Die Eigenschaft SortOrder bestimmt die Sortierrichtung: soNone — keine Sortierung, soAscending — aufsteigende Sortierung, soDescending — absteigende Sortierung. Beachten Sie, dass der Benutzer die Sortierung der Spalten auch zur Laufzeit festlegen kann: Ein einfacher Klick mit der linken Maustaste auf den Spaltenkopf genügt. Bei erneutem Klick wechselt die Sortierrichtung. Sortiert wird nach der Spalte, auf deren Kopf geklickt wurde. Zum Aufheben der Sortierung genügt ein Klick auf den Spaltenkopf bei gedrückter Strg-Taste. Hält man beim Klicken die Umschalttaste Shift gedrückt, lässt sich die Sortierung gleich nach mehreren Spalten durchführen.

 


 

Spalten aus dem Code

Eine Spalte lässt sich aus dem Code mit der Methode View.Columns.CreateColumn anlegen. Einen Editor weist man ihr zu, indem man der Eigenschaft Column.PropertiesAlias eine Zeichenkette mit dem Namen des Editors zuordnet oder der Eigenschaft Column.PropertiesClass den Klassentyp des Editors setzt.

Die Spaltenliste eines View lässt sich mit der Methode View.Columns.Clear leeren. Nützlich sind außerdem die Eigenschaften Columns.VisibleCount und Columns.VisibleItems — mit ihnen erhält man Zugriff nur auf die sichtbaren Spalten, wobei die Spalten in dieser Liste nach ihrer Position auf dem Bildschirm geordnet sind.

 



Ereignisse der Spalte

Sehen wir uns die Ereignisse einer Datenspalte an. Wie bereits erwähnt, entsprechen einige Spaltenereignisse den View-Ereignissen.

  • OnCellClick(Sender: TObject; AButton: TMouseButton; AShift: TShiftState; var AHandled: Boolean) — tritt beim Klick auf eine Zelle auf.
  • OnGetCellBackgroundColor(Sender: TObject; ARowIndex: Integer; var AColor: TColor) — erlaubt es, die Hintergrundfarbe einer Zelle festzulegen.
  • OnGetDisplayValue(Sender: TObject; ARowIndex: Integer; var AValue: Variant) — liefert den in der Zelle anzuzeigenden Wert.
  • OnGetFilterDisplayText(Sender: TObject; const AValue: Variant; var AText: string) — liefert den Wert, der in der Filterliste angezeigt wird.
  • OnGetHeaderBackgroundColor(Sender: TObject; var AColor: TColor) — erlaubt es, die Hintergrundfarbe des Spaltenkopfs festzulegen.

 


 

Konfiguration der Datenverarbeitung: die Modi DB und Unbound

Zum Abschluss des Artikels werfen wir einen kurzen Blick darauf, wie sich das Grid für die Arbeit mit Daten auf der Ebene der Eigenschafteneinstellungen konfigurieren lässt. Wie wir bereits wissen, kann das Grid in zwei Modi mit Daten arbeiten: DB und Unbound.

Der DB-Modus

Im DB-Modus verbindet sich das Grid mit den Daten über die Standardkomponente TDataSource — ganz ähnlich wie es beispielsweise die Standardkomponente TDBGrid tut. Nachdem man im Objektinspektor View.DataController := 'DB' gesetzt hat, lässt sich diese Eigenschaft aufklappen und der gewünschte TDataSource angeben. Nachdem der DataSource gesetzt ist, kann man die Spalten durchgehen und in der Eigenschaft DataBinding.FieldName jeder Spalte den Namen des gewünschten Datenfelds angeben. Die Eigenschaft DataBinding.FieldType lässt sich nicht ändern — ihr Wert wird aus dem verknüpften Datenfeld des DataSource übernommen.

Der Unbound-Modus

Im Unbound-Modus arbeitet das Grid etwas anders. Nachdem man View.DataController := 'Unbound' gesetzt hat, wechselt das Grid in den Modus der Arbeit mit Daten, die im Grid selbst gespeichert sind. Um die Spalten des Datensatzes festzulegen, muss man sie zunächst anlegen — zum Beispiel über das Kontextmenü des View in der Legende —, danach zu den Spaltenobjekten wechseln und im Feld DataBinding.FieldName jeder Spalte den Namen des Datenfelds sowie im Feld DataBinding.FieldType den Typ des Datenfelds angeben. Danach wird im internen Speicher des Grids der entsprechende Feldsatz angelegt, mit dem man arbeiten kann.

 


 

Fazit

Wir haben den internen Aufbau von FastGrid betrachtet: die Rolle des Grids als grundlegendes Steuerelement, das View-Objekt mit seinen Eigenschaften, den Appearance-Mechanismus mit dem Untersubjekt AssignedValues, die Spalten mit ihren Einstellungen und Ereignissen sowie die beiden Datenmodi — DB und Unbound. Das reicht aus, um das Aussehen und das Verhalten des Grids sowohl zur Entwurfszeit als auch aus dem Code heraus zu konfigurieren.

Übrig geblieben ist eine letzte große Frage — die Arbeit mit den Daten: DataController, die Bindung des DataSource, das Bearbeiten und die Navigation durch die Datensätze. Genau darauf gehen wir im nächsten Artikel der Reihe ausführlich ein.

VCL FastReport Delphi FastGrid
26. Oktober 2026

TfrImageComboBox: Eine Dropdown-Liste mit Bildern und Textbeschriftungen in FastReport VCL

TfrImageComboBox aus der FastEditors VCL: eine Dropdown-Liste mit Symbolen und Beschriftungen für die FastReport VCL. Eigenschaften, Ereignisse und Anwendungsbeispiele in Delphi.
26. Oktober 2026

Fortschrittsbalken in Delphi: Die Komponenten „TfrProgressBar“ und „TfrxProgressBar“ aus FastReport VCL

Schauen wir uns die Komponenten TfrProgressBar und TfrxProgressBar aus FastReport VCL einmal genauer an: Konfiguration der Fortschrittsskala, Schwellenwerte und Markierungen, Datenbindung sowie ein Delphi-Beispiel.
21. Oktober 2026

So richten Sie OLAP in Delphi ein und nutzen Datenschnitte zur Lösung analytischer Aufgaben

Wir erstellen BI-Analysen in Delphi: Wir erklären Schritt für Schritt die Konfiguration von FastGrid und FastCube (OLAP) für mehrdimensionale Berichte und Datenanalysen ohne komplexe SQL-Abfragen.

© 1998-2026 Fast Reports Inc.