2009-03-31 24 views
19

Odak noktasını kaybetmeden ana formun üzerinde ikinci bir form göstermeye çalışıyorum.Delphi: Etkinleştirmeden pencereyi göster

ShowWindow(second.handle, SW_SHOWNOACTIVATE)'u denedim, ancak ana form odağı kaybediyor.

kimse bunun için iyi bir reçete var mı ... ben ikinci pencerede Visible := false ayarlarsanız, ShowWindow çağrısı ikinci formu aktif hale gelmez, ama gösterildiğinde pencereler boş?

GÜNCELLEME: Yapmaya çalıştığım şey, belirli bir olayda bir bildirim penceresi gösteriyor. Ana formun herhangi bir zamanda odak noktasını kaybetmemesi çok önemlidir.

+0

Hum ... Düzenlemelerim bitti ... Sanırım daha önce bazı sorunları oldu ...? – Vegar

cevap

24

Kodunuzda yanlış bir şeyler olmalı.

Bu kodu test, çalışır:

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    ShowWindow(Form2.Handle, SW_SHOWNOACTIVATE); 
    Form2.Visible := True; 
end; 

Visible değil Show kullanmak dikkatli olun! Aksi halde SW_SHOWNOACTIVATE'u geçersiz kılar.

+0

Üzgünüm, ama hala aktif :-( – Vegar

+0

Cevabımı değiştirdim ve test ettim :) –

+0

Vay canına, bu harikulade :-) Görünüşe bakılırsa hileler görünürde yanılsamaya izin vermek gibi görünüyor. showwindow() çağrısı. Teşekkürler! – Vegar

2

Pencereden (non modal) göstermek ve MainWindow odağı sıfırlayabilirsiniz.

procedure TMainForm.ButtonClick(Sender: TObject); 
begin 
    OtherForm.Show; 
    SetFocus; 
end; 

üstte diğer formu göstermiyor 2006.

Bu üzerinde test edilmiştir. Ama odak üstünde olmayan bir pencereye sahip olmak çok sezgisel.

+0

Ama bu olay ve datastorage vb tetiklemek için yeterli olurdu ve ben bunu istemiyorum ... – Vegar

+0

örneğin çeşitli şartlar altında bu işe yaramazsa, ana formun bir çocuk şeklinde (düzenleme metin söylemek) çalışıyorsanız ve ana formun bir bildirim açması gerekiyor. Ben (DR en basit bulana kadar size yazarak sürecinde olan artı geri orijinal çocuk odağı ayarlamak sen düzenlemekte oluşturmadığı ana forma geri odak ayarı herhangi bir karakter kaybederler. Bu sorun uzun zamandır aklımdan Bunu düşünmeliydim) düzeltmek. – DeveloperChris

1

Mümkünse ... Ben gerçi Delphi son sürümleri ile bu test ettik geçmiş

SetWindowPos(WindowHandle, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE or SWP_NOSIZE or SWP_NOMOVE); 

bu olmalıdır kullandım aracı ucu çeşit kullanarak kabul Bildirim bilgisini görüntülemek için gösterime girdiğinde veya bir kullanıcı tıkladığında bir araç ipucu sizden ana pencere odağı çalmak olmaz. Düzenli formu, varsayılan olarak bir kenarlık olur ve kullanıcı bu sınırda tıkladığında, ana form odağı kaybedeceksiniz. İşte

Bunu yapmak için bazı temel kodudur. Ucu serbest olduğunda kaybolur; ancak uyku kullanmaktan daha Zamanlayıcı ayarlamak daha iyi olurdu. İşte

with THintWindow.Create(nil) do 
    try 
    ActivateHint(MyRect, 'My Notification'); 
    Sleep(DisplayTime); 
    finally 
    Free; 
    end 
+0

Belki bu gitmek için en kolay yoldur, ancak hintwindow'u basit bir metinden daha fazlasını gösterecek şekilde özelleştirmek zorunda kalırdım ... – Vegar

1

sen:

// you have set your 2nd form as non resizable, without border nor title etc... 
    Form2.Enabled := False; // prevent the 2nd form to grab focus even when clicked 
    SetWindowPos(Form2.Handle, HWND_TOP, 0, 0, 0, 0, SWP_SHOWWINDOW or SWP_NOACTIVATE or SWP_NOSIZE or SWP_NOMOVE); 
    // be sure to hide it automatically when done as it is disabled... 
+0

Bu, Form Görünürünü ayarlamadan gerçekten görünür hale getirir? –

1

Geçmişte bunu, ama (maalesef) son işinde propietary çünkü kod yok.

İyi hatırlıyorsam

, ne yaptığım: istemci sınıfı A'dan

  1. bir prosedürü (veya işlev) aramak herhangi bir sınıf (geleneksel Pascal yöntemi) ait gelmez.
  2. Bu yöntemden, TForm
  3. 'dan kaleme almayan bir B sınıfında bazı yöntemleri çağırın B yöntemindeki yöntemden, bir açılır pencere formu örneği oluşturun, ancak üst öğe veya sahip olmadan; ve örnekte bir yöntem çağırın. örneğinde çağrılacağını yönteme itibaren
  4. , kendisini göstermektedir. (3 aşamasının)

kod böyle bir şey gidebiliriz:

var p: TPopupForm; 
begin 
    p := TPopupForm.Create(nil); 
    p.ShowWindow; 
    p.Release; 
end; 

bu işe yaramazsa üzgünüm, ben de Delphi yok. İkinci formu dinamikoluşturulur kadar

ShowWindow(Form2.Handle, SW_SHOWNOACTIVATE); 
Form2.Visible := True; 

... kadar

0

Daniels kod çalışır. Sonra ikinci formunuz, varsayılan genişlik ve yükseklik ile 0,0 konumunda bulunur. ShowWindow sonraki satır yürütüldüğünde ekrandan kaybolacaktır ikinci formu göreceksiniz yürütüldüğünde kısa bir an için

.

Ben dyamically oluşturulan şeffaf kaplama formu için kod kullanıyorum. Aşağıdaki kod verilen yanıtlar bir kombinasyonudur ve ana form üzerinde aktivasyon olmadan ikinci form yerleştirir.

SetWindowPos(Form2.Handle, HWND_TOP, Left, Top, Width, Height, SWP_NOACTIVATE); 
Form2.Visible := True;