1

我有一个可以打开多个实例的表单。在那里,我使用 SQL 查询从数据库(在本例中为绝对数据库)读取一些数据。然后我用数据填写一些变量,并在表单的生命周期内使用查询进行其他操作。

问题是,当我打开多个表单实例时,旧表单上的数据会更改为上次打开表单的值。

我在打开表单时创建了查询,所以我认为它们不会共享相同的数据。

我不使用自动创建的表单。

如何避免这种情况发生?

** 编辑 - 添加了一些代码 **

我创建的表格如下:

procedure TfrmMain.OpenFormsFunction(Sender: TObject);
var
  Resultater:   TfrmregResultat;
begin
// Some code for checking if forms are already open
// Locate record in table to be used as paramdata in the query in the newly opened form
DataX.tStevneHead.Locate('StevneNummer;GrenType', VarArrayOf([StevneNummer, GrenType), []);
Resultater := TfrmRegResultat.Create(nil);
Resultater.Show; // OnClose action for the form is caFree
end;

从表单的代码中截取

// decleared in implementation
Dato:        TDate;
GrenType:    string;
GrenRunder:  integer;
MaxPoeng:    integer;

procedure TfrmRegResultat.FormShow(Sender: TObject);
begin
//-- qStevneHead is a TABSQuery component on the form
//-- DataX is the name of my DataModule
with qStevneHead do
begin
  Close;
  SQL.Clear;
  SQL.Text := 'SELECT * FROM StevneHead WHERE GrenType = :aGrenType AND StevneNummer =  aStevneNummer';
  ParamByName('aGrenType').AsString := DataX.tStevneHead.FieldByName('GrenType').Value;
  ParamByName('aStevneNummer').AsString := DataX.tStevneHead.FieldByName('StevneNummer').Value;
  Open;
end;
GrenRunder := qStevneHead.FieldByName('AntallRunder').Value;
Dato := qStevneHead.FieldByName('Dato').AsDateTime;
GrenType := qStevneHead.FieldByName('GrenType').Value;
MaxPoeng := qStevneHead.FieldByName('MaxPoeng').Value;
// More code to init stringgrid and other stuff on the form
end;
4

1 回答 1

1

问题似乎是您正在使用全局变量。将它们更改为表单的字段,您的问题应该得到解决。IOW,现在你有

implementation

var
  Dato:        TDate;
  GrenType:    string;
  GrenRunder:  integer;
  MaxPoeng:    integer;

将其更改为

type
  TfrmRegResultat = class(...)
  ...
  private
    Dato:        TDate;
    GrenType:    string;
    GrenRunder:  integer;
    MaxPoeng:    integer;
   ...
  end;

如果您需要从程序的其他部分(即在主窗体中)访问值,则将它们设为公共属性或字段并通过当前活动的窗体变量访问它们。

于 2013-04-20T19:21:22.637 回答