Utworzenie formy pod spodem bieżącej formy

0

Pozornie łatwe pytanie.
Próbuję otworzyć nową formę i umieścić ją pod bieżącą formą (aktualne okno ma być na wierzchu)

procedure TForm3.Button1Click(Sender: TObject);
begin
  if not Assigned(MeasureForm) then
  begin
   MeasureForm := TForm.Create(nil);
   MeasureForm.Left := 0;
   MeasureForm.Top := 0;
   MeasureForm.Width := Screen.Width;
   MeasureForm.Height := Screen.Height;
   MeasureForm.BorderStyle := bsNone;
   MeasureForm.FormStyle := fsNormal;

   MeasureForm.Show;

   self.BringToFront;
   self.FormStyle := fsStayOnTop;
   MeasureForm.SendToBack;
  end
  else
  begin
    MeasureForm.Close;
    FreeAndNil(MeasureForm);
  end;

kombinuję z SendToBack, BringToFront, FormStyle := fsStayOnTop
ale ta nowa forma czasem otwiera się na wierzchu a czasem pod spodem.
Jak mam ją umieścić zawsze pod oknem.

1

Spróbuj tak:

procedure TForm3.Button1Click(Sender: TObject);
begin
  if not Assigned(MeasureForm) then
  begin
    MeasureForm := TForm.Create(nil);
    MeasureForm.Left := 0;
    MeasureForm.Top := 0;
    MeasureForm.Width := Screen.Width;
    MeasureForm.Height := Screen.Height;
    MeasureForm.BorderStyle := bsNone;

    MeasureForm.Show();
    Self.BringToFront();
  end
  else
    FreeAndNil(MeasureForm);
end;

W razie czego dorzuć ProcessMessages pod Show:

MeasureForm.Show();
Application.ProcessMessages();
Self.BringToFront();

A jak to nie pomaga i program ma być tylko na windowsy to wspomóż się funkcjami z systemowego API, głównie SetForegroundWindow i SetActiveWindow (ewentualnie innymi, w zależności od wyobraźni).

Poza tym zamiast ustawiać współrzędne i rozmiary osobno, ustaw od razu MeasureForm.BoundsRect, przypisując mu obszar ekranu bieżącego monitora. Coś na tej zasadzie:

MeasureForm.BoundsRect := Screen.MonitorFromWindow(Self.Handle).BoundsRect;

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