Avatar billede a_c Nybegynder
25. januar 2002 - 14:15 Der er 10 kommentarer og
2 løsninger

disable minimize

Hvordan kan jeg sørge for at en form på ingen måde kan minimeres ?

a_c
Avatar billede martinlind Nybegynder
25. januar 2002 - 14:18 #1
sæt borderIcons Property'en
Avatar billede a_c Nybegynder
25. januar 2002 - 14:19 #2
nej det er ikke nok.
Så kan jeg stadig trykke f.eks. windowstast+m
Avatar billede snowball Novice
25. januar 2002 - 14:51 #3
Har ikke lige afprøvet det, men det ligner da noget der må kunne bruges ;)

Question/Problem/Abstract:

Have you ever wanted, that your form gets an event when it was minimized?
Answer:


Try this extension to the normal form. You can assign a handler to the OnMnimize property and choose from three "automatic" actions built in in the form:

tmNone = Dont minimize the Window
tmWindow = minimize the Window as usual
tmAll = Minimze all windows of the application

Installation: Put the Unit in the library folder of your delphi compiler and import it to your form sourcecode.

Usage: Replace the

type TMyForm = class (TForm)

of your form with

type TMyForm = class (TMiniForm)

Thats all. Assign the OnMinimze property at runtime. Example:

procedure TMyForm.MyMinimize (Sender: TObject; var state: TMiniState);
begin
state:= tmAll; // minimize all windows
end;

procedure TMyForm.FormCreate;
begin
OnMinimize:= MyMinimize;
end;


//---------------------------------------------------------
unit MiniForm;

interface

uses  Windows, Messages, SysUtils, Classes, Graphics, Controls,
      Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, Mask, Menus;

// state flags for automatic handling of minimize events
type  TMiniState = (tmNone,  // dont react to the message
                    tmWindow, // minimize the window
                    tmAll);  // minimze all windows of the app

// the minimize event himself
type  TMinimizeEvent = procedure (Sender: TObject;
                        var state: TMiniState) of object;

type  TMiniForm = class (TForm) // derived from TForm
      private
        FOnMinimize: TMinimizeEvent;
        FOnRestore: TNotifyEvent;
        procedure WMSIZE(Var Msg: TWMSIZE); Message WM_SIZE;
        procedure WinRestore (Sender: TObject);
      public
        constructor Create (AOwner: TComponent); override;
        destructor Destroy; override;
      published
        property OnMinimize: TMinimizeEvent read FOnMinimize
                                            write FOnminimize;
      end;

implementation

destructor TMiniForm.Destroy;
begin
inherited
end;

constructor TMiniForm.Create (AOwner: TComponent);
begin
FOnMinimize:= NIL;
inherited;
end;

procedure TMiniForm.WMSIZE (VAR msg: TWMSIZE);
// catch the WM_SIZE message to know what happend
var status: TMiniState;
begin
if msg.SizeType = integer (wsMinimized) THEN BEGIN
  IF Assigned (FOnMinimize) then begin
  status:= tmWindow; // Default action
  FOnMinimize (self, status);
  case status OF
    tmNone:  // Tell windows to restore the window immedately
              PostMessage(Handle, WM_SYSCOMMAND, SC_RESTORE, 0);
    tmWindow: ; // All is done by windows and Delphi
    tmAll:    // Minimize all windows of the app
              begin
              // Store the OnRestore event
              FOnRestore:= Application.OnRestore;
              // Replace it with own handler
              Application.OnRestore:= WinRestore;
              // Minimize all
              Application.Minimize;
              end;
  end;
  end;
end;
inherited; // Call other hanlder of WMSIZE event
end;

procedure TMiniForm.WinRestore (Sender: TObject);
// handles restoring of the windows
begin
// made Window normal
WindowState:= wsNormal;
// Restore other Windows of the app
Application.Restore;
// Restore the old Restore handler
Application.OnRestore:= FOnRestore;
// Call the restore handler
IF Assigned (FOnRestore) then FOnRestore (sender);
end;

end.


Snowball
Avatar billede snowball Novice
25. januar 2002 - 15:01 #4
Måske en lidt lettere måde, men så er spørgsmålet bare hvad man skal skrive for at den ikke fortsætter med at minimere formen !? ;)

Question/Problem/Abstract:

Does anybody know how to capture the minimize button press and act on
it before it actually minimizes the form?
Answer:


You should intercept WM_SYSCOMMAND messages like this:

type
  TForm1 = class(TForm)
    public
    procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND;
  end;

procedure TForm1.WMSysCommand;
begin
  if (Msg.CmdType = SC_MINIMIZE) or (Msg.CmdType = SC_MAXIMIZE) then
  begin
    // your code...
  end;
  DefaultHandler(Msg);
end;


Snowball
Avatar billede martinlind Nybegynder
25. januar 2002 - 15:06 #5
Det er ikke nok at fange den i WMSyscommand det disabler kun minimize knappen på formen som ved at sætter bordericon
Avatar billede a_c Nybegynder
25. januar 2002 - 15:10 #6
æv..
Avatar billede stoney Nybegynder
25. januar 2002 - 15:15 #7
Avatar billede martinlind Nybegynder
25. januar 2002 - 15:21 #8
let omskrevet virker den

procedure TForm1.WMShowWindow(var Message: TWMShowWindow);
begin
  if not Message.Show then Message.Result := 0 else inherited;
end;

bortset fra at den kommer ud af sync. på sin menu
Avatar billede martinlind Nybegynder
25. januar 2002 - 15:22 #9
procedure WMShowWindow(var Message: TWMShowWindow); message WM_SHOWWINDOW;
Avatar billede a_c Nybegynder
25. januar 2002 - 15:31 #10
Tak til jer begge.
Det virker faktisk sådan nogenlunde.
Ha' en go' weekend.

a_c
Avatar billede geek1011 Nybegynder
25. januar 2002 - 15:36 #11
Klik på din Form, find din Object Inspector, dobbelklik på BorderIcons og sæt biMinimize til False.
Avatar billede martinlind Nybegynder
25. januar 2002 - 15:39 #12
geek1011 >> læs alle komentarer, prøv evt selv !!!!!!!!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester