2011-01-25 8 views
2

私のアプリケーションでは、TThread型の基本スレッドオブジェクト(FrameObject)から継承する2つのスレッドオブジェクト(OuterとSash)があります。これはD7ですべて正常に動作します。アプリケーションを拡張する必要があり、私はこの機会をD2010に移しています。しかし、Delphiをコンパイルしようとすると、FrameObject Createメソッドの宣言が前の宣言と異なるという不満があります。TThreadの継承問題D2010でD7と同じように動作していないようです

クラスの種類とコンストラクタを以下に示します。

TFrameObject = class(TThread) 

constructor TFrameObject.Create(BuildType: TBuildType; OnBatchStep: TBatchNotify; OnThreadComplete: TNotifyTermination); 
begin 
    inherited Create(True); 
    ... 
end; 


TOuter = class (TFrameObject) 

constructor Create(BuildType: TBuildType; OnBatchStep: TBatchNotify; OnThreadComplete: TNotifyTermination; ExceptionHandler: TExceptionHandler); 
begin 
    inherited create(BuildType, OnBatchStep, OnThreadComplete); 
    fExceptionHandler := ExceptionHandler; 
    ... 
end; 

TSash = class (TFrameObject) 
constructor Create(BuildType: TBuildType; OnBatchStep: TBatchNotify; OnThreadComplete: TNotifyTermination; ExceptionHandler: TExceptionHandler); 
begin 
    inherited create(BuildType, OnBatchStep, OnThreadComplete); 
    fExceptionHandler := ExceptionHandler; 
    ... 
end; 

D2010コードはD7のソースファイルを直接コピーであると私が言うように、これはすべてがD7で正常に動作します(おそらく、それはいけない!) - だからここで私が間違っているんですか?そのうちの一つは、(インターフェース部に)あなたのTFrameObject宣言例TBuildTypeのためので、実装セクション内のインターフェイスおよび他で使用されている複数のユニットで宣言されたタイプのため

答えて

3

チェックはUnitB.TBuildTypeUnitA.TBuildTypeと実装に解決されます。ここで何が起こっているのかとの

+0

また、ライブラリパスの順であることを確認してください両方のバージョンで同じ - これは、問題のあるユニットを見つけるのに役立ちます。この問題のブルートフォースチェックは、デモアプリケーションのクラスの名前を変更することです。 'TFrameObjectTest'に問題が発生した場合は、あなたが見ているユニットですべてが起きていることがわかります。 –

1

私の推測では、あなたの実装セクションでuses句がTBuildTypeTBatchNotifyか、コンストラクタを宣言し、あなたのインタフェース部で使用したものと異なるTNotifyTerminationを宣言していることです。

すぐに確認するには、TFrameObject.Createの実装でこれらのタイプを完全修飾することです。

+0

この問題は、TFrameObject(?)のCreateメソッドにあるようです。これは、OuterオブジェクトとSashオブジェクトのBaseクラスで、何が起こっているのかわかりません。基礎となるTThreadのcreateメソッドと同じです! – Paul

+0

@paulは私が提案したものを行い、コンストラクタのパラメータの型を完全に修飾します。あなたがコメントするときに@davidを使ってコメントを通知します。 –

1

他の答えとして、実装セクションで使用されるユニットの新しく導入されたタイプが、インターフェイスセクションで使用または宣言された同じ名前のタイプを隠す可能性が最も高いです。

しかし、前回の回答とは異なり、問題がD2010で発生以来とD2010はIStreams ToolsAPI \で宣言されたこの名前のタイプが含まれているためではないD7が、私は、タイプTExceptionHandlerexceptionHandlerのパラメータを疑うだろう

あなたは、実装セクションで名前を修飾することができます:

TFrameObject.Create(... ExceptionHandler: MyUnit.TExpectionHandler) 

「MyUnitは」使用したい「本当の」TExceptionHandlerを含む単位の名前です。

それとも、あなたはインターフェイス部で型を別名、一貫インタフェースと、このユニットの実装の両方でエイリアスタイプを使用するようにパラメータリストを変更することができます:

interface 

    type 
    TFrameExceptionHandler = TExceptionHandler; 

    TFrameObject = class... 
     ... 
     constructor Create(... ExceptionHandler: TFrameExceptionHandler); 
    end; 


    implementation 

    constructor TFrameObject.Create(... ExceptionHandler: TFrameExceptionHandler); 
+0

しばらくの間、私はこれが解決策になると思ったが、残念ながらそうではなかった!(私はTExceptionHandlerの名前を変更しましたが)。 – Paul