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 Drag&Drop mit TMenuItem (https://www.delphipraxis.net/116497-drag-drop-mit-tmenuitem.html)

hoika 30. Jun 2008 17:59


Drag&Drop mit TMenuItem
 
Hallo,

ich möchte einige meiner TMenuItems per Drag&Drop
eine ListView packen (als Kopie),
um mir so eine Art Favouriten-Leiste zu bauen.

Hat jemand sowas schonmal gemacht ?

Das TMenuItem scheint ja keine Drag-Properties zu haben (DragMode etc.)


Danke


Heiko

_frank_ 30. Jun 2008 18:41

Re: Drag&Drop mit TMenuItem
 
dadurch, dass du weder die Drag&Drop-Events noch MouseDown/Up/Move hast, wird das nicht so möglich sein. ich denke du müsstest auf ein alternatives Menü umsteigen (bzw. es schreiben) oder du lässt bei der Definition das Menü einfach außen vor.
ich weis zwar nicht, ob letzteres bei dir möglich ist aber mal so als Anhaltspunkt:
die Menu-Items enumerieren und in eine Listbox eintragen, hier kannst du die items löschen/verschieben etc. als kleine Hilfe kannst du dir den Menu-Editor von DFMEdit mal anschauen (MenuEdit_u.pas), der kann die grobe Menüdarstellung und Drag&Drop ;) müsstes halt nur die lade-routine anpassen, da dfmedit die items aus dem DFM-Quelltext parst (bzw. aus dem Treeview).

HTH Frank

hoika 30. Jun 2008 19:04

Re: Drag&Drop mit TMenuItem
 
Hallo,

ja so in etwa sieht mein Alternativ-Plan aus.
Die Menus aus dem aktuellen Main-Menu holen,
schreibe ich mir selber, nix da mit Copy&Paste ;)

Dummerweise weiss ich noch nicht,
wie ich diese Konfiguration speichern kann ;(

Name, neee
Pointer hä ? ;)

Mir bleibt jetzt wohl nur,
jedes TMenuItem mit einem distinct Tag zu versehen
und diese Tags zu speichern.

Viel Klickerei (aber nur einmal)


Heiko

_frank_ 30. Jun 2008 19:24

Re: Drag&Drop mit TMenuItem
 
mussts ja nicht kopieren, aber zum anschauen ;), gut, die Property-Liste ist nicht sehr gut gelungen mit der stringlist, aber ich wollte mi bisschen Arbeit ersparen ;)

vielleicht findest ja was brauchbares drin, stehe ja auch für fragen zur Verfügung...

Gruß Frank

extrem 30. Jun 2008 19:26

Re: Drag&Drop mit TMenuItem
 
Zitat:

Zitat von _frank_
dadurch, dass du weder die Drag&Drop-Events noch MouseDown/Up/Move hast, wird das nicht so möglich sein.

Hi

Den onDrag Event könnte man allerdings mit Hilfe der Nachricht WM_MENUDRAG abfangen.
Delphi-Quellcode:
  private
    procedure WMMENUDRAG(var Msg: TMessage);message WM_MENUDRAG;
 
...

procedure TForm1.WMMENUDRAG(var Msg: TMessage);
begin
  Caption:= MainMenu1.FindItem(Msg.LParam,fkHandle).Items[Msg.WParam].Caption;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  MenuInfo: TMenuInfo;
begin
  MenuInfo.cbSize:= SizeOf(TMenuInfo);
  MenuInfo.fMask:= MIM_STYLE;
  MenuInfo.dwStyle:= MNS_DRAGDROP;
  SetMenuInfo(MainMenu1.Handle, MenuInfo);
end;

MarcoWarm 10. Sep 2008 11:47

Re: Drag&Drop mit TMenuItem
 
Hallo,
vielleicht ein bissl spät geantwortet von mir ;-)
Es ist mit Bordmitteln möglich. Leider unterstützt die VCL keine Drag'n'Drop Menüs. Aber mit ein bissl Bastelei klappt es ganz gut.
Der Code ist recht umfangreich. Wer ihn will, soll mir bitte einfach ne PM schicken. Dann schreib ich ein kleines Demoprogramm.
Schritt für Schritt:
  • dem Hauptmenü den Style MNS_DRAGDROP setzen
  • im Formular das Ereignis WM_MENUDRAG abfangen
  • darin ein IDataObject (Unit ActiveX) anlegen, welches deinen Meüeintrag repräsentiert
  • mit DoDragDrop oder (vielleicht besser noch) SHDoDragDrop eine Drag'n'Drop Schleife starten
beim ListView musst du dich dann auf ein OLE Drop einrichten.

Hoffentlich nicht zu kompliziert.

gruß
Marco

MarcoWarm 12. Sep 2008 06:47

Re: Drag&Drop mit TMenuItem
 
Liste der Anhänge anzeigen (Anzahl: 1)
Für alle, die es interessiert, hier ein bissl Code :-)

Das Demoprogramm zeigt, wie man TMenuItems in einen VirtualStringTree befördert und (wenn nötig) auf dem Desktop ablegt.
Ich hab den Code aus einem unserer laufenden Projekte herausgelöst. Es kann also sein, daß es an der einen oder anderen Stelle ein wenig hängt. Aber wie gesagt... das Programm dient nur der Demonstration der Technologie!
Die Units sind von mir (wenn überhaupt einmal) auf englisch kommentiert. Und bitte nicht so viele Fragen... ich hab ab morgen Urlaub und bin dann ne ganze Woche Offline (*träum*)

Gruß Marco

P.S. Um ein "DragImage" zu sehen muss unter Windows die Funktion "Fensterinhalt beim ziehen anzeigen" aktiviert sein
P.P.S. Um den Hinweistext neben dem DragImage zu sehen, braucht ihr Vista.


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