Zugreifen auf in einer anderen Einheit gespeicherten Daten Delphi
-
26-09-2019 - |
Frage
In Unit2 meines Programms ich den folgenden Code haben:
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;
ich dann erklären Daten:. TData im Var
Wenn ich versuche, das folgende jedoch in Unit1 zu tun:
ShowMessage(FloatToStr(Unit2.Data.Inflation.SavedValue));
ich eine EAccessViolation Meldung. Gibt es eine Möglichkeit, die Daten in ‚Daten‘ gespeichert zuzugreifen Unit1 ohne Fehler zu bekommen?
Lösung
In Data := TData.Create;
zu initialization
Bereich von Unit2 oder Änderung TData auf einen Datensatz anstelle eines Objekts. Es ist nichts falsch mit Unit2 der globalen Objekte von Unit1 Zugriff, solange sie richtig initialisiert sind.
Andere Tipps
@ Hendriksen123, haben Sie die Variable Data
initialisieren, bevor es zu benutzen? die EAccessViolation
ist die Exception-Klasse für ungültige Speicherzugriffsfehler, und in der Regel tritt auf, wenn der Code versucht, auf ein Objekt zuzugreifen, die nicht erstellt (initialisiert) haben oder bereits zerstört worden.
versuchen Data := TData.Create;
mit
und dann können Sie die Data
var verwenden.
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.
Das Arbeiten