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/)
-   -   Glyph in einer ActionToolbar unsichtbar im "onHover"-Zustand (https://www.delphipraxis.net/169872-glyph-einer-actiontoolbar-unsichtbar-im-onhover-zustand.html)

ASM 17. Aug 2012 13:47

Glyph in einer ActionToolbar unsichtbar im "onHover"-Zustand
 
Ausgangslage:
Auf einer ActionToolbar als Teil eines ActionManagers habe ich mehrere Einträge.
Jeder Eintrag ist jeweils über ein in der Actionlist zugewiesenes Glyph repräsentiert.
Einzelne dieser Einträge haben zusätzlich Untereinträge, die über linken Mausklick auf den betreffenden Haupteintrag aufklappen.

Problem:
Bei der Bewegung der Maus über einen Eintrag der ActionToolbar (sog. "onHover"), welcher solche Untereinträge besitzt, verschwindet das Glyph dieses Haupteintrages.
Erst durch Verlassen des Eintrages oder durch Klick auf den Pfeil zur Öffnung des Menüs mit Anzeige der Untereinträge wird das Glyph das Haupteintrages wieder sichtbar - im letzteren Fall zusätzlich zum Menü der Untereinträge.
Ich möchte aber, dass das Glyph des Haupteintrages permanent sichtbar bleibt, also auch im reinen "onHover"-Zustand.

Gibt es eine Lösung ?

ASM 17. Aug 2012 16:58

AW: Glyph in einer ActionToolbar unsichtbar im "onHover"-Zustand
 
Ergänzung nach einigen Experimenten:
Das Problem tritt (nur ?) unter Delphi 7 auf, nicht jedoch unter Delphi XE.
Außerdem macht es sich unter Delphi 7 auch nur dann wie zuvor beschrieben bemerkbar, wenn man im Haupteintrag das Property ShowCaption:=false setzt und somit in der ActionToolbar zu diesem Eintrag allein dessen Glyph sichtbar werden lässt.
Ist also offenbar ein Bug in Delphi 7.

ASM 18. Aug 2012 15:09

AW: Glyph in einer ActionToolbar unsichtbar im "onHover"-Zustand
 
Hier folgend die Lösung des Problems, obwohl eine Lösung für neuere Delphi-Versionen, zumindest ab XE, nicht mehr relevant ist. Dagegen für das auch von mir immer noch zumeist bevorzugte, wunderbar kompakte und stabile Delphi 7 aber schon.

Als Ergebnis meiner vergleichenden Untersuchung der VCL-Quellcodes zwischen Delphi XE und Delphi 7 ist folgendes herausgekommen: In der Unit XPActnCtrls.pas von Delphi 7 müssen an 3 Positionen zwei neue Codeanweisungen eingefügt werden.

Der wichtigste, zusätzlich einzufügende Code ist Code #1:
// CODE #1:
Code:
Canvas.Brush.Style := bsClear;
Zur Optimierung des Aussehens, aber nicht zwingend notwendig, ist der weitere, an zwei Positionen in der Unit inzufügende Code:
// CODE #2:
Code:
SelBmp.Canvas.FillRect(SelBmp.Canvas.ClipRect);
ActionList.Images.Draw(SelBmp.Canvas, 0, 0, ActionClient.ImageIndex, dsNormal, itMask);

Diese Codes müssen in der Unit XPActnCtrls.pas an folgenden Stellen zugefügt werden:
CODE #1:
Code:
procedure TXPStyleDropDownBtn.DrawFrame(ARect: TRect; Down: Boolean);
begin
  if Enabled and not (ActionBar.DesignMode) then
    if (MouseInControl or IsChecked) and Assigned(ActionClient) then
    begin
      // **** CODE #1 HIER ZUFÜGEN ***
      Canvas.Pen.Color := ActionBar.ColorMap.BtnFrameColor;
      {...}
    end;
end;
CODE #2:
Code:
procedure TXPStyleButton.DrawGlyph(const Location: TPoint);
    {...}
    try
      {...}
      if ActionList.Images.GetBitmap(ActionClient.ImageIndex, SelBmp) then
      begin
        {...}
        // **** CODE #2 HIER ZUFÜGEN ***
        DrawState(Canvas.Handle, Canvas.Brush.Handle, nil, SelBmp.Handle, 0,
          NewLocation.X + 1, NewLocation.Y + 1, 0, 0, DST_BITMAP or DSS_MONO);
      end;
    finally
      {...}
    end;
{...}
end;

procedure TXPStyleDropDownBtn.DrawGlyph(const Location: TPoint);
    {...}
    try
      {...}
      if ActionList.Images.GetBitmap(ActionClient.ImageIndex, SelBmp) then
      begin
        {...}
        // **** CODE #2 HIER ZUFÜGEN ***
        DrawState(Canvas.Handle, Canvas.Brush.Handle, nil, SelBmp.Handle, 0,
          NewLocation.X + 1, NewLocation.Y + 1, 0, 0, DST_BITMAP or DSS_MONO);
      end;
    finally
      {...}
    end;
{...}
end;
Anschließend natürlich das komplette Rebuild nicht vergessen, damit die DCUs das auch mitbekommen.


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