9.2 Allgemeine Schritte zur Entwicklung von Drag & Drop -Funktionen
Drag & Drop ist eine Funktion, die den Betrieb von von Windows bereitgestellten Objekten erleichtert und in Delphi leicht entwickelt werden kann.
herauskommen. Gemäß dem Drag-and-Drop-Betriebsprozess können die Entwicklungsschritte in vier Stufen unterteilt werden, nämlich:
● Start Drag Operation
● Empfangen Sie Dragelemente
● Lassen Sie den Drag -Element fallen
● Beenden Sie den Betrieb des Ziehens
Während des Einführungsprozesses kombinieren wir ein Tabset -Beispiel für Drag & Drop -Betrieb. Das Schnittstellendesign ist in der Abbildung dargestellt.
Wenn der Benutzer zur Laufzeit ein Tag in die Position eines anderen Tags zieht, wechselt das Tag zu diesem Ort und verursacht
Umlagerung des Tag -Sets.
9.2.1 Ziehen
Wenn DragMode auf dmautomatisch eingestellt ist
Beginnen Sie, wenn Sie auf DMManual eingestellt sind, ob Sie mit dem Umgang mit Mausereignissen beginnen sollen. Wenn Sie mit dem Ziehen beginnen möchten
Verwendung der BegindRag -Methode.
In Tabset Drag and Drop verwenden wir die MouseDown -Ereignisverarbeitung unten, um ein Tag zu ziehen.
Stellen Sie zunächst fest, ob die gedrückte linke Taste die linke Taste ist, und stellen Sie dann fest, ob das Element legal ist.
Procedure tform1.tabset1MouseDown (Absender: Tobject; Taste: tmouseButton;
Verschiebung: TShiftState; x, y: Ganzzahl);
var
Dragitem: Ganzzahl;
Beginnen
Wenn Taste = Mbleft dann
Beginnen
DragItem: = tabset1.Itematpos (Punkt (x, y));
if (DragItem> -1) und (DragItem <tabset1.tabs.count) dann dann
Tabset1.begindrag (false);
Ende;
Ende;
9.2.2 Empfangen Sie gezogene Artikel
Ob ein Steuerelement Drag -Elemente empfangen kann, wird durch das ONDRAGOVER -Ereignis der Kontrolle ermittelt. Beim Registerkartenschlepping ist die Hauptsache, die Mausposition zu verwenden, um zu beurteilen.
procedure tform1.tabset1dragover (Absender, Quelle: Tobject; x, y: Integer;
Zustand: Tdragstate;
var
Tropfen: Ganzzahl;
Beginnen
Wenn Source = tabset1 dann
Beginnen
Tropfen: = tabset1.Itematpos (Punkt (x, y));
Akzeptieren: = (Droppos> -1) und (Droppos <> tabset1.tabIndex) und
(Droppos <tabset1.tabs.count);
Ende;
anders
Akzeptieren: = falsch;
Ende;
9.2.3 Legen Sie den Drag -Element ab
Wenn die ONDRAGOVER -Ereignisverarbeitung Rücksendungen true und der Artikel fallen gelassen wird, wird das ONDRAGROP -Ereignis
Der Prozess des Ziehens und Ablegens der Antwort. In der Tabset Drag & Drop -Instanz soll die Position des Tags geändert werden.
procedure tform1.tabset1DRagDrop (Absender, Quelle: Tobject; x, y: Integer);
var
Oldpos: Ganzzahl;
Newpos: Ganzzahl;
Beginnen
Wenn Source = tabset1 dann
Beginnen
OldPos: = Tabset1.TabIndex;
Newpos: = tabset1.itematpos (Punkt (x, y));
if (newpos> -1) und (newpos <> Oldpos) dann dann
Tabset1.tabs.move (Oldpos, Newpos);
Ende;
Ende;
9.2.4 Endverkehrungsbetrieb
Es gibt zwei Möglichkeiten, den Drag -Operation zu beenden: entweder veröffentlicht der Benutzer die Mausschlüssel oder das Programm verwendet die Enddrag -Methode.
Erzwungen abortieren. Es gibt zwei Folgen der Beendigung des Drag -Operation: Drop wird akzeptiert oder der Tropfen wird ignoriert.
Nach Abschluss des Drag -Vorgangs erhält die Quellensteuerung eine Nachricht, um auf das Drag End Event OnendDrag zu antworten.
9.3 Beispiele für Drag & Drop -Anwendungen: Drag & Drop -Support für Dateimanager
Obwohl das in Kapitel 6 entwickelte Beispiel für Dateimanager -Anwendungen in der Funktion Gestalt annimmt, ist es operativ, es ist operativ
Im Vergleich zum Dateimanager von Windows gibt es immer noch viele Mängel. Der größte Nachteil ist, dass es keine Drag & Drop -Bewegung von Dateien unterstützt
und ziehen Sie die Kopie. Am Ende dieses Kapitels können wir diesen Fehler ausgleichen.
Datei Drag & Drop -Bewegung bezieht sich auf die Datei, wenn der Benutzer eine Datei in ein Verzeichnis unter dem Verzeichnisbaum zieht und sie fallen lässt.
Es wird automatisch in dieses Verzeichnis verschoben.
Wenn Sie es einfügen und fallen lassen, wird die Datei automatisch in das aktuelle Verzeichnis des Laufwerks kopiert. Dateilistenfeld als Quellensteuerung und
Der Verzeichnisbaum und die Antriebsbezeichnung der Zielsteuerung können sich in verschiedenen Unterwindows befinden. Das aktuelle Verzeichnis des Laufwerks ist ein Sub
Das neueste Betriebsergebnis des Fensters, unabhängig davon, ob dieser Unterfenster eine Beziehung zur Drag-Quelle und zum Drag-Ziel hat.
Um die oben genannten Funktionen zu implementieren, gibt es zwei Probleme, die zuerst gelöst werden müssen:
1.Wie das aktuelle Verzeichnis jedes Laufwerks aufzeichnen?
Dafür definieren wir eine globale Variable:
var CurrentDirlist: Array [0 ... 25] von String [70];
Im Onchange -Ereignis von DirectoryOutline:
procedure tfmform.directoryoutlinechange (Absender: tobject);
Beginnen
Kreaturentwicklung;
Filelist.clear;
Filelist.Directory: = DirectoryOutline.Directory;
Filelist.update;
CurrentDirlist [drevetabset.tabIndex]: = DirectoryOutline.Directory;
FileManager.DirectoryPanel.Caption: = DirectoryOutline.Directory;
Ende;
Da Drivetabset auf das Onclick -Ereignis reagiert
Senden Sie das OnChange -Ereignis von DirectoryOutline, sodass sie jederzeit im ONDRAGROP -Event verwendet werden kann
Das CurrentDirlist Array -Element ist keine leere Zeichenfolge.
2. Wie kann man die Irrelevanz der Bewegung und das Kopieren mit Unterfenster sicherstellen?
Ein wichtiges Problem hier ist, dass wir, wenn wir die Quellensteuerung beurteilen, den IS -Operator verwenden, um die Typ -Überprüfung durchzuführen:
Wenn die Quelle tFilelist ist, dann…
Wenn wir die folgende Anweisung verwenden:
Wenn Quelle = Filelist dann
…
Anschließend sind die Bewegung und die Kopieroperationen auf den Umfang dieses Unterwindows beschränkt.
Als wir die obige Frage lösten, folgten unsere Arbeit nur den allgemeinen Entwicklungsschritten von Drag and Drop, und wir haben sie Schritt für Schritt abgeschlossen.
1.filelist beginnt mit dem Ziehen des Betriebs
Prozedur tfMform.filelistmouseDown (Absender: Tobject; Taste: tmouseButton;
Verschiebung: TShiftState; x, y: Ganzzahl);
Beginnen
Wenn Taste = Mbleft dann
mit Absender als tfilelistbox tun
Beginnen
Wenn itematpos (Punkt (x, y), true)> = 0 dann
Begindrag (falsch);
Ende;
Ende;
ItematPos wird verwendet, um zu prüfen, ob derzeit eine Datei vorhanden ist. Die BegindRag -Methode übergibt den Parameter False und ermöglicht die Filelistin, Mausereignisse separat zu verarbeiten, ohne zu ziehen. Tatsächlich existiert diese Situation in großen Mengen.
2. DirectoryOutline und Drivetabset entscheiden Sie, ob Sie das Schleppen akzeptieren und auf die Stelle setzen sollen.
Prozedur tfMform.DirectoryOutLinedRagover (Absender, Quelle: Tobject; x,
Y: Ganzzahl;
Beginnen
Wenn die Quelle TFilelistbox ist, dann dann
Akzeptieren: = wahr;
Ende;
Prozedur tfmForm.DrivetabSetDagover (Absender, Quelle: Tobject; x,
Y: Ganzzahl;
var
Propos: Ganzzahl;
Beginnen
Wenn die Quelle TFilelistbox ist, dann dann
mit Drivetabset tun
Beginnen
Propos: = itematpos (Punkt (x, y));
Akzeptieren: = (Proppos> -1) und (Proppos <Tabs.Count);
Ende;
Ende;
DirectoryOutline ist bedingungslose Akzeptanz, während Drivetabset prüfen muss, ob es sich um ein rechtliches Tag handelt.
3. Drag & Drop -Antwort
DirectoryOutline Drag & Drop wird verwendet, um die Funktionsbewegungsfunktion zu implementieren. Rufen Sie das Ereignis für Bestätigung im Programm an
Während des Verarbeitungsprozesses wird der Zielpfad von DirectoryOutline.Iitems [getItem (x, y)] erhalten. FullPath.
Prozedur tfMform.DirectoryOutLinedRagdrop (Absender, Quelle: Tobject; x,,
Y: Ganzzahl);
Beginnen
Wenn die Quelle TFilelistbox ist, dann dann
mit DirectoryOutline
Beginnen
BestätigenChange ('Move', filelist.FileName, Elemente [getItem (x, y)]. FullPath);
Ende;
Ende;
Drivetabset Drag and Drop wird verwendet, um die Dateikopierfunktion zu implementieren. Umwandeln Sie die aktuelle Position in den entsprechenden Treiber im Programm
Der Antriebsbrief, der Zielpfad wird von CurrentDirlist [Drivetabset.tabIndex] erhalten.
procedure tfmform.drivetabSetDRagDrop (Absender, Quelle: Tobject; x, y: Integer);
var
Apoint: tPoint;
Beginnen
Apoint.x: = x;
Drivetabset.tabIndex: = drivetabset.Itematpos (afoT);
Wenn die Quelle TFilelistbox ist, dann dann
mit Drivetabset tun
Beginnen
Wenn CurrentDirlist [Tabindex] <> '' dann dann
BestätigenChange ('Copy', theFileName, CurrentDirlist [Tabindex]);
Ende;
Ende;
4.filelistische Antwort auf das Ziehen von Endungen und aktualisiert die Dateiliste
procedure tfmform.filelistendDrag (Absender, Ziel: tobject; x, y: Integer);
Beginnen
Wenn Ziel <> nil ist, filelist.update;
Ende;