Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Drag and Drop von Komponenten und Doublebuffered (https://www.delphipraxis.net/201011-drag-drop-von-komponenten-und-doublebuffered.html)

skoschke 15. Jun 2019 07:18

Drag and Drop von Komponenten und Doublebuffered
 
Hallo,

ich erstelle gerade eine Art Designer, bei dem Controls (Shapes, Panels,...) auf einem TPanel liegen und die können mit der Maus verschoben / Vergrößert / Verkleinert werden...

Nun übermalen Linien beim Verschieben andere Controls und wenn man diese Bewegungen mehrfach wiederholt sind die anderen Controls "wegradiert".

Doublebuffered auf true führt dazu, daß die Panels z.B. beim Drag/Drop komplett schwarz werden!

Ein auch als Hintergrund vorhandenes TImage wird nicht übermalt, so daß ich nun die Idee hatte, zu Beginn des Drag/Drop eine Art Screenshot zu machen, diesen in das Image und nach Beenden des Drag-Vorgangs wieder zu entfernen.

Nur wie bekomme ich diesen "Screenshot des Panels"?

Oder ist dieser Ansatz völlig falsch und es geht ganz anders?

Ciao
Stefan

peterbelow 15. Jun 2019 10:16

AW: Drag and Drop von Komponenten und Doublebuffered
 
Zitat:

Zitat von skoschke (Beitrag 1434685)
Hallo,

ich erstelle gerade eine Art Designer, bei dem Controls (Shapes, Panels,...) auf einem TPanel liegen und die können mit der Maus verschoben / Vergrößert / Verkleinert werden...

Nun übermalen Linien beim Verschieben andere Controls und wenn man diese Bewegungen mehrfach wiederholt sind die anderen Controls "wegradiert".

Doublebuffered auf true führt dazu, daß die Panels z.B. beim Drag/Drop komplett schwarz werden!

Ein auch als Hintergrund vorhandenes TImage wird nicht übermalt, so daß ich nun die Idee hatte, zu Beginn des Drag/Drop eine Art Screenshot zu machen, diesen in das Image und nach Beenden des Drag-Vorgangs wieder zu entfernen.

Nur wie bekomme ich diesen "Screenshot des Panels"?

Oder ist dieser Ansatz völlig falsch und es geht ganz anders?

Ciao
Stefan

Wie schaffst Du das? Deine Methodik blockiert offenbar das Neuzeichnen der Controls, und das passiert definitiv nicht wenn Du z. B. Left und Top der gezogenen Komponente veränderst.

jaenicke 15. Jun 2019 13:05

AW: Drag and Drop von Komponenten und Doublebuffered
 
Es gibt auch fertige Designer wie diese, wobei letzteres weniger kostet:
http://www.econtrol.ru/formdsn.html
https://www.lmdinnovative.com/produc...lmddesignpack/
Um diese Funktionalität auch nur annähernd hinzubekommen braucht man schon sehr sehr lange...

Auch die JEDIs haben so etwas als Open Source drin (auf der Seite Jv Runtime Design), aber das kann auch deutlich weniger als die beiden kommerziellen Lösungen.

Um zu schauen woran es bei dir scheitert wäre etwas Quelltext hilfreich.

skoschke 17. Jun 2019 12:17

AW: Drag and Drop von Komponenten und Doublebuffered
 
Ich habe scheinbar so viele Zeichenroutinen die dam System nicht mehr Zeit lassen, neuzuzeichnen :-(

Ich bin nun auf folgendes gestoßen:
Delphi-Quellcode:
  procedure TForm1.ControlMouseMove(Sender: TObject; Shift: TShiftState;
    X, Y: Integer);
  begin
    screen.Cursor := crSizeAll;
    if ssLeft in Shift then
    begin
      ReleaseCapture;
      (Sender as TPanel).Perform(WM_SYSCOMMAND, $F012, 0);
  end;
damit funktioniert das Schieben eines Panels problemlos ohne jegliche Flackerei, der Haken dabei: ich bekomme es nicht hin, mehrere Panels (die als selektiert markiert sind) gleich zusammen zu verschieben.

Gibt es dafür einen Trick?

Ciao
Stefan

peterbelow 17. Jun 2019 15:41

AW: Drag and Drop von Komponenten und Doublebuffered
 
Zitat:

Zitat von skoschke (Beitrag 1434835)
Ich habe scheinbar so viele Zeichenroutinen die dam System nicht mehr Zeit lassen, neuzuzeichnen :-(

Ich bin nun auf folgendes gestoßen:
Delphi-Quellcode:
  procedure TForm1.ControlMouseMove(Sender: TObject; Shift: TShiftState;
    X, Y: Integer);
  begin
    screen.Cursor := crSizeAll;
    if ssLeft in Shift then
    begin
      ReleaseCapture;
      (Sender as TPanel).Perform(WM_SYSCOMMAND, $F012, 0);
  end;
damit funktioniert das Schieben eines Panels problemlos ohne jegliche Flackerei, der Haken dabei: ich bekomme es nicht hin, mehrere Panels (die als selektiert markiert sind) gleich zusammen zu verschieben.

Gibt es dafür einen Trick?

Ciao
Stefan

Nein, nicht mit dieser Methode, die funktioniert nur für ein einziges Control zur Zeit, da sie die eingebaute Windows-Funktion zum Verschieben eines Fenster per Drag auf die Titelzeile mißbraucht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:03 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