Autor Beitrag
Kay E.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 118



BeitragVerfasst: Fr 01.07.11 17:48 
Moin zusammen!

Ich möchte gern ein selber gebautes PopupMenu bauen, was die Form eines Ringmenüs hat. Dazu habe ich eine Komponente gebaut, die von TCustomControl abgeleitet ist, da die mir ein Canvas-Element und die Möglichkeit eines Containers bietet.
Der Code sieht (aszugsweise) so aus:

ausblenden volle Höhe 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:
TRingemenueMagQuad = class(TCustomControl)
  private
    { Private declarations }
    FRadius: Integer;
    FVelocity: Integer;
    procedure SetRadius(Value: Integer);
    procedure SetVelocity(Value: Integer);
  protected
    { Protected declarations }
  public
    { Public declarations }
    procedure ShowMenue;
  published
    { Published declarations }
    property Radius: Integer read FRadius write SetRadius default 80;
    property Velocity: Integer read FVelocity write SetVelocity default 20;
  end;

implementation

procedure TRingemenueMagQuad.SetRadius(Value: Integer);
begin
  if FRadius <> Value then
  begin
    if Value <= 0 then
      Value := 1;
    FRadius := Value;
  end;
end;

procedure TRingemenueMagQuad.SetVelocity(Value: Integer);
begin
  if FVelocity <> Value then
  begin
    if Value <= 0 then
      Value := 1;
    FVelocity := Value;
  end;
end;

procedure TRingemenueMagQuad.ShowMenue;
var
  MCoord: TPoint;
  i: Integer;
begin
  MCoord := ScreenToClient(Mouse.CursorPos);

  i := 0;
  Canvas.Pen.Color := clYellow;
  Canvas.Brush.Color := clYellow;
  Canvas.Brush.Style := bsSolid;
  repeat //zeichnet einen wachsenden, gelben Kreis
    inc(i, 10);
    canvas.Ellipse(MCoord.X - i div 2, MCoord.Y - i div 2, MCoord.X + i div 2, MCoord.Y + i div 2);
    invalidate;
    sleep(Velocity);
  until i >= Radius;
end;


Der Aufruf erfolgt im Formular, indem die Komponente beim Start erzeugt wird und mit Komponente.ShowMenu angezeigt wird.

Und da kommen zwei Probleme:
1. wird gar nichts angezeigt. Nichts, nada, null. Warum? Was muss ich beachten? Und ja, Owner und Parent ist das MainForm.
2. Ich würde gerne die Funktionalität von PopupMenu nutzen können. Also bei fast jeder grafischen Komponente kann man ja ein PopupMenu auswählen, was dann automatisch angezeigt wird, wenn ein rechtsklick ausgeführt wird auf die Komponente. Wie kann ich diese Funktionalität auch in meiner Komponente nutzen? Also eben beim Aufruf das "Aufbauen" des Menüs und nach Auswahl bzw. einem Klick auf eine freie Fläche das "Zusammenfallen" des Menüs automatisch aufrufen lassen, wenn ihr versteht, was ich meine?

Wäre super, wenn ihr mir ein paar Tipps in die richtige Richtung geben könntet.
Vielen Dank!