正如我们所知,Build编译所有使用过的单位,编译编译只改变使用过的单位。但是当你使用ifdef并且需要多次更改它时,你必须多次构建项目。 如果你有很多库,你知道这个IFDEF不会改变行为,那么没有理由再次构建这个库。
我想要发现的是一种向IDE说某些文件已被更改并调用Compile而不是Build的方法。
如何获得我所知道的单位和其他所有单位,但是有些人知道如何将单位设置为修改过的?
韩国社交协会
无法找到解决问题的原因。我找到了一种方法来将其设置为已修改,问题在于它不会强制IDE按照我的想法构建它。 有人知道对存档进行哪些检查会被编译?
答案 0 :(得分:0)
让我们假设你想要的是标记修改的编辑器缓冲区。假设有一个编辑器缓冲区需要修改,在大多数情况下,对于项目中的大多数项目都没有。假设您总是让项目中的每个文件都打开,那么也许您可以通过这种方式调整这些开放单元。
我的想法是,您实际上不仅需要标记已修改的编辑器缓冲区,还需要触摸因#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-style依赖和修改检查的能力,你也可能在IDE中引起很多问题。
答案 1 :(得分:0)
以更简单的方式解决。我刚刚删除了文件的DCU,好了,它会再次编译。 :d http://paste.ideaslabs.com/show/KCB9cq2Z8c
答案 2 :(得分:-1)
在IOTAModule70 = interface(IOTAModule50)上我会找到MarkModified: 描述: {MarkModifed将此模块标记为“已修改”而未实际指示 为什么被修改(这将导致内部文件日期保持不变)。 当用户尝试时,此将强制IDE要求保存此模块 关闭它。它还将清除一个新的未命名的“可丢弃性” 模块,例如选择File | New | Application时。 }