2009-05-26 9 views
8

में मेनफॉर्म की ऑनशो घटना से निकासप्रोसेज मेरे पास एक ऐसा एप्लिकेशन है जो स्टार्टअप पर कुछ शर्तों की जांच करता है और मुख्य फॉर्म के ऑनशो ईवेंट में बाहरी प्रोग्राम लॉन्च करता है। समस्या यह है कि यदि बाहरी प्रोग्राम लॉन्च करते समय कोई त्रुटि होती है, तो मैं चाहता हूं कि एप्लिकेशन तुरंत समाप्त हो जाए। लेकिन वहाँ उस के साथ एक मुद्दा में कि EurekaLog मेरी अपवाद लग जाती है और किसी भी तरह Application.Teminate के लिए सभी कॉल और किसी भी अन्य सामान्य बंद तरीकों को नकारने से वहाँ संदेश पाश बाधित है।डेल्फी

तो मेरा प्रश्न यह है कि क्या यह स्थिति मौजूद होने पर तुरंत मेरे आवेदन को समाप्त करने के लिए एक्जिटप्रोसेस सबसे अच्छा मार्ग होगा?

उत्तर

11

समय OnShow करके निकाल दिया गया है, तो आप बहुत दूर कार्यक्रम में निर्धारित करने के लिए है कि आप नहीं है वास्तव में कार्यक्रम चलाना चाहते हैं। आपको जल्द ही यह दृढ़ संकल्प करना चाहिए। OnShow यह तय करने का स्थान नहीं है कि फ़ॉर्म नहीं दिखाना चाहिए।

यह वह चीज है जो आपको मुख्य फॉर्म बनाने से पहले जांचनी चाहिए। अपने चेक को डीपीआर फ़ाइल में रखें, और यदि आप यह निर्धारित करते हैं कि प्रोग्राम नहीं चलाना चाहिए, तो बस exit पर कॉल करें।

begin 
    Application.Initialize; 
    if not ApplicationShouldReallyStart then 
    exit; 
    Application.CreateForm(TMainAppForm, MainAppForm); 
    Application.Run; 
end. 

ApplicationShouldReallyStart के अपने कार्यान्वयन को भरें। (और यह वास्तव में इन-लाइन नहीं डीपीआर फ़ाइल में एक अलग समारोह होना चाहिए, आईडीई अगर begin भ्रमित हो जाता है -।। डीपीआर फ़ाइल में end ब्लॉक बहुत जटिल हो जाता है)

तरफ से

, ExitProcess कॉल नहीं करते । इसके बजाय Halt पर कॉल करें। HaltExitProcess कहता है, लेकिन यह भी इकाई को अंतिम रूप देने वर्गों और अन्य डेल्फी विशेष प्रक्रिया बंद कार्य कहता है।

+0

मैं सहमत हूं। क्यों न सिर्फ डीपीआर से बाहरी कार्यक्रम लॉन्च करने का प्रयास करें, और यदि यह विफल रहता है तो आगे बढ़ें नहीं। इस तरह हल्ट, wmClose या आप क्या है के लिए कोई ज़रूरत नहीं है। – Mihaela

+0

हाँ मुझे लगता है कि मुख्य फॉर्म बनने से पहले मैं शर्त की जांच करूंगा। – yozey

+0

आप दोनों के लिए एक अच्छा और वैध प्रश्न और एक अच्छा और सुरुचिपूर्ण उत्तर +1: पुशर और पॉपपर :) कभी भी ढेर बहती नहीं है! ; P –

1

बेहतर होगा कि तुम खिड़की करने के लिए एक wmClose संदेश भेजें। अन्यथा आपके पास फॉर्म में भेजने के कारण परेशानी में आने का एक बड़ा मौका है।

+2

इस का केवल पतन है कि आवेदन परदे पर संक्षेप में फ्लैश होगा है। फ्लैश से बचने के लिए, पहले फॉर्म ऑफ स्क्रीन को ले जाएं। – skamradt

+0

@skamradt, अच्छा बिंदु। हालांकि मैं उपयोगकर्ता को यह जानने के लिए एक त्रुटि संदेश देना चाहता हूं कि एप्लिकेशन क्यों शुरू नहीं हुआ था। –

0

मैं एक सिद्धांत का परीक्षण करने के लिए एक छोटे से आवेदन लिखा था और यहाँ मैं क्या सुझाव है कि है।

कॉल बंद विधि।

निम्नलिखित उदाहरण इकाई D2009 में कोई त्रुटि के बिना एप्लिकेशन को बंद कर देती है।

unit Unit1; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs; 

type 
    TForm1 = class(TForm) 
    procedure FormShow(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

procedure TForm1.FormShow(Sender: TObject); 
begin 
    close; 
end; 

end. 
+0

मैं करीबी विधि को कॉल नहीं कर सकता क्योंकि अपवाद चुनते समय यूरेकलॉग मुख्य बिंदु को उस बिंदु पर बंद होने से रोकता है और मुख्य रूप अभी भी ऊपर आता है। – yozey

+0

ठीक है तो आप या तो उस अपवाद (प्रकार) को अनदेखा करने या प्रोजेक्ट फ़ाइल में अन्य प्रोग्राम लॉन्च करने के लिए यूरेकलॉग को बता सकते हैं। इसे प्रोजेक्ट फ़ाइल में रखकर आप इसे मुख्य रूप से बनाया गया है, या application.run कमांड से पहले इसे पकड़ सकते हैं। –

2

सिस्टम के साथ के खिलाफ यह नहीं है! आप बस चीजों के बीच में मर नहीं सकते हैं। यदि आप मरना चाहते हैं तो इसे नियमों के भीतर करें - WM_CLOSE या शायद अपनी खुद की दिनचर्या जो कहती है कि यह क्यों मर रहा है और फिर WM_CLOSE भेजता है।

0

जबकि मैं यहां रोब केनेडी से पूरी तरह से सहमत हूं, मैं यह ध्यान रखना चाहता हूं कि आप त्रुटि संवाद व्यवहार को नियंत्रित करने के लिए यूरेकालॉग की दिनचर्या का उपयोग कर सकते हैं। उदाहरण के लिए:

uses 
    ExceptionLog, ECore; 
... 
begin 
    ForceApplicationTermination(tbTerminate); 
    // ... <- Bad code goes there 
end; 

इस तरह, आवेदन सही त्रुटि संवाद दिखाने के बाद बंद कर दिया जाएगा।