interface type TQuerySetXML = class(TQuerySetSQL) // Non visual sql result set Checked: TQuerySet.TFieldCheckBox; [UniqueField] [DefaultSortField(True)] [InitField('Id', 64)] Id: TQuerySet.TFieldInteger; [InitField('TimeStamp', 'Dato og tid', 120)] TimeStamp: TQuerySet.TFieldDateTime; [InitField('ProcessId', 'PID', 64)] PID: TQuerySet.TFieldInteger; [InitField('ThreadId', 'TID', 64)] TID: TQuerySet.TFieldInteger; [InitField('XLevel', 'NivÄ', 70)] Level: TQuerySet.TFieldEnum; [InitField('XCategory', 'Kategori', 70)] Category: TQuerySet.TFieldEnum; [InitField('AppShortName', 'App', 30)] App: TQuerySet.TFieldString; [InitField('ClientName', 'Client', 140, hcRightJustify)] Client: TQuerySet.TFieldString; [InitField('Title', 'Beskrivelse', 800)] Title: TQuerySet.TFieldString; constructor Create; override; function LevelColorizer(const aValue: TLogEventLevel; var FG, BG: TColor): Boolean; function AppToIconIndex(const aRow: Integer): Integer; End; TQueryGridXML = class(TQueryGridSQL); // attaches the non-visual query set to a visual grid // Implementation { TQuerySetXML } constructor TQuerySetXML.Create; begin inherited; Level.Formatter := function (const Lvl: TLogEventLevel):String begin Result := LogEventLevelToString(Lvl); end; Level.SecondaryKeys := [Category, TimeStamp]; Level.ValueColorizer := LevelColorizer; Category.Formatter := function (const Cat: TLogEventCategory):String begin Result := LogEventCategoryToString(Cat); end; Category.SecondaryKeys := [TimeStamp]; App.SecondaryKeys := [Client, TimeStamp]; App.AddImage(AppToIconIndex, heRight); Client.SecondaryKeys := [TimeStamp]; PID.SecondaryKeys := [TimeStamp]; Title.SecondaryKeys := [TimeStamp]; end; function TQuerySetXML.AppToIconIndex(const aRow:Integer):Integer; var TLA: String; begin TLA := App[aRow]; if TLA = AppId_Server then Result := 0 else if TLA = AppID_DatabaseProc then Result := 1 else if TLA = AppId_TINEAdmin then Result := 2 else if TLA = AppId_PSDTruckTerm then Result := 3 else if TLA = AppId_TMSProdInterface then Result := 4 else if TLA = AppId_ScannerTool then Result := 5 else if TLA = AppId_RouteViewer then Result := 6 else if TLA = AppId_SiteManager then Result := 7 else if TLA = AppId_PickByVoice then Result := 8 else if TLA = AppId_PSDController then Result := 9 else if TLA = AppId_UnitTest then Result := 10 else if TLA = AppId_Utils then Result := 11 else Result := -1; end; function TQuerySetXML.LevelColorizer(const aValue:TLogEventLevel; var FG, BG: TColor):Boolean; begin Result := True; case aValue of lelDebug: FG := clDkGray; // lelInfo: ; lelWarning: FG := clBlue; lelError: FG := clRed; lelSystem: FG := clGreen; lelCritical: begin FG := clYellow; BG := clMaroon; end else Result := False; end; end; // Setting up the grid procedure TPSDXmlLogViewer3.InitializeViews; begin if Assigned(XMLGrid) then EXIT; XMLQuery := TXMLLogNonPaged.Create(''); //<-- a SQL query builder XMLQuery.Reset; XMLQuery.Subset := 'Id, TimeStamp, ProcessId, ThreadId, XLevel, XCategory, Title, ClientId'; XMLQuery.PageSize := 100; RefreshInterval := 0; DaysBack := 2; dtpDate.Date := Trunc(Now); XMLGrid := TQueryGridXML.Create; XMLGrid.MultiSelect := True; XMLGrid.Grid := sgLog; //<-- Attaching to the TAdvStringGrid from TMS ... // updating the contents db := PSD.DatabasePool.Acquire; try XMLQuery.UpdateCount(db, XMLQuery.Selection); // a first query to determine number of hits, page count, etc. XMLGrid.Update(db, XMLQuery.PaginatedSelection); // refresh the grid data from the SQL query finally PSD.DatabasePool.Release(db); end;