Laden...

Forenbeiträge von Papst Ingesamt 441 Beiträge

28.05.2017 - 00:19 Uhr

Die Fehlermeldung sagt doch schon wo das Problem liegt.

Du versuchst auf einen nicht existenten Array Index zuzugreifen. Im Stack Trace der Exception steht sogar in welcher Codezeile.

26.05.2017 - 21:21 Uhr

Es wird dir hier niemand eine Lösung vorkauen. Dann wäre auch dein Lerneffekt nicht gut.

Was du machen musst:1.Den Inhalt der CSV in ein Zahlenformat (z.B. double) parsen. Siehe meinen Post oben, wenn dein CSV eine immer gleichbleibende Struktur hat, gibt es dafür Bibliotheken, die dir das komplett abnehmen können. 1.Herausfinden, wie du das an das ChartControl binden kannst 1.Das Chart Control zur Anzeige bringen

26.05.2017 - 09:56 Uhr

Meine erste Idee wäre den Contentbereich durch ein <ContentControl /> zu realisieren, wobei sich die Content Property an eine Property aus dem MainViewModel binden ließe.
Dann könntest du im MainViewModel z.B. UserControls bereitstellen die den Inhalt darstellen.

Da du diese im MainVM initialisierst könntest du auch direkt Events binden für alles, was du mit dem Inhalt ausserhalb des MainVM machen möchtest.

24.05.2017 - 18:28 Uhr

Jetzt soll das Programm aber später auf unterschiedlichen Rechnern laufen. Wie mach ich das da mit dem Pfad?

Da gibt es - wie immer - mehrere Lösungsansätze 😃

Wenn es beim Pfad bleiben soll, entweder über den Installer des Programms in der Registry hinterlegen oder in der/einer config Datei konfigurierbar machen.

Da es sich bei deinem Programm aber um ein .NET Programm zu handeln scheint könntest du auch einfach die Solution mit in dein neues VS Projekt einhängen und es mit deployen (oder sogar aus der .exe eine dll machen, dann bräuchtest du nicht mehr über das CSV Format gehen sondern kannst direkt mit Datenstrukturen arbeiten).
Alternativ könntest du es als externe Referenz einbinden.

Edit:
Wegen des CSV, hat die CSV Datei ein festes Datenformat? Dafür gibt es Parser Bibliotheken, die das passend lesen können.

21.05.2017 - 18:52 Uhr

Zusätzlich kommst du während dein Prozess läuft gar nicht bis zum lesen, denn du wartest mit


Send.WaitForExit();

erst darauf, dass der Prozess schließt, bevor du irgendwas ausliest.

14.05.2017 - 14:15 Uhr

Excel ist halt leider das Programmiertool der Assistentin des Abteilungsleiters (Überspitzt und Klischeehaft), aber leider wird es doch immer wieder für Aufgaben genommen, für die es nicht geeignet ist, nur weil man es "eben mal schnell mit Excel probiert hat".
Wird bei uns in der Firma auch so eingesetzt.

Aber um nicht abzuschweifen:
Aus meiner Erfahrung heraus hat jede Entwicklergruppe - und ich würde hier jetzt noch einmal die Embedded, Logik und Regelungstechniker in den Topf werfen - einen ganz eigenen Blick auf ähnlich gelagerte Probleme.
Während der Embedded Entwickler lieber Bitleisten durch die Gegend transferiert und das für einen Generischen Ansatz hält sieht das ein Webentwickler als nicht mehr Zeitgemäß und auch erst recht nicht generisch an.... Vielleicht auch, weil er noch nie etwas mit einzelnen Bits zu tun hatte.

Als Fazit kann man denke ich sagen: Gefrickelt wird überall und nirgendwo. Ab einem bestimmten Niveau denke ich bei keiner der Gruppen mehr. Bei Web mag es vielleicht am ehesten auffallen, weil es das Einfallstor für Programmieranfänger ist.

11.05.2017 - 18:46 Uhr

Hallo Thommy,

mit der SerialPortStream-Bibliothek hast du doch etwas gefunden, was unter .NET Standard funktionieren sollte.
Du brauchst lt. Github Seite allerdings eine 2.x Version, die wohl noch nicht in nuget verfügbar ist.
Auch heißt die Klasse dann nicht mehr SerialPort sondern SerialPortStream und das handling ist anders.

07.05.2017 - 12:48 Uhr

Wenn ich dort einen Haltepunkt setze und dann im Direktfenster

this.stackPanel1.Children.Remove(child)  

eingebe, erscheint als Antwort:

Der Ausdruck wurde ausgewertet und weist keinen Wert auf.
Das gleiche gilt für den Befehl

this.stackPanel1.Children.Clear()  

Die Methoden Clear() und Remove(..) haben als Rückgabetyp void. Insofern ist das, was der Debugger sagt genau richtig.

04.05.2017 - 15:56 Uhr

Wenn du mit Databinding arbeiten willst wirst du denke ich ein eigenes Control bauen [EDIT] oder eine fertige Lib wie z.B. das OxyPlot von oben verwenden[/EDIT] müssen.
Im Canvas zeichnen finden sich bei Google passende Anleitungen, wie z.B. diese hier:
https://social.msdn.microsoft.com/Forums/vstudio/en-US/828a21f9-db01-4f9a-8461-b9a585820b50/how-to-draw-an-ellipse-inside-a-canvas-at-specific-coordinates?forum=wpf

04.05.2017 - 15:47 Uhr

Was spricht gegen ein eigenes Model?


class Coordinate
{

public int X { get; }
public int Y { get; }
public int Value { get; }
}

Wie gesagtr um es auf der UI darzustellen würde ich es in einer Form wandeln, die die UI besser versteht als eine Koordinate mit Wert.

04.05.2017 - 15:39 Uhr

Muss es ein Tuple sein?

Generlel würde ich kein Tupel Databinden, sondern für die Daten für die Oberfläche aufbereiten.
Du könntest zum plotten z.B. eine Charting Lib wie OxyPlot nehmen und dann an der Position ein passendes Label plotten (Annotation).

01.05.2017 - 18:07 Uhr

Um zu sagen, was die sauberste Lösung ist, bin ich wohl zuwenig mit WinForms unterwegs.
Das bei dir klingt aber, als würdest du die Forms zu mehr als zum anzeigen und manipulieren von Daten nehmen.

Vielleicht hilft dir das einen Denkanstoß zu einem best-practice zu finden:
[Artikel] Drei-Schichten-Architektur
Nimmst du die Form nur zum anzeigen und erledigst das nachladen zeit- oder event-gesteuert in der richtigen Schicht, ist es alles etwas schöner.

01.05.2017 - 18:00 Uhr

Die Möglichkeiten sind da so groß wie du sie dir vorstellen kannst.

Du könntest das auch über eine überliegende Instanz managen, die sich um den Timer kümmert und dann das Form schließt.
Alternativ kannst du beide Form's permanent geöffnet lassen und nur verstecken:
[FAQ] Kommunikation von 2 Forms
Oder aber jedes Form prüft seine Restlaufzeit selber und ruft dann das andere wieder auf.

Eine Kombination ist natürlich auch denkbar 😃

01.05.2017 - 17:44 Uhr

Ein Timer ist schon genau das, was du dafür brauchst.
Beim Aufruf des Form musst du diesen instanziieren und berechnen wie lange er laufen soll (angepeilte Uhrzeit - jetzt). Beim Ablauf öffnest du dann das andere Form.

Übrigens: if und else sind keine Schleifen; for und while oder foreach sind schleifen.

27.04.2017 - 21:38 Uhr

Für dein Szenario: Weil die Datenbank nicht pushen kann.

Für generell: Um den Datenbank austauschbar zu machen und den Zugriff zu kapseln.
HTTP bietet ganz andere Möglichkeiten als das Datenbank Protokoll

22.04.2017 - 20:02 Uhr

In WPF geht das sehr gut mit einem ObjectDataProvider:


 <ObjectDataProvider x:Key="eMyItems" MethodName="GetValues" ObjectType="{x:Type System:Enum}">
  <ObjectDataProvider.MethodParameters>
    <x:Type TypeName="Enums:MyEnum"/>
  </ObjectDataProvider.MethodParameters>
</ObjectDataProvider>

unter der StaticResource "eMyItems" steht es dann zum Databinden bereit.

22.04.2017 - 20:00 Uhr

Hi,

ohne es zu probieren tippe ich mal - so wie du es dort reinkopiert hast kompiliert es nicht.
Sowohl lines, lines2, als auch SplitAndRead() gehören zu keiner Klasse.

Schau dir einmal an, was der Unterschied zwischen einem Array und eine Liste ist, das sieht aus, als würdest du die Liste wie ein Array verwenden. Außerdem würdest du dir vermutlich Einträge überschreiben so wie du es dort implementiert hast.

Was ist denn das Kriterium, dass etwas in der Liste lines2 gespeichert werden soll?
Wenn dort Zeile 3 und 4 gespeichert werden soll müsstest du einfach ausserhalb der foreach-Schleife folgendes machen:


lines2.Add($"{NeuerString[2]};{NeuerString[3]}");

(Natürlich vorher prüfen ob 2 und 3 Elemente von NeuerString sind!)
Das ist aber nicht was du vorhast oder?

19.04.2017 - 18:19 Uhr

Das könnte ein Big-/Littleendian Problem sein.
Sprich, es könnte sein, dass du die Bytes in der anderen Reihenfolge schicken musst.

13.04.2017 - 19:58 Uhr

Hi,

das kann viel sein, angefangen bei der Firewall deines und des anderen PC's bis hin zur Konfigurations des DBMS.
Was kommt denn für eine Fehlermeldung?

30.03.2017 - 18:10 Uhr

Werden überhaupt Pakete empfangen?
Also kommt etwas in deinem Programm an, wenn du den Filter weglässt?

Läuft WinPcap? Den Treiber brauchst du um überhaupt etwas zu empfangen.

06.03.2017 - 21:43 Uhr

Nein - das solltest du dir auch selber beantworten können - schließlich hast du nichts dergleichen implementiert.

Das was du hier implementiert hast, liest die Daten aus der Datenbank und die GUI stellt fest, wenn du dies tust (INotifyPropertyChanged).

Was nicht festgestellt wird ist:
* Wenn etwas an einem User geändert wird
* Wenn der selektierte Benutzer gewechselt wird

Wie du das wechseln erkennen kannst hatte ich oben geschrieben. Wenn du erkennen möchtest, ob an einem Benutzer etwas geändert wurde, brauchst du soetwas wie ein "IsDirty" Flag:


class UserViewModel
{
	private string _name;
	
	public string Name
	{
		get { return _name; }
		set
		{
			_name = value;
			IsDirty = true;
		}
	}

	public bool IsDirty { get; set; } = false;
}

Damit kannst du dann beim Wechsel herausfinden, ob etwas an dem Benutzer geändert wurde.

05.03.2017 - 13:00 Uhr

Hi,

ich weiß, das mag man nicht hören, aber das schreibt nach einem Designfehler.
Einfachste Lösung wäre die Label gleich in dem Array zu erstellen. Andererseits klingt Label sehr nach Oberflächenlogik. Bei WPF würde ich hier sagen, dass man die am besten nicht per Code direkt anfasst, für WinForms kann ich dazu leider keine Aussage machen.

05.03.2017 - 12:57 Uhr

Das selektierte Element ist kein Teil der Collection/Liste, sondern ein Teil der Oberfläche. Insofern wirst du auch bei einer ObservableCollection<T> nicht mitbekommen, wenn sich das selektierte Element ändert, diese reagiert nur auf Änderungen der Collection.

Es gibt denke ich zwei Elegante Lösungen hierfür:*SelectedItem der Oberfläche an eine Property aus dem ViewModel binden *Per Interactivity ein ICommand auslösen, wenn sich das selektierte Element ändert.

Edit: Tippfehler

28.02.2017 - 21:16 Uhr

Das Programm Wireshark macht das mithilfe des Treiber/Dienstes "WinPcap".
Hierfür gibt es einen oder vllt sogar eine Handvoll .NET Wrapper, die dir helfen dürften.... z.B.: https://github.com/PcapDotNet/Pcap.Net

25.02.2017 - 17:54 Uhr

Hi,

du bindest an beide Controls die gleiche Datenquelle.
Wenn du im Abhängigkeit von der einen in der anderen etwas darstellen möchtest müsstest du diese Abhängigkeite auch darstellen.

In WPF geht das am besten (und am einfachsten) über das MVVM. Ich würde dir folgende Beiträge dazu empfehlen:
[Artikel] Drei-Schichten-Architektur
[Artikel] MVVM und DataBinding

15.02.2017 - 18:46 Uhr

Einen Windows 7 Emulator bringt VS nicht mit, aber du könntest unter Hyper-V oder einer VM Engine deiner Wahl eine Windows 7 Installation deployen.
Alternativ natürlich

  • eine VM anmieten (online)
  • bei jemanden mittels Teamviewer o.ä. Tools testen
  • ...
13.02.2017 - 17:14 Uhr

Nur der Vollständigkeit halber: Es ist auch keine gute Idee in einer MySQL Datenbank Dateien zu speichern.

Generell gilt das für alle relationalen Datenbanken.

09.02.2017 - 20:42 Uhr

Bette sie in das Projekt (oder ein extra Projekt) als Resource ein.
Dafür müssen diese nicht im gleichen Verzeichnis liegen, über
Contextmenu > Add > Add existing Item
kannst du sie in einem beliebigen Verzeichnis hinzufügen. Dann sind sie auch unter der Property Source im Dropdown verfügbar.

(Ob das nachher klug und handelbar ist, musst du allerdings selber entscheiden)

06.02.2017 - 19:43 Uhr

Das sieht fast aus wie eine Aufgabe für ein TreeView.

30.01.2017 - 22:12 Uhr

Nicht extra Hardware, kompatible Hardware.

Bei der Recherche gerade habe ich dann festgestellt, dass ich mich geirrt habe.. das war nicht NTP, sondern das betrifft PTP (Precision Time Protocol), hierbei ist es notwendig, die Paketlauzeit in hin- und rückrichtung (am besten symmetrisch) zu kennen.
Um das zu ermöglichen gibt es bei PTP-fähigen Geräten die sog. Boundary Clock, die es dann ermöglicht die Uhrzeit von Netzwerkgerät zu Netzwerkgerät durchzugeben.

Quelle: http://www.pdv.reutlingen-university.de/rte/White_paper_ieee1588_de_v1-2.pdf

Ich meine mich zu erinnern, dass es es ebenfalls eine Einrichtung gibt, die diese Synchronisation Protokolle aus Hardware Basis routet um keine variable Zeitverschiebung durch eine Software zu bekommen (ein paralleles Register innerhalb des Switch sorgt dann dafür, dass dieses Telegramm an der Software vorbei durchgeroutet wird).
Das habe ich auf die schnelle aber nicht gefunden.

30.01.2017 - 19:24 Uhr

Damit das mit (S)NTP PTP vernünftig auf einer solchen ms Basis funktioniert, muss die zwischengeschaltete Hardware (Switches etc.) die ~~NTP ~~ PTP Telegramme aber auch entsprechend durchleiten.
Idr. ist das durch Hardware gelöst um ein solches Telegramm zeitgleich mit dem Empfangen zu senden ohne dass dort ein Prozessor dazwischen liegt.

Da kann man sich, wenn man das über das Internet synchronisiert nicht unbedingt drauf verlassen. Im LAN sollte man dann die eigenen Netzwerkkomponenten kennen.

Ob das in Summe 100ms ausmachen kann, kommt sicherlich auf das routing an, kann ich aber aus meinen Erfahrungswerten nur schlecht abschätzen.
Allerdings sind wir bei einer solchen Synchronisierung einmal ziemlich auf die Nase gefallen, als wir Logdaten von mehreren Geräten vergleichen wollten die eigentlich Synchron sein sollten - es dann aber nicht waren.

06.11.2016 - 19:06 Uhr

An den Controls hat es leider schon länger keine Weiterentwicklung gegeben.
Ich bin auch nicht sicher, ob der DatePicker das standardmäßig unterstützt, aber vielleicht hilft die das hier weiter:
WPF: Calendar and Datepicker -Final

06.11.2016 - 14:11 Uhr

Mit UDP Broadcast sollte das relativ simpel machbar sein.
Du müsstest nur zur Synchronisation (z.B. wer ist gerade online) von jedem immer mal wieder etwas verschicken.

15.10.2016 - 11:47 Uhr

Das müsstest du dir selber beantworten können.

Wenn du einfach nur das Event änderst, sollte es die wenigsten Auswirkungen haben.

15.10.2016 - 11:22 Uhr

WPF verwenden 😉

Es gibt verschiedene Möglichkeiten, das was mir auf Anhieb einfällt:

a) Das Programm fällt nach schließen der letzten Form zurück in die statische Main()
b) Das Schließen Event des Form abbonieren
c) Ein anderes Event zum verstecken nutzen (z.B. Show)

15.10.2016 - 11:04 Uhr

Google sagt dazu (http://stackoverflow.com/questions/7003587/why-isnt-this-hide-working-in-form1-load-event), dass das Load Event zum tragen kommt, bevor das Form überhaupt angezeigt wird.

Wenn du es hier verstecken willst, wird das "anzeigen" später noch einmal getriggert und wird dein Verstecken überschreiben.

Musst du zwingend das Form hier schon erzeugen?
Reicht es nicht, dass später zu tun, wenn du es wirklich brauchst?

15.10.2016 - 10:27 Uhr

Was genau heißt denn "klappt irgendwas nicht" ?

15.10.2016 - 09:22 Uhr

Dein Problem war, dass du zwei Unterschiedliche Instanzen deines Viewmodels verwendet hast.
Ich würde wetten, du hast irgendwo ein solches Statement:


<xyz.Ressources>
<namespace:HexagonViewModel x:Key="ViewModel" />
</xyz.Ressources>

12.10.2016 - 17:52 Uhr

Zusätzlich hätte ich noch eine Frage. Ich hab beim Lesen immer nur Parameterlose Konstruktoren bei ViewModels gesehen. Muss das so sein? Ist es eine doofe Idee auf diese Art, also über die Parameter des Konstruktors, die Eigenschaften des Viewmodels festzulegen? Und kann ich verhindern, dass der parameterlose Konstruktor aufgerufen wird und direkt meinen "echten" Konstruktor verwenden? Den andern hab ich ja nur, weil sonst der compiler meckert.

Der parameterlose Konstruktor wird vom Visual Studio Designer benötigt. Auch, wenn du das ViewModel aus dem View instanziierst, was du zu machen scheinst, denn du verwendest beim Binding ein StaticResource (also eine in XAML, in einem übergeordneten Resource Dictionary instanziiertes Objekt; keine statische Implementierung).

Du scheinst zwei Instanzen deines ViewModels zu benutzen, einmal die StaticResource (s.o.) und einmal die Instanz aus der Code Behind.
Ich würde hier eher die Instanz aus der Code Behind entfernen und schauen, dass du diese "sauber" hälst, anstatt die aus dem ResourceDictionary.

11.10.2016 - 18:22 Uhr

Hi,

du benötigst in deinem ViewModel keine DepencyProperty und auch keine Vererbung auf das DepencyObject.
Um Änderungen im ViewModel an die View weiterzugeben, muss dein ViewModel INotifyPropertyChanged implementieren.

Ein Beispiel findest du hier: [Artikel] INotifyPropertyChanged implementieren

11.10.2016 - 17:24 Uhr

Das Exceed bietet auf die Weise, in der ich es einmal genutzt habe leider auch nur Columns als frozen an (https://xceed.com/wp-content/documentation/xceed-datagrid-for-wpf/webframe.html#Xceed.Wpf.DataGrid.v5.9~Xceed.Wpf.DataGrid.Views.TableView.html)

11.10.2016 - 16:46 Uhr

Hilft dir das weiter?
http://stackoverflow.com/questions/13774417/how-does-wpf-datagrid-get-frozen-rows-columns-working

Ansonsten meine ich gibt es bei dem DataGrid von exceed (http://wpftoolkit.codeplex.com/) diese Möglichkeit von Hause aus.

10.10.2016 - 18:20 Uhr

Verstehst du, warum das so ist?
Sonst wäre ja der Beitrag sinnlos 😃
2.4.4.5 Zeichenfolgenliterale

03.10.2016 - 12:21 Uhr

Da gibt es so viele Möglichkeiten, wie du dir ausmalen kannst 😃

Gängig ist denke ich die Datenbank mit dem Installer mit verteilen zu lassen. Oder aber auch das von dir angesprochene "Startup".
Es kommt dabei auf den Anwendungszweck an. Der Installer macht sicherlich weniger Arbeit, aber wenn du die Datei dann im Benutzverzeichnis des aktuellen Benutzers ablegst kommt es zu fehlern, wenn ein anderer Benutzer sich am PC anmeldet und versucht die Applikation zu starten.

Weniger gängig wäre die Datenbankdatei in die Applikation einzubetten und beim Start zu kopieren.

Unter C:\Programme würde ich die Datei allerdings nicht ablegen, hier hat die Applikation idr. keinen Schreibzugriff.

01.10.2016 - 12:11 Uhr

Du verwendest da einige int.Parse(), da wird wohl auch dein falsches Format liegen.
Das findest du am besten mit dem Debugger:
[Artikel] Debugger: Wie verwende ich den von Visual Studio?

12.09.2016 - 20:58 Uhr

Zumal mit Eigenschaften und Methoden für Interfaces das ganze
irgendwie absurd wird [...]

Technisch gesehen sind Erweiterungsmethoden nichts weiter als eine statische Methode, die ein Objekt einer das Interface Implementierenden Klasse, optional mit Zusätzlichen Parametern entgegen nimmt und etwas damit macht.
Dass man das dann wie eine Methode des Interfaces benutzen kann ist Syntax Zucker und verbessert einfach die Lesbarkeit.

11.09.2016 - 13:46 Uhr

Man kann auch mittels Extennsion Methods ausformulierte Methoden an Interfaces heften.

Ohne eine Konkretisierung, was genau du meinst lässt sich dazu leider nicht viel sagen.

29.08.2016 - 18:47 Uhr

Genau, du musst also sowas wie


var mbMaster = ModbusSerialMaster.CreateRtu();
[...]
var data = mbMaster.ReadInputRegister(....);

machen.

26.08.2016 - 16:45 Uhr

Hi,

was genau möchtest du machen?
Modbus selber liest oder schreibt Register bzw. Coils (also 16 Bit oder 1 Bit Werte). Der Akteur ist dabei der Modbus Master (im sonstigen Umgang ist der Master der Client und der Slave der Server... Modbus Terminologie 😃).

Mit einem Modbus Slave erwartest du also, dass der gegenüberliegende Controller (oder einer der Controller auf dem RS485 Bus) eine Anfrage an dich sendet.
Willst du selber eine Anfrage senden, dann brauchst du einen Modbus Master - und danach sieht dein Code aus 😃

21.08.2016 - 14:42 Uhr

Bitte benutze die Code-Tags, dann kann man den Beitrag auch lesen 😃
Siehe hier: [Hinweis] Wie poste ich richtig?

Hast du mal die Google oder Forumssuche benutzt?
Google brachte mich auf diesen Beitrag, vielleicht hilft der dir ja schon: SmtpException beim Versenden einer E-mail