Fenster genau so breit wie Desktop-WorkArea

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Florian
Beiträge: 12
Registriert: Do 26. Nov 2009, 18:48
OS, Lazarus, FPC: Windows Seven (Lazarus 0.9.28 FPC 2.2.4)
CPU-Target: 32bit
Wohnort: Österreich

Fenster genau so breit wie Desktop-WorkArea

Beitrag von Florian »

Hallo!

Bei Delphi konnte man die Breite des Arbeitsbereichs auf dem Desktop (also abzüglich möglicher Taskleiste) mit Screen.WorkAreaWidth bzw die Höhe mit Screen.WorkAreaHeight ermitteln.
Bei Lazarus habe ich die Eigenschaften Screen.Width (bzw. Height) und Screen.DesktopWidth (bzw. Height) gefunden. Liefern beide aber die gleichen Werte :(
Wenn ich Form.Width auf Screen.Width (bzw. DesktopWidth) stelle ist die Form ein paar Pixel zu breit :(
Form.Align := alTop funktioniert auch nicht :(

Hat das Problem schon jemand gelöst?

wfg
Write Once - Compile Anywhere

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Fenster genau so breit wie Desktop-WorkArea

Beitrag von RSE »

Interessante Frage. Weitere (nicht wirklich zielführende) Überlegung: Ein maximiertes Fenster ist ja auch nicht immer so breit, wie es maximal werden kann. Ich benutze Windows, habe die Taskleiste links und rechts den Messenger Miranda angedockt. Dadurch positioniert sich ein maximiertes Fenster genau dazwischen, manuell könnte man es aber von der Taskleiste bis ganz nach rechts (bis über Miranda) vergrößern.
Desweiteren ist ein maximiertes Fenster immernoch um den äußeren Rahmen größer als die Größe dessen, was du wahrscheinlich als WorkArea bezeichnest (in meinem Falls von der Taskleiste bis zu Miranda).
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Florian
Beiträge: 12
Registriert: Do 26. Nov 2009, 18:48
OS, Lazarus, FPC: Windows Seven (Lazarus 0.9.28 FPC 2.2.4)
CPU-Target: 32bit
Wohnort: Österreich

Re: Fenster genau so breit wie Desktop-WorkArea

Beitrag von Florian »

Unter Delphi war der äußere Rand des Fensterrahmens mit der Workarea abschließend. Man sah also das komplette Fenster, jedoch keinen px mehr.
Unter Lazarus bekomm ich das leider nicht hin :(

Mal schauen. Vielleicht find ich ja noch ne Möglichkeit. Oder jemand, der diesen Thread hier liest :)

wfg
Write Once - Compile Anywhere

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Fenster genau so breit wie Desktop-WorkArea

Beitrag von RSE »

Ich hab vor einiger Zeit mal eine Form an eine andere andocken wollen, damals ist mir noch nicht mal gelungen die äußeren Abmaße der Form (also incl. Betriebssystemrahmen) in Erfahrung zu bringen. Das war allerdings glaube ich noch Lazarus 0.9.25...
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Poelser
Beiträge: 55
Registriert: Do 6. Nov 2008, 14:16
OS, Lazarus, FPC: Windows Vista (L 1.0.6 FPC 2.6.0)
CPU-Target: Intel 32 Bit/Arm

Re: Fenster genau so breit wie Desktop-WorkArea

Beitrag von Poelser »

Florian hat geschrieben:Bei Delphi konnte man die Breite des Arbeitsbereichs auf dem Desktop (also abzüglich möglicher Taskleiste) mit Screen.WorkAreaWidth bzw die Höhe mit Screen.WorkAreaHeight ermitteln.
Bei Lazarus habe ich die Eigenschaften Screen.Width (bzw. Height) und Screen.DesktopWidth (bzw. Height) gefunden. Liefern beide aber die gleichen Werte :(
Wenn ich Form.Width auf Screen.Width (bzw. DesktopWidth) stelle ist die Form ein paar Pixel zu breit :(
DesktopWidth ist eigentlich unbrauchbar, weil der Desktop sich über mehr als einen Monitor erstrecken kann. Mit der WorkAreaWidth bist du schon richtig, Delphi holt sich das aus der Win-API:

Code: Alles auswählen

function TScreen.GetWorkAreaRect: TRect;
begin
  SystemParametersInfo(SPI_GETWORKAREA, 0, @Result, 0);
end;
Das solltest du dir in dein Programm einbauen können.

HTH, der Poelser

Florian
Beiträge: 12
Registriert: Do 26. Nov 2009, 18:48
OS, Lazarus, FPC: Windows Seven (Lazarus 0.9.28 FPC 2.2.4)
CPU-Target: 32bit
Wohnort: Österreich

Re: Fenster genau so breit wie Desktop-WorkArea

Beitrag von Florian »

Vielen Dank für den Tipp. Werd ich mal versuchen :D

meld mich dann, ob es den gewünschten Effekt hatte.

wfg
Write Once - Compile Anywhere

Florian
Beiträge: 12
Registriert: Do 26. Nov 2009, 18:48
OS, Lazarus, FPC: Windows Seven (Lazarus 0.9.28 FPC 2.2.4)
CPU-Target: 32bit
Wohnort: Österreich

Re: Fenster genau so breit wie Desktop-WorkArea

Beitrag von Florian »

uMain.pas(44,23) Error: Identifier not found "SystemParametersInfo"
uMain.pas(44,39) Error: Identifier not found "SPI_GETWORKAREA"
Hmmm... Gefällt mir nicht die Compiler-Ausgabe :(
Wie schaff ich das ab?

wfg
Write Once - Compile Anywhere

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: Fenster genau so breit wie Desktop-WorkArea

Beitrag von monta »

Code: Alles auswählen

Uses ..., windows, ... ;
Johannes

Poelser
Beiträge: 55
Registriert: Do 6. Nov 2008, 14:16
OS, Lazarus, FPC: Windows Vista (L 1.0.6 FPC 2.6.0)
CPU-Target: Intel 32 Bit/Arm

Re: Fenster genau so breit wie Desktop-WorkArea

Beitrag von Poelser »

monta hat geschrieben:

Code: Alles auswählen

Uses ..., windows, ... ;
Mist, Monta war schneller :shock:

Florian
Beiträge: 12
Registriert: Do 26. Nov 2009, 18:48
OS, Lazarus, FPC: Windows Seven (Lazarus 0.9.28 FPC 2.2.4)
CPU-Target: 32bit
Wohnort: Österreich

Re: Fenster genau so breit wie Desktop-WorkArea

Beitrag von Florian »

uAgelaosMain.pas(39,69) Error: Incompatible type for arg no. 1: Got "LongBool", expected "LongInt"
Das ist mein Code: (Windows ist eingebunden):

Code: Alles auswählen

procedure TfrmMain.FormShow(Sender: TObject);
var
  Result: ^TRect;
begin
  Self.AutoSize := true;
  Self.AutoSize := false;
  Self.Top := 0;
  Self.Left := 0;
 
  Self.Width := SystemParametersInfo(SPI_GETWORKAREA, 0, @Result, 0);
end;
:(
Find den Fehler nicht :(

wfg
Write Once - Compile Anywhere

Poelser
Beiträge: 55
Registriert: Do 6. Nov 2008, 14:16
OS, Lazarus, FPC: Windows Vista (L 1.0.6 FPC 2.6.0)
CPU-Target: Intel 32 Bit/Arm

Re: Fenster genau so breit wie Desktop-WorkArea

Beitrag von Poelser »

Florian hat geschrieben:

Code: Alles auswählen

Self.Width := SystemParametersInfo(SPI_GETWORKAREA, 0, @Result, 0);
end;
Kein Wunder, die Funktion SystemParametersInfo liefert ja auch ein Boolean zurück und keinen Integer. Du brauchst den Rückgabewert überhaupt nicht (es sei denn, du machst noch eine Überprüfung, ob es einen Fehler gab), du musst das Rechteck auswerten:

Code: Alles auswählen

SystemParametersInfo(SPI_GETWORKAREA, 0, @R, 0);
Self.Width := R.Right - R.Left;
Außerdem:
Deklariere keine Variable namens Result, das geht irgendwann schief :wink:

CU, der Poelser

Florian
Beiträge: 12
Registriert: Do 26. Nov 2009, 18:48
OS, Lazarus, FPC: Windows Seven (Lazarus 0.9.28 FPC 2.2.4)
CPU-Target: 32bit
Wohnort: Österreich

Re: Fenster genau so breit wie Desktop-WorkArea

Beitrag von Florian »

Poelser hat geschrieben:
Florian hat geschrieben:

Code: Alles auswählen

Self.Width := SystemParametersInfo(SPI_GETWORKAREA, 0, @Result, 0);
end;
Kein Wunder, die Funktion SystemParametersInfo liefert ja auch ein Boolean zurück und keinen Integer. Du brauchst den Rückgabewert überhaupt nicht (es sei denn, du machst noch eine Überprüfung, ob es einen Fehler gab), du musst das Rechteck auswerten:

Code: Alles auswählen

SystemParametersInfo(SPI_GETWORKAREA, 0, @R, 0);
Self.Width := R.Right - R.Left;
Außerdem:
Deklariere keine Variable namens Result, das geht irgendwann schief :wink:

CU, der Poelser
OK :) Herzlichen Dank :)

das mit Result hab ich von deinem Post übernommen xD

wfg
Write Once - Compile Anywhere

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Fenster genau so breit wie Desktop-WorkArea

Beitrag von Michl »

Da ich jetzt eine halbe Stunde nach einer Lösung gesucht habe und nachfolgende Leser dies evtl. auch interessiert, hier die Lösung, wie es bei mir funktioniert (Windows 7 64bit, Lazarus 1.5, Klassic und Aero Theme):

Code: Alles auswählen

uses ...,LCLIntf, LCLType;
...
procedure TForm1.FormCreate(Sender: TObject);
var
  aBorderWidth: Integer;
begin
  aBorderWidth := GetSystemMetrics(SM_CYFRAME);
  Top   := 0;
  Left  := 0;
  Width := Screen.WorkAreaWidth - 2 * aBorderWidth;
end;

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Antworten