2012-01-19 11 views
7

मेरे पास एक प्रोजेक्ट है जिसमें मुख्य रूप और कुछ अन्य रूप हैं। जब ऐप लोड होता है तो उसे कुछ कार्य करने की आवश्यकता होती है और परिणाम मुख्य रूप के शीर्ष पर एक मॉडल प्रारूप में दिखाते हैं। मेरी समस्या यह है कि यदि मैं कार्यों को करने/बनाने के लिए फ़ंक्शन पर कॉल डालता हूं और मुख्य रूपों पर मोडल फॉर्म दिखाता हूं तो मोडल फॉर्म प्रकट होता है लेकिन मुख्य रूप तब तक नहीं होता जब तक कि मोडल फॉर्म बंद न हो जाए, यही वह है जो मैं होने की उम्मीद करता हूं। इसका मुकाबला करने के लिए मैंने मुख्य रूप में एक टाइमर जोड़ा है और इसे मुख्य रूपों ऑनशो ईवेंट पर शुरू किया है, टाइमर कार्य को करने/मोड बनाने और मोडल फॉर्म दिखाने के लिए फ़ंक्शन को कॉल करता है। तो अब मुख्य रूप मोडल फॉर्म से पहले प्रकट होता है।डेल्फी ऑनशो मुख्य रूप/मोडल फॉर्म

हालांकि मैं इसे सबसे अच्छा समाधान नहीं देख सकता और सोच रहा था कि कोई बेहतर प्रदर्शन कर सकता है या नहीं।

मैं डेल्फी 7

कॉलिन उपयोग कर रहा हूँ

+1

पोस्टमेसेज का उपयोग करें। http://stackoverflow.com/questions/7094873/visibility-of-form-in-delphi – SimaWB

+0

ऑफ-विषय के लिए खेद है कि यह प्रश्न मुख्य प्रश्न सूची में "धुंधला" क्यों दिखाता है? – kobik

+0

@ कोबिक: AFAIK प्रश्नों को मंद किया गया है जब उनके पास एक टैग है जिसे आप अनदेखा करते हैं, और जब उनके पास नकारात्मक वोट स्कोर होता है जो एक निश्चित सीमा से परे होता है। मेटा साइट पर एसओ कार्यों के बेहतर तरीके से पूछे जाने वाले तरीके के बारे में बीटीडब्ल्यू प्रश्न (मुख्य नेविगेशन में लिंक देखें)। –

उत्तर

9

एक आमतौर पर इस्तेमाल किया विकल्प अपने आप को प्रपत्र की OnShow में संदेश पोस्ट करने के लिए है। इस तरह:

const 
    WM_SHOWMYOTHERFORM = WM_USER + 0; 

type 
    TMyMainForm = class(TForm) 
    procedure FormShow(Sender: TObject); 
    protected 
    procedure WMShowMyOtherForm(var Message: TMessage); message WM_SHOWMYOTHERFORM; 
    end; 

... 


procedure TMyMainForm.FormShow(Sender: TObject); 
begin 
    PostMessage(Handle, WM_SHOWMYOTHERFORM, 0, 0); 
end; 

procedure TMyMainForm.WMShowMyOtherForm(var Message: TMessage); 
begin 
    inherited; 
    with TMyOtherForm.Create(nil) do begin 
    try 
     ShowModal; 
    finally 
     Free; 
    end; 
    end; 
end; 
+2

हालांकि यह समाधान के लिए सही विचार है, लेकिन इसका दिखाया गया कार्यान्वयन इतना अच्छा नहीं है। :) कस्टम संदेश का उपयोग करें, और पूरे WndProc को बदलने के बजाय उस विशिष्ट संदेश के लिए एक हैंडलर लागू करें। फॉर्म के प्रकार की घोषणा से पहले अपना कस्टम संदेश घोषित करें, और 'प्रक्रिया UMShowMyOtherForm (var संदेश: TMessage) जोड़ें; संदेश UM_SHOWMYOTHERFORM; '। फिर एकमात्र चीज जो 'WndProc' के सामान्य प्रवाह को बाधित करती है वह आपका कस्टम संदेश है। –

+0

@ केन सच है कि। मुझे रनटाइम –

+0

पर आवंटित संदेश आईडी को संभालने के लिए उपयोग किया जाता है, इस तरह मैंने इसे संभालने से पहले, इसलिए मैं इसे इस तरह से कर रहा हूं क्योंकि यह काम करता है। कुछ तकनीकी विवरण अच्छे होंगे, अगर आपके पास है। –

2

आप इस तरह के MainForm OnActivate ईवेंट का उपयोग क्यों नहीं करते?

procedure TMyMainForm.FormActivate(Sender: TObject); 
begin 
    //Only execute this event once ... 
    OnActivate := nil; 

    //and then using the code David Heffernan offered ... 
    with TMyOtherForm.Create(nil) do begin 
    try 
     ShowModal; 
    finally 
     Free; 
    end; 
end; 

घटना को शून्य पर सेट करना यह सुनिश्चित करेगा कि यह कोड केवल स्टार्टअप पर ही चलाया जाएगा।

0

OnShow ईवेंट को Windows API फ़ंक्शन ShowWindow पर कॉल करने से ठीक पहले निकाल दिया गया है। यह ShowWindow पर यह कॉल है जो वास्तव में स्क्रीन पर दिखाई देने वाली विंडो में परिणाम देता है।

तो आपको ShowWindow पर कॉल के तुरंत बाद चलाने के लिए कुछ चाहिए। यह पता चला है कि वीसीएल कोड जो यह सब ड्राइव करता है TCustomForm संदेश हैंडलर CM_SHOWINGCHANGED के लिए है। वह संदेश हैंडलर OnShow ईवेंट चलाता है और फिर ShowWindow पर कॉल करता है। इसलिए CM_SHOWINGCHANGED रनों के लिए हैंडलर के तुरंत बाद अपना मोडल फॉर्म दिखाना एक उत्कृष्ट समाधान है। इस तरह:

type 
    TMyMainForm = class(TForm) 
    private 
    FMyOtherFormHasBeenShown: Boolean; 
    protected 
    procedure CMShowingChanged(var Message: TMessage); message CM_SHOWINGCHANGED; 
    end; 

..... 

procedure TMyMainForm.CMShowingChanged(var Message: TMessage); 
begin 
    inherited; 
    if Showing and not FMyOtherFormHasBeenShown then begin 
    FMyOtherFormHasBeenShown := True; 
    with TMyOtherForm.Create(nil) do begin 
     try 
     ShowModal; 
     finally 
     Free; 
     end; 
    end; 
    end; 
end; 
संबंधित मुद्दे