7

好的,如果这有点令人困惑,我很抱歉,但我不知道如何更好地解释它。我有一个聊天表单,在用户之前在 TLoginForm 中进行身份验证后显示。

用户登录然后显示chatForm:

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

我的问题是,考虑到表单自动连接到服务器 OnShow 的事实,我如何将用户名传递给 chatForm,以便我可以在聊天中使用它作为昵称,所以我需要已经发送的用户名。

我是delphi新手,所以如果我的代码有任何错误,请原谅。

4

2 回答 2

11

如果用户名应该在对象的整个生命周期内固定,那么它应该被传递给构造函数。好处是不可能滥用类而忘记分配用户名。

声明一个接收参数中额外信息的构造函数:

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;

像这样创建表单:

MyForm := TMyForm.Create(Application, UserName);
于 2012-12-25T18:30:00.367 回答
4

将公共方法添加到您的聊天表单。

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

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

这允许您将任何您想要的内容传递到您的聊天表单中,而无需通过简单地添加新方法来更改现有的公共方法。
不使用“with”或 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;
于 2012-12-25T18:31:50.443 回答