Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Hereinziehen von Ordnern>DirectoryExists gibt False zurück (https://www.delphipraxis.net/91600-hereinziehen-von-ordnern-directoryexists-gibt-false-zurueck.html)

Nils_13 7. Mai 2007 15:31


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;

SirThornberry 7. Mai 2007 15:35

Re: Hereinziehen von Ordnern>DirectoryExists gibt False z
 
das ist jetzt aber nicht dein erstn?!
Delphi-Quellcode:
[...]
Dateiname := StrAlloc(size);
if IsDirectory(Dateiname) then
[...]
Die Wahrscheinlichkeit ist seeehr hoch das es den Ordner mit dem Namen [ZufälligeZeischenAusDemSpeicher] nicht gibt.
Du forderst ja nur Speicher an aber kopierst keinen Dateinamen in den Speicherbereich.

hier ein kleines Kuriosum
Delphi-Quellcode:
anzahl := DragQueryFile(Msg.WParam, $FFFFFFFF, Dateiname, 255);
Dateiname ist undefiniert und zeigt auch nicht auf einen Speicherbereich von mindestens 255 Byte freiem Speicher.
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.

Nils_13 7. Mai 2007 15:42

Re: Hereinziehen von Ordnern>DirectoryExists gibt False z
 
Und wie soll ich an den Pfad rankommen ?

SirThornberry 7. Mai 2007 15:44

Re: Hereinziehen von Ordnern>DirectoryExists gibt False z
 
MSDN-Library durchsuchenDragQueryFile
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

Nils_13 7. Mai 2007 15:50

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.

SirThornberry 7. Mai 2007 15:54

Re: Hereinziehen von Ordnern>DirectoryExists gibt False z
 
msg.wparam
Zitat:

hDrop
Handle to an internal structure describing the dropped files. Pass this handle DragFinish, DragQueryFile, or DragQueryPoint to retrieve information about the dropped files.

Nils_13 7. Mai 2007 20:08

Re: Hereinziehen von Ordnern>DirectoryExists gibt False z
 
Ich habe nun
Delphi-Quellcode:
Dateiname := StrAlloc(Msg.WParam);
. Wieso gibt DirectoryExists nun immer True zurück ?

SirThornberry 7. Mai 2007 20:14

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.

Nils_13 7. Mai 2007 20:21

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;

SirThornberry 7. Mai 2007 20:27

Re: Hereinziehen von Ordnern>DirectoryExists gibt False z
 
geht doch :-D
nur eben noch diese unschönheit hier:
Delphi-Quellcode:
anzahl := DragQueryFile(Msg.WParam, $FFFFFFFF, Dateiname, 255);
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.

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 15:55 Uhr.
Seite 1 von 2  1 2      

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