AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ShellTreeView FILTER ?!

Ein Thema von Tommy1988 · begonnen am 6. Okt 2007 · letzter Beitrag vom 6. Okt 2007
Antwort Antwort
Seite 1 von 2  1 2      
Tommy1988
(Gast)

n/a Beiträge
 
#1

ShellTreeView FILTER ?!

  Alt 6. Okt 2007, 01:47
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;
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: ShellTreeView FILTER ?!

  Alt 6. Okt 2007, 07:18
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
  Mit Zitat antworten Zitat
Tommy1988
(Gast)

n/a Beiträge
 
#3

Re: ShellTreeView FILTER ?!

  Alt 6. Okt 2007, 13:07
Leider bekomme ich eine Zugriffverletzung. Ich weis nicht warum, aber es scheint wohl mit dem
ShellTreeView1.Refresh(ShellTreeView1.Items.GetFirstNode); Im OnChange des FilterComboBox zusammenzuhängen.
  Mit Zitat antworten Zitat
Tommy1988
(Gast)

n/a Beiträge
 
#4

Re: ShellTreeView FILTER ?!

  Alt 6. Okt 2007, 13:23
Ahcso, testeshalber habe ich im Filter bisher nur

*.*
und
*.txt

drin stehen.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: ShellTreeView FILTER ?!

  Alt 6. Okt 2007, 13:40
In deinem Filter sollte aber etwas anderes stehen:

FilterComboBox.Filter := 'Alle Dateien (*.*)|*.*|Textdateien (*.txt)|*.txt'; Sowohl dein als auch mein Code funktionieren dann.
  Mit Zitat antworten Zitat
Tommy1988
(Gast)

n/a Beiträge
 
#6

Re: ShellTreeView FILTER ?!

  Alt 6. Okt 2007, 14:02
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.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: ShellTreeView FILTER ?!

  Alt 6. Okt 2007, 14:12
Setze mal einen Haltepunkt auf die erste Zeile im AddFolder-Event-Handler und steppe mal weiter bis du den Fehler findest.
  Mit Zitat antworten Zitat
Tommy1988
(Gast)

n/a Beiträge
 
#8

Re: ShellTreeView FILTER ?!

  Alt 6. Okt 2007, 14:14
Mit dem Haltepunkt, das weis ich wie geht.

Aber mit dem "Steppen" nicht
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#9

Re: ShellTreeView FILTER ?!

  Alt 6. Okt 2007, 14:16
F7 (Statement ausführen) und F8 (Funktion ausführen) - dafür gibt es eventuell auch bei dir zwei Buttons in der ToolBar.
  Mit Zitat antworten Zitat
Tommy1988
(Gast)

n/a Beiträge
 
#10

Re: ShellTreeView FILTER ?!

  Alt 6. Okt 2007, 14:18
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:45 Uhr.
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