Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - borderIcons: [biSystemMenu,biMinimize,biMaximize]


bombilein - Di 31.08.04 17:05
Titel: borderIcons: [biSystemMenu,biMinimize,biMaximize]
hi,

welcher Event-handler ist für diese Border-Icons zuständig?

ich möchte z.b. das Maximieren in bestimmten Fällen unterdrücken.

Hab an das Event "OnCanResize" gedacht; dieser Versuch endete jedoch in einem Desaster :autsch:


Viper - Di 31.08.04 17:13

Hallo.

Das Event OnCanResize ist aber genau richtig, falls du das vergrößern oder verkleinern verhindern willst. Was ist denn dabei so schief gegangen? Schreib einfach mal den Code dazu, wo du die Probleme mit hattest.


bombilein - Di 31.08.04 17:30

Mein handler:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TfrmOrderView.FormCanResize(Sender: TObject; var NewWidth,
  NewHeight: Integer; var Resize: Boolean);
begin

  if(bcanResize) then begin // stellt sicher, dass ich nicht in der OnCreate Phase bin
    if(not Controller.GetScenarioActive()) then begin // Ob ich Fenstergröße beeinflussen darf.
      Resize := False;
   end;
  end;
end;


Interessant ist auch noch dieses:

Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TfrmOrderView.FormCreate(Sender: TObject);
begin
  bcanResize := False;
  WindowState := wsMinimized;
end;


D.h. ich minimieren das Fenster sofort in der Creation-Phase. Über den Objektinspektor hat es nur zu Problemen geführt.
Ich habe auch nicht nur dieses eine Formular, sondern insgesamt drei Stück.

Der Fehler ist jetzt folgender:

wenn ich auf den Button "maximiere" des Icons des Forms klicke, wird das Fenster maximiert.
zum einen werden die drei Buttons oben rechts angezeigt, zweitens wird unterhalb dem menü eine horizontale Linke von einigen cm Länge angezeigt.

habe gerade Screenshots angefertigt... aber ich habe kein webspace :(


bombilein - Di 31.08.04 17:55

Um die Auswirkungen noch deutlicher zu beschreiben:

wenn ich jetzt auf den "wiederherstell-icon" klicke, wird dieses durch das minimier-icon ausgetauscht. und das soll nicht geschehen.


Viper - Di 31.08.04 18:10

Hallo.

Wenn du möchtest, kannst du mir die Bilder via E-Mail schicken, dann stell ich sie Online.
Ich glaube aber, dass das nicht nötig ist. Wenn ich dich recht verstanden habe, möchtest du die drei Icons oben in der Formular-Leiste nicht angezeigt haben und das kannst du im Objektinspektor einstellen. Da gibt es die Eigenschaft Bordericons vom Formular. Dort kannst du einstellen, welche Icons angezeigt werden sollen, oder nicht.


bombilein - Di 31.08.04 18:16

Hi Viper,

das hatte ich auch schon probiert. Das Problem war jedoch, wenn ich alle icons ausblende und dann einen Doppelklick auf die Titelleiste tätige, schmiert das ganze Programm ab.

Aber an sich will ich die drei Icons schon haben; aber solange keine Datei geöffnet ist, sollen diese einfach keine Auswirkungen haben, sie sollen von mir per hand sozusagen abgefangen werden.

Email kommt gleich.


Motzi - Di 31.08.04 19:42

Einen Message-Handler für Suche in: Delphi-Forum, Delphi-Library WM_SYSCOMMAND schreiben und wParam auf SC_MAXIMIZE testen...


bombilein - Di 31.08.04 21:12

Danke MOtzi.

das war die Lösung. Es funktioniert jetzt einwandfrei mit nachstehendem Code.



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TfrmOrderView.WMSysCommand(var Msg: tWMSysCommand);
begin
  if(not Controller.GetScenarioActive()) then begin
     if(((Msg.CmdType and $FFF0) = SC_RESTORE) or
        ((Msg.CmdType and $FFF0) = SC_MAXIMIZE)) then begin
        ; // nothing
      end else
       DefaultHandler(Msg);
    end;
end;


aber ein paar kleine Fragen, damit ich nicht dumm sterben muss.

1. Wo finde ich mehr infos über "tWMSysCommand". in einer anderen doku als auch in der Delphi doku finde ich nur was über TMessage.

2. was bedeutet dies $FFF0! ich weiß gerade noch, dass das eine Zahl in hexdezimal-Darstellung ist.


Viper - Mi 01.09.04 11:52

Dann hat sich ja alles geklärt. Da wäre ich sowieso nie draug gekommen. :roll:
Die E-Mail kann ich dann ja einfach löschen!


Motzi - Mi 01.09.04 12:02

1) Informationen zu Suche im MSDN WM_SYSCOMMAND und anderen Messages bekommst du im PSDK oder online im [url=http://www.msdn.microsoft.com]MSDN[/url].

2) Diese And-Verknüpfung mit $FFF0 ist dazu da um die untersten 4 Bits des Parameters auszublenden, da diese intern von Windows verwendet werden. Würde man diese nicht ausblenden könnten sie das Ergebnis des Vergleichs verfälschen. Das SDK schreibt dazu:
PSDK hat folgendes geschrieben:
In WM_SYSCOMMAND messages, the four low-order bits of the wParam parameter are used internally by the system. To obtain the correct result when testing the value of wParam, an application must combine the value 0xFFF0 with the wParam value by using the bitwise AND operator.