Forma z popup-u nie wychodząca poza ekran

0

Mam jakąś listę, na niej popup menu.
Z tego popup-u wywołuję nowe okno z pozycją left = 0 top = 0 od aktualnej pozycji kursora myszy.
Jednak jeśli lista jest zbyt blisko prawej krawędzi monitora lub blisko paska zadań takie położenie tej nowej formy powoduje że jest "ucięta" lub wręcz niewidoczna.
Oczywiście, mogę to sprawdzić i narysować to okno w innym miejscu - to nie problem chociaż kilka linijek kodu trzeba napisać.

Tutaj pytanie (nie śmiać się) być może do działu Newbie, jest jakiś przełącznik czy coś innego co zadba o prawidłowe położenie takiego okna?

2

Kiedy pisałem swój system komponentów, jako alternatywy dla LCL, miałem ten sam ”problem”, jeśli chodzi o wyświetlanie customowych hintów. Zadbanie o wyświetlanie okna w całości wewnątrz danego ekranu to dosłownie kilka linijek kodu bardzo prostej arytmetyki. Więcej czasu poświęciłeś na pisanie powyższego posta. ;)


Jednak jeśli już będziesz siadał do pisania tego kodu (bo nie znam gotowca z VCL-a), to od razu przemyśl sprawę i dobrze to zaimplementuj. Zwykły min-max to za mało — wzoruj się na systemowych popupach. Jeśli domyślnie wyświetlasz popup np. po prawej stronie, to gdy nie zmieści się na ekranie, nie przesuwaj go tak aby się mieścił, a przenieś go na lewą stronę od pozycji kursora (i tak samo jeśli chodzi o jego pozycję w pionie).

Jeśli po przeniesieniu okna na drugą stronę też się nie będzie mieściło (co jest mało prawdopodobne, ale jednak), to wybierz docelową stronę w taki sposób, aby użytkownik musiał wykonać krótszy ruch myszą, by móc kliknąć w coś w tym popupie oraz jednocześnie aby przez przypadek nie był w stanie czegoś w nim kliknąć i zepsuć sobie robotę.

Możesz też dodatkowo skorzystać z predefiniowanego offsetu okna w obu osiach względem pozycji kursora. Np. żeby róg popupu był odsunięty kilka pikseli od kursora. Bywa to przydatne, ale ostatecznie sam określ, czy w Twoim przypadku ma to zastosowanie.

2

No dobra, wszedłem na wyżyny i napisałem te kilka linijek dla początkujących potomnych:

  if Mouse.CursorPos.Y < Screen.Height - frmNowyFolder.Height then
    frmNowyFolder.Top := Mouse.CursorPos.Y
  else
    frmNowyFolder.Top := Mouse.CursorPos.Y - frmNowyFolder.Height;

  if Mouse.CursorPos.X < Screen.Width - frmNowyFolder.Width then
    frmNowyFolder.Left := Mouse.CursorPos.X
  else
    frmNowyFolder.Left := Mouse.CursorPos.X - frmNowyFolder.Width;

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