сторожевой узел в OMNET ++ для имитации модели MANET

Компонент, который использует ресурс, который реализован в модуле с именем MyUnit1.pas, должен включать следующую строку внутри:

{$R MyUnitRc.res MyUnitRc.rc}

Обратите внимание, что приведенный выше синтаксис не будет работать на некоторых старых версиях delphi (Delphi 7). Вышеизложенное работает в 2010, XE, XE2 и т. Д., И он компилирует .rc в .res, когда проект создает этот блок. В качестве альтернативы вы добавили бы объявление {$R} в каждое статически связанное приложение, а также в файл .dpr вашего BPL.

Этот файл .RC mYUnitRc.res будет содержать одну или несколько строк, объявляющих ваши ресурсы. Я использую объявления RCDATA для загрузки PNG, например:

MYIMAGENAME RCDATA "MyFile.png"

Если вы сделаете это так, вместо использования файла RC, добавленного только в .dproj / .dpr, тогда он будет работать в двух важные случаи:

  1. Когда BPL загружается во время разработки.
  2. Когда компонент загружается во время выполнения из приложения, которое скомпилировано с отключенными пакетами времени выполнения.

Чтобы справиться с третьим случаем, с которым отвечает другой (Реми и Дэвид), вам нужно вызвать FindClassHinstance, как заявил Реми. Однако я считаю, что вы также должны посмотреть, как вы включаете файл ресурсов и скомпилировать его и связать как внутри вашего пакета, так и внутри приложений, которые используют этот компонент.

Вот пример кода, показывающий загрузку ресурс во время выполнения в TPngImage, который я использую в своих собственных компонентах:

procedure TSampleControl.LoadImageFromResource( button:TSubControl);
var
    png:TPngImage;
begin
  if button.DefaultResourceId='' then exit;
      png := TPngImage.Create;
      try
        try
        png.LoadFromResourceName(HInstance,button.DefaultResourceId);
          button.Glyph.Assign(png);
        except
          on E:Exception do begin
               OutputDebugString( PChar(button.DefaultResourceId+' load error:'+E.Message) );

          end;

        end;
      finally
        png.Free;
      end;

end;

Обратите внимание, что я улавливаю исключения загрузки ресурсов, которые оставляют некоторые элементы в моем управлении без их глифов, но по крайней мере не разбивают Delphi , HInstance, возможно, потребуется изменить, поскольку Дэвид и Реми Пойнт используют LoadFromResourceName для обработки случая, когда вам нужно загрузить с .BPL, но я не думаю, что вы можете предположить, что человек, который использует ваши компоненты, всегда перераспределяем ваш файл BPL, и, следовательно, FindClassHinstance предпочтительнее GetModuleHandle ..

Обновление: я должен был использовать то, что предложил Реми:

       png.LoadFromResourceName( FindClassHInstance(TSampleControl),
                 button.DefaultResourceId);
0
задан siddardha kaja 27 February 2019 в 20:48
поделиться

0 ответов

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

Похожие вопросы: