2012-12-25 11 views
6

Ok, scusa se questo è un po 'confuso ma non so come spiegarlo meglio. Ho un modulo di chat che viene mostrato dopo che l'utente si è autenticato in precedenza in TLoginForm.Parametro di passaggio durante la creazione di un nuovo modulo in delphi SDI

utente loggato mostrano poi la chatForm:

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

Il mio problema è, come posso passare il nome utente per il chatForm modo da poter utilizzare come soprannome nella chat, in considerazione del fatto che la forma automaticamente si connette al server OnShow, quindi avrò bisogno del nome utente già inviato.

Sono nuovo di Delphi quindi se c'è qualche errore nel mio codice, gentilmente scusami.

risposta

9

Se il nome utente deve essere corretto durante l'intero ciclo di vita dell'oggetto, deve essere passato al costruttore. Il vantaggio è che non è possibile abusare della classe e dimenticare di assegnare il nome utente.

dichiarare un costruttore che riceve le informazioni aggiuntive di parametri:

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; 

creare il form in questo modo:

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

che sto cercando di risolvere a modo tuo, anche se, come devo impostare procedura FormCreate? Impostandolo alla procedura FormCreate (Sender: TObject; const username: string); restituisce un'incompatibilità se provo a collegare la procedura all'evento OnCreate – Eduard

+0

Non impostare affatto l'evento 'OnCreate'. Usa un 'costruttore 'esattamente come per il codice nella risposta. –

+0

+1 IMHO questo è l'approccio migliore basato sulla domanda dell'OP. – ComputerSaysNo

4

Aggiungere un metodo pubblico al vostro 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; 

Questo permette di passare quello che volete nella vostra forma Chat senza modificare i metodi pubblici esistenti con la semplice aggiunta di nuovi.
Esempio senza usare "con" o FUsername per affrontare i problemi:

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

Entrambe le risposte hanno risolto il mio problema, ma l'ho contrassegnato come accettato perché mi ha aperto la mente su come utilizzare più le procedure dei moduli. – Eduard

+1

Il nome corretto per la funzione è SetUserName. E stai attento con. Ciò causerà dolore se il tuo modulo ha un campo denominato FUserName. Pensa anche a cosa succede se quel metodo SetUserName viene chiamato dopo che la connessione è stata effettuata. Supporta tale utilizzo? –

+0

@DavidHeffernan, completamente d'accordo con (era nella domanda), normalmente avrei una proprietà pubblica chiamata Username e SetUsername sarebbe un setter privato, volevo anche mantenere la risposta semplice e dimostrare il passaggio dei parametri (FUsername sarebbe essere privato per convenzione e quindi appartenere solo al modulo di chiamata) – SteB

Problemi correlati