我有一个打开多个实例的表单。在那里,我使用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;
答案 0 :(得分: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;
如果您需要从程序的其他部分(即主窗体)访问值,则将它们设为公共属性或字段,并通过当前活动的表单变量访问它们。