Accéder à des données stockées dans une autre unité Delphi
-
26-09-2019 - |
Question
Dans Unit2 de mon programme j'ai le code suivant:
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;
Je déclare ensuite les données. TData dans le Var
lorsque je tente de faire ce qui suit cependant dans part1:
ShowMessage(FloatToStr(Unit2.Data.Inflation.SavedValue));
Je reçois un message d'EAccessViolation. Est-il possible d'accéder aux données stockées dans « Data » de part1 sans avoir des erreurs?
La solution
Ajouter Data := TData.Create;
à la section initialization
de Unit2, ou changement TData à un enregistrement au lieu d'un objet. Il n'y a rien de mal en soi à l'accès aussi longtemps qu'ils sont correctement initialisés objets globaux de part1 Unit2.
Autres conseils
@ Hendriksen123, vous initialisez la Data
variable avant de l'utiliser? la EAccessViolation
est la classe d'exception pour les erreurs d'accès mémoire invalides, et se produit généralement lorsque votre code tente d'accéder à un objet qui n'a pas créé (initialisé) ou a déjà été détruite.
essayez d'utiliser Data := TData.Create;
et vous pouvez utiliser le Data
var.
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.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Unit2,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
vData : TData;
begin
Unit2.InitialiseData(vData);
ShowMessage(FloatToStr(vData.EconomicGrowth.SavedValue));
end;
end.
qui fonctionne