Benutzer-Werkzeuge

Webseiten-Werkzeuge


k13:k13.3:k13.3.2:start

13.3.2 Dynamisches Menü

Die Entwicklungsumgebung (IDE) von Gambas setzt in der Menüleiste unter 'Datei' im Menü 'Zuletzt geöffnet' eine Menüliste aus k Menüs ein, die sich zur Laufzeit der Entwicklungsumgebung dynamisch ändert. Die Liste kann leer sein oder Einträge enthalten, deren Anzahl jedoch begrenzt ist. Ein Menü mit derartigen Eigenschaften nennt man dynamisches Menü.

IDE Gambas

Abbildung 13.3.2.1: Menü mit Menüliste in der IDE von Gambas

Die Planung des Einsatzes eines dynamischen Menüs erfordert u.a eindeutige Antworten auf die folgenden Fragen:

(F1) Welches Menü in der Menüstruktur soll mit einem dynamischen Menü ausgestattet werden?
(F2) Was wird in der Menüliste – am Zeichen > erkennbar – gespeichert werden?
(F3) In welcher Form sollen die Einträge in der Menüliste des bei (F1) ausgewählten Menüs gespeichert werden?
(F4) Wird das ausgewählte Menü nicht angezeigt oder nur deaktiviert, wenn die Menüliste leer ist?
(F5) Wie viel Einträge soll die Menüliste maximal aufnehmen?
(F6) Sollen die Einträge in der Menüliste sortiert werden?

13.3.2.1 Vorüberlegungen zum dynamischen Menü

Die o.a. 6 Fragen werden im folgenden Projekt DynMenu projektbezogen beantwortet:

MenüListe

Abbildung 13.3.2.1.1: Menü mit Menüliste (Projekt DynMenu)

  • Dem Menü mit der Beschriftung 'Zuletzt geöffnete Tabelle' soll eine Menüliste zugeordnet werden, die sich dynamisch ändert. Als Name des Menüs ist mnuLastFiles vorgesehen. Dieses Menü wird wie alle anderen Menüs der Menüleiste im Menü-Editor angelegt.
  • In der Menüliste werden maximal 5 Menüs stehen. Sie tragen als Beschriftung die Dateinamen, die aus den Pfaden der zuletzt geöffneten Tabellendateien extrahiert werden. Alle Menüs in der Liste haben den gleichen Objekt-Namen und den gleichen Event-Namen und werden dynamisch erzeugt.
  • Extern werden die Pfade der zuletzt geöffneten Tabellendateien in einer Datei lastfiles.conf gespeichert. Das Speichern und Auslesen der maximal 5 Einträge in der Menüliste des bei (F1) ausgewählten Menüs übernehmen Methoden eines Settings-Objekts.
  • Intern werden die Pfade der zuletzt geöffneten Tabellendateien in einem Array gespeichert und ein weiteres Array nimmt synchron dazu nur die Dateinamen der zuletzt geöffneten Tabellendateien auf.
  • Wenn die Menüliste leer ist – und das ist sie beim ersten Programmstart garantiert – dann wird das Menü mit der Beschriftung 'Zuletzt geöffnete Tabelle' nicht angezeigt.

Programmstart

  • Die Menüliste soll maximal 5 Menüs aufnehmen.
  • Die Einträge in der Menüliste werden nicht sortiert angezeigt, weil man dann nicht mehr den Namen der Tabellendatei erkennen kann, die zuletzt geöffnet wurde. Nur die Reihenfolge beim Öffnen bestimmt die Rangfolge in der Menüliste.
  • In der Menüliste für das dynamische Menü finden Sie maximal 5 Menüs mit den Namen der zuletzt geöffneten Tabellendateien als Beschriftung. Ob die geöffnete Datei auch konvertiert – also bearbeitet worden ist – kann nicht garantiert werden. Da aber für jede bearbeitete Datei eine Sicherheitskopie mit dem originalen Dateinamen, jedoch der Extension .bak angelegt wird, wäre das Ausgangspunkt von Überlegungen für Programmerweiterungen.

13.3.2.2 Projekt DynMenu

In einem Projekt werden die im Abschnitt 13.3.2.1 beschriebenen Vorüberlegungen beim Einsatz eines dynamischen Menüs umgesetzt. Dieses Programm ist seit Beginn der ersten Veröffentlichungen von Kapiteln des Online-Buches auf gambas-buch.de bei den Autoren im Einsatz, wenn umfangreiche Tabellen aus einem Dokument – geschrieben mit LibreOffice Writer – in das DokuWiki-Format konvertiert werden müssen.

13.3.2.3 Quelltext Modul MS.module

Die Prozeduren, die eine Instanz der Settings-Klasse anlegen und das Settings-Objekt konfigurieren sowie das Auslesen und das Speichern der Pfade der zuletzt geöffneten Tabellendateien realisieren, sind in ein Modul MS.module ausgelagert.

[1] ' Gambas module file
[2] ' MS = Module & Settings
[3] 
[4] Private hFile As File
[5] Public pSettings As Settings
[6] Public Matrix As New String[]
[7] Public ShortMatrix As New String[]
[8] Public Const iLastNumber As Integer = 5
[9] 
[10] Public Sub Init()
[11]   Dim sSettingsPath, sSlotName, sSettingsFileName As String
[12]   
[13]   sSlotName = "LastFiles"
[14]   sSettingsPath = Application.Path &/ sSlotName
[15]   sSettingsFileName = "lastfiles.conf"
[16]   
[17]   If Not Exist(sSettingsPath) Then 
[18]      Mkdir sSettingsPath
[19]   Endif 
[20]   If Not Exist(sSettingsPath &/ sSettingsFileName) Then 
[21]      hFile = Open (sSettingsPath &/ sSettingsFileName) For Create
[22]      hFile.Close
[23]   Endif ' Not Exist(..)
[24] 
[25] ' Ein Settings-Objekt erblickt das Licht im Speicher ...
[26]   pSettings = New Settings(sSettingsPath &/ sSettingsFileName, "Dateiliste")
[27]   
[28] End ' Init()
[29] 
[30] Public Sub GetLastListFromSettings()
[31]   Dim iCount As Integer
[32]    
[33]   pSettings.Reload() ' optional
[34]   Matrix.Clear
[35]   ShortMatrix.Clear
[36]   iCount = 0 
[37]   
[38]   While pSettings["FileList" & "/File" & Str(iCount)] <> Null
[39]     If Exist(pSettings["FileList" & "/File" & Str(iCount)]) Then ' Existiert diese Datei?
[40]        Matrix.Add(pSettings["FileList" & "/File" & Str(iCount)]) ' Datei-Pfad in Matrix speichern
[41]      ' Datei-Name in ShortMatrix speichern
[42]        ShortMatrix.Add(File.Name(pSettings["FileList" & "/File" & Str(iCount)])) 
[43]     Endif ' File.Exist?
[44]     Inc iCount
[45]   Wend ' <> NULL
[46] 
[47] End ' GetLastListFromSettings()
[48] 
[49] Public Sub SetLastListToSettings()
[50]   Dim iCount As Integer
[51]   
[52]   pSettings.Clear
[53]     For iCount = 0 To Matrix.Max
[54]         pSettings[sSlotName & "/File" & Str(iCount)] = Matrix[iCount]
[55]       ' Die maximal 5 Schlüssel-Wert-Paare unter dem Slot "LastFiles" werden generiert
[56]     Next ' iCount
[57]   pSettings.Save ' Update der Konfigurationsdatei 'lastfiles.conf'
[58] 
[59] End ' SetLastListToSettings()

13.3.2.4 Quelltext FMain.class

Das vollständige Projekt finden Sie im Downloadbereich. Hier wird der Quelltext – gespeichert in der Datei FMain.class – nur in Auszügen wiedergegeben und kommentiert:

[1] ' Gambas class file
[2] 
[3] Public fFile As File
[4] Public sCurrentFilePath As String
[5] 
[6] Public Sub Form_Open()  
[7]   
[8]   FMain.Center
[9]   FMain.Resizable = False    
[10]   mnu1ConvertTable.Enabled = False
[11]   mnu1SaveTable.Enabled = False
[12]   mnu2CenteredTable.Checked = False  
[13]   btnReset.Enabled = False
[14] 
[15]   MS.Init()
[16]   MS.GetLastListFromSettings()
[17]   UpdateMenu()
[18]   
[19] End ' Form_Open()
[20] 
[21] Public Sub UpdateMenu()
[22]   Dim MenuItem As Menu
[23]   Dim sFileName As String
[24] 
[25]   mnu1LastFiles.Children.Clear ' Alle alten Einträge in der Menüliste von mnu1LastFiles löschen
[26]   If MS.ShortMatrix.Count = 0 Then ' Wenn die Menüliste leer ist ...
[27]      mnu1LastFiles.Visible = False ' dann ist das Menü 'mnu1LastFiles' nicht sichtbar
[28]   Else
[29]    ' MenüListe für das Menü 'mnu1LastFiles' erzeugen
[30]      For Each sFileName In MS.ShortMatrix
[31]          MenuItem = New Menu(mnu1LastFiles) As "mnuLast" ' EventName ist 'mnuLast'!
[32]          MenuItem.Text =  sFileName
[33]          MenuItem.Picture = Picture["icon:/16/insert-text"]
[34]      Next ' sFileName
[35]   Endif ' MS.ShortMatrix.Count = 0? 
[36]   
[37] End ' UpdateMenu
[38] 
[39] Public Sub mnuLast_Click()
[40]   Dim iIndex As Integer
[41]   
[42]   If MS.ShortMatrix.Find(Last.Text) <> -1 Then
[43]      iIndex = MS.ShortMatrix.Find(Last.Text)
[44]      sCurrentFilePath = MS.Matrix[iIndex]
[45]    ' Alternative: sCurrentFilePath = MS.Matrix[MS.ShortMatrix.Find(Last.Text)]
[46]      fFile = Open sCurrentFilePath For Input 
[47]      Reset()
[48]      mnu1ConvertTable.Enabled = True
[49]      ShowTable()
[50]   Endif ' Find?
[51]   
[52] End ' mnu1Last_Click
[53] 
[54] Public Function OpenTable() As Boolean
[55]  
[56]  Dialog.Title = "Importieren Sie eine Tabellen-Text-Datei!"
[57]  Dialog.Filter = ["*.txt", "Text-Dateien"]
[58]  
[59]  If Dialog.OpenFile(False) = True Then ' Multiselect = False (Standard)
[60]     Message.Info("Das Öffnen der Tabellen-Datei wurde abgebrochen!")
[61]     Return False ' Cancel-Button gedrückt
[62]  Else 
[63]    fFile = Open Dialog.Path For Input 
[64]    If Lof(fFile) = 0 Then 
[65]       Message.Info("Die Text-Datei ist leer!")
[66]       fFile.Close
[67]       Return False
[68]    Endif ' Lof(fFile) = 0?
[69]  Endif ' Dialog.OpenFile(False) = True
[70]     
[71]  sCurrentFilePath = Dialog.Path ' Der Variablen 'sCurrentFilePath' wird der DialogPfad zugewiesen
[72]  
[73]   If Not MS.Matrix.Exist(Dialog.Path) Then ' Gibt es diese Datei nicht in der Matrix ...
[74]      If MS.Matrix.Count = MS.iLastNumber Then ' und sind schon 5 Elemente im Array Matrix, 
[75]      MS.Matrix.Remove(0) ' dann das 1. Element im Array Matrix löschen   
[76]         MS.ShortMatrix.Remove(0) ' sowie das 1. Element im Array ShortMatrix löschen.
[77]      Endif ' MS.Matrix.Count = MS.iLastNumber?
[78]      MS.Matrix.Add(Dialog.Path) ' Datei-Pfad wird am Ende vom Array 'Matrix' eingefügt
[79]      MS.ShortMatrix.Add(File.Name(Dialog.Path)) ' Datei-Name wird am Ende von 'ShortMatrix' eingefügt
[80]      UpdateMenu() ' Die Menüliste wird erneuert
[81]   Endif ' Matrix.Exist?
[82]   Wait
[83]   Reset()
[84]   mnu1ConvertTable.Enabled = True
[85]   Return True
[86] 
[87] End ' OpenTable()
[88] 
[89] ...
[90] 
[91] Public Sub Form_Close()  
[92]   MS.SetLastListToSettings()
[93]   Try fFile.Close
[94] End ' Form_Close

Ergänzende Kommentare:

  • In den Zeilen 15 bis 17 wird ein Settings-Objekt instanziiert, mit dessen Methoden die in der Konfigurationsdatei lastfiles.conf unter dem Slot LastFiles gespeicherten Schlüssel-Wert-Paare (Key-Value-Pairs) ausgelesen werden und als Elemente (Tabellendatei-Pfad) im Array Matrix gespeichert werden. Im Array ShortMatrix werden nur die korrespondierenden Dateinamen gespeichert. Anschließend wird aus dem Inhalt des Arrays ShortMatrix die Menüliste für das Menü mnu1LastFiles generiert. Ist diese Liste leer, dann ist das Menü mnu1LastFiles nicht sichtbar.
  • In der Prozedur mnuLast_Click in den Zeilen 39 bis 50 wird das Last-Objekt eingesetzt, um über dessen Eigenschaft Last.Text zu ermitteln, welches Menü in der Menüliste des dynamischen Menüs mnu1LastFiles angeklickt worden ist. Wichtig ist hier die Bestimmung der Position im Array 'ShortMatrix' an der Dateiname steht, der ja als Beschriftung der einzelnen Menüs in der Menüliste dient und in der Eigenschaft Last.Text zur Verfügung steht. Mit dem Wert des Indexes wird der Datei-Pfad aus dem Array Matrix ausgelesen, der zu dem angezeigten Dateinamen gehört und zum aktuellen Dateipfad erklärt. Dann wird die entsprechende Datei geöffnet, ihr Inhalt ausgelesen und in der oberen TextArea angezeigt.
  • Die Funktion OpenTable() in den Zeilen 54 bis 87 ist bereits hinreichend kommentiert. Im Dateiauswahl-Dialog werden durch die Filtereinstellung nur Textdateien angezeigt. Innerhalb der Funktion wird in der Zeile 80 die Prozedur UpDateMenu() aufgerufen, die dafür sorgt, das die Menüliste des dynamischen Menüs erneuert wird.
  • Wenn das Programm beendet wird, dann wird die Liste der zuletzt geöffneten Tabellendateien – gespeichert im Array Matrix – in der Konfigurationsdatei lastfiles.conf unter dem Slot LastFiles gespeichert (Zeile 92). Somit steht die Liste beim nächsten Programmstart zur Verfügung. Bitte beachten Sie: Wenn von den maximal 5 Tabellendateien, die zuletzt geöffnet wurden, einige vor dem nächsten Programmstart gelöscht, verschoben oder umbenannt worden sind, dann sorgen die folgenden Zeilen aus dem Quelltext der Prozedur GetLastListFromSettings() für die korrekte Menüliste.

Ausschnitt aus dem Quelltext der Prozedur GetLastListFromSettings():

[1] While pSettings["FileList" & "/File" & Str(icount)] <> Null
[2]     If Exist(pSettings["FileList" & "/File" & Str(icount)]) Then ' Existiert diese Datei?
[3]        Matrix.Add(pSettings["FileList" & "/File" & Str(icount)]) ' Datei-Pfad in Matrix speichern
[4]      ' Datei-Name in ShortMatrix speichern
[5]        ShortMatrix.Add(File.Name(pSettings["FileList" & "/File" & Str(icount)])) 
[6]     Endif ' File.Exist?
[7]     Inc icount
[8]   Wend ' <> NULL

Das ist der Inhalt der Konfigurationsdatei lastfiles.conf zu einem bestimmten Zeitpunkt:

# Dateiliste 
[FileList] 
File0="/home/hans/k12.3.4_tab.txt" 
File1="/home/hans/k22.3.2_tab.txt" 
File2="/home/hans/k3.7_tab.txt" 

13.3.2.5 Download

Die Website verwendet zwei temporäre Session-Cookies. Diese technisch notwendigen Cookies werden gelöscht, wenn der Web-Browser geschlossen wird! Informationen zu Cookies erhalten Sie in der Datenschutzerklärung.
k13/k13.3/k13.3.2/start.txt · Zuletzt geändert: 20.06.2016 (Externe Bearbeitung)

Seiten-Werkzeuge