Einträge mit Tag “visual-basic”

Projekt Vorschau

23. Jan 2009 16:01 (bearbeiten)

Hier eine kleine Vorschau des Projekts an dem ich gerade arbeite.

Wie man hoffentlich sieht, handelt es sich um einen App Launcher, also so etwas wie Launchy. Wenn das Projekt fertig ist, soll das Programm aber mehr können, als nur Programme zu öffnen. Ich habe folgendes geplant:

  • Starten, Beenden (und Bearbeiten) von Programmen
  • Öffnen und Bearbeiten von Dateien
  • Arbeiten mit markierten Dateien, Ordnern und Text
  • Index Unterstützung, d. h. eigene Indexer können beliebige Objekte (wie Mails, Termine, usw.) indexieren, mit denen dann gearbeitet werden kann.
  • Plugin Unterstützung, d. h. eigene Aktionen für Objekte können geschrieben werden. Beispielsweise könnte ein Mail Plugin E-Mails an indexierte Kontakte versenden, ein Packer-Plugin könnte markierte Ordner zipppen und via FTP-Plugin hochladen
  • Skin Unterstützung
  • Einfache(ste) Bedienung

Das wichtigste an diesem Programm wird die einfache Bedienung sein (auch wenn ich das als letzten Punkt in der Liste aufgeführt habe). So soll es mit nur wenigen Tastendrücken möglich sein, beispielsweise in Windows markierte Dateien zu zippen, zu verschlüsseln und anschließend auf einen FTP Server zu laden.

Dabei werden Plugins miteinander verknüpft die unterschiedliche Objekte an das nächste vom Benutzer ausgewählte Plugin zurückliefern.

Gemäß obigem Beispiel:

Ausgewählte Dateien -> Plugin: ZIP -> Gezippte Dateien -> Plugin: Verschlüsselung -> Verschlüsselte Dateien -> Plugin: FTP -> Auswahl FTP-Verbindungsdaten -> Fertig.

Wer Quicksilver für den Mac kennt, wird sicherlich viele Gemeinsamkeiten entdecken, was daran liegt, dass Quicksilver für mich eine Art inspirierende Vorlage war (was es für Windows Alternativen zu Quicksilver gibt, hat Lifehacker übrigens in diesem Artikel zusammengefasst).

Bis das alles so funktioniert wie ich das gerne hätte, muss ich aber noch einiges an Arbeit in das Projekt stecken. Ein Schritt in diese Richtung ist allerdings bereits gemacht.

VB .NET - Displayname / Beschreibung einer Datei ermitteln

21. Jan 2009 15:12 (bearbeiten)

Ich wollte für ein Programm an dem ich gerade arbeite statt der Dateiendung die Beschreibung zu der Dateiendung anzeigen.

Windows selbst zeigt diese Beschreibung beispielsweise in der Statusleiste des Explorers, wenn man auf eine bekannte Datei klickt. Beispielsweise bei "*.MOV" Dateien wäre die Anzeige (je nachdem mit welchem Programm die Endung verknüpft ist) "VLC media file (.mov)" oder "Quicktime Movie".

Nunja, als ich noch mit Delphi programmierte hätte ich hierzu die Shell32 SHGetFileInfo Funktion verwendet, doch unter .NET binde ich ungerne DLLs ein, also habe ich mir eine Funktion gebastelt, die die Info aus der Registry ausliest.

  1. ''' <summary>
  2. ''' Retrieve the Description/Displayname for a FileExtension
  3. ''' </summary>
  4. ''' <param name="aExtension">The Extension with a leading dot</param>
  5. ''' <returns>The Description of an Extension</returns>
  6. ''' <remarks></remarks>
  7. Public Shared Function GetDisplayNameFromExtension(ByVal aExtension As String) As String
  8.  
  9. If aExtension = String.Empty Or Not aExtension.StartsWith(".") Then Return String.Empty
  10.  
  11. ' First the get the key for the extension
  12. ' Extension is for example ".MOV", Key is "VLC.mov"
  13. Dim key As Microsoft.Win32.RegistryKey = My.Computer.Registry.ClassesRoot.OpenSubKey(aExtension)
  14.  
  15. If key IsNot Nothing Then
  16.  
  17. ' Then we look in the sub key for the description
  18. Dim SubkeyName As String = key.GetValue(String.Empty)
  19. Dim SubKey As Microsoft.Win32.RegistryKey = My.Computer.Registry.ClassesRoot.OpenSubKey(SubkeyName)
  20. If SubKey IsNot Nothing Then
  21. Return SubKey.GetValue(String.Empty)
  22. End If
  23.  
  24. End If
  25.  
  26. Return String.Empty
  27. End Function

Beispielaufruf:

  1. Msgbox(GetDisplayNameFromExtension(".zip"))

VB .NET - Mit Lotus Notes E-Mails und Dateianhängen arbeiten

29. Dec 2008 12:05 (bearbeiten)

Mit den folgenden Klassen ist es möglich, aus einer Domäne heraus, eine beliebige Lotus Notes-Datenbank zu öffnen und alle E-Mails darin aufzulisten. Es werden dabei alle Dateianhänge aus den E-Mails in eine Liste gefügt.

Ein Beispielaufruf findet sich am Ende dieses Artikels.

  1. Public Class NotesMail
  2.  
  3. Public Subject As String
  4. Public From As String
  5. Public Body As String
  6. Public AttachmentFilenames As New List(Of Domino.NotesEmbeddedObject)
  7.  
  8. End Class
  9.  
  10. Public Class NotesMailCollection
  11. Inherits List(Of NotesMail)
  12. End Class
  13.  
  14. Public Class MailAccount
  15. Public Host As String
  16. Public DatabaseFilename As String
  17. Public Password As String
  18. End Class
  19.  
  20. Public Class NotesTools
  21.  
  22. Public Shared Function GetMails(ByVal aMailAccount As MailAccount, ByVal MoveMails As Boolean) As NotesMailCollection
  23. Try
  24. Return _GetMails(aMailAccount, MoveMails)
  25. Catch ex As Exception
  26. MsgBox(ex.Message, MsgBoxStyle.Critical)
  27. Return Nothing
  28. End Try
  29. End Function
  30.  
  31. Private Shared Function _GetMails(ByVal aMailAccount As MailAccount, ByVal MoveMails As Boolean) As NotesMailCollection
  32.  
  33. ' Die Session starten
  34. Dim Session As New Domino.NotesSession
  35. Session.Initialize(aMailAccount.Password)
  36.  
  37. ' Datenbank öffnen
  38. Dim MailDB As Domino.NotesDatabase
  39. Dim MailServer As String = Session.GetEnvironmentString("MailServer", True)
  40. ' Dim DatabaseFilename As String = Session.GetEnvironmentString("MailFile", True)
  41.  
  42. MailDB = Session.GetDatabase(MailServer, aMailAccount.DatabaseFilename)
  43.  
  44. If Not MailDB.IsOpen Then
  45. MailDB.Open()
  46. End If
  47.  
  48. Dim result As New NotesMailCollection
  49.  
  50. Dim n_View As Domino.NotesView
  51. Dim n_ViewNav As Domino.NotesViewNavigator
  52. Dim n_ViewEntry As Domino.NotesViewEntry
  53. Dim n_Document As Domino.NotesDocument
  54.  
  55. n_View = MailDB.GetView("($Inbox)")
  56. n_ViewNav = n_View.CreateViewNav
  57. n_ViewEntry = n_ViewNav.GetFirstDocument
  58.  
  59. ' For all mails
  60. Do While Not (n_ViewEntry Is Nothing)
  61.  
  62. n_Document = n_ViewEntry.Document
  63. Dim oAttachment As Domino.NotesEmbeddedObject
  64.  
  65. If n_Document.HasEmbedded Then
  66.  
  67. ' Add data to our object
  68. Dim nm As New NotesMail
  69. With nm
  70. .Body = n_Document.GetItemValue("Body")(0).ToString
  71. .Subject = n_Document.GetItemValue("Subject")(0).ToString
  72. .From = n_Document.GetItemValue("From")(0).ToString
  73. End With
  74.  
  75. Dim fileNames As Object() = Session.Evaluate("@AttachmentNames", n_Document)
  76. For Each fileName As String In fileNames
  77. oAttachment = n_Document.GetAttachment(fileName)
  78. nm.AttachmentFilenames.Add(oAttachment)
  79. Next
  80.  
  81. ' Add object to our list
  82. result.Add(nm)
  83.  
  84. ' Remove from list
  85. If MoveMails Then
  86. ' n_Document.PutInFolder("Importiert " & Now.ToShortDateString, True)
  87. ' n_Document.RemoveFromFolder("($Inbox)")
  88. End If
  89.  
  90. End If
  91.  
  92. ' Next Mail
  93. n_ViewEntry = n_ViewNav.GetNextDocument(n_ViewEntry)
  94. Loop
  95.  
  96. Return result
  97.  
  98. End Function
  99.  
  100. End Class
  1. public Sub Test
  2.  
  3. ' Account Einstellungen
  4. Dim acc As New MailAccount
  5. With acc
  6. .Host = "DominoServer"
  7. .DatabaseFilename = "mail\postfach.nsf"
  8. .Password = "meingeheimespasswort"
  9. End With
  10.  
  11. ' GO! GO! GO! Alle Mails auflisten
  12. Dim lstMails As NotesMailCollection = NotesTools.GetMails(acc, False)
  13.  
  14. For Each itm As NotesMail In lstMails
  15. ' Alle Anhänge in Verzeichnis abspeichern
  16. For Each att As Domino.NotesEmbeddedObject In itm.AttachmentFilenames
  17. strFilename = att.Name
  18. strDirectory = "C:\tmp"
  19. My.Computer.FileSystem.CreateDirectory(strDirectory)
  20. strFullFilename = strDirectory & "\" & strFilename
  21. att.ExtractFile(strFullFilename)
  22. Next
  23.  
  24. Next
  25. end sub

Dupe Files Beispiel Tasks verfügbar

25. Oct 2008 16:59 (bearbeiten)

Für die im neuen Dupe Files eingeführte Tasks-Funktion (welche kurz gesagt der Automatisierung oder Skript-Steuerung von Dupe Files dient) habe ich nun vier Beispiel Tasks hochgeladen.

Um diese Tasks in Dupe Files zu testen, bitte das Archiv aus dem Download-Bereich von Dupe Files herunterladen und in das Dupe Files Verzeichnis entpacken. Dabei müsste der Entpacker automatisch einen Unterordner namens "Tasks" erstellen.

(Sollen die Tasks in einem anderen Verzeichnis abgelegt werden, so kann man dieses über den Menüpunkt "Optionen / Erweitert / Task Verzeichnis auswählen..." festlegen.)

Anschließend startet man Dupe Files und wählt über das Menü den Punkt "Optionen / Erweitert / Task Manager" aus.

Fortan gibt es im Menü unter "Datei" einen neuen Eintrag namens "Tasks", welcher alle Task-Dateien aus dem Task-Verzeichnis auflistet. Mit einem Klick auf einen solchen Eintrag wird die jeweilige Task-Datei ausgeführt.

VB .NET Programm zum Autostart in der Registrierung hinzufügen

29. Sep 2008 18:45 (bearbeiten)

Wer hätte das gedacht... unter .NET ist auch das mittlerweile ein Klacks...

Die folgende Prozedur fügt die aktuelle Application im Bereich CurrentUser in die Registrierung als Autostart Eintrag hinzu.

Der erste Wert "My.Application.Info.Productname" ist dabei der Name des Eintrags und dessen Wert ist der komplette Dateiname des Programms, den man via "System.Reflection.Assembly.GetEntryAssembly.Location" ermitteln kann.

Die Anführungszeichen vorne und hinten sind notwendig, wenn der Pfad zum Programm Leerzeichen enthält. Ansonsten würde Windows nur das Verzeichnis statt das Programm an sich öffnen.

  1. Public Shared Sub AddToAutorun()
  2. Dim key As Microsoft.Win32.RegistryKey = My.Computer.Registry.CurrentUser.CreateSubKey("Software\Microsoft\Windows\CurrentVersion\Run")
  3. key.SetValue(My.Application.Info.ProductName, """" & System.Reflection.Assembly.GetEntryAssembly.Location & """")
  4. End Sub

VB .NET Prozess starten und auf sein Ende warten

16. Sep 2008 10:41 (bearbeiten)

  1. Public Sub Execute(ByVal aFilename As String)
  2. Dim p As New Process
  3. p.StartInfo.FileName = aFilename
  4. p.StartInfo.UseShellExecute = True
  5. p.Start()
  6. p.WaitForExit()
  7. End Sub

Beispielaufrufe:

  1. Execute("C:\test.doc")
  2. Execute("C:\test.pdf")

Tags ¦ , und

HowTo: VB .NET Enums mit Beschreibungen versehen

13. Sep 2008 13:41 (bearbeiten)

Dieses HowTo beschreibt, wie man Enums mit Beschreibungen versehen kann und diese Beschreibungen dann beispielsweise in einer Combobox oder Listbox anzeigt.

Beispiel vorher:

So sehen die Einträge bisher aus. Für den Endanwender ziemlich unpraktisch.

Beispiel nachher:

So sollen die Einträge später angezeigt werden.

Auf gehts!

Unser Beispiel enum:

  1. Public Enum eFileListActionType
  2. eflatNone = 0
  3. eflatCompress = 1
  4. eflatDeleteForever = 2
  5. eflatRecyclebin = 3
  6. eflatReplaceWithTextfile = 4
  7. eflatReplaceWithLink = 5
  8. eflatReplaceWithZeroByteFile = 6
  9. eflatMoveToDirectory = 7
  10. End Enum

Um nun alle Namen diesse Enums beispielsweise in einer Combobox anzuzeigen, kann man bekanntermaßen folgendes machen:

  1. Me.cbFileActionType.Items.AddRange([Enum].GetNames(GetType(eFileListActionType)))

Dann hätte man die Combobox mit den Werten eflatNone, eflatCompress usw. usf. gefüllt. Also praktisch so wie im ersten Bild oben. Dass das für den Endanwender nicht unbedingt ideal ist, sollte klar sein. Was wir also benötigen ist eine Möglichkeit den enums eine Beschreibung zu verpassen und diese Beschreibung stattdessen in die Combobox zu schreiben.

Zum Glück gibt es Reflection und das Attribut Description, das uns hierbei aus der Patsche hilft.

Also, wie geht das jetzt?

Zuerst müssen wir unseren enum um das Attribut Description ergänzen. Das sieht dann wie folgt aus:

  1. Imports System.ComponentModel ' Wichtig!
  2.  
  3. Public Enum eFileListActionType
  4. <Description("Keine")> _
  5. eflatNone = 0
  6. <Description("Komprimieren")> _
  7. eflatCompress = 1
  8. <Description("Für immer löschen")> _
  9. eflatDeleteForever = 2
  10. <Description("In Papierkorb verschieben")> _
  11. eflatRecyclebin = 3
  12. <Description("Durch Textdatei mit Link ersetzen")> _
  13. eflatReplaceWithTextfile = 4
  14. <Description("Durch Dateilink ersetzen")> _
  15. eflatReplaceWithLink = 5
  16. <Description("Durch 0-Byte Datei ersetzen")> _
  17. eflatReplaceWithZeroByteFile = 6
  18. <Description("In Verzeichnis verschieben")> _
  19. eflatMoveToDirectory = 7
  20. End Enum

Wie man sieht wird einfach der Tag vor einen Eintrag gesetzt.

Zum Auslesen dieser Werte müssen wir nun Reflection bemühen:

Die erste Funktion gibt uns dabei eine Beschreibung für einen Enum-Wert zurück.

  1. Public Shared Function GetEnumDescription(ByVal EnumConstant As [Enum]) As String
  2. Dim fi As Reflection.FieldInfo = EnumConstant.GetType().GetField(EnumConstant.ToString())
  3. Dim attr() As System.ComponentModel.DescriptionAttribute = DirectCast(fi.GetCustomAttributes(GetType(System.ComponentModel.DescriptionAttribute), False), System.ComponentModel.DescriptionAttribute())
  4. If attr.Length > 0 Then
  5. Return attr(0).Description
  6. Else
  7. Return EnumConstant.ToString()
  8. End If
  9. End Function

Für folgenden Befehl

  1. Dim str as String = GetEnumDescription(eflatReplaceWithTextfile)
  2. Debug.Print(str)

bekämen wir also das als Ausgabe:

Durch Textdatei mit Link ersetzen

Um das ganze noch etwas zu optimieren habe ich noch eine Hilfs-Funktion geschrieben, die alle Werte eines Enums übersetzt (also die Description einliest) und diese in ein String Array schreibt, das man dann einfach an die Combobox übergeben kann.

  1. Public Shared Function GetEnumDescriptions(ByVal EnumConstant As Type) As String()
  2. Dim res(-1) As String
  3. For Each ec As [Enum] In [Enum].GetValues(EnumConstant)
  4. ReDim Preserve res(UBound(res) + 1)
  5. res(UBound(res)) = GetEnumDescription(ec)
  6. Next
  7. Return res
  8. End Function

Beispielanwendung:

  1. Me.cbFileActionType.Items.AddRange(GetEnumDescriptions(GetType(eFileListActionType)))

Und damit hätten wir alle Beschreibungen eines Enums sauber in einer Combobox oder Listbox untegebracht.