2012-12-25 17 views
6

Ok, tut mir leid, wenn das ein wenig verwirrend ist, aber ich weiß nicht, wie ich es besser erklären soll. Ich habe ein Chatformular, das angezeigt wird, nachdem sich der Benutzer zuvor in TLoginForm authentifiziert hat.Pass Parameter beim Erstellen eines neuen Formulars in Delphi SDI

angemeldet Benutzer in zeigen dann die chatForm:

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

Mein Problem ist, wie kann ich den Benutzernamen an die chatForm geben, damit ich es als Spitznamen im Chat nutzen können, in Anbetracht der Tatsache, dass das Formular stellt eine Verbindung zum Server OnShow her, daher benötige ich den bereits gesendeten Benutzernamen.

Ich bin neu in Delphi, also, wenn es einen Fehler in meinem Code gibt, bitte entschuldigen Sie mich.

Antwort

9

Wenn der Benutzername während der gesamten Lebensdauer des Objekts festgelegt werden soll, sollte er an den Konstruktor übergeben werden. Der Vorteil ist, dass es nicht möglich ist, die Klasse zu missbrauchen und vergessen, den Benutzernamen zuzuweisen.

Deklarieren Sie einen Konstruktor, der die zusätzlichen Informationen in Parameter erhält:

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; 

Erstellen Sie das Formular wie folgt aus:

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

Ich versuche es auf deine Weise zu lösen, aber wie soll ich Formcreate Verfahren eingestellt? Einstellung auf Prozedur FormCreate (Absender: TObject; const username: string); gibt eine Inkompatibilität zurück, wenn ich versuche, die Prozedur mit dem Ereignis OnCreate – Eduard

+0

zu verknüpfen. Setzen Sie das Ereignis 'OnCreate' überhaupt nicht. Verwenden Sie einen Konstruktor genau nach dem Code in der Antwort. –

+0

+1 IMHO ist dies der bessere Ansatz basierend auf der Frage des OP. – ComputerSaysNo

4

eine öffentliche Methode zu Ihrem chatform hinzufügen.

Damit können Sie, was Sie wollen, in Ihr Chat-Formular übergeben, ohne bestehende öffentliche Methoden zu ändern, indem Sie einfach neue hinzufügen.
Beispiel ohne „mit“ oder FUsername mit Bedenken auszuräumen:

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

Beide Antworten lösten mein Problem, aber ich habe dieses als akzeptiert markiert, weil es meine Gedanken darüber öffnete, wie man Formulare mehr benutzt. – Eduard

+1

Der korrekte Name für die Funktion ist SetUserName. Und sei vorsichtig mit dem. Das wird Ihnen Kummer bereiten, wenn Ihr Formular ein Feld namens FUserName hat. Denken Sie darüber nach, was passiert, wenn diese SetUserName-Methode aufgerufen wird, nachdem die Verbindung hergestellt wurde. Unterstützen Sie diese Verwendung? –

+0

@DavidHeffernan, stimme völlig mit der mit (es war in der Frage), normalerweise hätte ich eine öffentliche Eigenschaft namens Benutzername und SetUsername wäre eine private Setter, ich wollte auch die Antwort einfach halten und demonstrieren Parameter übergeben (FUsername würde durch Konvention privat sein und nur zu dem aufrufenden Formular gehören) – SteB

Verwandte Themen