Xbase++ Callback Slot

Nutzung, Komponenten, .NET

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Xbase++ Callback Slot

Beitrag von AUGE_OHR »

hi,

alle XbParts, welche XbpWindow() als Superclass haben, besitzen die

Code: Alles auswählen

:dragDrop := {| aState, oDragData, self | ... } --> nAction
:dragEnter := {| aState, oDragData, self | ... } --> nAction
:dragMotion := {| aState, uNIL, self | ... } --> nAction 
:dragLeave := {| uNIL1, uNIL1, self | ... } --> self 
Callback Slots

nun habe ich bei M$ MsComCtl.OCX aber OLE Methoden wie

Code: Alles auswählen

METHOD XbpListView:_OLECompleteDrag(nEffect)
METHOD XbpListView:_OLEDragDrop(oData,nEffect,nButton,nShift,nx,ny)
METHOD XbpListView:_OLEDragOver(oData,nEffect,nButton,nShift,nx,ny,nState )
METHOD XbpListView:_OLEStartDrag(oData, nEffect)
wie richte ich nun, analog zu XbParts "Standard", meine DLL/LIB um damit ich die mit Xbase++ wie "gewohnt" nutzen kann ?

:dragDrop ist doch eine Property welche ich mit einem Codeblock auffülle.

Code: Alles auswählen

   VAR dragDrop                         // Xbase++
   VAR x_dragDrop                       // Gets or sets the text associated with this control.
   ASSIGN METHOD _dragDrop()            VAR x_dragDrop

METHOD HX_XXXXX:Create()
   //
   // after create ?!
   //
   // ASSIGN METHOD "transfer" data
   //
   ::x_dragDrop   := ::dragDrop
damit hätte ich nun die "Zuweisung" des Codeblock, aber "wann" und "wie" EVAL(bCodeblock) ich ihn ?

auch gibt Xbase++ ja einen Event zurück für die Aktion z.b. xbeP_DragDrop
müsste ich das EVAL() mit einem PostAppEvent(Userdef) einleiten ?
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Xbase++ Callback Slot

Beitrag von AUGE_OHR »

hm ...

AutomationObject() hat doch die Subclass
ActiveXObject()
DragDataObject()

XbpActiveXControl() hat die Subclass
ActiveXObject()
XbpWindow()

und damit doch den :dragDrop := {| aState, oDragData, self | ... } Slot, oder ?

Code: Alles auswählen

CLASS XbpListView FROM XbpActiveXControl
   EXPORTED:
     METHOD init
     METHOD create
...
ENDCLASS

METHOD XbpListView:init()
   ::XbpActiveXControl:Init( oParent, oOwner, aPos, aSize, aPP, lVisible )

*  ::CLSID   := "{BDD1F04B-858B-11D1-B16A-00C0F0283628}"
   ::CLSID   := "MSComctlLib.ListViewCtrl.2"
   ::License := "9368265E-85FE-11d1-8BE3-0000F8754DA1"

  ::DropZone  := .T.
  ::DragEnter := {| aState,oData | ::HandleDragEnter(aState,oData)}
  ::DragLeave := {| aState,uNIL  | ::HandleDragLeave(aState,)}
  ::DragDrop  := {| aState,oData | ::HandleDragDrop(aState,oData)}
...
METHOD XbpListView:HandleDragDrop(aState,oData)
LOCAL aFiles  := oData:GetData(XBPCLPBRD_FILELIST)
leider bekomme ich für oData ein Automation Object (iVbDataObject) und kein Xbase++ DragDataObject :(

Frage : wie bekomme ich ein DragDataObject() ?
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Xbase++ Callback Slot

Beitrag von AUGE_OHR »

ok ich hab es raus bekommen. "normal" fängt man mit Xbase++ ja so an

Code: Alles auswählen

METHOD TvDDDialog:HandleDragDrop(aState,oData)
LOCAL aFiles  := oData:GetData(XBPCLPBRD_FILELIST)
LOCAL iMax    := LEN(aFiles)
und da bekomme ich mit dem activeX einen Fehler bei :GetData(XBPCLPBRD_FILELIST) den ich habe im Clipboard ein iVbDataObject.

Ich muss also das iVbDataObject "auflösen"

Code: Alles auswählen

METHOD TvDDDialog:LWDragDrop( aState, oDragData )
LOCAL aFiles   := {}
...
   DO CASE
      CASE oDragData:GetFormat( ccCFText     )  
      CASE oDragData:GetFormat( ccCFBitmap   ) 
      CASE oDragData:GetFormat( ccCFMetafile ) 
      CASE oDragData:GetFormat( ccCFDIB      )  
      CASE oDragData:GetFormat( ccCFPalette  ) 
      CASE oDragData:GetFormat( ccCFEMetafile)
      CASE oDragData:GetFormat( ccCFRTF      ) 
      CASE oDragData:GetFormat( ccCFFiles    )
         oFiles := oDragData:Files
         iMax   := oFiles:Count
         FOR i:= 1 TO iMax
            AADD(aFiles, oFiles:Item(i) )
         NEXT
   ENDCASE
   iMax    := LEN(aFiles)
   IF iMax = 0
      RETURN XBP_DROPMODE_NONE
   ENDIF
   // hier dann die Aktion was bei drop passieren soll
   FOR i := 1 TO iMax
soweit so gut ...

Ich möchte aus dem M$ Listview ja eine "allgemeine" DLL/LIB machen aber nun frage ich mich wie ich das :GetData(XBPCLPBRD_FILELIST) in die neue Routine "#xtranslate" ?

Ich möchte z.b. eine Xbplistbox() gegen mein XbpListView() "austauschen" können ohne das ich meine DragDrop Routinen etc. "umschreiben" muss.

Ideen und Vorschläge erwünscht
gruss by OHR
Jimmy
Antworten