Cut, Copy und Paste für Dateien &Verzeich. (Soweit Gelöst)

Anfängerfragen zum Programmieren mit PureBasic.
Marty2PB
Beiträge: 16
Registriert: 14.03.2014 00:00

Cut, Copy und Paste für Dateien &Verzeich. (Soweit Gelöst)

Beitrag von Marty2PB »

Hallo,

Ich habe in meinen Programm ein Mauspopupmenü erstellt-. Ähnlich dem Explorer. Also Cut,Copy und Paste für Dateien .
Das hatte ich über ShellExecute gelöst. Das funktioniert auch aber nur mit einer Datei.

EDIT: Ich das nun für mich nun soweit gelöst das ich die Dateien aus dem ExplorerListGadget via selbstgebautes popupmenu
ausschneiden kann :)

Code: Alles auswählen

   Procedure.i ShellExec(lpFilePath$ = "",Verb$ = "",Paramter$ = "", Mask = #Null, ExShow.i = #SW_SHOWNORMAL)
        Protected Handle.l, iResult
        
        Define ShExec.SHELLEXECUTEINFO
        
        ShExec\cbSize = SizeOf(SHELLEXECUTEINFO)
         
        ShExec\fMask = Mask
        ShExec\hwnd = Handle
        ShExec\lpVerb = @Verb$
        ShExec\lpFile = @lpFilePath$
        ShExec\lpParameters = @Paramter$
        ;ShExec\lpParameters = @"-admin"
        ShExec\lpDirectory = #Null
        ShExec\nShow =  #SW_SHOWNORMAL
        ShExec\hInstApp = #Null

        iResult = ShellExecuteEx_(@ShExec.SHELLEXECUTEINFO) 
endprocdure

ShellExec(FullPath$+FullName$,"cut","",#SEE_MASK_INVOKEIDLIST,#Null)
Nun hatt ich den Code für Copy und Paste von ts-soft im anderen Forum Entdeckt

http://www.purebasic.fr/english/viewtop ... 12&t=55789

allerdings frage ich mich, da ich auch 'cut' haben will wie ich das verbaue.

Code: Alles auswählen

 Delphi
  ADropEffectFormat := RegisterClipboardFormat(CFSTR_PREFERREDDROPEFFECT); // CFSTR_PREFERREDDROPEFFECT   = 'Preferred DropEffect'
   hGlobal := GlobalAlloc(GMEM_SHARE Or GMEM_MOVEABLE Or GMEM_ZEROINIT, SizeOf(dword));
   ADropEffect := GlobalLock(hGlobal);
   ADropEffect^ := 2; // 2 if cut or 5 if copy
   SetClipboardData(ADropEffectFormat, hGlobal);
   GlobalUnlock(hGlobal);
   CloseClipboard       ;

Code: Alles auswählen

oder C++

HGLOBAL RenderPREFEREDDROPEFFECT (DWORD dwFlags)
{
	DWORD * pdwFlag;
	HGLOBAL hGlobal;
	hGlobal = GlobalAlloc(GHND|GMEM_SHARE, sizeof(DWORD));
	if(!hGlobal) return hGlobal;
        pdwFlag = (DWORD*)GlobalLock(hGlobal);
	*pdwFlag = dwFlags;
	GlobalUnlock(hGlobal);
	return hGlobal;
}


einbinde. Ich stehe seit tagen auf dem Schlauch damit. :( :(
Zuletzt geändert von Marty2PB am 07.06.2015 08:07, insgesamt 2-mal geändert.
Marty2PB
Beiträge: 16
Registriert: 14.03.2014 00:00

Re: Cut, Copy und Paste (Soweit Gelöst)

Beitrag von Marty2PB »

Habe es endlich gerafft bekommen /:->
Meine Lösung ausgehend von ts-soft source code http://www.purebasic.fr/english/viewtop ... 12&t=55789

Code: Alles auswählen


    ;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////    
    ; Put in Clipboard   
    Procedure.i SetClipBoard(Array sources.s(1),FlagEffect.i = #DROPEFFECT_COPY)
        Protected clipFile, hGlobal, *lpGlobal.DROPFILES, *mem, *pDropEffect 
        
              
        *mem = CreateMem(sources())
        If *mem
            If OpenClipboard_(0)
                EmptyClipboard_()
                hGlobal = GlobalAlloc_(#GHND, SizeOf(DROPFILES) + MemorySize(*mem))
                If hGlobal
                    *lpGlobal = GlobalLock_(hGlobal)
                    ZeroMemory_(*lpGlobal, SizeOf(DROPFILES))
                    *lpGlobal\pFiles = SizeOf(DROPFILES)
                    CompilerIf #PB_Compiler_Unicode
                        *lpGlobal\fWide = 1 ; Unicode
                    CompilerEndIf
                    *lpGlobal\fNC   = 0
                    *lpGlobal\pt\x  = 0
                    *lpGlobal\pt\y  = 0
                    CopyMemory_((*lpGlobal + SizeOf(DROPFILES)), *mem, MemorySize(*mem))
                    GlobalUnlock_(hGlobal)
                    
                    If SetClipboardData_(#CF_HDROP, hGlobal)
                        clipFile = #True
                    EndIf
                EndIf     
                
                ;
                ; Cut or Copy wird via FlagEffect geändert, Übergabe mit #DropEffect_Move oder #DropEffect_Copy 
                ;
                hGlobal = GlobalAlloc_(#GMEM_SHARE | #GMEM_MOVEABLE | #GMEM_ZEROINIT|#GMEM_DDESHARE, 4)
                If hGlobal
                    pDropEffect = GlobalLock_(hGlobal)         ;
                    *pDropEffect = PokeI(pDropEffect,FlagEffect)      ;
                    GlobalUnlock_(hGlobal)                      ;     
                    SetClipboardData_(RegisterClipboardFormat_(#CFSTR_PREFERREDDROPEFFECT), hGlobal);
                EndIf                                         
            EndIf
            CloseClipboard_()
        EndIf
        FreeMemory(*mem)
    ProcedureReturn clipFile
EndProcedure

Antworten