diff --git a/components/rx/trunk/rxdbgridexportpdf.pas b/components/rx/trunk/rxdbgridexportpdf.pas index 3033375a9..a7edcffb9 100644 --- a/components/rx/trunk/rxdbgridexportpdf.pas +++ b/components/rx/trunk/rxdbgridexportpdf.pas @@ -171,6 +171,47 @@ begin end; procedure TRxDBGridExportPDF.DoExportTitle; +var + P: TPDFPage; + Pt: TPDFCoord; + i, X, CP, PX: Integer; + C: TRxColumn; + S: String; + PU: TPDFUnitOfMeasure; +begin + X:=FPageWidth + FPageMargin.Right; + CP:=-1; + PX:=0; + + for i:=0 to FRxDBGrid.Columns.Count - 1 do + begin + C:=FRxDBGrid.Columns[i]; + + if X + C.Width > FPageWidth - FPageMargin.Right then + begin + Inc(CP); + P:=TPDFPage(FWorkPages[CP]); + X:=FPageMargin.Left; + PX:=0; + end; + + Pt.X := X; + Pt.Y := FPosY; + P.SetColor(C.Color); + P.DrawRect(Pt.X, Pt.Y, C.Width, FRxDBGrid.DefaultRowHeight, 1, false, true); + + + P.SetFont(FHeaderFont, 10); + P.WriteText(Pt.X+2, Pt.Y-10, C.Title.Caption); + + X:=X + C.Width; + end; + + Inc(FPosY, FRxDBGrid.DefaultRowHeight); +end; + +procedure TRxDBGridExportPDF.DoExportBody; +procedure DoWriteRow; var P: TPDFPage; Pt: TPDFCoord; @@ -193,8 +234,11 @@ begin P.DrawRect(Pt.X, Pt.Y, C.Width, FRxDBGrid.DefaultRowHeight, 1, false, true); - P.SetFont(FHeaderFont, 10); - P.WriteText(Pt.X+2, Pt.Y-10, C.Title.Caption); + if Assigned(C.Field) then + begin + P.SetFont(FBodyFont, 10); + P.WriteText(Pt.X+2, Pt.Y-10, C.Field.DisplayText); + end; if X + C.Width > FPageWidth - FPageMargin.Right then begin @@ -205,14 +249,6 @@ begin else Inc(X, C.Width); end; - - Inc(FPosY, FRxDBGrid.DefaultRowHeight); -end; - -procedure TRxDBGridExportPDF.DoExportBody; -procedure DoWriteRow; -begin - // end; begin @@ -290,13 +326,13 @@ begin begin if FPdfOptions.PaperOrientation = ppoPortrait then begin - FPageWidth := PDFPaperSizes[FPdfOptions.FPaperType, 0]; - FPageHeight := PDFPaperSizes[FPdfOptions.FPaperType, 1]; + FPageWidth := PDFPaperSizes[FPdfOptions.FPaperType, 1]; + FPageHeight := PDFPaperSizes[FPdfOptions.FPaperType, 0]; end else begin - FPageWidth := PDFPaperSizes[FPdfOptions.FPaperType, 1]; - FPageHeight := PDFPaperSizes[FPdfOptions.FPaperType, 0]; + FPageWidth := PDFPaperSizes[FPdfOptions.FPaperType, 0]; + FPageHeight := PDFPaperSizes[FPdfOptions.FPaperType, 1]; end; W:=FPageMargin.Left; diff --git a/components/rx/trunk/rxmemds.pas b/components/rx/trunk/rxmemds.pas index 5b5fb1451..bdb229339 100644 --- a/components/rx/trunk/rxmemds.pas +++ b/components/rx/trunk/rxmemds.pas @@ -37,7 +37,7 @@ unit rxmemds; interface -uses SysUtils, Classes, DB, ex_rx_datapacket; +uses SysUtils, Classes, DB, ex_rx_datapacket, bufdataset_parser; { TRxMemoryData } @@ -72,6 +72,7 @@ type FFilterBuffer : pchar; FNullmaskSize : byte; FBRecordCount : integer; + FParser : TBufDatasetParser; function IntAllocRecordBuffer: PChar; procedure IntLoadFielddefsFromFile; procedure IntLoadRecordsFromFile; @@ -94,6 +95,7 @@ type procedure SetCapacity(Value: Integer); procedure ClearRecords; procedure InitBufferPointers(GetProps: Boolean); + procedure ParseFilter(const AFilter: string); protected procedure AssignMemoryRecord(Rec: TMemoryRecord; Buffer: PChar); function GetActiveRecBuf(var RecBuf: PChar): Boolean; virtual; @@ -146,6 +148,7 @@ type procedure SetRecNo(Value: Integer); override; property Records[Index: Integer]: TMemoryRecord read GetMemoryRecord; function GetAnyRecField(SrcRecNo:integer; AField:TField):variant; + procedure SetFilterText(const Value: String); override; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; @@ -483,6 +486,7 @@ end; constructor TRxMemoryData.Create(AOwner: TComponent); begin inherited Create(AOwner); + FParser := nil; FRecordPos := -1; FLastID := Low(Integer); FAutoInc := 1; @@ -496,6 +500,7 @@ begin ClearRecords; FRecords.Free; ReallocMem(FOffsets, 0); + if Assigned(FParser) then FreeAndNil(FParser); end; { Records Management } @@ -638,6 +643,27 @@ begin FRecBufSize := FBlobOfs + BlobFieldCount * SizeOf(TMemBlobData);//Pointer); end; +procedure TRxMemoryData.ParseFilter(const AFilter: string); +begin + // parser created? + if Length(AFilter) > 0 then + begin + if (FParser = nil) and IsCursorOpen then + begin + FParser := TBufDatasetParser.Create(Self); + end; + // is there a parser now? + if FParser <> nil then + begin + // set options + FParser.PartialMatch := not (foNoPartialCompare in FilterOptions); + FParser.CaseInsensitive := foCaseInsensitive in FilterOptions; + // parse expression + FParser.ParseExpression(AFilter); + end; + end; +end; + procedure TRxMemoryData.ClearRecords; begin while FRecords.Count > 0 do TObject(FRecords.Last).Free; @@ -987,6 +1013,7 @@ end; function TRxMemoryData.RecordFilter: Boolean; var SaveState: TDataSetState; + RecBuf: PChar; begin Result := True; if Assigned(OnFilterRecord) then @@ -1000,6 +1027,13 @@ begin except CustomApplication.HandleException(Self); end; + + if Result and (Length(Filter) > 0) then + begin + if GetActiveRecBuf(RecBuf) then + Result := Boolean((FParser.ExtractFromBuffer(RecBuf))^); + end; + RestoreState(SaveState); end else @@ -1342,6 +1376,18 @@ begin end; end; +procedure TRxMemoryData.SetFilterText(const Value: String); +begin + if Value = Filter then + exit; + // parse + ParseFilter(Value); + // call dataset method + inherited; + // refilter dataset if filtered + if IsCursorOpen and Filtered then Resync([]); +end; + function TRxMemoryData.IsSequenced: Boolean; begin Result := not Filtered; diff --git a/components/rx/trunk/rxnew.lpk b/components/rx/trunk/rxnew.lpk index dddf677a7..28088cbd9 100644 --- a/components/rx/trunk/rxnew.lpk +++ b/components/rx/trunk/rxnew.lpk @@ -10,6 +10,7 @@ +