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