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 Diskette Formatieren - Zugriff verweigert (https://www.delphipraxis.net/44184-diskette-formatieren-zugriff-verweigert.html)

Gina 14. Apr 2005 19:30


Diskette Formatieren - Zugriff verweigert
 
Hallöle,

ich benutze diese Routine von Delphi-Source.de, um die Formatieren-Dialog von Windows aufzurufen.

Auf meiner Form hab ich ja eine ShellTreeView. Wenn ich nun, bevor ich die Diskette formatieren will, 1x auf die Diskette in der ShellTreeView geklickt habe, dann verweigert er die Formatierung mit dem Hinweis, dass das Diskettenlaufwerk in Benutzung bzw. locked sei... Selbst wenn ich inzwischen längst Laufwerk C: oder D: oder so angeklickt habe. Autorefresh ist aktiviert. Auch ein manueller refresh hilft nicht...

Hat jemand einen Tipp für mich, wie ich das bereinigen kann?

Tausend Dank, Gina.

PS: Und wenn ich den Formatieren-Dialog dann schließe, bekomme ich einen RangeCheck-Error... *grml*

Ultimator 14. Apr 2005 19:53

Re: Diskette Formatieren - Zugriff verweigert
 
Passiert das auch, wenn du die Diskette "normal" im Explorer formatieren willst?

Gina 14. Apr 2005 20:01

Re: Diskette Formatieren - Zugriff verweigert
 
Nein, hab ich auch gleich getestet. Das Muss mit der Routine oder der ShellTreeView zusammenhängen. Offensichtlich gibt er die Diskette nicht mehr "frei", wenn man dann Laufwerk C: etc. anklickt...

Gina.

Christian Seehase 14. Apr 2005 20:09

Re: Diskette Formatieren - Zugriff verweigert
 
Moin Gina,

vielleicht solltest Du, trotz der Bugliste, mal den ShellTreeView aus den TurboPower ShellShock-Komponenten für Deinen konkreten Anwendungsfall testen.

Gina 14. Apr 2005 20:13

Re: Diskette Formatieren - Zugriff verweigert
 
Ok, dann teste ich die auch noch... Irgendwie ist es nicht gerade ermutigend, wenn jede Komponente irgendwo eine "Macke" hat... :(

Thx, Gina.

Gina 15. Apr 2005 22:46

Re: Diskette Formatieren - Zugriff verweigert
 
So...

habe die ShellShock-Kompos getestet. Sieht soweit recht gut aus. Ein paar Macken hat sie aber auch. Eine davon nervt besonders:

Ein gerade angelegter Ordner wird in der StShellTreeView mit dem Symbol für eine unbekannte Datei angezeigt und läßt sich auch nicht öffnen. Ein manueller Refresh bringt nur Abhilfe, wenn man das übergeordnete Laufwerk dabei auswählt...

Hat jemand eine Idee dazu?

Big Thx, Gina.

Christian Seehase 16. Apr 2005 13:12

Re: Diskette Formatieren - Zugriff verweigert
 
Moin Gina,

schau Dir doch mal die API MSDN-Library durchsuchenSHChangeNotify an.

Gina 16. Apr 2005 13:46

Re: Diskette Formatieren - Zugriff verweigert
 
Hi Christian,

danke dir. Hab da mal ein paar Sachen ausprobiert. Insbesondere das Ereignis OnShellChangeNotify, aber so ganz klappen tut das nicht... Die Nachricht kommt an und er aktualisiert ja auch, aber offensichtlich ist dort ein kleiner Bug drin...

Das ist doch die Prozedur

Delphi-Quellcode:
procedure TStCustomShellTreeView.ShellEvent(Sender : TObject;
  SI1, SI2 : TStShellItem; Events : TStNotifyEventsSet);
aus der StShlCtl, oder?

Thx, Gina.

Christian Seehase 16. Apr 2005 14:22

Re: Diskette Formatieren - Zugriff verweigert
 
Moin Gina,

ich hab' jetzt nicht in die ShellShock-Sourcen geschaut, aber das müsste eine Kapselung von MSDN-Library durchsuchenSHChangeNotifyRegister sein.
Die andere Funktion sendet die Meldung, dass sich etwas geändert hat.

Gina 16. Apr 2005 15:51

Re: Diskette Formatieren - Zugriff verweigert
 
Hi,

die Prozedur sieht so aus:

Delphi-Quellcode:
procedure TStCustomShellTreeView.ShellEvent(Sender : TObject;
  SI1, SI2 : TStShellItem; Events : TStNotifyEventsSet);
const
  LastPidl : PItemIDList = nil;
var
  I      : Integer;
  Node   : TTreeNode;
  NewNode : TTreeNode;
  SF     : TStShellFolder;
  Pidl   : PItemIDList;
begin
  DoShellChangeNotify(SI1, SI2, Events);
  if InternalEvent then begin
    InternalEvent := False;
    Exit;
  end;
  if SI1 = nil then                                                  
    Exit;                                                            
  { Something happened in the shell. See if it's something we  }
  { need to handle. We could get this event twice. If we do, we }
  { don't add to the tree view twice. }
  if ((neFolderCreate in Events) or (neDriveAdd in Events))
       or ((neFileCreate in Events) and (toShowFiles in Options))
       and (SI1.Pidl <> LastPidl) then begin
    { A folder was created. See if its parent is one we have in the list. }
    Node := FindParentNode(SI1);
    if Node <> nil then
      { If the node doesn't have any subnodes then we don't }
      { need to do anything. }
      if Node.Count <> 0 then begin
        SF := TStShellFolder.Create(Controller);
        SF.Assign(TStShellFolder(SI1));
        if SF.FParentFolder = nil then                                
          SF.FParentFolder := Controller.DesktopFolder;              
        SF.ParentList := Folders.FList;
        { It could be that a network drive is in the list but was }
        { not connected and has been reconnected. If that is the }
        { case then we don't want to add the folder again. }
        NewNode := FindNodeByPath(SF.Path);
        if NewNode = nil then
          NewNode := Items.AddChild(Node, SF.DisplayName);
        NewNode.Data := Pointer(Folders.FList.Add(SF));
        LastPidl := SF.Pidl;
        NewNode.ImageIndex := SF.IconIndex;
        NewNode.SelectedIndex := SF.OpenIconIndex;
        NewNode.OverlayIndex := SF.OverlayIconIndex;
        if (neDriveAdd in Events) then
          NewNode.HasChildren := True;
        CustomSort(TreeCompareFunc, Integer(Self));
        Exit;
      end;
  end;
  if ((neFolderDelete in Events) or (neDriveRemove in Events)
       or ((neFileDelete in Events) and (toShowFiles in Options))) then begin
    { A folder was deleted. See if it is one we have in the list. }
    Node := FindNodeByPidl(SI1.Pidl);
    if Node = nil then
      Node := FindNodeByPath(SI1.Path);
    if (Node <> nil) and (Selected = Node) then
      Selected := Node.GetNext;
    if Node <> nil then begin
      { Remove it from the underlying list and from the tree view. }
      Folders[Integer(Node.Data)].Free;
      Folders.FList[Integer(Node.Data)] := nil;
      Node.Delete;
      Exit;
    end;
  end;
  if (neFolderRename in Events) or
     ((neFileRename in Events) and (toShowFiles in Options)) then begin
    { A folder was renamed. This could be an item deleted to the }
    { recycle bin. See if the destination is the recycle bin.   }
    SHGetSpecialFolderLocation(
      Application.Handle, CSIDL_DESKTOP, Pidl);

    if SI2 <> nil then begin                                          
      if ILIsEqual(Pidl, SI2.Pidl) then begin
        { It's the recycle bin so delete from the tree view. }
        Node := FindNodeByPidl(SI1.Pidl);
        if Node <> nil then begin
          Folders[Integer(Node.Data)].Free;
          Folders.FList[Integer(Node.Data)] := nil;
          Node.Delete;
          Exit;
        end;
      end else
        { See if it's one we have in the list. }
        for I := 0 to Pred(Folders.Count) do begin
          if UpperCase(Folders[I].Path) = UpperCase(SI1.Path) then begin
            Folders[I].Assign(TStShellFolder(SI2));
            if Folders[I].FParentFolder = nil then                    
              Folders[I].FParentFolder := Controller.DesktopFolder;  
            Node := FindNodeByPidl(SI2.FPidl);
            if Node <> nil then begin
              Node.Text := SI2.DisplayName;
              CustomSort(TreeCompareFunc, Integer(Self));
            end;
            Break;
          end;
        end;
    end;                                                              
  end;
  if (neNetShare in Events) or (neNetUnShare in Events) then begin
    Node := FindNodeByPidl(SI1.Pidl);
    if Node <> nil then
      Node.OverlayIndex := SI1.OverlayIconIndex;
  end;
  if (neMediaInsert in Events) or (neMediaRemove in Events) then begin
    { Media was added or removed. We need to flush the shell }
    { cache and update the display or we'll just get a cached }
    { icon and display name. }
    Node := FindNodeByPath(SI1.Path);
    if Node <> nil then begin
      Node.ImageIndex := SI1.IconIndex;
      Node.Text := SI1.DisplayName;
    end;
  end;
end;
Die Benachrichtigung an sich kommt ja an, doch offensichtlich sucht er sich das falsche Symbol aus... Falls keinem in der Prozedur was auffällt, dann lasse ich es eben so. Mit meinem speziellen manuellen refresh geht es ja. Ist nur etwas unschön...

Thx, Gina.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:10 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