Dirk N schrieb:
Ich arbeite mich ja gerade erst in das Thema "Objektorientierte Programmierung" ein und wollte nur wissen, ob ich richtig starte. Als Basis meiner Mini-App. habe ich die Klasse Beleg (Buchungsdatum, Betrag, Konten, usw.) mit den Methoden Einfügen, Ändern, Löschen vorgesehen. Abgelegt sollen die Belege zur Weiterverarbeitung in einer Generics <List>.
Bin ich auf den richtigen Weg?
Tipps, Hinweise aber auch Literaturvorschläge willkommen.
Klingt bisher nicht schlecht. Folgender Vorschlag: Du baust dein Design mal zu Ende und dann schreibst du hier nochmal rein, zeigst uns dein Code. Dann koennen wir dir bessere Tips geben.
00Albert schrieb:
Ist das also keine gute Idee Setter und Getter zu benutzen, mir ist nämlich nicht so richtig klar geworden weswegen es zwei Möglichkeiten gibt Informtionen in eine Methode zu bekommen, bzw. herauszubekommen, bzw. wann welche eingesetzt wird
Grundsätzlich sind Getter/Setter eine gute Idee, deswegen wurde in C# ja auch die "Property" als neues Sprachfeature eingeführt. Das Problem liegt darin das Du offensichtlich noch nicht erkannt hast das Property und Methode zwei unterschiedliche Sprachfeatures sind.
Beispiel:
// Das ist keine Methode sondern eine Property.
public int Methode
{
get
{
return iVariable;
}
set
{
iVariable = value;
}
}
// Das ist eine Methode
private int BerechnungMaxMethode()
{
int iMaxMethode = 0;
iMaxMethode = iVariable1/5;
return iMaxMethode;
}
Ok ich hab nochmal genauer darüber nachgedacht.
Ein Teil hat tatsächlich gestimmt es gab einen MTA Thread aus dem die im Hauptthread erzeugen Interfaces überschrieben wurden. Ich habe dies nun beseitigt und alle Threads testweise auf STA umgestellt. Kein neues Resultat. Weiterhin ein Fehler.
TemplateBinding referenziert immer das Control , auf welches das Template angewandt wird.
Student83 schrieb:
Wird der Wert nun an das SnapsToDevicePixels-Property des ContentPresenters selber (dann würde ich die explicite Angabe hier nicht verstehen) oder an den Wert des Buttons gebunden?
Es wird der Wert des Buttons gebunden. ContentPresenter stellt ja kein Template dar.
Student83 schrieb:
Und was würde passieren, wenn ich dem Style nun noch den folgenden Setter gebe:
<Setter Property="SnapsToDevicePixels" Value="{TemplateBinding SnapsToDevicePixels}">
? Würde daraus nicht eine Endlosschleife resultieren?
Es wäre ein ziemlich unnötiger Setter. Was genau passieren würde, weiss ich nicht. Ich würde aber mal sagen, es würde zusätzlicher Aufwand betrieben, welcher unnötig ist. Zu einer endlosschleife käme es wahrscheinlich nicht, weil die Bindings in WPF da recht gut sind, solche Rückkopplungen abzufangen.
Grüssli
Ich denke es wäre vernünftiger wenn du das Grundproblem in deinem Code beseitigst, nämlich den Grund warum die Queue für 30ms (5 Records * 6ms) gelockt bleibt.
Dann brauchst du auch kein Monitor.TryEnter.
Jedermann schrieb:
Wie kann ich das berechnen?
Füg eine entsprechende Translation hinzu. Wenn du um 90° drehst, entspricht dies dann genau der Höhe des Bildes.
http://i49.tinypic.com/23igv9y.png
using System.Net;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
namespace FormsTest
{
public partial class Form1 : Form
{
private readonly Image m_image;
public Form1()
{
InitializeComponent();
var request = WebRequest.Create("http://i48.tinypic.com/2i7l9c4.png");
using(var response = request.GetResponse())
{
m_image = Image.FromStream(response.GetResponseStream());
}
}
private void OnPanelPaint(object sender, PaintEventArgs e)
{
var g = e.Graphics;
var matrix = new Matrix();
matrix.Translate(m_image.Height, 0);
matrix.RotateAt(90.0f, new PointF(20, 20));
g.Transform = matrix;
g.DrawImage(m_image, 20, 20);
}
}
}
Ich weiss nicht, wie genau du dich mit Matrizen auskennst. Man kann verschiedene Projektionen über Matrizen beschreiben. Wenn man sie miteinander multipliziert, entspricht dies der Anwendung der jeweiligen Projektion in umgekehrter Reihenfolge zur Multiplikation.
Wenn du mein Beispiel anschaust, wende ich zuerst ein Translate und danach ein RotateAt an. Tatsächlich wird dies beim Output dazu führen, dass zuerst ein RotateAt und danach ein Translate durchgeführt wird.
Wenn du mehr dazu wissen willst, informier dich über Matrizen im Bereich von Computergraphiken.
Grüssli
Parker schrieb:
Und gleich noch eine Frage. Wie bekomme ich es denn hin in einem Trigger auf ungleich null abzufragen?
Wie ich sagte, mit einem Konverter hat man eine höhere Flexibilität
Grüssli
Ich habe so gut wie keine Ahnung von Asp.Net, aber eine kurze Suche in der MSDN ergibt die folgenden Resultate und mehr:
http://stackoverflow.com/questions/821341
http://forums.asp.net/t/1307621.aspx
http://forums.asp.net/t/1399324.aspx
http://www.codeproject.com/Articles/290218/Custom-ASP-NET-Editable-DropDownList
http://forums.asp.net/t/1582116.aspx
http://stackoverflow.com/questions/3735151
Wenn ich das so durchlese, erscheint es mir die Antwort auf deine Frage zu sein.
Die MSDN Suchanfrage...
Grüssli
Vielen Dank, das sind absolut brauchbare Hinweise, mit denen ich mich im Folgenden beschäftigen werde, um dann die für mich beste Vorgehensweise zu finden.
paulrei schrieb:
Hier steigt der RAM zwar langsamer an, aber er steigt ebenfalls.
Über welchen Zeitraum? 5 Minuten? 50 Minuten? 5 Stunden? Es liegt in der Natur einer GC das die sich erst mit der Zeit auf einen Speicherbedarf "einpegelt". Dies ist kein Fehler und kein Leak.
Auch hat Dispose wenig mit Memory-Leaks zu tuen. Hierbei geht es nur darum nicht mehr benötigte (unmanaged) Resourcen gezielt freizugeben anstatt auf die GC zu warten. Grundsätzlich freigegeben würden diese Resourcen aber eh früher oder später.
paulrei schrieb:
Ich kann mir das nicht erklären.
Dann beschäftige Dich mal genauer mit der Arbeitsweise einer GC. Der erste (und häufigste) Denkfehler ist, das in einer GC Speicher gelöscht wird wenn er nicht mehr gebraucht wird. Das ist aber FALSCH. Speicher wird nur dann freigegeben wenn neuer Speicher benötigt wird. Solange der Freispeicher einer App ausreicht wird die GC nicht laufen. Erst wenn der Freispeicher der App zur Neige geht versucht diese durch einen GC-Lauf Garbage loszuwerden. Geht das nicht wird einer weiterer Block Speicher vom System geholt. Im Taskmanager sieht man aber nur den zugewiesenen Speicher, man sieht nicht wieviel % davon benutzt werden und wieviel noch frei sind.
Zu GC-Collect():
Mit dieser Methode kann versucht werden, den gesamten Speicher freizugeben, auf den nicht zugegriffen werden kann. Allerdings garantiert die Collect-Methode nicht, dass der gesamte Speicher freigegeben wird, auf den nicht zugegriffen werden kann.
Beachten: da steht "kann". Collect aufzurufen bedeutet also nicht zwingend das dann aller Speicher aufgeräumt wird. Am besten die Finger davon lassen damit die GC ihre Arbeit machen kann.Mit GC.Collect() löst Du keine Speicherprobleme, Du erzeugt nur Performanceprobleme.
ich habe noch weiter geforscht und verstehe jetzt gar nichts mehr! Wenn ich
img.RotateFlip(RotateFlipType.RotateNoneFlipY);
img.RotateFlip(RotateFlipType.RotateNoneFlipY);
verwende, dann geht die Beschreibung verloren. Wenn ich stattdessen jedoch
img.RotateFlip(RotateFlipType.Rotate90FlipNone);
img.RotateFlip(RotateFlipType.Rotate270FlipNone);
verwende, dann funktioniert alles. Steckt da noch irgendeine Logik dahinter, die ich nur nicht nachvollziehen kann?