[Delphi] Przycisk X (Zamknij)

0

Używam takiego kodu w OnCreate formy:

var hMenuHandle: Integer;
begin
 hMenuHandle := GetSystemMenu(Handle, False);
  if (hMenuHandle <> 0) then
    DeleteMenu(hMenuHandle, SC_CLOSE, MF_BYCOMMAND);

aby mieć przycisk X zamykający formę nieaktywny (enabled=false)

Teraz pytanie:
Jak go teraz z powrotem włączyć z poziomu kodu, aby miał enabled=true ??

0

Spróbuj z AppendMenu() i podaj SC_CLOSE jako Id.

0

Już próbowałem i nie działa

0

Moze sprobuj tak (przy usuwaniu):

var i:integer;
begin
 i:=GetClassLong(handle,GCL_STYLE);
 i:=i or CS_NOCLOSE;
 SetClassLong(handle,GCL_STYLE,i);
 ...

A przy odtwarzaniu:

var i:integer;
begin
 i:=GetClassLong(handle,GCL_STYLE);
 i:=i and not CS_NOCLOSE;
 SetClassLong(handle,GCL_STYLE,i);
 ...

Tylko efekt dopiero widac, gdy np. klikniesz na caption. Musisz jakos zrobic update okna.

0

moze tak...
[Form1 properties] -> borderIcons -> BiSystemMenu := false! to bedzie niewidoczny, true= widoczny:P

0

Musisz jakos zrobic update okna.

Nie wiem jak odświerzyć pasek tytułowy z przyciskami :(

0

Np:

showwindow(handle,SW_HIDE);
showwindow(handle,SW_SHOWDEFAULT);

Oczywiscie po SetClassLong()

0

ShowWindows() does'n work ;(

0

A ja napisalem ShowWindows()? Nie, chodzi o ShowWindow(), bez s na koncu.

0
Twardy napisał(a)

A ja napisalem ShowWindows()? Nie, chodzi o ShowWindow(), bez s na koncu.

Miałem na myśli wersje bez "s" na końcu; nie działa to ;(

0
abcdef napisał(a)
Twardy napisał(a)

A ja napisalem ShowWindows()? Nie, chodzi o ShowWindow(), bez s na koncu.

Miałem na myśli wersje bez "s" na końcu; nie działa to ;(

Jak nie działa jak działa! Thx Twardy :)

0

Jak nie działa jak działa!

Wyłączanie tego buttona działa, ale update okna funkcją ShowWindow nie ;(

0
abcdef napisał(a)

Jak nie działa jak działa!

Wyłączanie tego buttona działa, ale update okna funkcją ShowWindow nie ;(

Oczywiście, że działa, tylko okienko miga trochę jak sie odświeża

Dużo lepsze rozwiązanie:
SendMessage(Handle, WM_NCPAINT, 0, 0);

ładnie odświeża i okno nie miga :)

// abcdef - pokaż kodzik - pewnie robisz coś źle...

0

SendMessage(Handle, WM_NCPAINT, 0, 0);

Tak, teraz działa :) Ale mówię wam, że jak dałem raz ShowWindow to nie działało, jak dałem dwa razy po rząd to dopiero działało :-|

0

Działa, bo sprawdzałem u siebie. BTW: Fajny kodzik Twardy, możesz wrzucić do gotowców.

0

Chcialem dodac, ze sposob z WM_NCPAINT u mnie pod windows 98 nie dziala. A to krotszy zapis obu funkcji (nie potrzebna zmienna):

bez przycisku:

SetClassLong(handle,GCL_STYLE,GetClassLong(handle,GCL_STYLE) or CS_NOCLOSE);

z przyciskiem:

SetClassLong(handle,GCL_STYLE,GetClassLong(handle,GCL_STYLE) and not CS_NOCLOSE);

Dodatkowo w swoim programie antywirusowym zauwazylem, ze on tez wylacza ten przycisk podczas skanowania dysku. Dopiero jak zakonczy to aktywuje, ale widac efekt, bo po zakonczeniu wyskakuje okienko modalne z informacja o skanowaniu i okno glowne staje sie nieaktywne i przez to widac efekt. To to samo co bysmy zrobili tak, zeby bylo widac efekt:

SetClassLong(handle,GCL_STYLE,GetClassLong(handle,GCL_STYLE) and not CS_NOCLOSE);
messagebox(handle,'WORLD','HELLO',mb_ok);

1 użytkowników online, w tym zalogowanych: 0, gości: 1