从可用表单获取数据到自动处理表单

时间:2014-06-09 22:55:21

标签: delphi

我想将数据从Form2的状态栏(位于可用表单列表中并用于登录目的)传输到MainForm上的状态栏(自动处理的状态栏)。 如果我使用:

procedure TMainForm.FormShow(Sender: TObject);
begin
AdvOfficeStatusBar1.Panels[0].Text := Form2.AdvOfficeStatusBar1.Panels[0].Text;
end;

我收到访问冲突错误。 。为什么会这样?我怎么能克服这个?

1 个答案:

答案 0 :(得分:1)

根据您的评论,我会说发生了以下情况:

您将用于登录表单的代码是:

procedure Login;
begin
  with TForm2.Create(nil) do
  try
    Application.MainForm.Hide;
    if ShowModal = mrOK then
      Application.MainForm.Show
    else
      Application.Terminate;
  finally
    Free;
  end;
end;

这里发生的是TLoginForm有一个隐含变量。这与自动创建的变量不同,后者位于TForm2单元中Form2: TForm2;。表单关闭后,将直接释放此变量。

看看我的意思。如果从应用程序中删除名为Form2的变量,则代码中唯一不能编译的部分就是原始帖子中的行。

如果您想要执行此类操作,您需要做的就是这样(我已将TLoginForm的名称更改为您的Form2)。

procedure Login;
begin
  Form2 := TForm2.Create(nil);
  Application.MainForm.Hide;
  if Form2.ShowModal = mrOK then
    Application.MainForm.Show
  else
  begin
    Form2.Free;
    Application.Terminate;
  end;
end;

关闭主表单时,您必须释放Form2。我真的不建议做这种事情。作为一个快速解决方案,您最好将文本AdvOfficeStatusBar1.Panels[0].Text保存在Form2的OnClose事件中的全局变量中,如下所示:

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  g_MySavedVariable := AdvOfficeStatusBar1.Panels[0].Text;
end;

然后将其加载到主窗体中:

procedure TMainForm.FormShow(Sender: TObject);
begin
  AdvOfficeStatusBar1.Panels[0].Text := g_MySavedVariable;
end;

即便这样也不理想,但应该让你开始运作。

如果您正在寻找登录表单的代码,您可以在登录表单和主表单之间传递数据,那么您最好在StackOverflow(delphi Login Form)中查看此问题以及答案大卫和科斯明。我个人倾向于Cosmin的解决方案,因为你不需要弄乱DPR,也不涉及全局变量。