2010-07-16 2 views
1

저는 Delphi 7을 사용하고 있습니다. FormCreate에서 객체를 만들려고하면 실제로 실패합니다. FormShow에서 동일한 작업을 시도하면 작동합니다. TEdit과 같은 시각적 구성 요소를 만드는 것에 대해 말하는 것이 아닙니다. 그것은 데이터베이스 추상화 객체입니다. 왜 이런 일이 일어날 지 생각해? 이 주제에 대한 지침이 있습니까?FormCreate에서 실패한 항목이 있지만 FormShow에서 제대로 작동하는 이유는 무엇입니까?

+7

자세한 내용은 도움이 될 것입니다. 어떤 종류의 물건입니까? 그것은 우리가 친숙하게 생각할 수있는 표준입니다. 생성자에서 무엇을하려고합니까? 어떤 시점에서 정지합니까? 디버거가 지금까지 문제에 관해 무엇을 말했습니까? –

+1

GExperts Debuger 또는 SmartInspect와 같은 콘솔에 출력하는 것과 같은 디버그 명령문은 어떤 행이 걸려 있는지 정확히 지적 할 수 있습니다. 그렇다면 대답은 대개 명백합니다. –

+0

@Mason Wheeler : 우리가 제작 한 사용자 지정 데이터 추상화 개체입니다. 아니, 나는 누구도 그것에 익숙하지 않을 것이라고 기대하지 않는다. 그것은 db를 쿼리하고 쿼리 결과의 값으로 해당 속성을 채 웁니다. 생성자 내부에서 CDS를 열려고하면 중단됩니다. 디버거에 신경 쓰지 마세요. FormCreate가 아닌 FormShow에서 작동하는 이유를 알고 싶습니다. 기본 데이터 모듈, 쿼리 및 관련 클라이언트 데이터 집합이 이미 존재한다고 가정 할 수 있습니다. 그렇지 않으면 액세스 위반이 발생합니다. – Sam

답변

2

1) 이유는 FormCreate에서 Form에 대한 핸들이 아직 만들어지지 않았기 때문입니다. 데이터베이스 객체는 폼 핸들을 필요로하는 경우

, 이렇게 :

Self.HandleNeeded을; // FormCreate 시간에.

2) 다른 이유는 데이터베이스 구성 요소를 연결해야하며 DFM에만 연결되어 있기 때문일 수 있습니다.

+2

'TWinControl.GetHandle' (폼의 핸들을 가져올 때 호출되는 것)은 핸들을 반환하기 전에 내부적으로'HandleNeeded'를 호출합니다. 또한 연결 구성 요소에 DFM에 저장된 'Connected = True'가있는 경우 컴파일 된 응용 프로그램은 구성 요소를 인스턴스화 할 때 속성이 스트리밍되는 즉시 연결해야합니다. 컴파일 된 상태가 빌드 된 실행 파일에서'Connected = False'가되도록 강제하는 IDE 전문가가 있다면 이것이 유일한 경우입니다. – afrazier

+1

이 질문을 한 사람은 그가 사용한 데이터베이스 개체를 언급하지 않았습니다. 나는 TDataSet이 아닌 기반이며이 문제가있는 Windows 용 BTrieve 사용을 기억합니다. – buttercup

+0

# 2가 아니지만 1 번 소리가 들립니다. 그게 제가 찾고 있던 대답입니다. 이 객체는 너무 크고 복잡한 것이므로 FormShow에서 호출하면 제대로 작동한다는 것을 알 수 있습니다. 고마워, 나는이 대답을 받아들이고 모든 기여자를 upvoting. – Sam

2

내 첫 번째 추측은 당신이 아직 DataModule에 접근하고 있지 않다는 것입니다. 프로젝트의 소스는 다음과 같은 경우

begin 
    Application.Initialize; 
    Application.CreateForm(TForm1, Form1); 
    Application.CreateForm(TDataModule1, DataModule1); 
    Application.Run; 
end. 

그리고 당신의 TForm1.FormCreate처럼 보이는 다음

begin 
    DataModule1.AddUsersToStringList(Self.ComboBox1.Items); 
end; 

다음 FormCreate이는 Application.CreateForm(TForm1, Form1); 라인의 일부로 실행되고 있기 때문에 실패 할 것, 그리고 데이터 모듈이 아직 작성되지 않았습니다.

이 개 솔루션있다 :

  1. 연기하여 처리/초기화 모든 양식 및 데이터 모듈이 생성 된 후까지.
  2. 양식을 만들기 전에 모든 데이터 모듈을 만듭니다. Delphi에서 응용 프로그램의 "주 양식"은 첫 번째 개체가 아닌 Application.CreateForm에 의해 생성 된 첫 번째 TCustomForm 자손입니다.
+1

하지만 액세스 위반이 발생해야합니다. –

+0

간단한 시나리오에서 대답은 정확하지만이 경우는 아닙니다. 이 폼의 FormCreate가 호출 될 때 datamodule, 쿼리 및 연결된 클라이언트 데이터 세트가 이미 만들어져 있음을 확신합니다. 애플리케이션 메인 폼이 아닙니다. 데이터 모듈이 작성되지 않았습니다. – Sam

+0

@Craig Young : 당신은 절대적으로 맞습니다. 그게 바로 그것입니다 (무한 루프처럼!). – Sam

관련 문제