Laden...

Profil von JuyJuka

myCSharp.de - Experte Mitglied seit

Alle Beiträge

04.09.2007 - 13:51 Uhr

Eigentlich sollte man dich sowas von auf die Doku verweiesn => 🛈

Aber ok (Vorsicht ungetesteter Code):


      DateTime last = DateTime.Now;
      DateTime.TryParse(str, "HH:mm:ss", System.Globalization.DateTimeStyles.None, last);
      if (last == DateTime.MinValue) last = DateTime.Now;
      TimeSpan deadTime = DateTime.Now - last;
      if(deadTime >= new TimeSpan(0,15,0))
        MessageBox.Show(...);

04.09.2007 - 13:46 Uhr

Meines Wissens nach ist .NET3.5 ein neues Framework.
.NET3.0 ist eine erweiterung (bzw. ServicePack) für .NET2.0.

Hab ich da was falsch?

04.09.2007 - 13:30 Uhr

!! If-Verzweigung !! If-Bedingung !! Sonst was, aber nicht Schleife!

Du solltest beide Strings in DateTime Parsen und der Typ sollte die Differenz ermitteln können.

Gruß
Juy Juka

Frag doch mal bei den Entwicklern von www.xfire.com nach. Die helfen dir vielleicht.

PS: Willkommen auf mycsharp.de 🙂

04.09.2007 - 09:21 Uhr

Ich war/bin bis jetzt in einer Firma und dort sieht der alte Code genauso schlimm (oder schlimmer) aus, wie du den bei euch beschrieben hast.
Jemand hat versucht ein FoxPro6 (ARG) Progamm 1zu1 in .NET zu portieren!
Auf der Datenbank suchst du Constaints vergebens.
Und von OO darf man garnicht erst reden heul.
Ach ja: Ohne zu übertreiben, kann ich sagen, das KEINE Doku exisitiert.

Zum "Glück" ist diese Version der Software in der Entwicklung festgefahren und wir haben mit einer neuen Version nach allen Richtlinien der OO angefangen (Hauptsächlich ich und ersmal in meiner Freizeit).

Mit einer gewisen Menge an fertigen Funktionalitäten und lange, zähen Vorträgen über OOP und wie die Probleme, die wir mit der "alten" Version haben, dadurch gelöst wären. Haben ich und mein Vorgesetzter die Entwicklung der neuen Version durchgedrückt.

@tscherno: Ich weiß nicht, wie es bei dir in der Firma ist, aber du könntest versuche ein Refacturing der Software anzustossen. (Es hört sich zumindest schlimm genug an 🙂 )

03.09.2007 - 20:25 Uhr

Das ist aber kein guter Stiel.
So enthält die GUI/Presentations-Schicht die steuerung/logikt für Neue-Objekte, das sollte die Klasse/sollten die Objekte selber können.


public class Name
{
  ...
  private bool _isNeu = true;
  ...
  public bool IsNeu
  {
    get{return this._isNeu;}
    internal set{this._isNeu =value;
  }
}
...
  public object Load()
  {
     list[i].IsNeu = false; // also nur beim Laden _isNeu = false
  }
...

partial ist ein neues Schlüsselwort, lies es mal in der MSDN oder im OpenBool nach.

03.09.2007 - 10:11 Uhr

Original von LukeGee
Danke, hast mir weitergholfen!...

Gern geschehen. Ich rede (philosphiere) gerne über System-Architektur 😁

Gruß
Juy Juka

03.09.2007 - 09:46 Uhr

Du musst deine Eventhandler (Unit_MouseDonw, Unit_MouseUP, ...) auch beim ListView registrieren.
Im VisualStudia gehst du dazu in das Eigenschaftsfenster und auf das Event (!nicht Doppel-Klicken!) dort erscheind eine DropDown-Auswahl und du wählst deinen EventHandler aus.

gruß
Juy Juka

03.09.2007 - 07:35 Uhr
  1. Wenn Command-Pattern, dann sollten alle Commands auch ein Interface oder eine Basisklasse gemein haben.
  2. Der Name der "Basisklasse" sollte immer angehängt werden (LoadNamesCommand und SaveNamesCommand).
  3. DieForm-Klasse befindet sich nicht im Namespace TestApplication.GUI. Absicht? Wenn ja: Warum?
  4. Keine Abkürzugen! (NameListDA)
  5. Wenn schon Command-Pattern, dann könnte man auch für alle Buttons einen Eventhandler schreiben, der jeweils nur den Command ausführt (Command cmd = sender.Tag as Command;).
  6. Wenn schon Command-Pattern, dann auch für alle Buttons (Neu hat keinen Command!).
  7. Doku [edit]Ich mag den Zuge-Smily hier nicht, der guckt so Böse.[/edit] (XML und Inline).

Ansonsten:
Schönes 3-Schichten-Model und großes Lob, dass du versucht hast, das Command-Pattern zu verwenden.

Gruß
Juy Juka

Hallo.

Wie folgt würde ich vorghen:

Ich würde jedem TreeViewItem (im Tag-Propety) den absoluten Pfad des entsprechenden Verzeichnisses hinzufügen.

Ich würde auf das AfterSelect-Event des TreeViews reagieren und dort dann
A) überprüfen, ob das SelectedItem des TreeViews bereits SubItems hat und
B) System.IO.Directory.GetDirectorys auf den String aus dem Tag des Selected Items anwenden.
Für die Ergebnisse würde ich SubItems im SelectedItem anlegen und (zur Sicherheit) nochmal Expand auf das SelectedItem anwenden.

Gruß
Juy Juka

Klar erklär ich meinen Code:


using System;  // Ich mache den Namensraum System in meiner Date bekannt und kann nun auf die angabe vor System verzichten, wenn ich einen Typ dieses Namensraumes verwende.
using System.Collections.Generic; // Ich mache den Namensraum System.Collections.Generic bekann (Siehe using System).
using System.ComponentModel; // Ich mache den Namensraum System.ComponentModel bekann (Siehe using System).
using System.Drawing;  // Ich mache den Namensraum System.Drawing bekann (Siehe using System).
using System.Data; // Ich mache den Namensraum System.Data bekann (Siehe using System).
using System.Text; // Ich mache den Namensraum System.Text bekann (Siehe using System).
using System.Windows.Forms; // Ich mache den Namensraum System.Windows.Forms bekann (Siehe using System).
// :P //

namespace Dummy // Ich deklariere einen Namensraum Dummy, um die Folgenden Typen dem Namensraum hinzuzufügen
{
  public class NurEinButtonCheckedToolStrip : ToolStrip // Ich leite eine eigene Klasse vom Typ System.Windows.Forms.ToolStrip ab, die Dummy.NurEinButtonCheckedToolStrip heist.
/* PS: partial war hier falsch, der gesamte Code ist in einer Datei */
  {
    protected override void OnItemClicked(ToolStripItemClickedEventArgs e) // Ich überschreibe die OnItemClicked-Methode der System.Windows.Forms.ToolStrip Klasse, die immer aufgerufen wird, wenn ein Element in diesem ToolStrip angeklickt wird.
    {
      if (e.ClickedItem is ToolStripButton) // Wenn das angeklickte Element vom Typ System.Windows.Forms.ToolStripButton ist, wird mein Code ausgeführt
      {
        foreach (ToolStripItem item in this.Items) // Für jedes Item/Element in der Auflistung aller Items/Elemente des ToolStrips wird folgender Code ausgeführt.
        {
          ToolStripButton b = item as ToolStripButton; // Ich versuche das Item (vom Typ System.Windows.Forms.ToolStripItem in einen System.Windows.Forms.ToolStripButton umzuwandeln. Schlägt die Umwandlung fehl, wird der Referenz "b" "null" zugewiesen.
          if (b != null && b != e.ClickedItem) // Ich prüfe, ob b gefüllt wurde, und wenn b gefüllt wurde und es nicht das angeklickte Item/Element ist
            b.Checked = false; // setze ich die Checked eigenschaft auf false.
        }
      }
      base.OnItemClicked(e); //Jetzt rufe ich die nurmale OnItemClicked-Methode der Basisklasse System.Windows.Forms.ToolStrip auf.
    }
  }
} 

Im Endefekt setze ich einfach alle Buttons im ToolStrip (foreach) auf Checked=false, die nicht angeklickt wurden.

Gruß
Juy Juka

Hallo und Willkommen auf mycsharp.de.

"Eigene Bilder" sind bei Vista auf der gleichen Ebene wie "Eigene Dokumente" (C:\Users\MyName).

Um den Zugriff zu erhalten, solltest du das Programm mit echten Administrator Rechten starten.

Gruß
Juy Juka

Hallo.

Verwende folgendes Control von mir, es macht genau was du willst:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;

namespace Dummy
{
  public partial class NurEinButtonCheckedToolStrip : ToolStrip
  {
    protected override void OnItemClicked(ToolStripItemClickedEventArgs e)
    {
      if (e.ClickedItem is ToolStripButton)
      {
        foreach (ToolStripItem item in this.Items)
        {
          ToolStripButton b = item as ToolStripButton;
          if (b != null && b != e.ClickedItem)
            b.Checked = false;
        }
      }
      base.OnItemClicked(e);
    }
  }
}

Hallo zusammen.

Jetzt könnte man langatmig herbivore rechtgeben und vom objektorientierten Paradigma, dem Sinn der Vererbung und Beispielen wie "Jeder Dackel ist ein Hund. Ein Hund muss jedoch kein Dackel sein." erzählen.
Ich lass es sein, sage kurz und klar "herbivore hat recht" und will eine andere Lösung zeigen.

Wenn du die eigentlich verwendete Klasse vor dem Benutzer deines Assemblies/Packets/... verbergen willst, sollte man einen Wraper schreiben:


public class Wraper
{
  private Base verwendetesObjekt = new Base();

  // Die Wraper-Klasse muss natürlich alle benötigten Properties und Methoden zur Verfügung stellen
  public object Property
  {
    get{return this.verwendetesObjekt.Property;}
    set{this.verwendetesObjekt.Propery =value;}
  }

  public object Methode(objekt parameter)
  {
    return this.verwendetesObjekt.Methode(parameter);
  }

  public static implicit operator Wraper(Base tmpObj) 
  {
    Wraper w = new Wraper();
    w.verwendetesObjekt = tmpObj;
    return w;
  }
}

Und im Wraper können expliziete und impliziete Casts deklariert werden.
Das ganze müsste ein Adapter-Musster/Patern sein, da lass ich mich aber gern eines besseren belehren.

Gruß
Juy Juka

31.08.2007 - 16:38 Uhr

Ich benutze diese Klasse:


using System;
using System.Collections.Generic;
using System.Text;

namespace Aisys.PlaySound
{
  public class WSounds
  {
    [System.Runtime.InteropServices.DllImport("WinMM.dll")]
    public static extern bool PlaySound(string fname, int Mod, int flag);     // these are the SoundFlags we are using here, check mmsystem.h for more    
    public int SND_ASYNC = 0x0001;     // play asynchronously    
    public int SND_FILENAME = 0x00020000; // use file name    
    public int SND_PURGE = 0x0040;     // purge non-static events     
    public void Play(string fname, int SoundFlags)
    {
      PlaySound(fname, 0, SoundFlags);
    }
    public void StopPlay()
    {
      PlaySound(null, 0, SND_PURGE);
    }
  }
}

Und diesen Aufruf:


new WSounds().Play(datei,0x00020000 | 0x0001);

31.08.2007 - 12:47 Uhr

public class EventFeuerer
{
  public event EventHandler MeinEvent;

  ...
  if(this.MeinEvent!=null)
    this.MeinEvent(this,new EventArgs());
  ...
}

31.08.2007 - 12:17 Uhr

Folgendes funktioniert bei mir:


mciSendString(mciString, null, 0, 0x00020000 | 0x0001);

Das kann das VS (und macht es normalerweise auch).
Dazu musst du eine Sollution *.sln haben (Root im Projekt-Mappen-Explorer) und dort die anderen Projekte *.csproj hizufügen.

Wenn du jetzt auf die Projektmape gehst und dort "Erstellen" sagst, werden alle Projekte kompiliert.

28.08.2007 - 19:51 Uhr

😁 Ich hab mir meinen eigenen ORM geschrieben 😁

  1. Weil ich NHibernate zu späte gefunden hatte.
  2. Weil mich bei NHibernate diese Konfigurations-Dateien gestört haben.
  3. Weil .NET bessere möglichkeiten bietet, die Mappinginformationen abzulegen, als XML

Deine Anforderungen würder er meistern, leider ist die Dokumentation noch nich soweit, dass man ihn weiter geben könnte.

28.08.2007 - 19:38 Uhr

Hier zu würde mir das Schablonen Muster oder Template Pattern einfallen:


public abstract class DatenSatz
{
  private System.Collections.Generic.List<IDatenFeld> felder = new System.Collections.Generic.List<IDatenFeld>();
  // ...
}

public interface IDatenFeld
{
  long FeldLänge { get;}
  byte[] SchreibeDaten(object daten);
  object LeseDaten(Byte[] daten);
}

public interface IDatenPolicity
{
  void PruefePolicity(IDatenFeld datenFeld);
}

public class DefaultDatenFeld : IDatenFeld
{
  public virtual long FeldLänge
  {
    get { return 1; }
  }

  public byte[] SchreibeDaten(object daten)
  {
    return new byte[] { System.Convert.ToByte((char)daten) };
  }

  public object LeseDaten(byte[] daten)
  {
    return System.Convert.ToChar(daten[0]);
  }
}

public class DefaultPolicity : IDatenPolicity
{
  public void PruefePolicity(IDatenFeld datenFeld)
  {
    // Ohne Prüfung einfach akzeptieren :P
  }
}

Wenn dann eine Erweiterung kommt, musst du "nur" eine neue Implementation von IDatenFeld machen, Bsp.:


public class Int32DatenFeld : IDatenFeld
{
  public long FeldLänge
  {
    get { return 1; }
  }

  public byte[] SchreibeDaten(object daten)
  {
    return System.Convert.ToByte((int)daten);
  }

  public object LeseDaten(Byte[] daten)
  {
    return System.Convert.ToInt32(daten[0]);
  }
}

Tag.

Wenn es möglich ist, sollte man die Logik-Schicht so gestallten, das man verschiedene UIs aufsetzen kann.

Gruß
Juy Juka

Vermutlich werden die "spezial" Benutzerkonten, wie System, NT-Dienst, usw. , im SQLServer nicht als Benutzer angelegt.
Ich bin nicht so der Experte, würde dir aber eine Gemische Anmeldung dafür empfehlen. Oder du lässt den Dienst unter einem "echten" Benutzerkonto laufen.

Gruß
Juy Juka

Deine ID-Variable ist für die gesammte Klasse eindeutig. Du musst für jede Instanz eine eigene Kopie da von machen.


public class Klasse
{
  private static int ID = 0; 
  private int id; // Kein Static!

  public Klasse()
  {
    this.id = ID++;
  }
}

Du solltest dir Static noch mal im OpenBook nachlesen.

Gruß
Juy Juka

27.08.2007 - 10:38 Uhr

Ich hab jetzt Fast 3.000h C# hinter mir und kann immer noch kein System.Reflection.Emit. 🙁

Ich kann dir leider nicht mehr weiter helfen.

Mhm. Bei mir hats immer Funktioniert. ...
Probier mal folgendes in der Basisklasse:


public Button[] Buttons
{
  get{return new Button[]{this.Button1, this.Button2, ...};}
}

Damit könntest du über den "..." Button vom Buttons-Propertie zugreifen.

27.08.2007 - 10:28 Uhr

@blauerblubb: Hey! Wir beide sind ja garnicht so weit von einander weg. 🙂

27.08.2007 - 10:26 Uhr

Du musst
A) eine allgemeingültige Klasse benutzen (Oberklasse 😉 ) oder
B) Mit System.Refelction.Emit Klassen dynamisch zur Laufzeit erstellen.

Zugriffsmodifier für die Buttons in der Basisklasse auf protected setzen.

27.08.2007 - 07:57 Uhr

Ein Dienst läuft (oft) in einem anderen Benutzerkonto. Wenn du dort z.B. PowerPoint startest, wird es natürlich nicht beim Angemeldenten Benutzer (dir), sondern im Benutzerkonto des Dienstes gestartet.

Lass dir zur Überprüfung einfach mal im Taskmanager die Prozesse aller Benutzer anzeigen.

Gruß
Juy Juka

27.08.2007 - 06:19 Uhr

*rofl*
@LonlyPixel: Das gehört in den Witze Thread.

25.08.2007 - 17:13 Uhr

Musst du nicht:


List<Guy> guys = new List<Guy>();
guys.AddRange(Actor.GetActors().ToArray());

25.08.2007 - 13:41 Uhr

Ist doch nicht so schwer:


object value = dataSet.Tables["tabellenname"].Rows[i]["spaltenname"];

25.08.2007 - 03:52 Uhr

*wie der Ochse vorm Berg guck* Der Witz ging an mir vorbei.

Mein erster Tipp: Such dir was einfacheres als XNA zum erlernen von C# raus!
Mein zwieter Tipp: Lies das openbook: C# .
Mein dritter Tipp: Das einfachste in C# ist eine Konsolenanwendung. Mach doch erst mal sowas.

Ich lass dich aber auch nicht mit deinem Problem alleine:

using System;

namespace X
{
  class Programm
  {
    public static void Main()
    {
      Ball[] bälle = new Ball[10];
      Random r = new Random();
      for (int i = 0; i < bälle.Length; i++)
      {
        bälle[i] = new Ball(r.Next(500), r.Next(500));
      }
      foreach (Ball ball in bälle)
      {
        ball.Thread.Join(); // der Main Thread wartet auf alle Ball-Threads, bis diese beendet werden.
      }
    }
  }

  class Ball
  {
    private string name;
    private int xPosition, yPosition;
    private bool horizontal = false;
    private bool vertikal = false;
    private System.Threading.Thread thread;

    public Ball(string name, int xpos, int ypos)
    {
      this.name = name;
      this.xPosition = xpos;
      this.yPosition = ypos;
      this.thread = new System.Threading.Thread(new ThreadStart(this.changepos));
      this.thread.Start();
    }

    public System.Threading.Thread Thread
    {
      get { return this.thread; }
    }

    private void ChangePosition()
    {
      while (true)
      {
        if (xPosition > 499)
        {
          horizontal = true;
        }
        if (xPosition < 1)
        {
          horizontal = false;
        }
        if (yPosition > 500)
        {
          vertikal = true;
        }
        if (yPosition < 1)
        {
          vertikal = false;
        }
        if (!horizontal)
        {
          xPosition++;
        }
        else
        {
          xPosition--;
        }
        if (!vertikal)
        {
          yPosition++;
        }
        else
        {
          yPosition--;
        }
        System.Console.Out.WriteLine(this.name + "{" + this.xPosition + ":" + this.yPosition + "}");
        System.Threading.Thread.Sleep(400);
      }
    }
  }
}

25.08.2007 - 03:20 Uhr

Ich rat nur mal:
Vergleichen Assert.AssertEquals und Assert.AssertSame die Referenzen und nicht die enthaltenen Objekte (d.h. ob die beiden Variablen auf exact das gleiche Objekt im Arbeitsspeicher verweisen)?
Probier einfach mal:


Assertion.AssertSame(Obj1,Obj1); 
Assertion.AssertSame(Obj2,Obj2); 
// und
Assertion.AssertEquals(Obj1,Obj1); 
Assertion.AssertEquals(Obj2,Obj2); 

Gibt es keine Dokumentation zu der Methode?

@talla: Danke für die Anmerkungen.
Dass der nächste Zustand außerhalb der Klasse bestimmt wird, ist absicht. Die Klasse soll in unserem/meinem Fall keine Ahnung vom Statusverlauf haben, da dieser Variieren kann.

Das meine Implementierung so "quer" ist, liegt wohl daran, dass ich weder die einzelnen Statusklassen noch die einzelnen Aktionen der Statusklassen im Vorraus kenne. 🙁 Viel leicht hab ich diese Anforderung nicht so gut/verständlich umgesetzt, aber ich hab leider keine andere Lösung gesehen.

@talla ?? Wo hab ich Englisch ??

24.08.2007 - 12:16 Uhr

@Atomroflman: Was ist den das? "Array of null"??

Dieser Thread ist übrigens nicht exclusiv für herbivore und micht. Ich würde mich auch über Antworten von jedem anderen freuen.

Grüße
Juy Juka

24.08.2007 - 08:38 Uhr

@ninos: Ist doch kein Thema eine Ausnahme zu sein. Ich steh mit meinem Musikgeschmack ja auch allein auf weiter Fluhr.

24.08.2007 - 08:10 Uhr

Versuch doch mal den Error-Stream umzuleiten und den ebenfalls auszulesen. Wenn die CMD gleich wieder verschwindet, liegt das meistens daran, das sich der Befehl mit einem Fehler verabschiedet hat.

Gruß
Juy Juka

Tach herbivore,

Die kontrolle über den Zustand liegt mit absicht in der State-Klasse, da nur der eine Status wissen soll, welcher als nächstes kommt. Von außen soll er eigentich nicht gesetzt werden. (Da muss ich noch ne lücke stopfen.)

"nested clases" fallen für mich flach, oder kann man die Klassen aus einem später erzeugten Assemblie als Nested für eine Klasse aus einem anderen Assemblie deklarieren? (Glaub ich ja nicht.)

Ich glaube, das ganze ist so komplex geworden, weil ich die "Methoden"/"Aktionen" der Status-Klassen nicht im vorhinein kenne.

Gut: Hier ist das überarbeitet Klassendiagramm. Den Code hab ich noch nicht geändert. Hier fällt der public Konstruktor von Lieferung flach und ich hab die Sicherheitsebenen mal Farbig markiert Äußerste, Mittlere und Innere.

Gruß
Juy Juka

Du hast recht, in der Status-Klasse müssen mehr Member protected sein. Danke.

new lies sich nicht vermeiden. Ich muss ja im Child-Interface IÄnderbareLieferung angeben, dass die Properties jetzt zusätzlich einen Setter haben müssen.

Die drei Interfaces in die "richtige" Reihenfolge zu bringen, werd ich versuchen.

Was genau am Code war unverständlich? Das möchte ich natürlich ändern.

Nochmal vielen vielen Dank.
Gruß
Juy Juka

So, mit viel Müh und Not, das Diagramm.

Verwendet soll das ganze ungefähr so werden:


Lieferung lieferung;
IConfigurierteÄnderbareLieferung änderbareKopie = lieferung.GetÄnderbareKopie();
List<IAktion> aktionen = lieferung.Status.Aktionen;
// Irgend wie, wählt der User die Aktion aus, die er tun will.
IAktion ausgewählteAktion = aktionen[userAuswahl];
// Dann werden irgend wie die User eingaben an die änderbare Kopie gegeben.
änderbareKopie.Value = userInput; // Value ist nur ein Dummy für alle möglichen Properties.
// Und die Aktion wird auf meine Lieferung ausgeführt
lieferung.FühreAktionAus(ausgewählteAktion, änderbareKopie);

Ich hoffe einfach nur, dass keine Lücken in meinem Design sind. Keine Klasse, die Aktionen ausführt, darf die Lieferung direkt ändern. Aber der Status/die Aktion muss beim ausführen der Aktion alles ändern könne.

Nochmal vielen Dank an alle, die sich mein Geschwätzs antun. verbeug

Gruß
Juy Juka

Hi herbivore,

Ja, ich hab das ganze auch mal mit WF probiert. Vermutlich war ich zu blöd für WF. Aber auch einige Sachen aus dem WF haben einfach nicht unseren Anforderungen genügt (Persistenz, Dynamische Erweiterbarkeit, Customazing-Fähigkeit (oder wie man das schreibt)).

Ich werd auch mal ein Klassendiagramm posten, weil ich ja eure Meinung zum Design wissen will. Wobei ich dencke, dass der Code aussagekräftiger ist.

Gruß
Juy Juka

Hi,

Das mit den Verschiedenen "Methoden" ist ziemlich sicher. Mit folgenden Status und (in Klammernt) "Methoden" muss ich jetzt schon rechnen:
-- Einlagerung --
Avisiert (Anliefern, Teilweise Anliefern, Stornieren)
Angeliefert (In Quarantäne setzen, Lagerplätze suchen, Manuell einlagern, Stornieren)
In Quarantäne (Freigeben, Zurücksenden)
Wird Eingelagert (Einlagern, Stornieren)
Erledigt ()
Storniert ()
-- Auslagerung --
Erfasst (Disponieren, Stornieren)
Disponiert (Rückgängig, Ware transportieren, Stornieren)
Ware auf Packplatz (Verpacken, Stornieren)
Ware in Versandzone([Auspacken,] Versenden, Stornieren)
Versendet ()
Storniert()
-- Umlagern --
...


Pro Kunde können noch mehr von diesen Statusverläufen auftauchen, die schon bekannten könne Variiren und/oder die Status könne sich zu neuen Verläufen zusammen fügen.

Aber erst mal Danke für den Tipp. Ich hoffe, jemand findet die Zeit und die Musse, meinen Code durch zu lesen (zu Überfliegen).

Gruß
Juy Juka

23.08.2007 - 20:30 Uhr

Vorsicht! Vorsicht!
Sonst kommt der Rechter-des-void Maske raus kram.
😁

Danke herbivore,

Für Problem 2 hast du genau meine Lösung beschrieben 🙂 , dann kann Sie ja garnicht so falsch sein.

Das andere Problem (1) ist, dass ich im Moment noch nicht einmal weiß, welche Klassen von "Status" erben werden. Wir werden für jedes Kundenprojekt eigene "Status"-Klassen machen, die dann die von unsere Standadlösung abweichenden "Methoden" implementieren.
Mal ein Beispiel, das wir in der Vergangenheit schon hatten: Standard ist, dass die Ware verkauft und versendet wird. Wenn jedoch der Verkäufer und der Käufer Ware im gleichen Lager lagern lassen, dann muss nur der Besitzer gewechselt werden.

Diese dynamik wirft dann auch Problem 3 auf: Ich weiß nicht, welche Methoden existieren und welche Felder vom User geändert werden müssen. Wie kann das auf EINER (ich meine die Zahl) GUI dargestellt werden?!

Aber das letzte Problem hat Zeit, wichtiger ist mir, ob meine Implementierung "sauber" und "objektorientiert" ist. Und Vorallem, ob die Zugriffe genügend Gesichert sind, aber gleichzeitig alle Status-Objekte zugreifen können.

Auf jende Fall dancke, für die erste Antwort. Und Dancke an alle, die sich Zeit für diesen Thread nehmen.

Gruß
Juy Juka