Thema: Delphi Flackern bei Drag'n'Drop

Einzelnen Beitrag anzeigen

BLin4ik

Registriert seit: 23. Nov 2011
40 Beiträge
 
Delphi 5 Enterprise
 
#1

Flackern bei Drag'n'Drop

  Alt 16. Sep 2015, 11:19
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?
Angehängte Dateien
Dateityp: 7z DragnDrop.7z (130,8 KB, 4x aufgerufen)

Geändert von BLin4ik (16. Sep 2015 um 14:35 Uhr)
  Mit Zitat antworten Zitat