这是一个有趣的案例。
有登录表单,其中设置了一些变量值,如company_id和SelectedlanguageCode,想法是将此值传递给MainForm属性以使事情快速(选择语言代码转到数据库查询),这个值将是在FormCreate事件中立即需要,但这里缺少值,但在CreateForm-event之后调试值只显示。
这是项目源代码:
{$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.
但如上所述,在Main的CreateForm中,属性为空... 并且......在CreateForm事件之后,属性具有实际值。
我在CreateForm事件中需要这个值,因为一些方法将被调用并需要发送它们......
我很欣赏有关如何理解我做错了什么的答案,或者如果有充分的理由那样做那么......如果你能给我另一种方法来解决这个要求,谢谢。
答案 0 :(得分:1)
好的,所以不要在formCreate中使用初始化代码,而是将其全部移动到主窗体上的方法(例如init())。 在你应用之前的行中。你可以拥有 mainform.init; 要么 mainform.init(sSelectedLanguageCode,sCompanyId);
我总是将创作从初始化中分离出来。如果表单已显示且未初始化,则可以引发错误。即在onShow中,如果没有公司ID - 告诉用户有错误并关闭应用....