Autor Beitrag
Coder
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1383
Erhaltene Danke: 1

WinXP
D2005 PE
BeitragVerfasst: Di 08.05.07 19:27 
Hi
Ich versuche verzweifelt OLE Drag&Drop im VirtualTreeView zu benutzen.
Es gibt auf soft-gems.net eine Demo dafür ("Virtual Treeview (demo apps)" / 3. von oben), doch die enthält IMHO Fehler.
Hab die Units der Demo unten angehängt.

Zeile 646 soll eigentlich den OLE Drop Prozess auslösen:
ausblenden Delphi-Quelltext
1:
Sender.ProcessDrop(DataObject, Sender.DropTargetNode, Effect, Mode);					

Doch setzt man in der Zeile einen Haltepunkt stellt man fest, dass diese Zeile bei keinem Drag&Drop Vorgang ausgeführt wird.
Logisch, weil in den Eigenschaften des VST unter ClipboardFormats Virtual Tree Data garnicht aktiviert ist.
Die if Abfrage in Zeile 639 wird also nie true: if Formats[I] = CF_VIRTUALTREE then
Dadurch kommt es nie zum ProcessDrop.

Aktiviert man test weise unter ClipboardFormats Virtual Tree Data sieht man das, das OLE Drag&Drop nicht funktioniert.
Die Nodes verschwinden nach dem Drop einfach.

Wieso Drag&Drop aber funktioniert wenn unter ClipboardFormats Virtual Tree Data auf false ist liegt daran:
Die Namen der Nodes werden wie üblich in einem Rekord gespeichert.
Aber der Code tut das Rekord nicht mit dem Knoten kopieren oder verschieben.
Das Caption des Nodes wird dort mithilfe soSaveCaptions übernommen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TMainForm.Tree1NewText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; Text: WideString);

var
  Data: PNodeData;

// Tree1 as well as Tree2 use the soSaveCaptions StringOption which enables automatic caption store action
// when tree data is serialized into memory (e.g. for drag'n drop). Restoring the caption is done by triggering
// this event for each loaded node.
// This mechanism frees us from implementing a SaveNode and LoadNode event since we have only the caption to store.

begin
  Data := Sender.GetNodeData(Node);
  Data.Caption := Text;
end;


Kurzum: Die Demo enthält Fehler.

Jemand eine Idee wie ich das Rekord mit verschieben kann?
Wo finde ich eine funktionierende Demo für OLE Drag&Drop?

MfG
Einloggen, um Attachments anzusehen!
Coder Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1383
Erhaltene Danke: 1

WinXP
D2005 PE
BeitragVerfasst: Do 14.06.07 21:42 
In Secretizer konnte ich OLE Drag&Drop nun richtig implementieren.