2009-03-31 7 views
19

Staram się pokazać drugi formularz nad głównym formularzem bez utraty ostrości.Delphi: Pokaż okno bez aktywacji

Próbowałem ShowWindow(second.handle, SW_SHOWNOACTIVATE), ale mainform traci ostrość. Jeśli ustawię Visible := false w drugim oknie, wywołanie ShowWindow nie aktywuje drugiego formularza, ale okna są puste, gdy pokazano ...

Czy ktoś ma dobry przepis na to?

AKTUALIZACJA: Co próbuję zrobić, pokazuje okno powiadomień na danym wydarzeniu. Ważne jest, aby główna forma nie traciła ostrości w dowolnym momencie.

+0

Hum ... Jedna z moich zmian zniknęła ... Sądzę, że SO miała problemy wcześniej ...? – Vegar

Odpowiedz

24

Coś jest nie tak z Twoim kodem.

testowałem ten kod, to działa:

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

Uważać, aby korzystać Visible, nie Show! W przeciwnym razie zastąpi on SW_SHOWNOACTIVATE.

+0

Przykro mi, ale nadal jest aktywowany :-( – Vegar

+0

Zmodyfikowalem moją odpowiedź i przetestowałem ją :) –

+0

Wow, to jest niesamowite :-) Sztuczki wydają się być widoczne jako fałszywe w wyznaczonym czasie i ustawione na prawdziwe po wywołanie showwindow(). Dzięki! – Vegar

2

Możesz pokazać okno (nie modalne) i zresetować fokus do głównego okna. nie pokazuje inną formę na górze

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

Testowane na 2006

tego produktu. Ale bardzo intuicyjne jest mieć okno na górze, które nie ma ostrości.

+0

Ale to wystarczyłoby do wywołania zdarzeń i przechowywania danych itp., A ja tego nie chcę ... – Vegar

+0

to nie działa w różnych okolicznościach, na przykład jeśli pracujesz (na przykład edytujesz tekst) w formie podrzędnej głównego formularza i główny formularz musi wyskoczyć powiadomienie. tracisz wszystkie znaki, które jesteś w trakcie pisania, a ustawienie fokusu z powrotem do głównej formy nie ustawia fokusu z powrotem do pierwotnego formularza dziecka, w którym edytujesz. Problem ten prześladował mnie przez długi czas, dopóki nie znalazłem prostego DR (Powinienem o tym pomyśleć) naprawić. – DeveloperChris

1

Używałem tego w ubiegłym

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

I nie zostały przetestowane z ostatnimi wersjami Delphi mimo ...

1

Jeśli to możliwe, należy rozważyć przy użyciu jakieś podpowiedzi okno, aby wyświetlić informacje o powiadomieniu. Wskazówka narzędzia nie kradnie fokusu od głównego okna, gdy jest ono wyświetlane lub gdy użytkownik kliknie. Standardowy formularz domyślnie będzie miał ramkę, a jeśli użytkownik kliknie na tę granicę, główny formularz straci ostrość.

Oto podstawowy kod do wykonania tej czynności. Końcówka znika po wywołaniu wolnej; jednak lepiej byłoby ustawić timer niż korzystać ze snu.

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

Być może jest to najłatwiejszy sposób na zrobienie tego, ale musiałbym spersonalizować okno z podpowiedziami, aby pokazywał coś więcej niż zwykły tekst ... – Vegar

1

Tutaj jesteś:

// 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

Czy to sprawia, że ​​jest on rzeczywiście widoczny bez ustawiania widoczności formularza? –

1

Zrobiłem to w przeszłości, ale nie mam kodu, ponieważ był propietary w ostatnim miejscu pracy (przepraszam).

Jeśli dobrze pamiętam, co zrobiłem, było:

  1. od klienta klasy A wywołania procedury (lub funkcja), który nie należy do żadnej klasy (tradycyjną metodą Pascal).
  2. Z tej metody wywołaj metodę w klasie B, która nie dziedziczy po TForm
  3. Z metody w B, utwórz instancję okienka popup P, ale bez rodzica lub właściciela; i wywołaj metodę w instancji.
  4. Z metody wywołanej w instancji, pokaż się.

kod (od kroku 3) mógłby wyglądać następująco:

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

Przepraszam, jeśli ten nie działa, nie mam zbyt Delphi.

0

kod Daniels działa ...

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

Dopóki druga forma jest tworzone dynamicznie. Następnie twój drugi formularz znajduje się w pozycji 0,0 z domyślną szerokością i wysokością.

Przez krótką chwilę, gdy zostanie wykonany ShowWindow, zobaczysz drugi formularz na ekranie, znikający po wykonaniu następnego wiersza.

Używam kodu dla przezroczystego formularza nakładki, który jest tworzony dynamicznie. Poniższy kod jest kombinacją podanych odpowiedzi i umieszcza drugi formularz bez aktywacji nad formularzem nadrzędnym.