ListView mit Ordnerinhalt füllen



  • Hallo,
    zur Zeit steh ich auf dem Schlauch.
    Ich möchte mein ListView mit dem Ordnerinhalt C:/Test füllen. Die angezeigten Dateien sollen sich per Doppelklick öffnen lassen.
    Da ich lange nichts mehr in C++ gemacht habe benötige ich ein Beispielsnipset um hier wieder Fuss fassen zu können.

    Im Voraus Vielen Dank !!

    mfg



  • Hey,
    kurze Anmerkung: der Beitrag gehört in das Forum WinAPI.
    Zu deinem Problem: wenn du deine ListView erstellt hast, musst du über alle Dateien im Verzeichnis iterieren (Stichwort FindFirstFile() und FindNextFile()) (guckst du hier). Als Nächstes musst du die Namen der Datei in die ListView einfügen (einfach auf MSDN ListView_InsertItem() nachschlagen; Mit Sendmessage(hWnd, LVM_INSERTITEM, ...) würde auch gehen. Code-Beipsiele dazu lassen sich im Internet ganz leicht finden).
    Und wenn du die Datei bei nem Doppelklick öffnen möchtest, musst du die Nachricht mit der Notification NM_DBLCLK abfangen und den ListView-Eintrag auslesen (-> MSDN).

    Grüße,
    Rweind.



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    Anmerkung: Eine ListBox hat dafür spezielle Nachrichten. Ein ListView kann das nicht "von alleine".



  • Hallo,
    ich habs mit einer Listbox versucht.
    Mit Win32 Find Data (wfd.cFileName) lade ich meine Dateinamen in die Listbox.
    Was ich sehe ist nur den Namen mit der Endung (rtf oder doc).
    Ich erhalte keine Dateigrössenangabe, kein Datum etc. (Möchte ich aber)
    Dann möchte ich die Datei über einen Doppelklick auf die selektierte Datei öffnen.
    Ich versuchs über selected Item geht aber nicht.
    Bei LV->Items->GetText() bekomme ich ein \r\n mit dabei
    (z.B.: Testdatei.rtf\r\n)das wiederum verhindert dass zwar die Anwendung sich öffnet, aber die Datei logischerweise nicht erkannt wird.

    Über einen Tipp oder gar ein Codeschnipsel wäre ich sehr dankbar.

    mfg



  • In die WIN32_FIND_DATA-Struktur wird nur der Name gespeichert (in cFileName ). Wenn du den vollständigen Pfad in deiner Listbox haben willst, musst du den Name an den String, den du in der FindFirstFile()-Funktion verwendet hast, dranhängen. Das Gleiche gilt für eine Funktion zum Öffnen einer Datei.
    Wenn du den Namen der Datei hast, dann musst du auch das Datum erhalten haben. Es ist für ftCreationTime , ftLastAccessTime und ftLastWriteTime in der FILETIME-Struktur gespeichert. Dateigröße hast du dann auch automatisch (in zwei DWORD-Teile geteilt). Wenn du sie dir ausgeben lassen möchtest, dann musst du sie erstmal zusammenfügen (gilt auch für FILETIME).
    Kannst z.B. so machen:

    unsigned __int64 biTotalFilesSize = 0;
    
    biTotalFilesSize = fdFileData.nFileSizeHigh;
    biTotalFilesSize = biTotalFilesSize << (sizeof(DWORD)*8);
    biTotalFilesSize += fdFileData.nFileSizeLow;
    

  • Mod

    Wenn Du den Explorer nachprogrammieren willst musst Du wohl oder übel alles selber machen.
    - Ein ListView im Reportmode verwenden.
    - Die Splaten einfügen
    - Deine Items einfügen
    - Die weiteren Spalten befüllen
    - Auf den Doppelklick reagieren

    Es gibt ein MFC sample dazu
    http://msdn.microsoft.com/en-us/library/bb982182.aspx





  • Nach langem probieren hab ich mich entschlossen ein ListView im Explorer Stiel zu erstellen. Dies habe ich als separates Projekt (exe) erstellt um es besser mitnehmen zu können.
    Meine LW werden mir angezeigt und ich kann navigieren. Toll !!!
    (ein VS Exaple hilft mir hier nicht unbedingt viel weiter, da ich mit dem BorlandBuilder C++ arbeite)
    Starte ich nun aus einer Anwendung eine separate Anwendung mit Parameterangabe, realisiere ich das wie folgt:

    RunApplication(".exe", "Beispiel.");

    auch als

    ShellExecute(0,"open", ".exe", ".Beispiel.*",NULL, SW_SHOW);

    funktionieren beide Beispiele.

    Möchte ich mein LV starten und ein Verzeichnis öffnen und nur die *.pdf Dateien anzeigen lässt sich dies nicht so ganz realisieren.

    Einer meiner Versuche:

    AnsiString Filename = Pfad;
    Pfad = ExtractFilePath(Application->ExeName);
    AnsiString Parameterangabe;
    Parameterangabe = Pfad + "\Test\\Beispiele";
    Parameterangabe in char (ch1) umwandeln

    RunApplication (Pfad.c_str(), ch1);

    Hab ich einen Denkfehler, oder macht man das anders ???????

    Eine kleine Hilfe wäre toll !!!

    mfg



  • hast du dir überhaupt angeschaut was ich gepostet habe? 🤡



  • Bei

    Parameterangabe = Pfad + "\Test\\Beispiele";
    

    fehlt noch ein "\" vor Test. Musst außerdem gucken, ob dein Pfad nicht schon mit einem trailing backslash endet (oder gar ein Sternchen am Ende hat).
    Noch etwas: was ist denn das für eine Funktion, diese RunApplication()? Eine selnsterstellte?


Log in to reply