Hallo,
ich habe Probleme was das Drag und Drop angeht
und zwar musste ich feststellen, dass es ab Windows 7 nicht mehr so reibungslos funktioniert.
Sobald man mit dem Drag-Item über ein anderes Item fliegt, fängt es an extrem zu flackern.
Die Anwendung wurde mit Delphi 5 kompiliert und auch da liegt der Hund begraben,
teste ich aber hingegen das Drag'n'Drop mit einem Tool von z.B. Delphi 2010 gibt es diese Probleme nicht.
Aber ich kann nicht so einfach auf eine neure Version umsteigen.
Ich habe schon sehr viele Sachen ausprobiert, hat aber alles nicht geholfen... (Doublebuffered, WS_EX_COMPOSITED...)
Meine Theorie ist, dass es nicht direkt am Drag'n'Drop liegt, aber dadurch der Effekt nur verstärkt wird.
Sondern an den Updates/Refreshes.
Ein Beispiel-Video befindet sich im Anhang, dort erkennt man ein ListView und TreeView.
Der Effekt ist beim ListView in dem Video ist ein wenig übertrieben, das war nur während
der Aufnahme so und es ist ein Skin aktiv in dem Beispiel, passiert aber auch ohne (Alphacontrols)
edit:
Ich habe die Ursache gefunden, aber mir ist trotzdem nicht klar warum sich das so extrem darstellt.
Code:
procedure TCustomListView.DoDragOver(Source: TDragObject; X, Y: Integer; CanDrop: Boolean);
var
Item: TListItem;
Target: TListItem;
begin
Item := GetItemAt(X, Y);
if Item <> nil then
begin
Target := DropTarget;
if (Item <> Target) or (Item = FLastDropTarget) then
begin
FLastDropTarget := nil;
TDragObject(Source).HideDragImage;
Update;
if Target <> nil then
Target.DropTarget := False;
Item.DropTarget := CanDrop;
Update;
TDragObject(Source).ShowDragImage;
end;
end;
end;
Das "HideDragImage" und "ShowDragImage" verursachen das Flackern,
aber was ist der Sinn dabei?