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/)
-   -   Delphi Farbe eine PopUpMenu ändern (https://www.delphipraxis.net/57756-farbe-eine-popupmenu-aendern.html)

eddy 25. Nov 2005 22:10


Farbe eine PopUpMenu ändern
 
Hallo Leute,

ich möchte die Hintergrundfarbe eines PopUpMenu ändern.

Hintergrund:

bei DBGrid.OnTitelClick wird ein anderes PopUpMenu aufgerufen als in den Datenzeilen.
In dem PopUpMenu der Titelzeile kann man u.a. die gespeicherten Einstellungen für die Tabellenspalten löschen, in dem PopUpMenu für die Datenzeilen kann man einen einzelnen Datensatz aus dem Datenbestand löschen.

Nun gibt es natürlich Nutzer, die das eine Menü nicht vom anderen unterscheiden können, und statt dem Datensatz, den sie löschen wollen, die Tabellenspalten-Definitionen löschen, mich dann anrufen, weil in dem DBGrid plötzlich alle Felder in der Standardbreite angezeigt werden und nerven, daß das Programm nicht geht. Warntexte vor dem Löschen helfen nicht weiter, da diese ohne gelesen zu werden übergangen werden.

Nun möchte ich das PopUpMenu der Titelzeile farblich (grell Rot oder so) anders darstellen, damit dieser Unsinn endlich aufhört, und ich nicht ständig damit beschäftigt bin, die Bedienfehler zu korrigieren.

Ein hilfreicher Link oder passender Quelltext wären toll.

mfg
eddy

Der_Unwissende 25. Nov 2005 23:25

Re: Farbe eine PopUpMenu ändern
 
Hi,
ich kann dir zwar nur sehr bedingt helfen, aber vielleicht reicht es ja als Anstoss in die Richtige Richtung.
Setz einfach im PopUp-Menü OwnerDraw auf True. Nun kannst du für alle Einträge des PopUp-Menüs, die du färben möchtest einfach das OnDraw-Ereignis mit Code füllen und hier natürlich auch färben.
Sehr einfaches Beispiel:

Delphi-Quellcode:
procedure TForm1.Blubb1DrawItem(Sender: TObject; ACanvas: TCanvas;
  ARect: TRect; Selected: Boolean);
begin
  ACanvas.Brush.Color := clRed;
  ACanvas.FillRect(ARect);
  ACanvas.TextOut(ARect.Left + 2, ARect.Top + 2, 'TEST');
end;
Würde dir jetzt einen roten Eintrag erzeugen, auf dem Test (sehr schlecht eingerückt) steht. Das genaue einrücken vom Text kannst du natürlich durch TextWidth und TextHeight (Methoden vom Canvas) und berechnen der Mittelpunkte o.ä. erreichen. Weiß ja nicht ob die Links oder Rechtsbündig oder Zentriert angezeigt werden sollen. Na ja, dass bekommst du dann schon hin.

Hoffe es hilft schon mal
Gruß Der Unwissende

Sharky 26. Nov 2005 06:40

Re: Farbe eine PopUpMenu ändern
 
Zitat:

Zitat von eddy
... Warntexte vor dem Löschen helfen nicht weiter, da diese ohne gelesen zu werden übergangen werden. ...

Hei eddy,

wenn die Anwender schon nicht lesen wollen würden sie sicher auch nicht auf verschiedene Farben achten ;-)
Ich würde das PopUp für die Titelleiste nur dan aufraufen wenn der Mausklick bei gedrückter Ctrl-Taste erfolgte. Dann bist Du sicher das der Anwender die Aktion bewusst ausgelöst hat.

eddy 26. Nov 2005 10:43

Re: Farbe eine PopUpMenu ändern
 
Hallo "Der Unwissende",

auf jeden Fall wußtest Du, wie man dieses Problem angehen könnte.

Kannst Du mir auch noch verraten, wie ich an OnDrawItem für die Standard-PopUpMenu herankomme?

Mein TPopUpMenu kennt nur OnChange und OnPopUp aber eben kein OnDrawItem.

Ich habe die Prozedur zwar in Public deklariert, aber sie wird nie verwendet.



Hallo Sharky,

der Nutzer, um den es hier konkret geht, ist nicht mehr der jüngste und hat so seine Schwierigkeiten mit dem Lesen der Bildschirmausschriften (17" Monitor bei 800 x 600, obwohl ich mein Programm ursprünglich nur für 1024 x 768 ausgelegt hatte). Mit farbigen Buttons habe ich schon gute Erfahrungen gemacht.

mfg
eddy

jim_raynor 26. Nov 2005 10:47

Re: Farbe eine PopUpMenu ändern
 
Zitat:

Zitat von eddy
Hallo "Der Unwissende",

auf jeden Fall wußtest Du, wie man dieses Problem angehen könnte.

Kannst Du mir auch noch verraten, wie ich an OnDrawItem für die Standard-PopUpMenu herankomme?

Mein TPopUpMenu kennt nur OnChange und OnPopUp aber eben kein OnDrawItem.

Ich habe die Prozedur zwar in Public deklariert, aber sie wird nie verwendet.

OnDrawItem ist bei TMenuItem deklariert, nicht bei TPopupMenu ;) Also im Popup-Editor einen Eintrag auswählen und dann OnDrawItem zuweisen.

Sharky 26. Nov 2005 10:59

Re: Farbe eine PopUpMenu ändern
 
Zitat:

Zitat von eddy
... der Nutzer, um den es hier konkret geht, ist nicht mehr der jüngste und hat so seine Schwierigkeiten mit dem Lesen der Bildschirmausschriften ...

Hai eddy,

alles klar. Also dann doch einfärben.

Hier mal ein etwas angepasstest Beispiel.
Delphi-Quellcode:
procedure TForm1.Vier1DrawItem(Sender: TObject; ACanvas: TCanvas;
  ARect: TRect; Selected: boolean);
var
  mycaption: string;
  myrect: TRect;
begin
  mycaption := (Sender as TMenuItem).Caption;
  with ACanvas do
  begin
    if (Selected) then
    begin
      Brush.Color := clgreen;
    end
    else
    begin
      Brush.Color := clRed;
    end;
    FillRect(ARect);
    myRect := ARect;
    myRect.Left := myRect.Left + 5;
    DrawText(Handle, PChar(mycaption), Length(mycaption),
      myRect, DT_SINGLELINE or DT_VCENTER);
  end;
end;
Einfach allen Einträgen des PopUpMenüs das selbe OnDrawItem zuweisen und *blubb*

eddy 26. Nov 2005 14:00

Re: Farbe eine PopUpMenu ändern
 
Hier nun mein Dank für die Hilfe bei der Lösung des Problems. :cheers:

Hallo jim_raynor,

ich falle immer auf so böse Fallen hinein :oops: , auch wenn es ja eigentlich logisch ist. Schließlich heißt es ja DrawItem und nicht DrawMenu.


Hallo Sharky,

das Beispiel paßt prima. Ich habe alle Anweisungen befolgt, noch ein bisschen die Farben für Hintergrund und Font angepaßt und bin jetzt voller Hoffnung, daß das in Aqua gehaltene Menü doch irgendwie meine Nutzer ein wenig von wildem gedankenfreien Herumclicken zurück hält.

mfg
eddy


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