2015-10-07 31 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

我明白了,但是你能否喜歡「修復」我的代碼在頂部讓它工作? –