2013-04-20 66 views
1

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

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

我在窗体打开时创建查询,所以我认为他们不会共享相同的数据。

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

如何避免这种情况发生?

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

创建如下形式:从窗体的代码

// 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

如果我理解正确,则更改表单A中的某些数据并关闭它(例如)。然后,您切换到另一个已经打开的表单B,该表单显示您在表单A中更改的数据,但由于您在创建表单时已经加载了数据,因此数据不再是实际的数据。是对的吗 ? – TLama 2013-04-20 17:57:27

+1

很难说这个问题可能是什么;这绝对不正常。你能编辑包含创建查询的代码和创建表单实例的代码吗? – 2013-04-20 17:57:28

+0

是的,在没有看到实现的情况下回答这个问题是不可能的。 – 2013-04-20 18:00:00

回答

1

问题

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; 

剪断似乎是你'使用全局变量。将它们更改为表单的字段,并解决您的问题。 IOW,现在你有

implementation 

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

将其更改为

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

如果需要从程序(即在主窗体)的其他部分访问值,然后让他们公开propertyes或字段并通过当前活动的表单变量访问它们。