Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Platzieren von Formular (https://www.delphipraxis.net/76395-platzieren-von-formular.html)

kabuco 3. Sep 2006 17:42


Platzieren von Formular
 
Hallo,

ich melde mich mal wieder!

Ich möchte mein Formular rechts über der Taskleiste platzieren. Die erforderlichen Werte, sprich Höhe der Taskleiste und Formular usw., habe ich schon. Mir fehlt nur noch eine Formel, wie ich herausfinden kann, bis auf welche Pixelzahl das Formular heraufgeschoben werden muss, das es Pixelgenau mit der Taskleiste abschließt.

Hier mal mein bisheriger Code:
Delphi-Quellcode:
procedure TForm6.TimerTimer(Sender: TObject);
var
  tl: HWnd;
  rah: TRect;
begin
  tl := FindWindow('Shell_TrayWnd', nil);
  GetWindowRect(tl, rah);
  Form6.Left := Screen.Width - Form6.Width - 5;
  Form6.Top := Screen.Height - h;
  h := h+10; //Pixelanzahl, die nach oben gehen
  if Form6.Top >= Form6.Height+rah.Top then Timer.Enabled := false;
end;
Die Prozedur ist eine Timerprozedur. die Variable h ist eine globale Variable! Damit erreiche ich einen Effekt, dass das Formular von unten eingeschoben wird.

Gruß kabuco

Helmi 3. Sep 2006 18:00

Re: Platzieren von Formular
 
Hallo,

ich hab das selbe mal gemacht, nämlich so:

Delphi-Quellcode:
  //Fenster an die rechte untere ecke positionieren
  with MainForm do
    begin
      Left := Screen.WorkAreaWidth - Width;
      Top  := Screen.WorkAreaHeight - Height;
    end;

kabuco 4. Sep 2006 18:03

Re: Platzieren von Formular
 
Hallo Helmi,

die Positionierung des Formulars funktioniert schon. Ich bräuchte nur eine funktionierende If-Abfrage, die mir den Timer anhält, wenn das Formular die gewünschte Position erreicht hat. Mir ist nur leider bis jetzt noch nicht klar, wie ich diesen Wert abfragen muss, damit es funktioniert.

Gruß kabuco

Luckie 4. Sep 2006 18:09

Re: Platzieren von Formular
 
Und was machst du, wenn die Taskleiste oben bzw. links oder rechts ist? ;)

kabuco 5. Sep 2006 12:48

Re: Platzieren von Formular
 
Tja darüber habe ich mir noch keine gedanken gemacht. Das kann ich ja mit WorkArea machen!

Wie kann ich denn berechnen, auf wieviele Pixel ich das Formular hochschieben muss, dass es mit der WOrkArea abschließt und dies dann noch in eine if-Abfrage setze?

Gruß kabuco

Helmi 5. Sep 2006 14:19

Re: Platzieren von Formular
 
Hallo,

vielleicht helfen dir der folgende Link weiter:

Position der Taskbar rausfinden

Laut meines Wissens gibt "Screen.WorkAreaWidth" bzw. "Screen.WorkAreaHeight" immer nur die mögliche Breite und Höhe des Desktop an (Taskbar ist schon abgezogen).

du müsstest halt rausfinden, wo sich die Taskbar befindet (siehe link) und dann halt dann deine Form, je nach Position der TaskBar, an die dementsprechende (von dir gewollte) Stelle positionieren.

so in etwa:
Delphi-Quellcode:
with Form1 do
  begin
    case TaskbarPosition of
      unten: begin
                Left := Screen.WorkAreaWidth - Width;
                Top := Screen.WorkAreaHeight - Height;
              end;
   
      oben:  begin
                Left := 0;
                Top := 0;
              end;
       
      links: begin
                //Variante 1 (Form links oben)
                Left := 0;
                Top := 0;

                //Variante 2 (Form links unten)
                Left := 0;
                Top := Screen.WorkAreaHeight - Height;
              end;

      rechts: begin
                //Variante 1 (Form links oben)
                Left := Screen.WorkAreaWidth - Width;
                Top := 0;

                //Variante 2 (Form rechts unten)
                Left := Screen.WorkAreaWidth - Width;
                Top := Screen.WorkAreaHeight - Height;
              end;
    end;

[edit]
Da ich heute meinen guten Tag habe, hab ich mal etwas weiter gearbeitet. Vielleicht hilft dir ja folgender Code. Du brauchst dafür nen Timer, im OI Enabled = false und dann der Code:

Delphi-Quellcode:
type
  TTaskBarPos = (_TOP, _BOTTOM, _LEFT, _RIGHT, _NONE);

function GetTaskBarPos: TTaskBarPos;
var
  hTaskbar: HWND;
  T: TRect;
  scrW, scrH: Integer;

begin
  hTaskBar := FindWindow('Shell_TrayWnd', nil);
  If hTaskbar <> 0 then
    begin
      GetWindowRect(hTaskBar, T);
      ScrW := Screen.Width;
      ScrH := Screen.Height;

      If (T.Top > scrH div 2) and (T.Right >= scrW) then
        Result := _BOTTOM
      else
        If (T.Top < scrH div 2) and (T.Bottom <= scrW div 2) then
          Result := _TOP
        else
          If (T.Left < scrW div 2) and (T.Top <= 0) then
            Result := _LEFT
          else // the last "if" is not really needed
            If T.Left >= ScrW div 2 then
              Result := _RIGHT;
    end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  TaskBarPos: TTaskBarPos;
  Form_Left, Form_Top: Integer;

begin
  TaskBarPos := GetTaskBarPos;

  case TaskBarPos of
    _LEFT  : begin
                //Variante 1 (Form links oben)
                Form_Left := 0;
                Form_Top := 0;

                //Variante 2 (Form links unten)
                //Form_Left := 0;
                //Form_Top := Screen.WorkAreaHeight - Height;

                //Form bewegen

                {*** HIER FEHLT CODE ***}

                //Position überprüfen
                If (Form1.Top <= Form_Top) and (Form1.Left <= Form_Left) then
                  Timer1.Enabled := false;
              end;

    _TOP   : begin
                Form_Left := 0;
                Form_Top := 0;

                //Form bewegen

                {*** HIER FEHLT CODE ***}

                //Position überprüfen
                If (Form1.Top <= Form_Top) and (Form1.Left <= Form_Left) then
                  Timer1.Enabled := false;
              end;

    _RIGHT : begin
                //Variante 1 (Form links oben)
                Form_Left := Screen.WorkAreaWidth - Width;
                Form_Top := 0;

                //Variante 2 (Form rechts unten)
                //Form_Left := Screen.WorkAreaWidth - Width;
                //Form_Top := Screen.WorkAreaHeight - Height;

                //Form bewegen

                {*** HIER FEHLT CODE ***}

                //Position überprüfen
                If (Form1.Top <= Form_Top) and (Form1.Left >= Form_Left) then
                  Timer1.Enabled := false;
              end;

    _BOTTOM : begin
                Form_Left := Screen.WorkAreaWidth - Form1.Width;
                Form_Top := Screen.WorkAreaHeight - Form1.Height;

                //Form bewegen

                {*** HIER FEHLT CODE ***}

                //Position überprüfen
                If (Form1.Top >= Form_Top) and (Form1.Left >= Form_Left) then
                  Timer1.Enabled := false;
              end;
  end;
end;
Der Code zum bewegen musst selber einfügen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz