Was zurück geben - Fensterpositionen

Für Fragen von Einsteigern und Programmieranfängern...
Andy Nightingale
Beiträge: 340
Registriert: Mo 13. Jan 2025, 12:11

Was zurück geben - Fensterpositionen

Beitrag von Andy Nightingale »

Hallo Leute,
ihr wisst ja das ich Anfänger bin. Ihr habt mir schon so oft geholfen und nun habe ich ein Unit Fensterpositionen geschrieben das ich hier posten möchte für die, die auch am Anfang stehen und sich fragen wie man denn schnell die Fensterposition umsetzen kann.( ich weiß für die Profis ist das Pipifaz aber für mich nicht) :D .- Einfach einen Button anklicken in dem steht:

Code: Alles auswählen

procedure TForm1.ImageButtonTestClick(Sender: TObject);
begin
        // Formular erstellen, falls es noch nicht existiert !!!SEHR WICHTIG!!!
  if not Assigned(FAuswertungen) then
    FAuswertungen:= TFAuswertungen.Create(Self);
    FensterPositionieren(FAuswertungen, Mitte);
    FAuswertungen.show;
end;        


Die Unit einbinden in die Hauptunit. Und hier die Unit für die Fensterpositionen:

Code: Alles auswählen

unit Fensterposition;

{$mode ObjFPC}{$H+}

interface

uses
  Classes, Forms, Windows, SysUtils;

type
  TPosition = (LinksOben, RechtsOben, LinksUnten, RechtsUnten, Mitte);

procedure FensterPositionieren(Form: TForm; Position: TPosition);

implementation


procedure FensterPositionieren(Form: TForm; Position: TPosition);
const
  RandAbstand = 5; // ca. 1 cm Abstand
var
  WorkArea: TRect;
  X, Y: Integer;
begin
  WorkArea := Screen.WorkAreaRect; // Arbeitsbereich ohne Taskleiste

  case Position of
    LinksOben:
      begin
        X := WorkArea.Left + RandAbstand;
        Y := WorkArea.Top + RandAbstand;
      end;
    RechtsOben:
      begin
        X := WorkArea.Right - Form.Width - RandAbstand;
        Y := WorkArea.Top + RandAbstand;
      end;
    LinksUnten:
      begin
        X := WorkArea.Left + RandAbstand;
        Y := WorkArea.Bottom - Form.Height - RandAbstand;
      end;
    RechtsUnten:
      begin
        X := WorkArea.Right - Form.Width - RandAbstand;
        Y := WorkArea.Bottom - Form.Height - RandAbstand;
      end;
    Mitte:
      begin
        X := WorkArea.Left + (WorkArea.Width - Form.Width) div 2;
        Y := WorkArea.Top + (WorkArea.Height - Form.Height) div 2;
      end;
  end;

  Form.Left := X;
  Form.Top := Y;
end;


end.
Viele Grüße Andy

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7108
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Was zurück geben - Fensterpositionen

Beitrag von af0815 »

Eine kleine Anmerkung. FPC und Lazarus sind für viele Plattformen. Daher sollte man die Unit Windows soweit wie möglich nicht verwenden. Damit nagelt man alles auf Windows fest. Viele Sachen die man in der Unit Windows verwendet, gibt es auch in Plattformunabhängigen Units.

Beispiel, bei mir macht die Unit keinen Sinn, da ich nicht auf Windows arbeite.

Und im Forum sind die Code Tags möglich, das macht alles besser lesbar.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
theo
Beiträge: 11144
Registriert: Mo 11. Sep 2006, 19:01

Re: Was zurück geben - Fensterpositionen

Beitrag von theo »

@Andy Nightingale
Was ist genau die Idee dahinter?
Dir ist schon klar, dass jedes Formular eine "Position" Eigenschaft hat?
https://dsiders.gitlab.io/lazdocsnext/l ... ition.html

Andy Nightingale
Beiträge: 340
Registriert: Mo 13. Jan 2025, 12:11

Re: Was zurück geben - Fensterpositionen

Beitrag von Andy Nightingale »

theo hat geschrieben: Sa 31. Jan 2026, 17:16 @Andy Nightingale
Was ist genau die Idee dahinter?
Dir ist schon klar, dass jedes Formular eine "Position" Eigenschaft hat?
https://dsiders.gitlab.io/lazdocsnext/l ... ition.html
Hallo Theo, ja klar aber das Problem ist das die Position bei mir exakt ist aber beim Kunden wo verschiedene Laptops und Rechner zugreifen passte das nicht. Da sagte man mir, programmier das doch selbst.- nun das habe ich gemacht.-war das falsch?

Andy Nightingale
Beiträge: 340
Registriert: Mo 13. Jan 2025, 12:11

Re: Was zurück geben - Fensterpositionen

Beitrag von Andy Nightingale »

af0815 hat geschrieben: Sa 31. Jan 2026, 17:01 Eine kleine Anmerkung. FPC und Lazarus sind für viele Plattformen. Daher sollte man die Unit Windows soweit wie möglich nicht verwenden. Damit nagelt man alles auf Windows fest. Viele Sachen die man in der Unit Windows verwendet, gibt es auch in Plattformunabhängigen Units.

Beispiel, bei mir macht die Unit keinen Sinn, da ich nicht auf Windows arbeite.

Und im Forum sind die Code Tags möglich, das macht alles besser lesbar.
Hi 0815, mein Kunde hat nur Windows. Wie macht man das denn das man es auf allen Systemen lesen kann? Wie macht man das mit den Code Tags?? Grüße

Benutzeravatar
theo
Beiträge: 11144
Registriert: Mo 11. Sep 2006, 19:01

Re: Was zurück geben - Fensterpositionen

Beitrag von theo »

Andy Nightingale hat geschrieben: Sa 31. Jan 2026, 17:31 Hallo Theo, ja klar aber das Problem ist das die Position bei mir exakt ist aber beim Kunden wo verschiedene Laptops und Rechner zugreifen passte das nicht. Da sagte man mir, programmier das doch selbst.- nun das habe ich gemacht.-war das falsch?
Bei poDesigned kann das sein, aber bei poScreenCenter oder poDesktopCenter müsste das überall klappen.

Benutzeravatar
theo
Beiträge: 11144
Registriert: Mo 11. Sep 2006, 19:01

Re: Was zurück geben - Fensterpositionen

Beitrag von theo »

Andy Nightingale hat geschrieben: Sa 31. Jan 2026, 17:33 mein Kunde hat nur Windows. Wie macht man das denn das man es auf allen Systemen lesen kann?
Schmeiss einfach die Unit "Windows" raus. Die braucht es hier eh nicht.

Benutzeravatar
theo
Beiträge: 11144
Registriert: Mo 11. Sep 2006, 19:01

Re: Was zurück geben - Fensterpositionen

Beitrag von theo »

Andy Nightingale hat geschrieben: Sa 31. Jan 2026, 17:33 Wie macht man das mit den Code Tags?? Grüße
Den Text markieren und den Code Button drücken (5. von links).
Hab's dir oben mal geändert.

Andy Nightingale
Beiträge: 340
Registriert: Mo 13. Jan 2025, 12:11

Re: Was zurück geben - Fensterpositionen

Beitrag von Andy Nightingale »

theo hat geschrieben: Sa 31. Jan 2026, 18:31
Andy Nightingale hat geschrieben: Sa 31. Jan 2026, 17:33 Wie macht man das mit den Code Tags?? Grüße
Den Text markieren und den Code Button drücken (5. von links).
Hab's dir oben mal geändert.
Hi Theo, ok hab den Windows Dingends gelöscht.- Danke für die Infos. :D

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7108
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Was zurück geben - Fensterpositionen

Beitrag von af0815 »

Wenn die unit Windows weg ist, passt es auch unter Linux.

Ein kleiner Hinweis zu einer Bemerkung in der unit Fensterposition. Randabstand 5 ist nicht ca. 1cm. Das sind 5 Pixel und die sind je nach Auflösung unterschiedlich.

Anbei das Projekt einmal lauffähig (unter Linux getestet). Ist einfach mit Menue Project->Publish Project gemacht.

Theo hat bei "Mitte" schon recht, das würde poScreenCenter entsprechen. aber die anderen gehen über die Eigenschaft Position nicht.
Dateianhänge
PrjFenster.zip
(96.61 KiB) 514-mal heruntergeladen
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

wp_xyz
Beiträge: 5367
Registriert: Fr 8. Apr 2011, 09:01

Re: Was zurück geben - Fensterpositionen

Beitrag von wp_xyz »

Ich finde, du solltest die Form-Property Position auf poDesigned setzen, damit du überhaupt .Left und .Top verändern kannst. Und der Prozedur FensterPositionieren würde ich den Randabstand als zusätzlichen Parameter geben, idealerweise in Pixeln, aber du kannst ja in der Unit auch Konvertierungsfunktionen für andere Längeneinheiten bereitstellen, z.B.

Code: Alles auswählen

function mm2px(mm: Single): Integer;
const
  INCH = 25.4;   // 1" = 25.4 mm
begin
  Result := round(mm / INCH * ScreenInfo.PixelsPerInchX);
end;

Benutzeravatar
Zvoni
Beiträge: 522
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: Was zurück geben - Fensterpositionen

Beitrag von Zvoni »

*senf*
O.g. Code positioniert IMMER gemäss Desktop/Monitor

Und jetzt werf ich noch Pfeffer in die Suppe......
Was ist mit modalen Fenstern?
Was ist mit Positionierung zum "Mutter"-Fenster (egal ob jetzt modal oder nicht)?
Andy Created ja das zweite Fenster "FAuswertungen" mit Owner "Self" (=TForm1)

Vielleicht noch zusätzlicher Parameter "PosToParent: Boolean" oder sowas....
Aircode

Code: Alles auswählen

If Not PosToParent Then
  WorkArea := Screen.WorkAreaRect;
Else
  WorkArea:=ParentForm.ClientRect; //Oder welche Position auch immer
Aircode ist definitiv nicht vollständig
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Andy Nightingale
Beiträge: 340
Registriert: Mo 13. Jan 2025, 12:11

Re: Was zurück geben - Fensterpositionen

Beitrag von Andy Nightingale »

wp_xyz hat geschrieben: Sa 31. Jan 2026, 19:55 Ich finde, du solltest die Form-Property Position auf poDesigned setzen, damit du überhaupt .Left und .Top verändern kannst. Und der Prozedur FensterPositionieren würde ich den Randabstand als zusätzlichen Parameter geben, idealerweise in Pixeln, aber du kannst ja in der Unit auch Konvertierungsfunktionen für andere Längeneinheiten bereitstellen, z.B.

Code: Alles auswählen

function mm2px(mm: Single): Integer;
const
  INCH = 25.4;   // 1" = 25.4 mm
begin
  Result := round(mm / INCH * ScreenInfo.PixelsPerInchX);
end;
Hallo WP,.-okay gute Idee.-aber woe würdest du das in meine "Unit Fensterposition" mit einbinden?

Andy Nightingale
Beiträge: 340
Registriert: Mo 13. Jan 2025, 12:11

Re: Was zurück geben - Fensterpositionen

Beitrag von Andy Nightingale »

Zvoni hat geschrieben: Mo 2. Feb 2026, 09:51 *senf*
O.g. Code positioniert IMMER gemäss Desktop/Monitor

Und jetzt werf ich noch Pfeffer in die Suppe......
Was ist mit modalen Fenstern?
Was ist mit Positionierung zum "Mutter"-Fenster (egal ob jetzt modal oder nicht)?
Andy Created ja das zweite Fenster "FAuswertungen" mit Owner "Self" (=TForm1)

Hallo Zvoni, versteh ich leider nicht ganz. Das Hauptfenster ist immer mittig. die modalen auch. Versteh ich was falsch? Grüße

wp_xyz
Beiträge: 5367
Registriert: Fr 8. Apr 2011, 09:01

Re: Was zurück geben - Fensterpositionen

Beitrag von wp_xyz »

Andy Nightingale hat geschrieben: Mo 2. Feb 2026, 11:30 aber woe würdest du das in meine "Unit Fensterposition" mit einbinden?
Den Code in den implementation-Teil der Unit reinkopieren, zusätzlich die Deklarationszeile ("function mm2px(mm:single): Integer") in den Interface-Teil, damit man die Funktion von überall aus aufrufen kann:

Code: Alles auswählen

unit FensterPosition;
{$mode ObjFPC}{$H+}

interface

uses
  Classes, Forms, SysUtils;

type
  TPosition = (LinksOben, RechtsOben, LinksUnten, RechtsUnten, Mitte);  
  // TPosition würde ich umbenennen, vielleicht zu TFpPosition ("Fp" für die Unit). TPosition ist zu allgemein und sicher irgendwo schon in Verwendung.

procedure FensterPositionieren(Form: TForm; Position: TPosition; RandAbstand: Integer);  // Randabstand ergänzt
function mm2px(mm: Single): Integer;    // neu

implementation

procedure FensterPositionieren(Form: TForm; Position: TPosition; RandAbstand: Integer);
var
  WorkArea: TRect;
  X, Y: Integer;
begin
  WorkArea := Screen.WorkAreaRect; // Arbeitsbereich ohne Taskleiste

  case Position of
    LinksOben:
      begin
        X := WorkArea.Left + RandAbstand;
        Y := WorkArea.Top + RandAbstand;
      end;
    RechtsOben:
      begin
        X := WorkArea.Right - Form.Width - RandAbstand;
        Y := WorkArea.Top + RandAbstand;
      end;
    LinksUnten:
      begin
        X := WorkArea.Left + RandAbstand;
        Y := WorkArea.Bottom - Form.Height - RandAbstand;
      end;
    RechtsUnten:
      begin
        X := WorkArea.Right - Form.Width - RandAbstand;
        Y := WorkArea.Bottom - Form.Height - RandAbstand;
      end;
    Mitte:
      begin
        X := WorkArea.Left + (WorkArea.Width - Form.Width) div 2;
        Y := WorkArea.Top + (WorkArea.Height - Form.Height) div 2;
      end;
  end;

  Form.Position := poDesigned;  // damit man immer Left und Top ändern kann
  Form.Left := X;
  Form.Top := Y;
end;

function mm2px(mm: Single): Integer;
const
  INCH = 25.4;   // 1" = 25.4 mm
begin
  Result := round(mm / INCH * ScreenInfo.PixelsPerInchX);
end;

end.
Ein Aufruf für 5 mm Randabstand bezogen auf links/oben wäre dann: "FensterPositionieren(Form, LinksOben, mm2Px(5));"

Antworten