2012-12-25 33 views
6

Ok, tôi xin lỗi nếu điều này có chút rắc rối nhưng tôi không biết cách giải thích nó tốt hơn. Tôi có một hình thức trò chuyện được hiển thị sau khi người dùng đã xác thực trước đó trong TLoginForm.Truyền tham số khi tạo một biểu mẫu mới trong delphi SDI

tài khoản đăng nhập sau đó hiển thị các chatForm:

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

Vấn đề của tôi là, làm thế nào tôi có thể vượt qua các tên người dùng để các chatForm vì vậy tôi có thể sử dụng nó như là nickname trong chat, xem xét thực tế rằng hình thức tự động kết nối với máy chủ OnShow, vì vậy tôi sẽ cần tên người dùng đã gửi.

Tôi mới đến delphi nên nếu có bất kỳ sai sót nào trong mã của tôi, vui lòng tha thứ cho tôi.

Trả lời

9

Nếu tên người dùng phải được sửa trong suốt toàn bộ thời gian tồn tại của đối tượng thì nó sẽ được chuyển vào hàm tạo. Lợi ích là không thể lạm dụng lớp học và quên gán tên người dùng.

Khai báo một constructor đó nhận được thông tin thêm về các thông số:

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; 

Tạo các hình thức như thế này:

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

tôi đang cố gắng để giải quyết nó theo cách của bạn, tuy nhiên, làm thế nào tôi nên thiết lập thủ tục FormCreate? Đặt nó thành thủ tục FormCreate (Tên người gửi: TObject; const username: string); trả về sự không tương thích nếu tôi cố gắng liên kết quy trình với sự kiện OnCreate – Eduard

+0

Không đặt sự kiện 'OnCreate'. Sử dụng một 'constructor' đúng theo mã trong câu trả lời. –

+0

+1 IMHO đây là cách tiếp cận tốt hơn dựa trên câu hỏi của OP. – ComputerSaysNo

4

Thêm một phương pháp nào để chatform của bạn.

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

procedure TChatForm.PassUserName(const aUsername: string); 
begin 
    Caption := 'You can now chat: '+ aUsername; 
end; 

Điều này cho phép bạn chuyển bất kỳ thứ gì bạn muốn vào Biểu mẫu trò chuyện mà không thay đổi phương thức công khai hiện có bằng cách thêm các phương thức công khai mới.
Ví dụ mà không sử dụng "với" hoặc FUsername để giải quyết mối quan tâm:

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

Cả hai câu trả lời đều giải quyết được vấn đề của tôi, nhưng tôi đã đánh dấu câu trả lời này là đã được chấp nhận vì nó mở đầu cho tôi về cách sử dụng thủ tục biểu mẫu nhiều hơn. – Eduard

+1

Tên chính xác cho hàm này là SetUserName. Và hãy cẩn thận với. Điều đó sẽ khiến bạn đau buồn nếu biểu mẫu của bạn có một trường có tên FUserName. Ngoài ra hãy nghĩ điều gì sẽ xảy ra nếu phương thức SetUserName đó được gọi sau khi kết nối đã được thực hiện. Bạn có hỗ trợ việc sử dụng như vậy không? –

+0

@DavidHeffernan, hoàn toàn đồng ý với (có trong câu hỏi), thông thường tôi có một tài sản công cộng có tên là Username và SetUsername sẽ là một setter riêng, tôi cũng muốn giữ câu trả lời đơn giản và chứng minh thông số (FUsername sẽ được cá nhân theo quy ước & vì vậy chỉ thuộc về biểu mẫu gọi điện thoại) – SteB

Các vấn đề liên quan