Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von Beauty
Thema: Extension mit LINQ: Auf angegebene Eigenschaft zugreifen ... MyList.AddSorted(item, x => x.Property)
Am im Forum: Datentechnologien

Hallo MrSparcle und LaTino,

danke für Eure hilfreichen Antworten.

Zitat
mit Linq hat das nicht viel zu tun.
Ich dachte das sei LINQ, weil ich die Schreibweise x => x.yy bisher nur von LINQ kenne.
Jemand mit Admin-Rechten könnte das Thema verschieben.
Zitat
Was du brauchst, ist eine sortierte ObservableCollection.
In meinem Fall wollte ich keine Liste neu sortierten, sondern ein Element in eine bereits vorsortierte Liste eintragen.
Außerdem wollte ich in Sachen Technologie dazulernen.

Hier meine Lösung, die ich schon an mehreren Stellen verwenden konnte:


/// <summary>
/// Add an item to the related position of an already sorted list.
/// By the keySelector parameter you can define which property of the item should be used for comparison.
/// </summary>
/// <typeparam name="TSource">Type of the item, which to insert</typeparam>
/// <typeparam name="TKey">Property of the item, which is used for comparison</typeparam>
/// <param name="list">List where to add the item</param>
/// <param name="item">Item, which to add</param>
/// <param name="keySelector">Definition of the property which to choose for comparison</param>
public static void AddSorted<TSource, TKey>(this IList<TSource> list, TSource item, Func<TSource, TKey> keySelector)
{
    Int32 insertPosition = list.Count; // by default add to the end
    if (keySelector(item) is IComparable<TKey>)
    {
        for (Int32 i = 0;   i < list.Count;   i++)
        {
            if (((IComparable<TKey>)keySelector(item)).CompareTo(keySelector(list[i])) < 0)
            {
                insertPosition = i;
                break;
            }
        }
    }
    list.Insert(insertPosition, item);
}

Thema: Extension mit LINQ: Auf angegebene Eigenschaft zugreifen ... MyList.AddSorted(item, x => x.Property)
Am im Forum: Datentechnologien

verwendete Technologie: LINQ

Aufruf:


MyList.AddSorted(newItem, x => x.PROPERTY);

Ziel:
In die Liste MyList soll das Element newItem eingefügt werden.
Und zwar an die "richtige" Stelle. (alphabetisch bei String, numerisch bei Zahl, etc.)
Der Lambda-Ausdruck gibt an, welche Eigenschaft (PROPERTY) des Objekts mit CompareTo() verglichen werden soll.

Annahme:
Es handelt sich um eine vorsortierte Liste.

Beispiel:
In Liste { 1, 3, 5 } wird 4 hinzugefügt, dann wird sie zu { 1, 3, 4, 5 }.
(Bezogen auf die Werte in der angegebenen Eigenschaft.)


Lösungsansatz:
Eine Erweiterung des Listen-Klassentyps (z. B. ObservableCollection).


public static void AddSorted<TSource, TKey>(this IList<TSource> list, TSource item, Func<TSource, TKey> keySelector)
{
    Int32 insertPosition = list.Count; // by default add to the end
    if (item.PROPERTY is IComparable<TSource>)
    {
        for (Int32 i = 0;   i < list.Count;   i++)
        {
            if (list[i].PROPERTY.CompareTo(item.PROPERTY) > 0)
            {
                insertPosition = i;
                break;
            }
        }
    }
    list.Insert(insertPosition, item);
}


Mein Problem:
Wie schreibt man den Code, daß auf die im Lambda-Ausdruck angegebene Eigenschaft zugegriffen wird?
Der String PROPERTY im Code ist ein Platzhalter.


Ich habe schon eine Weile im Netz und im Forum gesucht. Und auch Herumprobiert. Leider fand ich keine Lösung.


Über eine hilfreiche Antwort würde ich mich freuen.

P.S.
SortedList<> ist für mich keine Option, da ich es für eine ObservableCollection brauche.
Außerdem möchte ich in Sachen Technologie dazulernen.

Thema: CMake: Compiler-Option "pdb-only" setzen
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Hallo,

CMake kann Visual Studio-Dateien erzeugen.

Ich würde gerne wissen, mit welchem CMake-Script-Befehl man für den Release-Modus die Debug-Option "pdb-only" setzen kann.

Der Compiler-Befehl für Visual Studio müßte "/debug:pdbonly" sein.

Leide kenne ich mich mit CMake kaum aus.
Auch über eine Internet-Suche fand ich keine Info für diese Option im Zusammenhang mit CMake.

Kann mir jemand einen Tip geben?

Thema: Subversion - Revisions-Nummer auslesen + SVN-Nr. in Programm-Version eintragen
Am im Forum: .NET-Komponenten und C#-Snippets

Beschreibung:

Hier ist ein kleines Werkzeug für Subversion (SVN).
Es bezieht sich auf das Datenformat von Subversion 1.7 (SQLite).
Quellcode zum Auslesen des alten Formats findet man in Reading the revision number of a local copy of a SVN repository.

Mein Code kann folgendes:



Auslesen der aktuellen Revisionsnummer:

SvnTool.GetRevisionNumber(String svnDirectory)



Aktualisierung der Datei "ApplicationInfo.cs".
Dabei wird die letzte Stelle der Versionnummer durch die aktuelle SVN Revisionnummer ersetzt.
Ergebnis: Die Versionsnummer der Anwendung (oder Bibliothek) beinhaltet die SVN-Revisionsnummer (z.B. 1.0.0.0 wird zu 1.0.0.666)

UpdateAssemblyInfo(String svnDirectory, String assemblyInfoPath)

Thanks to Wiktor Zychla, who published a demo code how to read out the the revision information from the Subversion database.



Quellcode:


using System;
using System.Text;
using System.Text.RegularExpressions;
using System.Linq;
using System.IO;

namespace SubversionTool
{

/// <summary>
/// Class to grabb the current SVN revision number.  <br/>
/// Also it's possible to update the "ApplicationInfo.cs" file to include the SVN revision number to the application or library version.<br/>
/// Note: Works only for the database format of Subversion version 1.7 and newer (SQLite).
/// </summary>
/// <remarks>
/// If you need support of Subversion 1.6 and below, look to URL 
/// http://netpl.blogspot.com/2011/10/reading-revision-number-of-local-copy.html 
/// </remarks>
private class SvnTool
{
    // Written by Wiktor Zychla (October 2011)
    // Source:  http://netpl.blogspot.com/2011/10/reading-revision-number-of-local-copy.html
    // Modified by Andreas Voigt (January 2012)
    // Source:  http://www.mycsharp.de/wbb2/thread.php?threadid=101541

    private const String databaseFile      = "wc.db";
    private const String pattern = "/!svn/ver/(?'version'[0-9]*)/";


    /// <summary>
    /// Grabb SVN information (Database format of Subversion version 1.7) <br/>
    /// If faild, it returns an empty String.
    /// </summary>
    /// <param name="svnDirectory">Absolute path to the Subversion directory (e.g. "C:\myProject\.svn") </param>
    public static String GetRevisionNumber(String svnDirectory)
    {
        String SvnSubfolder = svnDirectory;

        if (Directory.Exists(SvnSubfolder))
        {
            Int32 maxVer = 0;
            String EntriesFile = Directory.GetFiles(SvnSubfolder, databaseFile).FirstOrDefault();

            if (!String.IsNullOrEmpty(EntriesFile))
            {
                Byte[] fileData;
                try
                {
                    fileData = File.ReadAllBytes(EntriesFile);
                }
                catch (Exception)  // e.g. file not readable, because it's locked by an other thread
                {
                    return String.Empty;
                }
                String fileDataString = Encoding.Default.GetString(fileData);

                Regex regex = new Regex(pattern);

                foreach (Match match in regex.Matches(fileDataString))
                {
                    String version = match.Groups["version"].Value;
                    Int32 curVer;

                    if (Int32.TryParse(version, out curVer) == true)
                        if (curVer > maxVer)
                            maxVer = curVer;
                }

                if (maxVer > 0)
                    return maxVer.ToString();
            }
        }
        return String.Empty;
    } // GetRevisionNumber()





    /// <summary>
    /// Grabb and save the SVN revision number to the version information of the "AssemblyInfo.cs" file. 
    /// As result the last number of the application version is equal to the SVN revision. (e.g. "1.0.0.666")
    /// </summary>
    /// <param name="svnDirectory">Absolute path to the Subversion directory (e.g. "C:\myProject\.svn") </param>
    /// <param name="assemblyInfoPath">Absolute path to the file "AssemblyInfo.cs"</param>
    public static Boolean UpdateAssemblyInfo(String svnDirectory, String assemblyInfoPath)
    {
        // get current revision
        String revision = GetRevisionNumber(svnDirectory);
        if (revision == "")
        {
            Console.WriteLine("WARNING: Can't update information about Subversion revision."
                            + " (Failed to grabb from SVN database)");
            return false;
        }


        //---- update file "AssemblyInfo.cs" ----

        try
        {
            if (File.Exists(assemblyInfoPath) == false)
            {
                Console.WriteLine("WARNING: Can't update information about Subversion revision. "
                                + "(File 'AssemblyInfo.cs' not found)");
                return false;
            }

            Boolean doUpdate = false;

            // read file content
            FileStream assFileStream = new FileStream(assemblyInfoPath, FileMode.Open, FileAccess.Read);
            StreamReader assFileReader = new StreamReader(assFileStream);
            Encoding encodingType = assFileReader.CurrentEncoding;  // important for saving
            String assemblyInfoFileContent = assFileReader.ReadToEnd();
            assFileReader.Close();
            assFileStream.Close();


            //-- update "AssemblyVersion" entry --

            // build pattern for [assembly: AssemblyVersion("1.1.0.0")]
            String assemblyPattern_1 = @"(\[assembly: AssemblyVersion\(#\d+\.\d+\.\d+\.)\d+(#\)\])";
            assemblyPattern_1 = Regex.Replace(assemblyPattern_1, "#", "\"");  // replace symbols # by "

            // try to find pattern
            Match match_1 = Regex.Match(assemblyInfoFileContent, assemblyPattern_1);

            if (match_1.Success)
            {
                String replacement_1 = match_1.Groups[1] + revision + match_1.Groups[2];

                // check if content (revision number) changed
                if (match_1.Value != replacement_1)
                {
                    // update file content
                    assemblyInfoFileContent = assemblyInfoFileContent.Replace(match_1.Value, replacement_1);
                    doUpdate = true;
                }
            }


            //-- update "AssemblyFileVersion" entry --

            // build pattern for [assembly: AssemblyFileVersion("1.1.0.0")]
            String assemblyPattern_2 = @"(\[assembly: AssemblyFileVersion\(#\d+\.\d+\.\d+\.)\d+(#\)\])";
            assemblyPattern_2 = Regex.Replace(assemblyPattern_2, "#", "\"");  // replace symbols # by "

            // try to find pattern
            Match match_2 = Regex.Match(assemblyInfoFileContent, assemblyPattern_2);

            if (match_2.Success)
            {
                String replacement_2 = match_2.Groups[1] + revision + match_2.Groups[2];

                // check if content (revision number) changed
                if (match_2.Value != replacement_2)
                {
                    // update file content
                    assemblyInfoFileContent = assemblyInfoFileContent.Replace(match_2.Value, replacement_2);
                    doUpdate = true;
                }
            }



            // save to file (if needed)
            if (doUpdate)
            {
                FileStream assFileStream2 = new FileStream(assemblyInfoPath, FileMode.Truncate, FileAccess.Write);
                StreamWriter assFileWriter = new StreamWriter(assFileStream2, encodingType);
                assFileWriter.Close();
                assFileStream2.Close();
            }

        }
        catch (IOException e)
        {
            Console.WriteLine("WARNING: Can't update information about Subversion revision. "
                            + "(Problem at access to file 'AssemblyInfo.cs')\n    " + e.Message);
            return false;
        }

        return true;

    } // UpdateAssemblyInfo()


} // class SvnTool

} // namespace SubversionTool


Schlagwörter: SVN, Subversion, number, version, versionnumber revision, application, Versionsnummer, Programmversion, auslesen,
csharp, cs, csharp, C#, code, snippet, class

Thema: GroupBox Rahmenfarbe
Am im Forum: GUI: Windows-Forms

Auf einer anderen Website hatte ich Code gefunden, verbessert und dort veröffentlicht.

Der Rahmen hat dann auch abgerundete Ecken und einen zweiten Dekorationsrahmen.
Das Control ist auch flimmerfrei und ohne Pixelfehler (beim Verschieben/Größenänderung vom Fenster)
... Die Verbesserung konnte ich durch herbivores tolle Tutorials machen. Danke!!



Mein Code inklusive Anleitung zur einfachen Verwendung steht hier:
Changing border color of GroupBox

Leider gibt es auf der Seite keinen Direkt-Link zu meinem Beitrag.
Daher runterscrollen bis Improved version erscheint (fett/groß geschrieben)

Vielleicht kann es ja mal einer gebrauchen.

Thema: RegEx Studio
Am im Forum: Projekte

Ich habe gerade festgestellt, daß es bereits eine andere, kommerzielle Software mit dem Namen "Regex Studio" gibt.

Das könnte zu Verwechselungen führen oder gar eine Abmahnung zur Folge haben (vermute ich).
Darauf wollte ich nur mal kurz hinweisen.

Siehe hier:
www . regexstudio . com
(Den Link habe ich extra "verschleiert", damit die Leute dort nicht über die Browser-Rückreferenz direkt auf "unsere" Software aufmerksam werden.)

Thema: RegEx Studio
Am im Forum: Projekte

Ich habe es installiert und kurz ausprobiert.
Macht einen brauchbaren Eindruck - Danke (-:

Intensive Tests erfolgen später, wenn ich mal wieder was mit RegEx mache.

Thema: TreeView.ItemTemplate: verschiedene Shapes (Icons) als Resource einbinden
Am im Forum: GUI: WPF und XAML

Ui, das ging ja schnell. Danke (-:

Deine verlinkte Website bezieht sich auf .NET 4.0.
Meine Anwendung kann ich aus Kompatibilitätsgründen nur mit .NET 3.5 benutzen. (Sonst gibt es Probleme mit mindestens einer externen Bibliothek/DLL-Datei.)
Aber mal sehen, vielleicht geht das auch mit .NET 3.5.

Thema: TreeView.ItemTemplate: verschiedene Shapes (Icons) als Resource einbinden
Am im Forum: GUI: WPF und XAML

Hallo,

ich bin ziemlich verzweifelt. Seit Stunden versuche ich ein warscheinlich triviales Problem zu lösen.
Ich las in einem WPF-Buch, suchte im Internet, las in der MSDN-Doku, probierte herum, komme aber nicht weiter.


Was ich machen will:

In einer TreeView liste ich verschiedene Elemente auf.
So soll das dann aussehen.


Für meinen TreeView-"Prototyp" (siehe Bild) habe ich die Shapes direkt im jeweiligen Header definiert.


<TreeViewItem>
    <TreeViewItem.Header>
        <StackPanel Orientation="horizontal">
            <Rectangle Width="10" Height="10" Fill="LightGreen" Stroke="DarkGreen"  />
            <TextBlock>Seewolf</TextBlock>
        </StackPanel>
    </TreeViewItem.Header>
    <!-- ... weitere Elemente ... -->
<TreeViewItem>

Die Shape-Definitionen sind z.B.:

<Rectangle Width="10" Height="10" Fill="LightGreen" Stroke="DarkGreen" VerticalAlignment="Center" />
<Ellipse Width="10" Height="10" Fill="Blue" Stroke="DarkBlue" />
<Ellipse Width="10" Height="10" Fill="OrangeRed" Stroke="DarkOrange" />



Mein Ziel ist es, statt dessen Templates zu definieren.

Die Daten für jedes Element sind in einer speziellen Klasse gespeichert.
Dadurch kann über Binding z.B. auf die Eigenschaften "Name" und "NodeType" zugegriffen werden.

Das Template bindet den Namen ein, der angezeigt wird (z.B. "Obstacle 1").
Abhängig vom Inhalt der Variable "NodeType" soll für jedes Element ein bestimmtes Shape angezeigt werden.
Das könnte ich mit einem DataTrigger lösen, der das entsprechende Shape anzeigt.

Schritt 1 funktioniert:
Einbindung der Elemente erfolgt über ein Template.
Meine Daten werden geladen und im TreeView eingebunden.
Die Anzeige der Eigenschaft "Name" funktioniert.

<TreeView>
<TreeView.ItemTemplate>
    <HierarchicalDataTemplate ItemsSource="{Binding Children}">
        <StackPanel Orientation="Horizontal">

            <!-- HIER SHAPE EINFÜGEN ..... Rectangle/Circle abhängig vom Inhalt in {Binding NodeType} -->

            <TextBlock Text="{Binding Name}" />
        </StackPanel>
    </HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>


Die verschiedenen Shapes möchte ich als statische (oder besser logische?) Resource definieren. (z.B. in einem ResourceDirectory)

    <Rectangle x:Key="shape1" Width="10" Height="10" Fill="LightGreen" Stroke="DarkGreen" VerticalAlignment="Center" />
    <Ellipse   x:Key="shape2" Width="10" Height="10" Fill="Blue" Stroke="DarkBlue" />
    <Ellipse   x:Key="shape3" Width="10" Height="10" Fill="OrangeRed" Stroke="DarkOrange" />


Mein Problem:
Wie binde ich die verschiedenen Shape-Typen (Rectangle, Ellipse, etc.) in das Template ein?

Schon das einfache Einbinden eines Shapes als Resource bekomme ich nicht hin.
Also einfach nur sowas:

<TreeView>
<TreeView.ItemTemplate>
    <HierarchicalDataTemplate ItemsSource="{Binding Children}">
        <StackPanel Orientation="Horizontal">

            <!-- wie verweist man auf die Resource? -->
            <Rectangle VERWEIS="shape1" />  

            <TextBlock Text="{Binding Name}" />
        </StackPanel>
    </HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>





Weiteres Problem:
Rectangle, Ellipse, etc. sind verschiedene Typen (abgeleitet von "Shape").
Ich kann also nur auf den gleichen Typ verweisen.
Meine Lösungs-Idee dafür: Die Shapes in eine ViewBox verpacken.
Also etwa so:

<!-- Resourcen in ViewBox-Elementen -->
<ViewBox  x:Key="shape1">
    <Rectangle Width="10" Height="10" Fill="LightGreen" Stroke="DarkGreen" VerticalAlignment="Center" />
</ViewBox>
<ViewBox  x:Key="shape2">
    <Ellipse Width="10" Height="10" Fill="Blue" Stroke="DarkBlue" />
</ViewBox>
<ViewBox  x:Key="shape3">
    <Ellipse Width="10" Height="10" Fill="OrangeRed" Stroke="DarkOrange" />
</ViewBox>


<!-- Einbindung ins TreeView-Template -->
<TreeView>
<TreeView.ItemTemplate>
    <HierarchicalDataTemplate ItemsSource="{Binding Children}">
        <StackPanel Orientation="Horizontal">

            <!-- Verweis auf entsprechende ViewBox -->
            <ViewBox VERWEIS="shape1" />  <!-- aber wie? -->

            <TextBlock Text="{Binding Name}" />
        </StackPanel>
    </HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>



Wenn ich die Sache mit den Verweisen hinbekommen habe, dann kann ich das Ganze erweitern und über einen DataTrigger steuern, welches Icon (ViewBox mit Shape) für welches Element im TreeNode angezeigt wird.
Für DataTrigger habe ich ein nützliches Beispiel gefunden, was ich dann verwenden kann.


So, jetzt habe ich ganz schön viel geschrieben.
Es ist nicht immer einfach zu sagen, was man genau möchte.
Ich hoffe, das war verständlich.
Und ich hoffe, meinen langen Text hat jemand überhaupt gelesen. (-;

Hat jemand eine Idee, wie ich weiterkomme?

Ihr müßt keinen Roman schreiben (wie ich).
Es hilft bereits, wenn ich ein paar nützliche Schlagwörter, Code-Schnipsel oder Links bekomme.

P.S.
Das Bild von oben habe ich (als Backup) nochmal in den Anhang gepackt. Dann ist es immernoch zu sehen, wenn das obige irgendwann beim Bildhoster gelöscht wird.

Thema: Regex matcht zu viel trotz Verwendung des Layz-Operators
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Übrigens:
Für die Entwicklung und zum Test von regulären Ausdrücken gibt es nütliche Programme.
Eines ist der Regex Coach:
http://weitz.de/regex-coach

Thema: Auszüge aus XML-Kommentaren erstellen
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Ui, JAck30lena, Du bist ja ganz schön schnell (-:
Und auch Du, herbivore.
Stimmt, ich könnte auch auf MSDN suchen statt nur über Google.

Die XML-Parser-Klassen kenne ich.
Ich dachte nur, falls schon ein fertiger Parser für diese spezielle XML-Datei existiert, dann bräuchte ich das Rad nicht neu erfinden.

Thema: Auszüge aus XML-Kommentaren erstellen
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Oh, mir ist gerade eine Idee gekommen:

Wenn man mit Visual Studio kompiliert, wird eine Datei mit allen XML-Kommentaren automatisch erstellt. ( <projektName>.XML )
Ich könnte also auch daraus meine Infos extrahieren.
Kennt jemand eine Klasse, die diese XML-Datei ausliest und die Daten bequem zur Verfügung stellt?
Dann müßte ich keinen eigenen XML-Parser schreiben.

Thema: Auszüge aus XML-Kommentaren erstellen
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Hallo,

meine Frage in Kurzform:

Kann man den Inhalt von XML-Kommentaren per Quellcode auslesen?
Beispiel:


/// <summary>Das sind Beispiele</summary>
public enum BeispielEnums
{
    /// <summary>Beschreibung zu Eintrag1</summary>
    Eintrag1
}

Und dann z.B. auf den Inhalt von BeispielEnums.Eintrag1 zugreifen.

Gibt es dafür eine spezielle Klasse in .NET oder als externes Projekt?
Leider fand ich nichts hilfreiches im Internet. Vielleicht fehlt mir auch das richtige Schlagwort?



Hintergrund:

In meinem Projekt habe ich sehr viel in den XML-Kommentaren dokumentiert. Daraus kann man auch prima eine Hilfe-Datei erstellen lassen (msbuild / Sandcastle help file builder).
Meine Software wird jetzt (ohne Quellcode) rausgegeben werden und zu Doku-Zwecken möchte ich die XML-Kommentare einiger Enums, Strings, etc. in eine Text-Datei ausgeben.
Zwar könnte ich die Inhalte auch per Hand aus dem Quellcode kopieren, aber wenn sich später die XML-Kommentare ändere, dann müßte ich auch gleich die Doku überarbeiten. Besser wäre, wenn dieser Teil der Doku dynamisch generiert werden kann.

Thema: Genaue Zeitfunktion
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Sehr nützlicher Artikel - darüber habe ich auch weitere relevante Seiten gefunden.

Danke (-:

Thema: Genaue Zeitfunktion
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Mir geht es nicht um einzelne Mikrosekunden (oder gar Nanosekunden wie in einem anderen Thread), sondern nur darum, etwas genauer zu sein als wie die Rückgabe von DateTime.Now.Ticks.

Früher dachte ich blauäugig, die Zeitabfrage wäre wirklich so genau (etwa 100ns), aber später bemerkte ich eigenartige Effekte bei einem Programm. Ursache war, daß der Zeitwert von DateTime.Now.Ticks lange nicht so oft aktualisiert wird, wie der Name es vermuten läßt. Ich weiß die Aktualisierungsabstände nicht mehr. Vielleicht wurde etwa jede Millisekunde der Wert aktualisiert.

Der QueryPerformanceCounter ist eigentlich eine tolle Sache, aber die oben genannten (möglichen) Probleme machen mich etwas skeptisch.

Thema: Genaue Zeitfunktion
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Ah, Du meinst das:

Zitat
die Stopwatch verwendet intern den QueryPerformanceCounter und somit dürfte keine Unterschied zwischen den beiden bestehen.

Theoretisch könnte es sein, daß die Stopwatch-Klasse schwankende CPU-Taktungen berücksichtigt. Vielleicht finde ich dazu was in der Doku.

Dennoch bleibt noch die Frage offen, ob es möglicherweise eine alternative (externe) Bibliothek für sowas gibt. Daher ist hochscrollen keine ultimative Lösung

Thema: Genaue Zeitfunktion
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Oh, jetzt habe ich doch noch etwas interessantes gefunden:

Zitat von herbivore
Hallo Xqgene

wenn ich mit Stopwatch 10 mal in einer Schleife die Zeit für eine leere Anweisung messe, bekommt ich auf meinem Rechner exemplarisch folgende Ausgabe in Ticks (Jeder Tick stellt laut Doku ein Intervall von 100 Nanosekunden dar):

6
5
5
4
5
5
5
5
4
5

Also Schwankungen im Bereich von 200 Nanosekunden. Ich glaube das disqualifiziert auch die ansich nützliche Stopwatch für Messungen im Bereich von 0.1 - 5 nanosec. :-)

herbivore

Mit der Stopwatch-Klasse kann man also Zeitintervalle fast mit Tick-Genauigkeit messen.
Ich hoffe, da gibt es nicht so die Probleme wie beim QueryPerformanceCounter.

Thema: Genaue Zeitfunktion
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo,

in einer Diskussion im Ogre-Forum (3D Grafikbibliothek) geht es auch gerade um FPS-Messungen (Bilder pro Sekunde) und FPS-Begrenzung (nicht schneller als xxx FPS rendern).
Als ich auf den QueryPerformanceCounter hinwies, bekam ich eine Antwort, daß das (heutzutage) Probleme verursachen kann:

Zitat
Using the QueryPerformanceCounter functions can cause problems on multi-core CPUs, at least there were some serious problems in the past. I don't know if the .NET Stopwatch class is aware of the problem and contains a fix.

On most machines you should be fine using any of these methods. If you have strange effects, just remember that you might have to take care of these bugs.

A little more detail:
On multi-core CPUs the performance counter on different cores can have different values. If the scheduler changes your program flow to another core, you might get strange readings like large differences between calls. If you create a time delta every frame (currentTimeStamp - lastTimeStamp) and you get negative values, you just encountered this problem.

The easiest way is to use a background thread with an affinity mask that binds it to only one core. So the functions will always use the same performance counter and the problem is solved. You'll have to do this in C or C++ code, because .NET has its own internal scheduler that is independent of the system scheduler and you can't change the affinity mask in a reliable way.

More information about QueryPerformanceCounter problems can be found here and here.


Auch wenn die Zeitmessung ausschließlich auf einem CPU-Kern stattfindet, kann ich mir Probleme vorstellen, da sich bei modernen CPUs die Taktfrequenz dynamisch ändern kann. (Es sei denn, man liest ständig QueryPerformanceFrequency aus und beachtet Änderungen in den Zeitberechnungen. Trotzdem wären dann Zeitvergleiche komplizierter zu berechnen.)


Frage:
Gibt es vielleicht eine Bibliothek für präzise Zeitmessungen, die man bei .NET-Programmen einbinden kann und die oben genannten Probleme berücksichtigen? Ich hatte selber schon gesucht, aber nichts passendes gefunden.

Thema: ExtendedFileDialog von codeproject feuert unter Win7 x64 keine Events
Am im Forum: GUI: Windows-Forms

Welches Projekt meinst Du genau?
Weder hier noch auf der Codeproject website finde ich ExtendedFileDialog.
Es gibt mehrere Projekte zu der Thematik.
Eine Übersicht meiner Recherchen habe ich weiter oben aufgelistet.


Das Projekt Extend OpenFileDialog and SaveFileDialog the easy way ist meiner Ansicht nach eine gute Wahl und (vor 6 Monaten) am aktuellsten. (Wie man es einbindet, habe ich über Deinem Beitrag beschrieben) Der Autor schrieb mir damals, daß er nach Erscheinen von Visual Studio 2010 das Projekt aktualisieren und u.a. meine genannten Bugfixe einbauen will. Das habe ich nicht kontrolliert.
Bei Problemen schaue am Besten in die Diskussion unter der Projektbeschreibung auf Codeproject. Da werden Probleme und teils auch Lösungen genannt. Da Windows 7 weit verbreitet ist, vermute ich, daß dort auch Lösungen veröffentlich wurden.
Wenn nicht, dann schreibe bitte auf der Projektseite Deinen Bugreport. Ober oder wie schnell jemand drauf antwortet, weiß ich nicht. Der Autor hatte mir damals recht schnell geantwortet.

Hast Du Deine Anwendung für 32 oder 64 bit compiliert?
Falls 64 bit - dann probier bitte interessehalber mal, ob der Fehler auch auftritt, wenn Du nach 32 bit compilierst.

Thema: freie Windows Symbole/Icons
Am im Forum: Smalltalk

Ich habe jemandem die Liste meiner Lesezeichen zum Thema Icon-Websites geschickt.
Hier nun eine Kopie für Interessierte. Einiges wurde schon genannt.
Ich glaube alle sind kostenlos, aber nicht alle sind für kommerzielle Software zulässig. Doch ich glaube das waren recht viele davon.
Beschreibungen habe ich weggelassen. Einfach durchklicken und schauen, ob brauchbar (-;

http://www.wincustomize.com/index.aspx?u=0
http://www.wilsonc.demon.co.uk/d10resourceeditor.htm
http://webdesignledger.com/tag/icons
http://www.famfamfam.com/lab/icons
http://www.famfamfam.com/lab/icons/silk/preview.php
http://pinvoke.com
http://www.x2studios.com/index.php?page=products&id=11
http://download.chip.eu/de/Vista-Icons-Pack-3.0_151414.html
http://commons.wikimedia.org/wiki/Crystal_Clear
http://commons.wikimedia.org/wiki/User:CyberSkull/Images/Crystal_Clear
http://sw-guide.de/webdesign-und-entwicklung/icon-sammlungen
http://www.freeiconsweb.com/free_icons.html
http://www.iconaholic.com
http://www.microsoft.com/whdc/devtools/debugging/symbolpkg.mspx
http://www.files32.com/downloads.asp?software=icons
http://tango.freedesktop.org/Tango_Icon_Library
http://www.iconarchive.com
http://www.iconbuffet.com
http://www.drweb.de/magazin/symbole-buttons-und-icons-zum-download
http://www.smashingmagazine.com/2007/05/24/freebies-round-up-icons-buttons-and-templates
http://www.glyfx.com/products/free.html
http://www.kde-look.org
http://vistaicons.com


Nützliche Icon-Suchmaschinen, wo man u.a. die gewünschte Lizenz eingeben kann:
http://www.iconlet.com
http://www.veryicon.com
http://www.iconlook.com
http://www.iconfinder.net

Thema: TextBox automatisch scrollen
Am im Forum: GUI: Windows-Forms

Die Lösung:

this.textBox1.SelectionStart = this.textBox1.Text.Length - 1;
this.textBox1.SelectionLength = 0;
this.textBox1.ScrollToCaret();

Da der Zeichen-Index mit 0 beginnt, ist das letzte Zeichen bei Stelle Length - 1

Thema: Einlesen der X und Y Achsenrotation sowie der Buttons eines Gamepads
Am im Forum: Rund um die Programmierung

Ich habe auch eine Gamepad-Ansteuerung für C# gesucht und ein interessantes Projekt gefunden:

SlimDX

Zitat
What is SlimDX?

SlimDX is a free open source framework that enables developers to easily build DirectX applications using .NET technologies such as C#, VB.NET, and !IronPython. It is designed to be an efficient, simple, and lean wrapper that fully encompasses all of Microsoft's gaming and multimedia technologies and exposes them to managed code. All of the code is under the MIT/X11 license, and all content is under the Creative Commons Attribution-Share Alike license.

Kurz gesagt:
Eine praktische Bibliothek, mit der man u.a. recht einfach über DirectX auf Gamepads zugreifen kann.
Die MIT-Lizenz erlaubt auch die Einbindung in kommerzielle Projekte. (Soweit ich weiß. Sollte ich falsch liegen, bitte korrigieren.)

Im download Developer SDK sind auch Beispiele enthalten.
Eins bezüglich Gamepads ist im Verzeichnis
...\SlimDX SDK (August 2009)\Samples\DirectInput\Joystick
Es fragt die Zustände aller angeschlossenen Gamepads ab und zeigt sie in einer GUI.

Den Code vom Beispiel habe ich teilweise übernommen und kann jetzt mit meinem eigenen Programm mein Gamepad abfragen. Das "Einbauen" des Codes ging relativ schnell und funktioniert prima (-:

Download hier:
http://slimdx.org/download.php

Thema: freie Windows Symbole/Icons
Am im Forum: Smalltalk

Falls jemand Icons selber erstellen möchte - hier habe ich eine schöne Übersicht über kostenlose Icon-Programme gefunden:

http://mtechnologieinnovationn.blogspot.com/2009/11/er-gibt-deine-ikonen-mit-diesen-6.html

Für den Fall, daß es die Seite in Zukunft nicht mehr geben sollte, hier eine Übersicht der genannten Programme:

* Greenfish Icon Editor Pro
* IconFX
* Sib Icon Editor
* Stardock IconDeveloper
* aaICO Icon Editor
* LiquidIcon XP


Auf einer anderen Seite wurde von "Profis" ein open souce Vektor-Grafik-Programm empfohlen:
InkScape


In diesem Thema geht es zwar um fertige Icons, aber vielleicht ist diese Übersicht trotzdem für jemand hilfreich

Thema: VS2005-2010: Geöffnete Dateien, neuste nach rechts
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Genau das selbe würde ich auch gerne einstellen.
Zwar bei Visual Studio 2008, aber die Option wird vermutlich ähnlich heißen.

Thema: [Artikel] CustomDialogs
Am im Forum: Artikel

So, ich habe jetzt das oben genannte codeproject Extend OpenFileDialog and SaveFileDialog the easy way ausprobiert und meine Erweiterung dort eingebaut.

Auch dort mußte ich 2 Bugs fixen, die Ausnahmen geworfen haben *g*

Aber nun funktioniert es prima =)


Auch die Handhabung finde ich gut.
Man fügt das Projekt als UserControl hinzu und kann dann die GUI mit dem Designer von Visual Studio bequem gestalten.
Am Anfang wußte ich nicht wie man das UserControl hinzufügt. Die deutsche Übersetzung heißt Benutzersteuerelement. Wenn man das nicht weiß, muß man erst einmal eine Weile suchen (so wie ich).


So geht es:
Datei FileDlgExtenders.dll ins eigene Projekt kopieren und Referenz darauf hinzufügen.
Jetzt erst einmal neu kompilieren.

Dan geht man in den Projekt-Explorer und rechtsklickt auf das Projekt.
Dann Hinzufügen und dann Neues Element...
Links die Kategorie Windows Forms auswählen und rechts Geerbtes Benutzersteuerelement auswählen.
Unten Dateiname angeben und Hinzufügen klicken.
(Dann kommen bei mir 2 Warnungen - können ignoriert werden)
Im nächten Fenster auf Durchsuchen... klicken.
Dann die Datei FileDlgExtenders.dll referenzieren (die man vorher ins eigene Projekt kopiert).
Es erscheint anschließend in einer Liste, man wählt sie aus (anklicken) und klickt auf OK
Jetzt sollte das UserControl erscheinen.

Diverse Einstellungen kann man über die Eigenschaften machen - so wie bei einer Form.


Auf Grund (für mich) notwendiger Bugfixes habe ich den ganzen Quellcode aus dem Verzeichnis FileDlgExtenders in mein Projekt kopiert (und die Referenz auf die dll-Datei anschließend gelöscht).
So ist es möglich, das Projekt bequem zu debuggen.


Ich schreibe das so ausführlich, weil es vielleicht jemand gebrauchen könnte.

Thema: [Artikel] CustomDialogs
Am im Forum: Artikel

Ich habe mir mal angesehen, was es auf codeproject.com für mögliche C#-Alternativen für diesen Dialog gibt.


Customizing OpenFileDialog in .NET
Das Projekt wurde auch schon oben genannt. Leider hat es der Autor nicht mehr aktualisiert.
Verbesserungen und Bugfixes sind irgendwo in den vielen Kommentaren versteckt. (z.B. Unterstützung für neuere Windows-Versionen)
Letztes Update: 2006


Extend OpenFileDialog and SaveFileDialog the easy way
Ähnliche Funktionalität. Laut Beschreibung basiert es auf dem obigen Projekt Customizing OpenFileDialog in .NET, wurde aber erweitert und aktualisiert. Läuft auch auf Vista und Win7.
Das ist meine Empfehlung (Details dazu unten im übernächsten Beitrag).
Letztes Update: 2009


Extend OpenFileDialog and SaveFileDialog Using WPF
Ähnliches für WPF-Anwendungen
Letztes Update 2009


Full implementation of IShellBrowser
So wie es aussieht, hat jemand den Dialog (komplett?) nachprogrammiert und man kann den Dialog völlig frei gestalten (inkl. der "Standard-Elemente").
Letztes Update: 2009


Remote Control of Microsoft FileDialog Class (OpenFileDialog)
Beschreibt, wie man den "originalen" Dialog beeinflussen kann, um per Quellcode eine bestimmte Spalte zu sortieren (z.B. nach "Datum").
Letztes Update: 2009


FileDialogExtender
Hier geht es auch um die Erweiterung des originalen Dialogs, aber ich konnte auf den ersten Blick nicht erkennen, in welchem Umfang.
Letztes Update: 2004


Das ist nicht als Konkurrenz gedacht, sondern nur zur Information.
Vielleicht ist es ja brauchbar für andere Leute, die auch Probleme mit dem Projekt aus diesem Thread haben.
Eventuell findet man dort auch Problem-Lösungen und Anregungen.


Ergänzung:

Der Autor dieses Projekters (dr4g0n76) hat den Datei-Öffnen-Dialog komplett nachprogrammiert.
Siehe Thema CustomFileDialog


Der MSDN-Artikel Extensibility of Common Dialogs beschreibt die Grundlagen (Hooking etc.), wie man den Öffnen-Dialog erweitern kann.

Thema: [Artikel] CustomDialogs
Am im Forum: Artikel

Gibt es auch andere Leute, die dieses Projekt verwenden?

Wenn ja, wie sind die Erfahrungen? Gibt/Gab es da auch Probleme?

(Ausnahmen sind im Original-Code aber nicht zu erkennen, weil ein try/catch-Block alles abfängt. Bei einer Ausnahme schließt sich einfach das Dialog-Fenter.)

Langsam fange ich an zu verzweifeln ...

Thema: [Artikel] CustomDialogs
Am im Forum: Artikel

Ich verstehe das ganze nicht.

Jetzt nach dem Abendbrot habe ich wieder experimentiert.
Das zuletzt genannte Problem kann ich garnicht mehr reproduzieren.
Vorhin kam die Ausnahme ständig, wenn der Pfad der Datei (im Feld Objektname) anders war.

Meine Vermutung war, daß das vielleicht nur bei einem anderen Laufwerksbuchstaben auftritt. Aber auch da bekomme ich keine Ausnahme mehr. Es funktioniert korrekt.



Dennoch bekomme ich immer mal wieder eine AccessViolationException bei der im letzten Beitrag genannten Stelle.
Und zwar, wenn ich eine Datei gewählt habe und dann auf OK klicke.
Mal klappt es 2x problemlos, mal klappt es 10x problemlos. Dann kommt die Ausnahme.


An meinem eigenen Code liegt es scheinbar nicht (z.B. in Callback-Funktion).
Bei einem Versuch habe ich ihn auskommentiert, bei einem anderen Versuch habe ich das Originale Beispiel-Programm verwendet (mit der Modifikation, daß Ausnahmen nicht abgefangen werden).




Noch ein neues Problem fiel mir auf:

Wenn das Auswählen einer Datei erfolgreich war, dann kann man den Dateiname (inkl. Pfad) über die Eigenschaft OpenFileDialog.SelectedPath abfragen.

In seltenen Fällen liefert der Wert "Müll" zurück.

1)
Es kam vor, daß der Pfad abgeschnitten war
z.B. G:\OgreS

2)
Es kam vor, daß kryptische Zeichen enthalten waren.
Entweder nach einem abgeschnittenen Pfad (siehe Anhang) oder mitten drin.

Das war aber nicht abhängig von der gewählten Datei.
Denn die Dateien, bei der die Fehler auftraten, ließen sich bei mehreren Wiederholungen problemlos ermitteln. (SelectedPath lieferte dann den richtigen Wert)


Der Wert wird intern über diesen Code ermittelt (Datei OpenFileDialog.cs):


public string SelectedPath
{
	get { return Marshal.PtrToStringUni( m_ptrFileNameBuffer ); }
}

Thema: [Artikel] CustomDialogs
Am im Forum: Artikel

Jetzt habe ich eine reproduzierbare Ursache gefunden, eine AccessViolationException zur Folge hat.

Sie tritt auf, wenn man im Feld "..." des Dialoges eine Datei inklusive Pfad einfügt und das aktuelle Verzeichnis nicht dem Pfad entspricht, die in der Datei angegeben ist (und anschließend OK geklickt wird).

Beispiel:
aktuelles Verzeichnis = "C:\Eigene Bilder";
Datei mit Pfad = "C:\pfad\woanders\datei.txt"

Wenn der Datei-Pfad auch dem aktuellen Pfad entspricht, gibt es keine Probleme.


Die Ausnahme tritt in der Datei OpenFileDialog.cs auf.


private bool ShowInternal()
{
    Boolean m_catchExceptionsOfShow = false;  // TEST
    bool bSuccess = false;

    if (m_catchExceptionsOfShow)
    {
        try
        {
            bSuccess = NativeMethods.GetOpenFileName(ref this.m_OpenFileName);
            return bSuccess;
        }
        catch (Exception ex)
        {
            return bSuccess;
        }
    }
    else  // don't catch exceptions
    {
        return NativeMethods.GetOpenFileName(ref this.m_OpenFileName);  // HIER AccessViolationException
    }
}


Wo die programmiertechnische Ursache nun liegt, weiß ich nicht. Doch es würde mich freuen, wenn das Problem behoben wird.

P.S.
Auch dieses Problem konnte ich nur finden, weil ich in der modifizierten Methode ShowInternal() keine Ausnahmen kommentarlos abfange. (So wie in der ursprünglichen Version)


Ergänzung:
Die Variable m_OpenFileName kann ich vor dem Aufruf von GetOpenFileName(...) nicht einfach manipulieren, um den Pfad zu korrigieren.
Sie ist ein Struct, das keinen String enthält. Statt dessen sind nur die Datentypen Int32, IntPtr und ein OfnHookProc enthalten.

Thema: c#-unicode
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hier eine kleine Ergänzung/Übersicht zum Thema Byte Order Mark.
Diese Infos habe ich aus der Wikipedia (hier).

    Bytefolge         Kodierung

    EF BB BF ........ UTF-8 
    FE FF ........... UTF-16 Big Endian
    FF FE ........... UTF-16 Little Endian
    00 00 FE FF ..... UTF-32 Big Endian
    FF FE 00 00 ..... UTF-32 Little Endian

Falls es jemand braucht und zu faul zum Schreiben ist - hier die Quellcode-Definition:

Byte[] bomUTF_8      = {0xEF, 0xBB, 0xBF};
Byte[] bomUTF_16_BE  = {0xFE, 0xFF};
Byte[] bomUTF_16_LE  = {0xFF, 0xFE};
Byte[] bomUTF_32_BE  = {0x00, 0x00, 0xFE, 0xFF};
Byte[] bomUTF_32_LE  = {0xFE, 0xFF, 0x00, 0x00};