madorin / fibplus

FibPlus Library for Delphi and C++Builder. Data access components for Firebird & Interbase.
168 stars 58 forks source link

Bookmark #79

Open Shaman2 opened 8 months ago

Shaman2 commented 8 months ago

Нижеследующий код приводит к сбоям если использую компонент дерева с большой вложенностью.

 var ABookmark: TBookMark;
  FDBTreeView.FDataLink.DataSet.DisableControls;
  try
    ABookmark := FDBTreeView.FDataLink.DataSet.GetBookmark;
    try
      ANode.HasChildren := FDBTreeView.LockedLocate(FDBTreeView.FParentFieldName, Result.FKeyFieldValue, []);
      FDBTreeView.FDataLink.DataSet.GotoBookmark(ABookmark);
    finally
      FDBTreeView.FDataLink.DataSet.FreeBookmark(ABookmark);
    end;
  finally
    FDBTreeView.FDataLink.DataSet.EnableControls;
  end;

Проблема именно в работе с букмарками, так как переписав код вот так все работает на ура

  var ID: Integer;
  FDBTreeView.FDataLink.DataSet.DisableControls;
  try
    ID := FDBTreeView.FDataLink.DataSet.Fields[0].AsInteger;
    try
      ANode.HasChildren := FDBTreeView.LockedLocate(FDBTreeView.FParentFieldName, Result.FKeyFieldValue, []);
      FDBTreeView.FDataLink.DataSet.Locate(FDBTreeView.FDataLink.DataSet.Fields[0].FieldName,ID,[]);
    finally
    end;
  finally
    FDBTreeView.FDataLink.DataSet.EnableControls;
  end;
Shaman2 commented 8 months ago

Ну и на всякий случай:

function LockedLocate(const AFieldName: string; AValue: Variant; AOptions: TLocateOptions): Boolean; begin BeginUpdate; try Result := FDataLink.DataSet.Locate(AFieldName, AValue, AOptions) finally EndUpdate; end; end;

madorin commented 7 months ago

@Shaman2 что за сбои получаете? какой call stack?

Shaman2 commented 7 months ago

@Shaman2 что за сбои получаете? какой call stack?

В данном случае идет обход дерева, просто при этой процедуре при большой вложенности получаю не те данные и идет позиционирование дерева на другой ветке дерева