FileListBox unsortiert

Hallo,

wie kann man verhindern, dass die FileListBox nicht sortiert, oder aber das Ganze nach Datum sortiert ist.

Danke.

Gruß
Gunter

Moi, Gunter,

wie kann man verhindern, dass die FileListBox nicht sortiert,
oder aber das Ganze nach Datum sortiert ist.

das Fenster, das da aufgeht, wird von der Comdlg32.ocx gesteuert. Was dann per rechte Maustaste > Ansicht > Symbole anordnen > {Name | Datum …} aufgerufen wird, weiß ich leider nicht - vermutlich wieder so ein Modul aus der Windows API, das kein Aas kennt.

Nach dem Weg, hier eine Sortierung vorzugeben, suche ich schon länger.

Gruß Ralf

Hallo Gunter,

kurz und bündig. Mit dem Werkzeug (FileListBox) von VB aus garnicht!
Aber es kostet rel. muehen sich selbst ein Steuerelement zu bauen, was das alles mit sich bringt. Diese koennte man dann sogar Alternativ noch erweitern :smile:

MfG Alex

Hallo Ralf,

sprach Gunter nicht von VB ? Das was du beschrieben hast, ist das Verhalten im Explorer und das hat wiederrum nichts mit Comdlg32.ocx am Hut. Das ist selbst progammiert, was ja kein grosser Aufwand ist!

Nach dem Weg, hier eine Sortierung vorzugeben, suche ich schon
länger.

Dazu muesstest du schon selbst Hand anlegen. Am besten gleich ein OCX basteln und gut ist. Der Aufwand sollte sich in Grenzen halten :wink:

MfG Alex

Hi Alex,

Du hast vergessen, eine schöne Beschreibung zu verlinken, wie man eigene Steuerelemente schreibt.

[FAQ:2683]

Wozu haben wir sonst unsere FAQ? :smile:

Gruß Rainer

Hallo Ralf,

[FAQ:2683]

dazu 2 Fragen (ich nehme an, das ist Dein Beritt):

Dert Code? Der ist von Alex. :smile:

  • Wozu braucht es die Leerzeilen im Code?
  • Bei mir bricht der Code nach 2/3 einfach ab.

Das sind beides Bugs, die die neue Oberfläche von w-w-w mit sich gebracht haben muss, habe ich Beides noch nicht bemerkt. Vor dem Rebrush war das in Ordnung.

Danke für den Hinweis, ich werde den fehler gleich ans Team melden.

Gruß Rainer

Hallo Alex,

habe mir eine Listbox gebastelt in die ich die Dateien einlese. Damit kann ich ja machen was ich will. Ist halt mehr Aufwand.
An ein OCX wage ich mich im Augenblick nicht heran.

Gruß
Gunter

Hallo Ralf,

Dazu muesstest du schon selbst Hand anlegen. Am besten gleich
ein OCX basteln und gut ist. Der Aufwand sollte sich in
Grenzen halten :wink:

MfG Alex

Moin Ralf,

Und noch eine Anmerkung: Die Codestrecke als Anleitung für das
Erstellen einer OCX zu verkaufen finde ich ganz schön mutig.
Gefühlte 700 Zeilen Code, keine Zeile Kommentar, kein Wort,
was da überhaupt passiert - bist Du sicher, dass das nicht
eher der Abschreckung dient?

700 Zeilen reichen da nicht. Du solltest aber bedenken was das Steuerelement alles macht. Wenn man sich ein wenig mit Objecten auskennt und API Aufrufen und das Steuerelement im Step by Step Modus durchlaufen laesst, so wird schnell ersichtlich wie alles funktioniert.

Die FAQ ruehrte eigentlich daher, das ich mal ein Project entwickelt habe, was viele Steuerelemente beinhaltet hat. Irgendwie waren wir gerade bei dem Thema gewesen und dann habe ich mal das eine Steuerelement aus dem Project rauskopiert. Da ich es entworfen habe und es läuft, brauche ich auch keine Kommentare dazu :wink: Nachtraeglich noch Kommis hinzufügen, bin ich ehrlich gesagt zu faul.

Aber wenn einer Fragen dazu hat oder im Allgemeinen wie mein OCX erstellt, so kann er sie hier gerne stellen und bekommt dann sicherlich auch eine passende Antwort dazu :wink:

Es hört sich schwer an. Aber das erstellen eines OCX ist rel. simple und ist meinstens auch nur aus anderen Steuerelementen zusammengesetzt :smile:

MfG Alex

MfG Alex

Hallo Gunter,

siehst wenn du nun schon den Source hast, fürs sortieren etc, so kannst du diesen ja kopieren in ein Usercontrol. Die benötigten Objecte draufziehen und volla, fertig ist der Husten :smile: Ok, man muss noch die Einstellungen speichern, via Propbag :wink:

Willst du nur die Files sehen oder auch das Datum etc. ? Fals letzteres würde sich eine ListView anbieten :wink:

MfG Alex

PS: Nach welchen Kriterien kannst du denn alles sortieren ?

Hallo Alex,

sortiere im Augenblick nur nach Datum, mehr brauche ich für den Zweck nicht.

Gruß
Gunter

PS: Nach welchen Kriterien kannst du denn alles sortieren ?

Hallo Gunter,

mal auf die schnelle ein Grundgeruest, was fast ihren Dienst macht :wink:

Erstelle dazu -> Neu Project -> Active X Steuerelement.
Auf das Usercontrol packe ne Listbox (List1) und setze ein verweis auf Microsoft Scripting Runtime :smile:

Option Explicit

Private Type FileInformation 'Die Daten ermitteln wir alle 
 Filename As String
 Attribute As Long
 Created As Date
 Modified As Date
 LastAccessed As Date
 Extension As String
End Type

Private MyPattern As String
Private MySorted As Boolean
Private MyPath As String
Private MyMultiSelect As Boolean
Private MyToolTip As String
Private MyArchive As Boolean
Private MyNormal As Boolean
Private MySystem As Boolean
Private MyReadOnly As Boolean
Private mySortKriterium As Byte

Private FSO As New FileSystemObject
Private oFolder As Folder
Private oFile As File

'Eigenschaften

'Property Get = Gibt die Eigenschaft zurueck!
'Property Let = Setzt eine Eigenschaft

'Soll Eigenschaft nur gesetzt werden koennen, so einfach die Property Get löschen
'Soll Eigenschaft nur gelesen werden koennen, so einfach die Property Let löschen

Public Property Get Pattern() As String
 Pattern = MyPattern
End Property

Public Property Let Pattern(ByVal vNewValue As String)
 If InStr(1, vNewValue, ".", vbTextCompare) = 0 Then Exit Property
 MyPattern = vNewValue
 Call GetData
End Property

Public Property Get Sorted() As Boolean
 Sorted = MySorted
End Property

Public Property Let Sorted(ByVal vNewValue As Boolean)
 MySorted = vNewValue
 Call GetData
End Property

Public Property Get Path() As String
 Path = MyPath
End Property

Public Property Let Path(ByVal vNewValue As String)
 If Dir(vNewValue) = "" Then Exit Property
 MyPath = vNewValue
 Set oFolder = FSO.GetFolder(vNewValue)
 Call GetData
End Property

Public Property Get MultiSelect() As Boolean
 MultiSelect = MyMultiSelect
End Property

Public Property Let MultiSelect(ByVal vNewValue As Boolean)
 MyMultiSelect = vNewValue
End Property

Public Property Get ToolTip() As String
 ToolTip = MyToolTip
End Property

Public Property Let ToolTip(ByVal vNewValue As String)
 MyToolTip = vNewValue
 List1.ToolTipText = MyToolTip
End Property

Public Property Get Archive() As Boolean
 Archive = MyArchive
End Property

Public Property Let Archive(ByVal vNewValue As Boolean)
 MyArchive = vNewValue
 Call GetData
End Property

Public Property Get Normal() As Boolean
 Normal = MyNormal
End Property

Public Property Let Normal(ByVal vNewValue As Boolean)
 MyNormal = vNewValue
 Call GetData
End Property

Public Property Get System() As Boolean
 System = MySystem
End Property

Public Property Let System(ByVal vNewValue As Boolean)
 System = vNewValue
 Call GetData
End Property

Public Property Get ReadOnly() As Boolean
 ReadOnly = MyReadOnly
End Property

Public Property Let ReadOnly(ByVal vNewValue As Boolean)
 MyReadOnly = vNewValue
 Call GetData
End Property

Public Property Get SortKriterium() As Byte
 SortKriterium = mySortKriterium
End Property

Public Property Let SortKriterium(ByVal vNewValue As Byte)
 mySortKriterium = vNewValue
 Call GetData
End Property

Private Sub List1\_Click()
Dim Pos As Long
Static Flag As Boolean
 If Flag Then Exit Sub
 Flag = True
 Pos = List1.ListIndex
 Call SetMultiselect
 List1.ListIndex = Pos
 List1.Selected(Pos) = True
 Flag = Not (Flag)
End Sub

'UserControl Routinen

Private Sub UserControl\_Initialize() 'Initialisierung
 MyPattern = "\*.\*"
 MySorted = False
 MyPath = App.Path
 MyMultiSelect = False
 MyToolTip = "Vorhanden Dateien, entsprechend der Pattern"
 MyArchive = True
 MyNormal = True
 MySystem = False
 MyReadOnly = True
 mySortKriterium = 0
End Sub

Private Sub UserControl\_ReadProperties(PropBag As PropertyBag) 'Eigenschaften lesen
 With PropBag
 .ReadProperty Pattern, "\*.\*"
 .ReadProperty Path, App.Path
 .ReadProperty MultiSelect, False
 .ReadProperty ToolTip, "Vorhanden Dateien, entsprechend der Pattern"
 .ReadProperty Archive, True
 .ReadProperty Normal, True
 .ReadProperty System, False
 .ReadProperty Sorted, False
 .ReadProperty ReadOnly, True
 .ReadProperty SortKriterium, 0
 End With
End Sub

Private Sub UserControl\_Resize() ' Das Usercontrol aendert seine Grösse!
On Error Resume Next
 List1.Move 0, 0, UserControl.Width, UserControl.Height
End Sub

Private Sub UserControl\_WriteProperties(PropBag As PropertyBag) 'Eigenschaften speichern
 With PropBag
 .WriteProperty Pattern, MyPattern, "\*.\*"
 .WriteProperty Path, MyPath, App.Path
 .WriteProperty MultiSelect, MyMultiSelect, False
 .WriteProperty ToolTip, MyToolTip, "Vorhanden Dateien, entsprechend 
der Pattern"
 .WriteProperty Archive, MyArchive, True
 .WriteProperty Normal, MyNormal, True
 .WriteProperty System, MySystem, False
 .WriteProperty Sorted, MySorted, False
 .WriteProperty ReadOnly, MyReadOnly, True
 .WriteProperty SortKriterium, mySortKriterium, 0
 End With
End Sub


'Allgemeine Function

Private Function GetData() 'liest Daten in die Liste ein
Dim MyData() As FileInformation
Dim Count As Boolean
Dim I As Long
 Count = 0
 List1.Clear
 For Each oFile In oFolder.Files
 If Not Count Then
 ReDim MyData(0)
 Count = Not (Count)
 Else
 ReDim Preserve MyData(UBound(MyData) + 1)
 End If
 MyData(UBound(MyData)).Attribute = oFile.Attributes
 MyData(UBound(MyData)).Filename = oFile.Name
 MyData(UBound(MyData)).Created = oFile.DateCreated
 MyData(UBound(MyData)).Modified = oFile.DateLastModified
 MyData(UBound(MyData)).LastAccessed = oFile.DateLastAccessed
 MyData(UBound(MyData)).Extension = FSO.GetExtensionName(oFile)
 Next
 Call FilterData(MyData)
 Call SortArray(MyData)
 For I = LBound(MyData) To UBound(MyData)
 List1.AddItem MyData(I).Filename
 Next I
End Function

Private Sub SetMultiselect() 'je nach Einstellung wird selektiert oder nicht
Dim I As Long
 If List1.ListCount = 0 Then Exit Sub
 If Not (MyMultiSelect) Then
 For I = 0 To List1.ListCount - 1
 List1.Selected(I) = False
 Next I
 End If
End Sub

Private Sub SortArray(vret() As FileInformation) 'Wir sortieren
 'hier kannst du dein Array sortieren
 'Daten stehen im Array vret. Wenn du das veraenderst, so hast du die Aenderung drinnen
 'Nicht benötigte Daten werfe aus dem Array heraus :wink:
 If Not MySorted Then Exit Sub
 Select Case mySortKriterium
 'Hier sortieren. Anhand von mysortkriterium kannst du festlegen nach was sortiert werden soll!
 Case 0 'bsp. Filename
 Case 1 'bsp. Erstellungsdatum
 Case 2 'bsp. Zuletzt modifiziert etc ...
 End Select
End Sub

Private Sub FilterData(vret() As FileInformation) 'Wir filtern die Daten anhand der Einstellungen
 'Hier kannst du dein Array Filtern ... Dateiextension ( \*.\*) , vbarchiv etc.
 'Pattern kannst du ueber mypattern abfragen
 'Daten stehen im Array vret. Wenn du das veraenderst, so hast du die Aenderung drinnen
 'Nicht benötigte Daten werfe aus dem Array heraus :wink:
End Sub

'Methoden

Public Function GetFilename(Index) As String 
 If Index \> List1.ListCount Then Exit Sub
 GetFilename = List1.List(Index)
End Function

Public Function GetIndex() As Long 'erstes selectiertes Element
 GetIndex = List1.ListIndex
End Function

Public Function GetAllSelectedFiles() as String
Dim vRet as string 
Dim I as Long 
If List1.ListCount=0 then exit function
For I=0 to List1.ListCount-1
 if List1.Selected(i) then vret=vret & List1.List(i) & "|"
Next I
GetAllSelectedFiles=Left(vret,Len(vret)-1)
End Function

Wie du siehst ist es eigentlich nicht schwer :wink:
Ist ungetestet, aber muesste eigentlich functionieren, wenn du noch die 2 Function fertigstellst :smile:

Mfg Alex