2014-03-05 2 views
1

[DCC32 오류] MSSQLQuery.pas (29) : 나는 몇 가지 조사를 수행하고이 문제가 기능을 최우선시 발생되는 것을 발견했다컴파일 오류

이전의 선언에서 '의해 DataEvent'다릅니다의 E2037 선언 슈퍼 클래스와 서브 클래스의 선언이 다른 경우,

의해 DataEvent는 라이브러리 함수이며, 필자는 라이브러리를 확인하고 코드의 선언이 정확하지만 임은 확실하지 않은이 컴파일 오류가

I를 발생하는 이유를 발견 단 하나의 D가 있음을 확인했다. 델파이의 새로운이 클래스

나는에 ataEvent 기능은 그래서 프로 시저 정의

Procedure TMSSQLQuery.DataEvent(Event: TDataEvent; Info: Longint); 
Begin 
    { Call inherited method } 
    Inherited DataEvent (Event, Info); 
    If Event in [deConnectChange, dePropertyChange] 
    Then RefreshParams; 
End; 
에게 이것은 내가
TMSSQLQuery = Class (TADOQuery) 
    Private 
     FAutoNoLock : Boolean; 
    Protected 
     procedure DataEvent(Event: TDataEvent; Info: Longint); override; 
    Public 
     Constructor Create (AOwner : TComponent);Override; 
     Destructor Destroy;Override; 
    End; 

를 정의하는 클래스입니다이 오류

를 해결 날입니다 도와주세요

+0

1) MSSQLQuery.pas 또는 관련 파일이 변경되지 않았습니까? 2) 다른 MSSQLQuery가 없다고 확신합니까? 3) 델파이 IDE를 닫고 다시 시작하려고 했습니까? (종종 불안정해진다). 4) DataEvent 선언과 그 조상의 코드를 게시 할 수 있습니까? –

+1

컴파일러 오류의 원인이되는 실제 코드 행 (29 행)을 포함 시키려면 [편집]하십시오. –

+0

질문에 코드를 추가했습니다. – tej

답변

2

참고 : 최근 편집 후에 문제가 확실합니다.

당신은 LongInt의 두 번째 매개 변수와 함께 의해 DataEvent 핸들러 선언했습니다

procedure DataEvent(Event: TDataEvent; Info: NativeInt); override; 

NativeIntLongInt하지 있습니다

procedure DataEvent(Event: TDataEvent; Info: Longint); override; 

VCL은 NativeInt으로 정의합니다 (documentation 참조) 해당 선언에서와 동일하므로 하위 클래스 정의가 사용자가 대체하려고 시도한 조상의 정의와 일치하지 않습니다. (내 대답의 다음 섹션을 참조하십시오).

구현 섹션에 인터페이스 선언과 다른 선언이있는 경우이 오류가 발생합니다.

type 
    TSomeClass=class(TSomething) 
    procedure DoThisThing(const AParameter: TSomeParamType); 
    end; 

implementation 

// Note difference in parameter name 
procedure TSomeClass.DoThisThing(AParam: TSomeParamType); 
begin 

end; 

// This would cause the same error - note the missing 'const' 
procedure TSomeClass.DoThisThing(AParameter: TSomeParamType); 
begin 

end; 

// This can cause the same error - note different param type 
procedure TSomeClass.DoThisThing(AParameter: TDiffParamType); 

문제에 대한 가장 쉬운 해결책은 당신을 위해 구현 정의를 작성하는 클래스 완성을 사용하는 것입니다. interface에 선언을 입력 한 다음 (해당 클래스 정의에있는 상태에서) Ctrl + Shift + 을 사용하십시오. 구현 섹션에서 적절한 메소드 스텁을 생성합니다.

는 (당신은 동시에 여러 생성 할 수있다. 단지 키 조합을 사용하기 전에 모든 선언 Ctrl 키를 사용하여 + 시프트 + UPARROW (또는 Down 키)는 사이에 앞뒤로 이동하는 데 도움이 구현 및 인터페이스 섹션을 참조하십시오.) 가상 메서드를 재정의하려고 할 때이 오류 메시지가 발생하지만 재정의 메서드에는 다른 매개 변수 목록, 호출 규칙 등이 있습니다 (아래 참조)는 설명서 (아래 참조)에서 나타냅니다.이 코드는 링크 된 문서에서입니다 :

type 
    MyClass = class 
    procedure Proc(Inx: Integer); 
    function Func: Integer; 
    procedure Load(const Name: string); 
    procedure Perform(Flag: Boolean); 
    constructor Create; 
    destructor Destroy(Msg: string); override;  (*<-- Error message here*) 
    class function NewInstance: MyClass; override; (*<-- Error message here*) 
    end; 

이 더 많은 정보 E2037의 델파이 설명서를 참조하십시오.