2009-06-25 7 views
2

우리는 C++ Builder를 사용하여 양식이 데이터베이스의 EXE 외부에 유지됩니다. 응용 프로그램 코드는 C++C++ Builder에서 RegisterClass 자동화 VCL

이렇게하면 다시 컴파일하지 않고 양식과 양식/동작을 수정할 수 있습니다. 다음은 폼을로드하는 작업을 완료하는 코드 스 니펫입니다.

RegisterClass(__classid(TButton)); 
RegisterClass(__classid(TEdit)); 
RegisterClass(__classid(TRadioGroup)); 
RegisterClass(__classid(TGroupBox)); 
RegisterClass(__classid(TCheckBox)); 
RegisterClass(__classid(TRadioButton)); 
RegisterClass(__classid(TTimer)); 
RegisterClass(__classid(TListBox)); 
RegisterClass(__classid(TComboBox)); 
RegisterClass(__classid(TBitBtn)); 
RegisterClass(__classid(TSpeedButton)); 
RegisterClass(__classid(TMaskEdit)); 
RegisterClass(__classid(TProgressBar)); 

ms = new TMemoryStream; 
ms2 = new TMemoryStream; 

// Loading Module into Memory Stream 
ms->Position = 0; 
ms->LoadFromFile(Filename->Text); 
ms->Position = 0; 
pModule = new TForm(this); 

// Reading Module Definition 
if(!Inputisbin->Checked) 
{ 
     ms2->Position = 0; 
     ObjectTextToBinary(ms, ms2); 
     ms2->Position = 0; 
     ms2->ReadComponent(pModule); 
} 
else 
     ms->ReadComponent(pModule); 


Log->Lines->Add("Displaying Module"); 
pModule->Show(); 

참조 된 모든 클래스를 등록하기 위해 호출 할 수있는 내장 함수가 있는지 궁금합니다. 모든 객체에 대한 메모리 스트림이나 파일을 직접 스캔하여 각각에 대해 RegisterClass를 호출 할 수는 있지만 누군가 이미이 작업을 수행했음을 알았 으면합니다.

이와 같이 모든 형식이 이러한 클래스를 모두 사용하는 것은 아니므로 실제 상속 된 클래스 만 등록하는 것이 좋습니다.

답변

1

여기에있는 접근 방식은 제 의견으로는 정확합니다. 저는 몇 년 전 Delphi2를 사용하여 동일한 접근 방식을 취했습니다.하지만 VCL에서 결코 구현되지 않은 ReadComponent()와 같은 자체 클래스 팩토리 및 ObjectToText/TextToObject 함수를 구현해야했습니다.

두 번째 필수 수업 등록 시점에서 반드시 한 번만 등록하면됩니까? 그리고 클래스가 등록되어야하는지 결정하는 오버 헤드는 모든 것을 등록하는 비용보다 중요합니다. 다시 말하지만 그대로 두었습니다.

0

나는 기존 기능을 모른다. 나에게해야 할 일은 아주 드문 일이다. 데이터베이스에 양식 DFM을 저장하는 방식 (장치에 대한 CPP 및 H 파일에 별도로 저장됩니까?) 또한 이상합니다. "이것은 우리가 폼과 폼/액션을 다시 컴파일하지 않고 수정할 수있게 해준다"는 것을 알고 있습니다.하지만 개인적으로 DLL에 저장하고 다시 컴파일해야합니다. 적어도 빌드 시스템에 따라 다르지만 버전 관리되며 유닛을 "유닛"으로 저장하게됩니다. 나는 당신의 시스템 요구 조건을 모른다는 것을 인정하고 아마 당신의 방식대로하는 좋은 이유가있을 것입니다.

그러나 접근 방식을 생각해 보면 ReadComponent를 호출하기 전에 스트림을 검색하고 개체 절을 찾고 해당 구성 요소를 등록하는 것이 가장 좋은 방법이라고 생각합니다.

이벤트 및 액션 핸들러를 변경하기 위해 DFM을 별도로 저장하면 CPP 및 H 파일이 기본 애플리케이션으로 컴파일 된 상태로 남습니다. 그걸로, 당신은 이미 등록 및 내장 된 구성 요소를 가지고 있지 않으므로 이것은 완전히 불필요한 것입니까?

+0

버전 관리는 문제가되지 않습니다. Google의 자란 시스템은 DFM이 저장된 데이터베이스에서 버전 관리를 처리합니다. 답장을 보내 주셔서 감사합니다. 이벤트 핸들러는 중요하지 않습니다. DFM을 데이터와 이벤트에 연결하기 위해 ORM (object relational mapper)을 작성했습니다. 이벤트는 Perl로 작성됩니다. 우리는 우리의 앱에 Perl 인터프리터를 내장했다. 성능이 중요한 분야에서 필요할 때마다 항상 C/C++로 전환 할 수 있습니다. 우리는이 시스템을 우리가 구축 한 시스템 밖에서 많은 커스텀 소프트웨어를 위해이 "프레임 워크"를 사용합니다. – Eric