如何获取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;
正确实现方式
问题出在两个核心点:
- IOTAModuleServices仅管理与项目/项目组关联的模块,无法识别独立打开的非项目文件;
- 方法二中的
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
相关产品推荐
相关产品推荐

