Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Drag and Drop von einer Listbox in die andere ohne VCL (https://www.delphipraxis.net/32803-drag-drop-von-einer-listbox-die-andere-ohne-vcl.html)

Luckie 28. Okt 2004 09:05


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.

CalganX 28. Okt 2004 09:07

Re: Drag and Drop von einer Listbox in die andere ohne VCL
 
Hi Luckie,
hilft dir vielleicht, das was ich [msdn:15d955b6f4="Drag Drop"]MSDN gefunden[/msdn:15d955b6f4] habe? Nummer 1 und Nummer 2. ;)

Chris

Luckie 28. Okt 2004 09:14

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.

CalganX 28. Okt 2004 09:18

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 dazu müsste man eigentlich noch mehr finden, als den subtilen Link unter "dazu". ;)

Chris

Luckie 28. Okt 2004 09:23

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.

CalganX 28. Okt 2004 09:29

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

Luckie 28. Okt 2004 09:32

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.

Gruber_Hans_12345 28. Okt 2004 10:28

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:
  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));
Vielleicht hilfts ja

Luckie 28. Okt 2004 11:12

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?

Gruber_Hans_12345 28. Okt 2004 11:22

Re: Drag and Drop von einer Listbox in die andere ohne VCL
 
Zitat:

Zitat von Luckie
Das werde ich mir mal ankucken. Was für Units werden den benötigt?

ich vermute mal
, 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.
Seite 1 von 2  1 2      

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