Autor Beitrag
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 01.08.02 15:51 
@kradon:
Dein Studienobjekt ist abgeschickt, kommt von der Adresse:
arthur_philip_dent_42@gmx.de

Ich arbeite mit Delphi 6 Enterprise. Ich programmiere seit ca. 8 Jahren mit Pausen. Angefangen mit TP, dann ziemlich lange mit Delphi 3 und seit zwei oder drei Monaten mit Delphi 6. Habe aber so gut wie ausschließlich mit VCL gearbeitet. Das war ein Fehler, den ich langsam ändern will...

MfG,
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
GPF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 85



BeitragVerfasst: Do 01.08.02 16:54 
Ok, ich werde dann mal einen Kommentarversuch starten. Eine Kopie schicke ich Dir auch per Email zu.
Zuerst aber kurz zu Deinen Fragen:
Ich programmiere aktiv seit knapp 12 Jahren. Damals noch mit Basic und Assembler auf meinem alten C64.
1995 habe ich dann zum ersten Mal Delphi erblickt.
Eine Schulversion von Delphi 1 lag bei einem Buchhändler für 199,- DM in den Regalen. Da dachte ich noch, es wäre ein Multimedia Autoren System :shock: . Naja, dummerweise hatte ich dann kurze Zeit später auch das Geld zusammen und bin hingedackelt um mir die kleine Box zu kaufen. Nach ersten Annäherungsversuchen war dann aber der eigentliche Zweck dieser CD gelüftet und nach ca. einem halben Jahr war ich bereits voll von Delphi überzeugt. Später erschien dann Delphi 2, welches ich mir dann auch umgehend gekauft habe. Meine Programmierarbeit habe ich dann aber lange Zeit unter Delphi 1 weitergeführt, da ich Win3.1 Kompatibilität für einen Job brauchte. Irgendwann als klar war, daß alle Win3.1 Rechner aufgegeben worden sind, bin ich auf Delphi 5 Enterprise umgestiegen und seitdem damit voll zufrieden. D6 habe ich mir zwar auch bereits angesehen (PE) - allerdings lohnt sich noch kein Update - die Änderungen sind zu marginal.

So, nun aber zu den Programmerklärungen:

Der Code selber ist eigentlich nicht schwer zu verstehen. Der wichtigen Hauptfunktion SHFileOperationA wird ein Record TSHFileOpStructA übergeben, welche Quelle, Ziel, Parameter enthalten - und natürlich auch, was gemacht werden soll (kopieren, löschen, bewegen, umbenennen). Das A hinter SHFileOPStructA und SHFileOperationA bedeutet lediglich, das ich Ansi Strings benutze. Das A kann auch weggelassen werden, dann werden ganz normale 8 bit Zeichen verwendet - oder benutze W, für WideStrings.

TSHFileOpStructA ist dabei wie folgt deklariert:

TSHFileOpStructA = _SHFILEOPSTRUCTA;
_SHFILEOPSTRUCTA = packed record
Wnd: HWND;
wFunc: UINT;
pFrom: PAnsiChar;
pTo: PAnsiChar;
fFlags: FILEOP_FLAGS;
fAnyOperationsAborted: BOOL;
hNameMappings: Pointer;
lpszProgressTitle: PAnsiChar; { only used if FOF_SIMPLEPROGRESS }
end;

Die Parameter müssen je nach Operation entsprechend gefüllt werden. Genaues liest Du besser dazu in der Windows SDK Hilfe unter SHFILEOPSTRUCT nach. Hier aber einige Hinweise:

wFunc benennt die auszuführende Funktion: FO_COPY, FO_MOVE (wie hier verwendet), FO_RENAME; FO_DELETE.
Von diesem Parameter hängen im Prinzip alle weiteren Eingaben ab.
Wnd bezeichnet das Fensterhandle, falls der Fortschrittsdialog von Windows bei den Operationen angezeigt werden soll. Soll dieser Dialog nicht Modal angezeigt werden - oder eben gar nicht, dann setze hier 0 ein.
PFrom bezeichnet die Quelle der Operationen. Hier können beliebig viele Dateien angegeben werden. Unter Windows müssen die Dateien durch #0 voneinander getrennt werden. Ich habe mir die Hilfsfunktion ConvertFile geschrieben, welche Semikolon durch #0 ersetzt. Eine Liste von Dateien wird durch #0#0 abgeschlossen. Dies übernimmt diese Hilfsprozedur ebenfalls. Damit erkennt Windows das Ende einer Liste.
Hierbei sind auch Verzeichnisse und Wildcards erlaubt.
pTo ist das Ziel. Beim Löschen kann dieser Parameter natürlich leer bleiben. Üblicherweise ist dieses ein einziger Pfad. Sollen mehrere Zieldateien angegeben werden, so muß FOF_MULTIDESTFILES als Flag mit übergeben werden. Außerdem muß für jede Quelldatei (bzw. Pfad) auch ein Zielpfad angeben werden. In einem solchen Fall gelten die selben Regeln wie bei dem Parameter pFrom (also #0, Wildcards, etc).
fFlags ist ebenfalls ein wichtiger Parameter. Hier werden einige zusätzliche Details angegeben. Hier eine kurze Übersicht aller erlaubten Parameter:
FOF_ALLOWUNDO: Undo Angaben mitspeichern - damit kann man z.B. Dateiobjekte in den Papierkorb verschieben
FOF_FILESONLY: Nur Dateien verwenden - keine Ordner
FOF_MULTIDESTFILES: siehe pTo
FOF_NOCONFIRMATION: Unterbindet sämtliche Abfragen und beantwortet diese mit "Immer" - wenn z.B. eine Zieldatei bereits existiert wird diese ohne Abfrage überschrieben
FOF_NOCONFIRMMKDIR: Verzeichnisse werden ohne Abfrage des Users angelegt
FOF_RENAMEONCOLLISION: Falls Zieldateien bereits existieren werden die Dateien umbenannt
FOF_SILENT: Unterbindet den Windows eigenen Fortschrittsdialog.
FOF_SIMPLEPROGRESS: Zeigt nur den Fortschrittsbalken an - aber keine Dateinamen
FOF_WANTMAPPINGHANDLE: Erstellt im Parameter hNameMappings ein Log aller Operationen mit Quell und Zieldatei. Ist dieser Parameter gesetzt, so muß hNameMapping vom Programmierer manuell wieder durch SHFreeNameMappings freigegeben werden.
fAnyOperationsAborted sollte selbsterklärend sein. Ist True falls eine Operation nicht erfolgreich durchgeführt worden ist. Berücksichtige, daß wenn Operationen nicht erfolgreich waren der Ursprungszustand NICHT wieder hergestellt wird!
lpszProgressTitle kannst Du setzen, wenn Du einen einfachen Fortschrittsbalken anzeigen lassen möchtest. Mit diesem Parameter kannst Du den Titel setzen. In diesem Fall muß allerdings FOF_SIMPLEPROGRESS gesetzt sein

Berücksichtige, daß Du nur PChars verwenden darfst, wenn Stringwerte angibst!

Das ist eine kurze Erklärung zu der Struktur TSHFileOPStructA.
Zu meinem Code:
Die Funktion ConvertFile ersetzt alle Semikolon durch #0 und gibt einen PChar zurück.

In der Verschiebeprozedur fülle ich einfach die Struktur mit den übergebenen und benötigten Verschiebe-Parametern. Ich habe mich entschieden, daß ich auch die Flags als Parameter der Hauptfunktion übergebe, da ich in meinen Programmen ab und zu einen Verschiebe-Dialog anzeigen lassen möchte.
Nicht benutze Werte setze ich auf nil (hNameMappings, lpszProgressTitle).
SHFileOperation ist selber auch eine Funktion und liefert 0 zurück wenn die Dateioperation erfolgreich ausgeführt worden ist.
Das ist eigentlich schon das gesamte Geheimnis.

Um nun Dateien zu kopieren mußt Du nur wFunc auf FO_COPY setzen - der Rest kann bleiben.
Möchtest Du Dateien Löschen, so setzte wFunc auf FO_DELETE und pTo auf nil. Natürlich solltest Du bei beidem mit den Flags spielen um das gewünschte Resultat zu erzielen.
kradon Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Fr 02.08.02 10:11 
Titel: Vielen Dank
So habe mir die Unterlagen gerade mal angeschaut
und werde sie nun durcharbeiten.

Damit wird sich dann warscheinlich meine Delphikenntnisse
verdoppel. :lol:

Gruß
Karsten