Jetzt aber ....
Ab jetzt brauchst du keine Gruppe mehr vorgeben, d. h. ob du die Summarys änderst oder löscht wird immer bei einer Summe (skSum) die formatierte Zeit angezeigt.
Dazu brauchst du wieder meine Prozedure
GetText und das Event vom Grid
[Tableview].DataController.SummaryDefaultGroup.SummaryItems.O nSummary. Sobald eine Gruppierungsfunktion angezeigt werden soll wird das Event aufgerufen. Dabei prüfe ich ob es die korrekten Spalten sind (Es wird bei jeder Spalte in jedem Record ausgelöst).Dann ob es eine Footer ist und die Gruppierungsfunktion skSum. Wenn das der Fall ist, dann verbinde ich vom SummaryItem das Event OnGetText mit der Prozedure GetText. Diese Event wird nach der Summary Berechnung aufgerufen.
Einen kleinen Tipp habe ich noch. Hast du die Help Dateien runtergeladen, mir haben sie (fast) immer geholfen. Hier in diesem Fall aber nicht
, dafür aber DevExpress Support, der ist sehr gut.
Der Eintrag war das was wir brauchten ....
DevExpress Eintrag Q212225
Gruß
Matthias
Delphi-Quellcode:
procedure TForm1.cxGridDBTV1DataControllerSummaryDefaultGroupSummaryItemsSummary(
ASender: TcxDataSummaryItems; Arguments: TcxSummaryEventArguments;
var OutArguments: TcxSummaryEventOutArguments);
var
AItem: TcxGridTableSummaryItem;
AValue: Variant;
begin
AItem := TcxGridTableSummaryItem(Arguments.SummaryItem);
// Prüfe ob es die gewünschte Spalte ist
if (AItem.Column = cxGridDBColZeit1) or (AItem.Column = cxGridDBColZeit2) or
(AItem.Column = cxGridDBColZeit3) then
begin
// Bedingung : es ist ein Footer und soll die Summe angezeigt werden
if (AItem.Position = spFooter) and (AItem.Kind = skSum) then
// Event OnGetText einschalten
AItem.OnGetText := GetText
else
begin
// Event OnGetText ausschalten und Exit
AItem.OnGetText := nil;
Exit;
end;
//Entnehme die Werte aus der korrekten Spalte
if AItem.Column = cxGridDBColZeit1 then
AValue := cxGridDBTV1.DataController.Values[
Arguments.RecordIndex, cxGridDBColZeit1.Index]
else if AItem.Column = cxGridDBColZeit2 then
AValue := cxGridDBTV1.DataController.Values[
Arguments.RecordIndex, cxGridDBColZeit2.Index]
else if AItem.Column = cxGridDBColZeit3 then
AValue := cxGridDBTV1.DataController.Values[
Arguments.RecordIndex, cxGridDBColZeit3.Index];
// Nachfolgende Abfrage auskommentiert, da weiterhin gerechnet wird.
// Nur wenn man bestimmte Datensätze berechnet haben möchte
// könnte man die DS filtern und in SummaryValue addieren.
//nur als Beispiel
// if not VarIsNull(AValue) then
// begin
// OutArguments.SummaryValue := AValue + OutArguments.SummaryValue;
// OutArguments.Done := true;
// end;
end;
end;
procedure TForm1.GetText(Sender: TcxDataSummaryItem; const AValue: Variant;
AIsFooter: Boolean; var AText: string);
begin
if AValue <> Null then
AText := FormatDateTime('hh:mm', AValue);
end;