AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Dateien in den Zwischenspeicher verschieben / kopieren ..
Thema durchsuchen
Ansicht
Themen-Optionen

Dateien in den Zwischenspeicher verschieben / kopieren ..

Ein Thema von Corpsman · begonnen am 27. Sep 2007 · letzter Beitrag vom 22. Jul 2008
Antwort Antwort
Seite 3 von 3     123   
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.183 Beiträge
 
Delphi 12 Athens
 
#21

Re: Dateien in den Zwischenspeicher verschieben / kopieren .

  Alt 30. Okt 2007, 09:28
dieses Kopieren, Ausschneiden/Verschieben läuft insesammt über 4 Formate im Zwischenspeicher ab.

und die verschiednen Funktionen bekommst du über eine Kombination dieser und das setzten der bestimmter werte darin.

zum Setzen der Speicherblöck diese mit GlobalAlloc(GMEM_MOVEABLE+GMEM_DDESHARE) reservieren befüllen und am Ende mit Clipboard.SetAsHandle oder der WinAPI SetClipboardData an die Zwischenablage übergeben.

die releanten Formate wären:
CF_UNICODETEXT, CF_TEXT, CF_HDROP und CFSTR_PREFERREDDROPEFFECT
(CFSTR_PREFERREDDROPEFFECT ist noch nicht registriert, also vorher noch ein RegisterClipboardFormat)


nun zu den Formaten:

CF_TEXT enthält die Dateiliste im ANSI-Format
Dateien inclusiver erweiterter Pfadangaben per #13#10 oder #10 getennt und Liste mit #0 abgeschlossen

CF_UNICODETEXT enthält das Selbe, nur in Unicode

CF_HDROP enthält das ganze in dem für's Drag&Drop verwendeten Format (also auch nur ANSI),
also der Struktur TDropFiles gefollgt von der Dateiliste
Dateien inclusiver erweiterter Pfadangaben per #0 getennt und Liste mit einem Leereintrag (also #0#0) abgeschlossen

so, theoretisch könnten jetzt alle Programme (z.B. der Explorer beim Einfügen=Strg+V) aus einer oder mehrere (wobei sich das Programm bei einer Auswahl das für sich Beste Format raussucht, welches eigentlich CF_TEXT in Verbindung mit den kurzen 8.3-Dateinanem, oder CF_UNICODETEXT ist)

CFSTR_PREFERREDDROPEFFECT ist im Grunde nu ein 4-Byte-Integer, welcher die Art des Vorgangs deiniert
die 3 Flags / 4 Werte wären:
DROPEFFECT_NONE = 0
DROPEFFECT_COPY = 1
DROPEFFECT_MOVE = 2
DROPEFFECT_LINK = 4
für's Verschieben würde ich es mal in Verbindung mit DROPEFFECT_MOVE versuchen
und wenn dieser Typ nicht angegeben ist, dann wird als Standardwert DROPEFFECT_COPY+DROPEFFECT_LINK verwendet, was dem einfachen Kopieren entspricht


und nein, ich hab grad keinen Code zu Hand ... nja, abgesehn von einem etwas Aufwendigem aus meinem SearchSameFiles (welcher halt speziell auf das Speichermanagement im Programm zugeschitten ist)
Delphi-Quellcode:
  Procedure TForm1.CopyFilenames1Click(Sender: TObject);
    Procedure IncL(Var L, Le: Integer; VTRec: PVTRec);
      Var i, i2: Integer;

      Begin
        i := FileList2[VTRec^.Index].Files[VTRec^.FileIndex].Directory;
        While i >= 0 {i > dpIsRootDir} do Begin
          i2 := Length(Directories[i].DirName);
          Inc(L, i2);
          Inc(Le, i2);
          i := Directories[i].Parent;
        End;
        i2 := Length(FileList2[VTRec^.Index].Files[VTRec^.FileIndex].FileName);
        Inc(L, i2 + 2);
        Inc(Le, i2 + 1);
      End;

    Procedure AddP(Var PW, PE: PWideChar; Var PA: PAnsiChar; VTRec: PVTRec);
      Var i, i2: Integer;
        X: Array[0..255] of Integer;
        W: PWideChar;
        S: String;

      Begin
        i2 := 0;
        i := FileList2[VTRec^.Index].Files[VTRec^.FileIndex].Directory;
        While i >= 0 {i > dpIsRootDir} do Begin
          X[i2] := i; Inc(i2);
          i := Directories[i].Parent;
        End;
        While i2 > 0 do Begin
          Dec(i2);
          i := Length(Directories[X[i2]].DirName);
          W := PWideChar(Directories[X[i2]].DirName);
          S := W;
          If PW <> nil Then Begin MoveMemory(PW, W, i * 2); Inc(PW, i); End;
          If PE <> nil Then Begin MoveMemory(PE, W, i * 2); Inc(PE, i); End;
          If PA <> nil Then Begin MoveMemory(PA, Pointer(S), i); Inc(PA, i); End;
        End;
        i := Length(FileList2[VTRec^.Index].Files[VTRec^.FileIndex].FileName);
        W := PWideChar(FileList2[VTRec^.Index].Files[VTRec^.FileIndex].FileName);
        S := W;
        If PW <> nil Then Begin MoveMemory(PW, W, i * 2); Inc(PW, i); PW^ := #13; Inc(PW); PW^ := #10; Inc(PW); End;
        If PE <> nil Then Begin MoveMemory(PE, W, i * 2); Inc(PE, i); PE^ := #0; Inc(PE); End;
        If PA <> nil Then Begin MoveMemory(PA, Pointer(S), i); Inc(PA, i); PA^ := #13; Inc(PA); PA^ := #10; Inc(PA); End;
      End;

    Var L, Le: Integer;
      Node, Child: PVirtualNode;
      PW, PE1: PWideChar;
      PE2: PInteger;
      PA: PAnsiChar;

    Begin
      EnableControls(ecProcessX);
      L := 0;
      Le := 0;
      Node := VirtualStringTree1.GetFirst;
      While Node <> nil do
        If vsSelected in Node^.States Then Begin
          If Node^.Parent = VirtualStringTree1.RootNode Then Begin
            Child := Node^.FirstChild;
            While Child <> nil do Begin
              IncL(L, Le, PVTRec(VirtualStringTree1.GetNodeData(Child)));
              Child := Child^.NextSibling;
            End;
            Node := Node^.NextSibling;
          End Else Begin
            IncL(L, Le, PVTRec(VirtualStringTree1.GetNodeData(Node)));
            Node := VirtualStringTree1.GetNext(Node);
          End;
          Inc(L, 2);
        End Else Node := VirtualStringTree1.GetNext(Node);
      Inc(L);
      Inc(Le);

      If (Le <= 2) or not OpenClipboard(Handle) Then Exit;
      EmptyClipboard;
      //GlobalFree(ClipboardA);
      GlobalFree(ClipboardE2);
      //GlobalFree(ClipboardE1);
      //GlobalFree(ClipboardW);
      ClipboardW := GlobalAlloc(GMEM_MOVEABLE + GMEM_DDESHARE, L * 2);
      ClipboardE1 := GlobalAlloc(GMEM_MOVEABLE + GMEM_DDESHARE, SizeOf(TDropFiles) + Le * 2);
      ClipboardE2 := GlobalAlloc(GMEM_MOVEABLE + GMEM_DDESHARE, 4);
      ClipboardA := GlobalAlloc(GMEM_MOVEABLE + GMEM_DDESHARE, L);
      PW := GlobalLock(ClipboardW);
      PE1 := GlobalLock(ClipboardE1);
      PE2 := GlobalLock(ClipboardE2);
      PA := GlobalLock(ClipboardA);

      If PE2 <> nil Then PInteger(PE2)^ := DROPEFFECT_COPY or DROPEFFECT_LINK;
      If PE1 <> nil Then Begin
        ZeroMemory(PE1, SizeOf(TDropFiles));
        PDropFiles(PE1)^.pFiles := SizeOf(TDropFiles);
        PDropFiles(PE1)^.fWide := True;
        Inc(Integer(PE1), SizeOf(TDropFiles));
      End;

      Node := VirtualStringTree1.GetFirst;
      While Node <> nil do
        If vsSelected in Node^.States Then Begin
          If Node^.Parent = VirtualStringTree1.RootNode Then Begin
            Child := Node^.FirstChild;
            While Child <> nil do Begin
              AddP(PW, PE1, PA, PVTRec(VirtualStringTree1.GetNodeData(Child)));
              Child := Child^.NextSibling;
            End;
            Node := Node^.NextSibling;
          End Else Begin
            AddP(PW, PE1, PA, PVTRec(VirtualStringTree1.GetNodeData(Node)));
            Node := VirtualStringTree1.GetNext(Node);
          End;
          If PW <> nil Then Begin PW^ := #13; Inc(PW); PW^ := #10; Inc(PW); End;
          If PA <> nil Then Begin PA^ := #13; Inc(PA); PA^ := #10; Inc(PA); End;
        End Else Node := VirtualStringTree1.GetNext(Node);
      If PW <> nil Then PW^ := #0;
      If PA <> nil Then PA^ := #0;
      If PE1 <> nil Then PE1^ := #0;

      GlobalUnlock(ClipboardA);
      GlobalUnlock(ClipboardE2);
      GlobalUnlock(ClipboardE1);
      GlobalUnlock(ClipboardW);
      If PW <> nil Then SetClipboardData(CF_UNICODETEXT, ClipboardW);
      If PA <> nil Then SetClipboardData(CF_TEXT, ClipboardA);
      If PE1 <> nil Then SetClipboardData(CF_HDROP, ClipboardE1);
      If PE2 <> nil Then SetClipboardData(RegisterClipboardFormat(CFSTR_PREFERREDDROPEFFECT), ClipboardE2);
      CloseClipboard;
      EnableControls(ecAll);
    End;
aber wenn ich die nächsten Wochen mal Zeit hab, dann kann ich ja mal versuchen das Ganze in 'ne "einfache" Funktion umzuwandeln, so ala schweizer CopyFilesToClipboard
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#22

Re: Dateien in den Zwischenspeicher verschieben / kopieren .

  Alt 30. Okt 2007, 12:27
hi himitsu,

Also erst mal thx das du dich der Sache annimst.

Solche Antworten zeigen mir immer wieder wie überhaupt gar nichts ich von Delphi weis.

Oder verstehe ich einfach nur nichts von Windowsprogrammierung ???

Na Egal wie.

Ich freue mich auf jedenfall schon auf deine version für die Schweizer, die du hoffentlich auch hier postest

Gruß

Corpsman
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.183 Beiträge
 
Delphi 12 Athens
 
#23

Re: Dateien in den Zwischenspeicher verschieben / kopieren .

  Alt 30. Okt 2007, 13:36
klar mach ich das dann hier


hab mir nur mal aktuell "kurz" wieder etwas Zeit für die DP genommen
muß jetzt nur noch ein paar Seiten durchgehn (nich daß noch irgendwo was "Wichtiges" vergessen wird)
ansonsten bin ich drzeit eigentlich mit einem größerem Delphiprojekt beschäfftigt (bekomm das aber ohne die DP hin)
und dann noch PHP ... mine Webseite muß endlich mal fertig werden (ich will es jedenfalls endlich) und dann noch vielleicht zwei weitere (aber zum glück ganz klein)
joar und eigentlich muß ich ganz dringend mit Japanisch weitermachen .. mein Lehrerin is schon etwas böse auf mich *duck*
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#24

Re: Dateien in den Zwischenspeicher verschieben / kopieren .

  Alt 22. Jul 2008, 12:32
@himitsu

tut sich noch was ?
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz