重用不同单位的对象属性

时间:2019-06-19 13:32:36

标签: class delphi

我想在另一个单元中重用对象的属性。

在form1上,我已通过调用创建过程初始化了对象。然后,使用设置过程为fUserID分配一个值。现在在下一个窗体Form2上,我想调用getUserID函数以检索在上一个窗体中获得的属性值。

我尝试重新创建对象,但该值丢失了。例如,如果我分配ID 2,则在新单元中调用功能GetUSerID时,如果不重新创建对象,则会产生错误。重新创建对象后,它返回nil。

unit clsUser_U;

interface
type
  TUser = class(TObject)
    private
      FUserID : integer ;
    public
      constructor Create ;
      procedure setUserID(iID : integer) ;
      Function getUserID : Integer ;
    end;

implementation

{ TUser }

constructor TUser.Create;
begin

end;

function TUser.getUserID: Integer;
begin
  Result := FUserID ;
end;

procedure TUser.setUserID(iID: integer);
begin
  FUserID := iID ;
end;

end.

Form1如下:

unit Form1_U;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,
  clsUser_u, form2_u;

type
  TForm1 = class(TForm)
    btnNextForm: TButton;
    procedure FormShow(Sender: TObject);
    procedure btnNextFormClick(Sender: TObject);
  private
    { Private declarations }
    objUser : TUser ;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnNextFormClick(Sender: TObject);
begin
  Form2.ShowModal ;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  objUser := TUser.Create ;
  objUser.setUserID(2);
end;

end.

Form2如下:

unit Form2_U;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,
  clsUser_U;

type
  TForm2 = class(TForm)
    lbl1: TLabel;
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
    objUser : TUser ;
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.FormShow(Sender: TObject);
begin
  lbl1.Caption := inttostr(objUser.getUserID);
end;

end.

Delphi给出了错误访问冲突。 如何延长对象的寿命?

1 个答案:

答案 0 :(得分:0)

您仍然没有显示适当的最小示例,我们可以编译并重现您的问题,但是很清楚您的问题是什么。有两个objUser对象,一个由Form1拥有,另一个由Form2拥有。您想访问Form1Form2中的那个,因此必须引用Form1,类似这样

procedure TForm2.FormShow(Sender: TObject);
begin
  lbl1.Caption := IntToStr(Form1.objUser.getUserID);
end;

当然,这假设objUserForm1中是全局可见的,虽然可能不是,但是您显示的内容不足以让我们知道。另外,Form1必须对Form2可见,但是同样,您也无法充分了解我们是否知道它。这就是为什么您需要尽可能少地向我们展示问题,而又足以让我们准确地再现您的问题。