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);
Но в любом случае я всегда не нашел!!! сообщение.