You've already forked lazarus-ccr
RxFPC: add filter expression to TRxMemoryData
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@5081 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -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;
|
||||
|
Reference in New Issue
Block a user