使用OTA将文件设置为已修改

时间:2011-03-31 18:32:04

标签: delphi ota

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

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

如何获得我所知道的单位和其他所有单位,但是有些人知道如何将单位设置为修改过的?

韩国社交协会


无法找到解决问题的原因。我找到了一种方法来将其设置为已修改,问题在于它不会强制IDE按照我的想法构建它。 有人知道对存档进行哪些检查会被编译?

3 个答案:

答案 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时。 }