Announcement

Collapse
No announcement yet.

TOpenDialog.OnIncludeItem: Wie benutzt man TOFNotifyEx?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • TOpenDialog.OnIncludeItem: Wie benutzt man TOFNotifyEx?

    Hallo,

    ich habe das Problem, dass ich im TOpenDialog nur Dateien mit (mind.) 3 unterschiedlichen Dateigrößen anzeigen lassen möchte (in meinem Fall werden die benötigten Dateien nur an der Dateigröße, nicht an der Endung oder dem Namen erkannt).

    Bei meiner Suche bin ich in der Delphi-Hilfe auf TOpenDialog.OnIncludeItem gestossen. Dort heißt es:'Das Ereignis OnIncludeItem wird ausgelöst, bevor das Dialogfeld eine Datei in die Dateiliste einfügt.'
    Ich bekomme von Delphi einen TIncludeItemEvent mit einem Parameter OFN vom Typ TOFNotifyEx und dem Boolean Include.

    Meine Frage lautet, kann ich, und wenn ja wie, die Informationen über die Datei, wie z.B. Größe, Name, etc., erhalten?

    Lars

  • #2
    Hallo,

    mit <b>Delphi 5 UpdatePack#1</b> unter <b>Windows 2000</b> kann ich mir beim Aufrufen des Dialogs über die folgende Implementierung alle Dateien auflisten lassen:
    <pre>
    uses ShlObj;

    procedure TForm1.OpenDialog1IncludeItem(const OFN: TOFNotifyEx;
    var Include: Boolean);
    var
    PathName : array[0..99] of Char;
    sFile : String;
    begin
    SHGetPathFromIDList(PItemIDList(OFN.pidl), @PathName);
    sFile := ExtractFileName(PathName);
    ShowMessage(sFile);
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    if OpenDialog1.Execute then
    ShowMessage(OpenDialog1.Filename);
    end;
    </pre>
    Damit die Ereignisbehandlungsroutine aufgerufen wird, muss das Flag <b>ofEnableIncludeNotify</b> gesetzt werden:
    <pre>
    object OpenDialog1: TOpenDialog
    Filter = '*.exe'
    InitialDir = 'C:\Temp\Test'
    Options = [ofHideReadOnly, ofEnableIncludeNotify, ofEnableSizing]
    OnIncludeItem = OpenDialog1IncludeItem
    Left = 48
    Top = 56
    end
    </pre>

    Allerdings wird diese Ereignisbehandlungsmethode mit der Original-Version von Delphi 5 unter Windows NT4 niemals aufgerufen, auch wenn das Flag gesetzt ist. Anscheinend hat TOpenDialog noch einige Macken

    Comment


    • #3
      Hallo Andreas,

      vielen Dank für Deine Antwort. Allerdings ist meine Frage damit noch nicht beantwortet:

      Mit der API-Funktion <b>SHGetPathFromIDList</b> kann man Pfad- und Dateinamen auslesen, das ist schon mal viel Wert. Allerdings brauche ich die Dateigröße. Soll ich diese mit der Funktion FindFirst in einen SearchRec schreiben lassen oder gibt es auch dafür eine entsprechende API-Funktion. Gefunden habe ich unter anderem <b>SHGetFileInfo</b> und <b>SHGetDataFromIDList</b>, weiss aber nicht, wie sie anzuwenden sind.

      Vielleicht hast Du ja nochmal einen Tipp für mich.

      Lar

      Comment


      • #4
        Hallo,

        der Einsatz von <b>ShGetFileInfo</b> vereinfacht die Ermittlung des Dateinamens, allerdings wird bei mir der gesetzte Wert von <b>Include</b> völlig ignoriert (TOpenDialog zeigt in jedem Fall alle Dateien an, unabhängig von Include):
        <pre>
        uses ShlObj, ShellAPI;

        procedure TForm1.Button1Click(Sender: TObject);
        begin
        if OpenDialog1.Execute then
        ShowMessage(OpenDialog1.Filename);
        end;

        procedure TForm1.OpenDialog1IncludeItem(const OFN: TOFNotifyEx;
        var Include: Boolean);
        var
        aFI : TSHFileInfo;
        iSize : Integer;
        aFile : TSearchRec;
        aName : String;
        begin
        ShGetFileInfo(OFN.pidl, 0, aFI, SizeOf(aFI),
        SHGFI_PIDL or SHGFI_DISPLAYNAME or SHGFI_ATTRIBUTES);
        ListBox1.Items.Add(aFI.szDisplayName);
        end;
        </pre>
        Die Dateigrösse muss separat ermittelt werden

        Comment


        • #5
          Hallo Andreas,

          danke für die Erklärungen. Mittlerweile habe ich Dein Buch auch bekommen . Bei mir (Windows 2000 + D5 Prof. deutsch) wird Include ebenfalls vollkommen ignoriert. Bug?

          Vielen Dank nochmal und ein <b>dickes Lob an dieses exzellente Forum!</b>

          Lar

          Comment

          Working...
          X