Autor Beitrag
teamrocket0
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 172
Erhaltene Danke: 1

Win ME, Win XP, Win 7, Win 10
Delphi 7, 10.2 Tokyo
BeitragVerfasst: Mi 26.12.18 02:17 
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:
ausblenden 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:
ausblenden Delphi-Quelltext
1:
Folder: Funktionen\					



Unter Delphi 10.2 funktioniert das so aber NICHT...WARUM.... :bawling:

Delphi 10.2 Tokyo:
ausblenden 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:
ausblenden Delphi-Quelltext
1:
Folder: Funktionen					


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

_________________
To be forgotten is worse than death!
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1321
Erhaltene Danke: 117

Win 10
RIO, CE, Lazarus
BeitragVerfasst: 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.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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
ausblenden 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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
  Filename: PChar;
  len: Integer;
begin
  len := DragQueryFile(Message.Drop, 0NIL0);
  Filename := StrAlloc(len+2);
  DragQueryFile(Message.Drop, 0, filename, len+2);
  // +2 wegen Widestring/Unicode mit Doppelnull am Ende.


Edit: Du kannst aber auch mit
ausblenden 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.

_________________
We are, we were and will not be.

Für diesen Beitrag haben gedankt: teamrocket0
teamrocket0 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 172
Erhaltene Danke: 1

Win ME, Win XP, Win 7, Win 10
Delphi 7, 10.2 Tokyo
BeitragVerfasst: 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

_________________
To be forgotten is worse than death!