2017-10-28 2 views
-1

흥미로운 사례입니다.다른 폼에서 설정하면 FormCreate에 대한 Delphi - Form Properties 비어 있음

company_id 및 SelectedlanguageCode와 같이 일부 변수 값이 설정되어있는 로그인 폼을 사용하면이 값을 MainForm 속성에 전달하여 빠른 작업을 수행하고 (선택된 언어 코드는 쿼리 할 데이터베이스로 이동),이 값은 FormCreate 이벤트에 즉시 필요하지만 값은 누락되지만 CreateForm 이벤트 이후에 값이 표시되면 디버깅됩니다. 여기

는 프로젝트 소스 코드입니다 :
{$R *.res} 

Var 
    LoginOK: Boolean = False; 
    sCompanyId: integer; 
    sSelectedLanguageCode: string; 
begin 
    // The login form is created and show up 
    // -------------------------------------- 

    fLogin := TfLogin.Create(nil); 
    try 
    // Show login form. When it closes, see if login worked. 
    fLogin.ShowModal; 
    LoginOK := fLogin.CanLogin;   
    sCompanyId := fLogin.pCompanyId; 
    sSelectedLanguageCode := fLogin.gDefaultLanguageCode; 
    finally 
    fLogin.DisposeOf; 
    end; 

    if not LoginOK then 
    Halt; // Login failed - terminate application. 

    Application.Initialize; 

    Application.MainFormOnTaskbar := True; 
    Application.CreateForm(TfMain, fMain); 
    // Here the properties of Main are set with the values, 
    // when debugging the properties get the values, you can 
    // see the actual values when hovering over the property 
    fMain.gSelectedLanguage := sSelectedLanguageCode; 
    fMain.gUserCompany := sCompanyId; 
    Application.Run; 
end. 

그러나

언급 한 바와 같이, 홈페이지의의 CreateForm에, 속성은 ... 그리고 ... 비어의 CreateForm 이벤트 후, 속성은 실제 값이 . 몇 가지 방법이 호출되고 그들을 보낼 필요가되기 때문에

나는

은 그게 만약 내가 잘못하고, 또는하고 이해하는 것이 무슨 일이 일어나고 있는지에 대한 답을 주셔서 감사합니다 ...의 CreateForm 이벤트에서이 값이 필요합니다 다음과 같은 좋은 이유가 있습니다.이 요구 사항을 해결하기 위해 다른 접근 방식을 사용할 수 있다면 감사합니다.

+1

내가 올바르게 이해하면 닭고기와 달걀 딜레마가 발생합니다. 양식을 작성하기 전에 특성을 설정할 수 없지만 양식 작성 중에이 값이 필요합니다. 그래서, 그 변수들을 메인 폼 유닛에 글로벌 vars (shiver)로 저장하십시오. 그런 다음 양식을 만들기 전에 기본 서식을 설정할 수 있으며 기본 양식은 필요할 때이를 읽을 수 있습니다. –

+3

'Application.CreateForm'이 리턴 될 때, 폼은 이미 생성되었고'FormCreate'가 실행되었습니다. 분명히'FormCreate'가 * 이미 실행 된 후에 * 설정을하지 않을 때는'FormCreate'에서 사용할 수 없습니다. –

+0

Tom, 이것이 완료된 방법입니다. 제공되는 코드는 Applications 코드이며, 로그인 양식을 먼저 작성한 다음 사용자 로그인 후 Main 양식을 작성하고 로그인 값을 할당하고 login form을 릴리스하고 Main을 보여줍니다. Main 속성에서 항상 값을 사용 했으므로 완벽하게 작동하지만 CreateForm 이벤트에서 값을 사용할 수있을 때까지는 그 값을 사용할 수 없었습니다. – VisualFox

답변

1

OK, 초기화 코드를 formCreate에 넣는 대신 기본 양식의 메소드 (예 : init())로 모두 옮깁니다. 다음 줄에서 application.run 전에 mainform.init; 또는 mainform.init (sSelectedLanguageCode, sCompanyId);

저는 항상 초기화를 초기화에서 분리했습니다. 양식이 표시되고 초기화되지 않은 경우 오류가 발생할 수 있습니다. 즉 onShow에서 회사 ID가없는 경우 사용자에게 오류가 있음을 알리고 앱을 닫습니다.