AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Glyph in einer ActionToolbar unsichtbar im "onHover"-Zustand
Thema durchsuchen
Ansicht
Themen-Optionen

Glyph in einer ActionToolbar unsichtbar im "onHover"-Zustand

Ein Thema von ASM · begonnen am 17. Aug 2012 · letzter Beitrag vom 18. Aug 2012
Antwort Antwort
ASM

Registriert seit: 16. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#1

Glyph in einer ActionToolbar unsichtbar im "onHover"-Zustand

  Alt 17. Aug 2012, 14:47
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 ?
  Mit Zitat antworten Zitat
ASM

Registriert seit: 16. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: Glyph in einer ActionToolbar unsichtbar im "onHover"-Zustand

  Alt 17. Aug 2012, 17:58
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.
  Mit Zitat antworten Zitat
ASM

Registriert seit: 16. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#3

AW: Glyph in einer ActionToolbar unsichtbar im "onHover"-Zustand

  Alt 18. Aug 2012, 16:09
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:26 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