Laden...

Forenbeiträge von Nightmare Ingesamt 20 Beiträge

30.09.2011 - 10:47 Uhr

@herbivore

Deine Methode, bzw. deine Anregung erscheint mir als einzige Möglichkeit den Sync sauber durchzuführen!

Die Anforderungen an den Sync wurden aber mittlerweile geändert, heißt ich muss nicht mehr so extrem auf die Zeitänderungen durch den User achten!

Vielleicht setzte ich das ganze aber trotzdem mal irgendwann um und versuche einen sauberen Artikel darüber zu verfassen.

Vielen Dank für eure Hilfe und die Anregungen!
Und nochmal eine Entschuldigung für die anfängliche Verwirrung in meiner Problembeschreibung!

28.09.2011 - 14:24 Uhr

Schön wärs 8)

EDIT:
Hinzuzufügen ist noch, das das Programm auf Clients verwendet wird, die uneigeschränkten Zugriff auf das System haben! Das heißt die Systemzeit kann durch den User manipuliert werden.
Mein Programm soll auch nicht die Systemzeit ändern, sondern diese nur auslesen!

28.09.2011 - 14:21 Uhr

Hallo ich habe ein Problem welches mir ein wenig Kopfzerbrechen bereitet!

Und zwar brauche ich für mein Programm eine synchrone (heißt in dem Fall gegen eine Stratum1 Ntp-Server gesyncte) Zeit.
Wäre ja alles kein Problem nur leider soll dies keine ständige Internetverbindung voraussetzen, sondern nur beim Starten des Programms. -> Ist nunmal so gegeben, also indiskutabel 😃
Das nächste Problem sind Änderungen an der Systemzeit durch den Benutzer (oder wen auch immer), die natürlich auch erfasst werden müssen!

Meine Überlegung bisher:

  • Beim Starten des Programms gegen NTP Server syncen und Drift speichern
  • Ein Thread läuft jede Minute, speichert die aktuelle Systemzeit und Startet eine Stopwatch
  • Bei einer Änderung der Systemzeit (gecatchte Windows Message) wird dieser Thread gelockt und die letzte abgefangene Systemzeit gegen die Laufzeit der Stopwatch gesynct -> Damit wären wir eigentlich wieder total synchron
  • Zum ermitteln der Zeit wird die gecatchte Systemzeit abzüglich des Drifts ausgegeben

Was ich jetzt als Problem sehe ist, wenn nach dem Abfangen der "WM_TIMECHANGE" Message der Thread nicht schnell genug blockiert wird (Und das ist meiner Meinung nach nicht genau zu bestimmen) ich in meinem Thread gegen die verstellte Zeit synce und den Unterschied der Änderung nicht berücksichtige!

Ich weiß das ich hier nur Theorien verwende aber könnt ihr mir trotzdem ein wenig auf die Sprünge helfen?

21.09.2011 - 15:21 Uhr

Vielen Dank für diesen wirklich sehr interessanten und lehrreichen Artikel 👍

17.08.2011 - 14:39 Uhr

Also hieße das für mich, dass ich den DrawMode meiner ListBox auf OwnerDrawVariable setzte und dann im DrawItem Event der Box zeichnen kann?

Scheinbar muss ich hierbei das Zeichnen der Listenitems selbst übernehmen! Oder sehe ich da was falsch?

17.08.2011 - 12:52 Uhr

Hallo Community!

Folgendes habe ich vor: Ich möchte einen Auswahlkasten in eine ListBox reinzeichnen bei bestimmten Mausaktionen.

Folgendes Problem habe ich bereits gefunden: Das ListBox Control besitzt kein eigenes Paint Event bzw. auch keine OnPaint Methode zum überschreiben. So habe ich kein Graphics objekt, auf welches ich beim Zeichnen der Box durch Windows selbst drauf zeichnen kann!

Mein Lösungsansatz bisher: Ich erstelle ein neues UserControl und lege hier eine ListBox rein. Hier fange ich die benötigten Mausevents der ListBox ab und löse irgendwann ein Invalidate auf das UserControl aus. In der Überladenen Paint Methode des UserControls zeichne ich dann auf das Graphicsobjekt der Paint Methode. Leider passiert hier, dass meine Zeichnung hinter der Windowszeichnung der ListBox liegt 😕

Hier noch kurz mein Code zum besseren Verständnis meines Anliegens 😉


public partial class UserControl1 : UserControl
    {
        private int _mDownX, _mDownY, _mUpX, _mUpY, _mAktX, _mAktY;
        private bool _isMouseDown;

        public UserControl1()
        {
            InitializeComponent();        
            for (int i = 0; i < 100; i++)
            {
                this.listBox1.Items.Add("test");
            }
            this.listBox1.MouseDown += new MouseEventHandler(listBox1_MouseDown);
            this.listBox1.MouseUp += new MouseEventHandler(listBox1_MouseUp);
            this.listBox1.MouseMove += new MouseEventHandler(listBox1_MouseMove);
        }

        void listBox1_MouseMove(object sender, MouseEventArgs e)
        {
            this._mAktX = e.X;
            this._mAktY = e.Y;
            if (this._isMouseDown)
                this.Invalidate();
        }

        void listBox1_MouseUp(object sender, MouseEventArgs e)
        {
            this._mUpX = e.X;
            this._mUpY = e.Y;
            this._isMouseDown = false;
        }

        void listBox1_MouseDown(object sender, MouseEventArgs e)
        {
            this._mDownX = e.X;
            this._mDownY = e.Y;
            this._isMouseDown = true;
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            //Auswahlkasten
            Pen p = new Pen(Brushes.Black, 1);
            p.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
            e.Graphics.DrawRectangle(p, new Rectangle(this._mDownX, this._mDownY, (this._mAktX - this._mDownX), (this._mAktY - this._mDownY)));
        }
    }

Bitte den Logikfehler beim Zeichnen der Box überlesen (Die Box wird nur beim ziehen von links oben nach rechts unten gezeichnet 😃)

14.06.2011 - 16:48 Uhr

Ich selbst habe diese Methode schon mehrmals und in schwierigen Fällen angewandt.
Auf diesem Weg bin ich bisher in allen Fällen auf die Lösung für mein Problem gestossen.

Je weiter man das Projekt herunterbricht, desto weniger wird man von den unwichtigen Faktoren erschlagen und kann das Problem sehr zügig lokalisieren.

08.03.2011 - 16:29 Uhr

Nein das nicht, ich gebe dir auch Recht, dass mein vorgeschlagener Weg nicht der beste ist.
Aber er funktioniert halt.

Egal auf jeden Fall habe ich mir mal deinen Vorschlag angeschaut und ich werds auf jeden Fall mal ausprobieren 😉. Danke für den Hinweis

08.03.2011 - 14:04 Uhr

So ich habs jetzt folgendermaßen gelöst.


//Zuerst einmal implementiere ich die Funktion "LockWindowUpdate"
//der "user32.dll"
[DllImport("user32.dll")]
private static extern bool LockWindowUpdate(IntPtr hWndLock);

//Wenn mein Thread jetzt geänderte Daten hat läuft die Methode 
//so ab

//Fensterupdate unterdrücken
LockWindowUpdate(this.myListView.Handle);
//Neue Items fürs ListView
this.myListView.Items.Clear();
this.myListView.AddRange(this.myListViewItems);
//Fenster neu zeichnen
LockWindowUpdate(IntPtr.Zero);

So damit bekomme ich nur noch einen Redraw was die ganze Sache annähernd perfekt macht!
Ich finde es vollkommen ok so. Trotzdem Danke für eure Hinweise.

08.03.2011 - 11:47 Uhr

Da war ich auch schon drauf gekommen 😃

Leider besitzen meine ListViews keine Eigenschaft DataSource!
Anscheinend muss ich mir ein geerbtes ListView erstellen, welches dieses Modell abbildet!
Ich verwende übrigens DotNET Framework 2.0. Wird wahrscheinlich die Erklärung sein.

Erscheint mir jetzt aber sehr aufwendig für ein, meiner Meinung nach, simples Problem 😕

08.03.2011 - 11:11 Uhr

...
Du bindest die Datenstruktur an die Listview. Damit hast du schon mal die GUI Seite fertig.
...

Wie genau mache ich das bzw. wie meinst du das?

08.03.2011 - 10:49 Uhr

Ok habs mir durch gelesen und würde jetzt wie folgt vorgehen.

  1. Eine neue BindingSource erstellen und das Event ListChanged abfangen.
  2. Bei Änderungen die Items der BindingSource.List abändern.
  3. Die Items des ListViews durch den Listener für das ListChanged Event der BindingSource ändern lassen.

Wann genau tritt das ListChanged Event der BindingSource ein?
Wahrscheinlich schon in diesem Falle:


for (int i = 0; i < count(zähler); i++)
     this.myBindingSource.List[i] = newElement; //Hier beim ersten Durchgang

Was müsste ich denn dafür tun, damit z.B. der ListView erst nach durchlaufen der Schleife erneuert wird, oder bin ich hiermit komplett auf dem Holzweg?

08.03.2011 - 10:33 Uhr

Ich lese mir gerade mal den msdn Artikel durch. Scheint doch recht angenehm zu sein

08.03.2011 - 10:27 Uhr

Und damit kann ich alle meine Änderungen durchführen und danach ein globales Refresh durchführen?

08.03.2011 - 10:17 Uhr

Hallo,

folgender Sachverhalt.
In meinem Programm existiert ein ListView Control. In diesem sind verschiedene Einträge vorhanden, die sich nach einer gewissen Zeit (einstellbar gehen wir jetzt mal von 30 sec. aus) aktualisieren können.

Momentan hab ich es folgendermaßen realisiert: Ein Thread durchläuft die Änderungen und prüft, ob Einträge des ListViews betroffen sind. Danach wird jedes einzelne Element des ListViews ausgewechselt. Vor der Prüfung rufe ich die Funktion SuspendLayout und nachher ResumeLayout des ListViews auf. Nur leider habe ich das Problem, das meine Liste natürlich flakert und sich nur sehr langsam wieder aufbaut.

Meine Frage ist nun: Wie optimiere ich das ganze? Soll ich vorher alle Einträge in eine interne Liste kopieren, hier die Änderungen durchführen, dann den ListView leeren und zum Schluss alle Elemente des ListViews neu setzen? Oder wie sieht der richtige Weg aus?

Danke schon mal für eure Hilfe

19.03.2008 - 13:01 Uhr

Jo thx so klappst gg

19.03.2008 - 12:42 Uhr

jo hab ich auch gedacht, logischerweiße, aber:

Form frmx = new Form();
frmx.TopMost = true;
frmx.Left = 1500;
frmx.Top = 1000;
 frmx.ShowDialog();

Egal welchen Wert ich Left, Top nehme das Form is immer an der selben Stelle 🤔

19.03.2008 - 12:19 Uhr

OK ja so klappst nur wie kann ich der Form nun ne Position mitgeben, wo sie nachher zu sehen sein wird?

19.03.2008 - 11:52 Uhr

Jo, sowas hab ich schon probiert halt nur ohne die Animation.

Das ganze sah dann in etwa so aus:

Event wird ausgelöst

  Form frm = new Form()
  frm.Position = new Point(x,y)
  frm.Show()

Ergebnis: Form war leider nur für eine Sek zu sehen. Aber nur wenn meine MainForm minimiert ist, ansonsten bleibt das Form da. Ich möchte es aber gerne nur bei minimierter MainForm anzeigen...

19.03.2008 - 11:31 Uhr

Hallo,

ich möchte gerne ein Popupfenster erstellen welches sich bei minimierter MainForm unter eintreten eines bestimmten Events angezeigt wird.

Ähnlich wie bei Mozilla Thunderbird wenn neue Mails ankommen

Leider weiß ich nicht so genau wie ich das anstellen kann, erste Versuche führten leider nicht zum gewünschten Ergebnis...

Habt ihr vielleicht einen Tipp für mich?

Gruß

Nightmare