2009-11-28 5 views
0

저는 라이브러리에서 모 놀리 식 델파이 -Win32 앱을 나눠보고자합니다. 그래서 델파이 2009를 사용하여 내 라이브러리간에 전역 변수와 객체를 공유하는 방법에 대해 몇 가지 질문을합니다. 예를 들어, TObject) : 사용자 정보, 현재 세션 정보 및 활성 데이터베이스 연결을 저장하고이 데이터베이스와의 작업을 관리하는 데 사용됩니다. 내 라이브러리는 이러한 객체로 작업해야합니다. 또한 특정 라이브러리는 TForm에서 파생 된 객체를 다른 상위 컨트롤에 대한 호스트로 주 양식에 제공합니다. 주 양식으로 전달 된 TForm에서 파생 된 모든 개체에는 고유 한 메서드와 속성이 있습니다. 즉, 클래스가 서로 다릅니다.Delphi 2009에서 라이브러리간에 변수를 공유하는 방법은 무엇입니까?

나는 전역 개체를 별도의 라이브러리에 넣으려고 생각하고 있지만 상황이 더 어려워 질 것이라고 생각하지만 그것을 고려하십시오.

이 상황을 어떻게 해결할 수 있습니까?

하나의 질문이 더 사용하기에 좋습니다 : 정적 또는 동적 라이브러리로드? 자세한 내용은 일부 서적이나 사이트를 추천 할 수 있습니까?

미리 감사드립니다.

각 BPL,이로드되는, 부하 모든 단위 그것에 :

+1

첫 번째 질문은 무엇입니까? 라이브러리로 분류 한 이유는 무엇입니까? "모 놀리 식 EXE"의 문제점은 무엇입니까? –

+0

다음과 같은 이유로 : (a) 내 앱에 기능을 추가하여 EXE 크기가 더 커질 수 있습니다. (b) 유지 관리 나 업데이트가 쉽기 때문에 마이너 업데이트를 할 때마다 약 20MB의 파일을 배포하고 싶지는 않습니다. , 1MB 정도의 라이브러리를 업데이트하는 것이 더 쉽습니다. (c) 각 라이브러리가 내 앱에 대한 특정 작업 (인보이스 발행, 등록,보고 등)을 수행하는 라이브러리를 통해 내 애플 리케이션을 모듈화하고 싶습니다. 지금 나를 이해할 수 있기를 바랍니다. 어쨌든 고마워. –

답변

2

모듈간에 변수를 공유하기 위해 과거에 수행 한 작업 (BPL 사용)은 공유 TStringList를 통해이를 전달하는 것이 었습니다. 일반적으로 공유 변수가 모두 포함 된 인 글로벌 공유 객체 을 갖는 것이 가장 좋습니다.

하나 이상의 라이브러리간에 참조 할 내용이 있다면이어야합니다. Mason's advice was sound.

특정 이유로 동적 인 경우가 아니라면 정적 로딩으로 이동하십시오 (소리가 나지 않음). Windows 메모리 관리자가 불필요한 라이브러리를 메모리에서 스왑합니다.

큰 응용 프로그램을 관리하는 사람의 팁 하나가 여러 라이브러리로 나뉩니다. 우리는 패키지, VCL, 일부 응용 프로그램 공통 루틴, 그리고 응용 프로그램의 각 "화면"또는 세그먼트에 대한 라이브러리에 구성 요소를 가지고있었습니다. 화면을 변경하면 해당 업데이트 된 라이브러리를 방금 릴리스 할 수 있었지만 다른 유형의 라이브러리를 변경 한 경우 , 일반적으로은 모든 것을 다시 배포해야했습니다. 그래서 희귀 한 우리는 구성에서 이점을 즐겼다.

1

은 "라이브러리"당신이 BPL 패키지를 의미하여, 그래서 여기에 가이드 라인이 보인다. 유닛을 두 번 이상로드 할 수 없습니다. 즉, 둘 이상의 패키지가 전역 변수 중 하나에 액세스해야하는 경우 하나의 패키지에 있고 다른 하나는 패키지 필요합니다 목록에 있거나 다른 모든 패키지가 필요로하는 별도의 패키지에 있어야합니다.

정적 및 동적로드의 경우 프로그램에서 절대적으로 필요하면 정적으로 링크하도록 만듭니다. 동적로드는 플러그인과 같은 선택적 기능을위한 것입니다. (그 경로를 가고 싶다면 JVCL에서 JVPlugin을 살펴보십시오. 매우 유용한 시스템입니다.)

+0

고마운 친구,하지만 내 프로그램은 내 맞춤법, 양식 등을 설정하는 곳에서 만든 라이브러리를 의미합니다. 이러한 메소드, 형식, 객체 등은 내 메인 애플리케이션에 사용되었지만 EXE 크기가 거의 16MB 였기 때문에 라이브러리로 부품을 분리했다고 생각했습니다. 제 상황이 더 명확 해 집니까? 어쨌든 고마워 –

-1

왜 이런 간단한 질문을하는 사람들이 Delphi 버전을 언급하는지 이해할 수 없습니다. 예. 구현 키워드 앞에 공유 변수를 별도의 단위로 두는 것이 좋습니다. 모든 개체 (폼, 클래스, 컨트롤)은 (델파이 도움말을 참조하십시오) 위의 클래스는 여전히 TObject의 파생

type TMyClass = class 
    // no inheritance ? 
end; 

같은 클래스를 정의하는 경우에도, TObject의 파생됩니다. 귀하의 전역 변수가 내 블로그에 델파이 자습서를 읽어 즉

var MyPointerVariable: Pointer; // I presume it is already initialized and is a pointer to a TForm descendant 
... 
begin 
    TForm(MyPointerVariable).Caption := 'Stack Overflow'; 
end; 

자세한 내용은 (MyPointerVariable) .Method 형 TObject의 또는 포인터의 선언하고 액세스 할 때 그들을 하드 캐스트 TForm 클래스를 사용할 수 있습니다 그것은 매우 간단해야 알다.

+0

답변 해 주셔서 감사합니다. 지금 답해 드리겠습니다. 정답을 얻으려는 델파이 버전에 대해 언급합니다. 누군가가 델파이 8이나 이른시기에 완벽하게 작동하지만, 델파이 2009에서는 완벽하게 작동하지 않는 솔루션을 제공 할 수 있습니다. 그렇지 않으면 쓸모없는 솔루션이 될 수 있습니다. 어쨌든 다시 한 번 감사드립니다. –

관련 문제