IOTAProjectResource не работает (опять же!) В Delphi XE2 (и, вероятно, XE3 тоже)?

Я делал небольшую работу для этого вопроса, в частности, для следующего предложения:

Я даже не смог получить этот интерфейс от IOTAProject.

Под опять я имею в виду хорошо известный дефект, присутствующий в Delphi 2005 и 2006, обозначенный Эриком Берри. Пожалуйста, посетите связанную запись QC для полного теста.

Достаточно слов, вот мой код:

procedure TResDumpWizard.Execute;
var
  Project: IOTAProject;
  Resource: IOTAProjectResource;
  I: Integer;
  Entry: IOTAResourceEntry;
begin
  Project := (BorlandIDEServices as IOTAModuleServices).GetActiveProject;
  Assert(Assigned(Project), 'No active project');

  Resource := nil;
  for I := 0 to Project.ModuleFileCount - 1 do
  begin
    if Supports(Project.ModuleFileEditors[I], IOTAProjectResource, Resource) then
      Break;
  end;
  Assert(Assigned(Resource), 'No resources in project'); // (!!!) always fails 

  for I := 0 to Resource.GetEntryCount - 1 do
  begin
    Entry := Resource.GetEntry(I);
    (BorlandIDEServices as IOTAMessageServices).AddTitleMessage(DisplayName(Entry.GetResourceName));
  end;
end;

Циклы по редакторам файлов модуля проекта никогда не находят никаких ресурсов, даже если у проекта есть дополнительные ресурсы

  • добавлено через диалог ресурсов и изображений
  • с помощью {$RESOURCE binary.res} директива
  • с помощью {$R filename.res filename.rc} синтаксис, который больше не работает

1 ответ

(У меня низкая репутация, поэтому я не могу добавить комментарий)

Project.ModuleFileCount всегда возвращает 1, а Project.ModuleFileEditors[0].FileName возвращает ProjectName.dpr

В XE3, который я тестировал, можно перечислить все модули проекта со следующим кодом:

var i, j: Integer;
    Resource: IOTAProjectResource;
    ModuleInfo: IOTAModuleInfo;
    Module: IOTAModule;
    Editor: IOTAEditor;

  Resource := nil;
  for i := 0 to Project.GetModuleCount - 1 do
    begin
      ModuleInfo := Project.GetModule(i);
      try
        Module := ModuleInfo.OpenModule; // can raise exception
        for j := 0 to Module.ModuleFileCount - 1 do
          begin
            Editor := Module.ModuleFileEditors[j];
            if Supports(Editor, IOTAProjectResource, Resource) then
              Break;
          end;
      except
      end;
      if Assigned(Resource) then Break;
    end;
  if not Assigned(Resource) then
    MessageBox(0, 'Not found!!!', 'Info', 0);

Но в любом случае я всегда не нашел!!! сообщение.

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