¿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?
Desktop Height/Width ermitteln ABZÜGLICH Taskleiste
-
- 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
Naja, das kann man schon irgendwie hinwurschteln. Unter Linux geht das mit ach und krach:
Aber ich finde sowas Käse. Lass den User die Fenstergrösse setzen und speichere die Werte für den nächsten Start.
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;
-
- 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
MSEgui macht das folgendermassen:KOBOLD Messring GmbH hat geschrieben:¿Gibt es eine Möglichkeit die TATSÄCHLICH verfügbare Desktop-Grösse zu ermitteln?
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;
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;
Re: Desktop Height/Width ermitteln ABZÜGLICH Taskleiste
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
knight
-
- 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
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.
@mse: Ebenfalls vielen Dank, das Thema scheint ja wirklich nicht trivial zu sein.
-
- 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
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.User stellt die Grösse ein und ich speichere die letzte Einstellungen OnClose in einer .ini (.conf)-Datei.
Johannes