Sie sind nicht angemeldet.

martinmartimeo

Boardsmutje

  • »martinmartimeo« ist der Autor dieses Themas

Beiträge: 971

Registrierungsdatum: 17. September 2006

  • Nachricht senden

1

Freitag, 9. März 2007, 00:50

[Delphi] reagieren wenn Fenster minimiert wird

HI und Hallo,

ich programmiere gerade für die Shcule ein Programm und stehe vor einem Problem und zwar folgendes:

Ich habe eine Anwendung die aus verschiedenen Forms besteht.
Das MainForm ist eine versteckte Form im Hintergrund.
Bei allen Forms habe ich die Buttons (Schließen, minimieren, Maximieren) deaktiviert.
Ich habe nur in der obersten Form, die Buttons gelassen.
Beim Click auf den Schließen Button wird mit OnClose dann auch darauf reagiert und die ganze Anwendung beendet, nur ich finde leider keine Methode das Minimieren abzufangen.
Da wenn man auf minimieren klickt, einfach nur die Form minimiert wird, der Rest aber stehend bleibt. Ich wollte aber mit Application.Minimize; die komplette Anwendung minimieren, nur ich finde halt keine Möglichkeit auf das Minimeiren des Fensters zu reagieren (Application.OnMinimize wird ja auch nicht ausgelöst).

Ich hoffe es ist klar :)

Meine Frage ist nun hat jemand einen Script der das Reagieren auf das Minimeiren von Fenstern(nicht Anwendung) möglich macht?

Danke

Bomi

Meister der Kleintools

Beiträge: 3 175

Registrierungsdatum: 2. Mai 2003

  • Nachricht senden

2

Freitag, 9. März 2007, 01:58

RE: [Delphi] reagieren wenn Fenster minimiert wird

Zitat

Original von martinmartimeo
hat jemand einen Script der das Reagieren auf das Minimeiren von Fenstern (nicht Anwendung) möglich macht?

Script habe ich nicht, bin auch kein Delphi-Profi, aber erinnere mich schwach an Events wie "FormResize" oder "OnResize", wo man dann mit "WindowState" den Status abfragen und entsprechend reagieren kann :scratch:
  ATH, Bomi

Contests: 2008 BEC BOC 1602 | 2007 BEC BOC | 2006 BEC BOC | 2005 BEC BOC | 2004 BEC

ANNOTunesANNOToolsMetropolaris, Georgolaris1602-Zeugs1503-SzenarienDieter's 1503-Editor

martinmartimeo

Boardsmutje

  • »martinmartimeo« ist der Autor dieses Themas

Beiträge: 971

Registrierungsdatum: 17. September 2006

  • Nachricht senden

3

Freitag, 9. März 2007, 18:49

RE: [Delphi] reagieren wenn Fenster minimiert wird

Leider wird FormResize/OnResize nur aufgerufen, wenn man von Maximiert in Normal wechselt,
aber wenn man minimiert wird das Ereignis nicht ausgelöst leider. :scratch:

ich konnte jetzt zwar mit OnPaint herausfinden, wenn das Fenster wieder erscheint, das Minimeiren konnte ich noch nicht abfangen :worry:

martinmartimeo

Boardsmutje

  • »martinmartimeo« ist der Autor dieses Themas

Beiträge: 971

Registrierungsdatum: 17. September 2006

  • Nachricht senden

4

Freitag, 9. März 2007, 21:15

RE: [Delphi] reagieren wenn Fenster minimiert wird

ok, ich habe nun eine Lösung für die Sache gefunden, obwohl ich glaube es nicht die beste ist und es bestimmt ne bessere geben muss:

Folgendes: Beim Klick auf einen Systembutton (Minimieren, Maximieren, Verschieben, ...) wird Application.OnMessage ausgelöst, (unter der Bedingung das KEyPreview in der MainForm true ist) mit dem message.message Wert von 274/275.

dort frage ich nun ab, ob es sich um einen Klick auf den Minimierenbutton gehalten hat, dadurch das ich die Mauszeigerposition auslese und vergleiche.

dann wird dieses Fenster wieder angezeigt [ShowWindow(Handle,SW_NORMAL)] und dann die ganze Application minimiert [Application.Minimze];

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    procedure GetMessages(var msg: TMsg; var handled: boolean);
   { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

procedure TForm1.GetMessages(var msg: TMsg; var handled: boolean);
var formrechts: integer;
begin

if (msg.message = 274) OR (msg.message = 275) then begin
  //Klick auf SystemButon im blauen
  if Form1.WindowState = wsNormal then begin
    //im normalen Zustand wird gedrückt
    formrechts := Form2.Left + Form2.Width;
    if (msg.pt.X > formrechts - 90) and (msg.pt.X < formrechts- 50) then begin
      //X Kordinaten (wurde auf minimiert gedrückt?)
      ShowWindow(Unit2.Form2.Handle,SW_NORMAL);
      //Form wieder zeigen
      Application.Minimize;
      //nun ganze Anwendung minimieren
    end;
  end;
end;

end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnMessage:=GetMessages;
  KeyPreview := true;
end;


(Hier in diesem Beispiel ist Form1 die Mainform und Form2, die die minimiert wird)

Sir Henry

Pensionierter Oberbordschrauber

Beiträge: 1 710

Registrierungsdatum: 24. Mai 2003

  • Nachricht senden

5

Freitag, 9. März 2007, 21:37

Das ist von hinten durch die Brust ins Auge... und funktioniert nur zufällig bei dir, weil du Größe und Position der Systemknöpfe einfach annimmst. Sobald sich jemand andere Fensterdekorationen definiert, klappt das alles nicht mehr. So sollte man das wirklich nicht machen! :nono: ;)

Du könntest versuchen, die Message WM_SIZE abfangen. Diese enthält als WPARAM die Werte SIZE_MAXIMIZED, SIZE_MINIMIZED, SIZE_RESTORED usw.

Aber leider bin ich auch kein Delphi-Experte. ;)
  Cheers, Sir Henry
Schon im Anno-Pool vorbeigeschaut?

martinmartimeo

Boardsmutje

  • »martinmartimeo« ist der Autor dieses Themas

Beiträge: 971

Registrierungsdatum: 17. September 2006

  • Nachricht senden

6

Freitag, 9. März 2007, 21:56

naja was besseres ist mir nicht eingefallen, nun WM_Size gibt mir aber auch nicht mehr als die Fenstergröße, die ich ja mit Form.Width, ... auch bekomme?

Ich habe nun etwas neues entdeckt: Windows sendet eine WM_STYLECHANGED Message, leider habe ich keine Ahnung wie die im private Bereich definiert werden muss, kann mir da einer helfen?

Quellcode

1
2
3
WM_STYLECHANGED Notification

The WM_STYLECHANGED message is sent to a window after the SetWindowLong function has changed one or more of the window's styles.

Quellcode

1
2
3
4
5
6
 TWMStyleChange = packed record
    Msg: Cardinal;
    StyleType: Longint;
    StyleStruct: PStyleStruct;
    Result: Longint;
  end;



wenn ich folgendes:

Quellcode

1
2
3
4
  private
  { Private-Deklarationen }
    procedure WMSTYLECHANGED(var Msg: TWMSTYLECHANGED);message WM_STYLECHANGED;
 

mache geht es nicht, irgendwas fehlt da noch?

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »martinmartimeo« (9. März 2007, 22:00)


Sir Henry

Pensionierter Oberbordschrauber

Beiträge: 1 710

Registrierungsdatum: 24. Mai 2003

  • Nachricht senden

7

Freitag, 9. März 2007, 22:47

Zitat

Original von martinmartimeo
naja was besseres ist mir nicht eingefallen, nun WM_Size gibt mir aber auch nicht mehr als die Fenstergröße, die ich ja mit Form.Width, ... auch bekomme?


Nein, lParam enthält zwar die neue Fenstergröße, die interessiert dich nicht. Wenn aber wParam den Wert SIZE_MINIMIZED hat, wurde das Fenster minimiert. Siehe MSDN.

Eine weitere Möglichkeit wäre die Message WM_GETMINMAXINFO, siehe hier. Diese wird geschickt, bevor das Fenster minimiert wird.
  Cheers, Sir Henry
Schon im Anno-Pool vorbeigeschaut?

martinmartimeo

Boardsmutje

  • »martinmartimeo« ist der Autor dieses Themas

Beiträge: 971

Registrierungsdatum: 17. September 2006

  • Nachricht senden

8

Freitag, 9. März 2007, 22:52

sorry, wenn ich nochmal störe, aber kannst du mir sagen wie ich das im private Bereich der From definieren muss, bekomme das irgendwie für diese Prozeduren nicht hin?

hab mich damit noch nie auseinandergesetzt wirklich und ein Tutorial wie ich das definieren muss habe ich nicht gefunden?

drkohler

Master of Editor

Beiträge: 1 578

Registrierungsdatum: 18. Juni 2003

  • Nachricht senden

9

Mittwoch, 28. März 2007, 01:04

RE: [Delphi] reagieren wenn Fenster minimiert wird

Zitat

Original von martinmartimeo
HI und Hallo,

Da wenn man auf minimieren klickt, einfach nur die Form minimiert wird, der Rest aber stehend bleibt. Ich wollte aber mit Application.Minimize; die komplette Anwendung minimieren, nur ich finde halt keine Möglichkeit auf das Minimeiren des Fensters zu reagieren (Application.OnMinimize wird ja auch nicht ausgelöst).
Ich hoffe es ist klar :)
Application.Minimize ? Die Prozedur soll Wunder wirken... :g:

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »drkohler« (28. März 2007, 01:05)


Sir Henry

Pensionierter Oberbordschrauber

Beiträge: 1 710

Registrierungsdatum: 24. Mai 2003

  • Nachricht senden

10

Donnerstag, 29. März 2007, 08:33

Dieter, es ging nicht um die Funktion, sondern um den Event. Welcher Event zeigt an, dass eine einzelne Form (und nicht die ganze Applikation) minimiert wurde? Die Reaktion darauf war schon klar.

@Martin: Sorry, ich bin kein Delphi-Programmierer und weiß nicht, wie man das da im Einzelnen macht.
  Cheers, Sir Henry
Schon im Anno-Pool vorbeigeschaut?

martinmartimeo

Boardsmutje

  • »martinmartimeo« ist der Autor dieses Themas

Beiträge: 971

Registrierungsdatum: 17. September 2006

  • Nachricht senden

11

Donnerstag, 29. März 2007, 13:56

ich hab das Projekt mittlerweile abgeschlossen.

Ich hab dafür auf mühsamme Kleinarbeit, die obere Form (die minimiert wird) zur Mainform gemacht, dadurch geht es dann. Eine richtige Lösung habe ich noch nicht gefunden.

Danke für eure Hilfe und falls jemand doch noch über eine Lösung stolpert :hey:
ich bin Lernbereit.

drkohler

Master of Editor

Beiträge: 1 578

Registrierungsdatum: 18. Juni 2003

  • Nachricht senden

12

Sonntag, 1. April 2007, 22:13

Zitat

Original von Sir Henry
Dieter, es ging nicht um die Funktion, sondern um den Event. Welcher Event zeigt an, dass eine einzelne Form (und nicht die ganze Applikation) minimiert wurde? Die Reaktion darauf war schon klar.
.
Also wenn du irgendeine Form2 einer Anwendung minimierst

procedure WMSize(var Msg: TWMSize); message WM_SIZE;


procedure TForm2.WMSize(var Msg: TWMSize);
begin
if Msg.SizeType = SIZE_MINIMIZED then Application.Minimize;
end;

sollte genügen um Alles zu minimalisieren..