2010-04-13 6 views
1

В unit2 моей программы у меня есть следующий код:Доступ к данным, хранящиеся в другом блоке Delphi

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; 

Я тогда декларировать данные: TDATA в Var.

, когда я пытаюсь сделать следующее, однако в группы1:

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

Я получаю сообщение EAccessViolation. Есть ли способ получить доступ к данным, хранящимся в «Данные» из Unit1, без ошибок?

+0

Если это не только для целей, например, вы могли бы хотеть рассмотреть другое имя, а TValue является фактический тип данных, используемый в Delphi 2010 для расширенного RTTI. –

ответ

6

Добавить Data := TData.Create; в раздел Unit12 initialization или изменить TData на запись вместо объекта. Нет ничего неправильного в доступе к глобальным объектам Unit2 из Unit1, если они правильно инициализированы.

+0

Я заменил его на запись вместо объекта, и это, похоже, решило проблему, спасибо! – chendriksen

+0

@ Хендриксен - ваш объектный подход будет работать, просто сделайте то, что сказал Крейг! Не делайте запись, просто создавайте объект. –

+3

Если вы создаете в инициализации, не забудьте освободить ее при завершении. –

1

@ Hendriksen123, вы инициализируете переменную Data перед ее использованием? EAccessViolation является классом исключений для недопустимых ошибок доступа к памяти и обычно возникает, когда ваш код пытается получить доступ к объекту, который не был создан (инициализирован) или уже был уничтожен.

попробуйте использовать Data := TData.Create;

, а затем вы можете использовать Data вар.

0
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. 

Это работает

+1

Если вы включаете код в свой отступ, все это на 4 пробела, и он сохранит форматирование и добавит подсветку синтаксиса. –

+0

Просто из любопытства, если вы использовали этот код, где должен быть освобожден объект TData - код Unit1 или Unit2? –

+0

Он должен быть освобожден там, где он создан. –