![]() |
Kontextsensitive Hilfe / biHelp-Button trotz Minimize-Button?
Hallo Delphifreunde!
Möchte man die kontextsensitive Hilfe über Aktivierung des Minimize-Buttons benutzen, so stößt man auf folgende Einschränkung, die in der Delphi-Hilfe so formuliert ist: Zitat:
Nun, das stimmt nicht ganz: Bei aktiviertem Minimize-Button wird dieser Fragezeichen-Button doch wenigstens angezeigt, ist jedoch leider nicht bedienbar, biMaximize läßt ihn, wie beschrieben, hingegen gänzlich verschwinden. Nun meine beiden Fragen dazu (bitte laßt mich gleich zwei Fragen stellen, ein extra Thema für jede einzelne wäre zuviel): Ist dieses einschränkende Verhalten windows-bedingt oder eine Schwäche der VCL? Kann man das irgendwie überlisten? Ich hätte nämlich gern den Minimize- und Help-Button, natürlich beide bedienbar. Danke und Gruß Delphi-Laie |
AW: Kontextsensitive Hilfe / biHelp-Button trotz Minimize-Button?
Dann mach es so:
Delphi-Quellcode:
...
protected procedure WMNCLButtonDown(var Message: TWMNCLButtonDown); message WM_NCLBUTTONDOWN; end; ... implementation {$R *.dfm} procedure TForm1.WMNCLButtonDown(var Message: TWMNCLButtonDown); begin if (Message.HitTest = HTCAPTION) then self.WindowState:= wsMinimized; if (Message.HitTest = HTCLOSE) then Application.Terminate; if (Message.HitTest = HTHELP) then begin ShowMessage('hello world'); message.Result := 0; end else inherited; end; |
AW: Kontextsensitive Hilfe / biHelp-Button trotz Minimize-Button?
Das ist zwar nicht das erhoffte gleichzeitige Funktionieren des biMinimize- und biHelp-Buttons, aber danke für Antwort! Zumindest sind damit alle 3 Funktionen in der Titelleiste enthalten.
|
AW: Kontextsensitive Hilfe / biHelp-Button trotz Minimize-Button?
Zitat:
Der entsprechende Code ist in der Unit Vcl.Forms zu finden:
Delphi-Quellcode:
Damit biHelp beachtet wird, muss also immer biSystemMenu gesetzt sein. Weder biMaximize noch biMinimize dürfen gesetzt sein, es sei denn BorderStyle ist bsDialog, da werden biMaximize und biMinimize einfach ignoriert.
procedure TFormStyleHook.PaintNC(Canvas: TCanvas);
// ... if (biHelp in Form.BorderIcons) and (biSystemMenu in Form.BorderIcons) and ((not (biMaximize in Form.BorderIcons) and not (biMinimize in Form.BorderIcons)) or (Form.BorderStyle = bsDialog)) then // ... Zitat:
![]() biHelp entspricht dem Extended Style Flag WS_EX_CONTEXTHELP: "WS_EX_CONTEXTHELP cannot be used with the WS_MAXIMIZEBOX or WS_MINIMIZEBOX styles." Zitat:
![]() Zitat:
Delphi-Quellcode:
procedure TForm1.WMNCLButtonDown(var Message: TWMNCLButtonDown);
begin case Message.HitTest of HTCAPTION: WindowState:= wsMinimized; // HTCLOSE: Close; // kann man sich sparen, ist die Standardaktion HTHELP: begin ShowMessage('hello world'); Message.Result := 0; end else inherited; end; end; |
AW: Kontextsensitive Hilfe / biHelp-Button trotz Minimize-Button?
Man könnte es umschaltbar machen:
Delphi-Quellcode:
protected
procedure WMNCLButtonDown(var Message: TWMNCLButtonDown); message WM_NCLBUTTONDOWN; end; var Form1: TForm1; switched : Boolean; implementation {$R *.dfm} procedure TForm1.WMNCLButtonDown(var Message: TWMNCLButtonDown); begin if (Message.HitTest = HTCAPTION) then BEGIN if switched=TRUE then begin BorderIcons := [biSystemMenu,biMinimize,biHelp]; BorderIcons := BorderIcons - [biMinimize]; switched:=FALSE; end else begin BorderIcons := [biSystemMenu,biMinimize,biHelp]; BorderIcons := BorderIcons - [biHelp]; switched:=TRUE; end; END; if (Message.HitTest = HTCLOSE) then Application.Terminate; if (Message.HitTest = HTHELP) then begin ShowMessage('hello world'); message.Result := 0; end else inherited; end; |
AW: Kontextsensitive Hilfe / biHelp-Button trotz Minimize-Button?
Zitat:
Erstens ist
Delphi-Quellcode:
sinnlos, da kannst du gleich
[biSystemMenu,biMinimize,biHelp] - [biMinimize]
Delphi-Quellcode:
schreiben.
[biSystemMenu,biHelp]
Zweitens lass das Application.Terminate da weg, wenn schon dann Close, aber beides ist unnötig!
Delphi-Quellcode:
Das ist übrigens schlechter Stil, man sollte Boolsche Werte niemals per "=" auf True prüfen, sonst kann man sich schwer zu findende Bugs einfangen!
if switched=TRUE then
Hintergrund: "False" ist definiert als = 0, "True" ist logischerweise "not False", d.h. <> 0. Als Konstante ist "True" jedoch als 1 definiert (jedenfalls für den Standardtyp "Boolean", für die Typen ByteBool, WordBool, LongBool ist es -1, das ignorieren wir mal; der Compiler konvertiert normalerweise automatisch richtig zwischen diesen Typen). Für Anweisungen wie
Delphi-Quellcode:
erzeugt der Delphi-Compiler Code, der auf <> 0 prüft (korrekt für alle Boolschen Typen und Werte).
if Switched then
Für Anweisungen wie
Delphi-Quellcode:
erzeugt der Delphi-Compiler für den "Boolean"-Typ Code, der auf = 1 prüft und das kann Probleme geben!
if Switched = True then
Kleiner Test:
Delphi-Quellcode:
Zugegeben, das Schreiben eines anderen Wertes als 0 oder 1 in einen Boolean-Typ per Typecast hier ist etwas gekünstelt, aber wenn man Third-Party-Code benutzt, der nicht in Delphi geschrieben wurde, kann das durchaus mal vorkommen.
procedure BooleanTest;
var B: Boolean; begin Byte(B) := 2; // B ist <> 0, d.h. entspricht logisch "True"... wird aber NICHT bei "B = True" erkannt! // prüft B = 1: SCHLECHT! if B = True then ShowMessage('B = True'); // prüft B = 0: OK, aber schlechter Stil if B = False then ShowMessage('B = False'); // prüft B <> 0: korrekt! if B then ShowMessage('B *is* True!'); // prüft B = 0: korrekt! if not B then ShowMessage('B *is NOT* True!'); end; |
AW: Kontextsensitive Hilfe / biHelp-Button trotz Minimize-Button?
Leute, bitte geratet Euch nicht in die Haare, dafür sind sowohl ich als auch mein Anliegen zu unwichtig.
Zitat:
Ich werde das jetzt noch mal in Ruhe durcharbeiten, ahne aber, daß ich mit dieser Einschränkung wohl werde leben müssen. Besten Dank für Eure Hilfe! |
AW: Kontextsensitive Hilfe / biHelp-Button trotz Minimize-Button?
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz