Laden...
G
Gregor myCSharp.de - Member
Azubi Applications Developer Schweiz Dabei seit 23.12.2005 68 Beiträge
Benutzerbeschreibung
Naja ich bin einfach Computersüchtig und besonders nach eigenen Programmen 😉

Forenbeiträge von Gregor Ingesamt 68 Beiträge

31.07.2008 - 13:04 Uhr

Also ich finde den Artikel gar nicht mal so schlecht. Es hat zwar einige Ecken und Kanten die man noch ausbessern könnte, aber so im Ganzen ist er Doch ganz gut. Habe bereits "Asmodiel" darauf hingewiesen.

Und als Vorschlag an die Leute die Sachen vermissen (im Besonderen @ JAck30lena): Eine einzelne Person kann nie alles wissen. Besonders wenn man die .NET Libs sowie die ganzen 3rd Party Libs ansieht die es da draussen so gibt... Also, falls Ihr euch mit weiteren Details auskennt, könnt ihr doch eine "Erweiterung" zum Artikel schreiben - bissl in der Art wie Wikipedia ja auch funktioniert.

So oder so - schönes Weekend Euch allen bereits,
Gregor

15.07.2008 - 14:54 Uhr

Zwingend!

Alles was von Aussen in dein Programm kommt muss überprüft werden. Ohne wenn und aber! Im Besonderen für GET / POST Werte.

Gruss,
Gregor

30.01.2008 - 09:48 Uhr

Würde ja den Code reinlegen, aber es ist zum einen Code den ich während meiner Arbeit geschrieben habe und den kann ich nicht einfach so veröffentlichen... Als auch Code der für mein Problem passt, nicht aber allgemeingültig ist.

Ich beschreibe aber mal in etwa was ich gemacht habe:

1. Neues UserControl erstellen
Als erstes habe ich ein UserControl erstellt (einfach eine neue Klasse die von UserControl erbt) und diesen mit dem VS Designer mit einer VScrollBar und einer HScrollBar ausgestattet. Jedes dieser UserControls stellt einen Editor dar (ich brauche am schluss eigentlich zwei die ja synchron scrollen).
Die VScrollBar hat als Maximalen Wert, den man erreichen kann, die Menge an Zeilen die ich habe. Es gibt den Maximalen Wert und mit etwas rumrechnen kriegt man den Wert, welchen man wirklich erreichen kann mit dem Scrollen. Wie man es genau macht, steht hier drin -> :rtfm:. Habe mal die englische Version hier reinkopiert:

The value of a scroll bar cannot reach its maximum value through user interaction at run time. The maximum value that can be reached is equal to the Maximum property value minus the LargeChange property value plus 1. The maximum value can only be reached programmatically.

Jede Linie ist in einem Directory (derzeit noch) drin. Jede Linie wird noch durch eine interne private Klasse beschrieben, damit ich den Linien weitere Informationen hinzufügen kann (zum Beispiel ein Icon, welches ich links von den Linien zeichne).

So nun zur Draw Methode: Hier iteriere ich einfach über alle Linien die Sichtbar sind. Die 1. Linie entspricht dem Wert von der VScrollBar und die Anzeigbaren Linien kann man aus der Höhe des Controls und der höhe der Schrift (und weiteren Offsets) berechnen.

Scrolling: Nun ich stelle bei meinem UserControl Properties zur Verfügung mit welchen ich den Wert von den beiden Scrollbars setzen kann von aussen und noch Properties damit ich den Maximalen und Minimalen Wert auslesen kann. Achja man muss natürlich noch die Scrollevents nach aussen verfügbar machen 😉, also public event EventHandler VScroll; oder etwas in der Art.
Bei jedem Scroll wird das UserControl "invalidiert" (hm was ist der Ausdruck im Deutschen??), also: this.Invalidate();

2. Zweites User Control für zwei "Editoren
Da wir einen einzelnen Editor ja geschrieben haben, müssen wir nur noch zwei zu einem UserControl zusammenfassen. Das mache ich mit einem weiteren UserControl und einem SplitPanel in welchem jeweils links und rechts einmal mein 1. UserControl drin steckt. Jetzt hänge ich an alle Scroll Events passende EventHandler. In diesen setze ich den neuen Wert von Editor A der Scrollbar von Editor B. Fertig.

Erweiterungen
Wie gesagt hat mein "Editor" (mein UserControl) die Möglichkeit pro Zeile ein Image anzuzeigen. Dieser wird in einem "Image Margin" links vom Text gezeichnet. Diesen Margin fülle ich noch mit einem dunklen Grau. Beim Schreiben der einzelnen Zeilen mit graphic.DrawString() muss man natürlich zur x-Koordinate diesen "Margin" dazurechen 😉.

Damit die Zeilen nicht direkt aufeinander liegen, habe ich noch einen "LINE_MARGIN", also einen zusätzlichen Abstand zwischen zwei Zeilen, welchen ich zur y-Koordinate dazuzähle während dem Zeichnen.

So in etwa habe ichs gemacht. Es ist nicht zwingend performant und auch nicht perfekt, funktioniert aber soweit sehr gut.

Gruss,
Gregor

29.01.2008 - 20:13 Uhr

Danke für den Code, habe die Lösung bereits einmal getestet aber irgendwo einen Fehler gemacht und nicht mehr weiter verfolgt. Hab es heute früh fast identisch auch hinbekommen, ist aber nicht so ganz ideal... Will halt nicht unbedingt immer irgendwelche WM's abschicken und so weiter. Hab jetzt das Ganze mit einem eigenen Control gelösst (GDI+ 😉 ) und hab so auch mehr Möglichkeiten vom Designtechnischen.

Danke trotzdem.

Gruss,
Gregor W.

25.01.2008 - 09:09 Uhr

Es gibt schon im Internet verschiedene Dienste zum Bandbreitentesten. Aber diese bieten meines Wissens nach keine API oder so an um da was offiziell zu machen. Da ja Daten hochgeladen und runtergeladen werden (Upload und Download Geschwindigkeit) sind natürlich gewisse Kosten damit verbunden.

Noch so zur Information: Die maximale Geschwindigkeit richtet sich an sich nach dem schwächsten Glied in der Verbindung. Also Du könntest einen perfekten Anschluss haben, aber wenn der Server mit nem 64k Modem angebunden wäre, würdest Du natürlich kaum auf 100kbit/s kommen 😉. Nur zur Info. Also die Werte sind natürlich nicht zwingend für alle Verbindugnen gültig und nur Richtwerte.

Gruss,
Gregor

24.01.2008 - 21:55 Uhr

Also im Anhang das Projekt. Ich habe gerade kein VS05 zur Hand und konnte nicht kontrollieren ob es noch korrekt funktioniert. Was Du brauchst: die "iperf.exe" (ist bereits im zip enthalten) und ZedGraph (google suchen, runterladen, referenzieren).

Eine Möglichkeit das Ganze ohne einen "Server" zu machen ist an sich und meinem Verständnis von Netzwerktechnik nicht möglich (Du musst ja immer irgend eine Verbindung zuerst einmal haben und dann möglichst viele Daten rüberschieben um zu sehen wo die Grenze (maximum) ist.).

Das Projekt / den Code stelle ich allen zur komplett freien Verfügung. Macht damit was ihr wollt - nennt bitte nur **nicht ** meinen Namen wenn ihr böses damit vorhabt :p

Wie gesagt, der Code ist schon älter und damals ging es nur darum jemandem zu zeigen, dass ich es schneller und schöner hinbekomme (GUI, Fähigkeiten, etc.). Der Code hat entsprechend darunter gelitten. So fehlen Kommentare, es wurde nicht mit Konstanten oder String.Format() gearbeitet und so weiter ...

p.s.: Der Name "IPerfDau" beinhaltet an sich die Idee dahinter: Es sollte an sich ein Programm für einen DAU sein, welcher nur einen Knopf hat zum das Ganze zu starten und die Auswertung dann sieht... Das AdminForm ist für einen "Admin" um die entsprechenden XML Dateien zu generieren 😉

Gruss,
Gregor

24.01.2008 - 17:06 Uhr

Ich habe mal mit C# ne GUI für IPerf (http://dast.nlanr.net/Projects/Iperf/) gemacht, des dürfte in etwa das sein was Du brauchst, falls nicht alles selber machen möchtest. Bedingung: Dein Programm hat den Client und Du hast einen Server mit IPerf am Laufen.

So sieht es aus in etwa:

Falls Du willst, kann ich den Code mal online stellen ... bin jetzt aber nicht zu hause und komme an den Source nicht ran. Die ganze Applikation habe ich in < 1 Tag zusammengeklickt und geschrieben... Also keine Fehlerkontrollen eingebaut und kaum Kommentiert oder wirklich 100% sauberer Code. Also es sieht nach mehr aus als es ist :p

Gruss,
Gregor

24.01.2008 - 16:58 Uhr

[EDIT]Abgeteilt von Elegante lösung 2 RichTextBoxen syncron zu scrollen[EDIT]

Also ich stehe derzeit genau vor dem Problem, dass ich zwei RichTextBox Komponenten synchron scrollen muss. Habe bereits alles versucht was mir eingefallen ist (Get-/SetScrollPos, WM_VSCROLL, anderes zeugs, eine VScroll Komponente und mit dieser dann die beiden Editoren scrollen, ...).

Am besten funktionierte GetScrollPos und SetScrollPos (WinAPI), aber wenn ich mit SetScrollPos eine Position setze, bewegt sich der Inhalt kein Stück (der Text), nur die Scrollbar ändert ihre Position (toll!).

Hat jemand eine Idee wie ich noch den Content zum Bewegen bekomme? Habe jetzt sicher zwei Tage (17 Stunden) damit verbracht 😦.

Naja bin gespannt.

// Edit:
Achja, natürlich die beiden Knöpfe zu drücken (hoch / runter) funktioniert perfekt mit der Methodik wie sie hier gezeigt wird! Aber sobald man den Balken mit der Maus pakt und diesen verschiebt geht nichts mehr. Ich konnte auch mit Spy++ nicht herausfinden welche Message das ganze "steuert". Eingeleitet wird es sicher mit "ThumbTrack" (zu finden zum Beispiel in System.Windows.Forms.ScrollEventType) und mit "ThumbPosition" wohl gestoppt... Es gibt auch ein "EndScroll" welches möglicherweise auch ein Ende anzeigt.... Ach keine Ahnung 🙁

Gruss,
Gregor

01.01.2008 - 15:31 Uhr

Aggregation:

public class A : IDisposable {
  // der Code
}

public class B {
  private A _a; // Aggregation 0..1
  private A[] _as; // Aggregation 0..*
}

Komposition:

public class A : IDisposable {
  // der Code
}

public class B {
  private A _a; // Komposition
  
  public B() {
    _a = new A();
  }

  ~B() {
    // Class A darf ohne Class B nicht existieren .. also man könnte an sich den GC auch noch starten
    _a.Dispose();
    _a = null;
  }
}

29.11.2007 - 10:44 Uhr

Hm, meinst Du sowas?

for (Double lowBorder = minLowBorder; lowBorder < maxHighBorder; lowBorder += 2)
{
    // hier bin ich
}
29.11.2007 - 10:41 Uhr

Ich muss ehrlich sagen, dass ich mit dieser Klasse noch nie gearbeitet habe, aber wie wäre es mit der Idee beim Konstruktor von MailAdress ein Encoding mitzugeben (UTF8 )?

http://msdn2.microsoft.com/en-US/library/f52hswkf.aspx

Gruss,
Gregor

13.08.2007 - 09:51 Uhr

// Problem durch eine Spielerei gelösst, siehe weiter unten

Guten Morgen,

am nachfolgenden Problem sitze ich nun rund vier Tagre und habe so etwa alles an Ressourcen im Web zusammengetragen und durchgetestet.

So nun zum Problem: Ich habe eine Basisklasse für ein MDIContainer Form (BaseMainForm nennt sich des zum Beispiel) und dieses enthält ein "basis" Menü und Toolbar (MenuStrip, ToolStrip, da .NET 2.0). Jetzt leite ich von diesem "BaseMainForm" ab und erstelle ein "DerivedMainForm" (als Beispiel). In diesem habe ich jeweils ein weiteres Menü und eine weitere Toolbar, welche die spezifischen Menüeinträge enthält. Da ja von haus aus diese Menüs / Toolbars vereinigt werden, verwende ich ToolstripManagaer.Merge(). Funktioniert an sich wunderbar.

Jetzt wirds spannend. Da ich zum Beispiel das Filemenü immer brauche ("open project", "save project", etc.) egal, was für ein MDIChild offen ist, dachte ich sollte es ja gehen, da ich ein Merge gemacht habe und die Children ihre eigenen Menüs einfach einfügen und alles funktioniert. Leider falsch gedacht.

Sobald ein Child aufgeht (hat ebenfalls eine Toolbar und ein Menü das durch des implizite "mergen" beigefügt wird), verschwinden die einträge im MenuStrip, die von der abgeleiteten Klasse eingefügt wurden. Die Einträge in der Toolbar bleiben und werden nur erweitert 🙄

Im Anhang des komplette Beispielprojekt 😉 Vielleicht hat ja einer eine Lösung. Kurz zusammengefasst, was ich erreichen will:
Wenn ich die Applikation starte und ein MDIChild öffne, soll im MenuStrip die Einträge der Basisklasse, der abgeleiteten Klasse und des MDIChild enthalten sein. So wie es auch beim Toolstrip ist.

Dieses "Workaround" mit dem OnPaint und OnMdiChildActivate sind dazu nötig, dass das Menü wieder den "alten Stand" hat (also das Menü der Basisklasse und der abgeleiteten Klasse wieder zusammen sind), wenn alle MDIChilds gechlossen sind. Ist wirklich nicht schön aber eigentlich das sauberstwe was es gibt.

Gruss und Danke,
Gregor W.

// edit
Habe nach einem kleinen Test die Lösung wohl gefunden. Ich glaub peinlicher geht's nicht mehr!

Die lösung is der folgende Code im DerivedMainForm:

protected override void OnMdiChildActivate(EventArgs e)
        {

            base.OnMdiChildActivate(e);

            if (this.ActiveMdiChild != null)
            {
                ToolStripManager.Merge(this.menuStripDerived, this.menuStripBase);
            }
            else
            {
                mdiChildRemoved = true;
                this.Invalidate(new Rectangle(0, 0, 1, 1));
            }

        }

Einfach noch ein extra Merge machen. Ohje *sich in die Ecke stell mit einem "Looser" Hut".

29.04.2007 - 11:41 Uhr

Ich persönlich arbeite zu hause mit HP Business (einfach die Teuren, ich habe den HP LP2065 zweimal) - bin an sich wirklich zufrieden.

Empfehle Dir aber auch zu überlegen mit zwei Bildschirmen zu arbeiten - ist wirklich sehr toll und man hat mehr Platz und Übersicht.

Gruss,
Gregor

20.04.2007 - 21:30 Uhr

Also bei deinem Beispiel sehe ich bei beidem kein grosses Problem. Es ist an sich oft schwer zu sagen, wie viele Methoden verschachtelt sein sollen ineinander. Die Regel die aber oft gesagt wird: Eine Funktion (hier Methode) pro Zeile... Aber auch öfters: Eine Aufgabe pro Zeile... Njo muss glaub ich jeder für sich entscheiden wie weit man es verschachtelt. Ich denke aber mehr als zwei Methoden ineinander sollten es nicht sein!

Gruss,
Gregor

20.04.2007 - 09:20 Uhr

Wie Ikaros bereits gesagt hat, würde ich es ganz normal behandeln, nur ohne einen Konstruktor aufruf (wäre ja Falsch, da Du keinen machst).

Bezüglich der Bezeichnung des Objektes bzw. der Klasse:
Normalerweise machst ja: meinObjekt: MeineKlasse
in deinem Fall würde, wenn mich jetzt nicht alle Sinne täuschen, folgendes stimmen: :MeineKlasse

Gruss,
Gregor

19.04.2007 - 11:11 Uhr

Es tut mir echt leid und für den Fall, dass ich als Spammer abgeschrieben werde - es ist auch egal.

Muss einfach sagen, dass dieses "Projekt" wirklich super ist! Habe schon sehr viele interessante Dinge gefunden, getestet und mit ihnen rumgespielt. Super! Durch solche Sachen lernt man wirklich extrem viel... es wird sicher auch noch der Moment kommen, an dem ich das BlogBook zur Problemlösung zur Hand nehme.

Macht weiter so!

Gruss,
Gregor W.

18.04.2007 - 14:42 Uhr

Also derzeit bin ich einfach nur geblendet von diesem coolen 8) VS05 Feature:

(Ich garantiere, dass nix geändert oder manipuliert wurde unter VS was irgendwie nur im entferntesten mit dem Codehighliting or so zu tun hat 😄:D... Ist irgendwie leicht Retro oder so ... naja auf jedenfall BUNT 👍)

und so @ home:

Gruss,
Gregor

18.04.2007 - 13:38 Uhr

Also


if (valid)
{
// ...
}
else
{
// ...
}

Brauchst keinen Kommentar like "Eingabe richtig", da eigentlich bei IF's des selbstsprechend sein sollte, besonders bei deinem einfachen Code mit "if(valid)" -> liest sich wie "ist gültig" - also alles klar, braucht keinen Kommentar 🙂.

Bei Methodenkommentaren würde ich die XML Kommentarnotation empfehlen, also mit

///<summery>...</summery>

etc. Das ist besonders wenn mit VS arbeitest sehr praktisch und schnell gemacht. Entspricht auch einem festen Standard, somit ist es jederzeit in eine Dokumentation umkonvertier bar.

if (_correctInARow > 0 && _correctInARow % 2 == 0)
_intervalCurrent = _intervalCurrent / 2;

Ist jetzt geschmackssache, aber ich persönlich würde immer bei jedem IF die geschweiften Klammern verwenden. So ist einfach wirklich 100%ig klar was zur IF gehört... Find ich persönlich besser und ist bei uns in der Firma sowieso "Pflicht".

// Hintereinander richtig

Kann sein, dass es Leuten klar ist, die sich in deinem Code auskennen, mir erscheint es aber auf den ersten Blick als unklarer Kommentar - kann mich irren 😁

Joa, mehr finde ich grad nicht. 👍Aber sieht wirklich schon gut aus, so hast Du zum Beispiel Sachen zusammengefasst in Blöcke (getrennt durch leere Zeilen) und co.

Gruss,
Gregor

18.04.2007 - 08:41 Uhr

Original von Lion1984
@ Gregor, darf ich deinen suchbegriff wissen?

Firmengeheimnis 8)

Nene Scherz bei seite. Wenn Du Programme für USB Stick und so suchst empfielt sich das Wort "portable" sehr gut : ) Habe nach "sharpdevelop portable" gesucht, natürlich alle Sprachen (halt wegen den englischen Seiten) und glaubs auf der 1., 2. oder 3. Seite war der Treffer. Gibts auch einige Forenbeiträge zu dem Thema bereits im Web.

Gruss,
Gregor

17.04.2007 - 22:31 Uhr

Hehe, na immerhin hab ichs ja fix gefunden ^^ und man kann nicht alles auf einmal finden 😁

Gefunden übrigens über Google -> http://portableapps.com/node/6010 -> oberer Link. http://portableapps.com/ <-- Kann ich an sich empfehlen, gibt's viele Applikationen, die für Entwickler USB-Sticks auch nützlich sind =)

Gruss und schönen Abend,
Gregor Wegberg

17.04.2007 - 22:13 Uhr

Ein wenig Googlen hilft doch immer noch am Meisten:
http://sts.bkukr.de/l-davoss/blog/default.aspx?BlogId=21

Gruss,
Gregor

31.03.2007 - 17:51 Uhr

Im Büro und auch privat verwende ich VS2005, englisch, Professional Edition. Privat hatte ich glück durch die schweizer Codezone Seite noch eine ISO zu bekommen und einen Key.

Habe aber auch schon #D getestet und kann nur zustimmen, für den Preis ( 😁 ) ist es wirklich sehr gut.

29.03.2007 - 20:38 Uhr

herbivore,
hast recht, habe ein Wort unterdrückt beim lesen:

um zwischen 2 möglichen Werten für eine Variable zu unterscheiden.

Dann ist natürlich ein if besser 🙂

Aber wenn es mehr als zwei Werte sind und wenn diese mit einem switch abgearbeitet wird, ist ein default stehts sinnvoll, so lange es rein theoretisch möglich wäre, dass es bis zum default durchkommt. Geht ja alleine um defensive Programmierung 🙂

Gruss,
Gregor

29.03.2007 - 19:14 Uhr

Beide als case und ein default, welcher eine Exception wirft.

Grund: default immer machen, da unerwartete Werte meist was schlechtes sind und somit brauchst nen default, welcher ne Exception wirft und zwei cases für deine zwei Werte.

Gruss,
Gregor

29.03.2007 - 16:28 Uhr

Also das mit dem Modifier "Friend" musst Du mir nochmals zeigen, kenne da keinen solchen Modifizierer und habe den auch nicht 🙂.

Das "Problem" dreht sich darum, dass ich eigentlich mit dem Designer arbeiten will. Der Merge Vorgang bei MDIs ist sehr praktisch und erspart mir so einiges an Kopfarbeit. Theoretisch könnte ich es im Code einbringen, dass die richtigen Elemente hinzugefügt werden etc. Nur sind diese dann nicht mehr mit dem Designer editierbar und ich habe ein etwas unangenehmen zusammenschluss von effektiver Business Logik in der Klasse und dem erzeugen etc. der Komponenten. Ich könnte es zwar in die .Designer.cs - Datei legen. Die meisten Entwickler sind aber gewohnt, dass diese Datei wirklich nur vom Designer verwendet wird und würden dort kaum nach möglichen Fehlern suchen ^^.

Naja entweder es gibt eigentlich ne Möglichkeit nen merge zu machen oder nicht. Habe nähmlich nochmlas mit den Modifieren gespielt und es geht nicht, aber es ist ja auch logisch. Das geerbte Menü ist in der BaseForm codiert, da kann ich nicht einfach in einer abgeleiteten Form anfangen neue Items einzufügen. Darum wäre es eben toll, wenn ich ein zweites Menü in die abgeleitete Form lege und dieses mit dem geerbten verbinde (Merge). Wäre für mich und auch in den Augen von mir halt die sauberste Lösung. Wenns nicht geht werd ich eine entsprechende Schnittstelle in mein baseform einbauen, welche es erlaubt die einzelnen Items möglichst sauber hinzu zufügen.

//Edit:
Unter "es geht nicht" versteh ich folgendes: Im Designer ist das Menü locked. Kann es somit nicht editieren 😉

Danke und Gruss,
Gregor

29.03.2007 - 15:36 Uhr

Guten Abend,
Ich habe folgendes Problem und suche seit gut zwei Tagen vergebens eine Lösung.
Wenn man ein MDI Parent und ein Child hat, kann man einen Menü-Merge machen und so das Menü des MDI Parents verändern.

Jetzt habe ich für meine Anwendungen ein "Base Form". Also eine Grundlagenform, welche ein Menü mit den wichtigsten Einträgen besitzt. Von diesem Form leite ich nun die konkreten Forms ab.

Beispiel:
[BaseForm] <|-- <<inheritance>> -- [Editor]
[BaseForm] <|-- <<inheritance>> -- [Hilfe]

Ich denke es ist klar, dass die Form "Editor" und "Hilfe" noch extra Menüeinträge brauchen. Nun zur Frage: Kann ich einen Merge für Menüs ohne ein MDI machen oder nicht? Wenn nicht, muss ich also direkt mit .Add(Control) arbeiten und die einzelnen neuen Elemente "von Hand" einfügen?

Freue mich auf Eure Antworten,
Gregor

25.03.2007 - 21:29 Uhr

Was mich besonders nervt:

1 Klasse für alles. Hört sich unglaublich an aber unter meinen Altersgenossen und die Leute aus meiner Klasse ist das sehr beliebt

Oder so tolle Variabelnamen wie "myDBConn1" "myDBConn2" "myLable2" "myBigLable33"...

die zwei Sachen erlebe ich sehr oft bei Leuten aus meiner Klasse und auch bei Lehrern, kann ich überhaupt nicht aushalten.

Weiterer Punkt: Inkonsistente Code Pattern. Mal sind die Methoden in der Kamelnotation, mal anderst, mal mit einem Verb am anfang, mal ist es nur ein Prefix. Das gleiche auch bei Instanzvariabeln etc.

Hoffe solche Sachen müsst ihr nie sehen! Sind wirklich Basics aber da ich es schon so oft gesehen habe, musste ich es einfach Niederschreiben. Sonst habt ihr ja bereits das Wichtigste genannt. Besonders Overkills sind böse 😉.

An meinem Code... hmmm... Vielleicht die miesen englischsprachigen Kommentare, Schreibfehler bei Variabeln weil ich einfach alles auf Englisch mache. Magische Zahlen, die ich öfters vergesse als Konstanten auszulagern oder noch weiter hoch...

Joa, Gruss,
Gregor

//Edit: Was schlimmes bei Andern vergessen: Sie schrieben Code den sie selbst nicht verstehen, sondern sich zusammengesucht haben übers Web, Bücher, etc. xD Das ist besonders schlimm wie ich finde 😁

03.03.2007 - 11:28 Uhr

_Original von X-Gamer_Kann man einen Editor für C in C# machen???

Irgendwie würde ich mal seine Frage genauer lesen 🙂 Er fragt ob man einen C-Editor (was des auch immer sein soll bzw. können soll) in C# programmiert werden kann. "Für C in C#" 😉

Gruss,
Gregor

02.03.2007 - 21:37 Uhr

Kann man einen Editor für C in C# machen???

Jap! Ein Editor ist nichts anderes als ein Textbearbeitungsprogramm und somit nichts besonderes und machbar.

Oder gibts es schon einen?

Für C kenne ich keinen, wobei es sicher welche gibt die einfach Codehighliting unterstützen. Ein "C Editor" so wie Du es wohl verstehst, nennt man eine IDE (Google, Wikipedia, hier suchen...)

Kann mir vllt jemand helfen einen zu machen??

Ich nicht, ausser Du hast konkrete Fragen, welche Du hier im Forum stellst.

Gruss,
Gregor

02.03.2007 - 16:31 Uhr

Original von DarKlajid
Was hat Plug & P[lr]ay mit "Standardtreibern" zu tun? Anyway, wir sind uns einig dass er einen Treiber braucht und es nur als Laufwerk ansprechen kann/will.

Wikipedia
Plug and Play (englisch, „Einstecken und Spielen“, „Anschließen und loslegen“), oder auch Plug 'n' Play oder Plug&Play ist ein Begriff aus dem Gebiet der Computertechnologie, mit dem man die Eigenschaft eines Computers beschreibt, neue Geräte – meist Peripheriegeräte – anschließen zu können, ohne anschließend Treiber zu installieren oder andere Einstellungen vornehmen zu müssen. ... und weitere, die man per Google und co. findet.

Meines Wissens nach hast Du ja kaum einen "USBStick Treiber" auf deinem USBStick. Welcher sich auch noch automatisch installiert beim Einstecken. Also wird ein standard Treiber genommen, welcher einem Standard / Abmachung entspricht und schon funktionierts. Mindestens so lange sich die Hersteller an diese Abmachungen halten, sonst müssen sie eben nen Treiber nachliefern. So versteh ich es nunmal, könnte mich irren. (Es gibt übrigens wirklich USBSticks die spezielle Treiber brauchen für extra Funktionen oder einfach auch so ohne wirklich ersichtlichen Nutzen.)

Sonst, wie es herbivore gesagt hat: Ohne nen Treiber vom Hersteller selbst oder an sich ohne Treiber wird das Unterfangen sehr schwer.
// Edit: Bissl an der Rechtschreibung gefeilt

02.03.2007 - 16:16 Uhr

Also USBSticks sind meist Plug&Play, somit wird ein standard Treiber verwendet. Dieser macht aus dem Stick ein normales Laufwerk. Also sehe ich kein Problem auf dieses Laufwerk zu schreiben 😉

Wenn Du aber so lustige geschichten machen willst, wie auf einen Datenträger zu schreiben, welcher unter Windows keinen Treiber hat und somit eigentlich keine Kommunikation zwischen OS und dem Gerät stattfinden kann... Naja ich denke und hoffe, dass Du dies nicht vorhast 😉

Gruss,
Gregor

01.03.2007 - 16:35 Uhr

Habe durch Schule und Arbeit eigentlich praktische Erfahrungen mit Klassen-, Sequenz- und Use-Case-Diagrammen.

Gute, praxis nahe Beispiele kenne ich auch kaum, es ist auch eigentlich schwer welche zu machen. Jedes Beispiel was nicht Deinem Problem entspricht, wird für Dich vielleicht nicht praxisnah erscheinen.

Zum Teil helfen Patterns mit den dazugehörigen Diagrammen [1]. Sind aber meist, logischer weise, auch meist Klassendiagramme.

Use-Case-Diagramme haben was böses an sich für Entwickler, wir denken zu schnell an die Implementierung. Eine Möglichkeit dem zu entgehen ist sich den User vorzustellen, welcher vor dem Fertigen Programm sitzt. Ich nehme jetzt ein Textbearbeitungsprogramm (MS Word / OpenOffice / oä.):
Wenn ich dieses Programm verwende weiss ich ganz klar, welche Funktionen mir zur Verfügung stehen. Ich kann einen Text manipulieren (schreiben, ändern, etc.), einen Text korrigieren, einen Text drucken. Die kursiven Sachen sind alles Use-Cases (dargestellt durch eine Elipse). Ich als Benutzer (Akteur) verwende diese Use-Cases (ich löse ein Erreigniss aus. z.B.: Ich öffne eine Textdatei, oder ich habe den Wunsch etwas zu drucken).

Du musst dir ein Use-Case (Elipse!) als eine Sammlung von Methoden, Klassen, etc. vorstellen. Es ist nur ein oberbegriff, so redet der Laie ("Ich kann einen Text schreiben mit einem Textverarbeitungsprogramm). Nichts anderes bildet ja ein Use-Case-Diagramm meist ab.

Jetzt gibt es noch Geschichten wie Include, Exclude und Vererbung.
Eine Include Bindung besagt, dass ein Use-Case ein anderes Use-Case immer gebraucht und auch der Erfolg vom andern Use-Case abhängt. So kann das eine Use-Case nur erfolgreich enden, wenn auch das "includierte" Use-Case korrekt abläuft.
Bei einem Exclude haste was ähnliches wie ein Include, nur gibt es hier eine "Condition" (Regel?!). Wenn diese Condition zutrifft, wird aus dem Exclude ein Include und sonst, wenn die Condition nicht zutrifft, wird das Use-Case nicht ausgeführt, welches mit Exclude verbunden wurde.
Vererbung ist denke ich relativ klar. Ein Use-Case oder der Akteur erbt alles von seinem "Vater" (auch die assoziationen zu Akteuren / Use-Cases, also einfach ALLES).

Naja soweit ist mein Verständniss. Sonst gibts aus einem Buch ein Probekapitel genau über Use-Case-Diagramme [2].

Ein Use-Case-Diagramm kann übrigens beliebig viele Systeme, Use-Cases, Akteure haben 😉 Man kann auch verschiedene Ansichten auf ein System machen mit einzelnen Use-Cases. Das geht an sich mit fast allen UML Diagrammen soweit ich weiss. Eine Ansicht wäre dann nur eine Gruppe von Use-Cases. Zum Beispiel die Ansicht "Text schreiben". So kannst Du dich im Use-Case nur auf das schreiben von Texten orientieren und nicht an allen Funktionen die ein Textbearbeitungstool hat 🙂

Und naja das ganze habe ich zum grössten Teil mit dem Buch "UML 2.0" von Galileocomputing gelernt... Falls es mal anschauen willst 😉 [3]

[1] Sorry finde grad die gesuchte Seite nicht. Einfach mal in Google nach "Pattern" suchen 🙂
[2] Einfach das Probekapitel anschauen: www.jeckle.de/uml-glasklar/
[3] http://www.galileocomputing.de/katalog/buecher/titel/gp/titelID-1142?GalileoSession=88217270A2-XR8YhdwE

Weitere Links:

Gruss,
Gregor

p.s.: Will nochmals ganz klar sagen, dass ich so Use-Case-Diagramme verstehe. Habe eigentlich auch viel darüber gelesen, aber man weiss ja nie...

01.03.2007 - 15:51 Uhr

Original von hurricane
Außerdem kann eine Hausnummer auch Zeichen beinhalten (z. B. 2b) und sollte deswegen eher vom Typ string sein 😉

Würde mit solchen Aussagen vorsichtig sein. Es gab mal einen sehr guten Artikel zum Thema "String der Superdatentyp" in einer Fachzeitschrift den ich nicht wiederfinde (den "Titel" habe ich jetzt so aus dem Kopf geschrieben, also ist nicht der Echte aber der Sinn ist der Gleiche gewesen). Man kann an sich alles mit einem String abbilden. Darum sollte man stehts überlegen ob man doch nicht lieber einen eigenen Typ macht. Kenne einige Programmierer die genau bei diesem Thema mit der Hausnummer (und der ganzen Adresse) einen eigenen Typen geschrieben haben, der alles schön sauber trennt.

Aber im grossen und ganzen hast Du recht. Für den normalen Programmierer wird die Hausnummer als string reichen. Wollte trotzdem hier nochmals andeuten, dass ein String was schönes und tolles ist, doch man sollte ihn nicht überstrapazieren 😉

--

Die sache mit den Konstruktoren würde ich wirklich so machen wie es herbivore gemacht hat. Es ist einfach sauberer und erfordert weit aus wenniger änderungen im späteren Verlauf.

// Edito, muss mich entschuldigen. Habe den Beitrag von Anke nciht richtig gelesen bzw. nen Wort vertauscht ^^. Für ne Hausnummer reicht nen String natürlich föllig aus. Haben den Beitrag entsprechend versucht noch zu editieren, also sorry.

Gruss,
Gregor

01.03.2007 - 15:40 Uhr

Ich glaube schon, dass es noch um Dein Thema geht.

  1. Mach ne ISO-Datei mit deinen Daten
  2. Holl Dir Daemon-Tools oder ähnliches Programm zum ISO-Dateien als CD/DVD Laufwerk anzuhängen (gibt es ebenfalls von Microsoft sogar ein kleines GUI Programm dazu, dass ich grad nicht finde)
  3. Du hast jetzt nen "normales" CD-Laufwerk und kannst machen was Du willst.

Es gibt übrigens für Dein "Problem" mit der Musik auch andere Wege und Programme. Muss aber ehrlich sagen, dass ich die aktuelle Rechtslage net durchblicke etc. und somit mich dem Linken der Entsprechenden Artikel und Programme enthalte 😉

Gruss,
Gregor

25.02.2007 - 16:27 Uhr

Wirklich sehr professionelles herangehen.

Genau sowas erwarte ich von einem IT Board!

Weiter so und hoffen wir mal, dass diese Probleme nicht erneut auftauchen (It's not a bug, it's a feauture 😄)

Gruss,
Gregor

25.02.2007 - 12:24 Uhr

Original von herbivore
Hallo ben,

ich würde als - wie du es nennst - Erfahrener die Reihenfolge private Variablen, Konstruktor, Properties und Methoden vorziehen. Begründen kann ich das aber nicht fundiert.

herbivore

Stimm ich voll und ganz zu. Ich programmiere zwar alleine derzeit an einem Projekt in der Firma (Azubi), das Programm wird aber später durch andere Mitarbeiter weiter geschrieben und ich achte sehr auf den Codestil.

Die Reihenfolge die herbivore geschrieben hat ist allgemein gültig und wird soweit ich weiss auch von Microsoft empfohlen (Soweit ich die Sampels von MS sehe). Sonst gibt es sehr viele Codestil Vorschläge für C# und andere Programmiersprachen. Auch gibt es allgemein gültige Regeln.

Zum Beispiel über Google auf dieses PDF gestossen: http://www.bellware.net/documents/CSharpCodeStyleGuide_v1.2.pdf (über http://geekswithblogs.net/sbellware/archive/2005/04/10/28921.aspx) zwar wird hier die Reihenfolge nicht beschrieben, wie ich des auf den ersten Blick sehe, aber eben, die Reihenfolge würd ich so machen wie herbivore gesagt hat 🙂

Und wenn es wirklich grosse Klassen sind, kannst du noch mit "#region" die Methoden und Properties in Gruppen aufteilen.

Was aber immer hilft, ist den Code von Programmen anzuschauen, welche von mehreren Entwicklern geschrieben werden oder von Leuten mit "Bröttchen-Verdien-Erfahrung" 😁

Gruss,
Gregor

//Edit: Habe die Letzte Antwort nicht gesehen:

Original von BogSTEF
ich bin auch recht neu und ich habe folgenden klassenaufbau

  
class test  
{  
     //private Variablen  
  
     //public Konstruktoren  
  
     //public Methoden  
  
     //public Proberties  
  
     //private Methoden  
  
     //private Proberties  
}  
  

falls Konstruktoren/Methoden/Proberties überhand nehmen, teile ich sie in regionen.

Auch keine schlechte Idee denk ich. Wie ich auch schon geschrieben habe, ich würde "#region" einsetzen. Besonders bei grossen Klassen finde ich es ungemein praktisch (gibt aber auch Leute die es nicht mögen).

BogSTEF, ich würde einfach überlegen, ob es nicht sinn macht, dass du alle Methoden beisammen hast und auch die Properties zusammen sind. Also in dieser art: (Übrigens, Klassen werden eigentlich mit einem Grossbuchstaben geschrieben... Auch macht es mehr sinn zuerst die Properties zu schreiben und erst dann die Methoden... Ist einfach irgendwie üblicher so nach meiner Erfahrung.


class Test
{
     //private Variablen

     //public Konstruktoren

     //public Properties

     //private Properties

     //public Methoden

     //private Methoden
}

25.01.2007 - 10:43 Uhr

Hallo,
Danke erstmal für die Antwort.

Habe jetzt nochmals bis anhin rumgeklickt, getippt, gesucht und versucht und ich glaub ich hab des Rätsels lösung. Also als erstes kann ich eine .setting file einfügen. Diese kann ich mit dem eingebauten Editor visuel bearbeiten ohne XML tippen zu können. Hinter der .setting Datei liegt eine Klasse die mir den Zugriff auf die Daten erleichtert. Sobald ich erste werte in der .setting eingefügt habe wird eine app.config generiert, die die entsprechenden XML Daten enthält.

So erstmal das. Jetzt muss ich noch schaun, dass beide Dateien im "Ordner" Properties liegt und schon kann ich sehr gemütlich darauf zugreifen wie es mir scheint 🙂

Auf die ganze geschichte kann ich nun über [MeinNameSpace].Properties.[dateiname der .settings Datei ohne erweiterung].Default.[eigene Settings] auf den Wert zugreifen und setzen. Wenn ich den Wert vom standard Wert ändere und über save() speichere wird schön lokal für den Benutzer wie es in den Dokus steht geschrieben. Also schlussendlich hattest Du recht "Jack30lena", ich brauche schlussendlich eine configuration. Die .setting-Datei erlaubt es mir wohl nur etwas komfortabler zu arbeiten.

Gruss,
Gregor W

25.01.2007 - 09:08 Uhr

Guten Morgen,

Ich kämpfe seit gut drei Tagen am Namespace System.Configuration.. Mein Ziel ist eigentlich richtig simpel und irgendwie auch peinlich, dass ich es nicht hinbekomme. Also ich will bestimmte Settings für jeden User speichern können. Also Usersettings mit einem Scope auf "User". Soweit so gut. Die .settings-Datei erstelle ich mit dem Designer von VS.

Jetzt möchte ich an den Wert herankommen, denn ich erstellt habe und hier scheitere ich kläglich.

Ich habe es zuerst mit dem Artikel zu den Settings versucht, leider kriege ich auf den dort beschriebenen Wert nichts hin. Genauer gesagt ich kann nicht auf [MeinNameSpace].Properties.Settings zugreifen. Auch die restlichen Forenbeiträge die "Setting" enthielten habe ich alle (und da könnt ihr mir wirklich glauben) durchgeschaut. Ich könnte hier jetzt ne Linkliste machen, der Seiten die ich angesehen habe. Ich versteh einfach noch nicht den tieferen Sinn der vielen Klassen und wie ich ans Ziel komme. (Habe auch die Artikel die in der MS VS05 Hilfe stehen durchgelesen aber ich komme einfach nicht zu einem funktionierenden Code).

Nachfolgend die einzelnen Codestücke die ich habe.

user.settings

<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="LogTrans.GUI" GeneratedClassName="user">
  <Profiles />
  <Settings>
    <Setting Name="Setting" Type="System.String" Scope="User">
      <Value Profile="(Default)">Test</Value>
    </Setting>
  </Settings>
</SettingsFile>

app.config (wurde automatisch durch die IDE erstellt, nachdem ich die user.settings erstellt habe)

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="LogTrans.GUI.user" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
        </sectionGroup>
    </configSections>
    <userSettings>
        <LogTrans.GUI.user>
            <setting name="Setting" serializeAs="String">
                <value>Test</value>
            </setting>
        </LogTrans.GUI.user>
    </userSettings>
</configuration>

Ich habe derzeit keinen eigenen Code, da ich sehr viel versucht habe (LocalFileSettingsProvider, ApplicationSettingsBase, etc. pp.)

Hoffe auf mögliche Ideen und Links (ich lese mich auch gern durch empfohlene Artikel durch),
Gregor W.

31.12.2006 - 14:35 Uhr

Wünsche auch allen ein schönes neues Jahr, schönes Fest und einfach viel Fun ^^

Bis bald, im neuen Jahr,
Gregor

28.12.2006 - 15:53 Uhr

Ich setz mich mal zur "Bröttchen Fraktion". Bin im 2. von 4 Lehrjahren bei der Schweizer Börse als Entwickler in der Ausbildung.

Früher gehörte ich auch zur Hobby Fraktion und habe es als Hobby gemacht.

In der Schule haben wir bis jetzt C und aktuell Java, aber alles so sehr auf Grundlagen bezogen, dass ich eigentlich schlafen könnte...

In der Firma haben wir C# und privat bin ich mit Java und C# beschäftigt ^^

Joa,
Gruss Gregor

26.12.2006 - 22:21 Uhr

Zuerst einmal was ist ein IPod "MP x10".

Zweitens: Bei C# (und nicht "cShar", wenn schon "csharp" oder was in der Art) redet man nicht von "Scripts" und "scripten".

Drittens: Wie schon gesagt, .NET Framework gibt es keins für einen normalen Apple IPod.

Tipp: Schau nach was .NET ist, was ein Framework ist und Google oder was in der Art gebrauchen.

Gruss,
Gregor

p.s.: Ich sollte zwar wahrscheinlich auch nicht zu laut darüber reden, aber lies mal deine Beiträge nochmals durch, bevor Du sie abschickst.

02.12.2006 - 11:55 Uhr

Such mal bei Google nach "UltraMon". Des Programm entspricht deinen Wünschen, aber funktioniert leider nicht mit allen Applikationen.

Gruss,
Gregor

06.08.2006 - 12:13 Uhr

wie "inTrance" bereits sagte müsstest du eine extra Anwendung zwischenschalten. Es gibt aber auch die Möglichkeit dein Programm in einzelne Module aufzuteilen und diese als .dll Dateien zu haben. Diese könntest Du auch aus dem Hauptprogramm selber ersetzen (wenn ich mich jetzt nicht total irre).

Schlussendlich wirst Du aber nicht um ein kleines Programm kommen, welches die Updates runterläd, die Dateien ersetzt und dann das Programm selber startet. So am Rande: Ich würde nicht bei jedem Start nach einem Update suchen sondern der User sollte entscheiden wann er nach nem Update suchen will 😉

Gruss,
Gregor W.

27.03.2006 - 14:57 Uhr

Kurz gesagt, ich glaube die obige Person verwächselt was mit C# / Windows Forms / .NET / etc. Ich glaube ein einfaches Buch das sich auf die Sprache C# konzentriert wäre Sinnvoll, da fählt meiner Meinung nach ganz klar das Basis Wissen.

Und ja man kann eine simple .cs File mit Code erstellen, mit einem beliebigen Editor und diese durch den Commandozeilen "Compiler" laufen lassen - fertig.

Gruss,
Gregor W.

18.03.2006 - 18:50 Uhr

http://www.dotnetmagic.com/productDNM.html

Vielleicht hats dort ja was... Sonst GDI+ könnte wohl was sein, denke nicht das es sonst schon ein fertiges Controle dabei wäre bei VS

Gruss,
Gregor W.

16.03.2006 - 21:30 Uhr

Simple 2D Spiele - Klassiker: Pong, 4 Gewinnt, Snake, PacMan, etc. etc.

Sonst könntest ja ein Programm machen, welches verschiedene Tastenkürzel ermöglicht (dabei liegt sie im Hintergrund als TryIcon). Vielleicht ne kleine und simple Scriptsprache um die Befehle zu defenieren? Und ja ich weiss das es sowas schon gibt 🙂.

Sonst gibts die Standard Projekte wie RSS Reader etc. Verschiedene Datenbestände sammeln (Bücher, DVD, Video, etc. Sammlung). Mediaplayer, Playlistgenerator, ...

Ja das ist so was mir jetzt einfallen würde

Gruss,
Gregor W.

p.s: Wünsch Dir gute Besserung 😉

//Nachtrag:

  • Programm, das bis zu einer bestimmten Tiefe die Files und Ordner ausliesst und dies als .doc / .html / etc. exportiert.
  • Ein Programm das zwei Dateien vergleicht und die unterschiede zeigt
  • Einen eigenen Bot, welcher wie ein Suchmaschienenrobot funktioniert. Also Du sagst dem irgend eine Webseite und er filtert alles wissenswerte aus und speichert das zum Beispiel in eine XML oder DB. Also halt so stichwörter merken, Bildertitel, Head - Tags, etc.
11.03.2006 - 20:31 Uhr

Also ich geh mal die Sache eher von der C Code Seite an:

unsigned char *testFunc(unsigned char *argA, unsigned char *argB, int *argC)

Du erwartest einen Pointer auf ArgA, ArgB, ArgC und gibst nen Pointer zurück.

In deinem C# Code sehe ich aber nur, dass Du einen Pointer erwartest aber nicht drei pointer auf a,b,c übergibst, sondern nur deren inhalt / wert.

ich könnte mir denken, dass der Aufruf eher so sein muss:

c = testFunc(&a, &b, &c);

und ganz oben:

public static extern unsafe string testFunc(string* argA, string* argB, int* argC);

Kann sein das ich mich irre!

Gruss,
Gregor W.

//edit

02.01.2006 - 19:20 Uhr

Original von chritsch
Hallo Gregor

Microsoft bietet eine Webcast-Serie zum Thema
>
an. Vielleicht könnte das für dich interessant sein. Du musst dich aber anmelden.

Gruss
Hitsch

Die kenne ich alle schon 🙂 Aber von den 8 Webcasts (ich glaubs es waren 8), habe ich keine gesehen in der es um die Praxis geht (Habe nur die ersten 3 angeschaut und die Beschreibung der anderen)... Wenn Du weisst in welchem gezeigt wird wie man XML Files mit XMLDocument auswerten kan... hätt ich nichts gegen 😁

Gruss,
Gregor Wegberg

02.01.2006 - 17:50 Uhr

Danke für die super Antwort (noch dazu schön Kurz und klar 😄)...

Würde dann halt mal lieber was mit XMLDocument machen... mal schaun ob ich nen gutes Tutorial finde... noch siehts nicht rosig aus, aber wird sicher...

Danke nochma,
Gruss,
Gregor

02.01.2006 - 15:22 Uhr

Hallo,

Vorweg, im Gebiet XML bin ich ein grosser Anfänger (Noob / Dau). Wie eine XML aufgebaut ist weiss ich schon und ich kenne auch die W3C Spetzifikation, aber wie ich praktisch XML Dateien in C# auslese und schreibe ist mir immernoch ein Rätsel.

Wenn ich hier im Forum suche oder auch in Google und auf MSDN bekomme ich haufen Klassen die zwar irgendwie alle das Gleiche machen aber doch total verschieden sind.
Ehrlich gesagt, nach vier Tagen Reserche gehts mir so langsam auf den Sack 😦...

Darum wollte ich mal nachfragen ob mir jemand irgendwie nen schlauen Link zu ner Übersicht der einzelnen .NET Klassen geben kann, bei welchem ich auch die Vor- und Nachteile sehe bzw. Links zu Tutorials wo mir XML einlesen und schreiben im Praktischen Einsatz gezeigt wird.

Meine Idee ist es die einzelnen Einstellungen eines Projektes, an dem ich dran bin, im XML Format zu speichern. Besonders im Hinblick auf das vermehrte verwenden von XML würde es nicht schaden sich mit der Thematik zu befassen.

Also, vielleicht hat ja jemand Zeit und Lust mich in die Welt von XML etwas einzuführen, würde mich freuen.

Mit freundlichen Grüssen,
Gregor Wegberg

p.s.: Wenn was gutes hier rauskommt, könnte man es ja Rhuig in die FAQ legen... Würde sicher nicht schaden