我有一个应用程序,它使用条件来编译它作为VCL Forms应用程序或Delphi XE2中的Windows服务应用程序。但是,由于我手动更改了项目的主源文件,因此IDE将不再允许我使用标准的“项目选项”窗口进行某些修改。具体来说,我无法选择VCL样式来包含或实现。
因此,我必须手动实现VCL样式。所以,我将两个必要的单元Vcl.Themes
和Vcl.Styles
添加到我的项目的初始化单元(在这种情况下与项目的主单元不同),并且基本上将工作应用程序中的代码复制到这个新的应用程序。
这是该项目的主要单位:
program MyServiceApplication;
uses
uMyService in 'uMyService.pas' {MyService: TService},
uMyServiceMain in 'uMyServiceMain.pas',
uMyServiceInit in 'uMyServiceInit.pas',
uMyServiceTest in 'uMyServiceTest.pas' {frmMyServiceTest};
{$R *.RES}
begin
RunMyService;
end.
然后在项目的初始化单元中:
unit uMyServiceInit;
interface
uses
{$IFDEF TESTAPP}
Vcl.Forms,
Vcl.Themes,
Vcl.Styles,
uMyServiceTest,
{$ELSE}
Vcl.SvcMgr,
uMyService,
{$ENDIF TESTAPP}
uMyServiceMain
;
procedure RunMyService;
implementation
procedure RunMyService;
begin
{$IFDEF TESTAPP}
Application.Initialize;
Application.MainFormOnTaskbar := True;
TStyleManager.TrySetStyle('Carbon'); //<--- WILL NOT RUN - STYLE DOES NOT EXIST
Application.Title := 'My Windows Service Application';
Application.CreateForm(TfrmMyServiceTest, frmMyServiceTest);
{$ELSE}
if not Application.DelayInitialize or Application.Installing then
Application.Initialize;
Application.CreateForm(TMyService, MyService);
{$ENDIF TESTAPP}
Application.Run;
end;
end.
问题是,当应用程序运行时,我收到错误Style 'Carbon' could not be found.
只是因为此样式尚未包含并编译到应用程序中。
如何手动将此样式编译到此应用程序中,以便VCL样式可以实现它?
PS:初始化在一个单独的单元中的原因是因为如果条件在应用程序的主单元内实现,IDE将销毁代码。
修改
我尝试了一件事:我打开了一个工作项目的.dproj
文件并搜索了这个样式carbon
,希望在那里找到一些配置,因为工作项目使用了这种风格,但没有运气。该文件中的任何地方都不存在该词。
答案 0 :(得分:12)
TStyleManager
正在从可执行文件的“VCLSTYLE”资源部分加载可用样式(除非您将TStyleManager.AutoDiscoverStyleResources
设置为false)。资源是您的方案中缺少的资源。
基本上,有三种方法可以将您的样式添加为exe中的资源。
通过'项目' - &gt; '资源和图片..'菜单。单击对话框中的“添加”按钮添加样式,将其类型设置为“VCLSTYLE”,将标识符设置为“CARBON”。
作为问题评论中提到的Ken,通过.rc文件。这是一个文本文件,每个样式(和/或其他资源)可以包含一行。像
CARBON VCLSTYLE "C:\..\RAD Studio\9.0\Redist\Styles\Vcl\Carbon.vsf"
(如果可行,您可以使用相对路径)。让我们将文件命名为'styles.rc',通过项目管理器将文件添加到项目中(或使用bin文件夹中的brcc32.exe将其编译为.res文件),然后将"C:\..\RAD Studio\9.0\Redist\Styles\Vcl\Carbon.vsf"
行添加到您的单元。
正如RRUZ在his answer中告诉他通过编辑.dproj文件将评论链接到该问题。在{$R styles.res}
项下,添加<PropertyGroup Condition="'$(Base)'!=''">
条目(他的示例包含多个样式):
VCL_Custom_Styles