Einzelnen Beitrag anzeigen

Prototypjack

Registriert seit: 2. Feb 2003
611 Beiträge
 
Delphi 2009 Professional
 
#1

Virtual Treeview und Drag'n'Drop

  Alt 23. Dez 2007, 15:13
Moin,

So, nachdem ich jetzt schon einige Stunden an diesem Problem hänge, dachte ich mir, ich frage hier mal nach:

Ich habe in einem Projekt von mir zwei Virtual Treeviews (Eines links, das andere rechts). Die fertige Funktion der beiden sollte dann so aussehen: Die Items im rechten vst sollen per Drag'n'Drop verschoben werden(funktioniert bereits) und man soll Items aus dem Linken dem Rechten hinzufügen können(das Linke soll nichts können, außer diese Nodes wegzuschicken, um das Rechte weiter zu füllen).

Wie bereits gesagt, habe ich bereits 50% fertig. Denn alle Move-Operationen funktionieren perfekt. Nur wenn es dann an's Kopieren geht, habe ich einfach keine Ahnung wie ich an die Daten komme, um sie im neuen Node des rechten Vsts einzufügen.
(Achja, ich arbeite mit der OLE-Drag-Version. Sollte die VCL-Drag-Version für meine Zwecke besser geeignet sein, so lasst es mich bitte wissen!).

Hier mal was ich schon habe:
Delphi-Quellcode:
procedure TFrmSmartBarDlg.InsertData(Sender: TVirtualStringTree; DataObject:
  IDataObject; Formats: TFormatArray; Effect: Integer; Mode: TVTNodeAttachMode);
var
  FormatAccepted: Boolean;
  I: Integer;
begin
  FormatAccepted := False;
  for I := 0 to High(Formats) do
  begin
    if Formats[I] = CF_VIRTUALTREE then
    begin
      if not FormatAccepted then
      begin
        Sender.ProcessDrop(DataObject, Sender.DropTargetNode, Effect, Mode);
        FormatAccepted := True;
      end;
    end;
  end;
end;

procedure TFrmSmartBarDlg.vstRightDragDrop(Sender: TBaseVirtualTree;
  Source: TObject; DataObject: IDataObject; Formats: TFormatArray;
  Shift: TShiftState; Pt: TPoint; var Effect: Integer; Mode: TDropMode);

  procedure DetermineEffect;
  begin
    // Set Effect accordingly.
    if Source = Sender then
    begin
      Effect := DROPEFFECT_MOVE;
    end
    else
    begin
      Effect := DROPEFFECT_COPY;
    end;
  end;

var
  Attachmode: TVTNodeAttachMode;
  Nodes: TNodeArray;
begin
  Nodes := nil;
  // Translate the drop position into an node attach mode.
  case Mode of
    dmAbove:
      AttachMode := amInsertBefore;
    dmOnNode:
      AttachMode := amInsertAfter;
    dmBelow:
      AttachMode := amInsertAfter;
  else
    AttachMode := amNowhere;
  end;

  if DataObject <> nil then
  begin
    // OLE drag'n drop. Perform full processing.


    // Determine action in advance even if we don't use the dropped data.
    // Note: The Effect parameter is a variable which must be set to the action we
    // will actually take, to notify the sender of the drag operation about remaining actions.
    // This value determines what the caller will do after the method returns,
    // e.g. if DROPEFFECT_MOVE is returned then the source data will be deleted.
    DetermineEffect;
    InsertData(Sender as TVirtualStringTree, DataObject, Formats, Effect, AttachMode);
  end;
end;
Als Clipboard-Format ist Virtual Tree Data gewählt, der DragType ist, wie bereits gesagt dtOLE und der DragMode ist dmAutomatic.

Ich hoffe ihr könnt mir aus meiner Verzweiflung wieder hinaushelfen

Edit: Achja, das Kopieren des Nodes an sich funktioniert ja, das heißt, ich habe dann ein komplett leeres Node, an der Stelle wo ich das gezogenen einfügen wollte. Das Problem, welches sich mir stellt ist einfach wie ich an die Daten komme(die in Form eines Records vorliegen) und jene dann weiterleite, bzw. dem neuen Node anhänge.

Edit2: Auch die Suche hier um Forum und bei Mike direkt gibt nur sehr wenig her. Und falls ich mal was zu dem Thema finde, ist es entweder genau das, was ich nicht brauche, oder einfach unbeantwortet. Ebenfalls ist die Demo für meine Zwecke unbrauchbar, denn diese kopiert nur die Captions an sich, da ich aber mehrere Daten speichere, brauche ich direkt den Zugriff auf den betreffenden Record.

Danke schonmal & Grüße,
Max
Max
„If you have any great suggestions, feel free to mail me, and I'll probably feel free to ignore you.“ . Linus Torvalds
  Mit Zitat antworten Zitat