2012-12-25 17 views
6

Ok, przepraszam, jeśli to trochę zagmatwane, ale nie wiem jak to wyjaśnić lepiej. Mam formularz czatu, który jest wyświetlany po uprzednim uwierzytelnieniu użytkownika w TLoginForm.Przekaż parametr podczas tworzenia nowego formularza w delphi SDI

Użytkownik zalogowany następnie pokazać chatForm:

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

Moim problemem jest to, w jaki sposób mogę przekazać nazwę użytkownika do chatForm więc można go używać jako nick na czacie, biorąc pod uwagę fakt, że automatycznie formularz łączy się z serwerem OnShow, więc będę potrzebować już wysłanej nazwy użytkownika.

Jestem nowy dla Delphi, więc jeśli jest jakiś błąd w moim kodzie, proszę bardzo mi wybaczyć.

Odpowiedz

9

Jeśli nazwa użytkownika powinna zostać naprawiona podczas całego okresu istnienia obiektu, powinna zostać przekazana do konstruktora. Zaletą jest to, że nie można nadużywać klasy i zapomnieć o przypisaniu nazwy użytkownika.

stwierdzenie konstruktora, który otrzymuje dodatkowe informacje w parametrach:

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; 

utworzyć formularz tak:

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

Próbuję rozwiązać to na swój sposób, choć, jak mam ustawić procedurę FormCreate? Ustawienie do procedury FormCreate (Sender: TObject, const username: string); zwraca niezgodność, jeśli próbuję połączyć procedurę ze zdarzeniem OnCreate – Eduard

+0

Nie ustawiaj wcale zdarzenia 'OnCreate'. Użyj 'konstruktora' dokładnie tak jak w kodzie w odpowiedzi. –

+0

+1 IMHO jest to lepsze podejście oparte na pytaniu PO. – ComputerSaysNo

4

Dodaj metodę publiczną do 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; 

Pozwala to co chcesz przekazać do swojego Chat formie bez zmiany istniejących metod publicznych poprzez dodanie nowych.
Przykład bez użycia „z” lub FUsername aby rozwiać obawy:

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

Obydwie odpowiedzi rozwiązały mój problem, ale oznaczyłem go jako zaakceptowany, ponieważ otworzyło mi się na więcej sposobów korzystania z procedur formularzy. – Eduard

+1

Poprawną nazwą tej funkcji jest SetUserName. I bądź ostrożny wobec z. To spowoduje smutek, jeśli twój formularz ma pole o nazwie FUserName. Zastanów się również, co się stanie, jeśli ta metoda SetUserName zostanie wywołana po nawiązaniu połączenia. Czy popierasz takie użycie? –

+0

@DavidHeffernan, całkowicie zgadzam się co do z (to było w pytaniu), normalnie miałbym właściwość publiczną o nazwie Username, a SetUsername byłaby prywatną ustawiaczem, chciałem również zachować prostą odpowiedź i zademonstrować przekazywanie parametrów (FUsername would być prywatnym według konwencji i dlatego należy tylko do formularza wywołującego) – SteB

Powiązane problemy