Laden...
Avatar #avatar-3191.gif
MarsStein myCSharp.de - Experte
Sr. Softwareentwickler (ophthalmologische Lasersysteme) Trier -> München Dabei seit 27.06.2006 3.170 Beiträge
Benutzerbeschreibung

Forenbeiträge von MarsStein Ingesamt 3.170 Beiträge

11.09.2016 - 12:59 Uhr

Hallo,

Ich müsste also nicht den Router im Anmeldenamen mit Zwischenschalten?

Nein. Du musst aber davon ausgehen, dass solange FileZilla Dir auch nicht das gewünscht Ergebnis bringt, noch ein Konfigurationsproblem vorliegt.

Ich bin mir aber sicher, dass ich die Freigaben geregelt hab...

Das müsstest Du wohl nochmal überprüfen. Irgendwas stimmt da noch nicht.

Gruß, MarsStein

07.09.2016 - 14:54 Uhr

Hallo,

schau mal hier bei GitHub, da steht eigentlich alles: Using CrossGen to Create Native Images

Und ja, die crossgen.exe die Du gefunden hast, solltest Du verwenden können.

Gruß, MarsStein

06.09.2016 - 17:07 Uhr

Hallo,

dort arbeitest du dann mit ganz normalen HTML-Select's

Wobei ein <select> leider keine Combobox ist.
Siehe Combo box in HTML 5 and the HTML 4 equivalent

Gruß, MarsStein

01.09.2016 - 22:26 Uhr

Hallo,

könnte auch daran liegen, dass Dein Programm nach einem Proxy sucht. Oder sind virtuelle Netzwerkkarten auf der Maschine im Spiel?
Schau mal in Winform application first web request is slow
Der Vorschlag dort, den Proxy auf null zu setzen, widerspricht allerdings der Doku, die sagt, dass man GlobalProxySelection.GetEmptyWebProxy() benutzen soll.

Gruß, MarsStein

31.08.2016 - 16:07 Uhr

Hallo,

ist Eure COM-DLL denn richtig im System registriert (Option "Register for COM interop" in den Projektoptionen unter "Build", bzw. regasm)?

Ansonsten schau mal hier: Extend your VBA code with C#, VB.NET, or C++/CLI

Gruß, MarsStein

Edit: oder hier: Walkthrough: Calling Code from VBA in a Visual C# Project

31.08.2016 - 14:02 Uhr

Hallo,

Dein Code innerhalb des using-Blocks ergibt überhaupt keinen Sinn:

                            while (source.Length > destination.Length)
                            {
                                File.Copy(Path.Combine(source, file), Path.Combine(dest, file), false);
                                progress.Report((double)(dest.Length * 100) / (double)source.Length);
                                Thread.Sleep(20);
                            }

schon die while-Schleife verstehe ich nicht. Du kopierst nur dann, wenn der Pfad zur Ausgabedatei inklusive Dateinamen kürzer ist als der der Originaldatei ohne Dateinamen... naja, kann ja sein, dass Du das so willst.

Dann aber: progress.Report((double)(dest.Length * 100) / (double)source.Length);
Mach Dir mal klar was da passiert. Du multiplizierst die Länge des Zielpfades(!!!) mit 100 und teilst dann durch durch die Länge des Quellfades. Das ist bestimmt nicht das, was Du willst. Beachte vor allemn auch, dass die benutzte Klasse für den Progress keinen Prozentwert haben will, sondern einen Wer zwischen 0 und 1, wobei die 1 dann 100% entspricht.

Überleg Dir nochmal genau, was dein Code tun soll und versuche es nochmal von vorn. Wenn es dann Probleme gibt, kannst Du gerne hier nochmal nachfragen.

Gruß, MarsStein

29.08.2016 - 09:25 Uhr

Hallo,

wird daran liegen, dass Du Clone() benutzt. Das ist eine shallow copy der Bitmap, die Pixeldaten werden nicht tatsächlich geklont, sondern die des Originalobjektes benutzt.

Wenn Du tatsächlich eine vollständige Kopie der Bitmap rausgeben willst, benutze den entsprechenden Konstruktor Bitmap(Image).

Gruß, MarsStein

26.08.2016 - 10:54 Uhr

Hallo,

der Dialog kommt aber eben genau von dem Programm, das das HTML für Dich rendert bevor es an den Drucker gesendet wird. Mit ShellExecute = true und dem Verb = "print" wird eben ein Programm ausgeführt, das in der Registry für diesen Dateityp und dieses Verb gelistet ist. Das wird dann für gewöhnlich mit einer Kommandozeilenoption aufgerufen, die nur den Druckdialog anzeigt.
Kannst ja mal bei Dir in HKEY_CLASSES_ROOT\htmlfile\shell\Print\command gucken, da sollte das Kommando drinstehen.

Gruß, MarsStein

25.08.2016 - 12:43 Uhr

Hallo,

mehrere Möglichkeiten:

  1. GAC
    Du kannst Deine DLLs statt in einen eigenen Ordner, in den GAC installieren. Dann werden sie von jeder .NET-Anwendung gefunden.

  2. Referenzen anpassen
    Stell Deine DLL-Projekte so ein, dass sie direkt in Deinen Zielpfad bauen, oder kopiere diese von Hand dahin. Passe dann in dem Projekt, das die DLLs verwenden soll, die Referenzen (im Eigenschaftenfenster) so an, dass nicht mehr die Projekte, sondern die DLLs direkt verwiesen werden, und dass "Copy local" auf false steht. Dann müsste die DLL immer in diesem Verzeichnis gesucht werden.

  3. AppDomain.AssemblyResolve
    Du kannst mit den Anwendungen, die die DLLs nutzen sollen, das AppDomain.AssemblyResolve-Ereignis abonnieren und dort den gewünschten Pfad selbst auflösen.

Bei all diesen Möglichkeiten bedenke aber Folgendes:
Wenn Du die DLLs an einem zentralen Ort ablegst, bekommst Du ein Problem, wenn Du in einer der gemeinsam genutzten DLLs einen "Breaking Change" machst, müssen ggf. alle Anwendungen aktualisiert werden. Wenn Du wie bisher mit lokalen Kopien der DLLs arbeiuest, bekommst Du dieses Problem nicht.

Gruß, MarsStein

24.08.2016 - 23:54 Uhr

Hallo,

Ideen schon - die einfachste wäre wahrscheinlich, die Berechtigung zu erteilen, wobei ich mal davon ausgehe, dass das nicht in Frage kommt - jedenfalls nicht direkt.
Du könntest aber evtl. versuchen query session unter einem anderen Benutzer ausführen zu lassen (Stichwort Impersonation), wobei Du dafür dann wahrscheinlich auch die Rechte nicht hast. Aber Du kannst es Dir ja trotzdem mal anschauen.

Eine andere Möglichkeit wäre, einen Dienst zu schreiben, der auf dem Server läuft und von dort ermittelt, ob der Remotebenutzer angemeldet ist. Diesen Dienst könntest Du mit Deinem Programm ansprechen und so die gewünschte Information erhalten.
So ein Dienst könnte natürlich auch auf jedem anderen Server in de rDomäne oder sogar auf den Clients liegen, vorausgesetzt, er läuft unter einem Benutzerkonto, das Berechtigungen für query session hat. Den könntest Du dann auch abfragen mit Deinem Programm.

Eine Idee wäre noch, ein Login-Script für den Remotebenutzer auf dem Server anzulegen, das die Datei auf dem Netzlaufwerk anlegt, und ein Logout-Script, das sie wieder löscht.
Ich weiss allerdings jetzt aus dem Stegreif nicht, ob und wie Du dann an den tatsächlichen Benutzer kommst, der die Verbindung aufgebaut hat. Wenn Du das hinkriegst, ist das sicherlich die einfachste Möglichkeit.

Wenn nicht, ließe sich diese Hürde aber ggf. durch eine zweite Datei umgehen: eine legst Du mit dem Benutzer an wie bisher auch, die andere wie oben beschrieben vom Server. Nur wenn auch die zweite Datei existiert, gibt es auch eine Remotesession. Das bringt Dir aber nix im Bezug darauf, dass der falsche Benutzer weiterhin in der Datei landen würde. Und irgendwie erscheint das alles irgendwie von hinten durch die Brust ins Auge.

Gruß, MarsStein

24.08.2016 - 14:03 Uhr

Hallo,

da gebe ich LaTino völlig recht. Man sollte sich NIE auf sowas verlassen, wenn es nicht klar dokumentiert ist. 7z könnte zum Beispiel auch jederzeit das Format ändern (z.B. noch eine zusätzliche Spalte einbauen), so dass der Offset sich verschiebt. Oder es könnt eine auch Spalte je nach Inhalt unterschiedlich breit sein.
Wenn Du die letzte Zeile vernünftig nach dem Wort "files" durchsuchst, und die Zahl davor nimmst, hast Du gute Chancen, dass es auch nach einer etwaigen Formatänderung noch passt (ausser das Format ändert sich ganz grundlegend, aber dann bekommst Du sowieso ein Problem).

Gruß, MarsStein

Edit:

Ich möchte das mein String nach 53 Zeichen beginnt das ist mit damit zu lösen.
Dann soll er aber abbrechen wenn ein Leerzeichen erscheint.
...
Das ist mit dieser Verwendung von .Substring leider nicht möglich.

Es soll tatsächlich Fälle geben, wo man mehrere String-Operationen nacheinander ausführen muss um zum Ergebnis zu kommen... 🤔

23.08.2016 - 15:54 Uhr

Hallo,

also ich denke ich würde den Verwaltungsaufwand in Kauf nehmen, eine Gruppe mit Schreibrechten anzulegen und die berechtigten Benutzer dort hinzuzufügen.

Grund: Wenn die Berechtigung am Benutzer hängt, bleibt der Zugriff i.d.R. auch geschützt, weil die Leute mit ihrem Domain-Passwort eher vorsichtig sind.
Wenn man einfach nur ein (unpersonalisiertes) Passwort braucht, um Schreibrechte zu erhalten, macht das unter Umständen recht schnell die Runde und ist dann bald Personen bekannt, die da nix verloren haben.

Gruß, MarsStein

11.08.2016 - 11:28 Uhr

Hallo,

wenn Du meint ob es einen Code gibt der ohne Anpassungen genau für Dein roblem passt - eher nicht. Zumindest die Logik, welche Datensätze als gleich interpretiert werden, musst Du sicher selbst schreiben.

Gruß, MarsStein

08.08.2016 - 15:07 Uhr

Hallo,

also ich hab auch meine liebe Mühe zu versthen was hier gemeint ist.

Kannst Du mal erläutern, was es für Dich bedeutet, einen Indikator bis 17 und einen anderen bis 80 auszuführen?
Darunter kann ich mir echt nix vorstellen, und ich glaube dass es vielen ähnlich geht... 🤔

Gruß, MarsStein

08.08.2016 - 11:37 Uhr

Hallo,

das WinForms WebBrowser-Control ha dafür die Print()-Methode.
Im WPF WebBrowser fehlt die leider.
Dafür kannst Du aber mal hier gucken:
System.Windows.Controls.WebBrowser: Print Document?

Gruß, MarsStein

08.08.2016 - 10:06 Uhr

Hallo,

hättest Du ausser der Doku für Close auch mal in die für Open geschaut,hättest Du unter Remarks folgendes gefunden:

Only one open connection can exist per SerialPort object.

The best practice for any application is to wait for some amount of time after calling the Close method before attempting to call the Open method, as the port may not be closed instantly.

Das würde ich zumindest so interpretieren, dass Du die Instanz mehrfach verbbinden und trennen kannst.

Gruß, MarsStein

04.08.2016 - 13:00 Uhr

Hallo,

Jedoch steht dann nur wie viele Dateien noch verbleiben.

Meinst Du mein Beispiel? Dann stimmt das so nicht.
Die Zahl, die hinter "File: " ausgegeben wird, ist der Fortschritt der Einzeldatei, die hinter "Total: " der Gesamtfortschritt, jeweils in Prozent.

Was die anderen Angaben betrifft, die Du haben willst, schau mal in die jeweiligen EventArgs rein, da ist schon alles drin. Du musst es nur noch ausgeben.
Ist wie gesagt nur ein kleines einfaches Beispiel, wie Du die Klasse überhaupt auf der Konsole nutzen kannst.

Gruß, MarsStein

Edit: Die Restzeit für den Gesamtfortschritt musst Du selbst berechnen (wie Abt schrieb, über Dreisatz). Das ist allerdings dann ein Wert, der zu Anfang recht ungenau ist und dann mit de rZeit sich der Realität immer weiter annähert. Wie man das auch sonst von solchen Zeitangaben kennt 😉

04.08.2016 - 10:53 Uhr

Hallo,

um mal die Eingangsfrage zu beantworten:

ob ich diese Klasse vielleicht mit ein paar kleinen Änderungen trotzdem verwenden kann

Ja, kannst Du. Es sind sogar überhaupt keine Änderungen an der Klasse nötig.
Hier mal ein ganz einfaches Beispiel (schöner wäre es natürlich mit async/await):

using System;
using System.ComponentModel;
using System.Threading;
using de.myCSharp.Snippets.CopyComponent;

namespace ConsoleSample
{
    class Program
    {
        static void Main(string[] args)
        {
            BackgroundWorker bw = new BackgroundWorker();
            BinaryCopy bc = new BinaryCopy();
            ManualResetEvent mre = new ManualResetEvent(false);
            bc.BinaryCopyEvent += new BinaryCopyStepEventHandler(bc_BinaryCopyEvent);
            bc.FileListCopyEvent += new FileListCopyEventHandler(bc_FileListCopyEvent);
            bw.RunWorkerCompleted += delegate { mre.Set(); };
            bw.DoWork += delegate 
            {
                bc.CopyFolder(@"C:\my\source", @"C:\my\destination", false);
            };
            bw.RunWorkerAsync();
            mre.WaitOne();
            Console.ReadLine();
        }

        static void bc_FileListCopyEvent(object sender, FileListCopyEventArgs e)
        {
            Console.CursorLeft = 0;
            Console.CursorTop = 1;
            Console.Write("Total: {0}", e.Percent);
        }

        static void bc_BinaryCopyEvent(object sender, BinaryCopyStepEventArgs e)
        {
            Console.CursorLeft = 0;
            Console.CursorTop = 0;
            Console.Write("File: {0}", e.Percent);
        }

    }
}

Gruß, MarsStein

30.07.2016 - 17:13 Uhr

Hallo Coralino,

du solltest statt rnd.Next(1,3) besser rnd.Next(0,3) verwenden.

Die untere Grenze ist inklusive, die obere exklusive, deshalb wirst Du nie die 3 ziehen.
Willst Du auch nicht, weil Dein Array-Index nullbasiert ist, Dein Index also bei 3 Elementen von 0 bis 2 reicht.
Um also die richtigen 3 Zahlen für den Index zu bekomen, rnd.Next(0,3).

Gruß, MarsStein

30.07.2016 - 14:07 Uhr

Hallo,

@dannoe, das hatte ich auch schon getippt, aber Du warst schneller.

Eigentlich ist das ein Spezialfall von [FAQ] Variablennamen zur Laufzeit zusammensetzen / Dynamisches Erzeugen von Controls , da sind noch mehr Möglichkeiten aufgezeigt.

Gruß, MarsStein

29.07.2016 - 22:08 Uhr

Hallo,

400 Zeilen für Datentypen (inkl. Equals, HashCode, operatoren, ToString usw. )

Naja, implementierst Du halt das was Du brauchst.
Wenn man keine Operatoren oder Equals braucht, kann man's eben weglassen. Macht ja nicht in allen Fällen Sinn.
Ein paar ganz einfache Typen sind IMO schnell erstellt.

Um 200 Zeilen Code zu verbessern... naja - ich versuche solche Fragen eher allgemein zu betrachten. Wir wissen ja gar nicht, in welchem Zusammenhang der TE das braucht.

Meiner Erfahrung nach machen eigene Typen eigentlich immer Sinn, wenn man mit solchen Größen zu tun hat und das Programm nicht nur eben zum Lernen oder als Fingerübung dient.

Gruß, MarsStein

29.07.2016 - 21:34 Uhr

Hallo,

Extra Datentypen halte ich auch für Weit über das Ziel hinaus, da diese dann auch nur jeweils eine Eigenschaft mit repräsentieren.
Viel zu viel Aufwand nur um eine Trennung der Konstruktor Parameter umzusetzen.

Wenn es nur um die Konstruktorparameter geht - vielleicht.

Aber normalerweise macht man ja auch noch irgendwas anderes mit diesen Daten bzw. Typen. Man erstellt ja nicht aus Spaß an der Freud irgendwelche Objekte.
Und dann ist Typsicherheit doch sicherlich wünschenswert.

Wie ich bereits schrieb, haben solche Typen auch viele weitere Vorteile. Ich kann dann zum Beispiel auch Operatoren wie +/- definieren und so sicherstellen, dass ich wohl ein Gewicht zu einem Gewicht addieren kann, nicht aber versehentlich ein Gewicht zu einer Dichte - Typsicherheit eben, mit allem was dazugehört.
Mag auch daran liegen, dass ich beruflich sehr viel mit verschiedenen physikalischen Größen zu tun habe - bei uns ist das dann durchweg mit solchen semantischen Typen umgesetzt und es bringt uns viele Vorteile und macht den Code verständlicher.

Gruß, MarsStein

29.07.2016 - 15:34 Uhr

Hallo,

Da jetzt eigens neue Klassen zu erfinden, die dann auch einen Konstruktor haben, woraus sich dann Konstruktoren in Konstruktoren ergeben
...
Weil eigene Konstruktor-Konstruktor-Klassen zu erfinden ist numal aufwändig

das ist aber gar nicht das, worum es geht.
Bei meinem Ansatz z.B. ist das Ziel, Daten mit unterschiedlicher Semantik in unterschiedliche Typen zu packen. Gerade bei physikalischen Größen drängt sich mir persönlich diese Vorgehensweise geradezu auf.
Das Konzept ist auch nicht extra oder ausschließlich dafür da, verschiedene Konstruktoren bereitstellen zu können. Es steckt viel mehr dahinter, und das kann einem das Leben auch an vielen anderen Stellen erleichtern, da solche Typen eben wirklich universell einsetzbar sind.

Wenn man von Anfang an mit solchen semantischen Typen arbeitet, würde sich eine Frage nach den überladenen Konstruktoren in der Weise gar nicht stellen (weil z.B. ein Volumen eben keine Dichte ist).

Viele Grüße
MarsStein

29.07.2016 - 13:41 Uhr

Hallo,

mit eigenen Parameter-Typen zu arbeiten, welche dann auch ihre eigenen Fehler habe können und eigene Unit-Tests haben sollten

Würde ich so sehen.
Wenn Du das Spielchen mit den Einheiten machen willst, gibt es im Prinzip auch was für Unit Tests.
Wenn Du das nicht brauchst (immer in den gleichen Einheiten rechnest), reichst Du ja nur einen Wert weiter, da würden sich UnitTests damm IMO nicht wirklich lohnen.

Ob das der "beste" Weg ist sei mal dahingestellt, das muss jeder für sich selbst entscheiden. Es ist aber auf jeden Fall das, was ich persönlich dafür halte 😉

Gruß, MarsStein

29.07.2016 - 11:57 Uhr

Hallo,

sorry, meine Edits haben sich da mit Deinem Post überschnitten.
NumericField habe ich rausgenommen (hatte zuerst eine Basisklasse gemacht, dachte dann aber, structs seien hier besser.
Zu sealed-Datentypen: Die structs von mir sind ja auch sealed... verhält sich genauso. Du baust ja eine Struktur, die den eigentlichen Wert wrappt, da ist es Dir egal ob sealed oder nicht.

Gruß, MarsStein

29.07.2016 - 11:10 Uhr

Hallo,

also ich würde hier definitiv einzelne Datentypen bauen die die unterschiedliche Semantik abbilden.
Das eine ist nun mal ein Gewicht, das andere ein Volumen, und nur weil beide numerisch gemessen werden, sind sie noch lange nciht dasselbe -> warum dann also dem Code alles als double unterjubeln?

Im folgenden Beispiel gibt es eigene Typen für Gewicht, Volumen und Dichte. Die sind dann vollständig flexibel kombinierbar im Konstruktor, und biten zudem die Möglichkeit, sehr leicht mit unterschiedlichen Einheiten umzugehen (ich habe das beispielhaft beim Volumen mal gemacht).

Solche Typen sind dann im Gegensatz zu zusammengesetzten Initialisierungsobjekten auch völlig universell einsetzbar.

public class Koerper
{
    #region privates
    Volumen volumen;
    Gewicht gewicht;
    Dichte dichte;
    #endregion
    #region Constructors

    public Koerper()
    {

    }

    public Koerper(Dichte d, Volumen v)
    {
        dichte = d;
        volumen = v;
    }

    public Koerper(Gewicht g, Volumen v)
    {
        gewicht = g;
        volumen = v;
    }

    public Koerper(Dichte d, Gewicht g)
    {
        dichte = d;
        gewicht = g;
    }
    #endregion
}

public struct Dichte
{
    double _value;
    public Dichte(double val)
    {
        _value = val;
    }
    // hier noch Factory- und Zugriffsmethoden (siehe Volumen)
}

public struct Gewicht
{
    double _value;
    public Gewicht(double val)
    {
        _value = val;
    }
    // hier noch Factory- und Zugriffsmethoden (siehe Volumen)
}

public struct Volumen
{
    double _value;
    public Volumen(double val)
    {
        _value = val;
    }

    // Factorymethoden um aus verschiedenen Einheiten zu erzeugen
    public Volumen FromKubikzentimeter(double val)
    {
        return new Volumen(val / 1000000);
    }


    public Volumen FromLiter(double val)
    {
        return new Volumen(val / 1000);
    }


    public Volumen FromKubikmeter(double val)
    {
        return new Volumen(val);
    }

    // Zugriff über verschiedene Einheiten
    public double Kubikzentimeter { get { return _value * 1000000; } }

    public double Liter { get { return _value * 1000; } }

    public double Kubikmeter { get { return _value; } }

}

Gruß, MarsStein

Edit: da war noch ein Fehler im Code...
und noch einer... die Factory-Methoden in Volumen hatten gar keine neuen Objekte erzeugt 😦 -> korrigiert

28.07.2016 - 15:32 Uhr

Hallo,

das liegt daran, dass ein Admin generell auch Moderationsberechtigungen hat (und diese für gewöhnlich auch wahrnimmt).
Zusätzlich gibt es dann noch einige Moderatoren, die aber nicht über Admin-Rechte verfügen.

Gruß, MarsStein

Edit: typos

18.07.2016 - 16:40 Uhr

Hallo,

wie wird der Messwert denn genau ausgegeben? "ein kleinses digitales Display" -> sowas wie eine Digitale Uhr?
Wenn's nichts grafisches ist, dann kommst Du vielleicht mit OCR weiter. Also im Prinzip was Mr. Sparkle auch schon geschrieben hat (Texterkenung). Tesseract ist da eine gute OSS.

Gruß, MarsStein

04.07.2016 - 13:34 Uhr

Hallo,

--> NotImplementedException 😃 Ansonsten sehe ich das auch so wie Du.

...und dann die nicht unterstützte Methode am besten explizit implementieren, dann kann sie nur über das Interface aufgerufen werden (nicht mit der normalen ungecasteten Klasseninstanz).

Gruß, MarsStein

15.06.2016 - 09:32 Uhr

Hallo,

Du könntest statt einer RTB ein WebBrowser-Control verwenden. Damit lässt sich das recht leicht erledingen. Die Boxen wären dann normale <div>...</div>.
Schau mal in Textfeld mit Formatierung und klickbarem Text, ist nicht genau Dein Anwendungsfall, aber Du kannst ähnlich vorgehen.

Gruß, MarsStein

09.06.2016 - 17:23 Uhr

Hallo,

die Syntax mit dem $-Zeichen vor dem String ist ein neues Feature von C# 6 und gibt es erst seit VS 2015. Wenn das bei Dir nicht klappt, bleib bei dem String.Format.

leider weiss ich nicht was man dafür benutzt "if contains" kenne ich aus java ka obs das in c gibt

Dann schau bitte in die Doku: String.Contains-Methode

Gruß, MarsStein

EDIT: und häng Deine Bilder hier direkt an, nicht als externe Links! Siehe [Hinweis] Wie poste ich richtig? Punkt 6.1

07.06.2016 - 13:47 Uhr

Hallo,

bist Du sicher, dass Du diese Extended Properties für Access überhaupt angeben musst/darfst?

Sowohl unter Microsoft ACE OLEDB 12.0 connection strings als auch unter ADO Connection Strings Examples tauchen die nur im Zusammenhang mit Excel auf, aber nicht mit Access.

Falls Du sie doch brauchst, kannst Du auch mal einfache Hochkommata statt der doppelten Anführundzeichen probieren:
"Extended Properties='Access 12.0 Xml;HDR=Yes'" <-- dass aber HDR=YES bei der .accdb sinnvoll ist, glaube ich eigentlich nicht, und ob es sich um ein Xml-Format handelt, kann ich nicht sagen.

Gruß, MarsStein

06.06.2016 - 18:06 Uhr

Hallo,

nur so beim Überfliegen:

Du trägst beim Auslesen nur Werte der Knoten in die Liste ein, für die auch mindestens ein Folgeknoten (Left oder Right) existiert.
Existieren beide Folgeknoten, trägst Du dafür den Wert des aktuellen Knotens doppelt ein...

Gruß, MarsStein

23.05.2016 - 16:09 Uhr

Hallo Gü,

OK, ich bin also tatsächlich sowas von blind 8) (<-- das ist keine Sonnenbrille

Danke nochmal für die Klarstellung! 👍

Gruß, MarsStein

23.05.2016 - 15:57 Uhr

Hallo,

danke für den Hinweis, Gü. Das kannte ich so nicht. Allerdings scheinen die Möglichkeiten da eher begrenzt zu sein.
Sowas wie "warte bis zum Abschluss der laufenden Aufgabe und versuche es dann wieder" habe ich jedenfalls auf die Schnelle nicht gefunden - eher nur solche Einstellungen, die festlegen, wann eine laufende Aufgabe abgebrochen werden soll/darf.
Hab jetzt allerdings gerade nur Win7 zur Hand, vielleicht hat sich da ja mittlerweile was geändert. Oder ich bin einfach blind 😉

Gruß, MarsStein

23.05.2016 - 15:13 Uhr

Hallo,

falls Du mit einem Timer oder dem TaskScheduler arbeitest, wäre es noch wichtig, wie lange Deine Bearbeitung/Konvertierung dauert.
Behalte auf jeden Fall im Hinterkopf, was passiert, wenn die Bearbeitung länger dauert als das Zeitintervall.
Bei einem Timer kannst Du den immer nur einmal ticken lassen und erst wieder aktivieren, wenn die Bearbeitung durch ist - ähnlich kannst Du es auch bei einem Dienst selbst steuern.
Der TaskScheduler bietet Dir diese Möglichkeit nicht.

Gruß, MarsStein

18.05.2016 - 17:32 Uhr

Hallo,

das geht wenn ich es richtig verstehe in die Richtung [gelöst] UserControl KeyDown aktivieren?

Kannst Dir ja mal den dort verlinkten Thread auf Stackoverflow anschauen. Es läuft allerdings auch dort darauf hinaus, das Focusable auf true gesetzt wird, also letztlich Dein bereits gefundener Workaround.
Eine andere Lösung wüsste ich jetzt auch nicht.

Gruß, MarsStein

04.05.2016 - 16:27 Uhr

Hallo,

LaTino hat's richtig gelöst und ist somit an der Reihe 😃

Hier noch mal meine eigene Lösung:

checked
{
    for (int i = min, end = 0; end == 0; end = (max == i) ? 1 : (++i - i))
        action(i);
}

Das Feature gibt es doch - hab es seinerzeit selbst hier für's Forum implementiert... Wenn Du Javascript erlaubst, gibt es neben dem Titel "C#-Code" so ein "-" zum zu- bzw. "+" zum wieder aufklappen 😃

Gruß, MarsStein

04.05.2016 - 11:24 Uhr

Hallo,

Sobald ich es weg lasse kommt in der textBox => n. def.

Das und die Fehlermeldung deuten beide darauf hin, dass irgendwo double.NaN ensteht in der distance-Funktion.

Also prüfe mit 
if(!double.IsNaN(inkm))
    textBoxLaenge.Text = Convert.ToDecimal(inkm).ToString("0.00");
else
{
    // hier ist was schiefgelaufen. 
    // Koordinaten ansehen und beim nächsten mal diese speziellen Koordinaten per if-Abfrage
    // vor dem Aufruf abfangen, Haltepunkt setzen, durchsteppen, gucken was passiert.
}

Gruß, MarsStein

Edit: hatte ich doch das ! vor der Bedingung vergessen... wie im richtigen Leben 😉

04.05.2016 - 10:06 Uhr

Hallo zusammen,

@herbivore: Allen Deinen Aussagen zu der Aufgabe stimme ich vollumfänglich zu 😃

@all: herbivores Ansatz mit einer zweiten Schleifenvariable ist auch schon der wichtigste Tipp.
Hier noch einer:
Die Variable, gegen die die Bedingung geprüft wird, ist nicht unbedingt die, die inkrementiert wird. Bei meiner eigenen Lösung würde ich theoretisch bei der zweiten Variablen mit einem bool auskommen, das ist allerdings syntaktisch nicht möglich.

Gruß, MarsStein

03.05.2016 - 17:15 Uhr

Hallo,

weil Du was falsch gemacht hast 😉

Mal ernsthaft, bei der Beschreibung kann man viel mehr nicht dazu sagen 🤔

Gruß, MarsStein

03.05.2016 - 15:21 Uhr

Hallo zusammen,

das Programmierspiel ist ja fast schon in Vergessenheit geraten... hier trotzdem nochmal eine kleine Aufgabe zum Grübeln.

Gegeben ist folgende statische Methode:
[csharp]
public static void Loop(int min, int max, Action<int> action)
{
    if (min > max)
        throw new ArgumentException("min must be lesser than or equal max");

    checked
    {
        for (int i = min /*hier Euer übriger Schleifenkopf*/)
            action(i);
    }
}
[/csharp]
Die Grenzen [tt]min[/tt] und [tt]max[/tt] sind beide inklusive.

Die Methode soll für jeden [tt]int[/tt] im übergebenen Bereich einmal die übergebene [tt]action[/tt] ausführen (wenn [tt]min == max[/tt] darf die Action also nur einmal ausgeführt werden).

[B]Füllt den Schleifenkopf der [tt]for[/tt]-Schleife so, dass alle Eingaben von [tt]int.MinValue[/tt] bis [tt]int.MaxValue[/tt] korrekt verarbeitet werden.

Es darf nur der Schleifenkopf (innerhalb der Klammern, wo der Kommentar steht) verändert werden!![/B]


Beachtet, dass die Schleife in einem checked-Block steht, Überläufe also nicht erlaubt sind.

Viele Spaß damit
MarsStein

03.05.2016 - 13:07 Uhr

Hallo,


            // s und t

            double s = d2 / d1;
            double t = d3 / d1;

An der Stelle ist das, was in s und t steht, wieder ein ganzzahliger Wert, weil Du in der Rechenoperation nur mit Integern (d1, d2, d3) rechnest.
Sattdessen könntest Du d1, d2, d3 direkt als double deklarieren, oder eben einen der Werte in der Berechnung auf double casten:

            //-----------ENTWEDER SO------------:

            double d1 = x1 * y2 - y1 * x2;
            double d2 = x3 * y2 - y3 * x2;
            double d3 = x1 * y3 - y1 * x3;

            // s und t

            double s = d2 / d1;
            double t = d3 / d1;

            //-----------ODER SO------------:

            double s = d2 / (double)d1;
            double t = d3 / (double)d1;

Gruß, MarsStein

28.04.2016 - 16:03 Uhr

Hallo,

da die Registry.GetValue-Methode nur einen String als Namen für den Key annimmt, wirst Du damit vermutlich immer nur auf dem lokalen Rechner landen.

Benutze zum Auslesen/Setzen der Werte die GetValue- und SetValue-Methoden des RegistryKey-Objektes selbst.
In dem Beispielcode in der Doku wird das auch so gemacht - bitte in Zukunft die etwas genauer lesen 😉

Gruß, MarsStein

28.04.2016 - 14:32 Uhr

Hallo,

siehe [Artikel] Parameter-Übergabemechanismen: call by value vs. call by reference (ref/out)

Deine List<string[]> sowie die enthaltenen string[] sind ohnehin schon Referenztypen, es wird also nur die Referenz (kopiert und) übergeben, nicht die Daten. Da brauchst Du dann nichts weiter machen.

Gruß, MarsStein

28.04.2016 - 13:17 Uhr

Hallo,
1.Ist das Netzwerk richtig konfiguriert (Netzerkerkennung, Firewall etc.)? 1.laufen auf beiden Rechnern die Dienste "Remoteregistrierung" und "Windows-Remoteverwaltung"? 1.Hast Du mit dem Konto, unter dem Du das versuchst, Admin-Rechte auf dem Remoterechner? 1.Stecken die beteiligten Rechner eigentlich in einer Domäne? Bedenke jedenfalls, dass Du mit RegistryHive.CurrentUser auf einem Remoterechner nicht unbedingt da landest, wo Du willst.

Gruß, MarsStein

28.04.2016 - 00:49 Uhr

Hallo und willkommen im Forum,

schau mal in Entfernte Registry warten

Es läuft darauf hinaus, entweder einen Dienst zu schreiben der auf dem Remotecomputer läuft, und einen Client, der mit dem Dienst kommuniziert, oder aber den vorhandenen Remoteregistrierungs-Dienst zu nutzen und Remoteadministration zu aktivieren.

Gruß, MarsStein

13.04.2016 - 10:27 Uhr

Hallo,

da es sich bei den Columns um ein Array handelt, könntest Du einfach IndexOf verwenden, etwa so (nicht getestet):

    if ((constraint != null) && (Array.IndexOf(constraint.Columns, column) >= 0))
    {
      hasForeignKey = true;
    }

Gruß, MarsStein

09.04.2016 - 12:26 Uhr

Hallo,

mein zweiter Vorschlag wäre in dem Beispiel, der äußeren Border den Background Red zu geben und dem Textblock (oder einem rechteckigen Element, das Du noch unter den Textblock packst) den Backgound SCB.Training.Item. Die beiden inneren Borders brauchst Du dann nicht mehr.
Das müsste dann in etwa so aussehen, wie Du es haben willst - das funktionert halt nur nicht, wenn der Bereich hinter dem Text transparent sein soll.

Gruß, MarsStein