Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Flackern bei Drag'n'Drop (https://www.delphipraxis.net/186611-flackern-bei-dragndrop.html)

BLin4ik 16. Sep 2015 11:19


Flackern bei Drag'n'Drop
 
Liste der Anhänge anzeigen (Anzahl: 1)
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?


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz