2009-08-10 2 views
4

Delphi7의 백그라운드 컴파일러에 문제가 있습니다. 내 프로젝트에 배경 컴파일러가 오류 메시지와 함께 중단되어 CodeCompletion을 사용할 수 없게하는 코드가 하나 있습니다. 일반 컴파일러와 구문 검사는이 코드에 아무런 문제가 없으며 결과 응용 프로그램은 정확합니다.백그라운드 (kibitz) 컴파일러에서 소스 코드 건너 뛰기

제 질문은 백그라운드 컴파일이 수행 될 때이 코드 라인을 건너 뛸 수있는 방법이 있는지입니다 (예 : 컴파일러 지시문). 이 코드는 메인 유닛에 사용되는 장치 "Error.pas"에 위치

procedure ProduceKibitzError; 
var 
    v : Variant; 
begin 
    v.End; // This line stops kibitz compiler 
end; 

:

예 코드는 오류를 재현한다. 본체에서 CodeCompletion을 호출하려고하면 "Error.pas를 컴파일 할 수 없습니다"라는 메시지와 함께 중지됩니다 (실제 메시지는 독일어로 표시됨).

흥미롭게도 오류는 프로젝트가 컴파일되거나 구문 검사가 처음 수행 될 때까지만 발생합니다. 컴파일 후 CodeCompletion이 작동하고 오류를 재현하려면 Delphi를 다시 시작해야합니다.

업데이트 : 끝 레이블이있는 빈 어셈블러 블록을 추가하면 문제를 해결할 수 있습니다.

+0

케어 게시 할 어떤 코드의 * 한 줄 *와 * ErrorMessage가 *처럼? –

+0

빈 asm/end 블록을이 루틴에 추가해보십시오. 그것은 kibitz 컴파일러가 프로 시저 분석을 건너 뛰는 것을 방지합니다. Graphics.pas는 @@ end 레이블을 가진 asm/end 블록을 가지고 있으며 컴파일러는 그것 때문에 특별히 asm/end 블록을 처리합니다. –

답변

10

커서 위치로 파싱 할 때 백그라운드 컴파일러는 프로 시저 본문 분석을 수행하지 않습니다. 대신 간단한 구문 일치 (예 : begin/end 쌍)를 사용합니다. 단순 구문 일치가 장치의 최종 end이 충족되었음을 나타내면 조기에 종료됩니다.

귀하의 예를 들어 보겠습니다. 첫 번째 End 토큰은 런타임 바인딩 논리에 의해 이스케이프되지 않습니다. 실제 바인딩은 실제 표현식 컴파일러에서 파싱되지 않고 프로 시저의 끝으로 읽히기 때문입니다. 두 번째 end은 장치의 끝 부분처럼 보이며 배경 컴파일러는 더 이상 볼 수 없습니다.

추가됨 :이 루틴에 빈 asm/end 블록을 추가해보십시오. 그것은 kibitz 컴파일러가 프로 시저 분석을 건너 뛰는 것을 방지합니다. Graphics.pas는 @@ end 레이블을 가진 asm/end 블록을 가지고 있으며 컴파일러는 그것 때문에 특별히 asm/end 블록을 처리합니다.

2

기독교

procedure ProduceKibitzError; 
var 
    v : Variant; 
begin 
    asm 
    @@END: 
    end; 
    v.End; 
end; 

많은 감사, 배경 컴파일 후반에 무엇을 해야할지하지 않는 것 같은데 : 다음은 배경 컴파일러를 중지하지 않습니다 변경된 예제 코드는 제본. 개체에 대한 호출에 사용되는 COM 형식 라이브러리를 알고 있습니까? 형식 라이브러리를 기반으로 pascal-wrapper 단위를 내보내고 사용할 수 있다면 컴파일과 응용 프로그램의 성능 모두에 도움이됩니다. (기본 메뉴의 유형 라이브러리 가져 오기 유형 참조)

+1

답장을 보내 주셔서 감사합니다. 응용 프로그램은 Word 자동화에 사용됩니다. 늦은 바인드만으로는 문제가없는 것 같습니다. 예를 들어 "v.Foo"와 같은 함수 이름을 사용할 수 있습니다.이 이름은 백그라운드 컴파일에 문제가 없지만이 이름을 가진 함수는 없습니다. 이 특별한 경우에는 Delphi 키워드 "End"와의 조합이 문제라고 생각합니다. 래퍼 클래스로 초기 바인딩을 사용하는 것이 배경 컴플 렉션에서 소스를 제외 할 방법이 없을 때 문제를 해결하는 가장 좋은 방법이라고 생각합니다. – user153642

+0

맞아, 나는 호출 된 메서드가 예약어라는 것을 알지 못했다. 아마 살인자 일 겁니다. 후기 바인딩을 실제로 원한다면 IDispatch 메서드를 호출하여 매개 변수의 (빈?) 배열을 전달하는 이름에 대한 메서드 포인터를 가져올 수 있지만 그 길은 먼 길입니다. –

1

&으로 토큰을 이스케이프 처리합니까?

그렇게

V. &end;

+0

미안하지만 이 토큰으로 코드는 컴파일되지 않습니다. – user153642

+0

그것은 (나는 생각한다) D2005에 추가되었다. .Net 지원과 관련이있는 것 - 많은 닷넷 라이브러리에는 Delphi에서 예약어로 사용되는 이름을 가진 메소드가 있다고 생각합니다. –

+0

아니요 나이가 들지 않습니다. D6 매뉴얼에서 이미 언급했습니다. 나는 그것이 IDispatch 지원과 함께 온 것 같지만 그 이유는 동일합니다. COM 개체는 이미 비 델파이 이름을 가진 메서드를 지원합니다. –