Desktop Height/Width ermitteln ABZÜGLICH Taskleiste

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
KOBOLD Messring GmbH
Beiträge: 155
Registriert: Mi 22. Aug 2007, 14:52
OS, Lazarus, FPC: Mandriva Linux 2008 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 65719 Hofheim am Taunus
Kontaktdaten:

Desktop Height/Width ermitteln ABZÜGLICH Taskleiste

Beitrag von KOBOLD Messring GmbH »

¿Gibt es eine Möglichkeit die TATSÄCHLICH verfügbare Desktop-Grösse zu ermitteln?
(Also abzüglich z.B. der Taskleiste) ¿Wie macht's denn das beim Maximizieren?
Mit Screen.Width (und .Height) und Screen.DesktopWidth (und .DesktopHeight) erhalte ich immer nur die komplette Bildschirmauflösung (z.B. 1024x768 oder 1280x768), übrigens gleiches Verhalten bei Linux-KDE und WinXP.
Ich möchte meine Anwendung auf maximale Höhe (da wird eine riesige Auswahlliste dargestellt werden) aber ca nur 300-400px Breite bei Programmstart einstellen.
Hatte auch so eine Idee über Form.Height und .ClientHeight:
FormCreate stellt mal auf wsMaximized, Höhe auslesen, dann wsNormal und MaximizedHoehe setzen, aber das funktioniert überhaupt nicht. Die Werte sind immer "veraltet", sprich auch direkt nach WindowState:=wsMaximized ist Form.Height noch immer auf dem "alten" Wert wie bei wsNormal. (Auch egal, ob ich die Programmsequenz mit Application.Processmessages spicke oder nicht). Funktioniert weder bei FormCreate noch bei OnShow.
Auch spasseshalber interaktiv zum Testen über ButtonClicks gemacht, da hat dann die Form (¿oder der Window-Manager?) genügend Zeit, die Form tatsächlich zu resizen und die Variablen geben (fast) korrekte Werte zurück, aber immer ca 10px zu viel, so dass der untere Rand noch immer hinter der Taskleiste verschwindet.
GIDF, aber da wird immer nur auf Screen.Height/Width verwiesen, nichts gefunden.
¿Habt Ihr eine Idee? ¿oder sowas schon mal gemacht?

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

Re: Desktop Height/Width ermitteln ABZÜGLICH Taskleiste

Beitrag von theo »

Naja, das kann man schon irgendwie hinwurschteln. Unter Linux geht das mit ach und krach:

Code: Alles auswählen

procedure TForm1.FormChangeBounds(Sender: TObject);
var hoehe:integer;
begin
  if (WindowState=wsMaximized) and (Height>fDesignedHeight) then
   begin
   hoehe:=Height;
   WindowState:=wsNormal;
   SetBounds(0,0,300,Hoehe);
   end;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
    fDesignedHeight:=Height;
    WindowState:=wsMaximized;
end;
Aber ich finde sowas Käse. Lass den User die Fenstergrösse setzen und speichere die Werte für den nächsten Start.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Desktop Height/Width ermitteln ABZÜGLICH Taskleiste

Beitrag von mse »

KOBOLD Messring GmbH hat geschrieben:¿Gibt es eine Möglichkeit die TATSÄCHLICH verfügbare Desktop-Grösse zu ermitteln?
MSEgui macht das folgendermassen:
Linux:

Code: Alles auswählen

function readlongproperty(id: winidty; name: atom; count: cardinal; var value): boolean;
var
 actualtype: atom;
 actualformat: integer;
 nitems: cardinal;
 bytesafter: cardinal;
 prop: pchar;
begin
 result:= false;
 if xgetwindowproperty(appdisp,id,name,0,count,{$ifdef xboolean}false{$else}0{$endif},
        anypropertytype,@actualtype,@actualformat,@nitems,@bytesafter,@prop) = success then begin
  if nitems = count then begin
 {$ifdef FPC} {$checkpointer off} {$endif}
   move(prop^,value,integer(nitems)*actualformat div 8);
 {$ifdef FPC} {$checkpointer default} {$endif}
   result:= true;
  end;
  xfree(prop);
 end;
end;
 
function gui_getworkarea(id: winidty): rectty;
var
 bo1: boolean;
begin
 bo1:= false;
 if netsupported then begin
  bo1:= readlongproperty(mserootwindow(id),netatoms[net_workarea],4,result);
 end;
 if not bo1 then begin
  result:= makerect(nullpoint,gui_getscreensize);
 end;
end;
Windows:

Code: Alles auswählen

function gui_getworkarea(id: winidty): rectty;
begin
 if systemparametersinfo(spi_getworkarea,0,@result,0) then begin
  winrecttorect(result);
 end
 else begin
  result:= nullrect;                            
 end;
end;

knight
Beiträge: 802
Registriert: Mi 13. Sep 2006, 22:30

Re: Desktop Height/Width ermitteln ABZÜGLICH Taskleiste

Beitrag von knight »

Für die Windows-Benutzer gibt es noch ein zusätzliches Schmankerl: Die Rahmenbreiten der Fenster bei XP und Vista fallen unterschiedlich groß aus (ob es auch Unterschiede zu anderen Windows Versionen gibt entzieht sich meiner Kenntnis). Wer pixelgenau rechnen will, muß auch noch darauf Rücksicht nehmen. Daher möchte ich mich dem Tip von theo anschließen.

knight

KOBOLD Messring GmbH
Beiträge: 155
Registriert: Mi 22. Aug 2007, 14:52
OS, Lazarus, FPC: Mandriva Linux 2008 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 65719 Hofheim am Taunus
Kontaktdaten:

Re: Desktop Height/Width ermitteln ABZÜGLICH Taskleiste

Beitrag von KOBOLD Messring GmbH »

Vielen Dank theo für den Tip mit OnChangeBounds, das funktioniert ... bis auf die 10 Pixel (bei WinXP und Linux gleich), die der untere Rand hinter der Taskleiste sitzt. Ich glaube, ich folge Deinem Rat: User stellt die Grösse ein und ich speichere die letzte Einstellungen OnClose in einer .ini (.conf)-Datei.
@mse: Ebenfalls vielen Dank, das Thema scheint ja wirklich nicht trivial zu sein.

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: Desktop Height/Width ermitteln ABZÜGLICH Taskleiste

Beitrag von monta »

User stellt die Grösse ein und ich speichere die letzte Einstellungen OnClose in einer .ini (.conf)-Datei.
Kannst auch einfach TIniPropStorage oder TXMLPropStorage nehmen, dann musst dich weder ums speichern noch ums laden kümmern, und nur die Eigenschaften bei Sessionproperties der Form auswählen.
Johannes

Antworten