Einzelnen Beitrag anzeigen

SMO

Registriert seit: 20. Jul 2005
178 Beiträge
 
Delphi XE6 Professional
 
#20

AW: Rätselhafte Exception unter Windows 8

  Alt 19. Jun 2015, 15:38
Zur Intention des Codes: du möchtest bei Programmstart die Position und Größe des Fensters wiederherstellen, gespeichert beim letzten Programmende?
Dafür würde ich unter Windows eher SetWindowPlacement und GetWindowPlacement nehmen.
Ich weiß nicht, ob deine TFitnessMainForm maximiert werden kann oder nicht, aber wenn ja, dann ist es möglich, dass das Fenster bei Programmende maximiert ist und du so die maximierte Position und Größe speicherst und dann beim nächsten Programmstart diese "falschen" Werte dem nicht-maximierten Fenster zuweist. Mit Get/SetWindowPlacement kommst du direkt an die Koordinaten des Normalzustands (rcNormalPosition).

Ungefähr so:
Delphi-Quellcode:
procedure PositionSpeichern(F: TForm; Ini: TCustomIniFile);
var
  WP: TWindowPlacement;
begin
  WP.length := SizeOf(WP);
  if GetWindowPlacement(F.Handle, WP) then
  begin
    Ini.WriteInteger('Position', 'Links', WP.rcNormalPosition.Left);
    Ini.WriteInteger('Position', 'Rechts', WP.rcNormalPosition.Right);
    Ini.WriteInteger('Position', 'Oben', WP.rcNormalPosition.Top);
    Ini.WriteInteger('Position', 'Unten', WP.rcNormalPosition.Bottom);
    Ini.WriteBool('Position', 'Maximiert', F.WindowState = wsMaximized); // oder WP.showCmd = SW_SHOWMAXIMIZED
  end
  // else Fehlerbehandlung
end;

procedure PositionLaden(F: TForm; Ini: TCustomIniFile);
var
  WP: TWindowPlacement;
begin
  ZeroMemory(@WP, SizeOf(WP));
  WP.length := SizeOf(WP);
  WP.rcNormalPosition.Left := Ini.ReadInteger('Position', 'Links', F.Left);
  WP.rcNormalPosition.Right := Ini.ReadInteger('Position', 'Rechts', F.Left + F.Width);
  WP.rcNormalPosition.Top := Ini.ReadInteger('Position', 'Oben', F.Top);
  WP.rcNormalPosition.Bottom := Ini.ReadInteger('Position', 'Unten', F.Top + F.Height);
  if not Ini.ReadBool('Position', 'Maximiert', F.WindowState = wsMaximized) then
    WP.showCmd := SW_SHOWMAXIMIZED
  else
    WP.showCmd := SW_SHOWNORMAL;
  SetWindowPlacement(F.Handle, WP);
end;

Geändert von SMO (19. Jun 2015 um 15:47 Uhr)
  Mit Zitat antworten Zitat