Delphi - 从其他表单

时间:2017-10-28 18:54:48

标签: oop delphi

这是一个有趣的案例。

有登录表单,其中设置了一些变量值,如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事件中需要这个值,因为一些方法将被调用并需要发送它们......

我很欣赏有关如何理解我做错了什么的答案,或者如果有充分的理由那样做那么......如果你能给我另一种方法来解决这个要求,谢谢。

1 个答案:

答案 0 :(得分:1)

好的,所以不要在formCreate中使用初始化代码,而是将其全部移动到主窗体上的方法(例如init())。 在你应用之前的行中。你可以拥有 mainform.init; 要么 mainform.init(sSelectedLanguageCode,sCompanyId);

我总是将创作从初始化中分离出来。如果表单已显示且未初始化,则可以引发错误。即在onShow中,如果没有公司ID - 告诉用户有错误并关闭应用....