Einzelnen Beitrag anzeigen

CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#1

VirtualStringTree und Drag'n'Drop

  Alt 23. Jul 2004, 21:47
Hi,
ich habe inzwischen die Grundlagen des Drag'n'Drop's beim VirtualStringTree realisieren können. Sprich die Items lassen sich bewegen.
Dazu habe ich (aus der Doku) folgendes im OnDragDrop-Eregnis stehen:
Delphi-Quellcode:
procedure TfrmMain.vstDataDragDrop(Sender: TBaseVirtualTree;
  Source: TObject; DataObject: IDataObject; Formats: TFormatArray;
  Shift: TShiftState; Pt: TPoint; var Effect: Integer; Mode: TDropMode);
var
  i: Integer;
  AttachMode: TVTNodeAttachMode;
begin
  if Length(Formats) > 0 then
  begin
    for i:=0 to High(Formats) do
      if Formats[i] = CF_VIRTUALTREE then
      begin
        case Mode of
          dmAbove:
            AttachMode := amInsertBefore;
          dmBelow:
            AttachMode := amInsertAfter;
          dmOnNode:
            AttachMode := amNowhere;
        else
          if Assigned(Source) and (Source is TBaseVirtualTree) and (Sender <> Source) then
            AttachMode := amInsertBefore
          else
            AttachMode := amNowhere;
        end;
        Sender.ProcessDrop(DataObject, Sender.DropTargetNode, Effect, AttachMode);
        Break;
      end;
  end;
end;
Um dann noch zu überprüfen, ob die Node an der neuen Position abgelegt werden darf, steht folgendes im OnDragOver-Ereignis:
Delphi-Quellcode:
procedure TfrmMain.vstDataDragOver(Sender: TBaseVirtualTree;
  Source: TObject; Shift: TShiftState; State: TDragState; Pt: TPoint;
  Mode: TDropMode; var Effect: Integer; var Accept: Boolean);
begin
  case Mode of
    dmAbove, dmBelow:
      Accept := true;
  else
    Accept := false;
  end;
end;
Mein Problem ist jetzt, dass das, was dort steht nicht uneingeschränkt gilt. Genauer gesagt, dürfen die Nodes nur auf Ihrer Ebene bleiben (das heißt Ebene und Parent müssen gleich bleiben).
Nur komme ich nicht an die Node dran, die gerade verschoben wird und vorallem nicht an die Position, wo es hinsoll. Okay... Wenn ich das richtig sehe habe ich die Koordinaten, allerdings bringt mir das nichts, um darauf zu schließen in welcher Ebene das landen wird.

Kennt jemand eine elegante Möglichkeit dieses kleine Problem zu lösen?

Chris
  Mit Zitat antworten Zitat