Feed Icon
.NET User Group Leipzig
Page 1 of 1 in the VisualStudio category

Zum zeilenweisen sortieren nehme ich bisher UltraEdit. Kann das eigentlich nicht Visual Studio auch? Nein, dieses Leistungsmerkmal nicht enthalten (@Tim: wie wäre das als ein Feature Request). Es gibt zwar eine Formatierung über Bearbeiten, Erweitert, Dokument formatieren, aber das ist auch schon alles. Extra dann UltraEdit einzusetzen, auch wenn es per Kontextmenü über die in Projektmappen enthaltenen Dokumente leicht geht, ist halt keine smarte Lösung. Die Anforderung, nur den markierten Bereich zu sortieren, bringt dann alles mit den Vorgängen Ausschneiden, Sortieren und Einfügen gleich noch mehr ins Wanken. Das habe ich als Anlass genommen und ein Makro geschrieben.

So sieht eine Datei, beispielweise eine OPML-Datei für einen Blog, unsortiert aus.
Sie ist hier im Beispiel partiell unsortiert und enthält leere Zeilen.

zeilenweise sortieren, nur den marktierten Bereich, in Visual Studio

Für eine Sortierung ist einfach der entsprechende Bereich zu markieren.
Die komplette Datei kann per Bearbeiten, Alle auswählen¹ oder STRG + A auch sortiert werden.

zeilenweise sortieren, nur den marktierten Bereich, in Visual Studio

Dann ist das Makro SortSelectionAndSmartFormat auszuführen und schon ist alles sortiert und formatiert.
So einfach geht's. Und integriert.

zeilenweise sortieren, nur den marktierten Bereich, in Visual Studio

Hier das Makro:

#Region "Sub SortSelectionAndSmartFormat"
   ' Sortiert und formatiert die aktuelle Auswahl.
   Sub SortSelectionAndSmartFormat()
      If (DTE.ActiveDocument Is Nothing) Then
         Exit Sub
      End If

      If (DTE.ActiveDocument.ReadOnly) Then
         Exit Sub
      End If

      Dim currentTextSelection As TextSelection
      currentTextSelection = DTE.ActiveDocument.Selection

      If (currentTextSelection.TextRanges.Count = 1) Then
         Exit Sub
      End If

      If (DTE.UndoContext.IsOpen) Then
         DTE.UndoContext.Close()
      End If

      Try
         DTE.UndoContext.Open("SortSelectionAndSmartFormat")
         currentTextSelection.SmartFormat()
      Catch
      End Try

      Try
         Dim currentLines() As System.String = Split(currentTextSelection.Text, vbCrLf)

         System.Array.Sort(currentLines)
         currentTextSelection.Delete()

         For Each i As System.String In currentLines
            If Not i = System.String.Empty Then
               currentTextSelection.Insert(i.Trim(vbCrLf) & vbCrLf)
            End If
         Next
         DTE.UndoContext.Close()

      Catch
      End Try

      Exit Sub
   End Sub
#End Region

Und hier das Makro SortSelectionAndSmartFormat (1,21 KB) zum Download.

¹ es sollte wohl richtig heißen "Alles auswählen", da hat wohl jemand das "s" vergessen Tim

Visual Studio unterstützt das spaltenweise markieren, auch den Spalten- oder Rechteckmodus genannt. Dazu muss die Taste ALT gedrückt und gehalten sowie bei der danach gedrückten linken Maustaste ein entsprechendes Rechteck markiert werden. Die rechteckige Markierung enthält dann alle Zeichen, die in dem Rechteck liegen; von dem Anfangszeichen (Ankerzeichen) bis zum letzten Zeichen der Markierung. Ist die Breite der Markierung null, werden ganze Zeilen des Rechtsecks markiert. Wo kann diese Art der Markierung überhaupt zum Einsatz kommen, sie ist doch ungewöhnlich oder nicht?

Spaltenweise markieren in Visual Studio Spaltenweise markieren in Visual Studio Diese Technik kann z. B. bei Blogeinträgen wie dem von Dariusz zu Singletons Einsatz kommen, wo Anwendungscode mit Zeilennummern versehen ist und es keinen extra Download zu den Dateien gibt. Mit obiger Technik können Zeilennummern bequem entfernt werden.

Für den einen oder anderen Ansatz zur Messung der Effizienz der Softwareentwicklung, sehr häufig im Zusammenhang mit economics of scale, wird die Anzahl der geschriebenen Programmzeilen benötigt. Visual Studio bietet von Haus aus nicht solche Funktionalität. Ein Add-In kann es: Das (kostenlose) Add-In Project Line Couter.

Heute hörte ich:

Ich habe in den letzten drei Tagen 900 LOC geschafft. Davon ist nichts generiert!

Wow?! Ich kann da immer wieder nur auf die Untersuchungen der Center for Project Management, des Cutter Consortium, der Gartner Group und der Standish Group hinweisen.

  • ca. 23 % aller Softwareprojekte sind erfolgreich,
  • ca. 53 % aller Softwareprojekte sind über dem Budget und / oder über der Zeit
  • ca. 24 % aller Softwareprojekte werden abgebrochen

Es zeigt sich, dass sozusagen ein durchschnittlicher Softwareentwickler im langfristigen Durchschnitt

  • 10 LOC pro Arbeitstag¹ bis
  • 16 LOC pro Arbeitstag² schafft

Wahrscheinlich lässt sich auch wie mit jeder Statistik auch mit jeder Metrik schon irgendetwas beweisen, aber einfach so in den Raum gestellte "300 LOC / Personentag" sollten Alarmleuchten³ jedes Managers auf hellrot schalten lassen. Sicher können Softwareentwickler solche Werte erreichen, aber mittel- und langfristig sollten andere Werte die Regel sein? 10 - 16 LOC klingen aber auch sehr wenig? Was nun?

12:18  Wie willste denn das XmlDocument in nen String bekommen? Mit ToString() oder was?
12:20  Ich glaub nicht, dass es ein Convert.ToXML() gibt. Wie kann ich den String in XML wandeln?
12:20  Ach man! Ich bin mit C++ einfach viel zu wenig auf C# vorbereitet.
12:20  Hab Sachen gelernt, die ich jetzt nicht brauch.
12:21  Die Einarbeitungszeit wird bei uns nicht mit in die Projektzeit eingerechnet.
12:21  /hach/

Fakt ist, dass solche blanken Zahlen genau wie Metriken gar nichts aussagen, LOC ist ein Größenmaß. Es kommt auch auf technische Faktoren an oder auf die verwendete Programmiersprache4. Ist nicht auch eine 10 LOC-Lösung in C# für einen Algorithmus besser als die, die 300 LOC in C# benötigt? Sind auch nicht in Assembler tendenziell mehr LOC notwendig, als in einer hohen Programmiersprache wie C#? Richtig ist, dass je höher die LOC pro Softwareentwickler sind und vom Durchschnitt abweichen, es sich wahrscheinlich eher um undokumentierten, unzuverlässigen, ungetesteten sowie nicht wartbaren Code handeln wird5, der noch dazu in wenigen Köpfen verteilt ist.

Project Line Counter

¹ Mayr 2005
² Ludewig / Lichter 2006
³ von einem erfahrenen Architekten hörte ich: "meine kleinen Gizmos"
4 deswegen ist eben bei Metriken z. B. ein Vergleich notwendig
5 ein guter Freund sagte bei einem Projekt treffend: "zur Auslieferung ist es schon ein Legacy-System"

Ich habe mich, seitdem Uwe Baumann in Leipzig war und eines meiner Makros für seinen TechTalk "Schneller codieren – Visual Studio .NET Extensibility" gegen eine Lizenz (ein Bier) verwendet hat, nicht weiter großartig mit der Programmierung von Makros für Visual Studio 2003 oder Visual Studio 2005 beschäftigt. Wozu auch, denn mit Werkzeugen wie ReSharper von JetBrains, von dem man übrigens beim Vortrag von Roland Weigelt über die Erweiterbarkeit von Visual Studio eine Lizenz gewinnen kann, kann viel fehlende Funktionalität von Visual Studio erschlagen werden. Bei Visual Studio 2003, übrigens auch bei Visual Studio 2005, wurde dem Softwareentwickler zugemutet, einzelne Ordner in der Projektmappe selber wieder zu schließen. Über das Kontextmenü ging das nicht. Also musste ein Makro her, welches das übernommen hat. So weit so gut zu dem Makro für Uwe's TechTalk.

Geöffnete Ordner in Visual Studio 2005 – diesselben Probleme wie in Visual Studio 2003
Abb. 1: Geöffnete Ordner in Visual Studio 2005.

Bei Visual Studio 2005 vermisse ich die Unterstützung von Ereignissen für Sounds. Visual Studio 2003 konnte das für die vielfältigsten Ereignisse, Visual Studio 2005 kann es nur noch, wenn ein Haltepunkt erreicht wird. Bei mittleren bis großen Softwareentwicklungsprojekten ist das durchaus für den einen oder andern ärgerlich, weil trotz und gerade deswegen, wegen Mehrkernprozessoren, 4 GB RAM und mehr, 1 TB RAID 0+1 und höher, Builds zwar noch ihre Zeit brauchen, aber man bequem weiterarbeiten kann. Ohne Feedback, ähnlich wie bei einer Tastatur die Taktilität, muss man ein ungefähres Zeitgefühl haben oder in Visual Studio nach dem Status eines Builds ständig nachschauen. Vielleicht rüstet Microsoft es ja auch im nächsten Service Pack für Visual Studio 2005 wieder nach? Wer weiß das schon so genau, daher habe ich ein Makro geschrieben.

Audioereignisse bei Visual Studio 2005
Abb. 2: Audioereignisse bei Visual Studio 2005 – nur noch für Haltepunkte.

Im Gegensatz zu einer Lösung im Web, überprüft mein Makro nicht die Zeichenfolge im Ausgabe-Fenster von Visual Studio 2005, sondern arbeitet über BuildEvents_OnBuildProjConfigDone(...) Handles BuildEvents.OnBuildProjConfigDone {4} mit Ereignissen aufgrund von angestoßenen Builds eines Projektes. Ist der Build eines Projektes erfolgreich, wird die Datei C:\Windows\Media\chimes.wav {2} abgespielt. Hakt es irgendwo und der Build klappt nicht, dagegen die Datei C:\Windows\Media\Windows Critical Stop.wav {3}. Ein sinnvoller Einsatz des Makros liegt außerdem darin, gleich den kompletten Build einer Lösung anzuhalten, wenn ein Build eines Projektes daraus nicht erfolgreich ist und zwar mit: DTE.ExecuteCommand("Build.Cancel") {5}. Damit nicht bei jedem Build eines Projektes, sondern nur bei der Lösung als solches eine Datei abgespielt wird, muss noch mit der Variable canceled {6, 8, 9} gearbeitet und die Entscheidung, welche Datei abzuspielen ist, in der Methode BuildEvents_OnBuildDone {7} getroffen werden.

Option Strict Off ... Public Module EnvironmentEvents {1} ... Declare Function PlaySound Lib "winmm.dll" Alias "sndPlaySoundA" _
(ByVal lpszSoundName As String, ByVal uFlags As Long) As Long Const BuildSucceedWaveFile = "C:\Windows\Media\chimes.wav" {2} Const BuildFailedWaveFile = "C:\Windows\Media\Windows Critical Stop.wav" {3} Dim canceled As Boolean = False Private Sub BuildEvents_OnBuildProjConfigDone( _ {4} ByVal Project As String, ByVal ProjectConfig As String, _ ByVal Platform As String, ByVal SolutionConfig As String, _ ByVal Success As Boolean) _ Handles BuildEvents.OnBuildProjConfigDone If Success = False Then DTE.ExecuteCommand("Build.Cancel") {5} canceled = True {6} End If End Sub Private Sub BuildEvents_OnBuildDone(ByVal Scope As EnvDTE.vsBuildScope, _ {7} ByVal Action As EnvDTE.vsBuildAction) Handles BuildEvents.OnBuildDone If Not canceled Then {8} PlayWaveFile(BuildSucceedWaveFile) Else PlayWaveFile(BuildFailedWaveFile) End If canceled = False {9} End Sub Private Sub PlayWaveFile(ByVal soundFile As String) PlaySound(soundFile, &H1 Or &H2) End Sub End Module

Danke an Dirk Primbs, der gerade auf VB abfährt, für den Tipp zu Handles. Es war dann doch viel einfacher als gedacht, dass Makro muss in EnvironmentEvents {1} eingefügt werden. Wo findet man das? Über den Makro-Explorer in Visual Studio [ALT + F8] und dort einfach auf das entsprechende Makro doppelt klicken.

EvironmentsEvents – Ort für die Reaktion auf Ereignisse in Makros bei Visual Studio 2005
Abb. 3: In EvironmentsEvents muss das Makro eingefügt werden.

Makro-Explorer in Visual Studio 2005
Abb. 4: Makro-Explorer in Visual Studio 2005.

PS: Nein Alex, das ist kein VBA. ;)

Declare Function PlaySound Lib "winmm.dll" Alias "sndPlaySoundA" _
   (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long
Const BuildSucceedWaveFile = "C:\Windows\Media\chimes.wav"
Const BuildFailedWaveFile = "C:\Windows\Media\Windows Critical Stop.wav"
Dim canceled As Boolean = False

Private Sub BuildEvents_OnBuildProjConfigDone( _
    ByVal Project As String, ByVal ProjectConfig As String, _
    ByVal Platform As String, ByVal SolutionConfig As String, _
    ByVal Success As Boolean) _
    Handles BuildEvents.OnBuildProjConfigDone

    If Success = False Then
        DTE.ExecuteCommand("Build.Cancel")
        canceled = True
    End If
End Sub

Private Sub BuildEvents_OnBuildDone(ByVal Scope As EnvDTE.vsBuildScope, _
    ByVal Action As EnvDTE.vsBuildAction) Handles BuildEvents.OnBuildDone
    If Not canceled Then
        PlayWaveFile(BuildSucceedWaveFile)
    Else
        PlayWaveFile(BuildFailedWaveFile)
    End If

    canceled = False
End Sub

Private Sub PlayWaveFile(ByVal soundFile As String)
    PlaySound(soundFile, &H1 Or &H2)
End Sub
Download (1,07 KB)
Page 1 of 1 in the VisualStudio category

CEO bei GROSSWEBER, Entrepreneur, Entwickler, Finanzinvestor. Promoter von Community, Open Source und
Open Spaces.

Ich biete Consulting und Schulungen / Trainings, u. a. zu mobilen Geräten, Lync.
GROSSWEBER

Bei GROSSWEBER wird praktiziert, was gepredigt wird. Dort werden Schulungen für moderne Softwaretechnologien angeboten, wie Behavior Driven Development, Clean Code, Git oder HTML5. Their staff is fluent in a variety of languages, including English.

Categories

Calendar

<August 2014>
SunMonTueWedThuFriSat
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

Archive

My subscribed blogs

Blogs of good friends