2012-02-13 11 views
6

में एक फॉर्म को नष्ट करने और दूसरे को दिखाने का सही तरीका वर्तमान में मेरे प्रोग्राम में मेरे पास स्टार्टअप फॉर्म और एक मुख्य रूप है। स्टार्टअप फॉर्म दूसरे या दो के लिए दिखाता है।डेल्फी

frmStartup.Destroy; 

    frmMain := TfrmMain.Create(Self); 
    frmMain.Show; 

अभी अगर यह यह करने के लिए सही तरीका क्या है मुझे यकीन है कि नहीं कर रहा हूँ .. यह काम करता है, लेकिन जब application.Terminate(); बुला:

अभी, मैं एक टाइमर में निम्नलिखित कोड है मुझे एक प्रवेश उल्लंघन संदेश प्राप्त होता है, जिससे मेरा मानना ​​है कि मैंने स्टार्टअप फॉर्म के विनाश में कुछ गलत किया है ..

यदि कोई भी जो भी मैं चाहता हूं (गैर-मोडल) करने के लिए सही प्रक्रिया दिखा सकता है बहुत सराहना कीजिए।

अग्रिम धन्यवाद,

संपादित करें:

सभी प्रतिक्रिया के लिए धन्यवाद, मैं बस कोड जोड़कर मेरी पहुँच उल्लंघन ठीक:

Action := caFree; 

frmStartup.formClose विधि में।

+2

frmStartup.Destroy frmStartup.Free या यहाँ तक कि frmStartup.Release FWIW –

+1

है स्व = frmStartup होना चाहिए? –

उत्तर

8

frmStartupApplication.CreateForm का उपयोग न करें। वहां बनाया गया पहला फॉर्म आपके एप्लिकेशन का मुख्य रूप बन जाता है, और यदि यह frmStartup है तो आप Application ज्ञान के बाहर इसे नष्ट कर रहे हैं।

इसके बजाय, (.dpr) फ़ाइल अपनी परियोजना स्रोत में एक सामान्य Form.Create का उपयोग करें:

var 
    frmStartup: TfrmStartup; 

begin 
    Application.Initialize; 
    Application.MainFormOnTaskBar := True; 
    frmStartup := TfrmStartup.Create(nil); // No owner assigned here! 
    frmStartup.Show; 
    frmStartup.Update; 

    Application.CreateForm(TfrmMain, frmMain); // Let Application have this for main form 
    // Delay here if needed 
    frmfrmStartup.Free; 
    Application.Run; 
end. 
+4

प्रक्रिया को यथासंभव कसकर बनाने के लिए, एक विंडोज संदेश को परिभाषित करें और अपने स्टार्टअप फॉर्म में एक संदेश हैंडलर डालें जो संदेश प्राप्त होने पर इसे मुक्त कर देगा। फिर उस संदेश को अपने मुख्य फ़ॉर्म की ऑनशो विधि से भेजें। – SourceMaid

+1

मैं अपने ऐप्स में स्प्लैश स्क्रीन के साथ करता हूं। हालांकि, इस सवाल के दायरे से बाहर जाना प्रतीत होता था। –

1

TFrmMain.Create (स्व) ??? "स्व" क्या है? क्या आप इसे frmStartup के अंदर से कर रहे हैं? यदि ऐसा है, तो नहीं है। TFrmMain.Create (एनआईएल) का प्रयोग करें।

उपयोग frmStartup.Release frmStartup जारी करने के लिए, यदि कोड के सभी आपके द्वारा भेजे गए frmStartup की एक विधि के अंदर है, तो आप विधि के नीचे पर कि लाइन डालने के लिए की जरूरत है।

+0

मेरे वर्तमान समाधान के साथ, TFrmMain.Create (शून्य) मुझे एप्लिकेशन समाप्ति पर एक प्रवेश उल्लंघन देता है ..: / – James

4

आप अपनी स्पलैश स्क्रीन जितनी जल्दी हो सके दिखाना चाहते हैं, तो आदर्श रूप से इसे प्रारंभिक चरण के दौरान किया जाना चाहिए, फिर यह केवल तब गायब हो जाना चाहिए जब मेनफॉर्म लेने के लिए तैयार हो।

है यही तो हम अपने आवेदन जहां हम बारे में स्प्लैश स्क्रीन फिर उसे छोड़ दें जब MainForm फोकस चुरा के रूप में संवाद का पुन: उपयोग में है।

डीपीआर में, आवश्यक VCL/RTL इकाइयों के बाद का उपयोग करता है खंड में जितना संभव हो उच्च:

f_adtDlgAbout in 'f_adtDlgAbout.pas' {frmDlgAbout}, // ASAP to be used as a Splash screen 

इकाई के बारे में (FYI करें, FormStylefsStayOnTop और Position है poScreenCenter है):

unit f_adtDlgAbout; 

[...] 

type 
    TfrmDlgAbout = class(TForm) 

[...] 

procedure TfrmDlgAbout.SplashFormDeactivate(Sender: TObject); 
begin 
    Release; 
end; 

initialization 
    // Use it as a Splash screen 
    with TfrmDlgAbout.Create(nil) do begin 
    AlphaBlend := True; 
    AlphaBlendValue := 208; 
    BorderStyle := bsNone; 
    btnOK.Visible := False; 
    OnDeactivate := SplashFormDeactivate; 
    Show; 
    Update; 
    end; 
end. 
0

मुख्य फॉर्म

पर frmMain सेट करें frmMain पर।FormCreate

frmStartup := TfrmStartup.Create(nil); 
try 
    frmStartup.ShowModal; 
finally 
    frmStartup.Free; 
end;