Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Dateien in den Zwischenspeicher verschieben / kopieren .. (https://www.delphipraxis.net/100387-dateien-den-zwischenspeicher-verschieben-kopieren.html)

Corpsman 27. Sep 2007 13:54


Dateien in den Zwischenspeicher verschieben / kopieren ..
 
Hallo leute,

ich hoffe mein Problem ist hier im Richtigen unterforum.

ich habe mir ein Programm gebastelt das mir dateien sucht und diese dann in einer Stringliste zurückgibt.

Ich habe also nun die Pfad und Dateinamen von x Dateien

Die will ich nun wahlweise in den Zwischenspeicher ausschneiden oder kopieren.

Damit meine ich das es so sein soll wie wenn ich im Explorer die mit STRG+X bzw STRG+C ausgeschnitten / kopiert hätte.

Weis jemand von euch wie das geht ?

Gruß Corpsman

s-off 27. Sep 2007 14:18

Re: Dateien in den Zwischenspeicher verschieben / kopieren .
 
Hallo,

bekommst Du den Inhalt der Stringliste irgendwo angezeigt? Zum Beispiel in einem Memo?

Soll der Text in die Zwischenablage kopiert werden, dann so:
Delphi-Quellcode:
uses Clipbrd;
Clipboard.AsText := TStringlist.Strings[i];
Wenn Du ausschneiden willst, müsstest Du den String hinterher halt aus der Stringliste löschen.

Reinhardtinho 27. Sep 2007 14:34

Re: Dateien in den Zwischenspeicher verschieben / kopieren .
 
Ich glaube er möchte die Dateien selbst kopieren bzw. ausschneiden.

[Edit]Hab grad was bei den Schweizern gefunden:Datei in Zwischenablage [/Edit]


MFG
Lorenz

s-off 27. Sep 2007 14:42

Re: Dateien in den Zwischenspeicher verschieben / kopieren .
 
Achso, na dann soll er es mal so probieren.

Edit: ok, zu spät :o)

Corpsman 27. Sep 2007 17:57

Re: Dateien in den Zwischenspeicher verschieben / kopieren .
 
Juhu es geht,


Weis auch jemand wie man Ausschneidet ?

Also die STRG + X Funktion die man aus dem Explorer her kennt ?

s-off 28. Sep 2007 06:39

Re: Dateien in den Zwischenspeicher verschieben / kopieren .
 
Vielleicht indem Du die Datei nach dem Einfügen am Ursprungsort löschst?

Dezipaitor 28. Sep 2007 10:40

Re: Dateien in den Zwischenspeicher verschieben / kopieren .
 
Zitat:

Zitat von s-off
Vielleicht indem Du die Datei nach dem Einfügen am Ursprungsort löschst?

Dann ist die Datei für immer gelöscht.

Matze 28. Sep 2007 12:08

Re: Dateien in den Zwischenspeicher verschieben / kopieren .
 
Zitat:

Zitat von Dezipaitor
Zitat:

Zitat von s-off
Vielleicht indem Du die Datei nach dem Einfügen am Ursprungsort löschst?

Dann ist die Datei für immer gelöscht.

So wie es s-off beschreibt, macht es Windows doch auch: Nach dem erfolgreichen Kopieren die Datei vom Ursprungsort löschen.
Da man zuvor eine Kopie angelegt hat, ist die Datei natürlich weiterhin verfügbar, sie wurde im Endeffekt nur verschoben.

Dezipaitor 28. Sep 2007 12:20

Re: Dateien in den Zwischenspeicher verschieben / kopieren .
 
Dann kann man die Dateien gleich selbst kopieren und braucht keine Zwischenablage zu ändern.

Corpsman will aber dem Explorer vorgauckeln, dass Copy oder Cut ausgewählt wurde. Der Explorer kopiert oder schneidet aus genau dann, wenn man im Explorer "Einfügen" (Past).

s-off 28. Sep 2007 12:25

Re: Dateien in den Zwischenspeicher verschieben / kopieren .
 
Zitat:

Zitat von Dezipaitor
Dann kann man die Dateien gleich selbst kopieren und braucht keine Zwischenablage zu ändern.

Corpsman will aber dem Explorer vorgauckeln, dass Copy oder Cut ausgewählt wurde. Der Explorer kopiert oder schneidet aus genau dann, wenn man im Explorer "Einfügen" (Past).

Was möchtest Du jetzt?
Der Explorer macht genau das, was ich beschrieben habe.

Selektiere ich eine Datei in Verzeichnis A und drücke STRG+C, so wird ein DataObject in die Zwischenablage gelegt.
Wechsle ich in Verzeichnis B und drücke dort STRG+V, so wird dieses DataObject aus der Zwischenablage(!) in dieses Verzeichnis eingefügt.

Selektiere ich eine Datei in Verzeichnis A und drücke STRG+X, so wird ein DataObject in die Zwischenablage gelegt.
Wechsle ich in Verzeichnis B und drücke dort STRG+V, so wird dieses DataObject aus der Zwischenablage(!) in dieses Verzeichnis eingefügt. Anschließend wird die Datei in Verzeichnis A gelöscht.

Verstehe Deinen Einwand nicht.

Zitat:

Zitat von Corpsman
[...] Die will ich nun wahlweise in den Zwischenspeicher ausschneiden oder kopieren.

Soviel zu dem, was er möchte.

Edit: nur, dass wir uns nicht misverstehen: DataObject ist nicht die Datei selber!

Dezipaitor 28. Sep 2007 12:45

Re: Dateien in den Zwischenspeicher verschieben / kopieren .
 
Nein du hast geschrieben:
Zitat:

Zitat von s-off
Vielleicht indem Du die Datei nach dem Einfügen am Ursprungsort löschst?

Das heißt doch, dass du willst, dass Corpsman mit Deletefile die Datei löscht, statt dass es der Explorer macht. Das funktioniert aber nicht, wenn man Ausscneiden will und dann im Explorer Strg+V drückt.

s-off 28. Sep 2007 13:09

Re: Dateien in den Zwischenspeicher verschieben / kopieren .
 
Was hast Du die ganze Zeit mit dem Explorer?
Er möchte das alles selber machen, mit seiner Anwendung, nicht mit dem Explorer.

Das mit dem Explorer war sein Beispiel, was zeigen sollte, wie es in seiner Anwendung funktionieren soll.

Nichts desto trotz schneide ich etwas aus, in dem ich es am Schluss irgendwo weglösche, nachdem ich es an anderer Stelle eingefügt habe. Und das meine ich mit
Zitat:

Vielleicht indem Du die Datei nach dem Einfügen am Ursprungsort löschst?

Dezipaitor 28. Sep 2007 13:21

Re: Dateien in den Zwischenspeicher verschieben / kopieren .
 
Nein, er wil, dass wenn man in seinem Programm ein paar Dateien auswählt, Strg+X oder Strg+C drückt und dann im Explorer "Einfügen" wählt, dass dann die Dateien bewegt oder kopiert werden.

s-off 28. Sep 2007 13:37

Re: Dateien in den Zwischenspeicher verschieben / kopieren .
 
Ja, und? Das funktioniert doch dann genau so.

Ich habe meine Anwendung. Dort markiere ich in meiner ListView, oder wo auch immer, eine Datei. Diese liegt im Filesystem in Verzeichnis A. Dann drücke ich STRG+X oder STRG+C. Ein DataObject wird in die Zwischenablage gelegt.
Dann wechsle ich in den Explorer und drücke STRG+V. Die hinter dem DataObject befindliche Datei wird in das Verzeichnis eingefügt.

Habe ich STRG+C gedrückt, so passiert nichts weiter. Die Datei liegt in Verzeichnis A und B, wurde also kopiert.
Habe ich STRG+X gedrückt, so löscht meine Anwendung die Ursprungsdatei. Somit habe ich aus A ausgeschnitten.

Ist das so schwer?

Dezipaitor 28. Sep 2007 13:54

Re: Dateien in den Zwischenspeicher verschieben / kopieren .
 
Zitat:

Zitat von s-off
...
Habe ich STRG+X gedrückt, so löscht meine Anwendung die Ursprungsdatei. Somit habe ich aus A ausgeschnitten.

Meinst du damit?
1.
Du drückst Strg+X in deiner Anwendung und kopierst die ausgewählten Dateien (also die Dateipfade) in die Zwischenablage, damit der Explorer weiß, was er kopieren soll, wenn man Strg+V drückt. Nachdem du die Dateinamen in die Zwischenablage kopiert hast, löscht du die Dateien. Resultat : Der Explorer kann die Dateien nicht mehr finden.

2.
Du drückst Strg+X in deiner Anwendung und kopierst den INHALT der ausgewählten Dateien in die Zwischenablage, damit der Explorer weiß, was er kopieren soll, wenn man Strg+V drückt. Nachdem du die Dateiinhalte in die Zwischenablage kopiert hast, löscht du die Dateien.
Ich bezweifle, dass der Explorer diese Dateien wiederherstellen kann, wenn man Strg+V drückt.
Zudem wird es sehr den Arbeitsspeicher belasten, wenn man viele und/oder große Dateien verschieben möchte.

3.
Du drückst also Strg+X in deiner Anwendung und kopierst die ausgewählten Dateien (also die Dateipfade) in die Zwischenablage, damit der Explorer weiß, was er kopieren soll, wenn man Strg+V drückt.
Okay, aber woher weißt du, das jemand Strg+V im Explorer gedrückt hat? Oder, dass jemand Strg+V in irgendeinem anderen Container gedrückt hat, der auch Dateien annehmen kann?
Solange du nicht Strg+V gedrückt hast, werden die Dateien weder kopiert noch verschoben.


Aber warum überhaupt Löschen? Der Explorer macht das doch alles. Wenn man Dateien selbst löschen müsste, dann wäre da noch das Problem, von tiefen Verzeichnissen, die man alle selbst rekursiv löschen müsste. Und dann die ganzen Probleme mit möglichen Fehlern. Nein, das wäre wirklich keine gute Idee, etwas neu zu erfinden, was der Explorer bereits mitbringt. Die Ausnahme bildet diejenigen, die es beruflich machen müssen.

s-off 28. Sep 2007 14:04

Re: Dateien in den Zwischenspeicher verschieben / kopieren .
 
Ok, da gebe ich Dir recht; da habe ich etwas zu vorschnell geantwortet.

Aber wie gesagt: ich bin die ganze Zeit davon ausgegangen, dass das Ganze ohne Explorer, sondern nur in der eigenen Anwendung passieren soll. Da würde alles genauso funktionieren, wie ich es gesagt habe, denn da weiss ich, wann ich eingefügt habe.

Wäre vlt ganz nett, wenn sich Corpsman mal äußern würde, was er wirklich möchte. Ansonsten drehen wir uns morgen noch im Kreis.

Dezipaitor 28. Sep 2007 14:18

Re: Dateien in den Zwischenspeicher verschieben / kopieren .
 
Ich wusste halt zufällig genau das was er machen will/wollte :D

s-off 28. Sep 2007 14:23

Re: Dateien in den Zwischenspeicher verschieben / kopieren .
 
Zitat:

Zitat von Dezipaitor
Ich wusste halt zufällig genau das was er machen will/wollte :D

Insider-Handel also - und mich dann auch noch so aufs Glatteis führen - Blödmann :zwinker:

Corpsman 29. Sep 2007 06:29

Re: Dateien in den Zwischenspeicher verschieben / kopieren .
 
Guten Morgen Jungs,

ist ja ne Heise Diskusion hier.

Ich werde auch mal versuchen zu beschreiben wie ich das genre möchte. Deci hat es im Prinzip zwar schon geschrieben, aber 3 fach hällt besser ;).

Also ich starte mein Programm, es listet mir Dateien auf. Ich Markiere die Tippe STRG+X und schliese mein Programm.

Dann geh ich auf irgendeinen Ordner / Desktop tippe STRG+V und die Dateien sollen Verschoben werden.

Genau der Gleiche Ablauf nur mit STRG+C funktioniert schon.

Und das ganze Mus gehen, denn wenn ich zum Beispiel meine Sharewareversion vom Total Comander starte und dort STRG+X tippe gehts auch.

Corpsman 1. Okt 2007 15:15

Re: Dateien in den Zwischenspeicher verschieben / kopieren .
 
*push*

himitsu 30. Okt 2007 09:28

Re: Dateien in den Zwischenspeicher verschieben / kopieren .
 
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 :zwinker:
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 :angel:

Corpsman 30. Okt 2007 12:27

Re: Dateien in den Zwischenspeicher verschieben / kopieren .
 
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

himitsu 30. Okt 2007 13:36

Re: Dateien in den Zwischenspeicher verschieben / kopieren .
 
klar mach ich das dann hier :angel:


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*

Corpsman 22. Jul 2008 12:32

Re: Dateien in den Zwischenspeicher verschieben / kopieren .
 
@himitsu

tut sich noch was ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:31 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