2012-12-25 5 views
6

में नया फॉर्म बनाते समय पैरामीटर पास करें ठीक है, मुझे खेद है कि यह थोड़ा उलझन में है लेकिन मुझे नहीं पता कि इसे बेहतर तरीके से कैसे समझाया जाए। मेरे पास एक चैट फॉर्म है जो उपयोगकर्ता को पहले TLoginForm में प्रमाणित करने के बाद दिखाया गया है।डेल्फी एसडीआई

उपयोगकर्ता में लॉग इन किया तो chatForm दिखाने:

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

मेरे समस्या, मैं कैसे chatForm को उपयोगकर्ता नाम पारित कर सकते हैं तो मैं यह उपनाम के रूप में चैट में उपयोग कर सकते हैं, इस तथ्य पर विचार है कि फॉर्म स्वतः सर्वर ऑनशो से कनेक्ट होता है, इसलिए मुझे पहले से भेजे गए उपयोगकर्ता नाम की आवश्यकता होगी।

मैं डेल्फी के लिए नया हूं इसलिए यदि मेरे कोड में कोई गलती है, तो कृपया मुझे क्षमा करें।

उत्तर

9

यदि उपयोगकर्ता नाम के पूरे जीवनकाल के दौरान उपयोगकर्ता नाम निर्धारित किया जाना चाहिए तो इसे कन्स्ट्रक्टर में पास किया जाना चाहिए। लाभ यह है कि कक्षा का दुरुपयोग करना और उपयोगकर्ता नाम असाइन करना भूलना संभव नहीं है।

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

मैं कैसे मैं FormCreate प्रक्रिया स्थापित करना चाहिए अपने तरीके से हल करने के लिए, हालांकि कोशिश कर रहा हूँ? इसे प्रक्रिया फॉर्मेटेट पर सेट करना (प्रेषक: टॉब्जेक्ट; कॉन्स उपयोगकर्ता नाम: स्ट्रिंग); यदि मैं ऑनक्रेट – Eduard

+0

ईवेंट को प्रक्रिया को लिंक करने का प्रयास करता हूं तो एक असंगतता देता है, 'ऑनक्रेट' ईवेंट को बिल्कुल सेट न करें। उत्तर में कोड के अनुसार बिल्कुल 'कन्स्ट्रक्टर' का उपयोग करें। –

+0

+1 आईएमएचओ ओपी के सवाल के आधार पर यह बेहतर दृष्टिकोण है। – ComputerSaysNo

4

अपने 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; 

यह तो आप बस नए लोगों को जोड़कर मौजूदा सार्वजनिक तरीकों को बदले बिना जो आप अपने चैट फार्म में चाहते हैं पारित करने के लिए अनुमति देता है।
"के साथ" का उपयोग कर या 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; 
+0

दोनों उत्तरों ने मेरी समस्या हल की, लेकिन मैंने इसे स्वीकार करने के रूप में चिह्नित किया क्योंकि इसने फ़ॉर्म प्रक्रियाओं का उपयोग करने के तरीके के बारे में अपना मन खोला। – Eduard

+1

फ़ंक्शन के लिए सही नाम SetUserName है। और इसके साथ सावधान रहें। यदि आपके फॉर्म में FUserName नामक फ़ील्ड है तो इससे आपको दुःख मिलेगा। यह भी सोचें कि क्या होता है यदि कनेक्शन के बाद SetUserName विधि को कॉल किया जाता है। क्या आप इस तरह के उपयोग का समर्थन करते हैं? –

+0

@ डेविड हेफरन, पूरी तरह से इस बारे में सहमत हैं (यह प्रश्न में था), आम तौर पर मेरे पास उपयोगकर्ता नाम और सार्वजनिक उपयोगकर्ता नामक एक सार्वजनिक संपत्ति होगी, जो एक निजी सेटर होगा, मैं भी उत्तर को सरल रखना चाहता था और पैरामीटर पास करने का प्रदर्शन करता था (FUsername सम्मेलन द्वारा निजी हो और इसलिए केवल कॉलिंग फॉर्म से संबंधित हो) – SteB