|
|
|
|
|
Sie möchten Dateien oder Ordner aus dem Explorer, vom Desktop
oder woher auch immer auf Ihre Anwendung bzw. auf ein Steuerelement
ziehen können? Die OLE-Drag&Drop-Technik in Visual
Basic macht's ohne große Klimmzüge möglich. Enthält das
Data-Objekt, das im Ereignis OLEDragDrop
übergeben wird, eine Dateiliste (Ordner werden wie Dateien
behandelt), finden Sie diese in der Files-Sammlung
des Data-Objekts.
An sich bereitet es keine Schwierigkeiten, die Dateiliste
auszulesen und die übergebenen Datei- bzw. Ordner-Namen zu
verwenden. Aber die Prüfung, ob im Data-Objekt tatsächlich eine
Dateiliste enthalten ist, läuft auf immer wieder den gleichen Code
hinaus. Und auch bei der Übernahme der Dateiliste in einen String,
ein Array, eine Collection oder eine List- oder ComboBox ist es das
Gleiche. Was liegt näher, als diese häufiger benötigten
Operationen in komfortable Hilfsfunktionen zu packen?
Beginnen wir mit der Funktion DataFilesString. Im einfachsten
Fall gibt sie den ersten Dateinamen der Dateiliste zurück, wenn das
Data-Objekt tatsächlich eine Dateiliste enthält. Setzen Sie den
optionalen Parameter AllFiles gleich True (hier könnten Sie zum
Beispiel auch gleich den Wert der MultiLine-Eigenschaft
einer TextBox angeben), werden die einzelnen Dateinamen mit einer
Zeilentrennung (vbCrLf) dazwischen aneinandergehängt. Im optionalen
Parameter Separator können Sie auch einen anderen Trenn-String
angeben, etwa das Listentrennzeichen (üblicherweise ein Semikolon
";"). Soll auf den letzten Dateinamen noch einmal
der Trenn-String folgen, setzen Sie den optionalen Parameter
LastWithSeparator gleich True. Schließlich können Sie im letzten
Parameter einen bereits vorhandenen String übergeben, an den die
Dateiliste angehängt werden soll. In diesem Fall wird geprüft, ob
der übergebene String bereits mit einem Trenn-String endet. Falls
nicht, wird dieser zuerst ergänzt. Der übergebene String bleibt
jedoch unverändert - es bleibt Ihnen überlassen, den im
Rückgabewert der Funktion zurückgegebenen String wieder der
übergebenen String-Variablen zuzuweisen.
Public Function DataFilesString(Data As DataObject, _
Optional ByVal AllFiles As Boolean, _
Optional Separator As String = vbCrLf, _
Optional ByVal LastWithSeparator As Boolean, _
Optional GivenString As String) As String
Dim l As Long
Dim nDataFiles As DataObjectFiles
Dim nText As String
With Data
If .GetFormat(vbCFFiles) Then
Set nDataFiles = .Files
nText = GivenString
If Len(nText) Then
If Right$(nText, Len(Separator)) <> Separator Then
nText = nText & Separator
End If
End If
If AllFiles Then
For l = 1 To nDataFiles.Count
nText = nText & nDataFiles(l) & Separator
Next 'l
If Not LastWithSeparator Then
nText = Left$(nText, Len(nText) - Len(Separator))
End If
Else
nText = nText & nDataFiles(1)
If LastWithSeparator Then
nText = nText & Separator
End If
End If
DataFilesString = nText
End If
End With
End Function
 |
Die Funktion DataFilesString verkettet die
Dateiliste eines Data-Objekts zu einem String

|
Die zweite Variante füllt ein Array mit der Dateiliste. Sie
übergeben das Data-Objekt und erhalten das Array als Rückgabewert.
Als Untergrenze des Arrays ist 1 voreingestellt. Wenn
Sie lieber 0 als Untergrenze hätten (und
dementsprechend eine um 1 geringere Obergrenze als die
Anzahl der Dateien in der Dateiliste), geben Sie im optionalen
Parameter OptionBase den Enumerationswert OptionBase0 (aus der
Enumeration OptionBaseConstants) an. Auch hier können Sie die
Dateiliste wieder anhängen - an das Array, das Sie im optionalen
Parameter AddToArray übergeben.
Public Enum OptionBaseConstants
OptionBase0
OptionBase1
End Enum
Public Function DataFilesArray(Data As DataObject, _
Optional ByVal OptionBase As OptionBaseConstants = OptionBase1, _
Optional AddToArray As Variant) As Variant
Dim l As Long
Dim nFiles() As String
Dim nOptionBase As OptionBaseConstants
Dim nLBound As Long
With Data
If .GetFormat(vbCFFiles) Then
Set nDataFiles = .Files
With nDataFiles
If IsArray(AddToArray) And (VarType(AddToArray) - vbArray = _
vbString) Then
nLBound = UBound(AddToArray)
ReDim Preserve AddToArray(LBound(AddToArray) To _
nLBound + .Count)
For l = 1 To .Count
AddToArray(l + nLBound) = nDataFiles(l)
Next 'l
DataFilesArray = AddToArray
Else
Select Case OptionBase
Case Is <= 0
ReDim nFiles(0 To .Count - 1)
For l = 0 To .Count - 1
nFiles(l) = nDataFiles(l + 1)
Next 'l
Case Is >= 1
ReDim nFiles(1 To .Count)
For l = 1 To .Count
nFiles(l) = nDataFiles(l)
Next 'l
End Select
DataFilesArray = nFiles
End If
End With
End If
End With
End Function
 |
Die Funktion DataFilesArray fügt die
Dateiliste eines Data-Objekts in ein Array ein

|
Die nächste Variante füllt eine Collection mit der Dateiliste.
Die Files-Sammlung des Data-Objekts ist zwar bereits eine
Collection. Doch wenn Sie eine separate VB-Standard-Collection zur
weiteren Verarbeitung brauchen, bekommen Sie diese von dieser
Funktion geliefert. Im Optionalen Parameter WithKeys geben Sie mit
True an, ob der komplette Pfadname einer jeden Datei als Schlüssel
(Key) beim Einfügen in die Collection verwendet werden soll.
Anderenfalls werden die Dateinamen ohne Schlüssel eingefügt.
Alternativ zu der von der Funktion neu angelegten
Standard-Collection können Sie auch eine bereits vorhandene
Collection im optionalen Parameter SpecialCollection übergeben.
Dies kann wiederum eine Standard-Collection sein. Sie können hier
aber auch jedes beliebige andere Sammlungs-Objekt aus anderen
Objekten und Anwendungen oder auch ein selbstgeschriebenes
Collection-Klassen-Objekt übergeben, sofern dieses String-Einträge
akzeptiert. Die Angabe von WithKeys können Sie natürlich nur dann
angeben, wenn das Sammlungs-Objekt damit etwas anfangen kann. Im
optionalen Parameter Clear können Sie schließlich noch festlegen,
ob das Sammlungs-Objekt vor dem Einfügen der Dateiliste zunächst
geleert werden soll. Ist das übergebene Sammlungs-Objekt eine
VB-Standard-Collection, werden alle darin enthaltenen Elemente
daraus entfernt (in einer Do...Loop-Schleife wird so
lange das erste Element entfernt, so lange noch eines vorhanden ist)
- die Collection selbst bleibt erhalten, so dass Ihre gegebenenfalls
anderenorts vorhandenen Referenzen darauf nicht durcheinander kommen
können. In Visual Basic 6 Sie können in Clear auch
einen String mit dem Namen der Methode zum Leeren des
Sammlungs-Objekts übergeben, wenn dieser nicht wie üblich
"Clear" lautet. Diese Methode wird dann über die
Anweisung CallByName
aufgerufen und sollte eine Sub- oder Function-Prozedur (Typ
VbMethod) sein. Ansonsten wird versucht, mit dem Aufruf einer
Clear-Methode das Sammlungs-Objekt zu leeren. Die ergänzte Sammlung
wird auch zusätzlich von der Funktion zurückgegeben.
Public Function DataFilesCollection(Data As DataObject, _
Optional ByVal WithKeys As Boolean, _
Optional SpecialCollection As Object, _
Optional ByVal Clear As Variant) As Collection
Dim l As Long
Dim nFiles As Collection
With Data
If .GetFormat(vbCFFiles) Then
Set nDataFiles = .Files
With nDataFiles
If SpecialCollection Is Nothing Then
Set nFiles = New Collection
Else
Set nFiles = SpecialCollection
If Not IsMissing(Clear) Then
If TypeOf nFiles Is Collection Then
With nFiles
Do While .Count
.Remove 1
Loop
End With
Else
On Error Resume Next
If VarType(Clear) = vbString Then
' *** Die folgende Zeile kann nur ab Visual Basic 6 *******
' *** verwendet werden! ***********************************
CallByName nFiles, CStr(Clear), VbMethod
' *********************************************************
Else
nFiles.Clear
End If
On Error GoTo 0
End If
End If
End If
With nFiles
If WithKeys Then
For l = 1 To .Count
.Add nDataFiles(l)
Next 'l
Else
On Error Resume Next
For l = 1 To .Count
.Add nDataFiles(l), nDataFiles(l)
Next 'l
End If
End With
Set DataFilesCollection = nFiles
End With
End If
End With
End Function
 |
Die Funktion DataFilesCollection fügt die
Dateiliste eines Data-Objekts in ein Sammlungs-Objekt
(Collection) ein

|
Schließlich bleiben noch die beiden Funktionen zum Füllen einer
List- oder ComboBox mit der Dateiliste übrig. Diese beiden
Funktionen unterscheiden sich lediglich im übergebenen Objekt-Typ,
sind aber ansonsten identisch. Setzen Sie den optionalen Parameter
Clear gleich True, wird die List- oder ComboBox vor dem Einfügen
der Dateien geleert. Ob die Dateien sortiert eingefügt werden,
hängt von der Einstellung in der Eigenschaft Sorted
der übergebenen List- bzw. ComboBox ab.
Public Sub DataFilesListBox(Data As DataObject, _
ListBox As ListBox, _
Optional ByVal Clear As Boolean = True)
Dim l As Long
If Clear Then
ListBox.Clear
End If
With Data
If .GetFormat(vbCFFiles) Then
Set nDataFiles = .Files
With nDataFiles
With ListBox
For l = 1 To .Count
.AddItem nDataFiles(l)
Next 'l
End With
End With
End If
End With
End Sub
Public Sub DataFilesComboBox(Data As DataObject, _
ComboBox As ComboBox, _
Optional ByVal Clear As Boolean = True)
Dim l As Long
If Clear Then
ComboBox.Clear
End If
With Data
If .GetFormat(vbCFFiles) Then
Set nDataFiles = .Files
With nDataFiles
With ComboBox
For l = 1 To .Count
.AddItem nDataFiles(l)
Next 'l
End With
End With
End If
End With
End Sub
 |
Die Funktionen DataFilesListBox und
DataFilesComboBox fügen die Dateiliste eines Data-Objekts in
eine List- bzw. ComboBox ein

|
Noch eine Anmerkung zum Schluss: In allen Funktionen wird davon
ausgegangen, dass Sie gültige Objekte übergeben, also tatsächlich
ein Data-Objekt, eine Collection, eine List- oder ComboBox, und
nicht etwa Nothing. Wenn Sie wollen können Sie natürlich noch
entsprechende Prüfungen an den Anfang des Codes jeder dieser
Funktionen setzen und gegebenenfalls einen Laufzeitfehler auslösen
(Err.Raise...).
|
|
|