当什么都没发生时,为什么在数据模块中出现acces冲突?

时间:2019-03-17 13:15:03

标签: delphi

我已经制作了一个数据模块和一个按钮。当我将信息发送到数据模块时,即使程序不需要执行任何操作,它也会在程序完成时给出访问冲突。怎么了?我在w8.1上使用Delphi XE。

procedure TForm1.btnCalcClick(Sender: TObject);
var
  ACake: TCake;
begin
  ACake.Diameter:= StrToFloat(edtDiam.Text);
  modMain.Calc(ACake);
end;

这是数据模块单元:

interface

uses
  System.SysUtils, System.Classes, classdef;

type
  TmodMain = class(TDataModule)
  private
    { Private declarations }
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure Calc(ACake: TCake);
  end;

var
  modMain: TmodMain;

implementation

{%CLASSGROUP 'System.Classes.TPersistent'}

{$R *.dfm}

{ TmodMain }

procedure TmodMain.Calc(ACake: TCake);
begin

end;

constructor TmodMain.Create(AOwner: TComponent);
begin
  inherited;

end;

destructor TmodMain.Destroy;
begin

  inherited;
end;

end.

为了阐明我的班级定义单元,我将其张贴在这里。

这是我的classdef单位:

unit classdef;

interface


type
  TCake = class
  private
    FDiameter: Double;
  public
    property Diameter: Double read FDiameter write FDiameter;
  end;

implementation

end.

1 个答案:

答案 0 :(得分:2)

问题在于,您需要先创建一个类实例,然后才能使用它。 在此示例中,我假设您的数据模块已由IDE自动创建。

所以您的代码:

procedure TForm1.btnCalcClick(Sender: TObject);
var
  ACake: TCake;
begin
  ACake.Diameter:= StrToFloat(edtDiam.Text);
  modMain.Calc(ACake);
end;

成为:

procedure TForm1.btnCalcClick(Sender: TObject);
var
  ACake: TCake;
begin
  ACake := TCake.Create; 
  try
   ACake.Diameter:= StrToFloat(edtDiam.Text);
   modMain.Calc(ACake);
  finally
   ACake.Free;
  end; 
end;