Установить файл как измененный с помощью OTA

Как мы знаем, Build компилирует все используемые модули, а Compile компилирует только измененные используемые модули. Но когда вы работаете с ifdefs и вам нужно много раз его менять, вы должны многократно создавать проект. Если вам нужно много библиотек, о которых вы знаете, что этот IFDEF не изменит поведение, нет причин для повторного создания этой библиотеки.

То, что я хочу сделать для обнаружения, - это способ сказать IDE, что некоторые файлы были изменены, и вызвать компиляцию, а не сборку.

Как получить юниты и все остальное, что я знаю, но некоторые знают, как установить юнит как модифицированный?

Tks


Не могу найти причину, чтобы решить мою проблему. Я нашел способ установить его как измененный, проблема в том, что он не заставляет IDE создавать его так, как я думал. Кто-нибудь знает, какие проверки делаются для отправки в архив для компиляции?

3 ответа

Решение

Решено проще. Я просто удалил DCU файла, и он снова скомпилируется.: D http://paste.ideaslabs.com/show/KCB9cq2Z8c

Предположим, что вы хотите пометить буферы редактирования как измененные. Это предполагает наличие редактирующего буфера, который в большинстве случаев отсутствует, для большинства элементов в вашем Проекте. Давайте предположим, что у вас ВСЕГДА всегда открыт каждый файл в вашем проекте, тогда, возможно, вы можете настроить эти открытые блоки таким образом.

Я думаю, что на самом деле вам нужно было бы не только пометить измененные буферы редактора, но также СДЕЛАТЬ все файлы на диске, которые необходимо будет восстановить из-за изменения #define.

Чтобы узнать, какие файлы затронуты, вам необходимо прочитать все файлы. Я думаю, что вероятность того, что вы будете делать это надежно, снова и снова и быстрее, чем просто строить, довольно мала.

Но если вы решили пойти на это, вам нужно не только изменить флаги Modified буфера, но и для любого другого файла в текущей группе проектов, или который находится в папке, включенной в поиск или путь к библиотеке, найти любой файл которые могут быть затронуты.

Возможно, вы видите, что это сложнее, чем вы думали.

И, что касается OTA, вот свойство IOTAEditor, Modified, оно доступно только для чтения.

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;

После перечитывания вашего вопроса мне кажется, что вы хотите пометить открытые буферы редактора как все измененные, а затем выполнить компиляцию для скорости. Поэтому вы можете захотеть сделать это: возьмите приведенный выше код, получите IOTAEditorContent с помощью Supports() и настройте каждый из них.

Обновление: короткая и приятная версия: изменение буфера недостаточно. Кроме того, у вас не будет буферов для файлов, которые вам нужно изменить, плюс прикосновение к файлу на диске не будет делать то, что вы хотите. Так что нет, вы не можете делать именно то, что хотели. И даже если бы вы могли как-то изменить способность компилятора выполнять проверки зависимостей и изменений в стиле Make, вы, вероятно, вызовете много проблем внутри IDE.

На IOTAModule70 = interface(IOTAModule50) я найду MarkModified: Описание: { MarkModifed помечает этот модуль как "измененный", фактически не указывая, почему он был изменен (что приведет к тому, что даты внутреннего файла останутся постоянными). Это заставит IDE запросить сохранение этого модуля, когда пользователь попытается закрыть его. Это также очистит "отбрасываемость" нового безымянного модуля, например, когда выбран File|New|Application. }

Другие вопросы по тегам