ShellTreeView und ShellListView aktualisieren

Rund um die LCL und andere Komponenten
Antworten
Lion
Beiträge: 186
Registriert: Mo 24. Mär 2014, 09:58

ShellTreeView und ShellListView aktualisieren

Beitrag von Lion »

Hallo Leute,
ich versuche schon seit Tagen, die ShellTreeView und ShellListView zu aktualisieren, nachdem ein Ordner aus der ShellListView gelöscht wird. Für die ShellListView ist mir das mehr oder weniger gelungen, aber nicht für die ShellTreeView, und überhaupt bin ich mit meinem Code irgendwie nicht ganz zufrieden. Kann mir da jemand Optimierungstipp geben? Vielen Dank!

Hier der Code:

Code: Alles auswählen

procedure TMainForm.DeleteEmptyDir();
var
  i, j, p: Integer;
  str, OrgRoot: String;
  delete: Boolean = False;
begin
  // Leere Ordner nur in den "Debitoren"-Ordnern löschen
  for i := 0 to High(AktiveMitglieder) do
  begin
    p := Pos('\' + AktiveMitglieder[i, 0] + '\', ShellTreeView1.GetPathFromNode(ShellTreeView1.Selected));
    if p <> 0 then
    begin
      if MainForm.ShellListView1.Items.Count > 0 then
      begin
        for j := 0 to MainForm.ShellListView1.Items.Count - 1 do
        begin
          // Aktuelles Verzeichnis
          str := MainForm.ShellListView1.GetPathFromItem(MainForm.ShellListView1.Items.Item[j]);
          if IstVerzeichnisLeer(str) then
          begin
            if DeleteDirectory(str, False) then
            begin
              MainForm.EventLog1.Info('Verzeichnis gelöscht: ' + str);
              delete := True;
            end else MainForm.EventLog1.Info('Verzeichnis kann nicht gelöscht werden: ' + str);
          end;
        end;
      end;
    end;
  end;
  // Wenn wenigstens ein leerer Ordner gelöscht wurde - ShellListView aktualisieren
  if delete then
  begin
    OrgRoot := Self.ShellListView1.Root;
    Self.ShellListView1.Root := '';
    Self.ShellListView1.Root := OrgRoot;
    MainForm.EventLog1.Info('Verzeichnis aktualisiert: ' + ShellTreeView1.GetPathFromNode(ShellTreeView1.Selected));
  end;
end; 

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: ShellTreeView und ShellListView aktualisieren

Beitrag von theo »

Also erstens: Benutze in der Methode einer Klasse nie die Instanz. Das ist nicht gut.
In dem ganzen Code da braucht es "MainForm" nicht. Weiter unten hast du "Self" genommen. Das ist zwar nicht falsch, aber hier auch überflüssig.

Dann würde ich im ShellListView den Eintrag einfach mit "Delete" auch aus der Liste entfernen nachdem du die Datei gelöscht hast.
Dann kannst du dir den Refresh Teil unten sparen. In diesem Sinne:

Code: Alles auswählen

...
        for j := ShellListView1.Items.Count-1 downto 0 do
        begin
          // Aktuelles Verzeichnis
          str := ShellListView1.GetPathFromItem(ShellListView1.Items.Item[j]);
          if IstVerzeichnisLeer(str) then
          begin
            if DeleteDirectory(str, False) then
            begin
             ShellListView1.Items.Delete(j);     //<!----            
             EventLog1.Info('Verzeichnis gelöscht: ' + str);
..
Den ShellTreeView könnte man dann noch mit ShellTreeView1.Refresh(ShellTreeView1.Selected) zum aktualisieren bewegen.
Bin nicht ganz sicher ob das so funktioniert, das müsstest du testen.

Den Code zur Prüfung nach aktivem Mitglied würde ich in eine Funktion auslagern.
Das wäre weniger verwirrend.

Lion
Beiträge: 186
Registriert: Mo 24. Mär 2014, 09:58

Re: ShellTreeView und ShellListView aktualisieren

Beitrag von Lion »

Hi theo,
vielen Dank Dir! "ShellListView1.Items.Delete(j);" war die Lösung. Über den Rest denke ich nach.
Gruß

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: ShellTreeView und ShellListView aktualisieren

Beitrag von wp_xyz »

ShellTreeView und ShellListView erscheinen mir primär für die Anzeige von Dateibäumen und die Auswahl von Dateien gedacht zu sein. Mit der Aufgabe, ein Verzeichnis zu löschen, stößt man schnell an die Grenzen. Im ShellTreeView geht es ja noch, so sie theo gezeigt hat. Aber schwierig wird's im ShellListView, wenn die Option otFolders aktiv ist, also sowohl "normale" Dateien als auch Verzeichnisse angezeigt werden. Beide Typen brauchen unterschiedliche Befehle zum Löschen (DeleteFile, DeleteDirectory). Wie stellt man fest, ob das aktuell in der ListView markierte Objekt eine Datei oder ein Verzeichnis ist? In dem Data-Block des TListItem ist, so wie ich erkenne, nur die Dateigröße gespeichert, nicht der ganze SearchRec wie beim TTreeNode des ShellTree.

Lion
Beiträge: 186
Registriert: Mo 24. Mär 2014, 09:58

Re: ShellTreeView und ShellListView aktualisieren

Beitrag von Lion »

wp_xyz hat geschrieben:
Di 14. Mär 2023, 12:39
ShellTreeView und ShellListView erscheinen mir primär für die Anzeige von Dateibäumen und die Auswahl von Dateien gedacht zu sein. Mit der Aufgabe, ein Verzeichnis zu löschen, stößt man schnell an die Grenzen. Im ShellTreeView geht es ja noch, so sie theo gezeigt hat. Aber schwierig wird's im ShellListView, wenn die Option otFolders aktiv ist, also sowohl "normale" Dateien als auch Verzeichnisse angezeigt werden. Beide Typen brauchen unterschiedliche Befehle zum Löschen (DeleteFile, DeleteDirectory). Wie stellt man fest, ob das aktuell in der ListView markierte Objekt eine Datei oder ein Verzeichnis ist? In dem Data-Block des TListItem ist, so wie ich erkenne, nur die Dateigröße gespeichert, nicht der ganze SearchRec wie beim TTreeNode des ShellTree.
Hast schon Recht, aber mit ein paar Brücken, Krücken usw. kommt man schon an sein Ziel.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: ShellTreeView und ShellListView aktualisieren

Beitrag von wp_xyz »

Ist aber unschön. Ich habe eben auf der Devs-MailingList angefragt, ob man nicht das Data-Feld der T(Shell)ListItems um ein Feld IsFolder erweitern könnte, ähnlich wie es im TShellTreeNode der Fall ist.

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: ShellTreeView und ShellListView aktualisieren

Beitrag von theo »

Ja, diese Shell Controls sind mMn bewusst etwas rudimentär gehalten.
Ich glaube, jeder der schon länger dabei ist, hat irgendwann an diesen Dingern herumgeschraubt (z.B. Shell Icons etc.) und dann merken müssen, dass es Cross-Plafform ziemlich schwierig, ausufernd und systemspezifisch wird.
Als Zielvorstellung stehen immer quasi die Komponenten für einen ausentwickelten Explorer / Dolphin etc. im Raum und das auch noch X-Platform, oder wo ist die Grenze?
Ich glaube deshalb sind die so "basic" wie sie nun mal sind.

Lion
Beiträge: 186
Registriert: Mo 24. Mär 2014, 09:58

Re: ShellTreeView und ShellListView aktualisieren

Beitrag von Lion »

wp_xyz hat geschrieben:
Di 14. Mär 2023, 12:57
Ist aber unschön. Ich habe eben auf der Devs-MailingList angefragt, ob man nicht das Data-Feld der T(Shell)ListItems um ein Feld IsFolder erweitern könnte, ähnlich wie es im TShellTreeNode der Fall ist.
Aber das ist es doch schon, oder?
Dateianhänge
Unbenannt.PNG
Unbenannt.PNG (4.5 KiB) 919 mal betrachtet

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: ShellTreeView und ShellListView aktualisieren

Beitrag von wp_xyz »

Nein, das ist gerade das Problem. Mit dieser Einstellung werden in der ListView sowohl Ordner als auch Dateien aufgeführt. Man hat aber keine Möglichkeit festzustellen, ob der gerade angeklickte Eintrag eine Datei oder ein Ordner ist. Wenn es eine Datei wäre, würde man sie mit Deletefile löschen. Wäre es ein Ordner, würde man ihn mit DeleteDirectory löschen. Also was?

Antworten