Seite 1 von 2

Aufruf von OpenFileRequester()

Verfasst: 12.05.2021 00:18
von Plenz
Lässt sich der OpenFileRequester() so starten, dass die angezeigten Dateien sofort nach dem Datum sortiert sind (neueste zuerst)?

Re: Aufruf von OpenFileRequester()

Verfasst: 12.05.2021 15:47
von Axolotl
Laut Hilfe gibt es keine Flags, die man der Procedure übergeben kann um die Sortierung zu beinflussen.
Eventuell kann das Selberbauen des Dialogs mit Hilfe von ExplorerListGadget und Co. weiterhelfen.
Unter Windows gibt es die Möglichkeit 'Explorer-Style Hook Procedures' zu verwenden, dann kann man über WM_INITDIALOG und WM_NOTIFY Nachrichten Einfluss auf die Dialogbox nehmen. Das habe ich aber noch nicht ausprobiert, nur kurz danach gesucht.
Wie es geht steht wohl hier. https://docs.microsoft.com/en-us/window ... alog-boxes

Re: Aufruf von OpenFileRequester()

Verfasst: 12.05.2021 19:25
von Sicro
Code von hier nehmen:
https://www.rsbasic.de/aktualisierung/w ... A4ndern.pb

Code abändern zu:

Code: Alles auswählen

Procedure HookCallback(DialogHandle.I, Msg.I, WParam.I, LParam.I)
  Protected DialogWindow.I
  Protected *NMHdr.NMHDR

  If Msg = #WM_NOTIFY
    *NMHdr = LParam

    If *NMHdr\code = #CDN_FOLDERCHANGE
      DialogWindow = FindWindowEx_(GetParent_(DialogHandle), 0, "ShellDll_DefView", 0)
     
      If DialogWindow
        #byModified   = $7605 + 1
        #byAttributes = $7608 + 1
        SendMessage_(DialogWindow, #WM_COMMAND, #OFN_VIEW_REPORT, 0)
        SendMessage_(DialogWindow, #WM_COMMAND, #ByAttributes, 0)
        SendMessage_(DialogWindow, #WM_COMMAND, #ByModified, 0)
      EndIf
    EndIf
  EndIf
EndProcedure
Warum "+1" und warum erst "ByAttributes" sortiert wird, kann hier nachgelesen werden:
https://stackoverflow.com/questions/296 ... 83#2971783

Re: Aufruf von OpenFileRequester()

Verfasst: 12.05.2021 20:18
von mk-soft
Vielleicht hat das noch keiner gemerkt. Wir sind hier in de Linux Ecke ! :)

Re: Aufruf von OpenFileRequester()

Verfasst: 12.05.2021 23:30
von Sicro
mk-soft hat geschrieben: 12.05.2021 20:18 Vielleicht hat das noch keiner gemerkt. Wir sind hier in de Linux Ecke ! :)
Da hat mich mal wieder der Spaß mit der WinAPI gepackt, dass ich das gar nicht mitbekommen habe :lol: :freak:

Unter Linux würde ich auf die Schnelle ein OpenFileRequester selber bauen. Das ist keine große Sache und erspart dir die aufwändige Arbeit mit den APIs von GTK2-, GTK3- und QT.

Wenn du ein Beispiel-Code benötigst, wären noch weitere Informationen - wie du dir den Requester vorstellst - hilfreich (z. B. ob nur Dateien angezeigt werden sollen oder auch in Verzeichnisse gewechselt werden können soll).

Re: Aufruf von OpenFileRequester()

Verfasst: 12.05.2021 23:57
von Axolotl
Jupp, hatte ich gemerkt, wollte durch meine Antwort die Linux Spezialisten 'locken'. Ich kann ja nur ein bischen 'Windows'.

Re: Aufruf von OpenFileRequester()

Verfasst: 13.05.2021 03:24
von mk-soft
Muss mal schauen ob es die möglichkeit gibt die Sortierung anzupassen.
Dafür muss aber der OpenFileRequester neue geschrieben werden.

Habe aber noch nicht gefunden (gesucht) wie die Sortierfolge geändert wird.

Code: Alles auswählen

;-TOP

; Modify by mk-soft

EnableExplicit

ImportC ""
  gtk_file_chooser_dialog_new(title.p-utf8, *parent.GtkWidget, action.i, b1.p-utf8, a1.i, b2.p-utf8, a2.i, null);
  gtk_file_filter_set_name(*filter, label.p-utf8);
  gtk_file_filter_add_pattern(*filter,pattern.p-utf8)
  gtk_file_chooser_set_current_folder(*dialog, path.p-utf8)  
EndImport


Procedure.s MyOpenFileRequester(Title.s, Path.s, Pattern.s, PatterPostion, Flags = 0)
  Protected *dialog, *filter, *mem 
  Protected r1.l 
  Protected part.s, label.s, patter.s , index
  Protected FileName.s
  
  *dialog = gtk_file_chooser_dialog_new(Title, 0, #GTK_FILE_CHOOSER_ACTION_OPEN,
                                        #GTK_STOCK_CANCEL,#GTK_RESPONSE_CANCEL,
                                        #GTK_STOCK_OPEN,#GTK_RESPONSE_ACCEPT,
                                        #Null);
  
  gtk_window_set_modal_(*dialog, #True)
  
  gtk_file_chooser_set_current_folder_(*dialog,path)
  
  Repeat
    index + 1
    part = StringField(pattern, index, ";")
    If part = ""
      Break
    EndIf
    *filter = gtk_file_filter_new_()
    label.s = StringField(part, 1, "|")
    patter.s =  StringField(part, 2, "|")
    gtk_file_filter_set_name(*filter, label)
    gtk_file_filter_add_pattern(*filter, patter)
    gtk_file_chooser_add_filter_(*dialog, *filter)
  ForEver
  
  r1 = gtk_dialog_run_(*dialog)
  If r1  = #GTK_RESPONSE_ACCEPT
    *mem = gtk_file_chooser_get_filename_(*dialog);
    filename.s = PeekS(*mem, -1, #PB_UTF8) 
    If *mem 
      g_free_(*mem);
    EndIf
  Else
    FileName = ""
  EndIf 
  
  gtk_widget_destroy_(*dialog) 
  
  ProcedureReturn FileName
  
EndProcedure

OpenWindow(0, 0, 0, 0, 0, "", #PB_Window_Invisible)

Define file.s = MyOpenFileRequester("Test", "/home", "PB-Files|*.pb;All Files|*", 0 , 0)
MessageRequester("Ifo", "Result = " + file)

Re: Aufruf von OpenFileRequester()

Verfasst: 13.05.2021 12:48
von Plenz
Unter Linux würde ich auf die Schnelle ein OpenFileRequester selber bauen.
Natürlich könnte ich das auch selbst machen. Leider ist mein Programm aber schon hart am Limit dessen, was die Testversion zulässt :cry:

Re: Aufruf von OpenFileRequester()

Verfasst: 13.05.2021 16:42
von Shardik
Plenz hat geschrieben: 12.05.2021 00:18 Lässt sich der OpenFileRequester() so starten, dass die angezeigten Dateien sofort nach dem Datum sortiert sind (neueste zuerst)?
Eigentlich ist dies in Linux so gelöst, dass man in einem FileRequester auf den Spaltentitel klickt (z.B. auf "Letzte Änderung") und fortan sind die Dateien nach dem Datum sortiert (neueste zuerst). Dies wird durch ein Dreieck mit der Spitze nach oben im Spaltenkopf angezeigt. Klickt man erneut auf den Spaltentitel, wird die Sortierreihenfolge umgekehrt (neueste zuletzt) und die Spitze des Dreiecks im Spaltenkopf zeigt dann nach unten. Dies erfolgt separat jeweils für Ordner und Dateien.

Diese Einstellung merkt sich der der FileRequester und beim nächsten Aufruf von OpenFileRequester() und sogar beim nächsten Start des Programms wird die Sortierung so eingestellt, wie der Anwender sie zuletzt eingestellt hatte.

Dies wirkt einer Bevormundung des Anwenders durch den Programmierer entgegen, denn während Du vielleicht am liebsten Ordner und Dateien nach Datum sortiert haben möchtest, möchte ein anderer Anwender vielleicht lieber eine Sortierung nach Ordner- und Dateinamen.

Re: Aufruf von OpenFileRequester()

Verfasst: 14.05.2021 00:02
von Plenz
Ich könnte durchaus damit leben, wenn es so wäre, aber das ist leider nicht der Fall. Ich wähle z.B. kurz hintereinander zwei Bilddateien aus. Manchmal sind die Dateien beim zweiten Mal so sortiert, wie ich es beim ersten Mal eingestellt habe. Aber meistens muss ich wieder zweimal auf "Datum" klicken. Jedenfalls unter Linux Mint 19.3. Und nach einem Neustart meines Programms sowieso.

Ich will ja auch niemanden bevormunden. Optimal fände ich einen Flag, der die gewünschte Sortierung automatisch auslöst.
Alternativ könnte man dem Fenster ja auch einen Tastendruck schicken, aber die Sortierung reagiert leider nicht auf Tastendrücke.