2011-03-22 8 views
5

संक्षेपण करता है बस के रूप में:उसके मालिक प्रपत्र के शीर्ष पर एक मॉडल फार्म दिखाने के लिए कैसे (उसके मालिक fsStayOnTop या नहीं करने के लिए सेट किया जाता है), TOpenDialog

कृपया क्रेग और Sertac से नीचे उपयोगी टिप्पणियों को देखने।

============================================== ========

जैसा कि निम्न न्यूनतम कोड में दिखाया गया है, TForm10fsStayOnTop होने के लिए सेट है। TForm10.btnTryDlgClick कॉल dlgOpen1.Execute, और दिखाया गया संवाद अपेक्षित है। हालांकि, जब मैं को TForm10.btnTryFormClick के अंदर कॉल करता हूं, तो फॉर्म TForm10 के पीछे छिपा हुआ है। मैं सोच रहा हूं कि इस व्यवहार को कैसे समझें, और क्यों मानक TOpenDialog अपेक्षित के रूप में दिखाया जा सकता है? किसी भी टिप्पणी की सराहना की है!

पीएस: एक वर्कअराउंड TForm11 की CreateParams प्रक्रिया को ओवरराइड करना है, और Params.wndParent को 0 पर सेट करना है, लेकिन मुझे लगता है कि इस वर्कअराउंड का उपयोग करके विंडो पदानुक्रम तोड़ दिया जाएगा।

procedure TForm11.CreateParams(var Params: TCreateParams); // override; 
    begin 
    inherited; 
    params.wndParent := 0; 
    end; 

पुनश्च: एक और वैकल्पिक हल पृष्ठों अतः नीचे प्रासंगिक में रेमी द्वारा उल्लेख किया गया है: setting the modal Form's PopupParent property to be the StayOnTop Form। लेकिन बाद की टिप्पणियों में, सर्टैक ने उल्लेख किया कि इस कामकाज में खिड़की पदानुक्रम भी टूट जाएगा।

पुनश्च: संभवतः प्रासंगिक अतः पृष्ठों:
Modal forms hidden by fsStayOnTop forms
How Can I Keep the FindDialog from Staying on Top (Delphi)?
How to make sure a dialog is always front of the main window
Form is hidden behind other forms when ShowModal is called
Make 2 forms able to overlap each other?
Multiple form Delphi applications and dialogs
Newly created modal window loses focus and become inacessible in Windows Vista
Delphi - How to prevent Forms/MsgBoxes to move under prior form?
How to allow Delphi secondary forms behind the main form
Unit10 के लिएFake modal dialog using Show?
Delphi MainFormOnTaskBar Modal windows bug

स्रोत:

unit Unit10; 

    interface 

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

    type 
     TForm10 = class(TForm) 
     btnTryDlg: TButton; 
     dlgOpen1: TOpenDialog; 
     btnTryForm: TButton; 
     procedure FormCreate(Sender: TObject); 
     procedure btnTryDlgClick(Sender: TObject); 
     procedure btnTryFormClick(Sender: TObject); 
     end; 

    var 
     Form10: TForm10; 

    implementation 

    {$R *.dfm} 

    uses 
     Unit11; 

    procedure TForm10.FormCreate(Sender: TObject); 
    begin 
     FormStyle := fsStayOnTop; 
    end; 

    procedure TForm10.btnTryDlgClick(Sender: TObject); 
    begin 
     dlgOpen1.Execute; 
    // dlgOpen1.Execute(Self.Handle); 
    end; 

    procedure TForm10.btnTryFormClick(Sender: TObject); 
    begin 
     TForm11.Create(Self).ShowModal; 
    end; 

    end. 

Unit10 के लिए DFM: Unit11 के लिए

object Form10: TForm10 
     Left = 0 
     Top = 0 
     Caption = 'Form10' 
     ClientHeight = 255 
     ClientWidth = 414 
     Color = clBtnFace 
     Font.Charset = DEFAULT_CHARSET 
     Font.Color = clWindowText 
     Font.Height = -11 
     Font.Name = 'Tahoma' 
     Font.Style = [] 
     OldCreateOrder = False 
     OnCreate = FormCreate 
     PixelsPerInch = 96 
     TextHeight = 13 
     object btnTryDlg: TButton 
     Left = 32 
     Top = 24 
     Width = 153 
     Height = 201 
     Caption = 'Try dialog' 
     TabOrder = 0 
     OnClick = btnTryDlgClick 
     end 
     object btnTryForm: TButton 
     Left = 224 
     Top = 24 
     Width = 153 
     Height = 201 
     Caption = 'btnTryForm' 
     TabOrder = 1 
     OnClick = btnTryFormClick 
     end 
     object dlgOpen1: TOpenDialog 
     Left = 96 
     Top = 168 
     end 
    end 

स्रोत:

unit Unit11; 

    interface 

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

    type 
     TForm11 = class(TForm) 
     end; 


    implementation 

    {$R *.dfm} 

    end. 

Unit11 के लिए DFM:

0,123,
object Form11: TForm11 
     Left = 0 
     Top = 0 
     Caption = 'Form11' 
     ClientHeight = 183 
     ClientWidth = 203 
     Color = clBtnFace 
     Font.Charset = DEFAULT_CHARSET 
     Font.Color = clWindowText 
     Font.Height = -11 
     Font.Name = 'Tahoma' 
     Font.Style = [] 
     OldCreateOrder = False 
     PixelsPerInch = 96 
     TextHeight = 13 
    end 
+1

Xichen - [प्रश्न जो आप देखें] (http://stackoverflow.com/questions/3408594/modal-forms-hidden-by-fsstayontop-forms) अलग है कि एक मॉडल प्रारूप 'fsNormal' से लॉन्च किया गया है फॉर्म में एक और 'fsStayOnTop' फॉर्म है जबकि फॉर्म।उस प्रश्न में यदि आप ऑन-टॉप फॉर्म के रूप में मोडल फॉर्म के पॉपअपपैंट को सेट करते हैं तो यह स्पष्ट रूप से ऑन-टॉप फॉर्म के स्वामित्व में होगा, लेकिन इसे उस फॉर्म के स्वामित्व में होना चाहिए जिसे इसे एप्लिकेशन डिज़ाइन के अनुसार लॉन्च किया गया था। पदानुक्रम तोड़कर मेरा यही मतलब था। –

+2

बीटीडब्लू, मैंने प्रतिलिपि आपके कोड को चिपकाया है और समस्या को डुप्लिकेट नहीं कर सकता है, जब मैं btnTryForm पर क्लिक करता हूं तो मोडल फॉर्म फॉर्म 10 से ऊपर है। लिंक संग्रह (शोध) के लिए +1 हालांकि .. –

+0

@Sertac: 'विंडो पदानुक्रम' के बारे में आपके समय और सहायक टिप्पणियों के लिए बहुत बहुत धन्यवाद! वर्तमान प्रश्न के बारे में, मुझे खेद है कि इसे पुन: उत्पन्न नहीं किया जा सकता है। "यह मेरी मशीन पर काम करता है ..." अनुसंधान प्रयास के लिए ओ_ओ – SOUser

उत्तर

3

मोडल फॉर्म की पॉपअपपेरेंट संपत्ति सेट करें, ठीक उसी तरह रेमी सुझाए गए। वह StayOnTop रूप में संवाद को अभिभावक करेगा, जो संवाद की निष्पादन विधि पहले से ही कर रही है। मुझे यकीन नहीं है कि सर्टैक की टिप्पणियां कहां से आ रही हैं, लेकिन पॉपअपपैरेंट का उपयोग करके खिड़की विरासत सही ढंग से सेट करता है, इसलिए संवाद हमेशा StayOnTop रूप से ऊपर होगा।

+0

@ क्रेग: आपके सुझाव के लिए बहुत बहुत धन्यवाद! क्या आपका मतलब है कि ऐसी परिस्थितियों में पॉपअप पेरेंट का उपयोग करना सबसे अच्छा अभ्यास है? क्या आप पुष्टि करने में मदद कर सकते हैं? क्या आप इस बात पर टिप्पणी करने में भी मदद कर सकते हैं कि 'विंडो पदानुक्रम' सही तरीके से संरक्षित है या नहीं? – SOUser

+0

@ क्रैग: इसके अलावा, यदि पॉपअपपैरेंट का उपयोग करना ऐसी परिस्थितियों में सबसे अच्छा अभ्यास है, तो क्या आप टिप्पणी करने में मदद कर सकते हैं कि मानक संवाद, जैसे प्रश्न की शुरुआत में उल्लिखित TOpenDialog, कार्यक्षमता प्राप्त करने के लिए पॉपअपपैरेंट का भी उपयोग करते हैं? या उनके अपने तरीके हैं? – SOUser

+2

यदि आप एक विशिष्ट रूप से हमेशा एक विशिष्ट संवाद के ऊपर दिखने के लिए एक विशिष्ट संवाद चाहते हैं तो हाँ, पॉपअपपेरेंट संपत्ति सेट करें। यही वह है जो इसके लिए है। आप * आमतौर पर * एप्लिकेशन 'मॉडलपॉपअप मोड' को 'pmAuto' पर सेट कर सकते हैं और डेल्फी आपके लिए सब कुछ संभाल लेंगे। जब यह सेट हो जाता है तो संवाद को 'एप्लिकेशन। हैंडल'' के बजाए वर्तमान में सक्रिय रूप (आमतौर पर 'एप्लिकेशन। मेनफॉर्म') पर अभिभावित किया जाएगा, जो इसे मुख्य रूप के पीछे फंसने से रोकता है। वह मामला जहां यह काम नहीं करेगा, जब आपके पास fsStayOnTop फॉर्म है जो सक्रिय नहीं है, तो इस मामले में संवाद इसके पीछे दिखाई देगा। –

संबंधित मुद्दे

 संबंधित मुद्दे