Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Statistikübersicht in PopupMenu


Kay E. - Do 11.11.10 22:58
Titel: Statistikübersicht in PopupMenu
Hallo!

Da ihr mir bisher immer so toll helfen konntet, hoffe ich, dass ihr mir auch diesmal wieder helfen könnt.
Und zwar möchte ich in einem PopupMenu eine kleine Statistikübersicht ausgeben. Dabei sollen Links die (verschieden lange) Bezeichner (zum Beispiel "Erfolgsquote:") und rechts die Werte (in dem Fall zum Beispiel 47,05%) stehen. Da die Bezeichner nicht alle gleich lang sind, tu ich mir schwer, die Übersicht wirklich Übersichtlich zu machen. Schön wäre, wenn die Bezeichner links ausgerichtet werden und die Werte rechts ausgerichtet. Im Prinzip so aufgereiht wie die Shortcuts, die man angeben kann.

Habt ihr Vorschläge, wie ich das angehen kann?

Dankeschön schon im Vorraus!

Grüße Kay E.


jaenicke - Do 11.11.10 23:17

Wie wäre es mit Tabs?

Delphi-Quelltext
1:
  mniTest2.Caption := 'Test'#9'0,30 €';                    
Oder wie im Anhang direkt in Delphi eingeben. (Unten siehst du das Ergebnis.)


Kay E. - Do 11.11.10 23:23

Wow, danke für die schnelle Hilfe! Den Befehl "#9" kannte ich noch nicht. Ich hatte schon an Tabs gedacht, wusste aber nciht, wie ich das realisieren sollte.

Vielen Dank!


jaenicke - Do 11.11.10 23:27

Das Tab-Zeichen hat den Ascii-Code 9, dementsprechend kannst du dieses so direkt einfügen. Genauso geht es mit anderen Zeichen auch. ;-)


bummi - Do 11.11.10 23:27

ansonsten OwnerDraw=True und bei den Menuitems versorgen von
OnDrawItem oder OnAdvancedDrawItem


jaenicke - Fr 12.11.10 07:03

Das hätte den Vorteil, dass das ganze besser anpassbar ist, denn die Tabs sind ja kaum beeinflussbar (jedenfalls ohne weiteres). Außerdem kann man dann auch gleich andere grafische Spielereien einbauen. :mrgreen:

Am einfachsten ist es aber erst einmal mit Tabs, für den optischen Feinschliff ist immer noch (vielleicht) Zeit.


Kay E. - Fr 12.11.10 11:35

Danke für eure Hilfe. Ich hab das jetzt erstmal mit den Taps gemacht, aber ein bisschen "grafische Würze" wär schon nicht schlecht. Nur hab ich (bis jetzt) noch nie mit OnOwnerDraw und AdvancedOwnerDraw gearbeitet. Allerdings hab ich durchaus Interesse dran, meinen Horizont zu erweitern. Ihr habt mir nicht zufällig grad nen Codeschnippsel rumliegen, damit ich mal sehen kann, was ich damit alles anstellen kann und v.a. wie? Wenn nicht, ist auch nicht schlimm, dann versenk ich mich mal die Weiten des Internets und versuch mir da was anzueignen :)

Grüße Kay


bummi - Fr 12.11.10 13:04

nur Schmarn, aber

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, ActnList;

type
  TForm2 = class(TForm)
    ActionList1: TActionList;
    Action1: TAction;
    PopupMenu1: TPopupMenu;
    I1: TMenuItem;
    I2: TMenuItem;
    I3: TMenuItem;
    procedure I3MeasureItem(Sender: TObject; ACanvas: TCanvas; var Width,
      Height: Integer);
    procedure I3AdvancedDrawItem(Sender: TObject; ACanvas: TCanvas;
      ARect: TRect; State: TOwnerDrawState);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.I3AdvancedDrawItem(Sender: TObject; ACanvas: TCanvas;
  ARect: TRect; State: TOwnerDrawState);
  var
  C:Tcolor;
  s:String;
begin
    if odSelected in State then c := clBlue
    else  c := clYellow;
    ACanvas.Brush.Color := c;
    Acanvas.FillRect(ARect);
    ACanvas.Brush.Color := clLime;
    ACanvas.Pen.Color := clRed;
    ACanvas.Ellipse(Arect.Left  + 2,Arect.Top + 2, Arect.Left  + 20 ,Arect.Top + 20);
    s := TMenuItem(Sender).Caption;
    Acanvas.Brush.Style := bsClear;
    ACanvas.TextRect(Arect,s,[tfCenter,tfWordBreak]);
end;

procedure TForm2.I3MeasureItem(Sender: TObject; ACanvas: TCanvas; var Width,
  Height: Integer);
begin
     Width := 300;
     if sender = I1 then Height := 50
     else if sender = I2 then Height := 100
     else if sender = I3 then Height := 20;
end;

end.


Kay E. - Mo 15.11.10 16:43

Als ich den Code am WE schnell mal probiert hab, hats nicht funktioniert, ich konnte nicht kompilieren (warum auch immer - keine Fehlermeldung). Ich werds heute oder morgen nochmal probieren. Vielen Dank für den Code und die Mühen!