Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Form ohne Animation maximieren (https://www.delphipraxis.net/53968-form-ohne-animation-maximieren.html)

Marphy 26. Sep 2005 16:47


Form ohne Animation maximieren
 
Hallo zusammen,
mein Problem diesmal: Ich will ein Formular (MDI Child) ohne Animation maximieren. Ich habe schon ziemlich alles versucht, bin aber nicht zu einer Lösung gekommen.

Ich hoffe, ihr wisst weiter! :thumb:

Gruß, Marco

phlux 26. Sep 2005 16:57

Re: Form ohne Animation maximieren
 
Hi Marco,

das geht wie folgt:
Delphi-Quellcode:
  //In deiner Hauptform rufst du auf:
  LockWindowUpdate(Handle);
  //Danach das MDI-Child erstellen
  // ...
  //Dann die Hauptform wieder zum neuzeichnen freigeben
  LockWindowUpdate(0);
Der negative Seiteneffekt ist allerdings, dass für einen kurzen Moment deine Form einfriert und es so aussieht als ob dein Prog hängt. Hoffe dir geholfen zu haben ;)

Mfg phlux :hi:

Marphy 26. Sep 2005 18:56

Re: Form ohne Animation maximieren
 
Hallo Christian,

Zitat:

Zitat von phlux
Der negative Seiteneffekt ist allerdings, dass für einen kurzen Moment deine Form einfriert und es so aussieht als ob dein Prog hängt. Hoffe dir geholfen zu haben ;)

Hmm, das verhindert zwar, dass der Effekt angezeigt wird, dieser wird aber dennoch ausgeführt (während der Zeit, in der das Programm zu hängen scheint). Ich brauche es aber ganz ohne Wartezeit...

Danke trotzdem! :)

Gruß, Marco

Jelly 26. Sep 2005 19:45

Re: Form ohne Animation maximieren
 
Ulkig... Bei Delphi 4 suchte ich mal nach ne Funktion um das Maximieren zu animieren. :wall: Dann war das ja doch kein Bug sondern ein Feature. :mrgreen:

Aber sorry, weiss allerdings auch kein Rat.

Marphy 26. Sep 2005 20:04

Re: Form ohne Animation maximieren
 
Hi Tom,

Zitat:

Zitat von Jelly
Ulkig... Bei Delphi 4 suchte ich mal nach ne Funktion um das Maximieren zu animieren. :wall: Dann war das ja doch kein Bug sondern ein Feature. :mrgreen:

Es wäre super, wenn von euch vielleicht jemand eben diesen Delphi4-VCL-Code rauskramen könnte... Dieser hat warscheinlich die Lösung parat. :cyclops:

Danke, Marco

SirThornberry 26. Sep 2005 20:10

Re: Form ohne Animation maximieren
 
die Animation kommt vom Windows, demnach solltest du es einfach im Windows abstellen. Oder du lässt den maximieren button weg und machst einen eigenen Button der die Größe des Forms ändert. Letztendlich wird schließlich bei dem Effekt nicht das Form stück für stück vergrößert sonder einfach nur der StandardWindow-Rahmen animiert vergrößert.

Marphy 26. Sep 2005 20:17

Re: Form ohne Animation maximieren
 
Hello Sir,

Zitat:

Zitat von SirThornberry
die Animation kommt vom Windows, demnach solltest du es einfach im Windows abstellen.

Ich stelle doch die Animation nicht in Windows für alle Fenster ab, was soll den da der Nutzer sagen?! :roll:

Zitat:

Zitat von SirThornberry
Oder du lässt den maximieren button weg und machst einen eigenen Button der die Größe des Forms ändert.

Die Animation beim Klick auf den Maximieren-Button in der Titelleiste ist schon okay, ich will das Fenster ja nur beim Anzeigen (z.b. OnShow-Event) "unanimiert" maximieren.

Zitat:

Zitat von SirThornberry
Letztendlich wird schließlich bei dem Effekt nicht das Form stück für stück vergrößert sonder einfach nur der StandardWindow-Rahmen animiert vergrößert.

Das war mir auch schon vorher klar... :wink:

Gruß, Marco

Toenn 26. Sep 2005 20:25

Re: Form ohne Animation maximieren
 
Zitat:

Zitat von Marphy
Hello Sir,

Zitat:

Zitat von SirThornberry
die Animation kommt vom Windows, demnach solltest du es einfach im Windows abstellen.

Ich stelle doch die Animation nicht in Windows für alle Fenster ab, was soll den da der Nutzer sagen?! :roll:
Gruß, Marco

Naja was ganz unprofessionelles:
Abschalten, Maximieren, Anschalten :D

Marphy 26. Sep 2005 20:33

Re: Form ohne Animation maximieren
 
Zitat:

Zitat von Toenn
Naja was ganz unprofessionelles:
Abschalten, Maximieren, Anschalten :D

Sorry Toenn, aber als "Lösung" kann man soetwas ja eher nicht bezeichnen... :stupid: :wink:

Vielen Dank trotzdem schon einmal für die rege Beteiligung! :thumb: Um diese Uhrzeit hätte ich damit echt nicht gerechnet... :)

Grüße, Marco

DBR 26. Sep 2005 20:41

Re: Form ohne Animation maximieren
 
bei normalen Fenstern mache ich das so:

Delphi-Quellcode:
type
  TForm1 = class(TForm)
  private
    { Private-Deklarationen }
  public
    procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND;
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.WMSysCommand;
begin
  if (Msg.CmdType = SC_MAXIMIZE)
    then begin
    hide;
    windowstate := wsMaximized;
    show;
  end else inherited;
end;
Vielleicht hilfts!

Marphy 29. Sep 2005 14:13

Re: Form ohne Animation maximieren
 
Hallo DBR,

Zitat:

Zitat von DBR
bei normalen Fenstern mache ich das so:
Delphi-Quellcode:
[...]
procedure TForm1.WMSysCommand;
begin
  if (Msg.CmdType = SC_MAXIMIZE)
    then begin
    hide;
    windowstate := wsMaximized;
    show;
  end else inherited;
end;
Vielleicht hilfts!

Danke für den Tipp! Dieser funktioniert ansich ganz toll, aber für mein Problem ist er nicht die Lösung. :cry:

1) Das VCL-Hide() weigert sich, MDI-Childs zu verstecken. Ist kein Problem, einfach in ShowWindow(Handle, SW_HIDE) umwandeln, dann funktiert das. :)

2)
Zitat:

Zitat von Marphy
Die Animation beim Klick auf den Maximieren-Button in der Titelleiste ist schon okay, [...]

Tja, und beim Maximieren per Code (z.B. WindowState = wsMaximized oder per ShowWindow) wird keine WM_SYSCOMMAND-Botschaft gesendet. Und im anderen Fall, beim Maximieren per Titelleiste, will ich den Effekt ja.
Ersteres kann durch Maximieren über SendMessage(Handle, WM_SYSCOMMAND, SC_MAXIMIZE, 0) umgangen werden, der zweite Punkt ist z.B. über lParam zu lösen (bei SendMessage diesen einfach z.B. auf 1 setzen und in WMSysCommand dann abfragen).

3) Aber:
Zitat:

Zitat von Marphy
[...] ich will das Fenster ja nur beim Anzeigen (z.b. OnShow-Event) "unanimiert" maximieren.

Nun, und selbst wenn man obigen Code einsetzt, beim Maximieren per Code im OnShow()-Event des MDI-Childs lässt sich die Animation leider nicht unterdrücken. :(

So, und an diesem letzten Punkt bin ich gescheitert... :?


Vielleicht noch ein kleiner (vielleicht doch nicht ganz unwichtiger) Nachtrag: :oops:
Worum es mir eigentlich geht, d.h. was ich tun will, ist folgendes: Meine Anwendung speichert beim Beenden, ob das aktive MDI-Child maximiert ist oder nicht. Beim nächsten Start der Anwendung und Öffnen eines MDI-Childs soll dieses wieder direkt im gespeicherten Zustand erscheinen (d.h. maximiert oder normal, ohne Animation).


Ich hoffe auf weitere Antworten! Danke schon im Voraus! :thumb:

Grüße, Marco

Igotcha 29. Sep 2005 14:30

Re: Form ohne Animation maximieren
 
Dafür hätte ich auch gerne eine Lösung, denn meine Anwendung benutzt MDI-Childs in BPLs (komplettes Anwendungsmodul in einer BPL). Wenn ich jetzt vom Hauptprogramm etwas öffne, habe ich auch diese Maximieren-Animation die zwar technisch nicht stört, jedoch nicht chic für das Auge ist.

Gruß Igotcha

Marphy 1. Okt 2005 16:08

Re: Form ohne Animation maximieren
 
Hey, keine Ideen mehr? :(

:coder: Bitte um Hilfe :wink:
Danke, Marco

Marphy 4. Okt 2005 19:03

Keine Ideen?
 
*push* :(

Flocke 5. Okt 2005 15:06

Re: Form ohne Animation maximieren
 
Wenn du schon vor der eigentlichen Erstellung des Fensters weißt, ob es maximiert sein soll, dann könntest du noch versuchen, CreateParams zu überschreiben:

Delphi-Quellcode:
// im interface-Teil innerhalb der TFormN-Deklaration
// ...
protected
  procedure CreateParams(var Params: TCreateParams); override;
// ...

// im implementation-Teil
procedure TFormN.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  if Maximiert then
    Params.Style := Params.Style or WS_MAXIMIZE;
end;

Marphy 5. Okt 2005 16:56

Re: Form ohne Animation maximieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,

Zitat:

Zitat von Flocke
Wenn du schon vor der eigentlichen Erstellung des Fensters weißt, ob es maximiert sein soll, dann könntest du noch versuchen, CreateParams zu überschreiben:

Danke für den Vorschlag Volker, aber die Animation bleibt, was man auch versucht.... :(

So, ich habe jatzt ein kleines Projekt geschrieben, welches den Sachverhalt verdeutlicht. Spielt einfach mal rum, Event-Handler & Co. sind alle (?) schon reingeschrieben, ihr könnt also direkt loslegen.

Falls ihr einen Lösungsweg gefunden habt, bitte posten! :-D

Ich freue mich auf euer Feedback!

Gruß und Dank,
Marco

mschaefer 6. Okt 2005 00:07

Re: Form ohne Animation maximieren
 
Hallo Marco,

Dir scheinen die kniffligen Fragen ja nicht auszugehen und da ich heute Nacht Wartungsdienst habe bin ich nun hier gelandet. Auch wenn es überhaupt nicht so faszinierenden Codes bedarf, könntest Du nicht einfach ein Panel im MDI Formular über den ganzen Clientbereich legen und nachdem die Clientfenster createt sind mit visible auf false verschwinden lassen. Damit würde der Fensteraufbau quasi im Untergrund passieren. Panel visible Position setzen und dann application.Processmessages.

Ok, hat nicht die Faszination einer eigenen Formularcomponente...aber vielleicht...

Grüße // Martin

Luckie 6. Okt 2005 00:11

Re: Form ohne Animation maximieren
 
Also ich sehe da keine Animation. Kann es an den grafischen Einstellungen deines Betriebssystems oder an der Theme liegen, dass du bei dir eine Animation hast?

SirThornberry 6. Okt 2005 06:50

Re: Form ohne Animation maximieren
 
@Luckie: Die Animation sieht man nur wenn der Schnickschnack im Betriebssystem aktiviert ist.

Marphy 6. Okt 2005 12:45

Re: Form ohne Animation maximieren
 
Hallo zusammen,

Zitat:

Zitat von mschaefer
Dir scheinen die kniffligen Fragen ja nicht auszugehen

:x

Zitat:

Zitat von mschaefer
Auch wenn es überhaupt nicht so faszinierenden Codes bedarf, könntest Du nicht einfach ein Panel im MDI Formular über den ganzen Clientbereich legen und nachdem die Clientfenster createt sind mit visible auf false verschwinden lassen. Damit würde der Fensteraufbau quasi im Untergrund passieren. Panel visible Position setzen und dann application.Processmessages.

Danke für den Vorschlag Martin, aber dies würde doch nichts anderes bezwecken als z.B. LockWindowUpdate(frmMain.Handle) - die Animation ist zwar nicht sichtbar, aber die Zeit für den Effekt wird trotzdem in Anspruch genommen.

Zitat:

Zitat von mschaefer
Ok, hat nicht die Faszination einer eigenen Formularcomponente...aber vielleicht...

Ich glaube, dass ein Panel überhaupt nichts bezwecken würde, da die Animation nicht auf dem Main-Form-DC gezeichnet wird. Und wenn doch, kann dasselbe viel einfacher auch per oben genanntem Code erreicht werden.

Zitat:

Zitat von Luckie
Also ich sehe da keine Animation. Kann es an den grafischen Einstellungen deines Betriebssystems oder an der Theme liegen, dass du bei dir eine Animation hast?

Zitat:

Zitat von SirThornberry
@Luckie: Die Animation sieht man nur wenn der Schnickschnack im Betriebssystem aktiviert ist.

Wenn Jelly diesen "Schnickschnack" in seinem BS nicht abgestellt hat, könnte der Delphi 4-VCL Code die Lösung des Problems sein... Falls also jemand noch irgendwo die Forms.pas o.ä. als D4-Version rauskramen kann, wäre ich diesem sehr dankbar! :spin2:
Zitat:

Zitat von Jelly
Ulkig... Bei Delphi 4 suchte ich mal nach ne Funktion um das Maximieren zu animieren.

Gruß, Marphy alias Marco

Marphy 12. Okt 2005 16:10

Re: Form ohne Animation maximieren
 
Tut mir Leid, dass ich so aufdringlich bin, aber ich komme allein einfach nicht auf die Lösung. :(

Bitte um Hilfe!

Danke, Marco

SirThornberry 12. Okt 2005 16:47

Re: Form ohne Animation maximieren
 
hast du es schon mit SystemParametersInfo in Zusammenhang mit SPI_SETANIMATION probiert?
In der VCL wird es teilweise genau so gemacht, und zwar wird erst abgerufen ob die Animation aktiviert ist, wenn dem so ist wird es deaktiviert, dann wird das Fenster angezeigt und danch wird der Wert zurück gesetzt (sind nur paar zeilen, aber vcl-funktionen zu posten fällt wohl in das copyright und so schwer ist es ja auch nicht)

Flocke 12. Okt 2005 18:13

Re: Form ohne Animation maximieren
 
SirThornberry hat Recht, in der VCL machen die wirklich so etwas (der Code ist jetzt nicht unbedingt Copyrightgefährdet, also poste ich ihn einfach mal):
Delphi-Quellcode:
function GetAnimation: 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;

procedure SetAnimation(Value: Boolean);
var
  Info: TAnimationInfo;
begin
  Info.cbSize := SizeOf(TAnimationInfo);
  BOOL(Info.iMinAnimate) := Value;
  SystemParametersInfo(SPI_SETANIMATION, SizeOf(Info), @Info, 0);
end;

procedure CreateFormNoAnimate(Class: TComponentClass; var Reference);
var
  Animation: Boolean;
  Instance: TComponent;
begin
  Animation := GetAnimation;
  try
    if Animation then
      SetAnimation(False);

    Instance := TComponent(InstanceClass.NewInstance);
    TComponent(Reference) := Instance;
    try
      Instance.Create(Application);
    except
      TComponent(Reference) := nil;
      raise;
    end;
  finally
    if Animation then
      SetAnimation(True);
  end;
end;
... oder ohne Erzeugen halt so:

Delphi-Quellcode:
procedure WindowStateNoAnimate(Form: TCustomForm; State: TWindowState);
var
  Animation: Boolean;
begin
  Animation := GetAnimation;
  try
    if Animation then
      SetAnimation(False);

    Form.WindowState := State;
  finally
    if Animation then
      SetAnimation(True);
  end;
end;

Marphy 13. Okt 2005 13:02

Re: Form ohne Animation maximieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,
warum nicht gleich so? :-D Danke Volker, dein Code funktioniert einwanfrei! Vor lauter Begeisterung habe ich gleich mein Demoprojekt umgeschrieben, sodass das MDI Child tatsächlich unanimiert angezeigt wird.

Danke auch dir, SirThornberry, und all den anderen Postern. :thumb:

Endlich ein Problem weniger...

Grüße und herzlichen Dank,
Marco


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:29 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