让我们假设您想要标记编辑器缓冲区已修改。这假设有一个编辑器缓冲区要修改,在大多数情况下,对于您的项目中的大多数项目,都没有。假设您始终打开项目中的每个文件,那么也许您可以通过这种方式调整这些打开的单元。
我的想法是,您实际上不仅需要标记编辑器缓冲区已修改,还需要触摸磁盘上由于#define 更改而需要重建的所有文件。
要知道哪些文件受到影响,您需要阅读所有文件。我认为,你能可靠地、一遍又一遍地做这件事,而且比仅仅做一个 BUILD 更快的可能性很小。
但是,如果您确实决定这样做,您不仅需要修改缓冲区修改标志,而且对于当前项目组中的任何其他文件,或者在搜索或库路径中包含的文件夹中,找到任何文件这可能会受到影响。
您可能会看到这比您最初想象的要复杂。
而且,就 OTA 而言,这是 IOTAEditor 属性,已修改,它是只读的。
OTA 不希望您更改它:
IOTAEditor = interface(IUnknown)
['{F17A7BD0-E07D-11D1-AB0B-00C04FB16FB3}']
...
function GetModified: Boolean;
..
property Modified: Boolean read GetModified;
..
end;
但是您实际上可以修改缓冲区 CONTENT 本身,这将设置标志。
使用IOTAEditorContent,获取内容(IStream),修改(加空格),然后再次修改(去掉空格)。您现在已经设置了脏位(调用 GetModified 只是为了运气)。
我从 JCL JclStackTraceViewerStackCodeUtils.pas 中找到了一些示例代码,向您展示了如何使用 IOTAEditorContent 读取编辑器内容:
function GetFileEditorContent(const AFileName: string): IStream;
var
I: Integer;
Module: IOTAModule;
EditorContent: IOTAEditorContent;
begin
Result := nil;
Module := (BorlandIDEServices as IOTAModuleServices).FindModule(AFileName);
if Assigned(Module) then
begin
for I := 0 to Module.ModuleFileCount - 1 do
if Supports(Module.ModuleFileEditors[I], IOTAEditorContent, EditorContent) then
begin
Result := EditorContent.Content;
Break;
end;
end;
end;
重新阅读您的问题后,在我看来,您只想将打开的编辑器缓冲区标记为全部更改,然后进行编译以提高速度。所以你可能想要这样做:获取上面的代码,使用 Supports() 获取 IOTAEditorContent,然后调整每一个。
更新:简短而甜蜜的版本:修改缓冲区是不够的。另外,对于需要更改的文件,您将没有缓冲区,而且触摸磁盘上的文件并不能满足您的要求。所以不,你不能做你想做的事。即使您可以以某种方式修改编译器进行 Make 风格的依赖和修改检查的能力,您也可能会在 IDE 内部造成很多问题。