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 @@
+