![]() |
Drag and Drop von einer Listbox in die andere ohne VCL
Die Überschrift sagt es schon, was ich will. Hat da jemand einen Ansatz oder eine Idee? Mir ist da bisher nichts zu eingefallen.
|
Re: Drag and Drop von einer Listbox in die andere ohne VCL
|
Re: Drag and Drop von einer Listbox in die andere ohne VCL
Das meine ich nicht. Da geht es ja nur um die Shell. Beide Listboxen sind aber in meinem Anwendungsfenster.
|
Re: Drag and Drop von einer Listbox in die andere ohne VCL
Hi,
dann werfe ich das Stichwort OLE Drag&Drop ein. Das ist VCL unabhängig und ![]() Chris |
Re: Drag and Drop von einer Listbox in die andere ohne VCL
Was hat das mit OLE zu tun? Ich befinde mich innerhalb der selben Anwendung!!! Außerdem scheint das irgendwie über das Clipboard zu gehen, was ich vermeiden will.
|
Re: Drag and Drop von einer Listbox in die andere ohne VCL
Hi Luckie,
das ist schon klar. Aber scheinbar bietet die WinAPI dazu keine Funktionen. Ansonsten hättest du bzw. ich beim Suchen schon selbige gefunden, oder? Und das Drag'n'Drop via OLE ist eine Alternative zum VCL-Drag'n'Drop. Zumindest ist mir das da über den weggelaufen. Ich weiß ja nicht, ob du dir das schon näher angesehen hast (von dem Beitrag aus dem MSDN mal abgesehen). Zumindest ist das eine Möglichkeit. Und das geht auch ohne das Clipboard und auch in der eigenen Anwendung. Da bin ich mir ziemlich sicher, und wenn es hundertprozentig NICHT geht, dann hast du das Recht mich zu schlagen. ;) Chris |
Re: Drag and Drop von einer Listbox in die andere ohne VCL
Ich denke, das ist etwas Overkill. Ich übertlege die ganze Zeit, ob man es nicht dann doch besser "zu Fuß" macht:
1. linker Mausbutton über Listbox gedrückt, Eintrag merken 2. Maus wird bewegt Cursor ändern 3. Maus kommt über zweite Listbox Cursor ändern 4. linker Mausbutton wird losgelassen, einfügen Mich schreckt nur etwas der viele Code zurück, der dazu nötig ist. |
Re: Drag and Drop von einer Listbox in die andere ohne VCL
Hi Luckie
Ich habs in einem Projekt von mir auch Drag & Drop ohne Shell ohne VCL gemacht Ist schon ne weile her, hab einfach den Source kopiert (ist sicher ne menge unnützer scahen dabei ...)
Delphi-Quellcode:
Vielleicht hilfts ja
TDummyDragManager = class(TInterfacedObject, IDropTarget)
private FoldItem : TTBCustomItem; FOwner : TControl; trAutoCheck : TTimer; procedure RestartTimer; procedure StopTimer; procedure OnTimer(Sender : TObject); public destructor Destroy; override; function DragEnter(const DataObject: IDataObject; KeyState: Integer; Pt: TPoint; var Effect: Integer): HResult; stdcall; function DragLeave: HResult; stdcall; function DragOver(KeyState: Integer; Pt: TPoint; var Effect: Integer): HResult; stdcall; function Drop(const DataObject: IDataObject; KeyState: Integer; Pt: TPoint; var Effect: Integer): HResult; stdcall; end; function TDummyDragManager.DragEnter(const DataObject: IDataObject; KeyState: Integer; Pt: TPoint; var Effect: Integer): HResult; stdcall; begin Effect := DROPEFFECT_LINK; Result := 0; end; function TDummyDragManager.DragLeave: HResult; begin Result := 0; end; destructor TDummyDragManager.Destroy; begin if assigned(trAutoCheck) then FreeAndNil(trAutoCheck); inherited; end; procedure TDummyDragManager.OnTimer(Sender : TObject); begin TTimer(Sender).Enabled := FALSE; TfrMDIChild(TForm(TTBXItem(FoldItem).Tag)).DoActivate; end; procedure TDummyDragManager.StopTimer; begin if not assigned(trAutoCheck) then exit; trAutoCheck.Enabled := FALSE; end; procedure TDummyDragManager.RestartTimer; begin if not assigned(trAutoCheck) then begin trAutoCheck := TTimer.Create(nil); trAutoCheck.Interval := 500; trAutoCheck.OnTimer := OnTimer; end; trAutoCheck.Enabled := FALSE; trAutoCheck.Enabled := TRUE; end; function TDummyDragManager.DragOver(KeyState: Integer; Pt: TPoint; var Effect: Integer): HResult; var thisItem : TTBCustomItem; begin thisItem := nil; TTBXToolbar(FOwner).View.UpdateSelection(@Pt, True); if Assigned(TTBXToolbar(FOwner).View.Selected) then begin thisItem := TTBXToolbar(FOwner).View.Selected.Item; if not thisItem.Enabled then thisItem := nil; end; if thisItem <> FoldItem then begin FoldItem := thisItem; if assigned(FoldItem) then RestartTimer else StopTimer; end; if assigned(thisItem) then Effect := DROPEFFECT_LINK; Result := 0; end; function TDummyDragManager.Drop(const DataObject: IDataObject; KeyState: Integer; Pt: TPoint; var Effect: Integer): HResult; begin Result := 0; end; ... FormCreate dropTarget := TDummyDragManager.Create; dropTarget.FOwner := tbTaskBar; RegisterDragDrop(tbTaskBar.Handle, IDropTarget(dropTarget)); |
Re: Drag and Drop von einer Listbox in die andere ohne VCL
Das werde ich mir mal ankucken. Was für Units werden den benötigt?
|
Re: Drag and Drop von einer Listbox in die andere ohne VCL
Zitat:
, ActiveX .. und natürlich so units wie system, windows ... ich schätze die Sachen mit dem Timer kannst getrost vergessen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:32 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