gehören die Punkte zu einer Funktion?
Wenn ja, ist es das Ziel die Punkte der Reihe nach (wie sie auf der Funktion vorkommen) zu sortieren oder wirklich anhand des Abstandes zwischen einzelnen Punkten?
Wir haben sowas mal realisiert für unsere Umsetzung eines 3270 Clients (nicht MVVM). Nur mit dem TabIndex ging es leider nicht, da man so über alle möglichen Controls hüpft.
Wir haben es dann so gelöst das wir beim Aufbau des Schirmes (Werte übertragen) ein (sortiertes) Dictionary erstellen für TabIndex/Control. Wenn nun Tab gedrückt wurde wir einfach das nächste Control in der Map angesprungen. (bei STRG+Tab das vorherige, und am Ende bzw. Anfang eben wieder von vorne bzw. hinten begonnen)
Wäre natürlich auch bei dir möglich, aber schön finde ich es selbst nicht (aber naja Zeitdruck halt)
Kleiner Hinweis: Was ich bei der Variante mit den TabIndex nicht super finde wäre bei einer Reorganisation der Reihenfolge das ich so viele Zahlen ändern müsste. Praktischer würde ich es finden wenn man einfach das nächste bzw. voherige Control angeben könnte.
Ich habe fast das Gefühl, dass hier vielleicht das Virenprogramm oder der Defender bei der Überprüfung Mist bauen und die Exe nicht starten lassen.
Etwas ähnliches habe ich unter Windows 10 schon selbst mitbekommen.
Wollte eine Drucker Software von der CD installieren.
CD Setup ging auf aber als es dann darum ging das Program zu installieren sah ich zwar einen Prozess aber kein Fenster was aufging.
Mit deinem (geposteten) Code müsste es doch richtig funktionieren. Wenn anzahl=20 wird deine Schleife 20x durchlaufen und somit 20 Einträge in die Liste hinzugefügt.
Sollt dem nicht so sein vergleiche deinen Code mit dem hier geposteten und verwende den Debugger um zu kontrollieren wieviele Einträge die Liste nach jedem Schleifedurchlauf hat.
Und wirklich jeden Methoden Aufruf zu Loggen halte, ich für grundlegend Falsch. Aber soweit ich es verstanden habe macht es hier ja auch keiner.
Doch bei uns in der Firma wird bei den migrierten Anwendungen jeder Methodenaufruf geloggt (beim Betreten und Verlassen der Methode). Ebenso einige Methoden in unserem Framework (auf dem die Anwendungen aufbauen).
Ebenso werden Zuweisungen geloggt (Name des Items, alter Wert, neuer Wert).
Leider ist es notwendig da wir nicht die Entwickler der Anwendungen sind. Bei Fehler können wir leichter nachvollziehen welcher Code ausgeführt wurde und wo ein Wert möglicherweise geändert wurde und wie sich der Wert geändert hat.
Gerade haben wir ein Projekt bei dem wir ObjectStar nach Java migrieren -> ObjectStar erlaubt ähnlich PHP dynamische Aufrufe anhand des Wertes den eine Variable hat.
Dieses "intensive" Logging ist natürlich nur während der Entwicklung und zum Testen aufgedreht. In der Produktion werden dann nur noch kritische Stellen und Fehler geloggt.
Bei uns eben den Vorteil: ohne die Anwendung wirklich zu kennen können wir diese nachvollziehen. Bei Fragen an die eigentlichen Entwickler können wir leichter erklären/zeigen wo wir das Problem vermuten usw.
Die Firma für die ich arbeite hat sich auf die Migration von 4GL Sprachen nach Java (bzw. auch schon C#) spezalisiert.
Dazu wurde ein Framework entwickelt welches als Basis für die Anwendungen und Schirme dient.
Wird der Log auf DEBUG gestellt ist es uns möglich den ganzen Ablauf der Applikationen inkl Framework mitzuverfolgen bzw. nachzuvollziehen.
Folgendes wird geloggt:
eine Methode wird betreten bzw. verlassen (im Framework nur teilweise, bei den migrierten Anwendungen bei jeder Methode
welcher Wert auf welches Item gesetzt wird was davor auf diesem Item stand
welches SQL Statement wird mit welchen Parametern ausgeführt
in welchen Strukturen wird nach welchen Items mit welchen Wert gesucht
.....
Klar dadurch wird viel Log aber wir können genau nach vollziehen welche Methoden wurde davor betreten (welche nicht im StackTrace auftauchen würden). Aber da wir zum Vergleich auch oft Logs von den 4GL Sprachen bekommen ist es recht praktisch, da dort auch viel geloggt wird und man meist 1:1 vergleichen kann.
Gerade sitzen wir an (TIBCO) ObjectStar -> Java
ObjectStar arbeitet nur mit Rules (->Methoden) und kann ähnlich PHP dynamische Aufrufe.
Sprich ich lese aus der Datenbank welche Rules als nächstes aufgerufen werden soll usw. .
Ohne ein entsprechend ausführliches Logging wäre dieser Source Code nicht zu verstehen.
Wie andere schon sagten, es kommt halt ganz darauf an ob man mehr als den StackTrace braucht um einen Fehler zu beheben.
Aber ich schreibe von Anfang an lieber ein paar Logausgaben mehr in das Programm und miste später aus als im nachhinein welche hinzuzufügen
Also anhand deines "Aufbau Beispiels" wäre deine Lösung 1 passend. Hier wären aber die Versionen nicht möglich.
Die Lösung 2 wäre eine Möglichkeit um die "Versionen" zu realisieren.
Aber ich finde so würdest du einige Daten doppelt und dreifach speichern, da Version 2 und 3 von einem Packet (oder doch eher Paket? ) ja zum Teil gleiche/ähnliche Daten wie Version 1 speichern.
Mein 1. Ansatz wäre gewesen Packet eine weitere 1:1 Beziehung auf sich selbst zu geben um so die ID der Vorgänger Version zu speichern.
Dann müssten in der Tabelle PacketBotschaft nur noch die Änderungen gespeichert werden (inkl der Information ob diese Botschaft hinzugefügt oder entfernt wurde).
(das gleiche gilt dann auch bei der Tabelle Botschaft)
@weismat
Ich habe bereits alles durchgemessen, daher weiß ich das der Aufruf meiner Methoden der Punkt ist, der am meisten Zeit in Anspruch nimmt und das dürfte ja wohl nicht sein.
Also der Aufruf einer Methode sollte eig keine Zeit kosten, sondern nur das "Abarbeiten" der Methode.
Wie hast du denn gemessen?
Bin gerade leider in der Arbeit und kann diese Seite nicht anschauen.
Aber in Firefox gibt es ein Addon das Wappalyzer heißt, das zeigt dir neben der URL dann einige Informationen zur Seite an (sofern gefunden).
Zum Beispiel kann es dir Anzeigen ob die Seite in php, ASP.NET, Java geschrieben wurde, verwendeter Webserver, mögliche "Sofware" (Joomla, CMS, ....)
Ansonsten schreib denen einfach eine Mail und frag danach ;-)
Beim Reduzieren der Solution auf das Wesentliche, hat sich gezeigt das es doch wie gewünscht funktioniert.
Ich glaub das Problem lag einfach an der Uhrzeit
ich sitze gerade an einen kniffligen Problem und bin bisher auf noch keine Lösung gekommen X(
Folgende Problemstellung:
Ich habe in einem UserControl eine ListBox definiert. Diese bekommt die Items per Binding gesetzt.
Um die Daten wie gewünscht bekommt die ListBox auch noch einen ItemContainerStyle gesetzt.
In diesem Style wird per Trigger entschieden welches der 2 DataTemplates verwenden wird (das selektierte Item wird mit mehr Daten angezeigt als die anderen). In einem der DataTemplates gibt es nun einen Button dem ich ein Command binden will.
Das Problem das Command, welches ich binde wird bei jedem Wechsel des ListBoxItem aufgerufen und nicht beim Button Klick.
Hier das XAML (nur auf das entsprechende Template und die ListBox Definition begrenzt)
Es gibt einige Controls die ein Property IsTabStop haben, diese regelt ob mit Tab der Fokus auf dieses Control wechseln kann MSDN-Doku Control.IsTabStop
Die Verbindung habe ich bewusst bei diesem Thread nicht angezeigt. Nämlich ich habe das auch mit Feld, Objekt, Vererbung, Property versucht aber es hat nicht funktioniert.
Wie gesagt eine Möglichkeit wäre die Klasse Parameter zu erweitern.
Eine andere wäre der Klasse Parameter einen Konstruktor zu geben
public Parameter(string name, string range, double pulse, double factor, IPFaktor ipfaktor)
{
Name = name;
Range = range;
Pulse = pulse;
Factor = factor * (double)ipfaktor.Wert;
}
Zitat von Aydogan61
Nein, es ist nicht Null, fängt mit EINS an.
Ich habe auch nicht behauptet das es null IST. Aber der Typ des Feldes "wert" in der Klasse IPFaktor ist ein nullable.
Somit muss man bei Berechnungen diesen Wert zuerst casten. Nachdem aber jeder IPFaktor einen Wert != null hat, wollte ich nur nachfragen ob dies so gewollt ist bzw. ob die Liste noch erweitert wird etc.
Dir fehlt eben die Verbindung zwischen den Klassen Parameter und IPFaktor.
Eine Möglichkeit wäre der Klasse Parameter ein Feld vom Typ IPFaktor zu geben. Dann kann das Parameter Objekt zum Berechnen des Faktors auf den Wert eine IPFaktor Objekts zugreifen.
Aber ansonsten, wären ein paar weitere Informationen hilfreich.
Wie hängen Parameter und IPFaktor zusammen? Woher weißt du welcher IPFaktor.Wert bei welchen Parameter zu Berechnung gebraucht wird? Bleibt es bei diesen neun Parametern (bzw. IPFaktoren) oder wird diese Liste später dynamisch aus einer DB gelesen oä?
EDIT: Der Wert des IPFaktors darf null sein, ist dies so richtig? Eine Multiplikation mit einem nullable Type ist nicht möglich.
Ich nehme an die Schleife läuft direkt im Code des Fensters und nicht in einem BackgroundWorker bzw. eigenen Thread? Und verwendest du einen Dispatcher?
Wenn man es sehr großzügig sieht, habe ich in der Arbeit mit so etwas ähnlichem zu tun.
Um es genau zu erklären, reicht mir gerade die Zeit nicht wirklich. Aber grob gesagt:
Wir haben Maps/Views für die Anzeige der Daten und befüllt werden diese von "Record"s, welche aus Items bestehen. Ein Item besteht dazu aus einem eindeutigen Namen/Key, einer maximalen Länge und einem Attribut für den Wert.
Ich würde aber eher zur Vererbungsvariante greifen. Ein Vorteil einer abstrakten Formularklasse wäre eine abstrakte Methode zum Überprüfen des Formulars. So dass jedes spezielles Formular die Methode implementieren muss ob alles benötigte vorhanden ist und/oder vorhandene "Kombinationen" gültig sind (zum Beispiel Ort+PLZ).
EDIT 1: Möglich wäres es auch einem Item eine Liste von Validatoren zu setzen, welches das Feld inhaltlich prüfen können (E-Mail, Telefonnummer, ...)
EDIT 2: Je nach Aufbau sollte eine leichte Wartbarkeit möglich sein, auch wenn es für jedes Feld des Formular ein Attribut vom Typ Item (Key#, Name, Wert, ...)
Bekommst du die Daten aber schon fertig validiert etc, und musst sie nur in die entsprechende Struktur bringen, wäre der Ansatz der Komposition angenehmer. Hier muss keine großartige Klassenstruktur dahinter entwickelt werden
PS: Was du in deinem Beispiel nicht verratest, wie schaut das Ganze bei Tabellen aus, wie zum Beispiel auf der Rechnung?
....
ein offizielles "Begleitschreiben" indem der Status des Abschlusses international vergleich- bzw. einordenbar beschrieben worden ist. Ich gehen davon aus, dass das auch heute noch so ist ....
Dem kann ich nicht zustimmen, habe die HTL (Spengergasse, Wien) im Juni 2011 abgeschlossen. So ein "Begleitschreiben" wäre mir nicht aufgefallen. Entweder gibt es dies nicht mehr, es ist nicht so auffällig oder wird nicht von jeder HTL hergegeben.
In Österreich eine HTL abzuschließen heißt noch nicht das man ein Diplom hat, lediglich die Matura (in Deutschland die Abitur).
Nach 3 jähriger Berufserfahrung kann man seinen Ingenieurs Titel beantragen (wird einen also nachgeworfen wenn man so will ). Ein Diplom bekommt man also erst nach einer weiteren Ausbildung (kann auch berufsbegleitend sein).
Wobei man in Österreich auch ohne Diplom problemlos einen Job finden kann, in Deutschland sollte es eigentlich auch kein Problem geben.
Wie könnte ich nun das Programm so aufbauen, das Abhängig vom Benutzer nur best. Tabes sichtbar sind.
Geht das mit den TabControl oder habt ihr vielleicht eine anderen Ansatz dies zu lösen.
Ein paar mehr Informationen wäre hier schon nötig.
Gibt es aktuell schon ein Login? Wie schaut es mit Berechtigungen aus?
Wie dein Program Sachen anzeigt ist egal, du solltest dir überlegen woher weißt du ob dieser Benutzer nun "Tab A" sehen darf aber nicht "Tab B"?
Simple ausgedrückt brauchst du nur eine Art "Login" Anfang des Programms. Hier kann dann entschieden werden, wer was zu sehen bekommt.
habe mir mal beide Varianten (32 und 64 bit geladen), leider stürzen beide bei Start mit einer IOException ab. Ebenso wird kein Log erstellt wo ein entsprechender StackTrace gezeigt werden würde. Habe dann aber doch einen gefunden in den Windows Protokollen, nachdem man keine Bugs im Tracker eröffnen kann poste ich diesen StackTrace hier
Fehler
Anwendung: beRemote.GUI.exe
Frameworkversion: v4.0.30319
Beschreibung: Der Prozess wurde aufgrund einer unbehandelten Ausnahme beendet.
Ausnahmeinformationen: System.IO.IOException
Stapel:
bei MS.Internal.AppModel.ResourcePart.GetStreamCore(System.IO.FileMode, System.IO.FileAccess)
bei System.IO.Packaging.PackagePart.GetStream(System.IO.FileMode, System.IO.FileAccess)
bei System.Windows.Application.LoadComponent(System.Uri, Boolean)
bei System.Windows.Application.DoStartup()
bei System.Windows.Application.<.ctor>b__1(System.Object)
bei System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32)
bei MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate)
bei System.Windows.Threading.Dispatcher.WrappedInvoke(System.Delegate, System.Object, Int32, System.Delegate)
bei System.Windows.Threading.DispatcherOperation.InvokeImpl()
bei System.Threading.ExecutionContext.runTryCode(System.Object)
bei System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode, CleanupCode, System.Object)
bei System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
bei System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
bei System.Windows.Threading.DispatcherOperation.Invoke()
bei System.Windows.Threading.Dispatcher.ProcessQueue()
bei System.Windows.Threading.Dispatcher.WndProcHook(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
bei MS.Win32.HwndWrapper.WndProc(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
bei MS.Win32.HwndSubclass.DispatcherCallbackOperation(System.Object)
bei System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32)
bei MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate)
bei System.Windows.Threading.Dispatcher.WrappedInvoke(System.Delegate, System.Object, Int32, System.Delegate)
bei System.Windows.Threading.Dispatcher.InvokeImpl(System.Windows.Threading.DispatcherPriority, System.TimeSpan, System.Delegate, System.Object, Int32)
bei MS.Win32.HwndSubclass.SubclassWndProc(IntPtr, Int32, IntPtr, IntPtr)
bei MS.Win32.UnsafeNativeMethods.DispatchMessage(System.Windows.Interop.MSG ByRef)
bei System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame)
bei System.Windows.Application.RunInternal(System.Windows.Window)
bei System.Windows.Application.Run()
bei beRemote.GUI.App.Main()[/pre]
Also generell würde ich nicht mitzählen, da ich generell immer Log Meldungen ausgebe (werden dann in einer Release Version mit Preprocessor entfernt - teilweise). Und anhand der Zeitstempel im Log sehe ich schon mal grob ob wo Zeit liegen bleibt. (natürlich sind hier die Latenzen inbegriffen)
Sobald es dann um Millisekunden geht, kommt man eigentlich um einen Profiler nicht mehr rum ..
In der Arbeit haben wir für unser Framework einen eigenen "Timelogger" geschrieben, wo man die Zeiten hierarchisch loggen kann.
Eine Frage habe ich noch. Ist es vielleicht sinnvoll die Projektliste aus dem Lebenslauf auszulagern? Ich fülle momentan 2 Din A4 Seiten.
Ja eine eigene "Mappe" für die Projekte ist sinnvoller.
Zitat von pinki
Ich habe da auch noch eine Frage zur Projektliste: Sollten auch Projekte, die im Rahmen des Studiums abliefen, angegeben werden?
Ich würde alle Projekte angeben an denen ich gearbeitet habe (bzw. gerade arbeite), private und natürlich im Job (so weit es geht), in die Projektliste aufnehmen. Natürlich ab einen gewissen nutzen der Projekte (einfacher Texteditor Abklatsch, den man selber nicht verwendet braucht man natürlich nicht dazugeben)
Die Frage ist mir nicht eindeutig.
Willst du beim ändern der Fenstergröße die Controls anders positioniert habe?
Oder willst du die Controls generell größer haben? <-- hier wäre die ViewBox vl das passende
Verwenden die ViewBox für einen Client bei uns in der Arbeit. Ist wirklich praktisch und hilfreich.
Natürlich muss man aufpassen, jedes Child der ViewBox wird entsprechend angepasst (MessageBox etc. auch)
Wird er nur langsamer oder stürzt er dann (nach weiteren 4000) ab?
Gibst du alle Resourcen wieder frei oder behältst du alle Objekte in irgendeiner Art und Weise?