Delphi 访问存储在另一个单元中的数据

Delphi 访问存储在另一个单元中的数据,delphi,class,data-structures,variables,delphi-units,Delphi,Class,Data Structures,Variables,Delphi Units,在我的程序单元2中,我有以下代码: TValue = Record NewValue, OldValue, SavedValue : Double; end; TData = Class(TObject) Public EconomicGrowth : TValue; Inflation : TValue; Unemployment : TValue; CurrentAccountPosition : TValue; AggregateSupply : TVa

在我的程序单元2中,我有以下代码:

TValue = Record
  NewValue,
  OldValue,
  SavedValue : Double;
end; 

TData = Class(TObject)
Public
  EconomicGrowth : TValue;
  Inflation : TValue;
  Unemployment : TValue;
  CurrentAccountPosition : TValue;
  AggregateSupply : TValue;
  AggregateDemand : TValue;
  ADGovernmentSpending : TValue;
  ADConsumption : TValue;
  ADInvestment : TValue;
  ADNetExports : TValue;
  OverallTaxation : TValue;
  GovernmentSpending : TValue;
  InterestRates : TValue;
  IncomeTax : TValue;
  Benefits : TValue;
  TrainingEducationSpending : TValue;
End;
然后在Var中声明Data:TData

但是,当我尝试在单元1中执行以下操作时:

  ShowMessage(FloatToStr(Unit2.Data.Inflation.SavedValue));

我收到一条消息。有没有办法从Unit1访问“data”中存储的数据而不出错?

添加
数据:=TData.Create
到Unit2的
初始化
部分,或者将TData更改为记录而不是对象。只要正确初始化,从Unit1访问Unit2的全局对象本质上没有什么问题。

Add
Data:=TData.Create
到Unit2的
初始化
部分,或者将TData更改为记录而不是对象。只要正确初始化,从Unit1访问Unit2的全局对象本质上没有什么问题。

@Hendriksen123,在使用变量
数据之前是否初始化它?
EAccessViolation
是无效内存访问错误的例外类,通常在代码尝试访问尚未创建(初始化)或已销毁的对象时发生

尝试使用
Data:=TData.Create


然后您可以使用
数据
变量。

@Hendriksen123,在使用变量之前是否初始化变量
数据
EAccessViolation
是无效内存访问错误的例外类,通常在代码尝试访问尚未创建(初始化)或已销毁的对象时发生

unit Unit2;

interface

type
  TValue = Record
    NewValue,
    OldValue,
    SavedValue : Double;
  end;

  TData = Class(TObject)
  Public
    EconomicGrowth : TValue;
    Inflation : TValue;
    Unemployment : TValue;
    CurrentAccountPosition : TValue;
    AggregateSupply : TValue;
    AggregateDemand : TValue;
    ADGovernmentSpending : TValue;
    ADConsumption : TValue;
    ADInvestment : TValue;
    ADNetExports : TValue;
    OverallTaxation : TValue;
    GovernmentSpending : TValue;
    InterestRates : TValue;
    IncomeTax : TValue;
    Benefits : TValue;
    TrainingEducationSpending : TValue;
  End;

procedure InitialiseData (var pData : TData);

implementation

procedure InitialiseData (var pData : TData);
begin
  pData := TData.Create;

  pData.EconomicGrowth.SavedValue := 1.00;

end;

end.
尝试使用
Data:=TData.Create

然后您可以使用
数据
变量

unit Unit2;

interface

type
  TValue = Record
    NewValue,
    OldValue,
    SavedValue : Double;
  end;

  TData = Class(TObject)
  Public
    EconomicGrowth : TValue;
    Inflation : TValue;
    Unemployment : TValue;
    CurrentAccountPosition : TValue;
    AggregateSupply : TValue;
    AggregateDemand : TValue;
    ADGovernmentSpending : TValue;
    ADConsumption : TValue;
    ADInvestment : TValue;
    ADNetExports : TValue;
    OverallTaxation : TValue;
    GovernmentSpending : TValue;
    InterestRates : TValue;
    IncomeTax : TValue;
    Benefits : TValue;
    TrainingEducationSpending : TValue;
  End;

procedure InitialiseData (var pData : TData);

implementation

procedure InitialiseData (var pData : TData);
begin
  pData := TData.Create;

  pData.EconomicGrowth.SavedValue := 1.00;

end;

end.


行得通




作品

如果这不仅仅是为了示例的目的,您可能需要考虑一个不同的名称,因为TValue是用于扩展RTTI的Delphi 2010中使用的实际数据类型。如果这不仅仅是为了示例的目的,您可能需要考虑一个不同的名称,因为TValue是Delphi2010中用于扩展RTTI的实际数据类型。我将其更改为记录而不是对象,这似乎解决了问题,谢谢@亨德里克森-你的对象方法会起作用的,照克雷格说的做!不要将其设置为记录,只需正确创建对象。如果在初始化中创建,请不要忘记在终结时释放。我将其更改为记录而不是对象,这似乎解决了问题,谢谢@亨德里克森-你的对象方法会起作用的,照克雷格说的做!不要将其作为记录,只需正确创建对象。如果您在初始化中创建,不要忘记在终结时释放。如果您在后期缩进中包含代码,则将其全部缩进4个空格,并将保留格式并添加语法突出显示。只是出于好奇,如果使用此代码,TData对象应该在哪里释放——Unit1或Unit2的代码?它应该在创建它的地方释放。谢谢,Mason。。。告诉我我是否正确:对于Unit1,要释放TData对象,在不同于Button1Click的过程中,vData必须在类级别这样的地方声明,对吗?如果Unit2的InitializeData方法没有将TData参数声明为var,会发生什么?如果在后缩进中包含代码,则将其全部缩进4个空格,并保留格式并添加语法高亮显示。出于好奇,如果使用此代码,TData对象应该在哪里释放——Unit1或Unit2的代码?它应该在创建它的地方释放。谢谢,Mason。。。告诉我我是否正确:对于Unit1,要释放TData对象,在不同于Button1Click的过程中,vData必须在类级别这样的地方声明,对吗?如果Unit2的InitializeData方法没有将TData参数声明为var,会发生什么?