⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ehlibmte.pas

📁 最新的 DBGRIDEH4.0
💻 PAS
📖 第 1 页 / 共 2 页
字号:
    else
      Result := '';
  end;

  function AnsiContainsText(const AText, ASubText: string): Boolean;
  begin
    Result := AnsiPos(AnsiUppercase(ASubText), AnsiUppercase(AText)) > 0;
  end;

  function AnsiContainsStr(const AText, ASubText: string): Boolean;
  begin
    Result := AnsiPos(ASubText, AText) > 0;
  end;

var
  DataText: String;
  i: Integer;
  RecView, RecViewFound: TMemRecViewEh;
begin
  Result := False;
  MemTable := (AGrid.DataSource.DataSet as TCustomMemTableEh);
  MemTable.CheckBrowseMode;
  if MemTable.BOF and MemTable.EOF then Exit;
  TreeList := MemTable.RecordsView.MemoryTreeList;
  RecView := MemTable.TreeNode;
  FCurInListColIndex := AGrid.SelectedIndex;
  if (AGrid.VisibleColCount = 0) then Exit;
  MemTable.InstantReadEnter(0);
  with AGrid do
  begin
    AGrid.DataSource.DataSet.DisableControls;
    //SaveBookmark;
    try
      if (Direction = ltdAllEh) then
      begin
        First;
//        TreeListPos := 0;
//        MemTable.InstantReadLeave;
//        MemTable.InstantReadEnter(TreeList.AccountableItem[TreeListPos], -1);
//          AGrid.DataSource.DataSet.First
      end else
      begin
        TreeListPos := 0;
        for i := 0 to TreeList.AccountableCount-1 do
          if TreeList.AccountableItem[i] = RecView then
          begin
            TreeListPos := i;
            NextNode := RecView;
            Break;
          end;
        ToNextRec;
      end;
      while not CheckEofBof do
      begin
        DataText := ColText(AGrid.Columns[FCurInListColIndex]);
        //CharCase
        if not (ltoCaseInsensitiveEh in AOptions) then
        begin
          //From any part of field
          if ( (Matching = ltmAnyPartEh) and (
              AnsiContainsStr(DataText, Text) )
             ) or (
          //Whole field
            (Matching = ltmWholeEh) and (DataText = Text)
            ) or ((Matching = ltmFromBegingEh) and
          //From beging of field
            (Copy(DataText, 1, Length(Text)) = Text) )
          then
          begin
            Result := True;
//              IsFirstTry := False;
            Break;
          end
        end else
        //From any part of field
        if ( (Matching = ltmAnyPartEh) and (
            AnsiContainsText(DataText, Text) )
           ) or (
        //Whole field
          (Matching = ltmWholeEh) and (
          AnsiUpperCase(DataText) =
          AnsiUpperCase(Text))
          ) or ((Matching = ltmFromBegingEh) and
        //From beging of field
          (AnsiUpperCase(Copy(DataText, 1, Length(Text))) =
          AnsiUpperCase(Text)) ) then
        begin
          Result := True;
          AGrid.SelectedIndex := AGrid.VisibleColumns[FCurInListColIndex].Index;
//            IsFirstTry := False;
          Break;
        end;
        ToNextRec;
      end;
      //if not Result then RestoreBookmark;
    finally
      AGrid.DataSource.DataSet.EnableControls;
      MemTable.InstantReadLeave;
    end;

    if Result then
    begin
//      RecViewFound := TreeList.AccountableItem[TreeListPos];
      RecViewFound := NextNode;
      RecView := RecViewFound;
      while RecView.Rec <> nil do
      begin
        RecView.NodeExpanded := True;
        RecView := RecView.NodeParent;
      end;
      MemTable.GotoRec(RecViewFound.Rec);
    end;

//      if not RecordFounded then
//        ShowMessage(Format(SFindDialogStringNotFoundMessageEh, [cbText.Text]));
  end;
end;
{
function LocateText(AGrid: TCustomDBGridEh;
  const FieldName, Text: String; AOptions: TLocateTextOptionsEh;
  Direction: TLocateTextDirectionEh;
  Matching: TLocateTextMatchingEh): Boolean;
var
  i: Integer;
  TreeList: TMemoryTreeListEh;
  RecView, RecViewFound: TMemRecViewEh;
  MemTable: TCustomMemTableEh;
begin
  Result := False;
  RecViewFound := nil;
  MemTable := (AGrid.DataSource.DataSet as TCustomMemTableEh);
  MemTable.CheckBrowseMode;
  if MemTable.BOF and MemTable.EOF then Exit;
  TreeList := MemTable.RecordsView.MemoryTreeList;
  for i := 0 to TreeList.AccountableCount - 1 do
  begin

//    if (Options <> []) and (Pos(';', KeyFields) = 0) then
//      Result := StringValueEqual(
//                  VarToStr(TreeList.AccountableItem[i].Rec.DataValues[KeyFields,dvvValueEh]),
//                  VarToStr(KeyValues))
//    else
//      Result := VarEquals(TreeList.AccountableItem[i].Rec.DataValues[KeyFields,dvvValueEh], KeyValues);
    if Result then
    begin
      RecViewFound := TreeList.AccountableItem[i];
      Break;
    end;
  end;
  if Result then
  begin
    RecView := RecViewFound;
    while RecView.Rec <> nil do
    begin
      RecView.NodeExpanded := True;
      RecView := RecView.NodeParent;
    end;
    MemTable.GotoRec(RecViewFound.Rec);
  end;
end;
}

{ TMTEDatasetFeaturesEh }

constructor TMTEDatasetFeaturesEh.Create;
begin
  inherited Create;
  SupportsLocalLike := True;
end;

procedure TMTEDatasetFeaturesEh.ApplyFilter(Sender: TObject; DataSet: TDataSet; IsReopen: Boolean);
var
  DataDriver: TDataDriverEh;
  DS: TDataSet;
  DatasetFeatures: TDatasetFeaturesEh;
begin
  if TDBGridEh(Sender).STFilter.Local then
  begin
    inherited ApplyFilter(Sender, DataSet, IsReopen)
  end else if (DataSet is TCustomMemTableEh) then
  begin
    if not (DataSet is TCustomMemTableEh) then Exit;
    DataDriver := TCustomMemTableEh(DataSet).DataDriver;
    if DataDriver = nil then
      raise Exception.Create('MemTableEh.DataDriver is empty');
    DS := TDataDriverEhCrack(DataDriver).ProviderDataSet;
    if DS <> nil then
    begin
      DatasetFeatures := GetDatasetFeaturesForDataSet(DS);
      if DatasetFeatures <> nil then
        DatasetFeatures.ApplyFilter(Sender, DS, False);
      DataSet.Close;
      DataSet.Open;
    end else if (DataDriver is TSQLDataDriverEh) then
    begin
      ApplyFilterForSQLDataDriver(TCustomDBGridEh(Sender),
        TSQLDataDriverEh(DataDriver), DateValueToSQLString);
    end;
  end;
end;

procedure TMTEDatasetFeaturesEh.ApplySorting(Sender: TObject; DataSet: TDataSet; IsReopen: Boolean);
var
  DS: TDataSet;
  MTE: TCustomMemTableEh;
  DatasetFeatures: TDatasetFeaturesEh;
  i: Integer;
  OrderByStr: String;
  DataDriver: TDataDriverEh;
begin
  if Sender is TCustomDBGridEh then
    if TCustomDBGridEh(Sender).SortLocal then
      with TCustomDBGridEh(Sender) do
        begin
          OrderByStr := '';
          for i := 0 to SortMarkedColumns.Count - 1 do
          begin
            OrderByStr := OrderByStr + SortMarkedColumns[i].FieldName + ' ';
            if SortMarkedColumns[i].Title.SortMarker = smUpEh then
              OrderByStr := OrderByStr + ' DESC';
            OrderByStr := OrderByStr + ',';
          end;
          Delete(OrderByStr, Length(OrderByStr), 1);
          if (DataSet is TCustomMemTableEh) then
          begin
            MTE := TCustomMemTableEh(DataSet);
            if SortInView
              then MTE.SortOrder := OrderByStr
              else MTE.SortByFields(OrderByStr);
          end;
        end
    else
    begin
      if not (DataSet is TCustomMemTableEh) then Exit;
      DataDriver := TCustomMemTableEh(DataSet).DataDriver;
      if DataDriver = nil then
        raise Exception.Create('MemTableEh.DataDriver is empty');
      DS := TDataDriverEhCrack(DataDriver).ProviderDataSet;
      if DS <> nil then
      begin
        DatasetFeatures := GetDatasetFeaturesForDataSet(DS);
        if DatasetFeatures <> nil then
          DatasetFeatures.ApplySorting(Sender, DS, False);
        DataSet.Close;
        DataSet.Open;
      end else if (DataDriver is TSQLDataDriverEh) then
      begin
        ApplySortingForSQLDataDriver(TCustomDBGridEh(Sender),
          TSQLDataDriverEh(DataDriver), SortUsingFieldName);
      end;
    end;
end;

function TMTEDatasetFeaturesEh.LocateText(AGrid: TCustomDBGridEh;
  const FieldName, Text: String; AOptions: TLocateTextOptionsEh;
  Direction: TLocateTextDirectionEh; Matching: TLocateTextMatchingEh;
  TreeFindRange: TLocateTextTreeFindRangeEh): Boolean;
var
  mt: TCustomMemTableEh;
begin
  mt := nil;
  Result := False;
  if not ( (AGrid.DataSource <> nil) and (AGrid.DataSource.DataSet <> nil) and
            AGrid.DataSource.DataSet.Active )
  then
    Exit;
  if (AGrid.DataSource.DataSet is TCustomMemTableEh) then
    mt := (AGrid.DataSource.DataSet as TCustomMemTableEh);
  if (mt <> nil) and mt.TreeList.Active and (TreeFindRange <> lttInExpandedNodesEh)  then
  begin
    Result := LocateTextInTree(AGrid, FieldName, Text, AOptions,
      Direction, Matching, TreeFindRange, FBaseNode);
  end else
    Result := inherited LocateText(AGrid, FieldName, Text, AOptions,
      Direction, Matching, TreeFindRange);
end;

procedure TMTEDatasetFeaturesEh.ExecuteFindDialog(Sender: TObject;
  Text, FieldName: String; Modal: Boolean);
var
  mt: TCustomMemTableEh;
  Grid: TCustomDBGridEh;
begin
  if Sender is TCustomDBGridEh then
    Grid := TCustomDBGridEh(Sender)
  else
    Exit;
  if not ( (Grid.DataSource <> nil) and (Grid.DataSource.DataSet <> nil) and
            Grid.DataSource.DataSet.Active )
  then
    Exit;
  FBaseNode := nil;
  if (Grid.DataSource.DataSet is TCustomMemTableEh) then
  begin
    mt := (Grid.DataSource.DataSet as TCustomMemTableEh);
    if mt.TreeList.Active then
      FBaseNode := mt.TreeNode;
  end;
  inherited ExecuteFindDialog(Sender, Text, FieldName, Modal);
end;

initialization
  RegisterDatasetFeaturesEh(TMTEDatasetFeaturesEh, TCustomMemTableEh);
end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -