Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi ShellTreeView FILTER ?! (https://www.delphipraxis.net/100963-shelltreeview-filter.html)

Tommy1988 6. Okt 2007 01:47


ShellTreeView FILTER ?!
 
folgendes habe ich probiert, das klappt ÜBERHAUPT nicht mit der FilterComboBox!

Es wird immer das selbe im ShellTreeView angezeigt!
http://delphi.about.com/b/a/257631.htm

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;

marabu 6. Okt 2007 07:18

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:
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;
Grüße vom marabu

Tommy1988 6. Okt 2007 13:07

Re: ShellTreeView FILTER ?!
 
Leider bekomme ich eine Zugriffverletzung. Ich weis nicht warum, aber es scheint wohl mit dem
Delphi-Quellcode:
ShellTreeView1.Refresh(ShellTreeView1.Items.GetFirstNode);
Im OnChange des FilterComboBox zusammenzuhängen.

Tommy1988 6. Okt 2007 13:23

Re: ShellTreeView FILTER ?!
 
Ahcso, testeshalber habe ich im Filter bisher nur

*.*
und
*.txt

drin stehen.

marabu 6. Okt 2007 13:40

Re: ShellTreeView FILTER ?!
 
In deinem Filter sollte aber etwas anderes stehen:

Delphi-Quellcode:
FilterComboBox.Filter := 'Alle Dateien (*.*)|*.*|Textdateien (*.txt)|*.txt';
Sowohl dein als auch mein Code funktionieren dann.

Tommy1988 6. Okt 2007 14:02

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.

marabu 6. Okt 2007 14:12

Re: ShellTreeView FILTER ?!
 
Setze mal einen Haltepunkt auf die erste Zeile im AddFolder-Event-Handler und steppe mal weiter bis du den Fehler findest.

Tommy1988 6. Okt 2007 14:14

Re: ShellTreeView FILTER ?!
 
Mit dem Haltepunkt, das weis ich wie geht.

Aber mit dem "Steppen" nicht :(

marabu 6. Okt 2007 14:16

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.

Tommy1988 6. Okt 2007 14:18

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:
{$R *.RES}

begin // hier
  Application.Initialize;
  Application.Title := 'FileSplitter';
wenn ich dann F8 drücke, komme ich bis zum End der DPR-Datei und dann kommt die Form.


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