Laden...

Forenbeiträge von SeeQuark Ingesamt 946 Beiträge

21.03.2009 - 16:50 Uhr

Hallo

Ich denke, es liegt an dem:

el = new Ellipse() { Name = string.Format("El{0}", (a + a).ToString()), Width = 30, Height = 30, Fill = new SolidColorBrush(Colors.Cyan) };
Grid.SetRow(el, a);
for (int b = 0; b < LayoutRoot.ColumnDefinitions.Count; b++)
{
    // Warum setzt du die Collums mehrmals?
    Grid.SetColumn(el, b); // b endet immer bei LayoutRoot.ColumnDefinitions.Count
}

So ein dummer Fehler 😁

Aber warum verwendest du dazu ein Grid?
Es gibt für solche Sachen bspw. ein Uniformgrid.
Mit den Properties Rows und Collumns kannst du die Zeilen und Spalten steuern und vor allem passieren solche Fehler nicht.
Dann haben alle Ellipsen standardmässig die gleiche Grösse.

Warum machst du das eigentlich in C#?

mfg
SeeQuark

21.03.2009 - 16:05 Uhr

Du musst die Animation auf die TranslateTransform anwenden.
Also etwa so:

var transform = this.ausfahren.RenderTransform = new TranslateTransform();
transform.BeginAnimation(TranslateTransform.XProperty,
    new DoubleAnimation(100, new Duration(TimeSpan.FromSeconds(2))));

MouseEnter ist imho schon das richtige. Als ich so etwas nachgemacht habe, habe ich nicht das Event vom auszufahrenden Panel genommen, sondern wie in VS etwas anderes (in diesem Fall wurde das TabControl zwecksentfremdet).
Ausgefahren habe ich aber mein Grid.

mfg
SeeQuark

21.03.2009 - 13:02 Uhr

Es gibt dafür eine MarginAnimation.
Für so einen Anwendungsfall wäre eine DoubleAnimation auf die TranslateTransform.XProperty das einfachste.
Wenn du die DockSuite nicht benötigst, empfände ich das als einen Overkill.

mfg
SeeQuark

20.03.2009 - 18:28 Uhr

Dabei gibt es folgendes zu beachten, dass ann werden aber auch beide immer neu kompilliert.
Dadurch dauert das etwas länger.

Ich finde die 2 VS-Instanzen aber praktischer.

mfg
SeeQuark

19.03.2009 - 21:32 Uhr

Mein Freund pdelvo war diesmal schneller (ich war abgelenkt).
Dennoch ist mein Post etwas genauer ^^

Also so schön finde ich den WinAmp nicht. Orientier dich eher an dem Mediaplayer 😁
Vermutlich ist das auch eher GDI+. Man kann mit GDI+ theoretisch alles machen, nur ist das Flackern dann extrem.
Deine Möglichkeiten sind ausserdem eher auf Spiele bezogen, denn mit XNA kann man imho nicht so einfach schöne Windows machen.
Für einen Player brauchst du einfach verschiedene Grafiken zu malen.
Mit MouseHover verändern die sich, etc.

Schöne GUIs sind imho aber am einfachsten mit WPF.
Die Einsteigerhürde ist da aber relativ hoch, dafür hast du praktisch unbegrenzte Möglichkeigen.
Da WPF das Fenster mittels DirectX rendert, ist mir noch kein Flackern aufgefallen.
Darum rendert es auch schneller.

mfg
SeeQuark

18.03.2009 - 18:14 Uhr

Hallo.
Siehe: Unterschied zwischen string und String
Dank der besseren Intellisence-Unterstützung habe ich mich für die in der Sprache C# festgelegte Variante (also kleingeschrieben) entschieden.
Die Methoden sollte ich dennoch besser mit der grossen Variante verwenden, aber eigentlich ist das nur ein theoretisches Problem.

wozu gibt es eigentlich das "Void" wo man es gar nicht verwenden darf [compiler heult] ?

Es ist für die Rückgabewerte der Funktionen gedacht.
Das einzige was man verwenden darf ist typeof(void).
Hab mich auch schon gewundert.

mfg
SeeQuark

18.03.2009 - 16:20 Uhr

Welchen meinst du?
Du kannst die ganzen Dialoge über P/Invoke einbinden.

Ein Beispiel: Using Windows Vista's TaskDialog API in managed code (C#) über Google findest du weitere Seiten.

EDIT: Man kann diese natürlich nur unter Vista verwenden. Für die anderen Betriebssysteme musst du Alternativen suchen.

mfg
SeeQuark

18.03.2009 - 16:17 Uhr

Bist du irgendwie auf .NET1.1 angewiesen, oder warum verwendest du eine ArrayList?

Vermutlich wird der Fehler wie in den MSDN-Foren erklärt mit den Referencen und structs zu tun haben.

Aber wie gesagt: Ab .NET 2.0 (C#2.0 und CLR 2.0) existiert dieses Problem nicht mehr, da du dann List<byte> verwenden kannst (oder ev. auf Int16Collection umsteigen).

mfg
SeeQuark

18.03.2009 - 15:54 Uhr

Hallo.

Was meinst du? Deine Application oder den Bildschirm?
Dann übernehme ich mal die andere Variante.

Die Umsetzung ist eigentlich relativ schwierig, da WinForms pixelorientiert ist.
Die einfachste Variante wäre nämlich, alle Steuerelemente einfach zu strecken.

Mit WPF geht das dagegen einfach: WPF Windows bzw. Seite komplett zoomen

Unter Winforms habe ich das aufwändig programmiert, kommt aber bei den Kunden gut an. Besonders bei Laptops mit Riesen-Auflösung und kleinem Bildschirm sieht man bei 8-Punkt-Schrift kaum was.

Eine einfache Variante wird es da wohl nicht geben.
Daher ist in WinForms vermutlich Fleissarbeit angesagt.

mfg
SeeQuark

17.03.2009 - 12:55 Uhr

Dann "glänzt" die Progressbar nicht mehr so schön.
Also das "weisse Etwas" schleicht nicht mehr rum.

Die Lösung im Snippet sieht so aus:
http://www.mycsharp.de/wbb2/attachment.php?attachmentid=6406

Die Schriftfarbe ist von ForeColor abhängig

Gehen tut es natürlich auch.

mfg
SeeQuark

16.03.2009 - 21:32 Uhr

Imho nicht. Da müsstest du erst einmal "das letzte Mal die Größe zuweisen" definieren.
Möglich dass du es mit einem Timer und WndProc irgendwie hinbekommst, aber ich fände es geschickter bei jeder neuen Grössenänderung erst unscharf und nach einer gewissen Zeitspanne dann scharf zu zeichnen.

Mit DoubleBuffered = true; dürfte das dann nicht mehr flackern.

Wie so etwas allgemein gehandhabt wird, weiss ich aber nicht.

mfg
SeeQuark

16.03.2009 - 18:32 Uhr

Hallo Briefkasten

Bin ich mit dem Interface auf dem richtigen Weg?

Ich hätte eher Commands verwendet.

Denn Events darf (sollte) man ja in WPF nicht normal machen, sondern mit den statischen Registrierungen und so.
Das klassische Event ist imho nirgens im WPF-Framework enthalten.

Und mit einem Interface ist das imho auch nicht möglich.

Rein vom Pattern her sind dafür Commands gedacht.

Jedoch kann man diese vermutlich auch nicht in einem Interface definieren.

this.CommandBinding.Add(new Command(...)); // oder so (rein aus dem Kopf)

Die Frage ist eher, ob das ein guter Ansatz ist.

mfg
SeeQuark

16.03.2009 - 15:51 Uhr

@Cnard: .{1,3} ist wohl nicht so ideal.
Ich hätte (?<=ID\s?[:,;_-]?\s?)\d{7} genommen.

Im Endeffekt macht das aber keinen grossen Unterschied mehr.

@Bakachan: Wenn man das "-" ganz am Anfang macht, geht das auch.

mfg
SeeQuark

15.03.2009 - 21:06 Uhr

[FAQ] Controls von Thread aktualisieren lassen (Control.Invoke)
Da steht alles weitere.

Den "Zugriff" darfst du nicht im DoWork-Event erledigen.

mfg
SeeQuark

15.03.2009 - 19:09 Uhr

ich habe mal geschaut mit dem if-Satz am ende (wo 6 zurückgegeben wird) werden von 40 versuchen bei ca 35 6 zurückgegeben.

Wenn ich das mit Papier und Bleistift (oder dem Editor g) durchrechne, sollte eigentlich immer 6 zurückgegeben werden.

Eine eigene Funktion dafür sollte eigentlich nicht mal nötig sein, da random.Next(1, 10); auf jeden Fall eine Zahl zwischen 1 und 9 zurückgibt.

nötig ist nur ein privater (statischer) Random.

Was möchtest du mit deinem Code eigentlich erreichen?

Entweder 6 und 10 bekommst du mit random.Next(2) == 0 ? 6 : 1; hin.

mfg
SeeQuark

15.03.2009 - 18:17 Uhr

Wenn du das wirklich nicht möchtest (aus welchen Gründen auch immer), kannst du mit dem Reflektor den Sourcecode kopieren.
Dann ist es auch frei änderbar, aber das kompillieren dauert unmerklich länger und deine Solution ist (vermutlich) auch im eine Datei gewachsen.

mfg
SeeQuark

15.03.2009 - 18:00 Uhr

Hallo!

Es sollte so nicht gehen, da nicht nur die Position der PictureBox berücksichtigst, aber du wissen möchtest, ob sie sich schneiden.
Das einfachste wäre da vermutlich, die [Rectangle.Contains(Rectangle)](http://msdn.microsoft.com/de-de/library/0kh3ee9e.aspx)-Methode zu verwenden.

Wenn du deine Klasse Wände etwa so veränderst:


public struct Wand
{
    public Wand(Point start, int länge, int dicke, Richtung richtung)
    {
        this = new Wand
        {
            Start = start,
            Länge = länge,
            Dicke = dicke,
            Richtung = richtung
        };
    }

    public Richtung Richtung { get; set; }

    public Point Start { get; private set; }

    public int Dicke { get; private set; }
    public int Länge { get; private set; }

    public Rectangle Rectangle
    {
        get
        {
            return new Rectangle(Start, Size);
        }
    }
    public Size Size
    {
        get
        {
            if (Richtung == Richtung.Horizontal)
                return new Size(Länge, Dicke);
            else
                return new Size(Dicke, Länge);
        }
    }
}
public enum Richtung
{
    Horizontal,
    Vertical
}

mfg
SeeQuark

15.03.2009 - 16:23 Uhr

ich möchte, dass man zum MenuItem ein eigenes UserControl hinzufügen kann, anstelle vom HeaderText.

Geht das nicht schon so?

<MenuItem >
    <MenuItem.Header>
        <RadioButton>hallo</RadioButton>
    </MenuItem.Header>
    <Button  >hallo</Button  >
    <ComboBox>hallo</ComboBox>
</MenuItem>

Dazu muss man doch nicht von MenuItem ableiten.

mfg
SeeQuark

14.03.2009 - 20:18 Uhr

Der WPF Date Time Picker von der AvalonControlsLibrary scheint recht gut zu sein (ist OpenSource).

Ob Microsoft so was plant weiss ich nicht, da, und das ist eigentlich schon die Antwort auf deine letzte Frage, ich praktisch noch nie eines verwendet habe.
Weder WinForms noch WPF.

mfg
SeeQuark

14.03.2009 - 19:45 Uhr

der von dir genannte Wert, ist zu groß, um in ein Byte konvertiert zu werden.

War auch nur ein Beispiel. Er ist sogar nur für einen int zu gross.

Dein Beispiel ist etwas schlecht gewählt. Meinst du den binären Wert dieser Zahl?

mfg
SeeQuark

14.03.2009 - 18:49 Uhr

bevor ihr mich jetzt auf den "WIe ich ein Event schreibe" - Links verweist, ...

Dem Namen nach, dürftest du diesen Link noch nicht gelesen haben [FAQ] Eigenen Event definieren / Information zu Events 😁
Im Ernst: Einen kleinen Fehler hast du noch. Die Methode public virtual void OnClick müsste nämlich protected sein. Aber egal.

Was sind das überhauüt für Objekte? Ein Control hat das Click-Event schon.
Meinst du geometrische Figuren auf einer PictureBox? Von was abgeleitet?


momentan prüf ich, ob auf so eine Figur geklickt wurde, indem ich den Click auf die Zeichenoberfläöche abfange und einfach alle Objekte per schleife durchlaufe und mit Contains() Die MousePos überprüfe;

Falls das wirklich "nur" geometrische Figuren sind, hast du imho keine andere Möglichkeit. Die Figuren werden dann ja in der PictureBox (oder einem Panel) gezeichnet und nicht selber.

Wie du die Figur am Besten herausfindest, die gecklickt wurde,solltest du in [Tutorial] Gezeichnete Objekte mit der Maus verschieben sehen.

mfg
SeeQuark

14.03.2009 - 18:36 Uhr

ich weiß nicht mal, ob ich das ganze noch einmal außerhalb einer Windows.Forms Umgebung benutzen werde. Insofern ist das jetzt vielleicht alles etwas viel Aufwand für ein theoretisches Problem, dass im Moment noch gar nicht besteht.

[...] aber letztlich benutzt du dort ja dann auch:
Application.OpenForms[0].BeginInvoke(_WorkCompleted);

In WPF lautet das Application.Current.Windows[0].Dispatcher.BeginInvoke(workCompleted);.
Das ist GUI-spezifisch festgelegt und etwas "allgemeineres" gibt es imho nicht, von daher kannst du das "theoretische Problem" nicht so einfach beseitigen.
Im Falle eines Falles dürfte das aber schnell umgestellt sein.

mfg
SeeQuark

14.03.2009 - 16:09 Uhr

Convert String to IntPtr & Convert String to Pointer

Bessere Suchwörter wären C# string IntPtr. C# kommt ja gar nicht in deinen vor.

Jedenfalls scheint das über mehrere Wege zu gehen, ein anderer wäre


// String zu IntPtr...
System.Runtime.InteropServices.Marshal.StringToHGlobalUni("hallo");
// ... und wieder zurück
System.Runtime.InteropServices.Marshal.PtrToStringUni    (  ptr  );

mfg
SeeQuark

14.03.2009 - 15:06 Uhr
<DasIstDasControlVonDemIchAbleite x:Class="DasIstDerNamespaceInDemIchArbeite.DasIstMeinControlDasVonEinemAnderenControlAbgeleitetWurde" ...>
    <!-- ... -->
</DasIstDasControlVonDemIchAbleite>
 public partial class DasIstMeinControlDasVonEinemAnderenControlAbgeleitetWurde : DasIstDasControlVonDemIchAbleite 

So klarer? Du musst beides ersetzen (Die Basisklasse in XAML und C#)

Verstanden?

mfg
SeeQuark

14.03.2009 - 14:55 Uhr

... dann ersetzte das Window durch das gemeinsame Haupfenster (bzw. durch das Basis-Control).

mfg
SeeQuark

14.03.2009 - 14:49 Uhr

Hallo. Das ist kein Attribute.
Wenn du zum Beispiel ein eigenes Window machst, dann sieht das so aus:

<Window x:Class="MyNamespace.MyWindow" ...>
    <!-- ... -->
</Window>

Im Code hast du dann stehen:

public partial class MyWindow : Window

...und es funktioniert.

Analog dazu geht es auch mit eigenen Controls.
Verlass dich nicht zu fest auf die IDE-Magie, auch wenn das extrem praktisch ist.

mfg
SeeQuark

14.03.2009 - 11:05 Uhr

Du kannst die LockBehinds auch einfach verschachteln:

(?<=(?<![Y\s])X\s)[a-zA-Z]+

Sehr performant dürfte dieser RegEx aber nicht sein.

Komisch, der Post von herbivore muss gekommen sein, als ich auf Antworten geklickt habe. Jedenfalls habe ich ihn nicht bemerkt.

mfg
SeeQuark

14.03.2009 - 10:58 Uhr

@marsgk: Das hatte ich auch mal probiert, ohne Erfolg.
Dann hatte ich einmal alle Windows-Nachrichten abgefangen:

if (m.Msg != 0xd &&     // WM_GETTEXT
    m.Msg != 0xe &&     // WM_GETTEXTLENGTH
    m.Msg != 0x318 &&   // WM_PRINTCLIENT
    m.Msg != 0x14 &&    // WM_ERASEBKGND
    m.Msg != 0x200)     // WM_NCMOUSEMOVE

    Console.WriteLine(m);

Jedenfalls war die einzige Windowsnachticht, die ich empfangen hatte die [WM_WININICHANGE](http://msdn.microsoft.com/de-de/library/ms725499(en-us).aspx). Und diese trat auch nicht regelmässig auf...

Vielleicht liegt das aber nur an Vista 😁

Die Methode von JAck30Lena funktioniert auch nur eingeschränkt.
Sie verhindert zwar den Bildschirmschoner nicht, aber setzt ihn wieder zurück, sollte er laufen.

Der Code:

var timer = new Timer();
timer.Interval = 1000; // Hier müsste man dann 100 hinschreiben.
timer.Tick += (s, e) =>
{
    Cursor.Position = new Point(Cursor.Position.X + 1, Cursor.Position.Y);
    Cursor.Position = new Point(Cursor.Position.X - 1, Cursor.Position.Y);
};
this.Disposed += (s, e) => timer.Dispose();
timer.Start();

Die Registerty-Variante ist vermutlich die beste, aber du solltest das auf jeden Fall wieder zurücksetzten, auch bei einem Absturz.

mfg
SeeQuark

13.03.2009 - 19:23 Uhr

Die "Progress-O-Doom"-ProgressBars gefallen mir nicht so. Sie ändern ihre Darstelung nicht pro Betriebssystem und in Vista passen die einfach nicht mehr rein.

Jetzt habe ich meine Progressbar etwas überarbeitet.
Sie sollte jetzt mit dem Designer besser zu bedienen sein und hat auch noch andere Funktionen. Text, der mithilfe der ContentAligment-Aufzählung plaziert werden kann und das grüne Etwas kann jetzt vorwärts und rückwärts laufen, hin und zurück pendeln und die Breite von ihm kann eingestellt werden.
Das wars glaub schon 🤔

mfg
SeeQuark

12.03.2009 - 20:44 Uhr

Warum willst du so was?
Ich finde zwar auch, dass man möglichst wenig Fenster wie Möglich verwenden sollte, aber was spricht dagegen, die AboutForm als Fenster anzuzeigen (wobei da sogar ShowDialog besser wäre).

Das Login-Panel hingegen würde ich wie in VS auf der Startseite im Stil von "Zuletzt geöffnete Projekte" machen, also auf der Form als echtes Control drauf (UserControl).

Wenn du nur den (eigentlich praktischen Fensterrahmen) weghaben willst, musst du nur

BorderStyle

auf FormBorderStyle.None (oder so) stellen.

mfg
SeeQuark

12.03.2009 - 20:23 Uhr

Hallo

Kannst du das, was du suchst, noch etwas genauer beschreiben?

Vielleicht suchst du etwas wie ein TabControl, aber das läuft auf Rätselraten raus.

Ich möchte eigentlich jetzt nur ein Form IN einem anderen Form anzeigen;

Ein Form ist und bleibt ein Form, also ein ganz normales Fenster.
Vielleicht suchst du auch UserControls.

Mach bitte genauere Angaben, was du suchst oder mache schnell ein Bild.

mfg
SeeQuark

12.03.2009 - 19:57 Uhr

Ich hoffe ich konnte mein Problem verständlich erklären 😃

Andersrum: Hoffentlich habe ich es richtig verstanden.

Gedacht hab ich mir das ganze so, dass wenn man das Programm startet einige Fenster/Boxen (Forms?) mit Dingen wie "letzte 5 Benutzer" a la Visual Studio 2008 anzeigt.

Das sind ListBoxen. Kannst du sogar mit Spy++ herausfinden.

Etwas wie in VS kannst du mit der DockPanel Suite erreichen.

Und was dabei noch ein Problem werden kann: [FAQ] Kommunikation von 2 Forms . Funktioniert analog dazu auch mit Controls.

die meisten Probleme bereitet mir die GUI-zeichnerei 😉

Ein gutes Tutorial dazu: [Tutorial] Zeichnen in Windows-Programmen (Paint/OnPaint, PictureBox)

mfg
SeeQuark

12.03.2009 - 19:23 Uhr

Wie hast du es genau hinzugefügt?

Die DLL habe ich einfach als eine lose Resource hinzugefügt und ein Verweis darauf gemacht.
Ist halt nur ein privates Projekt. Sonst würde ich das nicht so machen.
Aber immerhin funktioniert es getestet auf Skype ab Version 4.0.0.0.

mfg
SeeQuark

12.03.2009 - 19:04 Uhr

Ich habe das seperat gedownloadet und zu meinem Programm hinzugefügt.
Funktioniert einwandfrei

Vermutlich das Beste ist es, das so zu machen wie in Microsoft Visual C# 2008 Express Example Skype4COM beschrieben.

mfg
SeeQuark

12.03.2009 - 16:47 Uhr

Hallo.

Zeige mal, wie du das ausliest.

Auf jeden Fall ist das keine so gute Struktur für XML.
Denn die Tags sollten nur die Variable einleiten, aber keine Aussage über den eigentlichen Wert geben.
Die Werte werden innerhalb dieser Struktur dann gespeichert.

Es könnte etwa so aussehen:


<?xml version="1.0" encoding="utf-8" ?>
<settings>
  <IDs>
    <ID>2</ID>
    <ID>4</ID>
  </IDs>
  <BVAlues>
    <B ID="1">AAZgA0wDSAAJxAIA+gABGgHGAE0AAV</B>
    <!-- ... -->
  </BVAlues>
</settings>

Es gibt dafür extra die [****XML]-Tags

Bei dir sieht man auch nicht, was die einzelnen Werte darstellen.

So eine Struktur lässt sich auch einfacher einlesen.

mfg
SeeQuark

11.03.2009 - 21:37 Uhr

Hallo herbivore

Sicher könnte ich das machen, aber mir ging es um den einzelnen Gebrauch.

Ich erhielt eine PN von tomot.

hey. ich wollt dich noch was zu dem zeitvergleich fragen, dies aber nicht posten, weil herbi den thread ja eben zwischendurch auch gesperrt hatte, ka wieso.

wie verhälst sich die zeitmessung an abhängigkeit zur stringlänge? Wähle mal bitte einen String, der sagen wir mal, 200 Zeichen enthält. Das Ergebnis fände ich nun ebenfalls interessant.

Das habe ich jetzt auch gemacht.

[PRE]Mit Stringlänge:  100 braucht Variante B braucht um den Faktor 05.8 länger als Variante A.
Mit Stringlänge:  200 braucht Variante B braucht um den Faktor 04.3 länger als Variante A.
Mit Stringlänge:  300 braucht Variante B braucht um den Faktor 04.4 länger als Variante A.
Mit Stringlänge:  400 braucht Variante B braucht um den Faktor 04.6 länger als Variante A.
Mit Stringlänge:  500 braucht Variante B braucht um den Faktor 04.2 länger als Variante A.
Mit Stringlänge:  600 braucht Variante B braucht um den Faktor 03.8 länger als Variante A.
Mit Stringlänge:  700 braucht Variante B braucht um den Faktor 04.0 länger als Variante A.
Mit Stringlänge:  800 braucht Variante B braucht um den Faktor 03.8 länger als Variante A.
Mit Stringlänge:  900 braucht Variante B braucht um den Faktor 03.2 länger als Variante A.
Mit Stringlänge: 1000 braucht Variante B braucht um den Faktor 03.4 länger als Variante A.[/PRE]

Das Kompillieren scheint also viel Zeit zu brauchen, was bei stärkerer Anwendung nicht mehr so ins Gewicht fällt.

Aus reinem Interesse habe ich noch deine Variante getestet

[PRE]Mit Stringlänge:  100 braucht Variante B braucht um den Faktor 04.0 länger als Variante A.
Mit Stringlänge:  200 braucht Variante B braucht um den Faktor 03.7 länger als Variante A.
Mit Stringlänge:  300 braucht Variante B braucht um den Faktor 04.0 länger als Variante A.
Mit Stringlänge:  400 braucht Variante B braucht um den Faktor 03.4 länger als Variante A.
Mit Stringlänge:  500 braucht Variante B braucht um den Faktor 03.4 länger als Variante A.
Mit Stringlänge:  600 braucht Variante B braucht um den Faktor 03.4 länger als Variante A.
Mit Stringlänge:  700 braucht Variante B braucht um den Faktor 03.3 länger als Variante A.
Mit Stringlänge:  800 braucht Variante B braucht um den Faktor 03.3 länger als Variante A.
Mit Stringlänge:  900 braucht Variante B braucht um den Faktor 03.2 länger als Variante A.
Mit Stringlänge: 1000 braucht Variante B braucht um den Faktor 03.2 länger als Variante A.[/PRE]

Unter den Faktor 3.2 kommt RegEx wohl nicht.

Falls noch jemand interessiert ist:

for (int stringLength = 100; stringLength <= 1000; stringLength += 100)
{
    // Die Anzahl (wegen der Messungenauigkeit)
    const int anzahl = 100000;                  // Da mein Computer (relativ) langsam ist,
                                                // wurde die Konstante um eine 0 gekürzt.

    string text = "hallo" + new string('_', stringLength - 1) + '.';

    // Zeitmessung vorbereiten
    Process pc = Process.GetCurrentProcess();
    TimeSpan _1 = pc.TotalProcessorTime;

    // Variante A
    charArray(string.Copy(text), anzahl);       // achso: anderer methodenname
    TimeSpan _2 = pc.TotalProcessorTime;

    // Variante B
    regexDefault(string.Copy(text), anzahl);   // hier auch.
    TimeSpan _3 = pc.TotalProcessorTime;


    // Auswertung
    double faktorB = (double)_3.Subtract(_2).Ticks / _2.Subtract(_1).Ticks;
    Console.WriteLine("Mit Stringlänge: {0:4} braucht Variante B braucht um den Faktor {1:3} länger als Variante A.",
        stringLength.ToString().PadLeft(4), faktorB.ToString("#00.0"));
}

mfg
SeeQUark

11.03.2009 - 20:35 Uhr

Bist du sicher, dass das nicht gegen [Hinweis] Wie poste ich richtig? Punkt 1.1.1 verstösst?

Jedenfalls sind folgende Schreibweisen üblich:

for(;;) { /* tu wat */ }
while(true) { /* tu wat */ }

Die analog dazu funktionierende do-while-Schleife hat rastalt schon gepostet.

Gute gratis Online-Bücher wären da 🛈 und die 📗 .

mfg
SeeQuark

11.03.2009 - 19:30 Uhr

Mein Magengefühl 😁

Ich hatte jedoch Recht.

[STAThread]
static void Main()
{
    // Zeitmessung vorbereiten
    Process pc = Process.GetCurrentProcess();
    TimeSpan _1 = pc.TotalProcessorTime;

    // Die Anzahl (wegen der Messungenauigkeit)
    const int anzahl = 1000000;

    // Variante A
    myVariant(anzahl);
    TimeSpan _2 = pc.TotalProcessorTime;

    //Variante B
    regexVariant(anzahl);
    TimeSpan _3 = pc.TotalProcessorTime;

    // Auswertung
    double faktorB = (double)_3.Subtract(_2).Ticks / _2.Subtract(_1).Ticks;
    Console.WriteLine("Variante B braucht um den Faktor {0:3} länger als Variante A.",
        faktorB.ToString("#.0"));
}

private static void myVariant(int anzahl)
{
    for (int i = 0; i < anzahl; i++)
    {
        string myString = "hallo.hallo.";
        if (myString[myString.Length - 1] == '.')
        { // EDIT: Da war ein '_' :o
            char[] chars = myString.ToCharArray();
            chars[myString.Length - 1] = '_';
            myString = new string(chars);
        }
    }

}
private static void regexVariant(int anzahl)
{
    for (int i = 0; i < anzahl; i++)
    {
        string myString = "hallo.hallo.";
        Regex.Replace(myString, @"\.$", "_");
    }
}
Variante B braucht um den Faktor 14.3 länger als Variante A.

Falls ein Fehler drin ist, bitte melden.

Dennoch scheint meine Variante schneller zu sein 🙂

mfg
SeeQuark

11.03.2009 - 19:05 Uhr

Hallo. Du kannst dein Erscheinungsbild ja mit dem

ProgressBarRenderer

"zusammenschnippseln".

class MarqueeProgressBar : Control
{
    public MarqueeProgressBar()
    {
        timer.Tick += (s, e) => { x = (x + 1) % this.Width; this.Invalidate(); };
        timer.Interval = 10;
        timer.Start();

        this.Disposed += (s, e) => timer.Dispose();

        this.ChunksWidth = 100;

        this.DoubleBuffered = true;
    }

    private Timer timer = new Timer();
    private int x;

    /// <summary>
    /// Die Breite des Balkens
    /// </summary>
    [Description("Die Breite des Balkens")]
    public int ChunksWidth { get; set; }

    /// <summary>
    /// Das Intervall eines Fortschritts des Balkens in Millisekunden
    /// </summary>
    [Description("Das Intervall eines Fortschritts des Balkens in Millisekunden")]
    public int Intervall { get { return timer.Interval; } set { this.timer.Interval = value; } }

    protected override void OnPaint(PaintEventArgs e)
    {
        // Gundgerüst
        ProgressBarRenderer.DrawHorizontalBar(e.Graphics, new Rectangle(0, 0, this.Width, this.Height));

        // Abstand zum oberen bzw. unteren Ende
        const int rand = 2;

        // Normaler Balken zeichnen
        ProgressBarRenderer.DrawHorizontalChunks(e.Graphics, new Rectangle(
                x + rand, rand, this.ChunksWidth - 2 * rand, this.Height - 2 * rand));

        // eventuell Balken wieder von vorne beginnen
        if (x + ChunksWidth > this.Width)
            ProgressBarRenderer.DrawHorizontalChunks(e.Graphics, new Rectangle(
                rand, rand, x + ChunksWidth - this.Width - 2 * rand, this.Height - 2 * rand));
    }
}

Ist halt quick'n'dirty, aber du kannst das dann ja ausbessern.

mfg
SeeQuark

10.03.2009 - 12:36 Uhr

... geht nicht.

Schau dir mal meine RegEx-Funktion an.

Imho ist das einfacher als die Split-Methode.

mfg
SeeQuark

10.03.2009 - 12:31 Uhr

Das war implizit versteckt mit meinem "die Matches durchgehen".

foreach (Match match in Regex.Matches("A+B++C+++D?+E", @"(\?\+|[^+])+"))
    MessageBox.Show(match.Value);

Funktioniert bei mir auf jeden Fall.

mfg
SeeQuark

10.03.2009 - 12:23 Uhr

Genau, wo ist das Problem?

Zahlen kannst du aber besser mit den NumericUpDown (bzw. um auch Nicht-Zahlen wie Leerstrings zuzulassen MaskedTextBox)-Control erhalten.

Und verwende doch besser das int.TryParse anstatt dem Convert.ToInt32.

mfg
SeeQuark

10.03.2009 - 12:20 Uhr

Hallo. Also mit RexEx geht das ganz sicher.

Mache aber mal genauere Angaben. Möchtest du im string :::{style="color: darkred;"}&quot;A+B++C+++D?+E&quot;){darkred} nur :::{style="color: darkred;"}&quot;A&quot;){darkred}, :::{style="color: darkred;"}&quot;B&quot;){darkred}, :::{style="color: darkred;"}&quot;C&quot;){darkred} und :::{style="color: darkred;"}&quot;D?+E&quot;){darkred} erhalten oder auch die (:::

Noch ein Tipp zum Herausfinden des Pattern: On-the-fly Regex-Tester: Regex-Lab

mfg
SeeQuark

09.03.2009 - 21:14 Uhr

Mach mal dein

pbLangzeit.Maximum = zeit;  

raus.
Das brauchst du nur bei der Initialisierung der Progressbar.


tbxpb.Text = (100d * pbLangzeit.Value / pbLangzeit.Maximum) + "%";  

ich ahb 1% dann 3% dann 5% dann 6% dann 7% dann 9% usw

Dann füge bei der Berechnung halt noch eine Kommastelle an.

(100d * pbLangzeit.Value / pbLangzeit.Maximum).ToString("#.0") + "%";

So langsam sollte ich dich auf [Hinweis] Wie poste ich richtig? Punkt 1.1.1 hinweisen.

@rollerfreak2: Es geht auch mit TimeSpan.FromSeconds(1000);

mfg
SeeQuark

09.03.2009 - 20:39 Uhr

Dann muss ich mich wohl auch rechtfertigen 😉

Dass strings immutable sind, habe ich in der Hitze des Gefechts gar nicht bemerkt.
Mit etwas Verrenkungen bekommt man das aber auch noch hin.

string myString = "hallo.hallo.";
if (myString[myString.Length - 1] == '.') { // EDIT: Da war ein '_' :o
    char[] chars = myString.ToCharArray();
    chars[myString.Length - 1] = '_';
    myString = new string(chars);
}

Man benötigt jedoch etwas mehr Zeilen als mit RegEx, dafür ist es mit Sicherheit schneller.

Bei so einem Anwendungsfall macht das aber keinen grossen Unterschied, daher würde ich auch RegEx vorziehen.

mfg
SeeQuark

09.03.2009 - 19:51 Uhr

Auf den letzen Buchstaben kannst du mit meinstring[meinstring.Length - 1] zugreifen.
Müssten eigentlich kein Problem sein, diesen zu manipulieren.

mfg
SeeQuark

09.03.2009 - 16:50 Uhr

auf Englisch glaub' "ampersand".
Wenn du das im MenuStrip darstellen willst, musst du es im Text verdoppeln.

mfg
SeeQuark

09.03.2009 - 16:33 Uhr

Verwende mal den gleichen Parameter wie in Console.WriteLine.

Und vergesse (wenn du auf Performanz bedacht bist) das SuspendLayout(); bzw ResumeLayout(); nicht.
Siehe [Artikel] Flackernde Controls und flackerndes Zeichnen vermeiden .

mfg
SeeQuark

09.03.2009 - 16:23 Uhr

nimm doch double.Parse oder, noch besser, double.TryParse.

Zur eingabe ist eine NumericUpDownBox aber viel besser als eine TextBox (ich nimm mal an, dass das mit "edit box" gemeint ist).

Alternativ (aber nicht ganz so gut) kannst du auch eine MaskedTextBox verwenden, die sieht aus wie eine TextBox, verhindert aber Eingaben wie zum Beispiel ein "a".

Jedenfalls vermute ich, dass dein Programm abstürzen müsste, solltest du keine Zahl eingeben.

EDIT: Probleme mit den ganzen [TT] und [/TT]-Tags beseitigt.

mfg
SeeQuark