Jump to content
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr ×
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr
  • 0

3rd party componet 사용 중 동일한 이름의 Unit명을 사용하여 오류가 발생합니다.


아라비안와인

질문

DevExpress 와 Devart 컴포넌트에서 "MSAccess" 명칭이 동일하여 참조 오류가 발생하고 있습니다.

이와 관련하여 참조 Class를 정확하게 추적하도록 컴포넌트(또는 Bpl)를 명시할 수 있을까요?

개발 환경

- Embarcadero® RAD Studio 11.0 Version 28.0.42600.6491 

- DevExpressVCLProducts-21.2.2

- sdac_10.0.2

이 댓글 링크
다른 사이트에 공유하기

3 answers to this question

Recommended Posts

  • 0

해결됨

----

Devart사의 sdac 제품군 내의 TMSConnnection 컴포넌트는 MSAccess Unit를 참조하도록 설계되었고,

DevExpress사의 DevExpressVCL 제품군 내의 일부 컴포넌트는 dxEMF.DB.MSAccess Unit을 참조하도록 설계된 것으로 보입니다.

개발과정에서 2개사의 컴포넌트가 혼재되어 사용되었으며, 실제 DevExpress사의 어떤 컴포넌트가 문제를 발생하는지는 찾지 못했습니다.

기존 10.4 버전에서 개발된 소스에서는 참조 대상의 모호성에도 불구하고, 정상 컴파일 되었습니다.

11 버전에서 컴파일시에는 첨부파일과 같은 오류가 발생합니다.

2022-01-21 07;39;07.PNG

2022-01-21 07;38;48.PNG

 

위 문제는 프로젝트 파일의 옵션내 Unit Scope Name을 정비하여 문제를 해결하였습니다. 

관심 가져 주셔서 감사합니다.

이 댓글 링크
다른 사이트에 공유하기

  • 0

어떤 오류가 어떻게 발생하는지 메시지와 스크린샷을 첨부해 주시겠어요?

--

일반적으로 컴포넌트도 클래스이므로, 클래스 이름이 중복되는 경우 유닛명.클래스명으로 사용할 수 있습니다.

예를 들어, TButton의 경우 Vcl.StdCtrls에 선언되어 있고, 

다음과 같이 사용 가능합니다.

Button1: Vcl.StdCtrls.TButton;

 

이 댓글 링크
다른 사이트에 공유하기

  • 0
On 2022. 1. 21. at 오전 11시 44분, 아라비안와인 said:

해결됨: 아래 문제는 프로젝트 파일의 옵션내 Unit Scope Name을 정비하여 문제를 해결하였습니다. 

스스로 해결하고 방법까지 남겨주셔서 감사합니다. 

@아라비안와인님께서는 이미 알고 있겠지만, 이 글을 보는 다른 분들을 위해 참고로 부연 설명을 남깁니다.

[써드 파티 프레임워크와 네임스페이스]

  • DevExpress 등 써드 파티 프레임워크 제조사는 대체로 Unit의 이름을 정할 때, Namespace를 사용하여 제조사 또는 제품을 알 수 있고 유닛을 정돈하기 좋은 이름을 만든다.
    • 유닛 예: dxEMF.DB.MSAccess (데브익스프레스 사의 유닛이고 데이터베이스 관련된 유닛임을 알 수 있다.
    • 타입 예: dxEMF.DB.MSAccess.TMSConnection (아래 "코드 예시" 처럼 전체이름을 쓰는 경우는 많지 않다. 하지만, 유닛과 네임스페이스는 타입을 잘 사용하면 타입을 정돈하고 명확히 할 수 있어서 좋다) 

[델파이 네임스페이스와 클래스]

  • 델파이와 10.4와 11.0은 모두 namespace를 지원한다.
  • 델파이 Unit은 델파이 Type을 담는 컨테이너이다.
  • 델파이 Namespace는 델파이 Unit을 담는 컨테이너 이다. (예: Vcl.Touch.GestureMgr)
  • 델파이 Class는 델파이 Type중 하나이다.
  • 델파이 Class의 전체 클래스명은 네임스페이스가 포함된 이름이다. (예: Vcl.Touch.GestureMgr.TGestureManager)
  • 델파이 소스에서 사용되는 클래스가 정확히 무엇인지 컴파일러가 알 수 있어야 한다.
    (우리가 윈도우 탐색기에서 특정 파일을 한번에 찾을 때, 주소 창에 폴더 위치까지 포함하여 전체 파일명을 지정하는 것과 같은 방식이다) 

[코드 예시] 

TGestureManager 클래스가 들어있는 유닛 파일 (참고, 델파이는 델파이로 만든다. 델파이 상업용 버전에는 코드도 함께 제공된다. 이 코드를 보면 개발 능력 향상에도 도움이 된다.)

unit Vcl.Touch.GestureMgr; // (네임스페이스는 유닛을 담는 컨테이너이다)
                           // 유닛명에서 네임스페이스를 사용했다. 
                           // 그 결과, 여러 유닛을 정돈된 네임스페이스 계층에 넣을 수 있다.
...
type
  TGestureManager = class; // (유닛은 타입을 담는 컨테이너이다)
                           // Vcl.Touch.GestureMgr 유닛 안에서 "TGestureManager" 클래스 타입을 선언했다.
                           // 그 결과, 이 클래스의 전체 이름은 Vcl.Touch.GestureMgr.TGestureManager 이다.
  ... // 이 유닛 안에 정의된 타입은 모두가 Vcl.Touch.GestureMg 안에 들어있게 된다.

 TGestureManager 클래스를 사용하는 유닛 파일

unit uMain;
...
uses
  ...
  Vcl.Touch.GestureMgr; // 유즈 절에 사용할 유닛명을 넣는다. (네임스페이스를 포함한 전체이름을 넣으면 좋다) 

  TMainForm = class(TForm)
    ...
    GestureManager1: TGestureManager; // 앞에서 유닛명이 지정되었으므로 유닛명을 굳이 적지 않아도 된다. 

// (흔하지 않겠지만) 만약 유즈절에 들어있는 유닛 중에 TGestureManager라는 클래스를 가지고 있는 유닛이 
// Vcl.Touch.GestureMgr 말고 또 있다면, 위와 같이 TGestureManager라는만 적을 경우, 컴파일러는 정확히 알 수 없다.
// 따라서 Vcl.Touch.GestureMgr.TGestureManager 로 전체이름을 적어야 한다.

 

 

이 댓글 링크
다른 사이트에 공유하기

이 토의에 참여하세요

지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.

Guest
이 질문에 답변하기...

×   서식있는 텍스트로 붙여넣기.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   이전에 작성한 콘텐츠가 복원되었습니다..   편집창 비우기

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

중요한 정보

이용약관 개인정보보호정책 이용규칙 이 사이트가 더 잘 작동하기 위해 방문자의 컴퓨터에 쿠키가 배치됩니다. 쿠키 설정 변경에서 원하는 설정을 할 수 있습니다. 변경하지 않으면 쿠키를 허용하는 것으로 이해합니다.