Einzelnen Beitrag anzeigen

Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#24

AW: Filterfehler bei FileListBox

  Alt 24. Mär 2021, 12:16
Wie soll ich denn beschreiben, was nicht funktioniert?
Genau so wie Du es nun getan hast!!!!
Woher soll denn einer Wissen der nicht Deine Delphi Version zur Verfügung hat was da schiefläuft ?

Allerdings kann ich Dein letztes Beispiel gar nicht erst kompilieren
Da nun klar ist woran es liegt, hier ein neuer Versuch.

Und was mich aufgeregt habt, lieber Kodezwerg, sind Dein "Naja, dann eben nicht." und Deine Unterstellungen im "//edit"-Teil.
Hiermit reiche ich Dir nochmal die Hand in der Hoffnung das Du es mir nicht mehr böse nimmst, Frieden zwischen uns okay?

Delphi-Quellcode:
{$IF CompilerVersion >= 23}
{$DEFINE NameSpace}
{$ELSE CompilerVersion}
{$UNDEF NameSpace}
{$IFEND CompilerVersion}
unit Unit4;

interface

uses
{$IFDEF NameSpace}
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
{$ELSE NameSpace}
  Windows, Messages, SysUtils, Variants, Classes, Graphics,
  Controls, Forms, Dialogs, StdCtrls;
{$ENDIF NameSpace}

const
  kernelbase = 'kernel32.dll';
  FIND_FIRST_EX_LARGE_FETCH = 2;
  MAX_PATH = 260;

type
  LPWSTR = PWideChar;
  _WIN32_FIND_DATAW = record
    dwFileAttributes: DWORD;
    ftCreationTime: TFileTime;
    ftLastAccessTime: TFileTime;
    ftLastWriteTime: TFileTime;
    nFileSizeHigh: DWORD;
    nFileSizeLow: DWORD;
    dwReserved0: DWORD;
    dwReserved1: DWORD;
    cFileName: array[0..MAX_PATH - 1] of WideChar;
    cAlternateFileName: array[0..13] of WideChar;
  end;
  WIN32_FIND_DATAW = _WIN32_FIND_DATAW;
  TWin32FindDataW = _WIN32_FIND_DATAW;

  _FINDEX_INFO_LEVELS = (FindExInfoStandard, FindExInfoBasic, FindExInfoMaxInfoLevel);
  TFindexInfoLevels = _FINDEX_INFO_LEVELS;
  _FINDEX_SEARCH_OPS = (FindExSearchNameMatch, FindExSearchLimitToDirectories,
    FindExSearchLimitToDevices);
  TFindexSearchOps = _FINDEX_SEARCH_OPS;

function FindFirstFileExW(lpFileName: LPWSTR; fInfoLevelId: TFindexInfoLevels;
  lpFindFileData: Pointer; fSearchOp: TFindexSearchOps; lpSearchFilter: Pointer;
  dwAdditionalFlags: DWORD): THandle; stdcall;
function FindNextFileW(hFindFile: THandle; var lpFindFileData: TWIN32FindDataW): BOOL; stdcall;

type
  TForm4 = class(TForm)
    edPath: TEdit;
    edMask: TEdit;
    lbFiles: TListBox;
    btnStart: TButton;
    procedure btnStartClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form4: TForm4;

implementation

{$R *.dfm}

function FindFirstFileExW; external kernelbase name 'FindFirstFileExW';
function FindNextFileW; external kernelbase name 'FindNextFileW';

procedure TForm4.btnStartClick(Sender: TObject);
var
  SL: TStringList;
  hFile: THandle;
  FindDataW: TWIN32FindDataW;
begin
  SL := TStringList.Create;
  try
    hFile := FindFirstFileExW(PWideChar(edPath.Text + edMask.Text), FindExInfoBasic, @FindDataW, FindExSearchNameMatch, nil, FIND_FIRST_EX_LARGE_FETCH);
    if hFile <> INVALID_HANDLE_VALUE then
      begin
        repeat
          if (((FindDataW.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0) and (FindDataW.cFileName <> WideString('.')) and (FindDataW.cFileName <> WideString('..'))) then
            begin
              SL.Add(WideString(FindDataW.cFileName));
            end;
        until (not FindNextFileW(hFile, FindDataW));
      end;
    {$IFDEF NameSpace}Winapi.{$ENDIF NameSpace}Windows.FindClose(hFile);
    lbFiles.Items.BeginUpdate;
    lbFiles.Clear;
    lbFiles.Items := SL;
    lbFiles.Items.EndUpdate;
  finally
    SL.Free;
  end;
end;

end.
Im Anhang ist das Projekt als Quelltext sowie in kompilierter Form.
Es kann sein das Dein Delphi mit der .dfm Datei nicht klarkommt (Align und AlignWithMargins). Diese Fehler ignorieren und selbst das Design anpassen.
Es kann sein das Dein Delphi mit der .res Datei nicht klarkommt, einfach löschen und Delphi eine Eigene erstellen lassen, da ist nur das Icon drinnen.

Wenn es wieder nicht funktionieren sollte, gebe wieder Bescheid in der Form wie Du es nun gemacht hast. (Benenne Fehler, sag nicht einfach nur "klappt nicht")


//edit
Mir ist noch ein Fehler unterlaufen für Deine Delphi Version an den ich vorher nicht gedacht hatte.
Bitte die .dpr Datei anpassen bevor Du das Projekt in Delphi reinlädst. Das hatte ich vorhin noch nicht auf dem Schirm gehabt.

Delphi-Quellcode:
{$IF CompilerVersion >= 23}
{$DEFINE NameSpace}
{$ELSE CompilerVersion}
{$UNDEF NameSpace}
{$IFEND CompilerVersion}
program Project8;

uses
{$IFDEF NameSpace}
  Vcl.Forms,
{$ELSE NameSpace}
  Forms,
{$ENDIF NameSpace}
  Unit4 in 'Unit4.pas{Form4};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True; // ich weiß nicht ob Dein Delphi das kennt, Zeile löschen wenn nötig.
  Application.CreateForm(TForm4, Form4);
  Application.Run;
end.
Angehängte Dateien
Dateityp: zip alles.zip (965,6 KB, 5x aufgerufen)
Gruß vom KodeZwerg

Geändert von KodeZwerg (24. Mär 2021 um 13:45 Uhr) Grund: ich war nicht gründlich genug und habe vergessen das es ja auch noch eine dpr datei zu berücksichtigen gibt.
  Mit Zitat antworten Zitat