Laden...
Avatar #avatar-2570.gif
yetibrain myCSharp.de - Member
Software Entwickler Dabei seit 07.09.2007 52 Beiträge
Benutzerbeschreibung

Forenbeiträge von yetibrain Ingesamt 52 Beiträge

02.12.2016 - 17:37 Uhr

Ich habe das Problem dass ich keine Sessions von einem Windows10 Rechner bekomme, RD Verbindung geht. Bei Windows7 Rechnern bekomme ich Sessions. Gibt es denn niemand hier der sich mit Cassia auskennt?

20.11.2014 - 14:41 Uhr

Geiles Teil,

schmiert auch bei codepoints außerhalb der Basic Multilingual Plane (BMP) nicht ab, habe heute erst Expresso damit zum Absturz gebracht, während Regex-Lab einen astreinen capture hatte.

Meine regex: [\u0009\u000a\u000d\u0020-\ud7ff\ue000-\ufffd]|(\ud800-\udbff)|((?≤[\ud800-\udbff])[\udc00-\udfff])

Mein Input: (codepoint 128685)

10.01.2012 - 00:40 Uhr

Verstehe ich auch nicht wie man da auf ein State-Pattern kommt. Unklar ist auch wie die "Reaktion" aussehen soll und wie schnell diese ausgeführt werden kann. Letzteres entscheidet darüber wie schnell ein Flankenwechsel sein kann um diesen noch zu erkennen. Eine zyklusbasierte SPS liest üblicherweise die Eingänge in ein Prozeßabbild ein und ruft dann das Benutzerprogramm auf, danach wird das Prozeßabbild der Ausgänge an die Peripherie übertragen. Na ja, wahrscheinlich hat der OP sein Problem zwischenzeitlich gelöst.

20.11.2009 - 14:49 Uhr

Hallo Forum,

ich benutze Find.Execute an einem Word Dokument. Das Finden klappt, aber mir reicht es nicht aus lediglich zu wissen, ob sich der gesuchte Text im Dokument befindet oder nicht. Was ich brauche ist die "Fundstelle", also Kapitel bzw. Seitennummer der Fundstelle. Lässt sich das ermitteln?

Danke für Tipps.

Gruß,

yb

20.11.2009 - 14:44 Uhr

hi SvenC,

hast Du denn die Microsoft.Office.Interop.Word.dll referenziert?

Also ich benutze anstatt Selection ein Range Objekt, da ich die Applikation nicht auf visible setzen brauche. Vielleicht mal damit versuchen. Bei mir klappt es astrein, ich benutze folgenden code:


            object readOnly = true;
            object fileName = @"D:\Worddocument.doc";
            object missing = Missing.Value;          
            int intFound = 0;
            
            ApplicationClass app = new ApplicationClass();
            app.Visible = false;
            
            Document worddoc = app.Documents.Open(ref fileName,
                ref missing, ref readOnly, ref missing, ref missing, ref missing,
                ref missing, ref missing, ref missing, ref missing, ref missing,
                ref missing, ref missing, ref missing, ref missing, ref missing);


            Range rng = worddoc.Content;
            rng.Find.ClearFormatting();
            rng.Find.Forward = true;
            rng.Find.Text = "Snoopy";

           rng.Find.Execute(
                ref missing, ref missing, ref missing, ref missing, ref missing,
                ref missing, ref missing, ref missing, ref missing, ref missing,
                ref missing, ref missing, ref missing, ref missing, ref missing);

            while (rng.Find.Found)
            {
                intFound++;
                
                rng.Find.Execute(
                    ref missing, ref missing, ref missing, ref missing, ref missing,
                    ref missing, ref missing, ref missing, ref missing, ref missing,
                    ref missing, ref missing, ref missing, ref missing, ref missing);
            }

            

            Console.WriteLine("Text '{0}' wurde {1} mal gefunden", rng.Find.Text,   intFound);
            Console.Read();


Was ich nun allerdings brauche ist die Information, in welchem Chapter oder auf welcher Seite sich nun der gefundene Text befindet. Kann man das ermitteln?

Gruß,

yb

06.10.2009 - 01:49 Uhr

Ja, mit dem OwnerDraw mode kannst Du die Zeilen selber "malen" bzw. etwa Vordergrund- oder Hintergrundfarbe setzen.

06.10.2009 - 01:26 Uhr
06.10.2009 - 01:22 Uhr

Schau mal hier: http://www.codeproject.com/KB/list/VirtualModeTreeListView.aspx

Läuft sogar im virtual mode.

06.10.2009 - 01:15 Uhr

Du füllst den ganzen Baum auf einmal. Das dauert doch sicher, oder ?

Bei meinen Treeviews fülle ich nur die oberste Ebene, und die weiteren Ebenen erst wenn sie geöffnet werden.

Das füllen der obersten Ebene dauert doch sicher, oder? Bei meinem TreeListView fülle ich überhaupt nicht, sondern benutze den "virtual mode".

Gruß, yb

15.06.2009 - 13:10 Uhr

jaein! Das Beispiel ist recht simpel und verständlich nur möchte ich es bei mir doch nicht einsetzen, weil es dann dadurch komplizierter wird (vorallem wenn jemand anders schnell an meinem Quellcode was ändern muss oder so).

Schnell mal was ändern? Na gut dass Du keinen Airbus programmieren musst. Das State-Pattern erfüllt eigentlich das OCP besser als etwa wenn du flags o. ä. verwendest.

Das schwierigste würde dort sein die ganzen Events zu implementieren da ich auf die 64 Eingänge reagieren muss.

Die ganzen Events? Also das State-pattern beinhaltet eigentlich gar kein Observer-Muster. Da geht es eben um states. Eine Änderung an einem Deiner Eingänge könnte natürlich eine Transition zu einem anderen State herbeiführen, klar. Du musst jetzt nun aber nicht wirklich alle Eingänge derart überwachen dass da jede Änderung einen anderen State ergibt, oder? Ich meine Eingänge gibt es ja auch etwa für Stellglieder als Rückmeldung, das würde dann den Status des Aktuators ändern, nicht aber unbedingt eine andere "Phase" einleiten, wenn ich jetzt mal wieder zwischendurch einen Begriff aus der Schrittkettentechnik verwenden darf.

Mit Deinem Board könntest Du doch tatsächlich Deine Eingänge derart an Objekte hängen, dass man Änderungen derselben abonnieren kann. So könntest Du eine ereignisgesteuerte SPS aufbauen mit Deinem board. Stellglieder etwa abonnieren die Eingänge welche die Rückmeldungen sind, so könntest Du sogar kapseln wer sich überhaupt für einen bestimmten Eingang zu interessieren hat und wer nicht.

Du hast doch bestimmt auch Stellglieder, oder?

Gruß,

15.06.2009 - 10:43 Uhr

danke für Deine Mühe ich werde es mir gleich auf der Arbeit anschauen.

Und, konntest Du damit was anfangen?

09.06.2009 - 01:58 Uhr

Hallo yetibrain,

ich habe noch nie was mit state-patterns gemacht, wäre gut wenn ich zur Anschaulichung ein Beispiel hätte welches ich dann zu meinem Problem portieren kann.

hi steffen_dec, ich auch nicht, hab' auch kein so ein tolles hardware-board wie Du. Aber ich habe anhand des state-patterns mal was einfaches mit c# gestrickt.

Ich muss verschiedene Stationen einer Produktionsanlage steuern. Es werden die Teile/Prüflinge auf einem Band transportiert, von einer Station vereinzelt und über eine Kamerastation durchgereicht und dann die schlechten aussortiert.
Dann müssten noch diverse Überprüfungen wie Produktstau stattfinden.

Also auch optische Inspektion, ist das auch auf Deinem board? Na ja, warum nicht.

Danke!
Steffen

Bitte, gern geschehen.

03.06.2009 - 21:00 Uhr

steffen_dec, ich weiß nicht was genau Du steuern musst, aber ein state-pattern zu verwenden ist wahrscheinlich moderner als die Lösung mit der Schrittkette. Schrittketten sind mehr oder weniger GOTO-Maschinen, denn die Transitionen gehen nicht immer linear von einem Schritt zum nächsten, oftmals springen die auch "Warteschritte" an, wie gesagt sind das GOTO-Maschinen. Beim state-pattern tauscht die Transition eine konkrete Klasse aus, die dem neuen Zustand entspricht, während die Aktion bzw. Methoden jeweils der Schnittstelle entspricht und von der Maschine an die jeweils aktuelle konkrete Klasse delegiert wird. Eventuell hätte ich da ein Beispiel für Dich, müsste aber erst mal nachschauen. Was musst Du denn ansteuern? Airbus? Waschmaschine?

03.06.2009 - 20:42 Uhr

@yetibrain:
Vergiss am besten alles was du hier gelesen hast (bis auf alles was noch ontopic war)...

nö, wieso vergessen? ich fand es sehr interessant und aufschlussreich.

Falls es dich dennoch brennend interessiert wirst du mit hoher wahrscheinlichkkeit und bei gründlicher recherche auch alles im Netz finden. Verlinkt wurde hier ja auch schon einiges...

ja ja, alles im Netz finden. Dieses Forum ist auch im Netz, oder? Klar kann ich irgendwelchen Links folgen, aber das ist dann kein Erfahrungsaustausch bzw. Meinungsaustausch mehr, ich bevorzuge die direkte Diskussion d. h. auch Fragen stellen und Antworten geben, nicht nur ablesen.

03.06.2009 - 20:38 Uhr

... und - gescheitert (dafür gehören sie immer noch geschlagen!) aber nicht zu vergessen - WinFS.

Grüße
Flo

Ist das dieses FS welches tatsächlich aus dem Dateisystem eine DB machen wollte? Also so daß eine Datei auch nicht unbedingt in nur einem Verzeichnis liegen muss sondern in mehreren? Bzw. das ganze Filesystem überhaupt nicht als Baumstruktur organisiert ist sondern halt einfach eine Datei klassifiziert wird und quasi gar keinen logischen "Ort" hat? Mich hat schon oft gewundert dass etwa unter Windows die Dateien indiziert werden können um die Suche zu beschleunigen, wieso man das aber nicht gleich beim speichern einer Datei macht verstehe ich nicht, wäre IMHO besser als hinterher. Warum bzw. woran ist denn dieses WinFS gescheitert? Also das ablegen von Dateien in einer Baumstruktur ist doch wohl nicht das non plus ultra finde ich. Schade.

03.06.2009 - 20:29 Uhr

Danke an alle für die rege Beteiligung.

Florian meinte, dass Daten und Dateien eigentlich daselbe seien. Also in so einer Datei stecken ja schon Daten drin, oder? Es sei denn, diese ist leer. Dann hat sie eventuell immer noch einen Namen, die Datei. Aber auch in einem Sektor auf einer Festplatte oder auch etwa USB Stick stecken doch Daten, oder? Und dennoch keine Datenbank? Was bedeutet denn in diesem Zusammenhang überhaupt das Wort "Bank"? Und warum laufen so wie La Tino schon andeutete, viele DBs in einer RAW-Partion?

03.06.2009 - 19:59 Uhr

Danke für Deinen ergänzenden Beitrag svenson. Ja, immer schön die asynchronen Methoden benutzen, diese funktionieren ja auch wunderbar. 8)

03.06.2009 - 00:00 Uhr

hi ikaros,

in der Automatisierung ist es aber heute noch üblich, Schrittketten zu programmieren. Auch sind die SPSen meist Zyklus-basierend. Welche SPSen arbeiten denn eventbasierend und kommen mit Engineering-Software, die es erlaubt State-Machines zu projektieren? Was hab' ich verpasst?

02.06.2009 - 23:43 Uhr

Eigentlich ist dann jede Festplatte schon eine Datenbank, oder!?

02.06.2009 - 23:23 Uhr

Kleine Anmerkung: Es gibt blockierende Funktionen, grade auch bei den Socket Funktionen. Etwa Connect oder auch Accept. Diese müssen blockieren, so lange eben kein Server "hört" oder sich kein Client "verbindet". Deine Idee mit dem auslagern in einen separaten thread kapseln bereits die asynchronen Socket-Funktionen und lösen die Nicht-Blockierung elegant über bereitzustellende Callback-Methoden. In Wirklichkeit erzeugen die asynchronen Methoden einen thread, in welchem die blockierende Socket-Funktion eben aufgerufen wird, ja diese blockiert immer noch! Doch für den Aufrufer eben nicht, dieser wird nicht blockiert nach dem Aufruf der asynchronen Methode und wird über die bereitgestellte Callback-Methode informiert. Es ist deswegen eigentlich falsch zu sagen dass die GUI blockiert, es wird halt immer der Aufrufer einer blockierenden Methode/Funktion blockiert, was in der Natur der Sache liegt.

02.06.2009 - 22:43 Uhr

Ja, state-machines werden früher oder später die Schrittketten ablösen. passen auch sehr gut zu eventbasierenden SPS-en. Was genau hast du vor? ?(

17.03.2009 - 17:35 Uhr

Klar, wenn man etwa alle TextBoxen mit txb* o. ä. beginnt, kann uns IntelliSense alle txb* - Namen auflisten und zur Auswahl anbieten. Wenn man *TextBox etc. am Ende des Namens schreibt, tja dann... wie war das noch? No chance!

Doch das hat mich auf eine Idee gebracht, warum eigentlich nicht auch IntelliSense benutzen um Namen vorzublenden die mit einem bestimmten String aufhören? Könnte es sein dass man Intelli* noch Intelligenter machen könnte? Ich denke ja. Wieso nicht etwa mit wildcards arbeiten, etwa nach dem Stil *TextBox ? Oder auch etwa Text ? Wäre doch eine sinnvolle Erweiterung oder nicht?

Gruß,
yb

02.02.2009 - 15:35 Uhr

Der Artikel ist sagenhaft und sehr brauchbar wenn es um Bitmanipulationen geht, 1000 Dank dafür! best story in town! 8)

22.03.2008 - 19:01 Uhr

Bevor ich jetzt nur noch Sterne sehe musst Du mal bitte erklären was Du genau meinst.

Beispiel: Ich habe ein generisches Datenmodell (D.h. viele Klassen mit properties). Das Datenmodell soll Format unabhängig sein aber wesentliche Informationen beinhalten. Sagen wir ich soll ein Auto beschreiben, dann habe ich Klasse Auto als einstig (eine Art von Facade). Das Auto beinhaltet Klassen wie Axe, Rad, Motor, Karroserie usw. und das alles verschachtelt. D.h. Axen beinhalten Räder, Räder beinhalten Sensoren, Karroserie beinhaltet Türe, Türe beinhaltet Scheiben usw.... Alles schön abstrakt und Format unabhängig.

Also kriegst du so ne Art Baukastenstruktur bzw. Teilestruktur, jeweils eine Baugruppe mit Artikelnummer und dann die einfliessenden Komponenten mit Artikelnummer und einfliessender Menge? Oder halt so ähnlich?

Jetzt bekomme ich die Beschreibung von einem Auto in Form XML datei dann schreibe ich einen XMLConverter (siehe Code unten), sollte ich auch das Auto im KWP2000 Format beschreiben schreibe ich wieder einen KWP2000Konverter...
So kann ich das Datamodell von XML datei füllen und aus dem Datenmodell in KWP2000 Format wieder rausschreiben und umgekehrt. Mit so einem Model kann ich daten von einem format ins anderes format exportieren.

Also mit dem keyword protocol kenne ich mich nun überhaupt nicht aus. Verstehe auch nicht wie du deine Klassen erzeugen willst wenn du das XML file lädst. Wenn du eine DOM hast dann hast du ja eigentlich schon dein komplettes Auto als Node-Tree im Speicher sitzen, oder sehe ich das falsch?

  
public class XMLConverter : IConverter  
{  
    public AutoDataModell Import()  
    {  
         .............  
    }  
  
    public void Export(AutoDataModell auto)  
    {  
        ....................  
    }  
}  
  

Ich meine die einfachste Lösung ist doch vielleicht 'ne Art Name-Value Paare per DTD festzulegen, die Namen und die Values können dann beliebig hinzugefügt werden.
über den Aufbau von dem XML Schema entscheidet ein Konsortium (d.h. viele Konzerne sind da beteiligt). Ich muss mein Tool so flexibel schreiben,dass ich mit wenigen Änderungen zu Recht komme.

Ich befürchte Du blickst da besser durch als ich. Mach es einfach so wie Du denkst.

21.03.2008 - 21:39 Uhr

Vielen Dank für die Antworten. Also XML Schema existiert auch und über den Aufbau von dem XML Schema entscheidet ein Konsortium (ich habe null zum sagen). Das Problem ist, dass sie ständig etwas ändern und man muss immer hinterher laufen...heh. ich habe mir überlegt so ein generisches datenmodell aufbauen und für jedes Release einen Konverter zu schreiben. Dann habe ich eine Art von Sternkonverter (ist eine super Sache).

Bevor ich jetzt nur noch Sterne sehe musst Du mal bitte erklären was Du genau meinst. Ich meine die einfachste Lösung ist doch vielleicht 'ne Art Name-Value Paare per DTD festzulegen, die Namen und die Values können dann beliebig hinzugefügt werden. Ich meine bei EMail headern oder etwa dem HTTP header wird das ja auch so gemacht, wenn eine Applikation einen header Eintrag nicht kennt gibt es halt die entsprechende feature nicht. Man könnte über entsprechende header Einträge HTTP quasi zum chatten benutzen wenn Client und Server die header kennen. Sollten die Änderungen an dem XML File aber totalen Änderungen unterworfen werden dann muss man wohl einen Konverter schreiben, stimmt.

Das mit Delphi geschriebene Tool funktioniert einigermaßen und wird ständig erweitert. und angepasst. Ich persönlich bevorzuge .Net (C#) Mit .Net kann man schöner bzw. einfacher Objektorientiert programmieren. Viele Sachen sind vereinfacht (:net 2.0) z.B. Delegates, Generics (Dictionary<>, List<> super Sache), StringBuilder, Reflections..und und und. Was noch dazu kommt sind die ganze features von Visual Studio 2005. Delphi Entwicklungsumgebung ist einfach Schei...e, z.B. was fehlt ist Refactoring...
Bis jetzt für das Tool sind keine DUnits geschrieben..hmmm...dass es läuft, ist ein Wunder.

Kenne mich mit Delphi nicht aus. X( Portiert halt auf C#! Kann nicht schaden denke ich. Und macht Dir sicher Spaß! 8) Rechne halt irgendwie Zeitersparnis, verbessertes schnelleres Debugging, Qualitätssteigerung u. Performance etc. aus und dann hast Du die Argumente für die Captains. Sag denen dass Du als Steuermann stets Klippen umsegelst o. ä. Kriegst Du ein Ok dann Anker lichten und Segel setzen. 😁

ich würde sogar behaupten, dass die Weiterentwicklung mit C# wird sich schon produktiver gestalten. Nur die Frage ist, wie groß ist der Aufwand, wie gesagt 5 Jahre Delphi Entwicklung, das ist schon eine Menge an Klassen.

Vielleicht mit einem entsprechenden tool in Metaklassen umwandeln wie etwa ein UML Modell und dann C# Klassen generieren. Auch bei Softwareerstellung kann man zumindest teilautomatisieren. Wäre zu prüfen ob's was gibt. Ansonsten prüfen ob die Entwicklung eines eigenen Delphi-Parsers zeitnah geschehen könnte.

21.03.2008 - 21:18 Uhr

Hat prima funktioniert der ListView jeweils die into view geratene TabPage zuzuweisen. So spart man ressourcen. Danke nochmals an alle. 🙂

21.03.2008 - 19:31 Uhr

hmm..also kein generisches Datenmodell 😉

Ich habe noch zweite Frage: Das Tool ist mit Delphi 6 entwickelt worden (ca. 5 Jahre Entwicklung). Was sprich dafür oder dagegen um auf .Net (C#) umzusteigen? Welche Risiken sind damit verbunden (ich bin eher freund von C# 🙂) z.B. Reverse Engineering.
Oder besser gesagt, wie kann ich die Vorgesetzten überzeugen, dass der Aufwand sich lohnt?

Grüße

Also wenn das mit Delphi geschriebene Tool super funktioniert gibt es ja keinen Grund auf C# umzusteigen. 8) Es sei denn der Aufwand hält sich in Grenzen und die Weiterentwicklung mit C# gestaltet sich produktiver (Zeitersparnis). 😁

Jedenfalls würde ich bezüglich des XML files mal eine DTD oder ein XSD erstellen damit das XML Dokument sauber validiert werden kann. Außerdem kannst Du dann attribute vom Typ ID benutzen, was manche XPath-Abfrage erleichtern kann. 😉

Man kann auch die XML Datei so aufbauen dass Erweiterungen nicht unbedingt nötig sind, so im Stil von Name-Value Paaren.

21.03.2008 - 19:08 Uhr

Hallo yetibrain,

Also doch die IDE Funktionalität umgehen.
nicht umgehen, sondern ergänzen. Du kannst das ListView weiterhin per IDE erstellen und eben nur den Parent zu Laufzeit ändern.

herbivore

Cool. Dann kann ich sogar die Festlegung der Spalten per IDE belassen. Wenn eine TabPage angeklickt wird ändere ich dann den Parent des one and only ListView Objekts.
Klingt gut und werde ich mal austesten.

Vielen Dank für die Ratschläge und Überlegungen.

21.03.2008 - 19:04 Uhr

Mir fällt dazu folgendes ein:

a) Tu das Listview nicht! in die Tabpages sondern daneben und leg die Position hinterher manuell in den Eigenschaften fest, sodass es über den tabpages ist. (kp, wie man dafür sorgt, dass es oben bleibt)

Geht glaube ich nicht, denn dann wäre der parent das TabControl und da kann man keine ListView ablegen.

b) Versuch das Listview aus der alten Tabpage zu entfernen und in die neue zu packen, sobald die Seite gewechselt wird.
Oder schreib dir deine eigenen tabpages, in denen es garnicht erst entfernt wird.

Ersteres könnte funktionieren, zweiteres ist wohl etwas aufwendiger, TabPage Klassse ableiten meinst du wohl. Wüsste jetzt auch nicht aus dem Stegreif wo man da das Skalpell ansetzen müsste.

c) Erstell außerhalb des Designers eine variable und weis ihr jeweils das aktuelle Listview zu. Arbeite beim Aktualisieren der Daten mit der Variable. Du musst dann aber jedesmal die Daten vom einen ins andere Listview schaufeln, wenn die Tabpage gewechselt wird.

Ist wohl auch herbivore's Vorschlag, den werde ich mal austesten. Allerdings werden bei mir keine Daten "umgeschaufelt", habe vor die ListView als OwnerDraw zu betreiben, diese erhält also nur keys bzw. Referenzen zu den Daten (kommen aus einer db4o-database). Habe nicht vor die Daten die schon da sind nochmals zu kopieren nur um diese zu visualisieren.

d) Nur die Werkzeugleiste auf die Tabpage legen und das Listview daneben

Das hatte ich schon versucht, sieht allerdings komisch aus. Das TabControl hört also bei den Tabs selbst schon auf und danach kommt im übergeordneten Container die ListView. das wäre am einfachsten aber man sieht irgendwie dass die ListView nicht auf dem TabControl bzw. der page "sitzt". Sieht einfach blöd aus.

Vielen Dank für die Tipps!

21.03.2008 - 18:51 Uhr

Hallo yetibrain,

ein ListView kann zu einer Zeit immer nur an einer Stelle verwendet werden. Aber du kannst natürlich zu Laufzeit dessen Parent auf die TabPage ändern, auf der es gerade angezeigt werden soll.

herbivore

Super Idee! Also doch die IDE Funktionalität umgehen. Ist mir Recht. Derzeit werden lediglich die Header Spalten per IDE definiert, aber das kann ich auch per C# code machen bzw. ausprogrammieren. Müsste eigentlich gehen wenn ich einfach den Parent Container entsprechend der angewählten page neu setze.

1000 Dank!

21.03.2008 - 17:44 Uhr

Hallo Alle,

weiß jemand wie man eine ListView mehrfach verwendet. Also ich habe da ein TabControl mit mehreren pages und will dass eine ListView auf jeder page erscheint. Da die einzelnen pages die Daten in der ListView lediglich filtern braucht es keine n-fache ListView sondern ich könnte immer dieselbe verwenden da ja außerdem die View aktualisierte Daten bekommt wenn sie angewählt wird, in diesem Falle die page eines TabControls. Mit copy & paste wird immer ein neues objekt erzeugt in der IDE. Gibt es da einen trick? Muss man die IDE irgendwie umgehen oder geht es schlichtweg nicht?

Danke für Tipps und Hinweise.

21.03.2008 - 17:22 Uhr

Einfach mit XmlDocument arbeiten!

21.03.2008 - 10:45 Uhr

[EDIT]Abgeteilt von OOP - Szenario Hardware abbilden[EDIT]

Für Klassen in C# solltest du nach Namenskonventionen das Präfix c weglassen.

Hi herbivore,

ich habe immer wieder das Problem wie ich meine Objekte benennen soll. Sollte der Name als Präfix den Typ als Kürzel beinhalten oder nicht? Manche machen ja auch ein m_ als Präfix für Klassenmember. Mache ich aber z. B. ein cRunning so weiß ich immer noch nicht ob mit c eine Klasse gemeint ist oder etwa ein char. Denke man kommt da mit den Präfixen in einen Konflikt, denn es darf eigentlich keiner doppelt auftreten. Also am Besten weglassen denke ich und einfach irgendeinen treffenden Namen wählen, oder? Mich würde interessieren wie andere das machen bzw. was es da für Empfehlungen gibt. Danke.

21.03.2008 - 10:37 Uhr

Hi 🙂

....
Jetzt frage ich mich, ob das die richtige Vorgehensweise ist, oder ob man für jeden Typ Hardware eine eigene Klasse anlegen sollte, die nur die hardwareeigenen Attribute enthält oder ob es vielleicht eine ganz andere bessere Lösung gibt.

Ich denke dass Vererbung in diesem Falle nicht die ideale Lösung ist, obwohl es zunächst als logisch erscheint. 🙁 Wenn etwa Deine Applikation neue Hardware-Typen benötigt musst Du jedesmal eigentlich zur Laufzeit eine neue Klasse erstellen. Meines Erachtens wäre Komposition dafür besser geeignet.

Man sollte denke ich das Objekt Hardware mit Attributen bzw. Merkmalen "dekorieren", dies kann dann auch einfach zur Laufzeit geschehen. Am Besten erstmal die verwendeten Namen standardisieren und mit einem oder mehreren Kategorie-Objekten dekorieren. Dann das eigentliche Hardware-Objekt noch mit Merkmalen dekorieren, Merkmale die mit den dazugehörigen Werten der Merkmale für das Objekt dann eine eindeutige Identifikation ergeben im Bezug auf dessen Klassifizierung. Noch besser wäre es die standardisierten Namen mit Merkmalen zu versehen. Jedes Hardware-Objekt das Du anlegst würde dann über den Namen den Du für das Objekt wählst die zugeordneten Merkmale aufzeigen, welche Du dann für das konkrete Objekt noch mit Werten versiehst.

Ich habe mal in den 80-er Jahren mit MM zu tun gehabt, damals habe ich mich u. a. mit einer Artikelverwaltung beschäftigt, vor allem mit dem Klassifizieren von unterschiedlichsten Artikeln. Meist wird dort nur Datenbanktechnisch eine einzige "Artikeltabelle" benutzt, mit Artikel-Nr als primary key, dann als Felder Bezeichnung sowie andere Felder wie etwa Typ oder Technische Daten. Oft wollte man die Artikel noch mit spezifischen Merkmalen ausstatten so daß man an mich herangetreten ist um dies zu customizen. Wollte man etwa für ICs noch ein Attribut "Pinzahl", so war das natürlich prima wenn ein IC am Bildschirm angezeigt wird, wenn man dann allerdings eine Schraube anzeigt so war es klar, dass eine Schraube kein Merkmal "Pinzahl" hat. Die Lösung war für mich dass Merkmale eigentlich immer von dem Namen des Artikels abhängen bzw. von seiner Klasse. Nun gibt es auch das Problem dass einer einen IC mit "IC" als Bezeichnung anlegt und ein anderer eventuell mit "Integrierter Schaltkreis". Selbst die schnellste Suchmaschine würde einem in diesem Falle wenn man einen bestimmten "IC" sucht, den Artikel nicht finden der mit "Integrierter Schaltkreis" als Bezeichnung angelegt wurde. Deswegen kam ich auf die Idee die Bezeichnungen zu "normieren" bzw. im Vornherein festzulegen und damit diese einfach gefunden werden, über zugeordnete Kategorien einfach anzeigbar zu machen. Der Focus bei diesem System liegt dann beim Finden, nicht beim Suchen. 8)

Es würde hier den Rahmen sprengen dies genauer zu erklären. Würde mich aber über Kommentare freuen.

21.03.2008 - 09:59 Uhr

hi herbivore, Quallo, cadi u. a.

Habe mir diesen thread durchgelesen und finde die Idee sagenhaft. 8) Transaktionen für transiente Objekte. Ich finde herbivore hat vollkommen Recht, selbst wenn ein Objekt unterschiedliche Zustände hat so muss es dafür nicht zwangsläufig seine Identität verlieren indem es z. B. kopiert wird. 🙁 Es hört sich zwar irgendwie logisch an dass wenn man ein Objekt zwecks Manipulation etwa in eine Dialogbox reinreicht dass man vorher eine Kopie erstellt weil der Benutzer eventuell "Cancel" anklickt um sämtliche Änderungen zu verwerfen, dann muss man natürlich den vorherigen Zustand wieder herstellen. Allerdings genügt es tatsächlich lediglich den Zustand zu sichern und nicht das komplette Objekt, ein Transaktionsmechanismus finde ich da die bessere Lösung. Es wäre wirklich schön wenn das in .NET schon enthalten wäre. =)

Seid ihr denn noch weiter gekommen bzw. was ist aus dieser Idee geworden? Das würde mich wirklich interessieren. 😉

19.03.2008 - 02:06 Uhr

Jetzt dachten wir uns, dass wir eine Klasse "Produkt" machen, die ein Produkt enthält, das bestellt werden kann.
Diese Klasse enthält die Member-Variablen id, Produktname und Preis. Dazu Methoden wie "LadeProduktAusDatenbank", "SpeichereAenderungenInDatenbank", "LoescheProdukt". Im Konstruktur wird, je nach Übergabe, entweder ein neues Produkt erstellt, oder wenn eine Produkt-Id übergeben wurde, das entsprechende Produkt aus der Datenbank geladen und die Werte in die Member-Variablen geschrieben.

Für die Darstellung der Produkte im Shop wird jetzt eine ArrayList erstellt, die alle Produkte in Form von Instanzen der Produkt-Klassen enthält. Dazu wird per foreach alle Produkt-Ids durchgegangen und entsprechende Produkt-Objekte erstellt:
Produkte.Add(new produkt(produkt_id));

Das war Teil 1. Macht das so OOP-technisch Sinn?

Klar, ihr müsst ja Instanzen von Produkten generieren und die müssen irgendwo gespeichert sein. 😁 Zum Beispiel in einer zweiten Klasse "Produkte" oder auch "Shop". Statt ArrayList eher List<Produkt> verwenden, oder Dictionary<long><Produkt> bzw. Dictionary<string><Produkt> wenn die Id alphanumerisch ist.

Teil 2:

Geplant war jetzt, dass wir für die bestellten Produkte eine Klasse erstellen, die von der Klasse Produkte erbt. Aber: macht das überhaupt Sinn, da die Produkt-Klasse ja auf eine ganz andere Tabelle zugreift?

Hä? X( Was für eine Tabelle? Eine Vererbung von Produkte zu "bestellte Produkte" macht keinen Sinn, denn die Bestellung ist ja ein Vorgang und keine Eigenschaft. Wenn jemand bestellt braucht ihr auch 'ne Klasse "Kunde" sowie eine Klasse "Auftrag". Dann noch "Auftragspositionen", der Kunde darf ja auch sicherlich mehrere Produkte bestellen. 😁 Ihr könnt euer Klassenmodell auch per Komposition entwerfen, Vererbung macht wohl eher Sinn bei Klasse "Produkt", um Produkte zu spezialisieren.

Jedenfalls würde ich bei Bestellung ein "Auftrag"-Objekt einer "Auftrag" Klasse erstellen, außerdem ein Objekt "Kunde" falls es ein neuer Kunde ist. Auftrag hat eine 1:1 Referenz zu Kunde. Kunde eine 1:n Multiplizität zu Aufträgen. In der Klasse Auftrag macht ihr ein Dictionary mit Referenzen auf Auftragspositionen. Letztere haben Nummern und eine Referenz zum Produkt. Natürlich könnt ihr dort auch den Preis redundant halten und einfrieren, in der Auftragsposition. Produkte könnt ihr auch mit Kategorie-Klassen oder Merkmal-Klassen "dekorieren", dank Komposition auch zur Laufzeit änderbar.

Die Tabellenstruktur ist ja grundsätzlich quasi gleich (produktname, preis), nur dass da ein paar Felder hinzugekommen sind. Vom Grundsatz hört sich das für uns so an, als wäre Vererbung da angebracht.

In eurem Falle würde ich eher Komposition verwenden (s.o.). Nochmals: Was für eine Tabellenstruktur meinst Du? ?( Jedenfalls hat eine Tabellenstruktur nix mit Vererbung zu tun.

Nur gäbe es da dann natürlich die Problematik, dass in der Klasse Produkt dann immer nur auf die Produkte-Tabelle zugegriffen würde.

Ich versteh' nur Tabelle....

Für sachdienliche Hinweise wären wir sehr verbunden. 🙂

Viele Grüße,
Daniel

Ihr braucht mehr als nur 2 Klassen, solltet auch mal die Requirements festlegen. Diese braucht ihr wohl:


class Produkt 
class Produkte oder Shop o.ä.
class Kategorie
class Kunde
class Auftrag
class Auftragsposition

Wenn sich Preise oft ändern würde ich auch diesbezüglich eine History implementieren. Auch für den EKP. Bei Inventur eventuell hilfreich.

Man sollte vielleicht mal ein kleines Diagramm machen, am besten mit UML. 🙂

19.02.2008 - 14:44 Uhr

Was ist wenn da 0 zurückkommt, also der Server den Socket schliesst:

iRx = socketData.CurrentSocket.EndReceive(asyn);

Hast Du das überhaupt behandelt? Vielleicht auch mal vor einem Send() prüfen ob Du überhaupt senden darfst, der Empfangspuffer des Servers könnte ja voll sein.

19.02.2008 - 14:34 Uhr

Wenn Du große Dateien versenden willst dann benutze doch die asynchrone Send Funktion. Die payload Größe ist ja nicht unendlich groß. Kannst auch alles auf einmal senden, allerdings musst Du nach einem Send() überprüfen wieviele bytes tatsächlich gesendet wurden. Dann den offset zu Deinem Sendepuffer verschieben und so lange senden bis alles weg ist.

Eine TCP/IP Verbindung ist ein stream. Du fragst nach der Ende-Kennung für den Server? Schau Dir mal z. B. POP3 an, dort gibt es etwa CRLF.CRLF, allerdings als Ende-Kennung für den Client. Nun Du kannst auch "ja-ist-denn-heut-schon-weihnachten?" als Ende-Kennung definieren, oder Du sendest die Länge in einem header voraus (siehe HTTP Content-length).

19.02.2008 - 14:10 Uhr

Schau doch mal hier das Beispiel an:

http://msdn2.microsoft.com/de-de/library/bew39x2a(VS.80).aspx

Doch Vorsicht vor diesem Abschnitt:

if (bytesRead > 0) {
// There might be more data, so store the data received so far.
state.sb.Append(Encoding.ASCII.GetString(state.buffer,0,bytesRead));

            // Get the rest of the data.  
            client.BeginReceive(state.buffer,0,StateObject.BufferSize,0,  
                new AsyncCallback(ReceiveCallback), state);  
        } else {  
            // All the data has arrived; put it in response.  
            if (state.sb.Length &gt; 1) {  
                response = state.sb.ToString();  
            }  
            // Signal that all bytes have been received.  
            receiveDone.Set();  

Else wird erst durchlaufen wenn der Server den socket schließt!!!!!
Das wird in dem Beispiel nicht ganz klar. In dem StringBuffer "response" steht erst was drin wenn der Server die Verbindung beendet hat, dieser Else-Abschnitt ist eigentlich für das schließen des eigenen Clients da.

Du musst schon hier die Daten verwerten:

if (bytesRead > 0) {
// There might be more data, so store the data received so far.
state.sb.Append(Encoding.ASCII.GetString(state.buffer,0,bytesRead));

Also hier am Besten state.buffer per Event an einen Consumer schicken (GUI z. B.) oder whatever. Bei GUI als Ziel Invoke() nicht vergessen da anderer thread.

Die ReceiveCallback() Methode läuft in einem thread den BeginReceive() erzeugt, dort wird die blockierende Receive() Funktion aufgerufen. Wenn diese zurückkehrt sind bereits Daten empfangen worden (oder es wurde eben die Verbindung beendet wenn die Länge der empfangenen Bytes 0 ist). Sobald Daten empfangen wurden wird BeginReceive() erneut aufgerufen und wieder dadurch ein thread erzeugt. Wenn wieder Daten ankommen kriegst Du diese wieder geliefert. Denn der thread mit dem blockierenden Receive() ist wenn's sein muss jahrelang aktiv, sobald auch nur wieder 1 Byte ankommt, liefert er es zurück.

Das Microsoft Beispiel ist eher für HTTP geeignet, dort schliesst der Server normalerweise die Verbindung nachdem dieser den Response gesendet hat. Für ein Protokoll wie etwa POP3 ist das Beispiel ungeeignet, denn da gibt es nicht nur einen request/response per TCP/IP session. Nach jedem POP3 Befehl der an den Server geht gibt es einen Response den man auswertet. Die Verbindung wird erst geschlossen wenn man ein QUIT sendet, dann schliesst der Server die Verbindung und führt noch eventuelle DELE Kommandos aus.

19.02.2008 - 13:40 Uhr

Hi Norman-Timo,

bei Verbindungen über TCP/IP ist es so, dass es für jeden Request genau einen Response gibt.

Bei TCP/IP gibt es diese Beschränkung nicht. Ist einfach eine bidirektionale Verbindung. Du meinst wohl HTTP. Ein HTTP POST ist aber kein Response sondern ein Request des Clients.

Von daher ist es IMHO nicht möglich, mehrere Formulare auf einmal zu verschicken.

Natürlich ist das dann nicht möglich, wenn HTML FORM mit einem browser benutzt wird, da hast Du Recht. Sollten mehrere Formulare in einer HTML Seite existieren könnte man aber eventuell mittels Skripting die Daten aller Formulare auslesen und die POST Daten selbst zusammenstellen. Dann zum Server per Skript verbinden, Header setzen und die POST Daten schicken.

19.02.2008 - 13:29 Uhr

Ein HTTP POST ist ja kein Response sondern ein Request. Setze einfach den Connection header auf keep-alive und sende in einer loop Deine wieviel auch immer HTTP POSTS. Wieso soll das nicht gehen?

19.02.2008 - 13:24 Uhr

Wenn der Server mehrere Client Verbindungen entgegen nehmen soll muss in der Methode AcceptCallback() welcher Dir den socket für eine stattgefundene Client-Server Verbindung zurückliefert sofort wieder ein neuer BeginAccept() mit dem listening socket stattfinden, denn sonst "hört" der Server-socket ja nicht mehr.

Über den listening-socket wird ja nicht kommuniziert sondern eben nur der Verbindungsaufbau entgegengenommen. el_panter irrt sich keineswegs, nur braucht es keinen eigens implementierten thread, der Aufruf der asynchronen BeginAccept() Methode macht ja genau das, es wird ein thread erzeugt der den blockierenden Accept() aufruft welcher dann bei einer Verbindung mit dem Verbindungssocket zurückkehrt und Dir diesen in der EndAccept() Methode übergibt. Dann ist der thread erst mal fertig.

19.02.2008 - 12:12 Uhr

Hast Du das Problem immer noch oder bist du weiter gekommen? Bricht denn die Verbindung immer nur dann ab wenn der Client etwas sendet oder auch wenn der Client empfängt? Bricht die Verbindung auch ab wenn weder gesendet noch empfangen wird? Wer kommuniziert eigentlich mit der SPS? Du hast doch selbst einen Server implementiert. Fungiert dieser als proxy zwischen Deinem Client und der SPS?

04.02.2008 - 23:26 Uhr

>wurde die Verbindung zuerst unterbrochen, dann hat sich der Client wieder >vebunden und was erfolgreich gesendet.

Was sendet denn der client und auf welchen response wartet er? Gibt es ein Protokoll? ?(

>kurze Zeit später hat er wieder was erflogreich empfangen, aber beim Senden >dann der Fehler

Verhält sich der client passiv nach einem Verbindungsaufbau? Wer hat denn die Server-Rolle? Wartet der Client auf den Server um was zu tun oder umgekehrt? ?(

Kann ja auch sein dass die SPS auf einen request mit einem response antwortet und grundsätzlich die Verbindung schließt wie etwa auch bei HTTP der Fall. 🙁

Vielleicht ist die SPS auch für manche Kommandos überfordert oder unterfordert und erwartet Streicheleinheiten in Form von NOOP commands in bestimmten Zeitabständen, quasi 'ne Art reset command für den idle-timer des servers. Läuft dieser ab wird die Verbindung beendet. Du solltest mal feststellen ob die Verbindung durch den Server "gracefully" oder nicht stattgefunden hat, ist sie graceful dann könnte es sein dass die SPS dich absichtlich disconnected. 😜

Zu prüfen wäre auch ob sie nicht etwa 'ne Art keep-alive communication zwischen dem client erwartet, könnte wie schon gesagt auch in Form von Zeichen oder Befehlen erfolgen. :evil:

Wenn gar nichts mehr hilft dann versuchen eine andere Applikation, welche diesen Effekt nicht vorweist, zu scannen indem der TCP/IP stream intercepted wird. Dann die Pakete anschauen und Unterschiede suchen. Paketgrößen checken, Checksums, tcp-flags etc. etc. Die Unterschiede natürlich zu dem tcpdump deines Clients den du ebenso interceptest. 😭

Sollte dann irgendwann mal der Arzt kommen dann vielleicht mal beim Hersteller nachfragen. 8)

01.02.2008 - 22:08 Uhr

Mit welcher SPS kommunizierst Du denn? CP? S7?

10.09.2007 - 00:35 Uhr

Hallo C# Entwickler,

ich möchte mal anfragen ob jemand mit C# und db4o arbeitet bzw. Erfahrungen damit hat. Bei mir klappt es nocht nicht so wie ich es mir vorstelle X(, deswegen suche ich den Erfahrungsaustausch mit anderen Entwicklern.

yb

07.09.2007 - 23:54 Uhr

benutze halt den Klammeraffen vor einem String.

07.09.2007 - 19:58 Uhr

Das passt schon so wie Du es gemacht hast, so mache ich das auch. Wenn Du noch eine DTD definierst kannst Du das Setzen der Attribute eventuell weglassen, da man bei einer DTD Standard Attribute setzen kann.

Ob man mittlerweile auch eine DOM vor der Serialisierung gegen eine DTD validieren kann weiß ich nicht mit Xerces ging es früher jedenfalls nicht. Es ist umständlich die DOM zuerst zu serialisieren (nach Manipulation) um dann erneut das xml-file einzulesen um zu validieren, eine Validierung einer DOM im Speicher ist der bessere Weg, noch besser wären Fehlermeldungen sobald du nodes einzuhängen versuchst die laut DTD ungültig sind. Dann wäre die DOM schon vor dem Serialisieren validiert.

cheers,

yetibrain

07.09.2007 - 19:47 Uhr

hi Wolf,

ERWin heißt das Ding, genau. Sorry!

Es gibt auch noch eine Alternative, versuche es mal mit diesem Entity Relationship Designer, ist freeware:

http://fabforce.net/dbdesigner4/

Das Ding heißt DBDesigner. Ein gutes ERD tool sollte eigentlich primary keys, constraints etc. erkennen, alles was es im Data Dictionary gibt kann auch hergeholt werden. Das CA tool ErWin ist sehr teuer, ich weiß. 🙁

hope this helps,

yetibrain