흥미로운 사례입니다.다른 폼에서 설정하면 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 이벤트에서이 값이 필요합니다 다음과 같은 좋은 이유가 있습니다.이 요구 사항을 해결하기 위해 다른 접근 방식을 사용할 수 있다면 감사합니다.
내가 올바르게 이해하면 닭고기와 달걀 딜레마가 발생합니다. 양식을 작성하기 전에 특성을 설정할 수 없지만 양식 작성 중에이 값이 필요합니다. 그래서, 그 변수들을 메인 폼 유닛에 글로벌 vars (shiver)로 저장하십시오. 그런 다음 양식을 만들기 전에 기본 서식을 설정할 수 있으며 기본 양식은 필요할 때이를 읽을 수 있습니다. –
'Application.CreateForm'이 리턴 될 때, 폼은 이미 생성되었고'FormCreate'가 실행되었습니다. 분명히'FormCreate'가 * 이미 실행 된 후에 * 설정을하지 않을 때는'FormCreate'에서 사용할 수 없습니다. –
Tom, 이것이 완료된 방법입니다. 제공되는 코드는 Applications 코드이며, 로그인 양식을 먼저 작성한 다음 사용자 로그인 후 Main 양식을 작성하고 로그인 값을 할당하고 login form을 릴리스하고 Main을 보여줍니다. Main 속성에서 항상 값을 사용 했으므로 완벽하게 작동하지만 CreateForm 이벤트에서 값을 사용할 수있을 때까지는 그 값을 사용할 수 없었습니다. – VisualFox