Laden...
S
Spook
myCSharp.de - Member
3
Themen
250
Beiträge
Letzte Aktivität
vor 7 Monaten
Dabei seit
28.10.2008
Alter
43
Beruf
Fachinformatiker
Herkunft
Esslingen a.N.
Interessen
Musik
Erstellt vor 7 Monaten

Hallo,

du hättest auch einfach den Enumerator der Liste zurückgeben können:

public IEnumerator<IClass> GetEnumerator()
{
   return Items.GetEnumerator();
}

Damit kannst du dir die Nachimplementierung sparen.

Grüße

Erstellt vor 7 Monaten

Hallo Gene,

als erstes würde ich den Converter Code aufräumen, wie es Th69 bereits vorgeschlagen hat. Mit folgendem Snippet sollte dein gewünschtes Ergebnis herauskommen:

NumberFormatInfo info = new()
{
    CurrencySymbol = "€",
    CurrencyDecimalDigits = 2,
    CurrencyGroupSeparator = " ",
    CurrencyDecimalSeparator = ",",
    CurrencyPositivePattern = 3,
    CurrencyNegativePattern = 8
};
decimal value = 123_456_789_012_345.131516m;
string text = value.ToString("c", info); // 123 456 789 012 345,13 €

Zu dem Caret Problem:
Woher sollte die Textbox den Zusammenhang von dem eingegebenen Text und dem dahinterliegenden Converter kennen? Die verlinkte CurrencyTextBox wird mit Sicherheit eine interne Logik haben, die Eingabe und Caret Position speziell behandelt. Womöglich wirst du dies selbst machen müssen, da diese TB nur vorgegebene Formate unterstützt (laut Beschreibung).

Erstellt vor einem Jahr

Hallo nerkon,

ich sehe hier zwei mögliche Ursachen:

  1. long in C# ist immer 64bit während es dein C-Kompiler vermutlich als 32bit behandeln wird. Du solltest also in beiden am besten int verwenden.
  2. Response ist in C# als Klasse definiert und ich glaube mich zu erinnern, dass diese dann by default als Referenz gemarshallt werden, was mit der Signatur des C Exports (Callback) nicht zusammen passt. Ich würde in C# diese ebenfalls als struct definieren.
  3. (Das MarshalAs Attribut bei long ts ist glaube ich überflüssig - siehe Punkt 1)

Grüße
spooky

Erstellt vor 2 Jahren

Hallo Oskar,

sobald strings gemarshallt werden, würde ich den verwendeten CharSet im DllImport angeben.

Grüße
spooky

Erstellt vor 2 Jahren

Natürlich ist das wrappen des Streams hier nicht optimal gelöst, ich denke, ich muss noch ALLE methoden, die den Ursprungs-Stream benutzen und über das festgelegte offset und limit hinausgehen, "clampen", also die gewünschte Position auf den Bereich limitieren.

Ich denke du schießt gewaltig über das Ziel mit der Implementierung hinaus.
Das Einzige was du überschreiben musst sind die abstrakten Members von Stream - alle anderen kannst du genau so lassen wie sie sind. Ganz besonders macht es keinen Sinn Member zu überschreiben und dann den Basis-Member wieder eins zu eins aufzurufen...

.. der eine "View" über den _innerStream legt, dabei zu Beginn von Außen Offset := 0 und Länge := das Limit ist.
Intern kann das ja auf den _innerStream umgerechnet werden. Z.B. beim Setzen der Position halt den Offset berücksichtigen.

Wie schon gesagt wurde ... du muss lediglich Position, Length, Read und Seek so anpassen dass nur der gewünschte Bereich von außen sicht- und zugreifbar ist und der Rest verhält sich dann wie gewünscht.
Hier ein grober Ansatz, den du ausbauen kannst (Parameterprüfung von ctor, Position etc.):


public class StreamLimiter : Stream
{
    private readonly Stream _stream;
    private readonly long _offset;
    private readonly long _length;

    public StreamLimiter(Stream stream, long offset, long length)
    {
        _stream = stream;
        _offset = offset;
        _length = length;

        Position = 0;
    }

    public override bool CanRead => true;
    public override bool CanSeek => true;
    public override bool CanWrite => false;
    public override long Length => _length;

    public override long Position
    {
        get { return _stream.Position - _offset; }
        set { _stream.Position = _offset + value; }
    }

    public override int Read(byte[] buffer, int offset, int count)
    {
        long remaining = Length - Position;
        if (remaining == 0)
            return 0;

        count = (int)Math.Min(count, remaining);
        return _stream.Read(buffer, offset, count);
    }

    public override long Seek(long offset, SeekOrigin origin)
    {
        long position = origin switch
        {
            SeekOrigin.Begin => offset,
            SeekOrigin.Current => Position + offset,
            SeekOrigin.End => Length + offset,
            _ => throw new ArgumentException(nameof(origin))
        };

        if (position < 0 || position > Length)
            throw new ArgumentException(nameof(offset));

        Position = position;
        return position;
    }

    public override void Flush() => throw new NotSupportedException();
    public override void SetLength(long value) => throw new NotSupportedException();
    public override void Write(byte[] buffer, int offset, int count) => throw new NotSupportedException();
}

Grüße
spooky

Erstellt vor 2 Jahren

Hallo sandreas,

die Wrapper Klasse wäre vermutlich der einfachste Weg.
Jedoch solltest du nicht SetLength auf dem gewrappten (File)Stream aufrufen. Dadurch verkleinerst deine gewrappte Datei (schneidest Daten am Ende ab), was vermutlich nicht gewollt ist.

Grüße
spooky

Erstellt vor 3 Jahren

Der verlinke Multimedia Timer ist leider für NET Core, ich hab hier noch .NET Framework.

Der Quellcode ist mit sehr sehr großer Wahrscheinlichkeit 1:1 .NET Framework kompatibel, da er fast identisch aussieht wie The Multimedia Timer for the .NET Framework.

Erstellt vor 3 Jahren

Hallo Abt,

mir ist bewusst, dass man 0.5ms nicht zu 100% erreichen kann ... dies waren eben die ersten sinnvollen Google-Treffer wenn man nach der verwendeten Win-API Funktion gesucht hat. Es sollte lediglich den TE auf diese Option hinweisen.

Hallo ill_son,

vielleicht wäre es besser anstatt eines Sleep Ansatzs einen Timer zu verwenden.

Ich vermute einfach mal frech, dass du deinen Sensor immer im selben Takt abfragen möchtest. Da würde ein Timer, der in regelmäßigen Intervallen auslöst, vermutlich passen.
Da du eine hohe Präzision möchtest, würde ich dir den Multimedia-Timer empfehlen. (Es gibt auch andere Implementierungen im Netz, falls diese nicht zusagt). Dort kannst du die gewünschte Auflösung in ms angeben.
(Ja auch hier wirst du nicht auf die ns genau sein, aber besser als Sleeps oder Spin-Locks).

Grüße
spooky

Erstellt vor 3 Jahren

Auch wenn du keine Echtzeit erreichen kannst, ist es trotzdem möglich die Auflösung der System-clock feiner einzustellen, siehe:
How to set timer resolution to 0.5ms
How to setup timer resolution to 0.5 ms?
Clockres

Grüße
spooky

Erstellt vor 3 Jahren

Versuche mal bitte Urzas Vorschlag plus den Scrollviewer um das gesamte ItemsControl zu legen.
Ggf müsste dieser vielleicht sogar noch weitere Ebenen im XAML nach oben.

10 von 250 Beiträgen