2012-02-12 5 views
3

Delphiでいくつかのさまざまなサービスを作成した後、TServiceには、ロギング、例外処理、レジストリの 'Description'プロパティなどのサービスアプリケーションに必要なものが欠けていることがわかりました。TServiceの子孫を作成し、自分のプロパティを公開することは可能ですか?

私はTServiceから継承されたTJDServiceのような私自身のサービスシェルを作ることが可能かどうか疑問に思っていましたが、オブジェクトインスペクタに 'Description'プロパティが表示されます。このように私自身のサービスシェルを作ることはできますか?私はTServiceから継承している自分自身の "デフォルトプロジェクト"を作ることができると知っていますが、それは新しいプロジェクトのすべての私のコードを含んでいます。新しいサービスを作成すると

、それは次のようになります。ただTServiceするのではなく、私のTJDServiceを使用して、一般的なサービスと同じ

unit Unit1; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes, Vcl.SvcMgr, 
    JDServices; 

type 
    TJDService1 = class(TJDService) 
    private 

    public 
    function GetServiceController: TServiceController; override; 
    end; 

var 
    JDService1: TJDService1; 

implementation 

{$R *.DFM} 

procedure ServiceController(CtrlCode: DWord); stdcall; 
begin 
    JDService1.Controller(CtrlCode); 
end; 

function TJDService1.GetServiceController: TServiceController; 
begin 
    Result := ServiceController; 
end; 

end. 

、しかし。

+1

RegisterCustomModule - http://docwiki.embarcadero.com/VCL/en/DesignIntf​​.RegisterCustomModule – OnTheFly

+0

"Embarcadero Technologiesには現在、追加情報はありません。ディスカッションページを使用してこのトピックを文書化してください。P –

+1

Object Inspectorがサービスクラスの公開プロパティを認識できるように、DesigntimeパッケージのRegisterCustomModuleを使用します。必要がない場合は、RegisterCustomModuleを無視するだけで済みます。 –

答えて

6

簡単な質問で簡単な答えです。はい、これを行うことができます。私は私の会社のコードベースで実装されているさまざまなサービス間でコードを共有するために、これを自分自身で実行します。

RegisterCustomModuleは、オブジェクトインスペクタにDescriptionプロパティを表示させる方法です。だが、私はObject Inspectorのこれらのサービスプロパティをすべて価値あるものにすることはできません。コードで実行時にそれらを設定することは完全に容認できると私は思っていますが、その決定は個人的な好みにまで下がります。

RegisterCustomModuleを使用してサービスクラスをIDEに知らせても、デフォルトの新しいサービスアプリケーションはサービスクラスを使用しません。デフォルトのサービスアプリケーションを必要に応じてカスタマイズし、Object Repositoryに保存することができます。

私の回答hereは、デバッグの目的でサービスとして、または標準のデスクトッププロセスとして実行できるアプリを実装する方法を示しています。

+0

私はそれほど単純化アプローチには反対しています。例えば、TServiceには説明のサポートがありません。最初に修正する必要があります。一度修正してから古いBorlandバグを気にすることなく、リポジトリから新しいサービスモジュールを作成することができます。 Re:デバッグの利便性:TServiceは単なるTDataModuleであり、あらゆる問題に対処することができます。 – OnTheFly

+0

@userはい、TServiceから派生した共通基底クラスのポイントです。それはまさに私のコードでやっていることです。サービス記述のサポートを追加することは、私のコードの動機付けでもありました。私はあなたが不当であるものを見るのに苦労しています。 –

+2

私は「うん、私もあまりにも!」と不平を言った。スタイルの答え:pあなたのアドバイスだけがあなたのアドバイスが現存する解決策をそのまま残していることをあなたのコメントが明らかにする。 @kobikはそれについてあなたに同意しています、私はそうではありません。 (その間、タイトルは「自分のプロパティを公開する」) – OnTheFly

3

はい、できますし、実行する方法上のリンクの下には

http://www.marcocantu.com/ddh/ddh15/ddh15e.htm

+0

クール、最初のコメントの意味 – OnTheFly

+0

素晴らしい記事、ありがとうございます –

+2

+1。良い記事。しかし、これは私の好みです。私はいつもIDEに余分なデザインを追加することを避け、実行時にコードを使用します。私はJerryのコードを(私にはうまくいくように)投稿し、実行時にプロパティとメソッドを割り当てます。 – kobik

2

あなた自身SvComは、Delphiでサービスを作成するためのツールの素敵なセットを提供しています仕事をしなければならないしたくない場合は、その利用可能なものよりはるかに多くを提供します。

1

私はここで反抗するつもりですが、これを行う最も簡単な方法はSvcMgrのコピーを作成してそこに変更を加えることです。実行時にアクセスされる変更のみを行う場合は、SvcMgrのローカルコピーを使用してビルドして実行してください。私は、サービスに付属する基本的な例外処理とアプリケーションログを変更するためにこれを行い、私のWebサイトからSvcMgr.pasのコピーをダウンロードすることができます。

これは設計時の変更が必要な場合は機能しませんが、設計時に実行時に実行するほとんどすべてを実行時に実行できます。より良い解決策がありますが、より速く簡単な解決策はありません。

+1

これは、デルファイのアップグレードを行い、コードを更新して改造しなければならないときには痛いものになります。場合によってはこのアプローチを使用することを余儀なくされることもありますが、他の解決策が実行可能でない場合は、必ず最後の手段にすべきでしょうか? –

+0

本当に - 私はこのアプローチをDelphi 7以降使用しており、その後の変更をマージするのに約15分を要しています。リスク管理の決定です - ユニットがあまり変更されそうにない場合、これは最小労力のアプローチです。私たちのほとんどは、完璧なことをする時間がないので、スペックを完了するのに必要な時間以上に費やすのが私の質問です。 – Misha

関連する問題