Hi,
ganz einfach geht es z.B. indem man sich in seiner Anwendung ein Array mit den zuletzt geöffneten Dateinamen behält und dieses in eine INI Datei sichert. Dann muss man nur noch einen Menüeintrag mit dem Index 0 auf dem Form plazieren. Mit diesem kann man dann später beliebig viele weitere Menüeinträge laden und diesen dann entsprechend des DateiArrays benennen.
Zum Testen kannst Du Dir einfach diesen Code in ein Form kopieren, dann brauchst Du noch einen Menüeintrag zum öffnen von Dateien "mnuOpen", ein MS CommonDialog Controll und einen Menüeintrag mit dem Namen mnuFileHistory und dem Index 0
Option Explicit
' Array aller zuletzt geöffneten Dateien
Private saLastFiles() As String
' Name der Datei, in die das Array gespeichert werden soll
Private sHistoryFile As String
' Maximale Anzahl an Dateien, die sich die Anwendung merken soll ist derzeit = 4
Private Const FILEHISTORYMAX As Long = 4
' API
Private Declare Function GetPrivateProfileString Lib "kernel32" _
Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, _
ByVal lpKeyName As Any, ByVal lpDefault As String, _
ByVal lpReturnedString As String, ByVal nSize As Long, _
ByVal lpFileName As String) As Long
Private Declare Function WritePrivateProfileString Lib "kernel32" _
Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, _
ByVal lpKeyName As Any, ByVal lpString As Any, _
ByVal lpFileName As String) As Long
Private Sub Form_Load()
' Namen der History Datei festlegen
sHistoryFile = App.Path & "" & App.EXEName & ".Dat"
' FileHistory laden
Call FileHistory
End Sub
Private Sub mnuFileHistory_Click(Index As Integer)
OpenFile saLastFiles(Index)
End Sub
Private Sub mnuOpen_Click()
cdlMain.InitDir = App.Path
cdlMain.ShowOpen
If cdlMain.FileName <> "" Then
Call OpenFile(cdlMain.FileName)
' Neue Datei geöffnet, also auch im Menü so anzeigen
Call FileHistory(cdlMain.FileName)
End If
End Sub
Private Sub OpenFile(sFileName As String)
' Die Datei öffnen
End Sub
Private Function FileHistory(Optional sFileName As String)
Dim i As Long
Dim lLength As Long
Dim sReturn As String * 8096
If sFileName = "" Then
' Dateihistorie im Menü laden (da kein Dateiname übergeben wurde)
ReDim saLastFiles(FILEHISTORYMAX)
For i = 0 To FILEHISTORYMAX - 1
' Liste aller Dateinamen laden.
lLength = GetPrivateProfileString("FileHistory", _
"File" & i, "", sReturn, Len(sReturn), sHistoryFile)
If lLength > 0 Then
' Wenn ein Name gelesen werden konnte, dann diesen in das Array
' eintragen
saLastFiles(i) = Left(sReturn, lLength)
End If
Next i
Else
' Datei zur Dateihistorie hinzufügen (weil ein Dateiname übergeben wurde)
' saLastFiles Array rückwärts durchlaufen und anpassen
For i = FILEHISTORYMAX - 1 To 0 Step -1
If i = 0 Then
' Auf Position 0 die zuletzt geöffnete Datei
saLastFiles(i) = sFileName
Else
' diesen Eintrag mit dem vorherigen überschreiben
saLastFiles(i) = saLastFiles(i - 1)
End If
' Den Wert sichern
Debug.Print WritePrivateProfileString("FileHistory", _
"File" & i, saLastFiles(i), sHistoryFile)
Next i
End If
' Nun das Menü anpassen
For i = 0 To FILEHISTORYMAX - 1
If saLastFiles(i) <> "" Then
' Wenn wir einen Dateinamen haben dann
On Error Resume Next ' Fehler ignorieren (simpel halt)
' Hier einen neuen Menüeintrag laden
Load Me.mnuFileHistory(i) 'ergibt einen Fehler wenn dieser schon
' existiert
' dem Menüeintrag nun den Dateinamen zuordnen
Me.mnuFileHistory(i).Caption = Right(saLastFiles(i), _
Len(saLastFiles(i)) - InStrRev(saLastFiles(i), "", -1, vbTextCompare))
End If
Next i
End FunctionGruß
Tolwyn |