2012-09-24 30 views
4

我有一个应用程序使用条件,以便能够将其编译为VCL Forms应用程序或Delphi XE2中的Windows Service Application。但是,由于我手动更改了项目的主源文件,IDE将不再允许我使用标准的“项目选项”窗口进行某些修改。具体而言,我无法选择包含或实施VCL样式。如何在我的应用程序中手动添加VCL样式?

因此,我必须手动实现VCL样式。因此,我将两个必要的单元Vcl.ThemesVcl.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希望能找到一些配置为它在那里,因为工作项目中使用这种风格,但没有运气。该文件中的任何位置都不存在该单词。

+3

从快速检查,以'资源Editor',看来该样式添加到资源作为'VCLSTYLE'资源类型。这似乎意味着您可以创建一个带有样式文件列表的标准'.rc'文件($(BDS)\ Redist \ Styles \ Vcl'文件夹中的'.vsf'文件)。不过,我还没有机会测试它。您也可以在代码中将样式与样式管理器一起注册。 –

+2

或者,您可以使用project-> resources&images添加ID = CARBON,type = VCLSTYLE的carbon.vsf。 –

+0

Eureka,谢谢@Sertac,这是我认为最好的解决方案。 –

回答

11

TStyleManager正在从可执行文件的“VCLSTYLE”资源部分加载可用样式(除非您将TStyleManager.AutoDiscoverStyleResources设置为false)。该资源是您的方案中缺少的。 基本上,有三种方法可以将您的样式添加为exe中的资源。

  • 通过'Project' - >'Resources and Images ..'菜单。添加样式,在对话框中点击“添加”按钮,将其类型设置为“VCLSTYLE”,标识符设置为“CARBON”。

  • 由于Ken在问题的评论中提到,通过.rc文件。这是一个文本文件,可以为每个样式(和/或其他资源)包含一行。像

    CARBON VCLSTYLE "C:\..\RAD Studio\9.0\Redist\Styles\Vcl\Carbon.vsf"
    (you can use relative paths if it is feasible). Let's name the file 'styles.rc', add the file to the project through project manager (or use brcc32.exe in the bin folder to compile it to a .res file) and then add a {$R styles.res}行到您的单位。

  • 由于RRUZhis answer中告诉他,他通过编辑.dproj文件在注释中链接了该问题。根据<PropertyGroup Condition="'$(Base)'!=''">键,添加一个条目VCL_Custom_Styles(他的例子包括几种风格):

    <VCL_Custom_Styles>&quot;Amakrits|VCLSTYLE|$(PUBLIC)\Documents\RAD Studio\9.0\Styles\Amakrits.vsf&quot;;&quot;Amethyst Kamri|VCLSTYLE|$(PUBLIC)\Documents\RAD Studio\9.0\Styles\AmethystKamri.vsf&quot;;&quot;Aqua Graphite|VCLSTYLE|$(PUBLIC)\Documents\RAD Studio\9.0\Styles\AquaGraphite.vsf&quot;</VCL_Custom_Styles>

+0

+1。好的回答,塞尔塔克。 (你甚至还从杰里那里得到了一个“谢谢”,不仅如此,我还得到了;-) –

+0

我更喜欢它,因为它可以更容易地添加/删除类似样式的东西(如果你可以'不要使用'Project-> Options')。打开文本'.rc'文件并注释掉或添加一行,保存然后构建项目以使更改生效非常容易。它比使用资源对话框更快。 :-) –

+0

我写了大量的'.rc'文件,但我从来没有意识到有一个快速的菜单项来添加资源。 –

相关问题