![]() |
Hereinziehen von Ordnern>DirectoryExists gibt False zurüc
Hi,
wenn ich einen Ordner in mein Programm ziehen möchte, gibt DirectoryExists grundsätzlich False zurück. Die Variable "Dateiname" enthält immer ein Zeichen. Könnte es daran liegen, wenn nicht, wo dann ?
Delphi-Quellcode:
procedure TfrmMain.WMDROPFILES(var Msg: TMessage);
var found : TStrings; i : Integer; j : Integer; anzahl : Integer; size : Integer; Dateiname : PChar; function IsFile(filename : String) : Boolean; begin Result := FileExists(Filename); end; function IsDirectory(dir : String) : Boolean; begin Result := DirectoryExists(Dir+'\'); end; function IsVolume(const name : WideString) : Boolean; var VolName : WideString; DType : Cardinal; begin if (Name = '') then begin Result := False; Exit; end; if Name[Length(Name)] <> PathDelim then VolName := Name + PathDelim else VolName := Name; DType := GetDriveTypeW(PWideChar(Name)); Result := DType <> DRIVE_NO_ROOT_DIR; end; begin inherited; anzahl := DragQueryFile(Msg.WParam, $FFFFFFFF, Dateiname, 255); for i := 0 to (anzahl - 1) do begin size := DragQueryFile(Msg.WParam, i , nil, 0) + 1; Dateiname := StrAlloc(size); if IsDirectory(Dateiname) then begin ST := TSearchTool.Create; with ST do begin ST.SetFilter('*.*'); if frmOp.Rek then ST.Recurse := True else ST.Recurse := False; MHandle := Handle; MCurrentDir := mkNoneMessage; if ST.IsSearching then begin ST.Break; end else begin LastAdded := 0; ST.SearchFiles(Dateiname); for j := 0 to found.Count - 1 do DragQueryFile(Msg.WParam, i , PChar(found[j]), size); found.Free; end; Free; end; end else if IsVolume(Dateiname) then begin MsgBox('Volumes are not supported.') end else if IsFile(Dateiname) then begin DragQueryFile(Msg.WParam,i , Dateiname, size); end; AddSingleFile(StrPas(Dateiname)); StrDispose(Dateiname); end; DragFinish(Msg.WParam); end; |
Re: Hereinziehen von Ordnern>DirectoryExists gibt False z
das ist jetzt aber nicht dein erstn?!
Delphi-Quellcode:
Die Wahrscheinlichkeit ist seeehr hoch das es den Ordner mit dem Namen [ZufälligeZeischenAusDemSpeicher] nicht gibt.
[...]
Dateiname := StrAlloc(size); if IsDirectory(Dateiname) then [...] Du forderst ja nur Speicher an aber kopierst keinen Dateinamen in den Speicherbereich. hier ein kleines Kuriosum
Delphi-Quellcode:
Dateiname ist undefiniert und zeigt auch nicht auf einen Speicherbereich von mindestens 255 Byte freiem Speicher.
anzahl := DragQueryFile(Msg.WParam, $FFFFFFFF, Dateiname, 255);
Klar spielt das keine Rolle weil du ja hier die Anzahl der gedroppten Files abfragst aber dann kannst du anstelle des Dateinamens auch nil übergeben und als Länge des Buffers 0. Alles andere ist einfach nur verwirrend. |
Re: Hereinziehen von Ordnern>DirectoryExists gibt False z
Und wie soll ich an den Pfad rankommen ?
|
Re: Hereinziehen von Ordnern>DirectoryExists gibt False z
![]() Klar könnte ich auch die Lösung direkt schreiben aber es ist doch um einiges besser wenn du die genauen Bedeutungen der Parameter nachliest als nur fertige Lösungen zu bekommen :-D |
Re: Hereinziehen von Ordnern>DirectoryExists gibt False z
Wenn ich mich nicht verlesen habe, sollte es der erste Parameter, also Msg.WParam, sein. Stimmt das so ? Ich sollte mir dringend angewöhnen an MSDN zu denken.
|
Re: Hereinziehen von Ordnern>DirectoryExists gibt False z
msg.wparam
Zitat:
|
Re: Hereinziehen von Ordnern>DirectoryExists gibt False z
Ich habe nun
Delphi-Quellcode:
. Wieso gibt DirectoryExists nun immer True zurück ?
Dateiname := StrAlloc(Msg.WParam);
|
Re: Hereinziehen von Ordnern>DirectoryExists gibt False z
:cyclops: hast du dir denn die Hilfe zu DragQueryFile überhaupt mal angeschaut?
StrAlloc reserviert einfach nur Speicher, das war im Ausgangspost richtig. Aber vom Speicher reservieren alleine steht noch nix im Speicher. Du musst nachdem du mit StrAlloc Speicher reserviert hast mit DragQueryFile den entsprechenden Dateinamen in diesen Speicher schreiben lassen. Du kannst alternativ auch einfach mal nach DragQueryFile im Forum suchen um funktionierende Beispiele zu finden. Nur solltest du diese auch versuchen zu verstehen. |
Re: Hereinziehen von Ordnern>DirectoryExists gibt False z
Ah, ich glaube jetzt habe ich es verstanden.
Delphi-Quellcode:
begin
inherited; anzahl := DragQueryFile(Msg.WParam, $FFFFFFFF, Dateiname, 255); for i := 0 to (anzahl - 1) do begin size := DragQueryFile(Msg.WParam, i , nil, 0) + 1; Dateiname := StrAlloc(size); DragQueryFile(Msg.WParam, i, Dateiname, size); if IsDirectory(Dateiname) then begin ST := TSearchTool.Create; with ST do begin ST.SetFilter('*.*'); if frmOp.Rek then ST.Recurse := True else ST.Recurse := False; MHandle := Handle; MCurrentDir := mkNoneMessage; if ST.IsSearching then begin ST.Break; end else begin LastAdded := 0; ST.SearchFiles(Dateiname); found := TStringList.Create; for j := 0 to found.Count - 1 do AddSingleFile(found[j]); found.Free; end; Free; end; end else if IsVolume(Dateiname) then begin MsgBox('Volumes are not supported.') end else if IsFile(Dateiname) then begin AddSingleFile(StrPas(Dateiname)); end; StrDispose(Dateiname); end; DragFinish(Msg.WParam); end; |
Re: Hereinziehen von Ordnern>DirectoryExists gibt False z
geht doch :-D
nur eben noch diese unschönheit hier:
Delphi-Quellcode:
Wenn als Index $FFFFFFFF angegeben ist wird Dateiname und die Länge für Dateiname ignoriert. Zudem ist Dateiname bei dir zu diesem zeitpunkt ja nicht initialisiert.
anzahl := DragQueryFile(Msg.WParam, $FFFFFFFF, Dateiname, 255);
Warum dann also nicht so (wenn Dateiname uninitialisiert ist und eh keinen nutzen hat).
Delphi-Quellcode:
anzahl := DragQueryFile(Msg.WParam, $FFFFFFFF, nil, 0);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz