在 FoxPro 中,如果从网格中的按钮调用表单,为什么选择 table 在表单内发生变化?

In FoxPro, why is selected table changing within form if form called from a button in a grid?

我有一个主表格调用了一个叫做运费的表格。
此货运表格的所有属性均设置为默认值,但标题、名称和 window 类型(1 模态)除外。 唯一有代码的方法是 init,它有:

select FRT1

窗体上唯一的 object 是一个命令按钮,在点击方法中有这个:

messagebox(alias())
thisform.release()

所以我希望当我按下命令按钮时,消息框会显示 [FRT1] 但它会给出主窗体的另一个别名。

在从主窗体调用窗体之前,别名也明确设置为 FRT1

select FRT1
do form freight

因为货运表格是模态的,所以我希望主表格中的任何内容都不会影响数据区域,而货运表格是 运行。

由于货运表格中几乎没有任何内容,问题似乎出在主表格中。

这种错误行为似乎只有在从网格内的按钮调用货运表格时才会发生。关于正在发生的事情或如何预防它有什么想法吗?

一些想法。

我会打开你的调试器并输入

SET STEP ON

紧接着

SELECT FRT1
DO FORM FREIGHT

然后,在调试器中,转到 "Watch" window 并输入值

ALIAS()

作为要观察的值,并单击左侧栏以显示红点以在更改时停止。

只是一个期待的想法。您的 "Freight" 表单有其 "DataSession" 属性 到“1-默认数据会话”,如果是这样,它正在查看 DEFAULT 会话中的任何别名,而不是 PRIVATE 数据会话您的主表格可能有...

我只见过这种极其罕见的情况(在使用 FoxBase、FoxPro、VFP 的 25 年以上的时间里见过 2 次)。在这些情况下,我不得不明确地连续两次 table select。

SELECT FRT1
SELECT FRT1

甚至在两者之间加入虚假陈述,例如

SELECT FRT1
tmpXXXXXX = alias()
SELECT FRT1

检查断点,看看是否可行。

只有一个我会尝试做的断点...将 "PROGRAM()" 放在手表 window 中。它是否可能调用一些您不知道的其他派生 class 脚本...或者在 运行 代码形式的 "DataEnvironment" 中,例如在 "BeforeOpenTables" 事件中?比绕过更好地知道它在哪里做事

在被调用的窗体(通常是网格)上是否有任何控件获得焦点并因此隐含地导致对当前工作区的更改?

顺便说一句,我建议使用私有数据会话并将每个会话分开。