Hello
You need to have a copy of MemTableEh into which you need to copy only the necessary branches of the tree.
Here is an code and Demo project.
Code:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, DBGridEhGrouping, ToolCtrlsEh,
DBGridEhToolCtrls, DynVarsEh, MemTableDataEh, Data.DB, MemTableEh, EhLibVCL,
GridsEh, DBAxisGridsEh, DBGridEh, Vcl.StdCtrls, Vcl.ExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
PaintBox1: TPaintBox;
bReopen: TButton;
Memo1: TMemo;
bFilterNode: TButton;
DBGridEh1: TDBGridEh;
MemTableEh1: TMemTableEh;
MemTableEh2: TMemTableEh;
DataSource1: TDataSource;
procedure FormCreate(Sender: TObject);
procedure bReopenClick(Sender: TObject);
procedure bFilterNodeClick(Sender: TObject);
procedure DataSource1DataChange(Sender: TObject; Field: TField);
private
{ Private declarations }
public
FilterRecViewMTE1: TMemRecViewEh;
procedure ReloadMemTable2;
function CheckRecordOrParent(RecView: TMemRecViewEh): Boolean;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.ReloadMemTable2;
var
I: Integer;
RecView: TMemRecViewEh;
J: Integer;
begin
MemTableEh1.TreeList.FullExpand;
MemTableEh2.DisableControls;
MemTableEh2.EmptyTable;
for I := 0 to MemTableEh1.RecordsView.Count - 1 do
begin
RecView := MemTableEh1.RecordsView.RecordView[I];
if (CheckRecordOrParent(RecView)) then
begin
MemTableEh2.Append;
for J := 0 to MemTableEh1.Fields.Count - 1 do
MemTableEh2.Fields[J].Value := RecView.Rec.Value[J, dvvValueEh];
MemTableEh2.Post;
end;
end;
MemTableEh2.First;
MemTableEh2.EnableControls;
end;
function TForm1.CheckRecordOrParent(RecView: TMemRecViewEh): Boolean;
var
ParentRecView: TMemRecViewEh;
begin
if (FilterRecViewMTE1 = nil) then
begin
//All Records
Result := True;
Exit;
end;
ParentRecView := RecView;
while ParentRecView <> nil do
begin
if (ParentRecView = FilterRecViewMTE1) then
begin
Result := True;
Exit;
end;
ParentRecView := ParentRecView.NodeParent;
end;
Result := False;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FilterRecViewMTE1 := nil;
ReloadMemTable2;
end;
procedure TForm1.bFilterNodeClick(Sender: TObject);
var
RecId: Variant;
begin
RecId := MemTableEh2.FieldByName('ID').Value;
MemTableEh1.Locate('ID', RecId, []);
FilterRecViewMTE1 := MemTableEh1.RecView;
ReloadMemTable2;
end;
procedure TForm1.bReopenClick(Sender: TObject);
begin
FilterRecViewMTE1 := nil;
ReloadMemTable2;
end;
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
bFilterNode.Caption := 'Show "' + MemTableEh2.FieldByName('NODNAME').AsString + '" Node with Children';
end;
end.