ABOUT Visual Basic Programmieren Programmierung Download Downloads Tips & Tricks Tipps & Tricks Know-How Praxis VB VBA Visual Basic for Applications VBS VBScript Scripting Windows ActiveX COM OLE API ComputerPC Microsoft Office Microsoft Office 97 Office 2000 Access Word Winword Excel Outlook Addins ASP Active Server Pages COMAddIns ActiveX-Controls OCX UserControl UserDocument Komponenten DLL EXE
Diese Seite wurde zuletzt aktualisiert am 10.02.2000

Diese Seite wurde zuletzt aktualisiert am 10.02.2000
Aktuell im ABOUT Visual Basic-MagazinGrundlagenwissen und TechnologienKnow How, Tipps und Tricks rund um Visual BasicActiveX-Komponenten, Controls, Klassen und mehr...AddIns für die Visual Basic-IDE und die VBA-IDEVBA-Programmierung in MS-Office und anderen AnwendungenScripting-Praxis für den Windows Scripting Host und das Scripting-ControlTools, Komponenten und Dienstleistungen des MarktesRessourcen für Programmierer (Bücher, Job-Börse)Dies&Das...

Themen und Stichwörter im ABOUT Visual Basic-Magazin
Code, Beispiele, Komponenten, Tools im Überblick, Shareware, Freeware
Ihre Service-Seite, Termine, Job-Börse
Melden Sie sich an, um in den vollen Genuss des ABOUT Visual Basic-Magazins zu kommen!
Informationen zum ABOUT Visual Basic-Magazin, Kontakt und Impressum

Zurück...

OLE-"gedroppte" Dateien

Zurück...


Anzeige

(-hg) mailto:hg_getdatafiles@aboutvb.de

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 MSDN Library - VB OLEDragDropOLEDragDrop übergeben wird, eine Dateiliste (Ordner werden wie Dateien behandelt), finden Sie diese in der MSDN Library - VB DataObjectFilesFiles-Sammlung des MSDN Library - VB DataObjectData-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 MSDN Library - VB MultiLineMultiLine-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 MSDN Library - VB CallByNameCallByName 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 MSDN Library - VB SortedSorted 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...).


Modul modGetDataFiles (modGetDataFiles.bas - ca. 6 KB)


Artikel
Zum Download-Bereich dieses Artikel
Mail an den Autor dieses Artikel

KnowHow
Zur KnowHow-Übersicht

KnowHow-Themen
Themen - Allgemeines
Themen - Entwicklungsumgebung (VB-IDE)
Themen - Forms
Themen - Steuerelemente (Controls)
Themen - Grafik
Themen - Dateien
Themen - UserControls
Themen - Einsteiger-Tipps
Themen - Wussten Sie...?

Übersicht nach Titeln in alphabetischer Reihenfolge
Übersicht nach Erscheinungsdatum

Schnellsuche



Zum Seitenanfang

Copyright © 1999 - 2017 Harald M. Genauck, ip-pro gmbh  /  Impressum

Zum Seitenanfang

Zurück...

Zurück...

Download Internet Explorer