Auf sortierte FileList von TOpenDialog zugreifen



  • Hallo
    In meinem Diashow-Programm benutze ich den TOpenDialog.

    OpenDialog1->Execute();
    

    In dem geöffneten Dialog ist es ja möglich nach "Name", "Grösse" oder "Datum" u.s.w zu sortieren.
    Ist es möglich, nach schliessen des Dialogs, oder auch bei geöffnetem Dialog, auf die sortierte FileList des TOpenDialogs zuzugreifen?
    Wenn nicht, wie könnte ich bewerkstelligen, das ich nach Auswahl eines "Startbildes"

    OpenDialog1->FileName
    

    an der gleichen Stelle in einer StringList bin, wie zuvor im Dialog?

    Mit

    IndexOf
    

    finde ich zwar das File (Bild) in meiner angelegten StringList (mit FindFirst u.s.w.) aber die StringList
    ist ja nich so sortiert, wie die des Dialogs.

    Hoffe, ich habe mich verständlich ausgedrückt.
    Danke



  • Das es auf deinem Wege möglich ist ist mir leider unbekannt. Ähnliche Fälle habe ich wie folgt gelöst:

    1. Im Verzeichnis mit FindFirst -> FindNext alle gewünschten Dateien in eine TStringList aufgenommen.
    2. TStringList auf Custom Sort gesetzt und mit einer (klassenfremden!!! Wichtig!) Sortierroutine die StringList durchsortiert.
    3. Mit einer for-Schleife, TThread in Verbindung mit Sleep etc..etc.. durch die TStringList iteriert und Bild für Bild auf ne Canvas oder Bitmap Komponente gezogen.

    Das ist nicht "die Lösung" sondern eine von vielen

    Hoffe geholfen zu haben.



  • Vielleicht gewährt der Windows-Dateidialog Zugriff auf das Kriterium der Listensortierung, vielleicht auch nicht. Jedenfalls wäre es etwas komplexer, als dir lieb wäre, da der Explorer ja das Sortieren nach relativ beliebigen Dateieigenschaften erlaubt, insbesondere solchen, die aus irgendwelchen Metadaten (z.B. ID3- oder EXIF-Tags) gelesen werden.

    Aus der Sicht des Benutzers fände ich solches Verhalten aber verwirrend. Wenn ich im Dateidialog irgendwas an der Sortierung ändere, dann tue ich das in der Absicht, meine Datei zu finden anhand irgendeines Kriteriums, das ich gerade im Sinn habe. Und ich erwarte, daß eine Änderung der Sortierung im Dialog nur für den Dialog gilt, also keinen Einfluß auf die Darstellung im Programm selbst hat.

    Kannst du mal beschreiben, wofür genau du den Dateidialog verwendest, und was genau du mit der Sortierung anfangen willst?



  • Danke erstmal für eure Tips.

    2. TStringList auf Custom Sort gesetzt und mit einer (klassenfremden!!! Wichtig!) Sortierroutine die StringList durchsortiert.

    Das schaue ich mir mal genauer an. Vielleicht liegt da der Hund begraben. Danke

    Kannst du mal beschreiben, wofür genau du den Dateidialog verwendest, und was genau du mit der Sortierung anfangen willst?

    Sehr gerne:
    Ich habe ein Diashow Programm geschieben.
    Wenn das Programm starte, öffnet sich der OpenDialog.
    Ich wechsele in einen Ordner mit Bildern.
    Suche ein Bild aus, OpenDialog schliesst sich.
    Mit FindFirst/FindNext befülle ich eine StringList mit den Dateinamen aus dem Ordner.
    Mit IndexOf springe ich in der StringList zu der Stelle an der sich das ausgesuchte Bild befindet.

    PicIndex=Dateien->IndexOf(ExtractFileName(OpenFile->FileName));
    

    Das Bild wird dann in einem TImage angezeigt.
    Durch betätigen der hoch/runter Tasten kann ich durch die Stringlist "wandern" und es wird mir das nächste/vorherige angezeigt.

    Nun habe ich festgestellt, das die Reihenfolge der Dateinamen in meiner StringList nicht mit der im OpenDialog angezeigten übereinstimmt.
    Egal ob ich dort nach Name, Datum u.s.w sortiert habe oder nicht.

    Hiermit scanne ich den Ordner:

    void __fastcall TForm1::ScanDirectoryExecute(TObject *Sender)
    {
    //Directory einscannen
      Dateien->Clear();
      TSearchRec sr;
      if (FindFirst(Path+"*.*", faAnyFile, sr) == 0)
      {
        do
        {
            if ((sr.Attr != faDirectory) && (sr.Name != ".") && (sr.Name != "..")){
            Dateien->Add(sr.Name);
            }
        } while (FindNext(sr) == 0);
        FindClose(sr);
      }
    }
    

    Danke



  • Danke, Zero01 !
    Mit CustomSort und der Suche hier hat es nun geklappt.
    Meine StringList ist nun genauso sortiert wie die im OpenDialog.
    Vielen Dank nochmal.

    Edit:
    Natürlich werden Änderungen, die ich beim sortieren im OpenDialog vorgenommen habe, nicht übernommen.
    Danke auch nochmal an audacia.
    Aber wenigstens ist der "Grundzustand" des Dialogs identisch mit meiner StringList.

    Soll ich den Thread-Titel umbenennen?

    wNw



  • Nicht dafür. Freut mich das es funktioniert.

    Habe vor kurzem einen Steuerungsprozess für das Microsoft Backup Tool WBAdmin geschrieben um beliebig viele VSS Server Backups parallel auf ein Share ablegen zu können (WBAdmin kann von Haus aus ja leider nur eins auf Shares ablegen und dieses wird immer beim nächsten Backup überschrieben). Dafür habe ich dieses Vorgehen etwas modifiziert auch in einigen Routinen verwendet, teils sortiert auf Basis von Timestamps des Dateisystems. Wenn du weitere Infos haben möchtest dann schreib mich einfach an.



  • Hehe, wobei das eigentlich eher so klingt, als würdest Du gar keinen Dateiauswahldialog brauchen, sondern nur einen Verzeichnisauswahldialog. 😉 Eine Dateisortierung kannst Du dann ja in deiner Liste anbieten...



  • wNw schrieb:

    Ich habe ein Diashow Programm geschieben.
    Wenn das Programm starte, öffnet sich der OpenDialog.
    Ich wechsele in einen Ordner mit Bildern.
    Suche ein Bild aus, OpenDialog schliesst sich.
    Mit FindFirst/FindNext befülle ich eine StringList mit den Dateinamen aus dem Ordner.
    Mit IndexOf springe ich in der StringList zu der Stelle an der sich das ausgesuchte Bild befindet.

    PicIndex=Dateien->IndexOf(ExtractFileName(OpenFile->FileName));
    

    Das Bild wird dann in einem TImage angezeigt.
    Durch betätigen der hoch/runter Tasten kann ich durch die Stringlist "wandern" und es wird mir das nächste/vorherige angezeigt.

    Das klingt alles reichlich umständlich. Einerseits hast du einen Dialog, um eine Datei aus einem Verzeichnis auszuwählen, andererseits willst du danach die anderen Dateien im Verzeichnis auch noch zur Auswahl stellen. D.h., es gibt einmal die Dateiauswahl im Dialog und hinterher die Dateiauswahl im Hauptfenster, und es ist nicht klar, warum man für die erste einen Dialog braucht und für alle weiteren nicht.

    Eine Möglichkeit wäre, einen Ordnerauswahldialog zu nehmen (dann aber bitte TFileOpenDialog mit der Option fdoPickFolders ; dieser alte Win95-Ordnerauswahldialog ist das schlimmste Stück UI in ganz Windows).

    Alternativ, und das würde mir wahrscheinlich besser gefallen, baust du dein Hauptfenster mit Shell-Controls so, daß man ganz ohne Dialog in ein Verzeichnis navigieren und dort die gewünschten Bilder anklicken kann. (Etwas ähnliches findest du z.B. in Filezilla, WinRAR, 7-Zip FM oder CDBurnerXP.)



  • Das klingt alles reichlich umständlich. Einerseits hast du einen Dialog, um eine Datei aus einem Verzeichnis auszuwählen, andererseits willst du danach die anderen Dateien im Verzeichnis auch noch zur Auswahl stellen

    Nein. Es war mir wichtig die "Startdatei" der Diashow im Verzeichnis wählen zu können.(kann auch mit Datei 12 in der Liste anfangen) Und die Abfolfge sollte identisch mit der Reihenfolge im Standard Windows Datei-Requester sein. Mehr nicht. Es klappt ja jetzt alles .
    Der Knackpunkt war die Sortierung, die nicht übereinstimmte.
    Siehe TCustomSort. Beim Builder (TStringList) wird standardmässig wird nach ASCII sortiert.
    Bei Windows gelten andere Regeln.
    Aber Danke für deine Mühe.
    wNw

    Edit: Sorry für Edits. War ein langer Tag.


Anmelden zum Antworten