![]() |
Diskette Formatieren - Zugriff verweigert
Hallöle,
ich benutze ![]() 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* |
Re: Diskette Formatieren - Zugriff verweigert
Passiert das auch, wenn du die Diskette "normal" im Explorer formatieren willst?
|
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. |
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. |
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. |
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. |
Re: Diskette Formatieren - Zugriff verweigert
|
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:
aus der StShlCtl, oder?
procedure TStCustomShellTreeView.ShellEvent(Sender : TObject;
SI1, SI2 : TStShellItem; Events : TStNotifyEventsSet); Thx, Gina. |
Re: Diskette Formatieren - Zugriff verweigert
Moin Gina,
ich hab' jetzt nicht in die ShellShock-Sourcen geschaut, aber das müsste eine Kapselung von ![]() Die andere Funktion sendet die Meldung, dass sich etwas geändert hat. |
Re: Diskette Formatieren - Zugriff verweigert
Hi,
die Prozedur sieht so aus:
Delphi-Quellcode:
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...
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; Thx, Gina. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:14 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