【问题标题】:Set file as modified using OTA使用 OTA 将文件设置为已修改
【发布时间】:2011-03-31 18:32:03
【问题描述】:

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

我想做的发现是向 IDE 告知某些文件已更改并调用 Compile 而不是 Build。

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

Tks


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

【问题讨论】:

  • 您是否尝试更改(“触摸”)磁盘上的文件日期时间?
  • 是的,我愿意。如果我最小化 IDE 并在最大化 IDE 后询问文件是否被修改并询问我是否要重新打开它,会发生什么。如果我说我想要,在接下来的编译中这些单元将被重新编译。但是如果我不这样做,它就不起作用:/任何想法让我知道,我在这里测试并发布结果。 Tks
  • 嗯?我不明白你在这里问什么。您的更新意味着您开始意识到我所说的:“您可能会看到这比您最初想象的要复杂。”也许你想做的事情并不完全可能。

标签: delphi ota


【解决方案1】:

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

【讨论】:

  • 我认为更好的解决方案。如果 DCu 不存在,则时间戳不再重要。您还可以将 DCU 文件回溯到去年。 :-)
【解决方案2】:

让我们假设您想要标记编辑器缓冲区已修改。这假设有一个编辑器缓冲区要修改,在大多数情况下,对于您的项目中的大多数项目,都没有。假设您始终打开项目中的每个文件,那么也许您可以通过这种方式调整这些打开的单元。

我的想法是,您实际上不仅需要标记编辑器缓冲区已修改,还需要触摸磁盘上由于#define 更改而需要重建的所有文件。

要知道哪些文件受到影响,您需要阅读所有文件。我认为,你能可靠地、一遍又一遍地做这件事,而且比仅仅做一个 BUILD 更快的可能性很小。

但是,如果您确实决定这样做,您不仅需要修改缓冲区修改标志,还需要修改当前项目组中的任何其他文件,或者在搜索或库路径中包含的文件夹中,查找任何可能受到影响的文件。

您可能会发现这比您最初想象的要复杂。

而且,就 OTA 而言,这是 IOTAEditor 属性,已修改,它是只读的。

OTA 不希望您更改它:

IOTAEditor = interface(IUnknown)
    ['{F17A7BD0-E07D-11D1-AB0B-00C04FB16FB3}']
    ...
    function GetModified: Boolean;
    ..
    property Modified: Boolean read GetModified;
    ..
  end;

但是您实际上可以修改缓冲区内容本身,这将设置标志。

使用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 内部造成很多问题。

【讨论】:

  • Tks,我明天测试并发布结果。
  • Warren P,关于您的回答“OTA 不希望您更改它:”,我找到了替代方案。在接口 IOTAModule70 上,我可以将存档设置为已修改而不会出现问题,并且我不需要为此获取任何缓冲区。这是我习惯使用的代码paste.ideaslabs.com/show/4zoAGrEx3h,如果您想查看所有代码,请告诉我我将其发布在这里。好的,但是,将其设置为已修改并不足以做我想做的事。
  • 然后我发现了其他问题,您可以查看我的答案,解决我的特定问题的解决方案是拦截编译并删除我需要重新编译的 Dcu,在我的情况下它解决了我的问题问题,因为我有大约 13 个单元必须几乎一直重新编译,而 702 则不能,所以现在速度要快得多。但我会寻找其他替代方案来实现我的愿望。
【解决方案3】:

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

【讨论】:

  • -1,请仔细阅读@Warren answer。这只有在有编辑器缓冲区标记为已修改时才有效。
  • 在我的情况下,我想更改我的文件,这些 ifdef 是细节。
  • 其他,无法更改上面的评论。你测试过吗?那个确认是无效的,我可以在没有我ide打开的单元的情况下设置修改。检查代码并进行测试。 paste.ideaslabs.com/show/4zoAGrEx3h
  • 其他东西,检查它是否被修改删除第 15 行并在 IDE 上打开一个文件。
  • 对不起,我忘了添加 GetCurrentProject 函数。 paste.ideaslabs.com/show/ThoHcufVnv
猜你喜欢
  • 2014-04-25
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
相关资源
最近更新 更多