2015-10-07 47 views
-1

我试图从我创建的对象访问用户名字符串​​,并以不同的形式使用它。Delphi 10 - 如何在两种表单之间共享对象?

我不想重新创建对象,否则用户名字段将被清除。

我怎样才能检索到从第二表格对象的用户名,如果我已经创建,并从第一种形式(其中我做obj.create(sUsername)

设置的用户名我已经尝试过创建一个名为function GetUsername : string到funtion发送结果,但它最终给我一个违规错误的另一种形式?有人可以给我一个基本的例子如何“呼叫”从另一种形式发送到它的OOP的值左右

UPDATE - 对不起,这里是我想要做的一个例子,但我得到一个错误违规,你可以看到我没有释放对象,因为我想保留值对于其他形式:

**First Form :** 
unit SendUsername_u; 

interface 

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

type 
    TForm1 = class(TForm) 
    edtUsername: TEdit; 
    Button1: TButton; 
    btnShowOtherForm: TButton; 
    procedure Button1Click(Sender: TObject); 
    procedure btnShowOtherFormClick(Sender: TObject); 
    private 
    objUsername: Ttest; 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

procedure TForm1.btnShowOtherFormClick(Sender: TObject); 
begin 
    Form1.Hide; 
    form2.show; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
objUsername := Ttest.create(edtUsername.Text); 
end; 

end. 

第二形态:

unit GetUsername_u; 

interface 

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

type 
    TForm2 = class(TForm) 
    btnGetUsername: TButton; 
    procedure btnGetUsernameClick(Sender: TObject); 
    private 
    objUsername: ttest; 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form2: TForm2; 

implementation 

{$R *.dfm} 

procedure TForm2.btnGetUsernameClick(Sender: TObject); 
begin 
    ShowMessage(objUsername.GetUsername); 
end; 

end 

OOP /类:

unit clsUsername; 

interface 

uses 
    SysUtils; 

type 
    Ttest = class(TObject) 

    private 
    fUsername: string; 
    public 

    constructor create(sUsername: string); 
    function GetUsername: string; 
    end; 

implementation 

{ Ttest } 

constructor Ttest.create(sUsername: string); 
begin 
    fUsername := sUsername; 
end; 

function Ttest.GetUsername: string; 
begin 
    Result := fUsername; 
end; 

end. 
+0

显示您尝试过的。 –

+0

通常,如果一个对象(在本例中是一个表单)持有对另一个对象(在本例中是另一个表单)的引用,那么它可以将消息发送到该对象。因此,如果表单A有一个对象发送到表单B并具有对表单B的引用,则表单B可以公开功能来接受该对象并对其执行某些操作。这是所有*非常*一般,但是,因为我们看不到您的代码。 – David

+0

如果两种形式需要访问同一个对象,则应该在一个单独的单元中定义和实例化,这两种形式都可以在其使用条款中引用。请出示相关的代码以获得更具体的建议。 –

回答

3

你需要决定拥有它谁的任何对象。一个对象应该负责对象的生命周期管理 - 这通常是需要该对象的具有最长生命周期的对象。例如,一个主表单将拥有其子表单所需的对象。

该拥有者对象通常应该接着将对象注入该对象需要它的其他依赖对象。

例如:

unit Unit1; 

interface 

uses 
    Windows, SysUtils, Classes, Forms, StdCtrls, Vcl.Controls, Vcl.ExtCtrls; 

type 

    TFoo = class 
    private 
     FBarStr : string; 
    public 
     property Bar : string read FBarStr write FBarStr; 
    end; 

    TForm1 = class(TForm) 
    Button1: TButton; 
    procedure FormCreate(Sender: TObject); 
    procedure FormDestroy(Sender: TObject); 
    procedure Button1Click(Sender: TObject); 
    private 
     FFoo : TFoo; 
    public 
end; 

实现为:

implementation 

{$R *.dfm} 

uses 
    Unit2; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    LForm2 : TForm2; 
begin 
    LForm2 := TForm2.Create(nil); 
    try 
    LForm2.Foo := FFoo; // << Here you are passing a reference to FFoo 
    LForm2.ShowModal; // to your second form 
    finally 
    LForm2.Free; 
    end; 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    FFoo := TFoo.Create; 
    FFoo.Bar := 'bar'; // could be your username, etc... 
end; 

procedure TForm1.FormDestroy(Sender: TObject); 
begin 
    FFoo.Free; 
end; 

这里形式1取TFoo对象,FFoo的所有权的作用。当它创建第二个窗体时,它将第二个窗体传递给它的FFoo对象。

unit Unit2; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, 
    System.Classes, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Unit1, Vcl.StdCtrls; 

type 
    TForm2 = class(TForm) 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
    private 
    FFoo : TFoo; 
    public 
    property Foo : TFoo read FFoo write FFoo; 
    end; 

implementation 

{$R *.dfm} 

procedure TForm2.Button1Click(Sender: TObject); 
begin 
    if Assigned(FFoo) then ShowMessage(FFoo.Bar); 
end; 

end. 
+0

你好,谢谢你的回复我有点困惑,你可以看看我发布的代码,并告诉我我需要从那里修复什么? –

+1

@ChristophervanRooyen上面的答案显示了该做什么。我不能说比这更清楚。 –

+0

我明白了,但是你能否喜欢“修复”我的代码在顶部让它工作? –