سؤال

في Unit2 من برنامجي لدي الرمز التالي:

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 دون الحصول على أخطاء؟

هل كانت مفيدة؟

المحلول

يضيف Data := TData.Create; إلى UNIT2 initialization القسم ، أو تغيير tdata إلى سجل بدلاً من كائن. لا يوجد شيء خاطئ بطبيعته في الوصول إلى الكائنات العالمية لـ Unit2 من Unit1 طالما تم تهيئته بشكل صحيح.

نصائح أخرى

@Hendriksen123 ، هل تقوم بتهيئة المتغير Data قبل استخدامه؟ ال EAccessViolation هو فئة الاستثناء لأخطاء الوصول إلى الذاكرة غير صالحة ، وعادة ما تحدث عندما يحاول الكود الخاص بك الوصول إلى كائن لم يتم إنشاؤه (تهيئته) أو تم تدميره بالفعل.

جرب استخدام Data := TData.Create;

وبعد ذلك يمكنك استخدام 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.

انه يعمل انها تعمل

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top