2010-01-14 2 views
5

일부 데이터베이스 응용 프로그램 개발자 질문은이데이터 모듈은

begin 
    Application.Initialize; 
    Application.MainFormOnTaskbar := True; 
    Application.CreateForm(TDM, DM); 
    Application.CreateForm(TMainForm, MainForm); 
{...} 
    Application.Run; 
end. 

같은 프로젝트 소스 파일을 편집하여 기본 양식 전에 데이터 모듈을 생성하는 것을 선호 기본 폼 이전에 생성? 프로와 콘트라는 무엇입니까?

+1

OnCreate 처리기가 없거나 없습니다. MainForm은 datamodule에 선언 된 데이터 소스를 참조 할 수 있지만 생성 순서를 변경하지 않고 성공적으로 해결됩니다. – kludg

+2

이것은 프로젝트 소스를 편집해야한다는 것을 의미하지 않습니다. 데이터 모듈 및 양식의 생성 순서는 프로젝트 옵션 대화 상자에서 변경할 수 있습니다. 생성 된 첫 번째 양식이 기본 양식이지만 이전에 작성된 데이터 모듈이있을 수 있습니다. 또한이 질문에 대한 내 대답을 볼 수도 있습니다 : http : // stackoverflow.com/questions/382527/delphi-app-initialization-best-practices-approach/383197 # 383197 Uwe Raabe에게 –

+0

- 많은 옵션이 있다는 것을 알고 있습니다. 나 자신은 어떤 형태없이 GUI 단위 테스트 프로젝트를 컴파일하는 경우가있다. – kludg

답변

15

주 폼이 설정을 위해 데이터 모듈을 필요로하는 명백한 이유가있을 수 있습니다. 예를 들어 OnCreate에서 메인 폼을 참조하는 항목이 있다면 물론 데이터 모듈을 먼저 준비해야합니다.

그렇지 않으면 별 문제가되지 않습니다.

+0

동의하며, 또한 메뉴를 동적으로 생성하는 것으로 나타났습니다. – Eduardo

6

메이슨 (Mason)의 대답에 동의하는 이유는 사람들이 왜 이것을 할 수 있는지 설명하기 때문입니다. 그러나 IDE에서 유지 관리하는 코드의 종속성을 숨기므로 나쁜 접근이라고 생각합니다. 필자의 의견으로는 데이터 모듈을 자동 생성 목록에서 제거해야하며 기본 폼의 OnCreate 메서드에서 만들어야합니다.

+0

나는 데이터 모듈이 MainForm의 OnCreate 메서드에 의해 만들어 져야하고 그 스타일이 좋지 않다고 생각한다. 대신, 나는 항상 메인 폼을 먼저 만들 것이고, 데이터 모듈은 둘째로 만들 것이다. 나는 폼을 생성하거나 파괴하는 동안 다른 폼에 의존하는 메인 폼 안에 코드를 두지 않을 것이다. 대신, 나는 별도의 초기화 함수를 작성하고, 내가 작성한 코드에 의해 호출하여 언젠가 발생하게한다. 폼 안의 private/protected 필드 인 로컬 객체를 만드는 것보다 훨씬 많은 일을하는 FormCreate 이벤트를 좋아하지 않습니다. 다른 것은 FormCreate에 없어야합니다. –

0

MainForm에서 사용할 수있는 DataModule 콘텐츠를 보장하는 가장 안좋은 방법이기 때문에. 하나의 DataModule 만 있으면 문제가 없습니다.

5

실제로이 캠프에는 두 개의 캠프가 있으며 모두 정확합니다.

먼저 응용 프로그램이 각 양식/데이터 모듈의 수명을 관리 할 수있게합니다. 이 시나리오에서 기본 폼에서 데이터 모듈을 사용하는 경우에는 데이터 모듈을 먼저 사용해야 만 사용할 수 있습니다. 작은 응용 프로그램에서는 잘 작동하지만 여러 폼을 사용하는 더 큰 응용 프로그램을로드 할 때로드 오버 헤드가 있습니다 ... 일단 응용 프로그램이로드되면 폼을 표시하는 것은 메모리에서 이미 생성 된 이후 거의 즉시입니다. 각 양식/자원이 이미 작성되었으므로 응용 프로그램을 실행하면 큰 메모리가 손상됩니다. 이 메소드는 델파이가 새로운 폼/데이터 모듈을 어플리케이션에 추가 할 때 당신을도 끕니다. mainform의 OnCreate에서 datamodule을 사용하지 않으면 Application.Run이 시작될 때까지 호출되지 않기 때문에 mainform의 OnCreate에서 데이터 모듈을 사용하지 않으면 생성 순서가 더 낮을 수 있습니다.

두 번째 캠프는 각 양식/데이터 모듈 자체의 작성 및 삭제 (일반적으로 MainForm 이외의 모든 양식)를 처리하려고합니다. 이 방법의 장점은 응용 프로그램이 빠르게로드되고 시작시 즉시 메모리를 적게 소비한다는 것입니다. 일반적으로이 시나리오에서는 사용하는 각 양식/데이터 모듈의 수명주기를 완전히 관리하는 기본 양식 (또는 다른 양식)입니다. 이 방법은 다양한 양식이있는 대형 응용 프로그램에 가장 적합합니다.

0

다른 모든 구성 요소를 만들기 전에 MainForm이 표시되지 않습니다. 따라서 기본적으로 두 가지 경우 모두 대기합니다. 기상 데이터 모듈이 먼저 생성되거나 생성되지 않습니다.

cxGrid1DBTableView1.Controller.TopRowIndex :=0; 
cxGrid1DBTableView1.DataController.FocusedRowIndex := 0; 

이유 분명하다 : 그리드는 기본 폼에있는 경우 (또는 쿼리) (이후 오픈) 이벤트가 데이터 모듈 테이블에서이 같은 것을 사용하려고 할 때 당신은 곤경에 얻을 수있는 그리드가 아직 생성되지 않았습니다. 나는 데이터 모듈을 먼저 생성해야합니다. 그러나 방금 설명한 것과 같이 이유가 있습니다. 실용적이지 않은 경우가 있습니다.