Italia
Foro

Merker bei Drag&Drop der Gridbox reagiert nicht

 
- Page 1 -



Thomas
Freier
Angelehnt an Andreas Beispiel per eine Listbox wollte ich aus optischen Stabilire auch einen Merker haben. Leider kann ich ihn nicht dazu bewegen, dass er sich bewegt.
Wie gehts ?
 $H Windows.ph
 $H Messages.ph
 $H ListView.ph
 $H commctrl.ph
DEF $DRAGLISTMSGSTRING "commctrl_DragListMsg"
DEF &DL_BEGINDRAG 1157
DEF &DL_DRAGGING 1158
DEF &DL_DROPPED 1159
DEF &DL_MOVECURSOR 3
DEF &DL_COPYCURSOR 2
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Struct LVHitTestInfo = X&,Y&,flags&,Item&,SubItem&
Declare LVHTI#,l%,L.SubItem$
Dim LVHTI#,LVHitTestInfo

Proc LV_HitTest

    Parameters  LV&,X%,Y%
    ~GetCursorPos(LVHTI#)
    ~ScreenToClient(LV&,LVHTI#)
    SendMessage(LV&,~LVM_SUBITEMHITTEST,0,LVHTI#)
    Return LVHTI#.SubItem&

EndProc

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

proc LvDeSelect'deselectieren

    parameters Lv&,Item&
    Declare s#
    dim s#,1024
    long s#,12=0
    long s#,16=~LVIS_SELECTED | ~LVIS_FOCUSED
    sendmessage(Lv&,~LVM_SETITEMSTATE,Item&,s#)
    dispose s#

endproc

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

proc LvSelect'selectieren

    parameters Lv&,Item&
    Declare s#
    dim s#,1024
    long s#,12=$2
    long s#,16=~LVIS_SELECTED | ~LVIS_FOCUSED
    sendmessage(Lv&,~LVM_SETITEMSTATE,Item&,s#)
    sendmessage(lv&,~LVM_SETHOTITEM ,item&,0)
    sendmessage(lv&,~LVM_ENSUREVISIBLE ,Item&,0)
    dispose s#

endproc

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Struct POINT = X&,Y&
Struct DRAGLISTINFO = uNotification&,hWnd&,ptCursor!POINT
Var FirstItem& = 0
Var LastItem& = 0
Var MoveString$ = ""
Var MoveCursor& = ~LoadCursor(~GetModuleHandle("shell32.dll"),1003)
'Genau diese spezielle Meldung muss registiert werden
'damit das Fenster die Drag&Drop Operationen verarbeiten kann.
Var DragMSG& = ~RegisterWindowMessage($DRAGLISTMSGSTRING)
CLS
SetDialogFont ~GetStockObject(~ANSI_VAR_FONT)
Var Ende& = 0
Var dlg& = @Create("ChildWindow", %hwnd, "Liste", 80, 60,300,300)
var  Text$ = "Name;0;140"
var  draglist& = Create("GridBox", dlg&, text$, 0, 80, 14, 100, 220)
'Die Listbox per Drag&Drop vobereiten
External("comctl32.dll","MakeDragList",Draglist&)
Addstring(Draglist&,"Eintrag")
Addstring(Draglist&,"Auftrag")
Addstring(Draglist&,"Anton")
Addstring(Draglist&,"Otto")
Addstring(Draglist&,"Werner")
Addstring(Draglist&,"Karl")
SubClass dlg&,1

WhileNot Ende&

    Waitinput

EndWhile

SubClass dlg&,0
end

SubClassProc

    If SubClassMessage(dlg&,DragMSG&)

        Var Info# = New(DRAGLISTINFO)
        locate 0,0
        l% =  LV_HitTest(Draglist&,%mousex,%mousey)
        L.SubItem$=GetText$(Draglist&,LVHTI#.Item&,LVHTI#.SubItem&)
        Info# = &slParam

        If Info#.uNotification& = &DL_BEGINDRAG'Drag&Drop beginnt und Item merken

            FirstItem& = LVHTI#.Item&
            print FirstItem&, " nach "
            'Marker zeichnen, muss nicht sein, aumento aber die Sichtbarkeit
            External("comctl32.dll","DrawInsert",dlg&,Draglist&,Firstitem&)
            MoveString$ = GetText$(Draglist&,LVHTI#.Item&,LVHTI#.SubItem&)'Item-Text merken
            Set("WinProc", 0)
            ~SetCursor(MoveCursor&)
            Return &DL_COPYCURSOR

        ElseIf Info#.uNotification& = &DL_DRAGGING'Drag&Drop ist im Gange

            LastItem& = LVHTI#.Item&
            locate 0,10
            Print LastItem&
            LvSelect  Draglist&,LastItem&
            'Marker neuzeichnen
            External("comctl32.dll","DrawInsert",dlg&,Draglist&,LastItem&)
            Set("WinProc", 0)
            'Item markieren
            SendMessage(DragList&,~Lb_SETCURSEL,LastItem&,0)
            ~SetCursor(MoveCursor&)

        ElseIf Info#.uNotification& = &DL_DROPPED'Drag&Drop ist beendet

            LastItem& = LVHTI#.Item&

            If Lastitem& <> -1

                'Marker entfernen
                External("comctl32.dll","DrawInsert",dlg&,Draglist&,-1)
                'das erste gemerkte Item löschen
                DeleteString(DragList&,FirstItem&)
                'und an der Position des letzten gemerkten Items einfügen
                InsertString(DragList&,LastItem&,MoveString$)
                Set("WinProc", 0)
                LvSelect  Draglist&,LastItem&

            EndIf

        EndIf

    EndIf

EndProc

 
Gruß Thomas
Windows XP SP2, XProfan X2
21.11.2010  
 



« Dieser Beitrag wurde als Lösung gekennzeichnet. »


Andreas
Miethe


Thomas Freier (11/21/10)
Angelehnt an Andreas Beispiel per eine Listbox wollte ich aus optischen Stabilire auch einen Merker haben. Leider kann ich ihn nicht dazu bewegen, dass er sich bewegt.
Wie gehts ?


Hallo Thomas,

per Listviews ist das auch nicht gedacht.
Dafür nimmt man Insert-Marks
 $H Windows.ph
 $H Messages.ph
'$H ListView.ph
 $H commctrl.ph
DEF &LVM_SETINSERTMARK 4262
Struct LVINSERTMARK = cbSize&,dwFlags&,iItem&,dwReserved&
DEF $DRAGLISTMSGSTRING "commctrl_DragListMsg"
DEF &DL_BEGINDRAG 1157
DEF &DL_DRAGGING 1158
DEF &DL_DROPPED 1159
DEF &DL_MOVECURSOR 3
DEF &DL_COPYCURSOR 2
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Struct LVHitTestInfo = X&,Y&,flags&,Item&,SubItem&
Declare LVHTI#,l%,L.SubItem$
Dim LVHTI#,LVHitTestInfo

Proc LV_HitTest

    Parameters  LV&,X%,Y%
    ~GetCursorPos(LVHTI#)
    ~ScreenToClient(LV&,LVHTI#)
    SendMessage(LV&,~LVM_SUBITEMHITTEST,0,LVHTI#)
    Return LVHTI#.SubItem&

EndProc

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Proc LvDeSelect'deselectieren

    Parameters Lv&,Item&
    Declare s#
    Dim s#,1024
    LONG s#,12=0
    LONG s#,16=~LVIS_SELECTED | ~LVIS_FOCUSED
    sendmessage(Lv&,~LVM_SETITEMSTATE,Item&,s#)
    dispose s#

EndProc

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Proc LvSelect'selectieren

    Parameters Lv&,Item&
    Declare s#
    Dim s#,1024
    LONG s#,12=$2
    LONG s#,16=~LVIS_SELECTED | ~LVIS_FOCUSED
    sendmessage(Lv&,~LVM_SETITEMSTATE,Item&,s#)
    sendmessage(lv&,~LVM_SETHOTITEM ,item&,0)
    sendmessage(lv&,~LVM_ENSUREVISIBLE ,Item&,0)
    dispose s#

EndProc

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Struct POINT = X&,Y&
Struct DRAGLISTINFO = uNotification&,hWnd&,ptCursor!POINT
Var FirstItem& = 0
Var LastItem& = 0
Var MoveString$ = ""
Var MoveCursor& = ~LoadCursor(~GetModuleHandle("shell32.dll"),1003)
'Genau diese spezielle Meldung muss registiert werden
'damit das Fenster die Drag&Drop Operationen verarbeiten kann.
Var DragMSG& = ~RegisterWindowMessage($DRAGLISTMSGSTRING)
CLS
SetDialogFont ~GetStockObject(~ANSI_VAR_FONT)
Var Ende& = 0
Var dlg& = @Create("ChildWindow", %hwnd, "Liste", 80, 60,300,300)
Var  Text$ = "Name;0;140"
Var  draglist& = Create("GridBox", dlg&, text$, 0, 80, 14, 100, 220)
'Die Listbox per Drag&Drop vobereiten
External("comctl32.dll","MakeDragList",Draglist&)
Addstring(Draglist&,"Eintrag")
Addstring(Draglist&,"Auftrag")
Addstring(Draglist&,"Anton")
Addstring(Draglist&,"Otto")
Addstring(Draglist&,"Werner")
Addstring(Draglist&,"Karl")
SubClass dlg&,1

WhileNot Ende&

    Waitinput

EndWhile

SubClass dlg&,0
End

SubClassProc

    If SubClassMessage(dlg&,DragMSG&)

        Var structInsertMark# = New(LVINSERTMARK)
        structInsertMark#.cbSize& = 16
        structInsertMark#.dwFlags& = 1'LVIM_AFTER
        structInsertMark#.dwReserved& = 0
        Var Info# = New(DRAGLISTINFO)
        locate 0,0
        l% =  LV_HitTest(Draglist&,%mousex,%mousey)
        L.SubItem$=GetText$(Draglist&,LVHTI#.Item&,LVHTI#.SubItem&)
        Info# = &slParam

        If Info#.uNotification& = &DL_BEGINDRAG'Drag&Drop beginnt und Item merken

            FirstItem& = LVHTI#.Item&
            print FirstItem&, " nach "
            'Marker zeichnen, muss nicht sein, aumento aber die Sichtbarkeit
            structInsertMark#.iItem& = -1
            SendMessage(Draglist&, &LVM_SETINSERTMARK, 0,structInsertMark#)
            MoveString$ = GetText$(Draglist&,LVHTI#.Item&,LVHTI#.SubItem&)'Item-Text merken
            Set("WinProc", 0)
            ~SetCursor(MoveCursor&)
            Return &DL_COPYCURSOR

        ElseIf Info#.uNotification& = &DL_DRAGGING'Drag&Drop ist im Gange

            LastItem& = LVHTI#.Item&
            locate 0,10
            Print LastItem&
            LvSelect  Draglist&,LastItem&
            'Marker neuzeichnen
            structInsertMark#.iItem& = LastItem&
            SendMessage(Draglist&, &LVM_SETINSERTMARK, 0,structInsertMark#)
            Set("WinProc", 0)
            'Item markieren
            SendMessage(DragList&,~Lb_SETCURSEL,LastItem&,0)
            ~SetCursor(MoveCursor&)

        ElseIf Info#.uNotification& = &DL_DROPPED'Drag&Drop ist beendet

            LastItem& = LVHTI#.Item&

            If Lastitem& <> -1

                'das erste gemerkte Item löschen
                DeleteString(DragList&,FirstItem&)
                'und an der Position des letzten gemerkten Items einfügen
                InsertString(DragList&,LastItem&,MoveString$)
                Set("WinProc", 0)
                LvSelect  Draglist&,LastItem&

            EndIf

        EndIf

    EndIf

EndProc

 
Gruss
Andreas
________ ________ ________ ________ _
Profan 3.3 - XProfanX2
Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit
ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher
Homepage :  [...] 
21.11.2010  
 




Thomas
Freier
Hallo Andreas.
Danke per die schnelle Reaktion. Leider bekomme ich keinen Merker zu sehen ???
 
Gruß Thomas
Windows XP SP2, XProfan X2
21.11.2010  
 




Andreas
Miethe


Hallo Thomas,

laut MS funktioniert das nur im Iconview,SmallIconview und Tileview, also nicht als Liste.
Das gilt scheinbar nicht mehr ab Vista, da funktioniert es auch mit Liste, daher habe ich nicht weiter probiert. Mit XP funktioniert es wohl nicht

Ich habe hier Vista auf dem Laptop und es geht bestens, man kann sogar die Farbe der Insertmark festlegen.

24 kB
Hochgeladen:21.11.2010
Downloadcounter263
Download
 
Gruss
Andreas
________ ________ ________ ________ _
Profan 3.3 - XProfanX2
Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit
ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher
Homepage :  [...] 
21.11.2010  
 



Bei mir unter XP sehe ich beim Code von Thomas (aber auch nur wenn ich per Interpreter ablaufen lasse) immerhin solch Pfeil während ich dragge:



der aber an dieser Position klebt bzw. sich nicht bewegt.

10 kB
Hochgeladen:21.11.2010
Downloadcounter242
Download
 
21.11.2010  
 




Dieter
Zornow
Mit Win 7 sehe ich auch keinen Pfeil
 
Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai., Win 7 32 bit und Win 7 64 bit, mit XProfan X2
21.11.2010  
 




Thomas
Freier
Ich werde auf den Merker verzichten und mal nach einer Möglichkeit suchen, dass wenn D&D eingeleitet wird die zu verschiebende Zeile andersfarbig darzustellen und nach Ende von D&D wieder aufheben.
Ist bei mir wie stochern im Nebel, da bisher nur mit der Listview.dll gearbeitet.
 
Gruß Thomas
Windows XP SP2, XProfan X2
21.11.2010  
 



Schau mal:  [...] 
 
21.11.2010  
 




Thomas
Freier
Hatte ich mir auch schon angesehen, wenn auch noch nicht abgearbeitet.
Werde, warum nicht gleich, ToolTip einsetzen, hilft ja auch, falls vergessen, welcher Text verschoben werden sollte.
 $H Windows.ph
 $H Messages.ph
 $H ListView.ph
 $H commctrl.ph
DEF $DRAGLISTMSGSTRING "commctrl_DragListMsg"
DEF &DL_BEGINDRAG 1157
DEF &DL_DRAGGING 1158
DEF &DL_DROPPED 1159
DEF &DL_MOVECURSOR 3
DEF &DL_COPYCURSOR 2
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Struct LVHitTestInfo = X&,Y&,flags&,Item&,SubItem&
Declare LVHTI#,l%,L.SubItem$,T_Tip&
Dim LVHTI#,LVHitTestInfo

Proc LV_HitTest

    Parameters  LV&,X%,Y%
    ~GetCursorPos(LVHTI#)
    ~ScreenToClient(LV&,LVHTI#)
    SendMessage(LV&,~LVM_SUBITEMHITTEST,0,LVHTI#)
    Return LVHTI#.SubItem&

EndProc

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

proc LvDeSelect'deselectieren

    parameters Lv&,Item&
    Declare s#
    dim s#,1024
    long s#,12=0
    long s#,16=~LVIS_SELECTED | ~LVIS_FOCUSED
    sendmessage(Lv&,~LVM_SETITEMSTATE,Item&,s#)
    dispose s#

endproc

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

proc LvSelect'selectieren

    parameters Lv&,Item&
    Declare s#
    dim s#,1024
    long s#,12=$2
    long s#,16=~LVIS_SELECTED | ~LVIS_FOCUSED
    sendmessage(Lv&,~LVM_SETITEMSTATE,Item&,s#)
    sendmessage(lv&,~LVM_SETHOTITEM ,item&,0)
    sendmessage(lv&,~LVM_ENSUREVISIBLE ,Item&,0)
    dispose s#

endproc

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Struct POINT = X&,Y&
Struct DRAGLISTINFO = uNotification&,hWnd&,ptCursor!POINT
Var FirstItem& = 0
Var LastItem& = 0
Var MoveString$ = ""
Var MoveCursor& = ~LoadCursor(~GetModuleHandle("shell32.dll"),1003)
'Genau diese spezielle Meldung muss registiert werden
'damit das Fenster die Drag&Drop Operationen verarbeiten kann.
Var DragMSG& = ~RegisterWindowMessage($DRAGLISTMSGSTRING)
CLS
SetDialogFont ~GetStockObject(~ANSI_VAR_FONT)
Var Ende& = 0
Var dlg& = @Create("ChildWindow", %hwnd, "Liste", 80, 60,300,300)
var  Text$ = "Name;0;140"
var  draglist& = Create("GridBox", dlg&, text$, 0, 80, 14, 100, 220)
'Die Listbox per Drag&Drop vobereiten
External("comctl32.dll","MakeDragList",Draglist&)
Addstring(Draglist&,"Eintrag")
Addstring(Draglist&,"Auftrag")
Addstring(Draglist&,"Anton")
Addstring(Draglist&,"Otto")
Addstring(Draglist&,"Werner")
Addstring(Draglist&,"Karl")
SubClass dlg&,1

WhileNot Ende&

    Waitinput

EndWhile

SubClass dlg&,0
end

SubClassProc

    If SubClassMessage(dlg&,DragMSG&)

        Var Info# = New(DRAGLISTINFO)
        locate 0,0
        l% =  LV_HitTest(Draglist&,%mousex,%mousey)
        L.SubItem$=GetText$(Draglist&,LVHTI#.Item&,LVHTI#.SubItem&)
        Info# = &slParam

        If Info#.uNotification& = &DL_BEGINDRAG'Drag&Drop beginnt und Item merken

            FirstItem& = LVHTI#.Item&
            print FirstItem&, " nach "
            MoveString$ = GetText$(Draglist&,LVHTI#.Item&,LVHTI#.SubItem&)'Item-Text merken
            T_Tip&=Create("Tooltip",%hwnd,Draglist&,MoveString$)
            Set("WinProc", 0)
            ~SetCursor(MoveCursor&)
            Return &DL_COPYCURSOR

        ElseIf Info#.uNotification& = &DL_DRAGGING'Drag&Drop ist im Gange

            LastItem& = LVHTI#.Item&
            locate 0,10
            Print LastItem&
            LvSelect  Draglist&,LastItem&
            Set("WinProc", 0)
            'Item markieren
            SendMessage(DragList&,~Lb_SETCURSEL,LastItem&,0)
            ~SetCursor(MoveCursor&)

        ElseIf Info#.uNotification& = &DL_DROPPED'Drag&Drop ist beendet

            LastItem& = LVHTI#.Item&

            If Lastitem& <> -1

                'das erste gemerkte Item löschen
                DeleteString(DragList&,FirstItem&)
                'und an der Position des letzten gemerkten Items einfügen
                InsertString(DragList&,LastItem&,MoveString$)
                Set("WinProc", 0)
                LvSelect  Draglist&,LastItem&
                DestroyWindow(T_Tip&)

            EndIf

        EndIf

    EndIf

EndProc

 
Gruß Thomas
Windows XP SP2, XProfan X2
21.11.2010  
 



Ich weiß nicht mehr in welchem Programm ich mal ListBox-Einträge mausverschiebbar gemacht habe aber dadurch das Io l' Eintrag sofort nach Erreichen der neuen Zeile verschoben habe war eine weitere Kennzeichnung irgendwie garnicht notwendig.

Könnte man zusätzlich ja auch noch ein > an den Zeilenanfang der zu verschiebenden Zeile setzen.
 
21.11.2010  
 



Answer


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

14.317 Views

Untitledvor 0 min.
Gast.0815 vor 7 Tagen
Walter11.12.2022
Georg Teles26.01.2019
H.Brill06.08.2018
Di più...

Themeninformationen



Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie