AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi MDIChild soll bei OnCreate keine "window animation" benutzen
Thema durchsuchen
Ansicht
Themen-Optionen

MDIChild soll bei OnCreate keine "window animation" benutzen

Offene Frage von "anse"
Ein Thema von anse · begonnen am 24. Apr 2007 · letzter Beitrag vom 25. Apr 2007
Antwort Antwort
Benutzerbild von anse
anse

Registriert seit: 30. Okt 2006
Ort: Neuenkirchen
197 Beiträge
 
Delphi 11 Alexandria
 
#1

MDIChild soll bei OnCreate keine "window animation"

  Alt 24. Apr 2007, 21:55
Ich habe eine Mainform und erstelle ein MDI-Child auf Knopfdruck. Das MDI-Child liest aus der Registry u.a. den zuletzt benutzten WindowState aus (also wsNormal, wsMaximized oder wsMinimized). Der Default ist zur Designzeit noch auf wsNormal gestellt. Wenn nun das MDI-Child in OnShow oder OnCreate auf wsMaximized wechselt, wird das mit dieser Fenster-Animation gemacht die in Windows(r) eingestellt ist, die in diesem Fall einfach total überflüssig und auf die Dauer nervig ist.

Das gleiche Problem hatte ich bei der Mainform - hier konnte ich das Problem lösen indem ich den windowstate bereits in FormCreate setze, was früh genug scheint, um die Animation zu verhindern. Beim MDI-Child funktioniert das aus irgendeinem Grund nicht.

Man kann die window-animation auch per Registry Hack global deaktivieren, aber das will ich ja gar nicht.

Ich möchte nur, daß die Form direkt beim Start nach Auslesen der Einstellung keine Animation benutzt, weil mir das überflüssig erscheint. Später, wenn der Benutzer sie selbst minimiert, maximiert oder sonstwas damit macht, darf die Animation gerne kommen. Weiß jemand wie man das hinkriegt?
Ansgar Becker
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: MDIChild soll bei OnCreate keine "window animation&

  Alt 24. Apr 2007, 21:58
Setze besser in .Loaded()
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von anse
anse

Registriert seit: 30. Okt 2006
Ort: Neuenkirchen
197 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: MDIChild soll bei OnCreate keine "window animation&

  Alt 25. Apr 2007, 00:54
Der Tip war gut... Die Animation ist leider immer noch da. So sieht es aus:

Delphi-Quellcode:
Interface

type
  TMDIChild = class(TForm)
    protected
      procedure Loaded; override;
  end;

Implementation

procedure TMDIChild.Loaded;
begin
  inherited Loaded;
  windowstate := wsMaximized;
end;
Hmm.. selbst wenn ich zur Designzeit (!) WindowState auf wsMaximized setze, gibts die "Maximieren"-Animation beim Create des MDI-Childs. Das ist verrückt. Und heißt wohl: Loaded funktioniert grundsätzlich. Nur scheint es eine Besonderheit bei MDI-Fenstern zu geben: Die werden wohl immer zuerst auf wsNormal erstellt, egal was man zur Designzeit oder in Loaded oder in OnCreate macht. Ich nehme an, daß ein MDI-child nach dem Create-Event noch mit der Mainform aushandeln muß, wie denn jetzt der windowState ist.

Gerade gefunden: http://forum.dsdt.info/viewtopic.php?t=18277
Demnach gibt es eigentlich nur die Möglichkeit, die Childs von Delphi automatisch zu erzeugen. Da geht mir aber leider die Dynamik flöten.
Ansgar Becker
  Mit Zitat antworten Zitat
Nuclear-Ping
(Gast)

n/a Beiträge
 
#4

Re: MDIChild soll bei OnCreate keine "window animation&

  Alt 25. Apr 2007, 01:59
Wie schaut es denn mit der dort angesprochenen CreateNew-Funktion aus? Hat damit jemand schon Erfahrungen ob das was bringt?
  Mit Zitat antworten Zitat
kalmi01
(Gast)

n/a Beiträge
 
#5

Re: MDIChild soll bei OnCreate keine "window animation&

  Alt 25. Apr 2007, 10:14
Delphi-Quellcode:
unit WinAnimation;

  interface

    uses
      Windows, Messages;

    function GetWinAnimation: Boolean;
    procedure SetWinAnimation(AValue: Boolean);

    function GetFullDragWindow: Boolean;
    procedure SetFullDragWindow(hwnd: DWORD; ShowFullWindow: Boolean);

  implementation

////////////////////////////////////////////////////////////////////////////////
// Gibt True zurück, falls Fensteranimationen aktiviert sind.
    function GetWinAnimation: Boolean;
      var
        Info: TAnimationInfo;
      begin
        Info.cbSize := SizeOf(TAnimationInfo);
        if SystemParametersInfo(SPI_GETANIMATION, SizeOf(Info), @Info, 0)
        then Result := Info.iMinAnimate <> 0
        else Result := false;
      end;

// Aktiviert/Deaktiviert Fensteranimationen.
    procedure SetWinAnimation(AValue: Boolean);
      var
        Info: TAnimationInfo;
      begin
        Info.cbSize := SizeOf(TAnimationInfo);
        Info.iMinAnimate := Integer(AValue);
        SystemParametersInfo(SPI_SETANIMATION, SizeOf(Info), @Info, 0);
      end;

////////////////////////////////////////////////////////////////////////////////
// True = Fenster Schieben mit Anzeige des Fensterinhaltes
// False = Fenster Schieben mit Anzeige eines Rahmens
    function GetFullDragWindow: Boolean;
      var
        ok : boolean;
      begin
        if SystemParametersInfo(SPI_GETDRAGFULLWINDOWS, 0, @ok, 0)
        then Result := ok
        else Result := false;
      end;

// Aktiviert/Deaktiviert Fensterinhalt/Fensterrahmen
    procedure SetFullDragWindow(hwnd: DWORD; ShowFullWindow: Boolean);
      begin
        if SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, Abs(DWORD(ShowFullWindow)), 0, SPIF_UPDATEINIFILE or SPIF_SENDWININICHANGE)
        then begin
               ReleaseCapture;
               SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0);
             end;
      end;

{  Benötigt einen OnMouseDown-Event-Handler, wie diesen :
  ======================================================

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  begin

// Springe in die Function SetFullWindowDrag
// Weise dieser das Handle meiner Anwendung zu = Main.Handle
// Und teile ihr mit das ich nun meine Form verschiebe.
    SetFullDragWindow(Form1.Handle, true );

// Springe in die Function SetFullWindowDrag
// Weise dieser das Handle meiner Anwendung zu = Main.Handle
// Und teile ihr mit das ich mit dem verschieben fertig bin und das Event CaptionBarMouseDown verlasse.
    SetFullDragWindow(Form1.Handle, Fenster);

  end;
}


end.
im Prog dann mit GetWinAnimation: Boolean;
den aktuellen Status holen.
Mit SetWinAnimation(AValue: Boolean);
den gewünschten Status setzen, Deine Fenster öffnen und dann den Originalstand wieder herstellen.
Die Fensteranimation lässt sich leider nur systemweit ein/ausschalten.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:12 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz