在delphi SDI中创建新表单时传递参数

在delphi SDI中创建新表单时传递参数,delphi,parameters,vcl,Delphi,Parameters,Vcl,好的,如果这有点混乱,我很抱歉,但我不知道如何更好地解释它。我有一个聊天表单,在用户之前在TLoginForm中进行了身份验证之后显示 用户登录后显示聊天室表单: with TChatForm.Create(Application) do begin Show; end; 我的问题是,考虑到表单自动连接到服务器OnShow,因此我需要已经发送的用户名,如何将用户名传递给聊天表单,以便在聊天中使用它作为昵称 我是delphi新手,因此如果我的代码中有任何错误,请原谅。如果用户名应该在对象

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

用户登录后显示聊天室表单:

with TChatForm.Create(Application) do
begin
    Show;
end;
我的问题是,考虑到表单自动连接到服务器OnShow,因此我需要已经发送的用户名,如何将用户名传递给聊天表单,以便在聊天中使用它作为昵称


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

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

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

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);

将公共方法添加到chatform

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;

这两个答案都解决了我的问题,但我将这一个标记为已接受,因为它打开了我关于如何更多地使用表单过程的思路。函数的正确名称是SetUserName。而且要当心这辆车。如果你的表单有一个名为FUserName的字段,这将导致你悲伤。还要考虑一下,如果在建立连接后调用SetUserName方法会发生什么。您支持这种用法吗?@DavidHeffernan,完全同意with(这是一个问题),通常我会有一个名为Username的公共属性,SetUsername将是一个私有setter,我还想保持答案的简单性并演示参数传递(FUsername根据约定将是私有的,因此只属于调用表单)由于David的澄清,更改了接受的答案。但仍然非常感谢SteB。我正在尝试用你们的方式解决它,不过,我应该如何设置FormCreate过程?将其设置为过程FormCreate(发送方:TObject;常量用户名:string);如果尝试将过程链接到OnCreate事件,则返回不兼容。根本不设置
OnCreate
事件。完全按照答案中的代码使用
构造函数
。+1根据OP的问题,这是更好的方法。