This is an old version from the tos.hyp. The new is on GitHub!

HomeAESFensterverwaltungFormularfunktionen

8.10 Fileselektoren

Die folgenden Funktionen wurden mit MagiC 4 eingeführt, und ermöglichen die Verwaltung der Dateiauswahl (Fileselektor):

fslx_close Auswahl schließen und Speicher freigeben.
fslx_do Schneller Aufruf des Fileselektors.
fslx_evnt Auswahl zur Benutzung freigeben.
fslx_getnxtfile Alle weiteren selekt. Einträge ermitteln.
fslx_open Auswahl initialisieren und öffnen.
fslx_set_flags Setzt bestimmte Flags für das ganze System.

Hinweis: Die Existenz dieser Funktionen kann per appl_getinfo (Opcode 7) festgestellt werden.

Der Hauptvorteil bei der Verwendung dieser Routinen ist darin zu sehen, daß die hier angegebenen Funktionen auch mit alternativen Dateisystemen (Stichwort: lange Dateinamen) zurechtkommen.

Querverweis:
Fileselektor als Dialog   Fileselektor im Fenster   Bedienung der Dateiauswahl

8.10.1 fslx_close

Name: »File SelectionX Close« - Auswahl schließen und Speicher freigeben.
AES-Nummer: 191
Deklaration: int16_t fslx_close ( void *fsd );
Beschreibung: Die Funktion schließt die Dateiauswahl, und gibt den angegebenen Deskriptor wieder frei. Es gilt:
Parameter Bedeutung
   
fsd Deskriptor, der beim erfolgreichen Öffnen eines Dateiauswahlfensters übergeben wurde
Ergebnis: Die Funktion liefert bei fehlerfreier Ausführung den Wert 1 zurück, anderenfalls den Wert 0.
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) festgestellt werden.
Gruppe: Fileselektoren
Querverweis: Binding   fslx_open

8.10.1.1 Bindings für fslx_close

C: int16_t fslx_close ( void *fsd );
Umsetzung:
int16_t fslx_close ( void *fsd )
{
   addr_in[0] = fsd;
   crys_if (191);

   return ( int_out[0] );
}
GEM-Arrays:

Adresse Feldelement Belegung
control control[0] 191 # Opcode der Funktion
control+2 control[1] 0 # Einträge in int_in
control+4 control[2] 1 # Einträge in int_out
control+6 control[3] 1 # Einträge in addr_in
control+8 control[4] 0 # Einträge in addr_out
addr_in addr_in[0] fsd
int_out int_out[0] Return-Wert

8.10.2 fslx_do

Name: »File SelectionX Do« - schneller Aufruf des Fileselektors.
AES-Nummer: 194
Deklaration: void *fslx_do ( int8_t *title, int8_t *path, int16_t pathlen, int8_t *fname, int16_t fnamelen, int8_t *patterns, XFSL_FILTER *filter, int8_t *paths, int16_t *sort_mode, int16_t flags, int16_t *button, int16_t *nfiles, int8_t **pattern );
Beschreibung: Die Funktion stellt eine Dateiauswahlbox auf dem Bildschirm dar, und übernimmt deren Bearbeitung. Es gilt:
Parameter Bedeutung
   
title Titel der Auswahl oder NULL
path vollständiger Pfad, welcher mit dem Laufwerk beginnt, und mit '\' endet.
pathlen Länge des aufnehmenden Pfad-Puffers.
fname Puffer für den Dateinamen.
fnamelen Länge des aufnehmenden Dateinamen-Puffers.
patterns Dateinamensmuster wie "*.TXT", "*.PRG" oder "*.IMG". Diese alternativ anwählbaren Muster sind durch EOS getrennt und durch EOS, EOS abgeschlossen.
filter Filterfunktion, die vor dem Mustervergleich aufgerufen wird (oder NULL). Gibt diese den Wert 0 zurück, so ist die Datei ungültig; bei einem Wert von 1 wird der Dateiname angezeigt.
paths Pfad-History. Die alternativ anwählbaren Pfade sind durch EOS getrennt, und durch EOS, EOS abgeschlossen.
sort_mode Sortiermodus für die Anzeige
0 = nach Namen
1 = nach Datum
2 = nach Größe
3 = nach Typ
4 = unsortiert (physik. Reihenfolge)
flags verschiedene Einstellungen
1 = DOSMODE. Dies ist der Kompatibilitätsmodus, der auch von fsel_(ex)input verwendet wird, und Dateinamen grundsätzlich im Format 8+3 liefert. Dazu werden alle Unterverzeichnissse per Dopendir (name, 1) aufgerufen.
2 = symbolische Links nicht verfolgen. In diesem Fall gehören also Datum, Uhrzeit sowie die XATTR-Struktur, die filter übergeben wird, zum Link selbst.
8 = Mehrfachauswahl. In diesem Fall können mehrere Dateien auf einmal ausgewählt und übergeben werden.
button Nummer des ausgewählten Buttons
0 = Abbruch-Button
1 = Ok-Button
nfiles Anzahl der ausgewählten Dateien
pattern ausgewähltes Dateinamensmuster wie "*.TXT"


Hinweis: Die Funktion ist eine Kombination aus fslx_open und fslx_evnt, benutzt aber eine Dialogbox ohne Fenster.
Ergebnis: Die Funktion liefert einen Zeiger auf einen Deskriptor zurück, der bei den anderen Routinen anzugeben ist.
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) festgestellt werden.
Gruppe: Fileselektoren
Querverweis: Binding   fslx_open   fslx_evnt

8.10.2.1 Bindings für fslx_do

C: void *fslx_do ( int8_t *title, int8_t *path, int16_t pathlen, int8_t *fname, int16_t fnamelen, int8_t *patterns, XFSL_FILTER *filter, int8_t *paths, int16_t *sort_mode, int16_t flags, int16_t *button, int16_t *nfiles, int8_t **pattern );
Umsetzung:
void *fslx_do ( int8_t *title, int8_t *path, int16_t pathlen,
                int8_t *fname, int16_t fnamelen, int8_t *patterns,
                XFSL_FILTER *filter, int8_t *paths,
                int16_t *sort_mode, int16_t flags, int16_t *button,
                int16_t *nfiles, int8_t **pattern )
{
   addr_in[0] = title;
   addr_in[1] = path;
   addr_in[2] = fname;
   addr_in[3] = patterns;
   addr_in[4] = filter;
   addr_in[5] = paths;

   int_in[0] = pathlen;
   int_in[1] = fnamelen;
   int_in[2] = *sort_mode;
   int_in[3] = flags;

   crys_if (194);

   *button    = int_out[1];
   *nfiles    = int_out[2];
   *sort_mode = int_out[3];
   *pattern   = addr_out[1];

   return ( (void *) addr_out[0] );
}
GEM-Arrays:

Adresse Feldelement Belegung
control control[0] 194 # Opcode der Funktion
control+2 control[1] 4 # Einträge in int_in
control+4 control[2] 4 # Einträge in int_out
control+6 control[3] 6 # Einträge in addr_in
control+8 control[4] 2 # Einträge in addr_out
addr_in addr_in[0] title
addr_in+4 addr_in[1] path
addr_in+8 addr_in[2] fname
addr_in+12 addr_in[3] patterns
addr_in+16 addr_in[4] filter
addr_in+20 addr_in[5] paths
int_in int_in[0] pathlen
int_in+2 int_in[1] fnamelen
int_in+4 int_in[2] sort_mode
int_in+6 int_in[3] flags
addr_out addr_out[0] Return-Wert
addr_out+4 addr_out[1] pattern
int_out int_out[0] 1
int_out+2 int_out[1] button
int_out+4 int_out[2] nfiles
int_out+6 int_out[3] sort_mode

8.10.3 fslx_evnt

Name: »File SelectionX Event« - übernimmt die Bearbeitung der Dateiauswahl.
AES-Nummer: 193
Deklaration: int16_t fslx_evnt ( void *fsd, EVNT *events, int8_t *path, int8_t *fname, int16_t *button, int16_t *nfiles, int16_t *sort_mode, int8_t **pattern );
Beschreibung: Die Funktion übernimmt die Bearbeitung einer auf dem Bildschirm dargestellten Dateiauswahl. Es gilt:
Parameter Bedeutung
   
fsd Deskriptor, der beim Öffnen der Auswahl zurückgeliefert wurde.
events EVNT-Struktur. Die Ereignisse werden von der Auswahl bearbeitet, wenn sie für das entsprechende Fenster bestimmt sind.
path Zeiger auf den ausgewählten Pfad.
fname Zeiger auf den ausgewählten Dateipfad.
button Nummer des ausgewählten Buttons
0 = Abbruch-Button
1 = Ok-Button
nfiles Anzahl der ausgewählten Dateien.
sort_mode ausgewählter Sortiermodus.
pattern ausgewähltes Dateinamensmuster wie "*.TXT"


Hinweis: Ereignisse werden zunächst an die Dateiauswahl übermittelt, und von dieser dann ggfs. verarbeitet. Sobald ein Ereignis bearbeitet wurde, wird das entsprechende Bit in der EVNT-Struktur gelöscht.
Ergebnis: Die Funktion liefert den Wert 0, wenn der Dialog beendet werden soll und anderenfalls den Wert 1.
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) festgestellt werden.
Gruppe: Fileselektoren
Querverweis: Binding

8.10.3.1 Bindings für fslx_evnt

C: int16_t fslx_evnt ( void *fsd, EVNT *events, int8_t *path, int8_t *fname, int16_t *button, int16_t *nfiles, int16_t *sort_mode, int8_t **pattern );
Umsetzung:
int16_t fslx_evnt ( void *fsd, EVNT *events, int8_t *path,
                    int8_t *fname, int16_t *button, int16_t *nfiles,
                    int16_t *sort_mode, int8_t **pattern )
{
   addr_in[0] = fsd;
   addr_in[1] = events;
   addr_in[2] = path;
   addr_in[3] = fname;

   crys_if (193);

   *button    = int_out[1];
   *nfiles    = int_out[2];
   *sort_mode = int_out[3];
   *pattern   = addr_out[0];

   return ( int_out[0] );
}
GEM-Arrays:

Adresse Feldelement Belegung
control control[0] 193 # Opcode der Funktion
control+2 control[1] 0 # Einträge in int_in
control+4 control[2] 4 # Einträge in int_out
control+6 control[3] 4 # Einträge in addr_in
control+8 control[4] 1 # Einträge in addr_out
addr_in addr_in[0] fsd
addr_in+4 addr_in[1] events
addr_in+8 addr_in[2] path
addr_in+12 addr_in[3] fname
addr_out addr_out[0] pattern
int_out int_out[0] Return-Wert
int_out+2 int_out[1] button
int_out+4 int_out[2] nfiles
int_out+6 int_out[3] sort_mode

8.10.4 fslx_getnxtfile

Name: »File SelectionX GetNextFile« - ermittelt alle weiteren selektierten Einträge der Dateiauswahl.
AES-Nummer: 192
Deklaration: int16_t fslx_getnxtfile ( void *fsd, int8_t *fname );
Beschreibung: Die Funktion ermittelt alle weiteren, selektierten Einträge der Dateiauswahl. Es gilt:
Parameter Bedeutung
   
fsd Deskriptor, der beim Öffnen der Auswahl zurückgeliefert wurde
fname Name des ermittelten Eintrags


Hinweis: Wurde das Flag GETMULTI bei fslx_do oder fslx_open übergeben, wird durch fslx_do bzw. fslx_evnt im Parameter nfiles die Anzahl der Dateien zurückgegeben, die zusätzlich zu dem in fname zurückgegebenen noch selektiert sind. Man kann die weiteren Dateien mit fslx_getnxtfile abrufen. Erst danach darf man fslx_close aufrufen.
Ergebnis: Die Funktion liefert den Wert 0, wenn keine weitere Datei ausgewählt ist, bzw. den Wert 1, falls noch ein Dateiname kopiert wurde.
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) festgestellt werden.
Gruppe: Fileselektoren
Querverweis: Binding   fslx_open   fslx_close

8.10.4.1 Bindings für fslx_getnxtfile

C: int16_t fslx_getnxtfile ( void *fsd, int8_t *fname );
Umsetzung:
int16_t fslx_getnxtfile ( void *fsd, int8_t *fname )
{
   addr_in[0] = fsd;
   addr_in[1] = fname;

   crys_if (192);

   return ( int_out[0] );
}
GEM-Arrays:

Adresse Feldelement Belegung
control control[0] 192 # Opcode der Funktion
control+2 control[1] 0 # Einträge in int_in
control+4 control[2] 1 # Einträge in int_out
control+6 control[3] 2 # Einträge in addr_in
control+8 control[4] 0 # Einträge in addr_out
addr_in addr_in[0] fsd
addr_in+4 addr_in[1] fname
int_out int_out[0] Return-Wert

8.10.5 fslx_open

Name: »File SelectionX Open« - initialisiert und öffnet die Dateiauswahl.
AES-Nummer: 190
Deklaration: void *fslx_open ( int8_t *title, int16_t x, int16_t y, int16_t *whdl, int8_t *path, int16_t pathlen, int8_t *fname, int16_t fnamelen, int8_t *patterns, XFSL_FILTER *filter, int8_t *paths, int16_t sort_mode, int16_t flags );
Beschreibung: Die Funktion initialisiert und öffnet die Dateiauswahlbox. Es gilt:
Parameter Bedeutung
   
title Fenstertitel der Auswahl oder NULL
x x-Koordinate
y y-Koordinate der linken oberen Ecke des Fensters. Falls diese den Wert -1 besitzen, so wird das Fenster zentriert dargestellt.
whdl Fensterkennung nach erfolgreichem Öffnen.
path vollständiger Pfad, welcher mit dem Laufwerk beginnt, und mit '\' endet.
Seit MagiC 6.10 darf der Pfad, wie beifsel_xxx(), unvollständig initialisiert werden, z.B. als Leer-String. MagiC komplettiert dann den Pfad sinnvoll.
pathlen Länge des aufnehmenden Pfad-Puffers.
fname Puffer für den Dateinamen.
fnamelen Länge des aufnehmenden Dateinamen-Puffers.
patterns Dateinamensmuster wie "*.TXT", "*.PRG" oder "*.IMG". Diese alternativ anwählbaren Muster sind durch EOS getrennt und durch EOS,EOS abgeschlossen.
Seit MagiC 6.10 darf hier ein Nullzeigerübergeben werden, MagiC verwendet dann "*\0".
filter Filterfunktion, die vor dem Mustervergleich aufgerufen wird (oder NULL). Gibt diese den Wert 0 zurück, so ist die Datei ungültig; bei einem Wert von 1 wird der Dateiname angezeigt.
paths Pfad-History. Die alternativ anwählbaren Pfade sind durch EOS getrennt, und durch EOS,EOS abgeschlossen.
sort_mode Sortiermodus für die Anzeige
SORTBYNAME (0) = nach Namen
SORTBYDATE (1) = nach Datum
SORTBYSIZE (2) = nach Größe
SORTBYTYPE (3) = nach Typ
SORTBYNONE (4) = unsortiert (physik. Reihenfolge)
SORTDEFAULT (-1) = default

SORTDEFAULT existiert seit MagiC 6.10 und bedeutet, daß der im System gespeicherte Sortiermodus verwendet wird.
flags verschiedene Einstellungen
1 = (DOSMODE) Dies ist der Kompatibilitätsmodus, der auch von fsel_(ex)input verwendet wird, und Dateinamen grundsätzlich im Format 8+3 liefert. Dazu werden alle Unterverzeichnissse per Dopendir (DOPEN_COMPAT) aufgerufen.
2 = (NFOLLOWSLKS) symbolische Links nicht verfolgen. In diesem Fall gehören also Datum, Uhrzeit sowie die XATTR-Struktur, die filter übergeben wird, zum Link selbst.
8 = Ist GETMULTI gesetzt, können mehrere Dateien auf einmal ausgewählt und übergeben werden. Dazu wird fslx_getnxtfile verwendet, wenn fslx_evnt bzw. fslx_do im Parameter nfiles signalisieren, daß noch weitere Dateien selektiert sind.
Ergebnis: Die Funktion liefert einen Deskriptor für die weiteren Aktionen, bzw. den Wert NULL, wenn ein Fehler aufgetreten ist.
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) festgestellt werden.
Gruppe: Fileselektoren
Querverweis: Binding   fslx_close

8.10.5.1 Bindings für fslx_open

C: void *fslx_open ( int8_t *title, int16_t x, int16_t y, int16_t *whdl, int8_t *path, int16_t pathlen, int8_t *fname, int16_t fnamelen, int8_t *patterns, XFSL_FILTER *filter, int8_t *paths, int16_t sort_mode, int16_t flags );
Umsetzung:
void *fslx_open ( int8_t *title, int16_t x, int16_t y, int16_t *whdl,
                  int8_t *path, int16_t pathlen, int8_t *fname,
                  int16_t fnamelen, int8_t *patterns,
                  XFSL_FILTER *filter, int8_t *paths,
                  int16_t sort_mode, int16_t flags )
{
   addr_in[0] = title;
   addr_in[1] = path;
   addr_in[2] = fname;
   addr_in[3] = patterns;
   addr_in[4] = filter;
   addr_in[5] = paths;

   int_in[0] = x;
   int_in[1] = y;
   int_in[2] = pathlen;
   int_in[3] = fnamelen;
   int_in[4] = sort_mode;
   int_in[5] = flags;

   crys_if (190);

   *whdl = int_out[0];
   return ( (void *) addr_out[0] );
}
GEM-Arrays:

Adresse Feldelement Belegung
control control[0] 190 # Opcode der Funktion
control+2 control[1] 6 # Einträge in int_in
control+4 control[2] 1 # Einträge in int_out
control+6 control[3] 6 # Einträge in addr_in
control+8 control[4] 1 # Einträge in addr_out
addr_in addr_in[0] title
addr_in+4 addr_in[1] path
addr_in+8 addr_in[2] fname
addr_in+12 addr_in[3] patterns
addr_in+16 addr_in[4] filter
addr_in+20 addr_in[5] paths
int_in int_in[0] x
int_in+2 int_in[1] y
int_in+4 int_in[2] pathlen
int_in+6 int_in[3] fnamelen
int_in+8 int_in[4] sort_mode
int_in+10 int_in[5] flags
addr_out addr_out[0] Return-Wert
int_out int_out[0] whdl

8.10.6 fslx_set_flags

Name: »File SelectionX SetFlags« - setzt bestimmte Flags der Dateiauswahl für das ganze System.
AES-Nummer: 195
Deklaration: int16_t fslx_set_flags ( int16_t flags, int16_t *oldval );
Beschreibung: Die Funktion setzt bestimmte Flags der Dateiauswahlbox für das ganze System. Es gilt:
Parameter Bedeutung
   
flags verschiedene Flags
1 = Format 8+3: Dies gilt nur für die Darstellung von Verzeichnissen auf DOS-Laufwerken. Entspricht dem Schalter "TOS-Dateien als 8+3" in MagXDesk.
oldval vorheriger Wert
Ergebnis: Die Funktion liefert im Fehlerfall den Wert 0, und den Wert 1 bei fehlerfreier Ausführung.
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) festgestellt werden.
Gruppe: Fileselektoren
Querverweis: Binding   fslx_open   fslx_close

8.10.6.1 Bindings für fslx_set_flags

C: int16_t fslx_set_flags ( int16_t flags, int16_t *oldval );
Umsetzung:
int16_t fslx_set_flags ( int16_t flags, int16_t *oldval )
{
   int_in[0] = 0;
   int_in[1] = flags;

   crys_if (195);

   *oldval = int_out[1];
   return ( int_out[0] );
}
GEM-Arrays:

Adresse Feldelement Belegung
control control[0] 195 # Opcode der Funktion
control+2 control[1] 2 # Einträge in int_in
control+4 control[2] 2 # Einträge in int_out
control+6 control[3] 0 # Einträge in addr_in
control+8 control[4] 0 # Einträge in addr_out
int_in int_in[0] 0
int_in+2 int_in[1] flags
int_out int_out[0] Return-Wert
int_out+2 int_out[1] oldval

8.10.7 Die Bedienung des File-Selektors ab MagiC 4

MagiC stellt ab Version 4.0 eine eigene Dateiauswahlbox zur Verfügung, die neben der Unterstützung von langen Dateinamen auch einiges an Bedienungskomfort bietet, welcher sonst nur von alternativen Selektoren bekannt war. Die folgende Tabelle gibt eine Übersicht über die wichtigsten Shortcuts:

Tasten-Kombination Funktion
   
Return Keine Datei ausgewählt: Gibt den Text im Editfeld an das Programm zurück.
Datei ausgewählt: Gibt ausgewählte Datei zurück.
Ordner ausgewählt: Öffnet den Ordner.
Alt-A..Z Öffnet das jeweilige Laufwerk im aktuellen Verzeichnis.
Ctrl-Esc Verzeichnis neu einlesen
Ctrl-Backspace oder
Ctrl-H Geht eine Verzeichnisebene zurück.
Ctrl-D Deselektiert alle Einträge. Damit kann man erzwingen, daß der eingegebene Dateiname statt der selektierten Datei zurückgegeben wird.
Cursor up,down Auswahl verschieben
Ctrl-Cursor up,down scrollen
Sh-Cursor up,down Auswahl seitenweise verschieben
Sh-Ctrl-Cursor up,down seitenweise scrollen
Home selektiert oberstes Element
Sh-Home selektiert unterstes Element

Auch bei der Bedienung der Buttons gibt es einiges zu beachten: Ein Doppelklick auf das 'parent'-Feld geht zurück aufs Wurzelverzeichnis. Ein Klick auf eine Zeile selektiert das entsprechende Objekt. Für den Fall, daß mehrere Dateien auswählbar sind (dies ist durch den Systemaufruf beeinflußbar), werden diese durch Shift-Klick ausgewählt. In jedem Fall kann man eine Datei mit Shift-Klick deselektieren.

Zu beachten ist ferner:

Querverweis: Tastaturbelegung

8.10.8 Fileselektor als Dialog

fsel = fslx_do(..., &button, &nfiles, ...);

if (fsel) /* war der Selektor offen? */
{
   if (button)
   {
      while (--nfiles) /* mehrere Files? */
         fslx_getnxtfile(...);   /* alle abholen */
   }

   fslx_close(fsel); /* alles wieder freigeben */
}

8.10.9 Fileselektor im Fenster

fsel = fslx_open(...);
if (fsel)
{
   do {
      evnt.mwhich = evnt_multi(...);
      rv = fslx_evnt(fsel, &evnt, ..., &nfiles, ...);

      /* Bits für eigene Fenster/Menüs auswerten */
   } while (rv);

   while (--nfiles) fslx_getnxtfile(...);
   fslx_close(fsel);
}

HomeAESFensterverwaltungFormularfunktionen