1

正如我们所知,Build 编译所有使用的单位,而 Compile 只编译更改的使用单位。但是当您使用 ifdefs 并且需要多次更改它时,您必须多次构建项目。如果你有很多你知道这个 IFDEF 不会改变行为的库,那么没有理由再次构建这个库。

我想做的发现是一种向 IDE 说明某些文件已更改并调用 Compile 而不是 Build 的方法。

如何获取单位以及我知道的所有其他内容,但有些人知道如何将单位设置为已修改?

Tks


找不到解决我问题的原因。我找到了一种将其设置为已修改的方法,问题是它不会像我想的那样强制 IDE 构建它。有人知道对发送到编译的档案进行了哪些检查?

4

3 回答 3

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 风格的依赖和修改检查的能力,您也可能会在 IDE 内部造成很多问题。

于 2011-03-31T19:49:54.377 回答
0

以更简单的方式解决。我刚刚删除了文件的DCU,好的,它会再次编译它。:D http://paste.ideaslabs.com/show/KCB9cq2Z8c

于 2011-04-06T18:44:18.733 回答
-1

在 IOTAModule70 = interface(IOTAModule50) 上,我会找到 MarkModified: 描述:{ MarkModifed 会将此模块标记为“已修改”,但实际上并未说明 为什么要对其进行修改(这将导致内部文件日期保持不变)。这强制 IDE 在用户尝试关闭它时要求保存此模块。它还将清除新的未命名模块的“可丢弃性”,例如选择 File|New|Application 时。}

于 2011-04-04T16:29:15.437 回答