Gridbox Drag&Drop UND ändern der Zelleninhalte?

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Unsere Datenschutzerklärung wurde aktualisiert. Mit der Nutzung unseres Forums akzeptierst Du unsere Datenschutzerklärung. Du bestätigst zudem, dass Du mindestens 16 Jahre alt bist.

    • Gridbox Drag&Drop UND ändern der Zelleninhalte?

      Hallo zusammen

      Ich versuche gerade, mit den von mir gefundenen Beispielen, eine Gridbox mittels Drag & Drop zu füllen und den Zelleninhalt zu ändern.

      In der Proc MainLoop funktioniert GetMessage (Zeile 508) für Drag&Drop, aber dann geht das Ändern der Zelleninhalte nicht mehr.
      Sobald ich WaitInput (Zeile 509) verwende klappt's mit dem editieren der Zelleninhalte, aber dann funktioniert Drag&Drop nicht mehr.

      Wie kriege ich das hin, das ich beides machen kann?

      Zur Info: Ich bin ein totaler Laie in Programmierung. Vor allem Subclassing etc. ist bei mir Buch mit sieben Siegeln. Also nicht wundern wie ich den Quellcode zusammengebaut habe...

      Für interessierte, bitte das ganze ZIP-File in ein beliebiges Verzeichnis kopieren und ZDBCorrelations-034c.prf laden.
      Dann in Zeile 34 den Pfad anpassen, wo die ZDBCorrelations-034c.prf auf Eurem PC liegt.

      Beste Grüsse,
      André
      Dateien
    • Hallo,

      Einfachheitshalber habe ich nachfolgend noch den Quellcode aus der MMJ-Quellcodesammlung, auf dem das obige Projekt basiert.

      Quellcode

      1. Window 1000,800
      2. declare LV&,Spalte&,Zeile&,Item&,Edit&,Font&,Txt$
      3. declare rect#,cellpos_x%,cellpos_y%,cellwidth%,cellhight%
      4. Font&=Create("Font", "Verdana",16,0,0,0,0)
      5. SetDialogFont Font&
      6. LV&=Create("GridBox",%hwnd,"x;1;50;Spalte 1;1;60;Spalte 2;1;100;Spalte 3;1;80;Spalte 4;1;80;Spalte 5;1;80",0,10,10,460,250)
      7. Addstring(LV&,"0.5|0|0|0|0|0")
      8. Addstring(LV&,"2|1|0|0|0|0")
      9. Addstring(LV&,"1|2|0|0|0|0")
      10. Addstring(LV&,"2|3|0|0|0|0")
      11. Addstring(LV&,"0.5|4|0|0|0|0")
      12. SetFont LV&,Font&
      13. SubClass %hwnd, 1
      14. usermessages 2000
      15. AddHotKey 13, 13, 0
      16. AddHotKey 37, 37, 0
      17. AddHotKey 38, 38, 0
      18. AddHotKey 39, 39, 0
      19. AddHotKey 40, 40, 0
      20. while 1
      21. waitinput
      22. if (%umessage = 2000)
      23. Txt$ = GetText$(LV&,&uwparam,&ulparam)
      24. Spalte&= &ulparam
      25. Zeile&= &uwparam
      26. dim rect#,16
      27. SendMessage(LV&,$100E,Zeile&,rect#)'LVM_GETITEMRECT
      28. cellpos_x% = long(rect#,0)
      29. cellpos_y% = long(rect#,4) - 1
      30. cellwidth% = sendmessage(LV&,$101D,Spalte&,0)
      31. cellhight% = (long(rect#,12) - long(rect#,4)) + 1
      32. if Spalte& > 0
      33. whileloop 0,(Spalte& - 1),1
      34. cellpos_x% = cellpos_x% + sendmessage(LV&,$101D,&loop,0)
      35. EndWhile
      36. endif
      37. dispose rect#
      38. Edit& = create("Edit",LV&,Txt$,cellpos_x%,cellpos_y%,cellwidth%,cellhight%)
      39. setfont Edit&,Font&
      40. setfocus(Edit&)
      41. 'SendMessage(Edit&,"+({END})") 'Cursor ans Ende setzen...
      42. SendMessage(Edit&,$B1,0,-1)'oder Alles markieren...
      43. while getfocus(Edit&)
      44. waitinput
      45. if (%menuitem = 13)
      46. break
      47. elseif (%menuitem = 37) | (%menuitem = 38) | (%menuitem = 39) | (%menuitem = 40)
      48. case (%menuitem = 37) : SendMessage(%hwnd,2000,(Zeile&),(Spalte& - 1))
      49. case (%menuitem = 38) : SendMessage(%hwnd,2000,(Zeile& - 1),Spalte&)
      50. case (%menuitem = 39) : SendMessage(%hwnd,2000,(Zeile&),(Spalte& + 1))
      51. case (%menuitem = 40) : SendMessage(%hwnd,2000,(Zeile& + 1),Spalte&)
      52. break
      53. endif
      54. EndWhile
      55. settext LV&,Zeile&,Spalte&,gettext$(Edit&)
      56. destroywindow(Edit&)
      57. setfocus(%hwnd)
      58. endif
      59. EndWhile
      60. usermessages 0
      61. SubClass %hwnd, 0
      62. end
      63. SubClassProc
      64. if SubClassMessage(%hwnd, 78)'WM_NOTIFY
      65. if (Long(&sLParam,8) = -3)
      66. Item&=Long(&sLParam,12)
      67. if (Item& <> -1)
      68. SendMessage(%hwnd,2000,Item&,Long(&sLParam,16))
      69. endif
      70. endif
      71. endif
      72. endproc
      Alles anzeigen
      Wenn man nur diesen Drag & Drop fähig machen könnte, bei gleichzeitigem Erhalt der Bearbeitungsfunktionen im Grid?

      Ich habe da einige versucht, komme aber auf keinen grünen Zweig...

      Beste Grüsse,
      André
    • Wolltest du nicht die Listview.dll einsetzen, da wird dir die halbe Arbeit abgenommen.
      Egal, habe mal ein d&d Teil von mir und dein Edit-Teil kombiniert.
      Könnte sein, dass es dir weiter hilft (LV& ist jetzt Lb&).

      Gruß
      Thomas

      Brainfuck-Quellcode

      1. $H Windows.ph
      2. $H Messages.ph
      3. $H commctrl.ph
      4. usermessages 16
      5. Def GetSysColor(1) !"USER32","GetSysColor"
      6. Def WindowFromPoint(2)!"USER32","WindowFromPoint"
      7. Def GetCursorPos(1) !"USER32","GetCursorPos"
      8. Declare p#,h&
      9. Dim p#,8
      10. declare FORMATETC#:dim FORMATETC#,20
      11. long FORMATETC#,4=0,1,-1,1
      12. struct STGMEDIUM=tymed&,Value&,IUnknown&
      13. declare STGMEDIUM#:dim STGMEDIUM#,STGMEDIUM
      14. proc GetData'-------------------------------------------------GetData
      15. parameters IFace&
      16. var VTable&=long(IFace&,0)
      17. return call(long(VTable&,12),IFace&,FORMATETC#,STGMEDIUM#)
      18. endproc'-------------------------------------------------------------
      19. proc Dummy'-----------------------------------------------------Dummy
      20. return 0'--E_OK
      21. endproc'-------------------------------------------------------------
      22. proc Drop'-------------------------------------------------------Drop
      23. parameters This&,IDataObject&,KeyState&,X&,Y&
      24. long FORMATETC#,0=~CF_HDROP'----------------Format: DropFiles
      25. ifnot GetData(IDataObject&)
      26. var Mem&=~GlobalLock(STGMEDIUM#.Value&)
      27. INSERT stringw$(Mem&,20)
      28. ' print "Datei:",stringw$(Mem&,20)
      29. ~GlobalUnlock(STGMEDIUM#.Value&)
      30. ~GlobalFree(STGMEDIUM#.Value&)
      31. endif
      32. long FORMATETC#,0=~CF_TEXT'-----------------Format: Text
      33. ifnot GetData(IDataObject&)
      34. var Mem&=~GlobalLock(STGMEDIUM#.Value&)
      35. INSERT string$(Mem&,0)
      36. ~GlobalUnlock(STGMEDIUM#.Value&)
      37. ~GlobalFree(STGMEDIUM#.Value&)
      38. endif
      39. return 0'--E_OK
      40. endproc'-------------------------------------------------------------
      41. Proc INSERT
      42. Parameters Zeile$
      43. var a$=Chr$(13)+Chr$(10) 'Zeilenumbruch
      44. GetCursorPos(p#) ' Empfänger ist ?
      45. h&=WindowFromPoint(Long(p#,0),Long(p#,4))
      46. ~GetCursorPos(HIT#)
      47. ~ScreenToClient(Lb&,HIT#)
      48. sendmessage(Lb&,~LVM_HITTEST,0,HIT#)'---------------------Infos über Cursor in Bezug auf Lv
      49. sendmessage(Lb&,~LVM_SUBITEMHITTEST,0,HIT#)
      50. zielx&= HIT#.SubItem&
      51. ziely&= HIT#.Item&
      52. ' If h&=Lb&
      53. ' zeile$=Translate$(zeile$," ",";") 'Feldtrenner= Leerzeichen > werden ';'
      54. ' zeile$=Translate$(zeile$,",",";") 'Feldtrenner= Komma > werden ';'
      55. ' WhileLoop 100 'alle vielfachen ';' auf einen reduzieren
      56. ' zeile$=Translate$(zeile$,";;",";")
      57. ' EndWhile
      58. ' zeile$=Translate$(zeile$,";","|") ' ';' für Gridbox in '|'
      59. ' zeile$=Translate$(zeile$,a$," ") ' Zeilenumbruch entfernen
      60. ' If (len(Zeile$,"|") > 1) ' Anzahl der Felder > 1
      61. ' @InsertString(Lb&,0,Zeile$)
      62. ' Else
      63. If ziely&=-1
      64. @InsertString(Lb&,0,"|||")
      65. SetText Lb&,0, zielx&, trim$(zeile$)
      66. Else
      67. SetText Lb&,ziely&, zielx&, trim$(zeile$)
      68. EndIf
      69. ' EndI
      70. EndProc'-------------------------------------------------------------
      71. '=========================================================================
      72. window 670,250
      73. Cls GetSysColor(15)
      74. var Font&=Create("Font","MS Sans Serif",16,0,0,0,0)
      75. SETDIALOGFONT Font&
      76. var text$ = "PassNummer;3;150;Vorname;0;180;Nachname;0;180;eMail;0;100"
      77. var Lb& = Create("GridBox", %hwnd, Text$, 0, 10, 44, 640, 140)
      78. declare IDropTarget#,IDropTarget&
      79. dim IDropTarget#,32'-----------------------IDropTarget-Interface
      80. long IDropTarget#, 0=procaddr("Dummy",2)'--QueryInterface
      81. long IDropTarget#, 4=procaddr("Dummy",1)'--AddRef
      82. long IDropTarget#, 8=procaddr("Dummy",1)'--Release
      83. long IDropTarget#,12=procaddr("Dummy",5)'--DragEnter
      84. long IDropTarget#,16=procaddr("Dummy",5)'--DragOver
      85. long IDropTarget#,20=procaddr("Dummy",1)'--DragLeave
      86. long IDropTarget#,24=procaddr("Drop",5)'---Drop
      87. long IDropTarget#,28=IDropTarget#
      88. IDropTarget&=IDropTarget#+28
      89. external("ole32","OleInitialize",0)
      90. external("ole32","RegisterDragDrop",%hwnd,IDropTarget&)
      91. declare HIT#'------LVHITTESTINFO-Struktur
      92. struct HIT=x&,y&,Flags&,Item&,SubItem&
      93. dim Hit#,HIT
      94. declare ziely&,zielx&
      95. '##########################################################################
      96. declare Spalte&,Zeile&,Item&,Edit&,Txt$
      97. declare rect#,cellpos_x%,cellpos_y%,cellwidth%,cellhight%
      98. SubClass %hwnd, 1
      99. usermessages 2000
      100. AddHotKey 13, 13, 0
      101. AddHotKey 37, 37, 0
      102. AddHotKey 38, 38, 0
      103. AddHotKey 39, 39, 0
      104. AddHotKey 40, 40, 0
      105. '#########################################################################
      106. while 1
      107. waitinput
      108. case %umessage=16:break
      109. if (%umessage = 2000)
      110. Txt$ = GetText$(Lb&,&uwparam,&ulparam)
      111. Spalte&= &ulparam
      112. Zeile&= &uwparam
      113. dim rect#,16
      114. SendMessage(Lb&,$100E,Zeile&,rect#)'LVM_GETITEMRECT
      115. cellpos_x% = long(rect#,0)
      116. cellpos_y% = long(rect#,4) - 1
      117. cellwidth% = sendmessage(Lb&,$101D,Spalte&,0)
      118. cellhight% = (long(rect#,12) - long(rect#,4)) + 1
      119. if Spalte& > 0
      120. whileloop 0,(Spalte& - 1),1
      121. cellpos_x% = cellpos_x% + sendmessage(Lb&,$101D,&loop,0)
      122. EndWhile
      123. endif
      124. dispose rect#
      125. Edit& = create("Edit",Lb&,Txt$,cellpos_x%,cellpos_y%,cellwidth%,cellhight%)
      126. ' setfont Edit&,Font&
      127. setfocus(Edit&)
      128. 'SendMessage(Edit&,"+({END})") 'Cursor ans Ende setzen...
      129. SendMessage(Edit&,$B1,0,-1)'oder Alles markieren...
      130. while getfocus(Edit&)
      131. waitinput
      132. if (%menuitem = 13)
      133. break
      134. elseif (%menuitem = 37) | (%menuitem = 38) | (%menuitem = 39) | (%menuitem = 40)
      135. case (%menuitem = 37) : SendMessage(%hwnd,2000,(Zeile&),(Spalte& - 1))
      136. case (%menuitem = 38) : SendMessage(%hwnd,2000,(Zeile& - 1),Spalte&)
      137. case (%menuitem = 39) : SendMessage(%hwnd,2000,(Zeile&),(Spalte& + 1))
      138. case (%menuitem = 40) : SendMessage(%hwnd,2000,(Zeile& + 1),Spalte&)
      139. break
      140. endif
      141. EndWhile
      142. settext Lb&,Zeile&,Spalte&,gettext$(Edit&)
      143. destroywindow(Edit&)
      144. setfocus(%hwnd)
      145. endif
      146. endwhile
      147. external("ole32","RevokeDragDrop",%hwnd)
      148. external("ole32","OleUninitialize")
      149. dispose IDropTarget#,FORMATETC#,STGMEDIUM#,p#,hit#
      150. DeleteObject font&
      151. usermessages 0
      152. SubClass %hwnd, 0
      153. End
      154. SubClassProc
      155. if SubClassMessage(%hwnd, 78)'WM_NOTIFY
      156. if (Long(&sLParam,8) = -3)
      157. Item&=Long(&sLParam,12)
      158. if (Item& <> -1)
      159. SendMessage(%hwnd,2000,Item&,Long(&sLParam,16))
      160. endif
      161. endif
      162. endif
      163. endproc
      Alles anzeigen