님이 쓰신 글 :
: 빌더(TWx) 님이 쓰신 글 :
: : 단단한돌 님이 쓰신 글 :
: : : 환경: C++ Builder XE5
: : :
: : : 프로젝트 옵션에 들어가서 보면 Form 리스트 정보가 나오지 않습니다.
: : : (Project -> Project Options -> Forms)
: : :
: : : Icon을 지정하는 Application 에서도 기존에 지정한 Icon이 보이지가 않습니다.
: : : (Project -> Project Options -> Application)
: : :
: : : 프로젝트 파일이 손상된 것 같은데..
: : : 복구할 수 있는 방법은 어떤 것이 있나요?
: : :
: : : 감사합니다.
: : :
: : :
: :
: :
: : 답변:
: :
: :
: : RAD Studio 10.2 의 경우를 예로들어서 설명하면 (설치되어 있는 컴파일러가 10.2 밖에 없음)
: :
: : 프로그램 아이콘은 '디폴트' 버튼을 눌러서 선택하면 .cbproj 프로젝트 파일에 반영되고.
: :
: : (Project -> Project Options -> Forms)
: : 에서의 폼 리스트는...
: :
: : 예를 들어서... 프로젝트에서
: :
: : From1(Unit1.cpp/Unit1.h/Unit1.dfm), Form2(Unit2.cpp/Unit2.h/Unit2.dfm)
: :
: : 위와 같이 2개의 폼이 있는데도 (Project -> Project Options -> Forms) 폼 리스트에 나타나지 않는다면
: :
: :
: : 프로젝트 네임이 Project1.exe 로 되어있다면...
: :
: : Project1.cpp 파일을 열어서
: :
: : //---------------------------------------------------------------------------
: : USEFORM("Unit1.cpp", Form1);
: : USEFORM("Unit2.cpp", Form2);
: : //---------------------------------------------------------------------------
: : int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
: : {
: : try
: : {
: : Application->Initialize();
: : Application->MainFormOnTaskBar = true;
: : Application->CreateForm(__classid(TForm1), &Form1);
: : Application->CreateForm(__classid(TForm2), &Form2);
: : Application->Run();
: : }
: : ...........
: :
: :
: : 위와 같은 식이 되도록
: :
: : Application->CreateForm(__classid(TForm1), &Form1);
: : Application->CreateForm(__classid(TForm2), &Form2);
: :
: : 코드가 설정되어 있어야 합니다.
: :
: :
: : C++빌더 IDE는 '프로젝트 네임.cpp' 파일을 파싱해서
: : 결과를 (Project -> Project Options -> Forms) 폼 리스트에 반영하도록 IDE가 구현되어 있습니다.
: :
: : 저런 식이 되도록 '프로젝트 네임.cpp' 파일을 수정/저장 해서 (Project -> Project Options -> Forms)
: : 폼 리스트를 다시 열어 보세요.
: :
:
: //#include
: //#pragma hdrstop
: #include "Precompile.h" // Precompile header 사용
:
: #include
: //------------------
: USEFORM("UnitDM.cpp", DM); /* TDataModule: File Type */
: USEFORM("UnitMain.cpp", FormMain);
: //---------------------------------------------------------------------------
: int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
: {
: HANDLE hMutex = NULL;
: try
: {
: hMutex = CreateMutex(NULL, TRUE, L"Application/XXXMutex");
: if ( NULL == hMutex )
: throw Exception("Error:CreateMutex failed.");
: if ( GetLastError() == ERROR_ALREADY_EXISTS ) {
: OutputDebugStringA("Named Mutex already exist. skip Application init..");
: CloseHandle(hMutex);
: return 0;
: }
: Application->Initialize();
: Application->MainFormOnTaskBar = true;
: Application->CreateForm(__classid(TFormMain), &FormMain);
: Application->CreateForm(__classid(TDM), &DM);
: Application->Run();
: }
: catch (Exception &exception)
: {
: Application->ShowException(&exception);
: }
: // do something...
: }
:
: 위와 같은 코드로 되어 있는데요..
: 중복 방지를 위한 Mutex 코드가 들어 있는데.. 이 코드를 try{} 구문 밖으로 빼도 마찬가지내요.
: 이상한 것은 다른 프로젝트에서는 이와 동일한 코드로 구성되어 있는데
: 프로젝트 옵션에 폼리스트가 잘 보입니다.
: (다른 점이라면 이 프로젝트는 Precompile Header를 만들어서 Include했다는 것이고,
: 다른 프로젝트는 Precompile Header 없이 사용하는 것입니다. 이 차이일까요? )
:
:
답변:
clang 컴파일러가 사용되면 별개의 헤더파일을 프리컴파일드 헤더로 사용해서 컴파일 하지만
classic 컴파일러로 컴파일 하도록 설정되어 있으면
#include <vcl.h>
#pragma hdrstop
#include <tchar.h>
소스파일에서
#pragma hdrstop 구문 위 까지 포함되어있는 헤더파일들은 컴파일러에 의해서 프리컴파일헤더로
사용되게 되어 있습니다.
프리컴파일드 헤더로 사용하려면
#include <vcl.h>
#include "yourPrecompiledHeader.h"
#pragma hdrstop
#include <tchar.h>
..............
와 같은 식으로 #pragma hdrstop 위에 프리컴파일로 사용할 헤더를 적어주면 됩니다.
#pragma hdrstop
의 의미는 #pragma hdrstop 까지 지정된 헤더파일들은 프리컴파일 하고
이후 부터는 프리컴파일 헤더로 사용하지 않겠다는 것을 컴파일러 한테 지시하는 겁니다.
컴파일러가 #pragma hdrstop 으로 이미 프리컴파일을 지원하고있는데 왜 저런 식으로
코드를 작성했나요. 전혀 불필요한 행동인데.
프로젝트 하나 새로 만들어서 생기는 소스형태 그대로 사용하세요.
프리컴파일로 사용할 헤더들은 #pragma hdrstop 위에 나열해 주는 것으로 컴파일러가
알아서 프리컴파일 합니다.
두개의 폼은 .cpp/.h/.dfm 카피해서 새로 만든 프로젝트로 포함시키고.
그리고 헤더파일이 개발 과정동안 자주 수정되는... 사용자가 정의한 헤더파일들은
프리컴파일 헤더로 사용하지 마세요.
헤더가 변경될 때 마다... 프리컴파일 프로세싱을 다시 시작해야해서 컴파일 시간만
잡아 먹으므로...