2012-12-25 10 views
6

これはちょっと混乱していて申し訳ありませんが、私はそれをよりうまく説明する方法はわかりません。ユーザーが以前にTLoginFormで認証した後に表示されるチャットフォームがあります。デルファイSDIで新しいフォームを作成するときにパラメータを渡す

その後、ログインユーザーchatFormを示しています。

with TChatForm.Create(Application) do 
begin 
    Show; 
end; 

私の問題は、私はそのフォームが自動的に事実を考慮すると、チャットでニックネームとして使用することができ、私はchatFormにユーザー名を渡すことができる方法であり、 OnShowサーバーに接続するので、既に送信されたユーザー名が必要になります。

私はデルファイが新しく、私のコードに間違いがあると、親切に私を失礼させます。

答えて

9

オブジェクトの全ライフタイム中にユーザー名を修正する必要がある場合は、そのオブジェクトをコンストラクタに渡す必要があります。メリットは、クラスを誤用してユーザー名を割り当てることを忘れることです。

はパラメータで、余分な情報を受け取るコンストラクタを宣言します。

MyForm := TMyForm.Create(Application, UserName); 
+0

私は手順をFormCreate設定する必要がありますけれども、どのように、あなたの方法それを解決しようとしていますか?これをFormCreate(送信者:TObject; constユーザー名:文字列)プロシージャに設定します。私がイベントにプロシージャをリンクしようとすると、非互換性を返すOnCreate – Eduard

+0

'OnCreate'イベントを一切設定しないでください。答えのコードと全く同じ 'コンストラクタ 'を使います。 –

+0

+1 IMHO OPの質問に基づくより良いアプローチです。 – ComputerSaysNo

4

があなたのchatformにパブリックメソッドを追加します。

type 
    TMyForm = class(TForm) 
    private 
    FUserName: string; 
    public 
    constructor Create(AOwner: TComponent; 
     const UserName: string); 
    end; 

constructor TMyForm.Create(AOwner: TComponent; 
     const UserName: string); 
begin 
    inherited Create(AOwner); 
    FUserName := UserName; 
end; 

は、このようなフォームを作成します。

with TChatForm.Create(Application) do 
begin 
    PassUserName(FUsername); 
    Show; 
end; 

procedure TChatForm.PassUserName(const aUsername: string); 
begin 
    Caption := 'You can now chat: '+ aUsername; 
end; 

これは、あなたは、単に新しいものを追加することによって、既存のパブリックメソッドを変更せずに、あなたのチャットフォームに欲しいものは何でも渡すことができます。懸念に対処するために使用しない
例「と」またはFUsername:

frmChat := TChatForm.Create(Application); 
frmChat.Nickname := aUsername; 
frmChat.Show; 

TChatForm = class(TForm) 
private 
    FUsername : string; 

    procedure SetNickName(const Value: string); 
    function GetNickName: string; 
public 
    property NickName: string read GetNickName write SetNickName; 
end; 

procedure TChatForm.SetNickName(const Value: string); 
begin 
    FUsername := Value; 
end; 
function TChatForm.GetNickName: string; 
begin 
    Result := FUsername; 
end; 
+0

どちらの答えも私の問題を解決しましたが、フォームプロシージャをもっと使い方を気にしていたので、これを受け入れたとマークしました。 – Eduard

+1

関数の正しい名前はSetUserNameです。と一緒に注意してください。あなたのフォームにFUserNameという名前のフィールドがある場合、それはあなたに悲しみを引き起こします。また、接続が確立された後にSetUserNameメソッドが呼び出された場合、どうなるか考えてみてください。そのような使用法をサポートしていますか? –

+0

@DavidHeffernanは完全に同意しています(それは問題でした)、通常私はUsernameとSetUsernameというパブリックプロパティを持っていましたが、プライベートセッターになりました。大会で秘密にして、召喚状にしか属していない) – SteB

関連する問題