2009-01-21 12 views
10

Ana arka plan formunun bulunduğu bir uygulamam var, oradan da kullanıcı yalnızca sistemin farklı bölümlerini koruyan modal olmayan formlar olabilir.Delphi, yalnızca özel form için bir form modeli yapmak mümkün mü?

procedure TfmMaterialsPlanning.CreateParams(var Params: TCreateParams); 
begin 
    inherited; 
    //create a new window on the task bar when this form is created 
    Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW; 
end; 

Aslında, bir kullanıcı, 'Elma' olmayan başka kalıcı tutar olmayan bir kalıcı form açabilirsiniz: Her biri başlangıç ​​görev çubuğunda bir düğme görüntüler böylece olmayan kalıcı formları CreateParams yöntemini geçersiz kılar 'Portakalları' koruyan form ve iki arasında kolayca geçiş yapmak için başlangıç ​​menü çubuğunu kullanın. Bununla birlikte, eğer 'Elmalar' formundan bir modal form açarlarsa, ör. seçenekler, tercihler vb. ayarlamak için, modal formları kapatana kadar 'Portakal' formlarını kullanamazlar.

Yalnızca ana form için kalıcı form modeli yapmak mümkün mü? Yani Apple'ın seçenekler formunu açarlarsa, Elmalar bakım formunu kullanamazlar, ancak Portakallar bakım formunu kullanabilirler mi?

Teşekkür

cevap

0

onun alt form açıkken odağı kabul etmesini "Elmalar" formunu önleyerek aynı etkiyi elde edilemedi?

-2

Modal olmayan formları kendi iş parçacığına oluşturursanız, bu mümkündür. Her bir modal form daha sonra ait olduğu parçayı bloke edecektir.

Düzenleme: Bu, vcl iş parçacığı güvenli olmamasına rağmen mümkün olmalıdır. Sonra ayrı bir iş parçacığı yaşayan bir dll içine yerleştirmelidir formların bir takım varsa, Yani

paketleri olmadan derlemek ve kullanmak: bu yapılabilir nasıl Alexeys explanation bakmak Lütfen! Çalışır ve iplik güvenli olacaktır.

+0

VCL kullanıldığında yapılması imkansız, GUI öğeleri kullanırken yalnızca bir iş parçacığı ile kullanılabilir. – mghie

+0

Doğru, ancak sonra her DLL, tüm VCL ve kendi Uygulama nesnesinin kendi kopyasına sahiptir. IMO, bu ilk etapta farklı yürütülebilirler ile gitmekten daha iyidir. – mghie

+0

Şimdi Robo'nun neden böyle bir şey istediğini bilmiyorum. O mümkün olup olmadığını sorar ve ben öyle olduğunu söylüyorum. Yanlış olduğunu söylüyorsun, diyorsun ... – Vegar

6

Eğer TCustomForm.ShowModal (kaynak koduna bir göz) Eğer VCL kalıcı diyaloglar gösteren Windows API çağrısı kullanmadığını görürsünüz, ancak bunun yerine tüm diğer formları devre dışı olmadığını varsa Modal form gösterilirken uygulama. Tabii ki aynı şeyi deneyebilirsiniz, sadece form-modal diyalogu göster(), sonra ebeveyni devre dışı bırakın, ardından form-modal diyaloğu kapatıldıktan sonra yeniden etkinleştirin. Form-modal diyalogları, tekrar etkinleştirilmesi gereken formları takip ettiğiniz merkezi bir yer olması gerekir. Bununla birlikte, kodun, uygulamaları en aza indirirken, uygulamalar arasında ileri ve geri geçiş yaparken bile, gerçekten yapmak istediğiniz şeyi yapıp yapmadığını iyice test etmelisiniz.

Bunu söyledikten sonra - bunun hiç de iyi bir fikir olduğunu düşünmüyorum. Bir Windows kullanıcısının uygulamaların davranışı hakkında yaptığı tüm varsayımları kırar. Mac OS X'in aksine, uygulama-modal ve form-modal diyaloglar arasında Windows'da bir ayrım yoktur ve sizin programladığınız platforma uygun davranışa bağlı kalmalısınız.

Büyük olasılıkla kullanıcı arabiriminizi yapılandırmanın daha iyi bir yolu vardır. "Windows Kullanıcı Deneyimi Etkileşim Kuralları" nda dialog boxes için ilgili sayfaya bakın. Modal diyaloglar mümkün olduğunca kaçınılmalıdır, bağlantılı kılavuzlar birçok kullanım örneği için daha iyi alternatifler gösterir. Modal diyalogların kullanımını sınırlarsanız, belki de form-modal diyaloğa ihtiyacınız yoktur.

+1

Kullanıcı iki görev çubuğu düğmesine sahipse, UI yönergelerinin içinde, bu iki pencereden biri tarafından gösterilen kalıcı bir iletişim kutusunun diğer pencereyi engellemediği mükemmeldir. İki görev çubuğu düğmesinin aynı işlem tarafından barındırıldığı gerçeği, kullanıcıyla ilgisizdir. Her iki pencereyi de uygunsuz bir şekilde engelleyen bir iletişim kutusunun olduğunu iddia ediyorum. Her neyse, Daniel işe yarayan bir çözüme bağlanıyor. –

0

Tıpkı bir kenara (korkunç bir iş olsa da), bu soruna başka bir yaklaşım, Google'ın kromunun gitme şeklidir, her "sekme" ayrı bir işlemdir, ancak kullanıcıya tek bir entegre olarak görünür. uygulama.

Bu yaklaşım istediğiniz şeyi elde etse de, yukarıdaki yorumla, bunun, kullanıcı davranışları hakkındaki kullanıcı varsayımlarını ve beklentilerini bozacağını kabul etmek zorundayım.

3

Bu mesaj ihtiyaçlarınızı Tamamladılar için güzel bir hile vardır: http://blogs.teamb.com/deepakshenoy/2006/08/21/26864

özeti kalıcı bir pencere onu devre dışı zaman istediğiniz nonmodal pencereyi yeniden etkinleştirmek etmektir.

+0

Harika çalışıyor! Muhtemelen bazı ekstra mantık eklemek için iyi bir fikir, bu nedenle form, kendi başına kalıcı bir iletişim kutusu gösterdiğinde kendisine "WM_REENABLED" göndermiyor. –

İlgili konular