DoDragDrop czy da się uzyskać ścieżkę z IDropTarget

0

Witam. Siedziałem i googlowałem, kobminowałem. Próbowałem pod Drag and Drop Component Suite 5.2 i nic. Na jednym forum wyczytałem, że to program docelowy ma umieć obsłużyć IDropTarget, a nasz jedynie IDropSource jeżeli to ze swojej aplikacji przeciągamy na inne okna na przykład Exploratora. I tutaj pytanie czy da się przeciągając element/y z ListView pobrać ścieżkę gdzie zostały one przeciągnięte? Bo http://www.swissdelphicenter.ch/torry/showcode.php?id=2335 służy do przeciągania plików z FileListBox, a rozwiązania ponoć kompletne są chyba tylko na Experts Exchange za opłatą. Prosił bym o jakieś wskazówki i przykłady, może ktoś z Was robił coś takiego. Ja po prostu chcę wiedzieć do jakiej lokalizacji przeciągnięto element z TLisTView nie będący plikiem, tak aby wywołać kod, który dopiero pobierze plik z Internetu i zapisze go w tej lokalizacji. I tutaj pod Drag and Drop Component Suite z FileStreamami nie bardzo mi pomaga. A ponieważ późna pora nic z pobieżnego przejrzenia źródeł ów komponentów mi nie udalo się wywnioskować, dlatego liczę na podpowiedzi od Was. Z góry dziękuję.

0

Noi masz. Znalazłem na pewnej stronie. To chyba w API.
sory, że tak żywcem zerżnięte, ale cóż.

Private Declare Function GetCursorPos Lib "user32" _
(lpPoint As POINTAPI) As Long
Private Type POINTAPI
X As Long
Y As Long
End Type
Private Declare Function WindowFromPoint Lib "user32" _
(ByVal xPoint As Long, _
ByVal yPoint As Long) As Long
Private Declare Function GetWindowRect Lib "user32" _
(ByVal hwnd As Long, _
lpRect As RECT) As Long
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type

Przy powodzeniu zwraca wartość różną od ZERA, a w argumentach ByRef współrzędne X,Y kursora

Private Function zbGetCursorPos(Optional lRetX As Long = 0, _
                                    Optional lRetY As Long = 0) As Long
Dim papi As POINTAPI

    zbGetCursorPos = GetCursorPos(papi)
    lRetX = papi.x
    lRetY = papi.y

End Function

Zwraca uchwyt okna zawierający punkt lX, lY, dla okna Static Text zwraca uchwyt okna nadrzędnego, nie zwraca uchwytu okna ukrytego lub nieaktywnego

Private Function zbGetWindowFromPoint(lX As Long, lY As Long) As Long
    zbGetWindowFromPoint = WindowFromPoint(lX, lY)
End Function

Przy powodzeniu zwraca wartość różną od ZERA, a w argumentach ByRef zwraca położenie X,Y lewego górnego narożnika okna (współrzędne ekranowe) oraz szerokość i wysokość okna (w pikselsch).

Private Function zbGetWindowRect(hWind As Long, _
                                Optional lLeftRet As Long = 0, _
                                Optional lTopRet As Long = 0, _
                                Optional lWidthRet As Long = 0, _
                                Optional lHeightRet As Long = 0) As Long
Dim rct As RECT

    zbGetWindowRect = GetWindowRect(hWind, rct)
    With rct
        lLeftRet = .Left
        lTopRet = .Top
        lWidthRet = .Right - .Left
        lHeightRet = .Bottom - .Top
    End With

End Function

Przykładowe wywołanie:

#Wciśnij lewy przycisk myszy nad przyciskiem i przesuwaj
#Wskaźnik myszy nad oknami

Private Sub btnTest_MouseMove(Button As Integer, Shift As Integer, _
                              x As Single, y As Single)
Dim lX As Long, lY As Long
Dim lLeft As Long, lTop As Long
Dim lWidth As Long, lHeight As Long
Dim hWind As Long

    If Button = acLeftButton Then
        Me.Caption = ""
        If zbGetCursorPos(lX, lY) = 0 Then Exit Sub
        hWind = zbGetWindowFromPoint(lX, lY)
        If hWind = 0 Then Exit Sub
        If zbGetWindowRect(hWind, lLeft, lTop, lWidth, lHeight) = 0 Then
            Exit Sub
        End If
        Me.Caption = "X=" & lX & ", Y=" & lY & _
                     ", Left=" & lLeft & ", Top=" & lTop & _
                     ", Width=" & lWidth & ", Height=" & lHeight
    End If

End Sub

dodanie znaczników <code class="vbnet"> - furious programming

0

TomRiddle: po pierwsze kod w języku na który nie da się patrzeć, jeszcze bardziej po...pieprzone niż c podobne. A fukcje GetWindowFromPoint i GetWindowRect znam, ale mi chodzi o coś innego. Co mi da pobranie tytułu okna czy jego klasy. Ja chcę mieć ścieżkę po upuszczeniu elementu przy użyciu DoDragDrop. Przeczytaj jeszcze raz uważnie mój pierwszy post.

0

Nie rozumiem chcesz umieć:

  • z eksploratora (pulpitu) przeciągnąć pliki do swojego programu
  • ze swojego programu przeciągnąć pliki do eksploratora (pulpitu)?
    *w tym drugim przypadku pliki mogą być wirtualne (jeszcze nie istnieć) i zostać stworzone dopiero po upuszczeniu.

Te dwie rzeczy są dosyć proste.
A może o coś innego ci chodzi?

0

Chce móc przeciągnąć z TListView zaznaczone elementy poza aplikację na przykład na Pulpit albo na okno z folderem Exploratora albo katalogu w Total Commanderze, tak aby uzyskać ścieżkę na jaką przeciągnałem i jeżeli jest to ściezką fizyczna na przykład D:\BZDETY to móc ją pobrać, a następnie wywołać kod, ktory już istnieje, a który pobierze pliki w odpowiedni sposób jednak jako katalog docelowy używając ten pobrany po upuszczeniu na przykład właśnie D:\BZDETY. Nie interesują mnie odwrotne sposoby, bo przykładów na to jak przeciągnąc pliki z zewnątrz na okno naszej aplikacji jest w google aż za dużo i ten sposób mam opanowany. Natomiast Drag and Drop Component Suite pozwala zapisać tylko zdefinowane już Streamy, ale nie pozwala ustalić nigdzie ściezki do katalogu, na którą przeciągnięto zawartość komponentu.

0

przepraszam ze odpowiadam na stary temat ale drag n drop jest malo opisany takze dodaje swoje piec groszy. Zostalo pobieranie source opisane tutaj : http://stackoverflow.com/questions/21245887/retrieving-filename-from-idataobject-in-delphi
korzystamy z IDataObject ktory wykorzystujemy i tak w funkcji DoDragDrop. Kodu nie mam jak sprawdzic ale konczac temat - moze sie to kiedys komus przyda

0

Dzięki. Popatrzę na to dokładniej kiedy będę pod Windowsem. A faktycznie, może nie tylko dla mnie to będzie przydatne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1