Wysuwające się okienko - pozycja Top

0

Witam
Piszę jakąś małą app i tak zastanawiam się jak jest wyliczany Top formy która się wysuwa jako komunikat w antywirusie Avast.
Mam nadzieję, że wiecie o co chodzi. Te okienko z komunikatem w prawym dolnym rogu.

Pomimo, że jak powiekszymy pasek zadań, to i tak te okienko ładnie dopasowywuje się do niego i jest widoczne całe, nie jest zasłonięte przez pasek.

  Form1.Left:=Screen.Width - Form1.Width;
  Form1.Top:=Screen.Height - Form1.Height;

Powyższy kod powoduje ustawienie formy idealnie do Width i Height naszej rozdziałki.
Niestety powoduje to, że część formy jest zasłonięta przez pasek.

Jak zrobić aby forma ustawiała się nad paskiem, czyli dobrze rozpoznawało sobie Height?

0

Oj przepraszam. :) Temat do usunięcia. Jak umieścić aplikacje powyżej Paska Menu START (taskbar)

0

Szybciej:

function TaskBarHeight: integer;
var
  hTB: HWND; // taskbar handle
  TBRect: TRect; // taskbar rectangle
begin
  hTB:= FindWindow('Shell_TrayWnd', '');
  if hTB = 0 then
    Result := 0
  else begin
    GetWindowRect(hTB, TBRect);
    Result := TBRect.Bottom - TBRect.Top;
  end;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  Form1.Left:=Screen.Width - Form1.Width;
  Form1.Top:=Screen.Height - Form1.Height - TaskBarHeight;
end;
0

Jeszcze szybciej:

procedure TForm1.FormCreate(Sender: TObject);
var WorkRect: TRect;
begin
  SystemParametersInfo(SPI_GETWORKAREA, 0, @WorkRect, 0);
  Form1.Left:= WorkRect.Right - Width;
  Form1.Top:= WorkRect.Bottom - Height;
end;

Uff. Zdążyłem przed usunięciem tematu ;)

0

Mgła: przeanalizuj sobie kod programu, ktory będzie dostepny przez siedem dni od ostatniego pobrania, pod tym adresem:
http://www.speedyshare.com/files/26247820/putforward_form.rar - na XP działa ok, a testowalem go też - na nie swoim
komputerze pod Windows 7 i ze wszystkich stron wyjeżdzał ok, tylko nie wtedy gdy pasek startu byl z prawej. Coż, jak w
końcu uciułam na nowy komputer to najpewniej przesiąść się będę musiał na siódemkę, to dokładniej przetestje kod i go
dostosuje do siódemki, bo podejrzewam, że coś źle jest liczone z wymiarami paska zadan. A może ktoś inny to rozgryzie.

0

Olesio, moim skromnym zdaniem, masz talent do komplikowania rzeczy nieskomplikowanych. Przejrzałem źródła Twojego programu tylko pobieżnie, bo analiza kodu nie jest moim ulubionym zajęciem jeżeli chodzi o programowanie. Wolę sam tworzyć kod i .. niech inni się męczą podczas jego analizy ;)

Ja rozwiązałbym problem wysuwania się formularza w ten sposób (oczywiście kod jest odporny na ustawienie paska zadań po prawej stronie):

procedure TForm2.FormCreate(Sender: TObject);
var WorkRect: TRect;
begin
  SystemParametersInfo(SPI_GETWORKAREA, 0, @WorkRect, 0);
  Left:= WorkRect.Right + 1;      {*}
  Show;                           {*}
  Hide;                           {*}
  Left:= WorkRect.Right - Width;
  Top:= WorkRect.Bottom - Height;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  AnimateWindow(Form2.Handle, 500, AW_SLIDE or AW_VER_NEGATIVE);  // 500 - czas w ms
  Form2.Show;   // Show jest tu konieczne
end;

Kod jest krótki i myślę, że niezbyt skomplikowany, ale parę słów komentarza nie zaszkodzi.
Po co są te 3 linijki kodu oznaczone gwiazdkami, które odpowiadają za wyświetlenie poza ekranem i natychmiastowe ukrycie formularza? Właściwie można by się bez nich obejść, ale wówczas podczas pierwszego użycia funkcji AnimateWindow będzie się wysuwał pusty formularz, a wszystkie kontrolki, które się na nim znajdują pokażą się dopiero po zakończeniu animacji. Każda następna animacja jest już ze wszystkimi kontrolkami

Dlaczego po AnimateWindow jest jeszcze Form2.Schow? Bez tego formularz nie reaguje na wszystkie zdarzenia. Można zmienić tekst w Edit, ale nie można wywołać procedury np Click przypisanej do Buttona. Można przesunąć formularz chwytając za belkę tytułową, ale nie można go zamknąć naciskając przycisk "x" w prawym rogu. Formularz niby jest, a jakoby go nie było.

Działanie sprawdzone na Windows XP + Delphi 7, ale powinno działać również w nowszych wersjach

0

@simplex: bo widzisz Ty jak nick wskazuje robisz wszystko simple (keep it simple ;)), a ja jestem olesio i robie
pewnie wszystko tak, że najpierw mówisz "ole!", a później "sio" ;) Faktycznie Twój kod prostszy, ale ja zrobiłem
to co zrobiłem, tak jak potrafiłem - jak widać i pod XP dziala imo uniwersalnie zależnie od położenia paska zadań.

0

A ja zanim coś napiszę na 4p czy w Delphi to najpierw jestem czerwony, a potem bakam. :) Z tą różnicą, że ja sobie loginu nie wymyśliłem. :)
Kod simplexa też może być, ale chodzi o to, aby też pokazać Mgle funkcję.

@olesio, sam pisałeś programik spod Twojego linka? :) Ortografia tam szwankuje. :P

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