Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Frage zum Shelltreeview - Bitte um Hilfe!!!


stefanstp - Mi 23.10.02 10:06
Titel: Frage zum Shelltreeview - Bitte um Hilfe!!!
Wie kann ich in der Shelltreeview nur bestimmte Dateien anzeigen lassen? Weil ich möchte ganz gerne alle Dateien die angezeigt werden, in eine Listbox übertragen, aber da ich an einen Diashowprogramm arbeite, halt nur *.jpg und *.bmp Dateien.

Wie geht das? Kann mir jemand helfen? Und wie kann ich eigentlich gleich alle Dateien selektieren (in der Shelltreeview) per Programmcode (aber nur Dateien, nicht Ordner).

Ich habe es so realisiert, wenn ich auf eine Grafikdatei klicke, das die in einem Image angezeigt wird. Das klappt auch super, aber wenn ich nicht auf eine Datei sondern ins leere von der Shelltreeview klickt kommt diese Meldung:

Zugriffsverletzung bei Adresse 0048A5BC in Modul 'AllOffice2_2_beta_8.exe'. Lesen von Adresse 00000004.

Wie kann ich diese Fehlermeldung vermeiden bzw. abfangen? Habe es schon mit Try except beim Laden von Image probiert, das geht zwar, das keine Fehlermeldung kommt, wenn ich auf nicht Bilddateien klickt, aber eine Fehlermeldung kommt halt, wenn man ins Leere klickt

wer kann helfen?



Danke schon mal im Voraus

STEFAN


Klabautermann - Mi 23.10.02 10:21

Hallo,

das kanst du über das ereignis OnAddFolder machen. Dieses wird jedesmal ausgelöst, wenn ein neues Element im den Baum dargestellt werden soll. Über den Parameter CanAdd kannst du festlegen, ob das Element hinzugefügt werden darf.

Gruß
Klabautermann


Delete - Mi 23.10.02 10:21
Titel: Re: Frage zum Shelltreeview - Bitte um Hilfe!!!
Betreff hat folgendes geschrieben:
Bitte um Hilfe!!!

Das dürfte doch klar sein, sonst würdest du nicht posten.

Zitat:
Ich habe es so realisiert, wenn ich auf eine Grafikdatei klicke, das die in einem Image angezeigt wird. Das klappt auch super, aber wenn ich nicht auf eine Datei sondern ins leere von der Shelltreeview klickt kommt diese Meldung:

Zugriffsverletzung bei Adresse 0048A5BC in Modul 'AllOffice2_2_beta_8.exe'. Lesen von Adresse 00000004.

Wie kann ich diese Fehlermeldung vermeiden bzw. abfangen?

Die "Leere" dürfte wohl das Ergebnis von

Quelltext
1:
Selected = nil                    

sein. So ist´s beim normalen TTreeView. Den ShellTreeView kenne ich nicht (mangels passender Delphi-Version), aber es dürfte da nicht anders sein, dass du mit "Selected" herausbekommst, welcher Eintrag ausgewählt ist.

Richtig geraten?

Wenn ja, dann prüfe vor dem Laden des Bildes einfach, ob "Selected" ungleich nil ist. Wenn ja, lädtst du das Bild; wenn nicht, dann springst du aus der Funktion raus.


stefanstp - Mi 23.10.02 10:40
Titel: Schonmal besten dank aber...
@Klabautermann:

Das hört sich ganz gut an, aber wie realisiere ich das per Programmcode, könntest Du mir ein Beispielcode geben, weil ich mit der Shelltreeview noch überhauptnicht vertraut bin. Schon mal besten Dank im Voraus! :)

@MathiasSimmack:
Danke, das ist logisch. Werde es gleich heute Abend ausprobieren. Besten Dank für die schnelle Hilfe! :lol: Wenns nicht klappt, melde ich mich nochmal!

Schönen Tag wünsche ich :wink:

STEFAN


stefanstp - Mi 23.10.02 10:45
Titel: Ups...ich meine eigentlich die ShellListView ...
:oops: ...aber ist ja eh fast das gleiche....(jedenfalls für Euro zwei Antworten schätze ich mal...)

So denn

STEFAN


stefanstp - Mi 23.10.02 10:50
Titel: Tipps für das Allgemeine Arbeiten mit dem Shelllistview
Ich habe gestern fast den ganzen Tag versucht, gute Informationen über die Shelllistview zu bekommen. Hier ein paar gute Tipps, die ich in einem anderem Forum gefunden habe, die für andere Members bestimmt von Interesse sein könnte: :!:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
//Alle markierten Dateien (wenn 'multiselect') kriegt ihr so:
for x:=0 to ShellListView1.Items.Count-1 do
begin
if ShellListView1.Items.Item[x].Selected then
ListBox1.Items.Add(ShellListView1.Folders[x].PathName);
end;

//Die Nummer des selektierten Eintrags
ShellListView1.Selected.Index

//Anzeigename (was ist der ShellListView steht) der Datei (x ist die Nummer)
ShellListView1.Folders[x].DisplayName;

//wie oben, nur komplett: Pfad + Dateiname + Ext (bsp.: 'c:\test\hallo.exe' )
ShellListView1.Folders[x].PathName;


Aber trotzdem brächte ich noch den Quellcode, wie man nur *.jpg und *.bmp Dateien in der ShellListView anzeigen läßt.
:?:
STEFAN


Klabautermann - Mi 23.10.02 11:35

Hallo,

klicke einfach bei der ShellTreeView doppelt in das Ereigniss OnAddFolder. Den nun erscheinenden Procedurerumpf füllst du folgendermaßen aus:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.ShellTreeView1AddFolder(Sender: TObject; AFolder: TShellFolder; var CanAdd: Boolean);
  VAR
    Ext : STRING;
begin
  Ext := ExtractFileExt(aFolder.PathName);
  IF ((aFolder.IsFolder) OR (UpperCase(Ext) = '.JPG') OR (UpperCase(Ext) = '.BMP')) THEN
    CanAdd := TRUE
  ELSE
    CanAdd := False;
end;


Das sollte übrigens bei der ShellListView genauso funktionieren.
Das aktuelle Objekt (die/der anzuzeigende Daztei/Ordner) wird im Parameter aFolder übergeben. Anhand dieses wird überprüft, ob es sich um einen Ordener handelt oder um etwas mit der Endung .jpg oder .bmp. Ist dies der Fall wird erlaubt das Objelkt in den Baum zu hängen ansonten nicht (CanAdd := TRUE/FALSE).
Weitere Informaltionen zu den Verwendeten Funktionen findest du in der Online-Hilfe.

Gruß
Klabautermann


stefanstp - Mi 23.10.02 11:40
Titel: DANKE!!!!
Werde ich gleich mal heute Abend ausprobieren. Hoffentlich geht es. Hört sich aber logisch an!

Schon mal besten Dank!

STEFAN


stefanstp - Do 24.10.02 07:32
Titel: Hat alles geklappt!
Danke an allen. Es hat alles geklappt!!!

STEFAN