【问题标题】:Pass parameter when creating a new form in delphi SDI在delphi SDI中创建新表单时传递参数
【发布时间】:2012-12-25 18:25:25
【问题描述】:

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

用户登录后显示chatForm:

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

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

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

【问题讨论】:

    标签: delphi parameters vcl


    【解决方案1】:

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

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

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

    【讨论】:

    • 我正在尝试以您的方式解决它,但是,我应该如何设置 FormCreate 过程?将其设置为过程 FormCreate(Sender: TObject; const username : string);如果我尝试将过程链接到事件 OnCreate,则返回不兼容
    • 不要设置OnCreate 事件。完全按照答案中的代码使用constructor
    • +1 恕我直言,这是基于 OP 问题的更好方法。
    【解决方案2】:

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

    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 将是一个私有设置器,我也想保持答案简单并演示参数传递(FUsername 按照约定是私有的,因此只属于调用表单)
    • 由于大卫的澄清改变了接受的答案。但仍然非常感谢 SteB。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    • 2021-06-07
    相关资源
    最近更新 更多