我有一个应用程序,它使用条件能够将其编译为 VCL 表单应用程序或 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
希望在那里找到它的一些配置,因为工作项目使用了这种风格,但没有运气。该单词在该文件中的任何位置都不存在。
TStyleManager
正在从可执行文件的“VCLSTYLE”资源部分加载可用样式(除非您将 TStyleManager.AutoDiscoverStyleResources
设置为 false)。该资源是您的场景中缺少的内容。
基本上,可以通过三种方式将样式添加为 exe 中的资源。
通过“项目”->“资源和图像..”菜单。单击对话框中的“添加”按钮添加样式,将其类型设置为“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在他的回答中所说,他通过编辑 .dproj 文件在评论中链接到该问题。在
{$R styles.res}
键下,添加一个 <PropertyGroup Condition="'$(Base)'!=''">
条目(他的示例包括多种样式):
VCL_Custom_Styles
将所选样式文件的“*.vsf”放入.exe目录中。
在 .dpr 添加/更改
<VCL_Custom_Styles>"Amakrits|VCLSTYLE|$(PUBLIC)\Documents\RAD Studio\9.0\Styles\Amakrits.vsf";"Amethyst Kamri|VCLSTYLE|$(PUBLIC)\Documents\RAD Studio\9.0\Styles\AmethystKamri.vsf";"Aqua Graphite|VCLSTYLE|$(PUBLIC)\Documents\RAD Studio\9.0\Styles\AquaGraphite.vsf"</VCL_Custom_Styles>
Copmile/跑步。