Entwickler-Ecke
Dateizugriff - ExtractFileName + ' String'
teamrocket0 - Mi 26.12.18 02:17
Titel: ExtractFileName + ' String'
Nur ganz kurz.
Ich möchte gerne hinter einer String-Variable die über Drag & Drop gefüllt wird einen weiteren String anfügen.
Es geht hier nur um einen kleinen Backslash.
Unter Delphi 7 funktioniert das so.
Delphi 7:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.OnFileDrop1FileDrop(filename: String); begin if DirectoryExists(filename)then begin Form1.Memo1.Lines.Add('Folder: ' + extractfilename(filename) + '\'); end else begin Form1.Memo1.Lines.Add('Path: ' + extractfilepath(fileName)); Form1.Memo1.Lines.Add('File: ' + extractfilename(filename)); end; end; |
Ergebnis im Memo-Feld:
Unter Delphi 10.2 funktioniert das so aber NICHT...WARUM.... :bawling:
Delphi 10.2 Tokyo:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm1.DragDrop(var Message: TWmDropFiles); var Filename: String; begin SetLength(Filename,2000); DragQueryFile(Message.Drop,0,Pchar(Filename),2000); if directoryexists(Filename)= true then begin Form1.Memo1.Lines.Add('Folder: ' + ExtractFileName(Filename) + '\'); end else begin Form1.Memo1.Lines.Add('Path: ' + ExtractFilePath(Filename)); Form1.Memo1.Lines.Add('File: ' + ExtractFileName(Filename)); end; end; |
Ergebniss im Memo-Feld:
Es ist egal, was für einen String ich anfügen möchte. Alles nach der Variable wird nicht mehr in die Memo-Zeile eingefügt.
Wenn an der Stelle von "Filename" eine andere "Random-String-Variable" steht, funktioniert das mit dem '\' hinzufügen.
Wird "Filename" in eine andere "Random-String-Variable" kopiert (Random:=Filename;) funktioniert es wiederum nicht mit dem '\' hinzufügen.
Wenn jemand eine Antwort darauf parat hat, würde ich mich über eine kurze Antwort freuen.
Mit besten Grüßen
teamrocket0
Sinspin - Mi 26.12.18 05:25
Hallo,
es gibt eine Funktion mit der man den Pfadtrenner an einen String anhängen kann : IncludeTrailingPathDelimiter.
Ich vermute mal, dass es daran liegt das du von PChar kommst und da irgendwie am Ende die Null hinten dran hängen bleibt.
Kannst ja via StringReplace mal versuchen die gefundene Null-Zeichen zu entfernen.
Gausi - Mi 26.12.18 10:07
Du mischst hier PChar und String auf unzulässige Art und Weise. ;-)
Zuerst setzt du die Länge eines Strings auf 2000, schreibst dann was rein und fügst am Ende was hinzu. D.h. dein String sieht dann wahrscheinlich so aus
Quelltext
1:
| c:\meinOrdner\meinsubdir\file.txt...............................................................\ |
Wobei die ganzen (fast 2000) "." möglicherweise Datenmüll oder Nullbytes sind (weiß nicht, wie da initialisiert wird). DirectoryExists castet dann wieder zurück auf PChar, und findet das Verzeichnis. Delphis String-Konkatenation nimmt aber wohl den ganzen String bis zum Ende ;-)
Richtig wäre:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| var Filename: PChar; len: Integer; begin len := DragQueryFile(Message.Drop, 0, NIL, 0); Filename := StrAlloc(len+2); DragQueryFile(Message.Drop, 0, filename, len+2); |
Edit: Du kannst aber auch mit
Delphi-Quelltext
1:
| if (FileGetAttr(Filename) AND faDirectory = faDirectory) then |
überprüfen, ob das File ein Verzeichnis ist. Das sollte sauberer sein als der Test auf DirectoryExists.
teamrocket0 - Mi 26.12.18 11:26
Und wiedereinmal war es Gausi, der mir geholfen hat. Ich frage mich nur, was er in seiner Freizeit macht...^^
Besten Dank.
teamrocket0
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!