![]() |
ShellTreeView FILTER ?!
folgendes habe ich probiert, das klappt ÜBERHAUPT nicht mit der FilterComboBox!
Es wird immer das selbe im ShellTreeView angezeigt! ![]() Wie kann ich einer ShellTreeView sagen, es soll nur z.b. textdateien anzeigen? Mein Code:
Delphi-Quellcode:
procedure TForm3.ShellTreeView1AddFolder(Sender: TObject; AFolder: TShellFolder;
var CanAdd: Boolean); var maskExt : string; fileExt : string; begin maskExt := ExtractFileExt(FilterComboBox1.Mask) ; if maskExt = '*.*' then begin CanAdd := true; Exit; end; fileExt := ExtractFileExt(AFolder.DisplayName) ; CanAdd := AFolder.IsFolder OR (CompareText(maskExt,fileExt) = 0) ; end; procedure TForm3.FormCreate(Sender: TObject); begin ShellTreeView1.ObjectTypes := [otNonFolders] + ShellTreeView1.ObjectTypes; end; procedure TForm3.FilterComboBox1Change(Sender: TObject); begin ShellTreeView1.Refresh(ShellTreeView1.Items.GetFirstNode); end; |
Re: ShellTreeView FILTER ?!
Moin Tommy,
wie sieht denn dein Filter aus? Der Code ist soweit ganz in Ordnung, allerdings behandelt er nur einen Spezialfall (einzelne Maske, match nur für extension, kein wildchar in ext erlaubt). Denke daran, dass ZIP-Dateien wie Folder behandelt werden. Wenn du so weitermachen willst, dann ersetze "CompareText() = 0" noch durch "SameText()" - zu den originellen Komponentenbezeichnern schreibe ich jetzt mal nichts. Hier eine universelle Lösung:
Delphi-Quellcode:
Grüße vom marabu
const
shlwapi = 'SHLWAPI.DLL'; function PathMatchSpec(pszFileParam, pszSpec: PAnsiChar): BOOL; stdcall external shlwapi name 'PathMatchSpecA'; function PathMatchSpecs(const fn: TFileName; const mask: string): Boolean; var s: TStrings; ok: Boolean; i: Integer; begin ok := False; with TStringList.Create do try Delimiter := ';'; DelimitedText := mask; for i := 0 to Pred(Count) do begin ok := ok or PathMatchSpec(PChar(fn), PChar(Strings[i])); if ok then Break; end; finally Free; end; Result := ok; end; procedure TDemoForm.ShellTreeViewAddFolder(Sender: TObject; AFolder: TShellFolder; var CanAdd: Boolean); begin CanAdd := AFolder.IsFolder or PathMatchSpecs(AFolder.DisplayName, FilterComboBox.Mask); end; |
Re: ShellTreeView FILTER ?!
Leider bekomme ich eine Zugriffverletzung. Ich weis nicht warum, aber es scheint wohl mit dem
Delphi-Quellcode:
Im OnChange des FilterComboBox zusammenzuhängen.
ShellTreeView1.Refresh(ShellTreeView1.Items.GetFirstNode);
|
Re: ShellTreeView FILTER ?!
Ahcso, testeshalber habe ich im Filter bisher nur
*.* und *.txt drin stehen. |
Re: ShellTreeView FILTER ?!
In deinem Filter sollte aber etwas anderes stehen:
Delphi-Quellcode:
Sowohl dein als auch mein Code funktionieren dann.
FilterComboBox.Filter := 'Alle Dateien (*.*)|*.*|Textdateien (*.txt)|*.txt';
|
Re: ShellTreeView FILTER ?!
Mhh... ich schreibe mal den ganzen code hier rein,
Delphi-Quellcode:
unit Unit3;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, ShellCtrls, sSkinManager, sSkinProvider, StdCtrls, sButton, sLabel, FileCtrl; const shlwapi = 'SHLWAPI.DLL'; function PathMatchSpec(pszFileParam, pszSpec: PAnsiChar): BOOL; stdcall external shlwapi name 'PathMatchSpecA'; type TForm3 = class(TForm) sSkinProvider1: TsSkinProvider; sSkinManager3: TsSkinManager; ShellTreeView1: TShellTreeView; sLabel1: TsLabel; sButton1: TsButton; FilterComboBox1: TFilterComboBox; procedure FilterComboBox1Change(Sender: TObject); procedure FormCreate(Sender: TObject); procedure ShellTreeView1AddFolder(Sender: TObject; AFolder: TShellFolder; var CanAdd: Boolean); procedure sButton1Click(Sender: TObject); procedure ShellTreeView1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } WantMerge: Boolean; end; var Form3: TForm3; implementation uses Unit1; {$R *.dfm} function PathMatchSpecs(const fn: TFileName; const mask: string): Boolean; var s: TStrings; ok: Boolean; i: Integer; begin ok := False; with TStringList.Create do try Delimiter := ';'; DelimitedText := mask; for i := 0 to Pred(Count) do begin ok := ok or PathMatchSpec(PChar(fn), PChar(Strings[i])); if ok then Break; end; finally Free; end; Result := ok; end; procedure TForm3.ShellTreeView1Click(Sender: TObject); begin sLabel1.Caption := 'Aktueller Pfad: ' + ShellTreeView1.Path; end; procedure TForm3.sButton1Click(Sender: TObject); begin Form1.Edit2.Text := ShellTreeView1.Path; Close; end; procedure TForm3.ShellTreeView1AddFolder(Sender: TObject; AFolder: TShellFolder; var CanAdd: Boolean); begin CanAdd := AFolder.IsFolder or PathMatchSpecs(AFolder.DisplayName, FilterComboBox1.Mask); end; procedure TForm3.FormCreate(Sender: TObject); begin FilterComboBox1.Filter := 'Alle Dateien (*.*)|*.*|Textdateien (*.txt)|*.txt'; ShellTreeView1.ObjectTypes := [otNonFolders] + ShellTreeView1.ObjectTypes; end; procedure TForm3.FilterComboBox1Change(Sender: TObject); begin ShellTreeView1.Refresh(ShellTreeView1.Items.GetFirstNode); end; end. |
Re: ShellTreeView FILTER ?!
Setze mal einen Haltepunkt auf die erste Zeile im AddFolder-Event-Handler und steppe mal weiter bis du den Fehler findest.
|
Re: ShellTreeView FILTER ?!
Mit dem Haltepunkt, das weis ich wie geht.
Aber mit dem "Steppen" nicht :( |
Re: ShellTreeView FILTER ?!
F7 (Statement ausführen) und F8 (Funktion ausführen) - dafür gibt es eventuell auch bei dir zwei Buttons in der ToolBar.
|
Re: ShellTreeView FILTER ?!
Wenn ich den Haltepunkt setze und dann F7 drücke lande ich in der DPR-Datei
in der markierten Zewile:
Delphi-Quellcode:
wenn ich dann F8 drücke, komme ich bis zum End der DPR-Datei und dann kommt die Form.
{$R *.RES}
begin // hier Application.Initialize; Application.Title := 'FileSplitter'; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07: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