Laden...
S
spike24 myCSharp.de - Member
Programmierer Steiermark Österreich Dabei seit 01.02.2008 443 Beiträge
Benutzerbeschreibung

Forenbeiträge von spike24 Ingesamt 443 Beiträge

16.11.2009 - 14:05 Uhr

Grüss euch,

Ich fang mal so an
Aufbau des Fensters:
eine System.Windows.Forms Form
darauf im Designer
Ein "Kompatibilitäts-Control"
positioniert

Zur Laufzeit wird
Ein von Canvas abgeleitetes Object (MainFrame)
als Child hineingehängt.

im ctor von MainFrame wird
Ein von Canvas abgeleitetes Object (LineContainer)
erstellt und mit Children.Add() angefügt (ZOrder wird auch vergeben)

Bevor der LineContainer mit Add() angefügt wird, wird
Ein Line-Object (nicht abgeleitet)
mit Children.Add() in den LineContainer gehängt

und nun bräuchte ich vom LineContainer das MouseMove und DoubleClick-Event
Blöderweise, wenn ich die Events anzapfe, reagiert niemand darauf.

Ich kann vom MainFrame die Events anzapfen, da kommt dann auch wie erwartet jedes Event daher gebubbelt.
Bei den EventArgs in den jeweiligen Methoden gibt es ein SourceObject (o.ä.) welches das Object beinhaltet welches das Event geworfen hat.
Eigenartiger weise kommt da nie das LineContainer-Objekt vor, sondern bestenfalls das Line-Objekt.

Ich hab dann aus diesen Event eine Zeitlang herumprobiert, ob ich von diesem Event aus auf das aktuelle LineContainer-Objekt komme (es gibt mehrere davon)

So wie sich mir das Bild darstellt, wird das LineContainer nicht angezeigt, sprich ist nicht mit GUI-Mitteln nicht zu erreichen.
Da gäbe es auch die statische Mouse-Klasse, die einige Möglichkeiten bietet, aber selbst mit der habe ich es nicht erreicht irgendeinen LineContainer "gezielt" auswählen zu können.

Direkt Properties habe ich nicht gesetzt, sprich ist eigentlich alles Standard.
Was muss ich verstellen, damit auch mein LineContainer Events bekommt?

16.11.2009 - 12:36 Uhr

Anmerkung am Rande:
wenn Du Locking einbaust, brauchst Du auch unbedingt VersionHandling.
Was nützt es wenn du den gleichzeitigen zugriff verhinderst, wenn man auf einer alten Version des Datensatzen speichern darf?

16.11.2009 - 12:01 Uhr

Hi Spike24,
Wird allerhöchste Zeit sich in das Thema einzuarbeiten (-;

jep

Wir das Locking bei euch nur im Speicher gehalten oder habt ihr in der DB noch ein Hinweis auf den gelockten Datensatz?

nur im Speicher, wenn der LockingService stirbt, darf er keine Spuren hinterlassen

Ist der Service als Singleton implementiert?

Singelton, wobei die Frage nicht ganz verstehe, einen Service gibt es generell nur einmal, egal wieviele Verbindungen vom Client geöffnet werden

In was für einem Szeanrio setzt ihr euren Service ein?
Web- oder Windows-Client.

bei uns in Windows, wobei ich hier ebenfalls die Frage nicht ganz verstehe, den einem Service ist es ziemlich egal wer darauf zugreift.

16.11.2009 - 11:06 Uhr

Hab gehört der CommandBuilder ist manchen Szenarien nicht so performant.

Irrelevant.
Ohne Deinen Programmcode zu kennen verbratest Du an anderer Stelle das 100fache. Ohne es zu wissen. Versprochen.

Wenn das Programm von User 1 abstürzt hält User 1 das Lock auf den Datensatz bis in die nächste Ewigkeit, das kann unter Umständen dauern. Geht man nach Hollywood bis 2012 😉
Ausser Du hast ein "Programmteil" das dieses Lock nach z.b. 1 Minute entfernt. Aber nur wenn sich der Client nicht regelmässig meldet, es kann ja sein, das ein Client das Fenster nur offen hat, aber nicht ständig daran was ändert.

Grunsätzlich:
Um sowas zu implementieren, wirst Du Dein Framework mal aufbohren müssen.
Wenn Du Dich in http://www.mycsharp.de/wbb2/thread.php?threadid=32405 auskennst, wird Dir das ungemein helfen.

Als Erstes brauchst Du eine Stelle welche das locking übernimmt:
Wenn sich ein Client meldet locken, das regelmässige locken empfangen kann, falls kein regelmässiges locken mehr kommt, das lock entfernt, und das lock entfernt wenn es der Client nicht mehr braucht (nach dem Speichern)
Wir haben uns dafür einen Service geschrieben mit den Methoden Acquire und Release
Der Client erzeugt einmalig einen SessionToken (UserName?) und übergibt bei Acquire diesen Token, den Typ des zu sperrenden Objects und die entsprechende Id.
Bei Release das gleiche.
Hint:
im LockingService haben wir ein Dictionary<DtoReference, SessionToken> wo gemerkt wird wer was gelockt hat und ein zweites Dictionary vom Type Dictionary<SessionToken, DateTime>
DtoReference.Properties = Type und Id, des Objektes.

Der Rest ist dann eigentlich eine einfache Sache wenn man den oberen Link intus hat. vor dem Property ändern geht man zum LockingService und fragt nach ob man den Lock auf das Objekt bekommt, wenn ja, dann führt man die Änderung durch wenn nein wirft man eine StateChangingCanceledExcption.

Das war eigentlich der ganze Zauber.

13.11.2009 - 14:53 Uhr

Ich glaub da sind generell noch ein paar Fragen offen.

Sollen die Änderungen nicht überschrieben werden? oder soll der 2. Benutzer daran gehindert werden etwas an den Daten zu ändern?

Beachte, die Daten zu ändern sind im Zeitablauf vor dem Speichern

  1. Benutzer 1 : andert Feld 1
  2. Benutzer 2 : andert Feld 2
  3. Benutzer 1 : andert Feld 3
  4. Benutzer 2 : andert Feld 3
  5. Benutzer 1 : speichert
  6. Benutzer 2 : speichert

Wann soll wer informiert werden? was soll bei 6. passieren

03.11.2009 - 10:16 Uhr

button.FindForm();
wäre mein erster Versuch.

sonst hat jedes Control eine Parent Eigenschaft.

15.10.2009 - 12:15 Uhr

Kann sein dass ich da jetzt daneben liege, aber:
ich kompilere mit CodeDom zur Laufzeit code (string => dll)

und da musste ich dem CodeDom Compiler sagen das ich 3.5 haben will

vielleicht fehlt das da einfach auch.
so in der Nähe von CompilerVersion("3.5");

Der Link passt zwar nicht ganz zum Thema aber die angesprochene Zeile kommt vor.
CompilerVersion

Ich weis dass Du was anderes hast, aber vielleicht konnte ich eine Richtung vorgeben.

// Edit:
bei mir hatte er ohne der richtigen Compiler version nämlich genau probleme mit dem Lambda, ohne lambda gings auch ohne Compilerversion
Wenn es bei dir ohne Lambda geht, würde ich in die gleiche Richtung tippen.

13.10.2009 - 08:37 Uhr

ich guck im processexplorer nach wer ein handle auf diese datei hat

07.10.2009 - 10:15 Uhr

War eh nur als Schmäh gemeint, ich habe die "Aufgabe" ein Fenster nachzuzeichnen und da sind die Linien halt scharf.
Wenn man ein fancy Design braucht/will ist man mit dieser Eigenschaft vorn dabei!

06.10.2009 - 16:58 Uhr

ja wunderbar, so gefällt mir das.
Antialiasing, wer braucht denn sowas pfff 😉

06.10.2009 - 12:15 Uhr

und (vermute ich jetzt mal) mit deutlich weniger Overhead auskommt, was den Code der Controls selbst angeht.

wir verwenden StandardControls, das war unsere Vorgabe.
Das System 1:1 übernehmen geht schlecht, da Du ja andere Vorgaben hast, aber die Richtung würde ich beibehalten, um eben den Code in den Controls so gering wie möglich zu halten.

06.10.2009 - 11:44 Uhr

Eine grobe Ahnung von dem was rauskommen soll sollte schon vorhanden sein, oder glaubst du dem Computer alles. Zumindest für eine Plausibilitätsprüfung sollte das Ergebnis grob abgesteckt werden können. Wie sollst du sonst wissen ob das Ergebnis im zulässigen Bereich ist, etc.

Ok, ein bisschen übertrieben ausgedrückt, soviel weis ich schon damit ich die Sache überprüfen kann ob das stimmt was da rauskommt, klar.
Aber eben die mathematische Optimierung fehlt noch.
Ich habe eh in meinem Beitrag erwähnt das es zwei stellen gibt die eben zu überarbeiten sind.

Was noch zu bearbeiten ist, ist sicher die GetFittest() Methode. Die gibt mir noch viel zu viel zurück

Wie berechne ich die Fittnes?
von allen Populationen suche ich mir die raus, die am meisten dataRows hat. (z.b. 100)
...
Fürs testen, und weiter bin ich noch nicht, reicht es mir wenn nicht immer 0 (%) zurückkommt.

Hier sehe ich auch die Optimierung im Mathematischen Sinne zu erledigen, und die fehlt halt noch komplet. Ich programmiere mal den Alg. allgemein und diese Optimierunge nehme ich dann mit einem Freund vor, da er mehr Ahnung von diesem Thema hat.

06.10.2009 - 10:43 Uhr

Die Validierung haben wir absolut ident gelöst

ich habe ja in meinem Beitrag control.DataBinding... erwähnt.
da gibt es auch passende Events an die man sich hängen kann (BindingComplete)
(hab gerade keinen code, da ich das Teil gerade nicht finde)
Aber wenn man sich die BindingCompleteEventArgs in der Hilfe ansieht, kann man erkennen, das da alle Sachen angehängt sind, die man für eine zentrale Validierung benötigt.

06.10.2009 - 09:45 Uhr

Also so praktikable find ich das jetzt auch nicht
Warum hat die Textbox eine FocusBackColor Property?
die brauchst Du dann auch für eine ComboBox, NumericDropDown, RadioButton, CheckBox, DateTimePicker und musst diese dann im Designer für JEDES Control einstellen, das ist als Designer (GUI-Macher) der Horror!
Und der Kunde kann es nicht verändern

Wir verwenden einen sogenannten FieldStyleSupplier
Es ist auch eine statische Klasse names ControlScanner vorhanden.

public class MyForm : Form
{
  public MyForm()
  {
    InitializeComponents();

    ControlScanner.Scan(this);
  }
}

Im ControlScanner.Scan(Control parentControl) werden alle Children durchgegangen und auch desen Children und desen und desen (rekursive) um sich an die Events zu hängen.

foreach (Control control in parentControl.Controls)
{
  if (control is TextBox)
  {
    control.GotFocus += Control_GotFocus;
    control.LostFocus += Control_LostFocus;
    // eventuell auch zur Validierung der Eingaben
    control.TextChanged += Control_TextChanged
  }
}
private void Control_GotFocus(object sender, EventArgs e)
{
  Control control = (Control)sender;
  control.BackColor = Color.WünschDirWas;
}

Ich sprach vorher den FieldStyleSupplier an. Ein Stück code zur Anregung was der machen könnte, bei uns ist er irgendwie ein bisschen kryptisch.

public Color GetFocusedBackColor(Control control)
{
  if (control is TextBox)
    // Hole mit magic Code die BackColor für eine Focusierte TextBox

  if (control.DataBindings....
    // Hole mit magic Code die BackColor für eine Focusierte TextBox mit einem passenden Databinding

}

somit brauchst Du absolut nichts an den Controls selbst ändern, die Eigenschaften werden von aussen draufgesteckt. und die Fokusiert BackColor ist zentral einstellbar.

06.10.2009 - 09:11 Uhr

Noch ist keine Optimierung zu erkennen, da es ganz einfach noch keine gibt.
Ich bin gerade beim Erstellen des Programmes und habe ehrlich gesagt keine Ahnung was da rauskommen wird, sprich ich muss die Optimierungen erst vornehmen, mom. bin ich im einbauen von Multithreading um es von dieser Seite her mal flott zu machen. Weiters mache ich die letzte Arbeit des Programmes, die GUI. danach kommen optimierungen.

neuen Thread brauchen wir nicht, da ich jetzt keine konkrete Frage habe.

bevor ich was frage sollte ich mir mal das reinziehen.
Evolutionäre Algorithmen - Begriffe und Definitionen

06.10.2009 - 09:06 Uhr

Ahh... da bin ich jetzt klüger geworden
WPF zeichnet schwammig, ich bin das Paint-ähnliche Zeichnen gewohnt, ein Pixel ist ein Pixel und fertig
Werd mir den MSDN Beitrag reinziehen und versuchen das schwammige zeichnen abzustellen, das will ich nämlich nicht.

Besten Dank für die Hilfe und den Link

05.10.2009 - 12:12 Uhr

Danke für die Antworten,

natürlich will ich WPF benützen, das OnPaint habe ich weggeschmissen

Hmm, der Strich kommt mir um einiges breiter vor als 1 Pixel ?-)
Muss ich nochmal nachsehen, schaffe ich aber erst morgen abend. Mir kommt vor das ich mit OnPaint, wesentlich dünnere Striche zusammengebracht habe.

Blöde Frage, nur um sicher zugehen dass ich nichts falsch mache
die Strichstärke stellt man mit

myLine.StrokeThickness = 1;

ein?
Oder fehlt da noch was?

Irgendwie ist mir das jetzt spanisch

05.10.2009 - 10:50 Uhr

Grüss euch,

ich muss in meinem Programm ein "paar" Linien auf das Form malen.
Da hat mir mein Arbeitskollege etwas von der Klasse Canvas erzählt.
Nach ner stunde einlesen und probieren, habe ich mein OnPaint weggeschmissen und mir so ein Control hergezogen. Lange Rede kurzer Sinn.

Das Line Object ist irgendwie komisch, white ist nicht gleich white.
Wenn ich 3 Linien übereinander male sind die weisser als die einzelne Linie daneben.
Linien mit einer strichstärke von 1 sind gleich breit wie die mit 0.5?

Gehört das so, oder verwende ich da irgendwas falsch?

29.09.2009 - 12:56 Uhr

ich meinte den Vorschlag bzgl. Simulated Annealing
Irgendwie hat mir der einfach nicht zugesagt.

Wie habe ich ihn implementiert:
Hierbei sei erwähnt, dass ich in der Benamsung der einzelnen Begriffe schon festgestellt habe dass ich mich gelegentlich vertan habe. Zum Beispiel das Wort Chromosom kommt bei mir nicht vor.

ich hab mal ne datenbasis. Wichtig ist, die hat ein Datum und ein Datensatz kennt die, die davor waren, sprich, sie sind untereinander verknüpft (aber immer nur in eine Richtung)
(der Datensatz vom 10.01 kennt den vom 09.01 und 08.01, der vom 09.01 kennt den vom 08.01 und 07.01)
Es sollte auch erwähnt werden, das nach dem zusammenbauen (ist ein längerer Vorgang) alle Element in einer Liste vorliegen. (der vom 10.01 und vom 09.01)

Dann erstelle ich die Gene, da sich die Datenbasis auch von der Struktur her ändern kann muss ich das zur laufzeit machen,
und da ich so flexibel wie möglich sein muss erstelle und kompiliere ich dll's welche ich dann in der Datenbank ablege.
Ein Gen hat im endefekt eine Methode im Stil von:

return {linker Operand} == ({rechter Operand} - allele);

der linke und rechte Operand werden aufgrund der Struktur der Datenbasis ermittelt.
z.b. dataRow[0].Property == (dataRow[1].Property - allele)
dataRow ist die Klasse die z.b. den 10.01 darstellt, der Indexer ist so geschrieben, dass bei [0] der 10.01 zurückkommt und bei [1] der 09.01
ist ein bisschen komisch, aber war eine Vorgabe.
Die 'allele' ist der von Dir erwähnte "Zufallswert (im Idealfall aus dem Wertebereich der Lösung)" (Ich habe den Idealfall)

Nun habe ich meine drei Teile die ich zur generierung benötige
Datenbasis (List<DataRow>)
Gene (List<Gen>)
Allelen (List<Allele>)

nun kommt der GA zum Einsatz und steckt mal alles zusammen.

foreach Gen
  foreach Allele
    pops.Add( CreatePopulation(gen, allele, dataRows) );

beim ersten Durchlauf erhalte ich ca. 3000 Populationen welche mal in die Datenbank gespeichert werden.

der nächste Durchlauf startet mit der Zeile

List<Population> fittestPopulations = pops.GetFittest();
// fittestPopulations.Count == 500 - 600

ich nehme alle Gene und "idealisiere" meine Allelen um keine sinnlosen Berechnungen zu machen
danach erstelle ich wieder die Populationen, mit dem unterschied dass ich das bestehende Gen-Allele Paar 'kopiere' und das neue Gen-Allele Paar dazugebe

foreach Gen
  foreach Allele
    pops.Add( CreatePopulation(fittestPop.Genom, gen, allele, dataRows) );

und erhalte, eigentlich mit dem gleichen schema wie oben beschrieben so an die 120.000 neue Populationen.

Was noch zu bearbeiten ist, ist sicher die GetFittest() Methode. Die gibt mir noch viel zu viel zurück

Wie berechne ich die Fittnes?
von allen Populationen suche ich mir die raus, die am meisten dataRows hat. (z.b. 100)
wenn eine andere Population z.b 14 hat, erhält die mal die CountFitness 14 (%)
die zweite Fittness ermittle ich mir mit dem ansehen der einzelnen dataRows. nach einem bestimmten Kriterium sind sie gut oder schlecht.
z.b. 7 sind gut, dann ergibt das 50 (%) -> ergibt in summe 64 (%) von 200 (%).
die ist sicher auch noch zu bearbeiten, vorallem in Richtung gewichtung der einzelnen Werte und vielleicht dem erfinden anderer Kriterien.
Fürs testen, und weiter bin ich noch nicht, reicht es mir wenn nicht immer 0 (%) zurückkommt.

28.09.2009 - 13:54 Uhr

ja
Debug -> Windows -> Threads

25.09.2009 - 15:41 Uhr

In den meisten Fällen ist der Zielwert der Fitness (bzw mathematisch betrachtet das Optimum der jeweiligen Funktion) nicht bekannt

Ja mein algorithmus hinkt ein bisschen, habe ich schon festgestellt, wie ich begonnen habe habe ich viel über die verschiedenen algorithmen gelesen und schön langsam glaube ich, ich habe einige Teile vermischt. Wie ich die 200 ausgerechnet habe dachte ich mir auch "Kann die Evolution in der realen Welt auch mal ein Maximum erreicht haben?" und so hinkt diese Funktion ein bisschen.

Ich habe mir damals und auch heute Deine vorgeschlagene Heuristik angesehen, ich hab sie damals zusammenfassend eine "springende Tiefensuche" genannt. aber aufgrund der ungeheurlichen datenmengen habe ich mich für den evo entschieden. für 0,5% der Datenmenge erhalte ich bereits nach dem 2. Durchlauf 120.000 Populationen die eine Fitness ausgeben (10.000 davon sind für den nächsten Schritt vorgesehen). und ich weis nicht wie weit er da "springen" müsste um die nächste lokale Tiefe finden zu können).

aber besten dank für die Anregungen und Erklärungen !!!

@tkrasinger
Rat mal wie es mir beim programmieren geht, mittlerweile begrüsse ich meinen Laptop wenn er fertig hochgefahren ist

25.09.2009 - 10:43 Uhr

Ok, soweit ich das verstanden habe, ist eine Fehlerfunktion keine Funktion im herkömmlichen Sinn wie eine Methode im Code, sprich etwas das was tut, sondern eher ein Begriff oder Wert der mir hilft zu bestimmen wie nahe ich an der Besten Lösung bin.

Aus meinem Programm:
Ich benütze ja wie bereits erwähnt den Evolutionären Algorithmus. Bei diesem dreht sich im Endefekt alles um die Fittnes einer Popolation.
bei mir ist die höchste zu erreichende Fittnes 200 (wie das jetzt auch immer berechnet wird). Diese Zahl ist allerdings weder praktisch noch theoretisch zu erreichen! soweit ich gesehen habe ist der höchste Wert um die 120.
Falls ich Deine gut verständliche Erklärung verstanden habe könnte man zu diesem Beispiel sagen, "Die Fehlerfunktion beträgt/ergibt 80"? und sollte so gering wie möglich gehalten werden.

Kann man den Satz so stehen lassen?

25.09.2009 - 09:24 Uhr

ich hab gestern gegoogelt, aber ich habe für "Fehlerfunktion" keine Erklärung gefunden die ich verstanden hätte.
Dürfte ich Dich bitten mir dieses Wissen näher zu bringen?

// Edit:
ich schreib einen suchalgorithmus auf basis des Evo. Algorithmus, was ja, soweit gelesen als Grundlage für eine KI dienen kann, ich behaupte aber nicht das ich verstanden habe was ein KI ist, zumal ich glaube, das mein Programm nie intelligent werden wird.

24.09.2009 - 15:05 Uhr

Ja, das Teil ist toll, meiner Ansicht nach ist das Framework dahinter auch nicht schlecht programmiert (abgesehen vom Naming -> umlaute in MethodenNamen)

Falles jemand mal vor hat sich mit KI zu beschäftigen hat er hier die "perfekte" Spielwiese. Einerseits kann man sich selbst mit den Einstellungen der Ameise spielen, andererseits kann man div. Algorithmen einbauen damit sich der Haufen selbst organisiert.

Ich finds ne tolle Idee und ne gute Umsetzung

22.09.2009 - 07:52 Uhr

Nur so am Rande, folgende Zeile (und entsprechende Methode) in Programm.cs in die Methode Main() als erste Zeile einfügen

      AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

die Methode:

    static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
         // in e.ExceptionObject steht die Exception die aufgetreten ist
         // ev. in einer MessageBox anzeigen
         // wenn Dir das dann nicht weiterhilft, die Innerexception ausgeben
         // vielleicht so:
        Exception ex = e.ExceptionObject as Exception;
        string exceptionMessage = string.Empty;
        while (ex != null)
        {
          exceptionMessage += (ex.GetType().Name + ": " + ex.Message + System.Environment.NewLine);
          ex = ex.InnerException;
        }
        MessageBox.Show(exceptionMessage);
    }

ist aber nur schnell hingetippt, ev. wäre der Stacktrace auch mit auszugeben.

Nochmal am Rande, vielleicht hat er mit den MediaPlayer Steuerelementen Probleme?

21.09.2009 - 09:22 Uhr

Aber irgendwie wäre es interessant was der Fragesteller damit eigentich bezwecken will?

04.09.2009 - 13:32 Uhr

Grüss euch,

wir haben in unserer Anwendung einen sogenannten Highlighter eingebaut, welcher die Aufgabe hat Zellen in einem DataGrid nach bestimmten Regeln einzufärben.

Sprich, irgendwann kommt die Zeile
{Cell}.BackColor = color;

und da ist auch unser Problem, wenn die Row markiert ist, sollte ja ein blauer Hintergrund vorhanden sein, aber der Highlighter sagt, gelb
Jetzt habe ich, mehr oder weniger, die ehrenvolle Aufgabe bekommen, die Farben zu "mergen", einerseits zu zeigen, dass die Row markiert ist, andererseits das die Row verändert worden ist, Sprich ein Blaugelb {© Reese von Malcom mittendrin, in der Serie als sie Aspest in der Decke fanden}

Fazit:
Wie kann ich Farben mergen?

01.09.2009 - 16:22 Uhr

ich würde bei den Parametern jetzt nicht soo die Geschwindigkeit als Hauptgrund nehmen, sondern eher die Sicherheit, das der command funktioniert.
vorallem .ToString() bei int hat manchmal eigenartige Auswirkungen, nur so am Rande.

PS:
.Clear() hab ich jetzt auch vergessen zu erwähnen

01.09.2009 - 13:01 Uhr

Also laut fehlermeldung hat er ein Problem mit dem PK (PrimaryKey)
in einem Insertbefehl würde ich den auch nicht setzten, meistens, in meinem Fall alle, sollte das die datebank selbst übernehmen hier einen Wert in die Spalte zu schreiben.

Weiters finde ich den SQL-String ein bisschen schräg, zumindest habe ich noch nie gesehen das so einer funktionieren kann.

INSERT INTO {Table} ({FeldNamen}) VALUES ({Wert})

wenn ich die Datenbank wäre würde ich nicht wissen wo Du die Werte hinhaben willst, allerdings kenne ich ce nicht.

Ich wiederhole mich, ich kenne ce nicht, nur den richtigen und da entzieht es sich vollkommen meines Verständnisses was die Hochkomma im SQL-String zu suchen haben.

"INSERT INTO Table (Tab_TextFeld, Tab_IntFeld) VALUES (@TextFeld, @IntFeld)"

cmd.Parameters.Add("@TextFeld", Cols.GetValue(0)); 
cmd.Parameters.Add("@IntFeld", (int)Cols.GetValue(1)); // wenn es kein int ist, kennt sich die Datebank ja eh nicht aus.

Wenn ce wirklich ganz anders ist als der echte oder sich mein Wissen ganz hinter dem Nebel des Alters versteckt dann ist dieser Beitrag kommentarlos zu löschen.

28.08.2009 - 10:07 Uhr

zu using

using (TypeName objectName = new TypeName())
{
}

ist gleich zu setzen wie

TypeName objectName = null;
try
{
  objectName = new TypeName();
  // code
}
finally
{
  ((IDisposable)objectName).Dispose();
}

sind aber fragen, die generell die Hilfe beantworten könnte

26.08.2009 - 12:25 Uhr

Die Softwarebranche verdient ja im Grunde nur Geld in dem sie anderen Branchen was verkaufen, wenn es wie jetzt den Banken schlecht geht, dann werden Hersteller für Bankensoftware weniger Umsatz machen.

negativ.
Wir schreiben BackOffice software für Banken und die rennen uns jetzt die Türe ein wie seit bestehen der Firma (10 Jahre) nicht gesehen.
Es ist ja nicht so das Problem das die kein Geld haben, sie vertrau(t)en sich nicht mehr, sprich es konnte kein neues Geld angeschafft werden (Deswegen sprang der Staat auch da ein)
Und so richtige Probleme haben ja "nur" Banken die in die Immobilien Kredite aus den USA investiert haben, die anderen haben "nur" Angst, dass sie ihr geliehenes Geld nicht mehr zurückbekommen. (Was zeitweise ja auch eine Konkurswelle ausgelöst hat), aber z.b. die grösseren Österreichischen Banken haben meist in SOEU investiert und die sind nur von den realwirtschaftlichen Auswirkungen der Krise betroffen. Die haben aber genug Geld auf der Kante um das zu Überleben bzw. um die Zeit des Stillstandes für Umbauarbeiten in der Struktur zu nützen und auch in diese zu investieren.

Noch ein Satz am Ende, manche kennen mich vielleicht schon mit einer manchmal eigenartigen Einstellung zu gewissen Dingen.

Stellt euch vor, es ist eine Krise, aber niemand geht hin.

Gibt es sie dann noch?

25.08.2009 - 10:04 Uhr

Ich habe mir mal angewöhnt, dass geht leider nur wenn man Zeit zum Test schreiben hat, in jede Zeile einen Haltepunkt setzen, alle Test ausführen, jeden Haltepunkt bei dem er stehen bleibt entfernen, wenn alle Tests durch sind, muss auch alle Haltepunkte weg sein.

Dann kann man mit Gewissheit sagen "jede Zeile ist getestet"

OffTopic:
nicht ganz OffTopic, deswegen nicht grau:

Es gibt ja das Attribute ExceptionExpected(), mit dem man ja angeben kann welche Exception bei diesem Testfall kommen soll.
Soweit so gut, allerdings, ist mir mal passiert, kann eine Methode an mehreren Stellen die gleiche Exception werfen (mit unterschiedlicher Message).
(z.B. Validierung eines XML-Documents => InvalidXmlDocumentException)
jede Testmethode erwartet diesen Type, es kommt auch dieser, allerdings nicht die richtige. (falsche Message)
Kann man dem Attribute (dem Testframework) das irgendwie beibringen das er die Message auch mit überprüfen soll?
PS:
ja, das Attribute hat auch einen Message-Parameter, laut Hilfe wird dieser dann aber nicht überprüft.

Wäre cool wenn da jemand was wüsste (ausser eigenes Try { } catch { })

Besten Dank im Voraus

25.08.2009 - 09:23 Uhr

und wo sehe ich am Ende die Punkte?

19.08.2009 - 17:04 Uhr

So, in Deinem letzten Absatz hab ichs geschnallt
natürlich, ist eine blöde Idee gewesen, Dein Hinweis mit der Tabelle hat mich erleuchtet.

So gesehen ist die Variante im letzten Absatz auch die, die ich nehmen würde

Langer Tag, eine Antwort 😉

19.08.2009 - 16:17 Uhr

Bin leider nicht so das Erklärungstalent... 😕

jep

ich glaube aber auch, das Thema ist nicht so leicht zu klären.

Weiters denke ich, dass das ganze ein bisschen falsch angegangen wurde.

Jedes Objekt soll speichern können und es gibt ein bool ob es das auch soll?

Irgendwie scheint mir das Ableitungs Monster die Probleme zu granular zu lösen.

Ableitung ist im weiteren Sinne eher eine Spezialisierung als ein anfügen von Properties und Methods. Klar, beim ableiten tut man genau das aber die Klasse sollte eher einen tieferen Sinn bekommen als mehr Funktion.

Meinem Verständniss nach hat man bei der Ableiterei eine Abstracte Basisklasse mit abstracten Methoden und die Kinder müssen die überschreiben, aber sonst keine neuen Methoden erfinden, ich bekomme immer ein bisschen Bauchweh wenn ich dass dann doch tue. Properties ist was anderes, aber keine Methoden oder im weiteren sinn eine neue Funktion und die Frage ob speichern oder nicht gehört ganz einfach in die Basisklasse.

ändert sich was am Gerät, warum auch immer, muss man keine neue Ableitungshierachie erfinden sondern einfach nur einen bool wert umsetzen

19.08.2009 - 14:05 Uhr

also wenn das eh so ist, dass es nur ODER gibt, sprich "min-max" oder "mögliche Werte", dann komme ich nur auf so ... 3 Klassen

Bassisklasse und die 2 Ableitungen.

bei einem UND hätte ich recht viel zusammengebracht.
Wie kommst Du auf Maga-Ableit-Orgie?

19.08.2009 - 13:26 Uhr

Also ich habe mir jetzt da den ganzen Beitrag durchgelesen, manches sogar 2 Mal.
Ich versteh was nicht.
Du hast ja das Beispiel gebracht mit dem Drehknopf einer Stereoanage.
diese hat meiner Ansicht nach min-max (10.000 db verursacht Probleme mit Nachbarn 😉 )
aber sonst nichts.
für das bräuchte ich nur eine Ableitung bzw. eine Klasse (Ableitung ist nicht zwingend)
Ich wüsste jetzt nicht, und ich hab ein bisschen überlegt wo ich einen "min-max" Wert benötige UND "mögliche Werte" (einen Schieberegler kann ich auf mögliche Werte einstellen, aber min-max hat herzlich wenig Sinn)

Wenn Du sowas hast würde ich mir mal darüber Gedanken machen ob das so stimmt.

Falls das aber wirklich so sein sollte, was dann aber zu erklären wäre wie das geht, könntest Du ja mal Klassen erstellen, eine für min-max, eine Basisklasse für "mögliche Werte" und was Du sonst noch brauchst.

Dann deine Basisklasse mit der Id UND
einmal von dieser ableiten und eine Property vom Typ "min-max" dazugeben.
einmal von dieser ableiten und eine Property vom Typ "mögliche Werte" dazugeben.
einmal von dieser ableiten und eine Property vom Typ "min-max" und eine Property vom Typ "mögliche Werte" dazugeben.
Und ja, da kommen Klassen zusammen, he, wenn Du zig Tausend einstellungen hast wirst Du wohl nicht mit 3 Zeilen auskommen.

und die Basisklasse bekommt eine abstract Methode GetBla() und jede Ableitung kümmert sich darum entsprechend den vorhandene Properties den jeweiligen code zurückzugeben.

Soweit habe ich Dein Problem verstanden.
wenn ich daneben liege frage ich gleich im Vorhinein um weitere Infos nach

12.08.2009 - 12:29 Uhr

ja

! immer !

egal wie Du den try-Block verlässt, ohne return, mit return oder mit throw new Exception()

10.08.2009 - 15:39 Uhr

Brötchenverdiener, naja im Vergleich zu Wissen und Leistung wohl eher Brotverdiener 😉

Fahre viel mit dem Zug (pendle 260km) und kann da auch privat programmieren.

in beiden Fällen C# mir kommt auch so schnell nichts anderes ins Haus. In der Firma kontakt mit allem was C# so bietet und privat versuche ich mich an Künstliche Intelligenz, stehe beim Evolutionärer Algorithmus, da werke ich seit Februar, bin zwar schon durch aber jetzt halt noch sauber werden.

29.07.2009 - 09:41 Uhr

jep, das ist der einfacher, und Du ersparst dir das ADOX Teil

24.07.2009 - 02:42 Uhr

Vielleicht noch ne kleine Anektode (?) hat nur am Rande was mit Frauen zu tun.

Ebenfalls wieder Telefonsupport.
Hatte da ein Headset und während des telefonierens blieb mir gelegentlich Zeit zum Freecell spielen (7.800 gewonnene Spiele in 3 Jahren)

Er: Ohne Namen oder Grund zu sagen brüllte er wie am Spieß ins Telefon.
Ich: Erfahrungsgemäss lassen wir ihn mal schreien, spielte ich Freecell.
Er: brüllte
Ich: hab mal eines gewonnen, also das nächste
Er: brüllte.
Ich: Na eines geht noch.
Er: legte auf.
Ich: ???
<Ich rufe normalerweise zurück aber ich hatte keine Ahnung wer das war>
<5 Minuten später>
Er: tut mir leid Herr Rossegger, aber ich musste mal Dampf ablassen.
Ich: Ist jetzt nicht so ein Problem, wie kann ich ihnen helfen?
Er: Ja wissen sie, mir wir schön langsam alles zuviel, habe vor 3 Jahren die Firma gegründet und das läuft nicht so gut wie erwartet, mit meiner Frau habe ich deswegen auch schon Probleme und die Sekretärin gefällt mir auch schon besser.

Ich bin froh dass ich solche Leute treffe, da bin ich wieder mit meinen Problemen glücklich

23.07.2009 - 10:40 Uhr

Ist gar nicht so einfach...

war mal 4 Jahre im Telefonsupport für Österreich und Deutschland für unser eigenes Produkt.

Ich: Oh, den Fehler kenn ich, den hab ich gestern behoben.
Sie: Und was mach ich jetzt?
Ich: kein Problem, wir brauchen nur das neue Update reinspielen und es geht.
Sie: Ich kenn mich aber nicht so besonders aus.
Ich: Kein Problem ist ganz einfach und wenn Sie genau das tun was ich sage haben wir das in 3 Minuten über die Bühne gebracht.
Sie: Ok, probieren wir es halt.
Ich: Starten Sie bitte den Windows Explorer.
<Pause>
Sie: Was ist das?

Manchmal muss man halt weiter vorne anfangen, ich glaube 2 mal ich auch den Unterschied zwischen linker und rechter Maustaste erklären. Doppelklick hatte ich öfters

22.07.2009 - 09:59 Uhr

Refelction: Nein
bleibt nur selbst zuweisen.

  1. direkt bei der dekleration
private string mMember = string.Empty;
  1. im Konstruktor
private string mMember;

public ClassName()
{
  mMember = string.Empty;
}
  1. in einer InitializeMethod
private string mMember;

public ClassName()
{
  InitialzeFields();
}

private InitializeFields()
{
  mMember = string.Empty;
}

das sind so ziemlich alle Möglichkeiten die mir einfallen wie man einer string member einen initialen Wert gibt.
Hinweis zu 1.
beim Kompilieren wird dafür ein statischer Konstructor angelegt.

Ich persönlich bevorzuge bei mehreren Members die 3.

08.07.2009 - 14:23 Uhr

ich war auch mal da, und bin ein bisschen weiter (Der Vergleich der Anzahl der Beiträge könnte passen [Neals-Ich-Herbivore])

hab auch mal versucht alles einzuordnen und hab dann den Zettel weggeschmissen.
Es nützt nicht viel Wörter, Begriffe und deren Verbindungen zu kennen wenn man denn Sinn/die Bedeutung in der realen Welt nicht versteht.
Ich habe mich im Wikipedia durch die halbe Welt gelesen um generel mal die Begriffe zu kennen und danach habe ich einfach weiterprogrammiert.
Irgendwann kommt man an eine Stelle: Moment da hab ich was gelesen das könnte mir jetzt helfen. Dann hat man das auch verstanden.
Die Verwendung der Patterns (oder wie die Begriffe auch immer heissen) kann man meiner Meinung nach nicht aus einem Buch lernen und dann Meister in der Verwendung sein. Das kann man nur durchs programmieren werden. (siehe Beitragsanzahl von Herbivor)

07.07.2009 - 09:18 Uhr

besten dank, eines der Probleme habe ich schon gekannt, zumindest das Hamilton heuer ein Problem mit dem Kreis hat kann eh jeder lesen 😉

06.07.2009 - 17:19 Uhr

@dr4g0n76
>>21 schwierigsten Problemen der Informatik.
da gibt es eine Liste? Der google hat leider nicht viel davon gewusst, falls Du was bei der Hand hast würde ich mich über einen Link freuen, Bitte danke

02.07.2009 - 09:33 Uhr

das der Chef zur protokollierung auffordert ist nicht ok.
Aber Hauptsächlich finde ich das Mitarbeiter 4 eine Petze ist, wenn jemand das Recht haben hätte dürfen, dann wäre es Mitarbeiter 3 aus seiner sich verteidigenden Position. "Ich habe es ja nicht anders gemacht als 1 und 2", er wäre dann zwar auch eine Petze aber es wäre verständlicher gewesen. Grundsätzlich hat er Scheisse gebaut und dann braucht er sich nicht auf die anderen rausreden. (Wenn ich in einer Kolone mit 5-6 Autos von Mürzzuschlag nach Wien mit 190 Sachen über die Autobahn brettere, kann ich mich auch nicht darauf hinausreden, dass ich den fliessenden Verkehr nicht aufhalten wollte)
Wenn er (3) es nicht gewusst hat dass man soviel Zeit im Internet verbringen darf, hat der Chef das schlecht, falsch oder garnicht kommuniziert.
Soweit dazu.
Mitarbeiter 4 ist und bleibt eine Petze und/oder Schleimer. Ohne direkt vom Chef darüber angesprochen zu werden hat man nichts zu sagen. Punkt.
Wenn er direkt gefragt wird, soweit ich gelesen habe wurde er es nicht, muss er es sagen, lügen darf er nicht und in Schutz nehmen braucht er auch niemanden. Aber von sich aus zum Chef zu laufen und dann noch über den >> eigenen Account << Informationen über die anderen herzugeben ... solche Jungs haben wir in der Schule einfach verdroschen.
Kann sein das hier meine Einstellung wieder den "Österreicher" in mir durch scheinen lässt aber ich denke dieses Mal ist es nachvollziehbarer.
Meine Meinung ist nicht unbedingt die Meinung aller Österreicher.
(Ich denke sowas sollte ich in die Signatur schreiben 😉 )

30.06.2009 - 13:16 Uhr

mein Projekt piept mich gerade an:

    private static AutoResetEvent event1;
    private static AutoResetEvent event2;
    private static Queue<string> mThreadQueue;
    private static object mThreadQueueLock;

    static void Main(string[] args)
    {
      event1 = new AutoResetEvent(false);
      event2 = new AutoResetEvent(false);

      mThreadQueue = new Queue<string>();
      mThreadQueueLock = new object();

      CompletionState state = new CompletionState();

      ThreadPool.QueueUserWorkItem(new WaitCallback(Thread1Method), state);
      ThreadPool.QueueUserWorkItem(new WaitCallback(Thread2Method), state);

      event2.WaitOne();

    }

    private static void Thread1Method(object state)
    {
      CompletionState completionState = (CompletionState)state;

      for (int outerIndex = 0; outerIndex < 10; outerIndex++)
      {
        lock (mThreadQueueLock)
        {
          for (int innerIndex = 0; innerIndex < 10; innerIndex++)
          {
            mThreadQueue.Enqueue(outerIndex.ToString() + "_" + innerIndex.ToString());
            Thread.Sleep(100); // nur um eine Zeitintesive Methode zu simulieren (.Sleep == buhh)
          }
          event1.Set(); // .Set() darf im lock passieren
          Thread.Sleep(100); // nur um eine Zeitintesive Methode zu simulieren (.Sleep == buhh)
        }
      }
      completionState.Complete = true;
    }

    private static void Thread2Method(object state)
    {
      CompletionState completionState = (CompletionState)state;

      do
      {
        event1.WaitOne(); // .WaitOne() darf unter KEINEN, ABSOLUT KEINEN UMSTÄNDEN in einem lock stehen die der andere Thread benötigt
        // ich weis das, ich bin Steirischer Deadlock Master
        lock (mThreadQueueLock)
        {
          do
          {
            Debug.WriteLine(mThreadQueue.Dequeue());
          } while (mThreadQueue.Count != 0);
        }

      } while (!completionState.Complete);

      event2.Set();

    }


    private class CompletionState
    {

      private bool mComplete;
      private object mCompleteLock;

      public CompletionState()
      {
        mComplete = false;
        mCompleteLock = new object();
      }

      public bool Complete
      {
        get { lock (mCompleteLock) { return mComplete; } }
        set { lock (mCompleteLock) { mComplete = value; } }
      }

    }
30.06.2009 - 12:48 Uhr

wenn ein Thread auf einen anderen warten muss empfiehlt sich ebenfalls die Verwendung von AutoResetEvent Objekten

2 Threads starten
1: geht zum Server und holt Daten in form von DTO's (structs)
2: beginnt zeitgleich (bei Threads: wann auch immer) und läuft in das WaitOne();
1: kommt vom Server zurück und legt die geholten Items in eine Queue und "drückt" auf Set();
1: geht zum Server und holt Daten (die nächsten 100 z.b.)
2: bekommt die CPU und merkt da hat jemand gedrückt und beginnt mit der Abarbeitung der Items die in der Queue liegen, ist fertig und läuft durch die Schleife wieder in das WaitOne();

EDIT:
es gibt auch ManualResetEvent Objekte