You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取Delphi IDE中打开的文件列表(对应Ctrl+B缓冲区列表)

如何获取Delphi IDE中所有打开的文件缓冲区列表(对应Ctrl+B显示的列表)

我正在开发Delphi扩展,需要获取IDE中所有打开的文件列表,也就是按下Ctrl+B时弹出的缓冲区列表。尝试了两种方法,但它们仅能列出项目包含的文件,无法获取独立打开的非项目文件:

方法一:通过IOTAModuleServices遍历模块

class function IOTAUTils.GetOpenedEditorFiles : TArray<string>;
var
  module : IOTAModule;
  editor : IOTAEditor;
  service : IOTAModuleServices;
begin
  Result := [];
  service := (BorlandIDEServices as IOTAModuleServices);
  if Assigned(service) then begin
    for var i := 0 to service.ModuleCount - 1 do begin
      module := service.Modules[i];
      for var j := 0 to module.GetModuleFileCount - 1 do begin
        editor := module.GetModuleFileEditor(j);
        Result := Result + [editor.FileName];
      end;
    end;
  end;
end;

方法二:通过IOTAEditorServices过滤可见视图

class function IOTAUTils.GetOpenedEditBuffers: TArray<string>;
var
  service : IOTAEditorServices;
  it : IOTAEditBufferIterator;
  buffer : IOTAEditBuffer;
begin
  Result := [];
  service := (BorlandIDEServices as IOTAEditorServices);
  if Assigned(service) then begin
    if (service.GetEditBufferIterator(it)) then begin
      for var i := 0 to it.Count - 1 do begin
        buffer := it.EditBuffers[i];
        if buffer.EditViewCount > 0 then begin // if view count = 0, it is not shown between tabs
          Result := Result + [buffer.FileName];
        end;
      end;
    end;
  end;
end;

正确实现方式

问题出在两个核心点:

  1. IOTAModuleServices仅管理与项目/项目组关联的模块,无法识别独立打开的非项目文件;
  2. 方法二中的EditViewCount > 0过滤会排除掉当前无激活视图但仍驻留在IDE缓冲区的文件——这部分文件同样会出现在Ctrl+B的缓冲区列表中。

正确的做法是直接通过IOTAEditorServices.GetEditBufferIterator遍历所有编辑缓冲区,无需额外过滤:

class function IOTAUTils.GetAllOpenBuffers: TArray<string>;
var
  EditorServices: IOTAEditorServices;
  BufferIterator: IOTAEditBufferIterator;
  Buffer: IOTAEditBuffer;
  I: Integer;
begin
  Result := [];
  EditorServices := BorlandIDEServices as IOTAEditorServices;
  if Assigned(EditorServices) then
  begin
    if EditorServices.GetEditBufferIterator(BufferIterator) then
    begin
      SetLength(Result, BufferIterator.Count);
      for I := 0 to BufferIterator.Count - 1 do
      begin
        Buffer := BufferIterator.EditBuffers[I];
        Result[I] := Buffer.FileName;
      end;
    end;
  end;
end;

这段代码会返回与Ctrl+B完全一致的缓冲区列表,包含所有项目内文件和独立打开的非项目文件。

内容的提问来源于stack exchange,提问作者Mattia72

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 07:47:19