Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Verzeichnis mit Treeview verschieben (https://www.delphipraxis.net/53070-verzeichnis-mit-treeview-verschieben.html)

mimi 9. Sep 2005 13:20


Verzeichnis mit Treeview verschieben
 
Hallo,
habe wieder ein problem mit der Treeview:
ich möchte einen Eintrag per Draq und drop in einer TreeView verschieben(geht auch, code ist aus diesem forum).nun wollte ich gerne da ich mit verzeichnisen arbeite das qullverzeichnis zum zielverzeichnis verschieben.
in der ShowMessageBox sieht alles richtig aus nur er sagt:
Delphi-Quellcode:
---------------------------
Fehler beim Verschieben der Datei oder des Ordners
---------------------------
Datei kann nicht verschoben werden: Die Quelldatei oder vom Quelldatenträger kann nicht gelesen werden.
---------------------------
OK  
---------------------------
den code habe ich wie gesagt aus dem forum und leicht angepasst:
Delphi-Quellcode:
function MoveDir(const fromDir, toDir: string): Boolean;
var
  fos: TSHFileOpStruct;
begin
  ZeroMemory(@fos, SizeOf(fos));
  with fos do
  begin
    wFunc := FO_Move;
    fFlags := FOF_NoConfirmMkDir + FOF_NOCONFIRMATION;
    pFrom := PChar(fromDir + #0);
    pTo   := PChar(toDir + #0)
  end;
  Result := (0 = ShFileOperation(fos));
end;

procedure TForm1.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
  AnItem: TTreeNode;
  AttachMode: TNodeAttachMode;
  HT: THitTests;
  str:String;
begin
  if TreeView1.Selected = nil then Exit;
  HT := TreeView1.GetHitTestInfoAt(X, Y);
  AnItem := TreeView1.GetNodeAt(X, Y);
  if (HT - [htOnItem, htOnIcon, htNowhere, htOnIndent] <> HT) then
  begin
    if (htOnItem in HT) or (htOnIcon in HT) then AttachMode := naAddChild
    else if htNowhere in HT then AttachMode := naAdd

    else if htOnIndent in HT then AttachMode := naInsert;
    TreeView1.Selected.MoveTo(AnItem, AttachMode);

//    Showmessage(Edit1.Text+#13+ListenDir + GetTreeViewPath(TreeView1.Selected));
    str:=Edit1.Text;
    Edit1.Text:='';
    SetCurrentDir('');
    MoveDir(str,ListenDir + GetTreeViewPath(TreeView1.Selected));
  end;
// in listenDir steht folgendes:
// D:\Daten\eigene\delphi\tools\programmstarter\system\listen\
// + der Knotenname der gerade ausgewählt wurde
ich weiß einfach nicht mehr weiter, für jeden tip währe ich dankbar !
(ich nuzte zum erstenmal wieder eine TreeView, und habe diese komponenten noch nicht ganz verstanden :( )

Edit:
in edit steht folgendes:
Delphi-Quellcode:
  Edit1.Text:=ListenDir + GetTreeViewPath(TreeView1.Selected);
und den GetTreeViewPath habe ich auch wieder aus dem Forum hier:
Delphi-Quellcode:
function GetTreeViewPath(Uebergeordnet:TTreeNode):String;
Var
  Node : TTreeNode;
  Path : String;
Begin
  if Uebergeordnet <> NIL then begin
    Node := Uebergeordnet;
    Path := '';

    Repeat
      Path := Node.Text + '\' + Path;
      Node := Node.Parent;
    Until ( Node = Nil );

    result:=Path;
  end
  else
    result:='';
End;

himitsu 23. Okt 2005 06:56

Re: Verzeichnis mit Treeview verschieben
 
Tut mir Leid, aber eine "gute" Lösung hab ich hierfür auch nicht.
Das Einzige, was du da machen kannst, ist die Ursache für den Fehler zu entfernen.
Du mußt also den Grund herausfinden, warum die Datei gesperrt ist (also nicht verschoben werden kann) und dann diese Sperrung aufheben.

So, nun mal zu mir ^^
Ich habe leider auch soeine Fehlermeldung ... hat eventuell einen ähnlichen Grund.
Zitat:

---------------------------
Fehler beim Löschen der Datei oder des Ordners
---------------------------
Datei kann nicht gelöscht werden: Die Quelldatei oder vom Quelldatenträger kann nicht gelesen werden.
---------------------------
OK
---------------------------
Bei mir ist es aber nicht unbedingt nötig das Löschen auszuführen, alerdings soll im Fehlerfall etwas anderes gemacht werden.
Zuerst hatte ich es so versucht:
Delphi-Quellcode:
Try
  ...
  Result := SHFileOperation(ShellInfo) = S_OK;
Except
  ... was anderes
End;
Allerdings wurde dabei immernoch die "gemeine" Fehlermeldung angezeigt und das "Andere" wurde nicht ausgeführt.
Nach einigen Test bin ich nun darauf gekommen, daß zwar eine Fehlermeldung (samt dem nervigen Fehlergeräuch) ausgegeben, aber in Wirklichkeit wird keine Exception erzeugt, weßhalb natürlich der Except-Block nicht ausgeführt wird.
Und da es sich um keine Exception handelt, welche von Delphi's Fehlerbehandlungroutinen ausgewertet wird, ist es ebenfalls nicht möglich diesen "Fehler" per Try-Except zu unterdrücken.
Da jetzt natürlich das Try-Except "sinnlos" ist, wird es jetzt folgender Maßen behandelt und nun wird im Fehlerfall endlich auch das "Andere" ausgeführt.
Delphi-Quellcode:
Result := SHFileOperation(ShellInfo) = S_OK;
If not Result Then Begin
  ... was anderes
End;
Das Problem mit der erscheinenden "Fehlermeldung" bleibt aber erhalten.
Und da diese Meldung intern von SHFileOperation erzeugt und angezeigt wird, hab ich keine delphiengenen Möglichkeiten diese Meldung loszuwerden.

Gibt es also eine Möglichkeit dieses blöde Fehlerfenster abzustellen?
Ich hab ja leider (im WinSDK) nichts gefunden, womit dieses deaktiviert werden kann :(

mimi 23. Okt 2005 08:10

Re: Verzeichnis mit Treeview verschieben
 
das Problem war damals auch das es einfach Textdateien waren die von anderen programmen nicht genutzt werden nur von meinem !
die fehlermeldung abzustellen löst leider nicht das problem.

marabu 23. Okt 2005 12:09

Re: Verzeichnis mit Treeview verschieben
 
Hallo himitsu,

Zitat:

Zitat von himitsu
Gibt es also eine Möglichkeit dieses blöde Fehlerfenster abzustellen?

hast du bei den Flags in SHFILEOPSTRUCT einmal FOF_NOERRORUI (Kein Fenster im Fehlerfall) verwendet?

Grüße vom marabu

himitsu 23. Okt 2005 17:45

Re: Verzeichnis mit Treeview verschieben
 
Nö, hab ich nicht ... denn irgendwie hab ich das mit dem ERROR wohl übersehen -.-''
(hab nur die Attribute für NoConfirmation und AllowUndo)

Werd' es mal damit versuchen, aber es klingt schonmal vielversprechend ^^

[add]
So, das Problem ist gelöst.
Jetzt nur noch das Problem warum SHFileOperation überhaupt einen Fehler (Rückgabewert $0402 1026) meldet,
aber vorher werd' ich da noch einiges umstellen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:54 Uhr.

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