![]() |
problem mit "menüanzeige"
hi leute
hab mal wieder ne frage weiss aber nicht ob sie hierhergehört : also : ich hab ein formular auf dem sich ein button befindet. wenn ich den drücke hättei ch gern dass sich der darunter befindende button weiter nach unten schiebt und dann ein kleines "untermenü" aufgeht ( 2 neue buttons zur verfügung stehen ) so wie in html oder java oder was weiss ich ... ich versteht ? also button klick und dann stehen da ein paar unterpunkte von denen ich wieder aktionen aus starten kann sowas in delphi realisierbar ? danke schonmal mfg stoni |
Re: problem mit "menüanzeige"
also das was ich da entziffern konnte war das du ein aufklappbares menü haben willst... schau mal da gibts ein ThemeXP teil wo man ein menü mit untermenüs haben kann wenn ich mich nicht irre
mfg Nico |
Re: problem mit "menüanzeige"
Hi stonimahoni,
das Komponentenpackage heißt ![]() Greetz alcaeus |
Re: problem mit "menüanzeige"
Es geht auch mit Delphi Bordmitteln:
Setz einen Button und ein Popup-Menue auf ein Formular. Und Dann:
Delphi-Quellcode:
procedure TForm1.SpeedButton1Click(Sender: TObject);
var pt: TPoint; begin pt.x := SpeedButton1.BoundsRect.Left; pt.y := SpeedButton1.BoundsRect.Bottom; pt := ClientToScreen(pt); PopupMenu1.Popup(pt.x, pt.y); end; |
Re: problem mit "menüanzeige"
hi shmia
also deine lösung scheint brauchbar zu sein, doch wie positionier ich das teil richtig ?? ich hab halt rechts die buttonleiste und dort soll eigentlich neben dem einen button den ich drücke das popupding aufgehen und nicht irgwendwo im formular :) kann man das irgendwie hinbekommen ?? @ Nicodius : das themexp ding hab ich nirgends gefunden :/ @ alcaeus : war erstmal ein akt das zeug einzubinden ( bin da nicht so fit drin ) aber ez hab ich da noch nix passendes gefunden :( thx soweit schonmal |
Re: problem mit "menüanzeige"
@ alcaeus
kann ich die buttons irgendwie anders aussehen lassen ? so "normal" wie in delphi ? so standartmässig ? kein xp style :) weil dann könnte man das teil ( dxwinxpbar ) doch verwenden denk ich was kann ich mit den anderen komponenten anfangen ? *grübel* |
Re: problem mit "menüanzeige"
Hi stonimahoni,
da musst du schon in den Sourcen wühlen oder dich auf shmias Tipp verlassen. Die Design eXperience Komponenten wurden entwickelt, um Anwendungen "XP-freundlich" zu machen. Probier die anderen Kompos mal aus, dann wirst du sehen was sie taugen ;) Greetz alcaeus |
Re: problem mit "menüanzeige"
Hallo!
hm shmia lösung funktioniert bei mir gut, jedoch will ich eine genaue position des Popups haben.
Code:
Weis wer, was da die positionsangabe ist oder wie man die festlegen kann?
procedure TForm1.SpeedButton1Click(Sender: TObject);
var pt: TPoint; begin pt.x := SpeedButton1.BoundsRect.Left; pt.y := SpeedButton1.BoundsRect.Bottom; pt := ClientToScreen(pt); PopupMenu1.Popup(pt.x, pt.y); end; |
Re: problem mit "menüanzeige"
zusatz :
mir scheint, dadurch dass meien buttons auf nem panel liegen funzt der code nicht richtig und der macht das popupfenster wild irgendwo auf weil ohne panel scheint es zu gehen und es soll bitte mit der LINKEN maustaste möglich sein hat da jmd nen rat für mich ? |
Re: problem mit "menüanzeige"
Hallo,
das PopupMenu1.Popup popt das Menü mit absoluten Koordinaten auf (steh auch in der OH :-)), die Position die die SpeedButtons haben sind jedoch relativ zum höheren Element, also deinem Panel. Das ClientToScreen is eine Methode deines TForms, welches Formular Koordinaten auf Bildschirmkoordinaten umrechnet. Allerdings hast du ja erst Panel Koordinaten. Du mußt also entweder die Position des Panels noch hinzufügen oder besser, das Panel bietet auch so ne ClientToScreen Methode, bin ich mir jetzt aber nicht sicher. Ich würde ja noch Code schreiben... aber muß zur Vorlesung :-( |
Re: problem mit "menüanzeige"
hi fiasko
danke für deine erklärung soweit komm ich da ja mit , aber ich weiss net wie ich das ganze "auf papier" bringe :( bin in delphi noch nicht soooo fit :/ wäre aber sehr freundlich von dir wenn du den code nachträglich noch posten könntest thx im vorraus mfg stoni |
Re: problem mit "menüanzeige"
Zitat:
Wenn du den Sourcecode anschaust, dann siehst du, dass die linke untere Ecke von SpeedButton1 als Ausgangspunkt dient:
Delphi-Quellcode:
Dies lässt sich verbessern, in dem man nicht SpeedButton1, sondern das übergebene Steuerelement als Ursprung nimmt:
procedure TForm1.SpeedButton1Click(Sender: TObject);
var pt: TPoint; begin pt.x := SpeedButton1.BoundsRect.Left; pt.y := SpeedButton1.BoundsRect.Bottom; pt := ClientToScreen(pt); PopupMenu1.Popup(pt.x, pt.y); end;
Delphi-Quellcode:
Man kann das PopupMenue natürlich auch so positionieren:
procedure TForm1.SpeedButton1Click(Sender: TObject);
var pt: TPoint; c : TControl; begin c := (Sender as TControl); pt.x := c.BoundsRect.Left; pt.y := c.BoundsRect.Bottom; pt := ClientToScreen(pt); PopupMenu1.Popup(pt.x, pt.y); end;
Delphi-Quellcode:
procedure TForm1.SpeedButton1Click(Sender: TObject);
var pt: TPoint; c : TControl; begin c := (Sender as TControl); // genau die Mitte des Controls berechnen pt.x := (c.BoundsRect.Right+c.BoundsRect.Left) div 2; pt.y := (c.BoundsRect.Top+c.BoundsRect.Bottom) div 2; pt := ClientToScreen(pt); PopupMenu1.Popup(pt.x, pt.y); end; |
Re: problem mit "menüanzeige"
hi shmia
vielen dank für deine hilfe aber so ganz funzt das noch immern icht :8 ich hab echt die vermututng dass es noch an dem panel liegt auf dem die buttons sind wie kann ich das mit reinbringen ? |
Re: problem mit "menüanzeige"
Hi,
ich glaub es kann nur daran liegen, dass du das Menu öffnen willst beim drücken der linken Maustaste, denn beim drücken der rechten Maustaste öffnet sich das PopupMenu genau neben dem Speedbutton. |
Re: problem mit "menüanzeige"
hab ez noch folgendes im netz gefunden :
Delphi-Quellcode:
Okay, this one is really beginning to bug me. Especially as it
should be really simple. I have a button that is within a panel on a form. This form is itself then embedded within the main form of the project at run time. When this button is clicked I need to display a popup menu aligned just beneath the button. No problem, I've done this hundreds of times before using code similar to the following: var APoint: TPoint; APoint.X := Button.Left; APoint.Y := Button.Top + Button.Height; APoint := Panel.ClientToScreen(APoint); PopupMenu.Popup(APoint.X, APoint.Y); Except that the fact the form is embedded seems to be messing up the ClientToScreen call and consequently the popup menu is not appearing nicely under the button (it has the right Top value, but the wrong Left value). I know I'm missing something simple here and I guess that is what is bugging me about it.
Delphi-Quellcode:
Don't worry guys, I've figured it out. Turns out that the
popup menu was wider than the button and given that the button was sitting by the right edge of the panel/screen, Windows was automatically adjusting the left position so that the entire menu would appear on screen. Of course, I'd forgotton that Windows does this. Knew it had to be something simple :) was soll ich damit anfangen ? *wargh* plz help me :( |
Re: problem mit "menüanzeige"
huhu ?!
weiss keiner rat?? :pale: |
Re: problem mit "menüanzeige"
Hallo,
huch, die Vorlesung hat ein bißchen länger gedauert :cyclops: Hier mal ein bißchen Code:
Delphi-Quellcode:
der Code übersetzt für jedes Parent Control die Coordinaten, außer für das Form selber. Das funktioniert so leider nicht mit den TButton, weil die nicht von TGraphicControl sondern TButtonControl abgelitten sind und es keine Superklasse gibt die das ClientToScreen kann. Also einfach ein Copy-n-Paste und das Graphic durch Button, dann klappt das eigentlich auch für die anderen Typen. Die Methode muß z.Zt. noch im TForm Objekt welches die ganzen Controls enthält ausgeführt werden, damit der Test "(o <> Self)" funzt, wenn man das noch bißchen anders schreibt z.B. mit Assigned(o.Parent) und boolische Ausdrücke nicht vollständig ausgewertet werden könnte man das auch in ne extra Unit packen.
procedure TForm1.SpeedButton1Click(Sender: TObject);
var o: TWinControl; pt: TPoint; begin if (Sender is TGraphicControl) then begin pt.x := TGraphicControl(Sender).Left + (TGraphicControl(Sender).Width div 2); pt.y := TGraphicControl(Sender).Top + (TGraphicControl(Sender).Height div 2); o := TGraphicControl(Sender).Parent; while Assigned(o) and (o <> Self) do begin pt := o.ClientToScreen(pt); o := o.Parent; end; PopupMenu1.Popup(pt.x, pt.y); end; end; |
Re: problem mit "menüanzeige"
fiasko...du bist genial :P :cheers:
es klappt - einwandfrei :hello: endlich - superklasse :roteyes: :spin2: :bounce2: :bouncing4: :bounce1: :dancer2: :dancer: :witch: muchas gracias :D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz