2016-04-07 7 views
1

Meine Verwendung von Delphi XE7 FireMonkey TStringGrid hat es eine Million Zeilen halten. Das Auffüllen des Inhalts von TStringGrid mit Millionen von Zeichenfolgen würde zu viel Arbeitsspeicher verbrauchen.FireUIs TStringGrid - setze die Werte wie sie aussehen

Wie stellt man die Werte der Zellen so ein, wie sie gemalt werden?

Mein Code würde den Inhalt der Zellen aus einer riesigen temporären Datei ausfüllen, während die Zellen in die Ansicht scrollen.

Die TurboPower Orpheus TOvcTable-Komponente in der alten Version meiner App tat dies mit einem Hook namens OnGetCellData(). Ich sehe nichts in FireUIs TStringGrid.

+0

Hat Zuweisen einer [FMX.Grid.TCustomGrid.OnGetValue] (http://docwiki.embarcadero.com/Libraries/en /FMX.Grid.TCustomGrid.OnGetValue) Ereignismethode 'TOnGetValue = Prozedur (Absender: TObject; const Col, Zeile: Integer; var Wert: System.Rtti.TValue) des Objekts;' work? –

+0

Ich denke, es gibt ein OnBeforeDrawing-Ereignis in TColumn, das außer Kraft gesetzt werden kann, und Sie können es verwenden, um Inhalt on-the-fly zu liefern. Sie können FMS.Grid überprüfen, um zu sehen, welche Methoden Sie überschreiben oder einhängen können. –

+0

@LURD OnGetValue ist für TStringGrid nicht verfügbar und die Dokumentation sagt, dass es aufgerufen wird, wenn ein Wert abgerufen wird. Ich nehme an, wenn es aufgerufen würde, bevor der Wert zum Zeichnen abgerufen wurde, würde es funktionieren. –

Antwort

4

Anstelle TStringGridTGrid mit TColumn Spalten verwenden. Verwenden Sie dann das Ereignis OnGetValue, um Werte für die Anzeige im Raster abzurufen. Dies ist der VCL s TDrawGrid am nächsten.

procedure TForm1.Grid1GetValue(Sender: TObject; const Col, Row: Integer; 
    var Value: TValue); 
begin 
    Value := inttostr(col)+', '+inttostr(row); 
end; 

Probenergebnis Gitter mit 10 Reihen Mio:

enter image description here