Inzicht in slepen en neerzetten

"Slepen en neerzetten" is de computermuisknop ingedrukt houden terwijl de muis wordt verplaatst en vervolgens de knop loslaten om het object neer te zetten. Delphi maakt het eenvoudig om slepen en neerzetten in applicaties te programmeren.

U kunt echt slepen en neerzetten van / naar waar u maar wilt, zoals van het ene formulier naar het andere, of van Windows Explorer naar uw toepassing.

Voorbeeld van slepen en neerzetten

Start een nieuw project en plaats één afbeeldingsbesturing op een formulier. Gebruik Object Inspector om een ​​afbeelding te laden (eigenschap Picture) en stel vervolgens de DragMode eigendom aan dmManual. We zullen een programma maken waarmee een TImage-besturingsduur kan worden verplaatst met behulp van de techniek slepen en neerzetten.

DragMode

Componenten laten twee soorten slepen toe: automatisch en handmatig. Delphi gebruikt de eigenschap DragMode om te bepalen wanneer de gebruiker het besturingselement kan slepen. De standaardwaarde voor deze eigenschap is dmManual, wat betekent dat het slepen van componenten door de toepassing niet is toegestaan, behalve onder speciale omstandigheden, waarvoor we de juiste code moeten schrijven. Ongeacht de instelling voor de eigenschap DragMode, wordt de component alleen verplaatst als de juiste code is geschreven om deze te verplaatsen.

OnDragDrop

De gebeurtenis die slepen en neerzetten herkent, wordt de gebeurtenis OnDragDrop genoemd. We gebruiken het om aan te geven wat we willen gebeuren wanneer de gebruiker een object laat vallen. Daarom moeten we, als we een component (afbeelding) naar een nieuwe locatie op een formulier willen verplaatsen, code schrijven voor de OnDragDrop-gebeurtenishandler van het formulier.

De parameter Source van de gebeurtenis OnDragDrop is het object dat wordt verwijderd. Het type van de bronparameter is TObject. Om toegang te krijgen tot de eigenschappen, moeten we het naar het juiste componenttype casten, in dit voorbeeld TImage.

Aanvaarden

We moeten de OnDragOver-gebeurtenis van het formulier gebruiken om aan te geven dat het formulier het TImage-besturingselement kan accepteren dat we erop willen plaatsen. Hoewel de parameter Accept standaard wordt ingesteld op True, weigert het besturingselement het gesleepte object als er geen OnDragOver-gebeurtenishandler wordt opgegeven (alsof de parameter Accept is gewijzigd in False).

Voer uw project uit en probeer uw afbeelding te slepen en neer te zetten. Merk op dat de afbeelding zichtbaar blijft op de oorspronkelijke locatie terwijl de muisaanwijzer beweegt. We kunnen de OnDragDrop-procedure niet gebruiken om de component onzichtbaar te maken tijdens het slepen, omdat deze procedure alleen wordt aangeroepen nadat de gebruiker het object heeft neergezet (of helemaal niet).

DragCursor

Als u de weergegeven cursorafbeelding wilt wijzigen wanneer het besturingselement wordt gesleept, gebruikt u de eigenschap DragCursor. De mogelijke waarden voor de eigenschap DragCursor zijn dezelfde als die voor de eigenschap Cursor. U kunt geanimeerde cursors gebruiken of wat u maar wilt, zoals een BMP-afbeeldingsbestand of een CUR-cursorbestand.

BeginDrag

Als DragMode dmAutomatic is, begint het slepen automatisch wanneer we op een muisknop drukken met de cursor op het besturingselement. Als u de waarde van de eigenschap DragMode van TImage als standaard hebt ingesteld via dmManual, moet u de methoden BeginDrag / EndDrag gebruiken om het onderdeel te slepen. Een meer gebruikelijke manier om te slepen en neer te zetten, is DragMode op dmManual in te stellen en het slepen te starten door muis-omlaaggebeurtenissen af ​​te handelen.

Nu zullen we de gebruiken Ctrl + MouseDown toetsenbordcombinatie om slepen mogelijk te maken. Zet TImage's DragMode terug naar dmManual en schrijf de MouseDown-gebeurtenishandler als volgt:

BeginDrag gebruikt een Booleaanse parameter. Als we True passeren (zoals in deze code), begint het slepen onmiddellijk; als het niet waar is, begint het pas als we de muis over een korte afstand bewegen. Vergeet niet dat het de Ctrl-toets vereist.