Laden...

Forenbeiträge von CoLo Ingesamt 224 Beiträge

12.04.2011 - 09:49 Uhr

Hallo herbivore,

wenn beim Form schon form.ShowInTaskbar = false gesetzt ist,
und ich beim form_Resize form.ShowInTaskbar = false setze,
dann verkleinert sich es links unten in der Ecke.

Beim form_Resize mache ich nun


  form.ShowInTaskbar = true;
  form.ShowInTaskbar = false;

Ein bischen flackert es in der Leiste wegen ShowInTaskbar = true. Aber das Form links unten ist weg. Abgesehen davon ist es Besser als die Fenster ins Nirvana verschieben zu müssen. Daher vielen Dank. Hat mir sehr geholfen. =)

Grüße,
CoLo

11.04.2011 - 18:06 Uhr

Hallo el_panter,

nach 2 Tagen rumprobieren habe ich aufgegeben. Die Idee ist gut. Aber wenn ein Formular nicht das aktive ist und man in der Taskleiste auf dem Formular 2x schnell klickt (Doppelklick), dann kommt WM_SETFOCUS, WM_KILLFOCUS, WM_SETFOCUS.

Aus der Anwendung können viele Formulare aufgerufen werden. Das kann unübersichtlich werden (vor allem in der Taskleiste). Lösung wäre Reduzierung auf 1 Formular in der Taskleiste.
Beim Klick sollte dann das am besten geeignete Formular aufgerufen werden.
Lösung funktionierte nicht problemlos.

Von daher habe ich ein NotifyIcon in der Taskleiste. Dazu ein Formular das als Menü gestaltet ist (so wie bei ICQ). Eigentlich wollte ich ein normales Menü verwenden. Sowas wie ToolStrip, MenuStrip oder ContextMenustrip. Aber auch diese bereiten Probleme. Auf einmal erscheint z.B. ein neues Fenster in der Taskleiste (what?). Nun habe ich mein eigenes Fomular als Menü das funktioniert wie ich will.

So, jetzt ist nur noch das Minimize der Formulare zu deaktivieren oder so zu gestalten, dass nicht so ein dämliches Formular in der Taskleiste erscheint, das nur halb funktioniert (und wenn ich das Formular auf Location -10000, -10000 setze (bäh)).

Grüsse, CoLo

06.04.2011 - 11:47 Uhr

Hallo Herbivore,

super Tip mit Spy++. Habe dadurch die Klassen herausgefunden.
Leider komm ich an die Buttons noch nicht ran.
Beim Abfragen der Taskleisten-Buttons, schmiert die Taskleiste ab:


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

namespace WindowsApp
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //Suche Toolbar
            IntPtr hToolbar;
            {
                hToolbar = FindWindow("Shell_TrayWnd", null);
                hToolbar = FindWindowEx(hToolbar, IntPtr.Zero, "ReBarWindow32", null);
                hToolbar = FindWindowEx(hToolbar, IntPtr.Zero, "MSTaskSwWClass", null);
                hToolbar = FindWindowEx(hToolbar, IntPtr.Zero, "ToolbarWindow32", null);
                if (hToolbar == IntPtr.Zero) throw new ArgumentException("Toolbar not found.");
            }

            //Gebe Buttons der Toolbar aus
            {
                int count = (int)SendMessage
                (
                    hToolbar,
                    TB_BUTTONCOUNT,
                    IntPtr.Zero,
                    IntPtr.Zero
                );

                Debug.WriteLine("Toolbar Count = " + count.ToString());
                for (int i = 0; i < count; i++)
                {
                    if (IntPtr.Size == 8)
                    {
                        //64 bit operating system
                        throw new ArgumentException("64 bit OS not implemented.");
                    }
                    else
                    {
                        //32 bit operating system                        
                        //Debug.WriteLine("size=" + Marshal.SizeOf(typeof(TBUTTON32))); //size = 20 bytes
                        IntPtr pButton = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(TBUTTON32)));
                        try
                        {
                            //!!! Taskleiste schmiert hier ab !!!
                            IntPtr ret = SendMessage
                            (
                                hToolbar,
                                TB_GETBUTTON,
                                (IntPtr)i,
                                pButton
                            );

                            if (ret == IntPtr.Zero)
                                Debug.WriteLine("GetLastWin32Error = " + Marshal.GetLastWin32Error())
                            ;

                            Debug.Write("tButton return=" + ((int)ret).ToString());

                            TBUTTON32 tButton = (TBUTTON32)Marshal.PtrToStructure(pButton, typeof(TBUTTON32));

                            string text = Marshal.PtrToStringAuto(tButton.iString);
                            Debug.WriteLine(", iString(" + tButton.iString + ")=\"" + text + "\"");
                        }
                        finally
                        {
                            Marshal.FreeHGlobal(pButton);
                        }
                    }
                }                               
            }
        }

        #region PInvoke --------------------------------------

        [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        [DllImport("user32.dll", EntryPoint = "FindWindowEx", SetLastError = true)]
        public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

        [DllImport("user32.dll", CharSet = CharSet.Auto, EntryPoint = "GetWindowText")]
        public static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);
        public static string GetWindowText(IntPtr hWnd)
        {
            const int MAXLEN = 255;//GetWindowTextLength(hWnd) + 1;
            StringBuilder sb = new StringBuilder(new string('\0', MAXLEN), 0, MAXLEN, MAXLEN);
            sb.Length = GetWindowText(hWnd, sb, sb.Capacity);
            return sb.ToString();
        }

        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto, EntryPoint = "GetClassName")]
        public static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
        public static string GetClassName(IntPtr hWnd)
        {
            const int MAXLEN = 255;//GetWindowTextLength(hWnd) + 1;
            StringBuilder sb = new StringBuilder(new string('\0', MAXLEN), 0, MAXLEN, MAXLEN);
            sb.Length = GetClassName(hWnd, sb, sb.Capacity);
            return sb.ToString();
        }

        [DllImport("user32.dll", CharSet = CharSet.Auto, EntryPoint = "SendMessage")]
        private static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);


        public const int WM_USER = 1024; //0x400
        public const int TB_GETBUTTON = 1047; //0x417
        public const int TB_BUTTONCOUNT = (WM_USER + 24);               

        public struct TBUTTON32
        {
            public int iBitmap;
            public int idCommand;
            public byte fsState;
            public byte fsStyle;
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 2)]
            public byte[] bReserved;
            public UIntPtr dwData;
            public IntPtr iString;
        }
        public struct TBUTTON64
        {
            public int iBitmap;
            public int idCommand;
            public byte fsState;
            public byte fsStyle;
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 6)]
            public byte[] bReserved;
            public UIntPtr dwData;
            public IntPtr iString;
        }

        #endregion
    }
}

Hier meine Debuginformationen:1.Toolbar Count = 12 1.GetLastWin32Error = 1008 1.tButton return=0, iString(168636977)="" 1.GetLastWin32Error = 2 1.tButton return=0, iString(168636977)="" 1.GetLastWin32Error = 2 1.tButton return=0, iString(168636977)="" 1.GetLastWin32Error = 2 1.tButton return=0, iString(168636977)="" 1.GetLastWin32Error = 2 1.tButton return=0, iString(168636977)="" 1.GetLastWin32Error = 2 1.tButton return=0, iString(168636977)="" 1.GetLastWin32Error = 2 1.tButton return=0, iString(168636977)="" 1.GetLastWin32Error = 2 1.tButton return=0, iString(168636977)="" 1.GetLastWin32Error = 2 1.tButton return=0, iString(168636977)="" 1.GetLastWin32Error = 2 1.tButton return=0, iString(168636977)="" 1.GetLastWin32Error = 2 1.tButton return=0, iString(168636977)="" 1.GetLastWin32Error = 2 1.tButton return=0, iString(168636977)=""

Gruß, CoLo

05.04.2011 - 12:42 Uhr

Danke Herbivore, schau' ich mir mal an.

05.04.2011 - 11:39 Uhr

Hi chriscolm,

wenn Du die Spalten und Felder alle kennst:

        

        public class Datensatz //public struct TDatensatz geht auch.
        {
            private int _Feld1;
            public int Feld1 { get { return _Feld1; } set { _Feld1 = value; } }

            private DateTime _Feld2;
            public DateTime Feld2 { get { return _Feld2; } set { _Feld2 = value; } }

            private string _Feld3;
            public string Feld3 { get { return _Feld3; } set { _Feld3 = value; } }

            public Datensatz(int Feld1, DateTime Feld2, string Feld3)
            {
                this._Feld1 = Feld1;
                this._Feld2 = Feld2;
                this._Feld3 = Feld3;
            }
        }

        void itemTest_Click(object sender, EventArgs e)
        {
            List<Datensatz> tabelle = new List<Datensatz>();
            tabelle.Add(new Datensatz(1, DateTime.Now, "Hallo"));
            tabelle.Add(new Datensatz(2, DateTime.Now, "Welt"));
        }

Gruß, CoLo

05.04.2011 - 11:04 Uhr

Hi Cat,

vielen Dank für Deine Antwort. Du bist der Erste der mir antwortet.
Keine Ahnung warum es Deactivate heißt. Habe nix darüber gefunden. Microsoft hat wohl ein d vergessen (oder auch nicht 😃).

Ich verwende momentan Activated in meiner Form MainTop:


        private void MainTop_Activated(object sender, EventArgs e)
        {
            MainTopClick();
        }

Wenn ich nun das MainTop Formular in der Taskleiste anklicke passiert folgendes:nix, wenn MainTop vorher activated war + schneller Klick (Doppelklickgeschwindigkeit).
nix, wenn MainTop vorher deactivated war + schneller Klick (Doppelklickgeschwindigkeit).
nix, wenn MainTop vorher activated war + langsamer Klick.
MainTopClick wird ausgeführt, wenn MainTop vorher deactivated war + langsamer Klick.

Ich habe auch mal alle ankommenden WindowsMessages in eine Logdatei geschrieben:



        protected override void WndProc(ref Message m)
        {
            Log.tmp.Add
            (
                DateTime.Now.ToString("HH:mm:ss.fff") + " " +
                Core.Wrap.Windows.WMConstantToString(m.Msg) + ":   " +
                "Hwnd=" + m.HWnd + ", " +
                "WParam=" + m.WParam + ", " +
                "LParam=" + m.LParam
            );
            base.WndProc(ref m);
        }

Sind eine Menge WM_* Werte in der Logdatei. Ich werde nicht schlau daraus. Folgende sind aufgetreten:
? (49706)
WM_ACTIVATE
WM_ACTIVATEAPP
WM_CLOSE
WM_CREATE
WM_DESTROY
WM_ERASEBKGND
WM_GETICON
WM_GETMINMAXINFO
WM_GETTEXT
WM_GETTEXTLENGTH
WM_IME_NOTIFY
WM_IME_SETCONTEXT
WM_KILLFOCUS
WM_MOVE
WM_NCACTIVATE
WM_NCCALCSIZE
WM_NCCREATE
WM_NCDESTROY
WM_NCPAINT
WM_PAINT
WM_PARENTNOTIFY
WM_SETFOCUS
WM_SETICON
WM_SETTEXT
WM_SHOWWINDOW
WM_SIZE
WM_STYLECHANGED
WM_STYLECHANGING
WM_WINDOWPOSCHANGED
WM_WINDOWPOSCHANGING

Da wohl das MainTop Formular der Taskleiste ein anderes Formular ist,
gibt es wohl sowas hier nicht grummel:


            public const int WM_LBUTTONDBLCLK = 515; //0x203
            public const int WM_LBUTTONDOWN = 513; //0x201
            public const int WM_LBUTTONUP = 514; //0x202

InMyHumbleOpinion müsste ich an das Formular in der Taskleiste herankommen. Aber wie?

Grüßle, CoLo

04.04.2011 - 10:52 Uhr

Mein Formular wird in der Taskleiste angezeigt (Eigenschaft ShowInTaskBar=true).
Gibt es eine Möglichkeit den Klick auf mein Formular in der Taskleiste abzufragen?

Grüßle, CoLo

10.02.2011 - 10:45 Uhr

Hierbei sind die Funktionen am Schluss Funktionen (Delegaten), in die nach erfolgreichen Vorgangsabschnitten gesprungen wird.
Dieser Vorgang ist also asynchron.

Sicher? Gegenbeispiel:


        public delegate void DlgtTryMethod();
        bool TryMethod(DlgtTryMethod dlgtTryMethod)
        {
            try
            {
                dlgtTryMethod();
                return true;
            }
            catch { return false; }
        }

Gruß, CoLo

08.02.2011 - 10:03 Uhr

Ist ca. 2 Jahre her, als ich Vista hatte (und das Programm geschrieben hatte).
Ich glaube der Eintrag hieß "VirtualStore":


//loop
{
    ...
    string keypath = ... //z.B. @"HKEY_USERS\1234567890_Classes\VirtualStore\Machine\Software"
    if (keypath.IndexOf("VirtualStore") != -1) continue;                
    ...
}

Googlesuche: vista registry virtual
Registry Virtualization

07.02.2011 - 16:39 Uhr

Wie groß ist denn der verbrauchte Speicher so?

Ich war mal in der Versuchung die komplette Registry von Vista in eine Textdatei wegzuschreiben.
Nach ca. 1GB habe ich abgebrochen. Das war mir einfach zu viel.
Da sind ziemlich viele virtuelle Einträge enthalten gewesen.
Nach Ausschluss dieser war die Textdatei nur noch 80MB groß.

03.02.2011 - 16:10 Uhr

Hallo,

in einem Projekt kommt die Meldung

Der Thread 0xc7271fde hat mit Code 0 (0x0) geendet.

in VisualStudio in der Ausgabe vom Debugger ziemlich häufig vor.
Kann man die Meldung irgendwie unterdrücken?

Gruß,
CoLo

27.01.2011 - 12:26 Uhr

Ich mach's immer so:


            using (FileStream fs = new FileStream(@"D:\C\Projects\OcrDll\Text\OCR.text", FileMode.Create))
            {
                using (StreamWriter sw = new StreamWriter(fs, Encoding.Default))
                {
                    sw.WriteLine("Hi");
                }
            }

Statt Encoding.Default kannst Du natürlich auch was anderes nehmen.

Gruß,
CoLo

27.01.2011 - 12:00 Uhr

Danke xxxprod, das ist genial! 😁


    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            //Panels und Labels hinzufügen
            {
                //Panels
                Panel pnlOuter = new Panel();
                {
                    pnlOuter.Name = "pnlOuter";
                    pnlOuter.BackColor = Color.Silver;
                    pnlOuter.AutoScroll = true;
                    pnlOuter.Dock = DockStyle.Fill;
                    this.Controls.Add(pnlOuter);
                }
                Panel pnlInner = new Panel();
                {
                    pnlInner.Name = "pnlInner";
                    pnlInner.BackColor = Color.WhiteSmoke;
                    pnlInner.AutoSize = true;
                    pnlInner.Dock = DockStyle.Top;
                    pnlOuter.Controls.Add(pnlInner);                    
                }

                //Labels
                for (int i = 0; i < 30; i++)
                {
                    Label lbl = new Label();
                    lbl.Name = "Label" + i;
                    lbl.Text = lbl.Name;
                    lbl.Click += new EventHandler(lbl_Click);
                    m_items.Add(lbl);                    
                    pnlInner.Controls.Add(lbl);
                }
                ItemsUpdatePositions();
            }
        }

        List<Control> m_items = new List<Control>();
        void ItemsUpdatePositions()
        {
            int top = 0;
            for (int i = 0; i < m_items.Count; i++)
            {
                m_items[i].Location = new Point(0, top);
                top += m_items[i].Height;
            }
        }
        bool ItemsSwap(int x, int y)
        {
            int max = m_items.Count - 1;
            if (!((0 <= x) && (x <= max))) return false;
            if (!((0 <= y) && (y <= max))) return false;

            Control itemX = m_items[x];
            m_items[x] = m_items[y];
            m_items[y] = itemX;
            return true;
        }


        void lbl_Click(object sender, EventArgs e)
        {
            Label lbl = (Label)sender;
            lbl.BackColor = Color.Yellow;
            int i = m_items.IndexOf(lbl);
            if (ItemsSwap(i, i + 1))
            {
                ItemsUpdatePositions();
            }
        }
    }

27.01.2011 - 11:24 Uhr

Hi,

ich habe ein Panel dass ich dynamisch mit Labels fülle.
Um zu scrollen ist beim Panel der Autoscroll aktiv.

Problem:
Sobald ich 2 Labels durch Clicken vertausche und die Autoscrollposition !=0 ist,
verschieben sich alle Controls ?um die Scrollposition? nach unten.

(Ich brauche eine 1 spaltige Auflistung an Steuerelementen.
Der Benutzer soll Steuerelemente hinzufügen, verschieben und löschen können.
Mehr als 100 Einträge in der Liste werden es nicht werden.)

Was mache ich falsch?
Bin für jeden Ratschlag dankbar!

Gruß,
CoLo


    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            //Panel und Labels hinzufügen
            {
                //Panel
                Panel panel1 = new Panel();
                {
                    panel1.Name = "panel1";
                    panel1.BackColor = Color.Silver;
                    panel1.AutoScroll = true;
                    panel1.Location = new Point(10, 10);
                    panel1.Size = new Size(this.ClientSize.Width - 20, this.ClientSize.Height - 20);
                    panel1.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Bottom;
                    this.Controls.Add(panel1);
                }

                //Labels
                for (int i = 0; i < 30; i++)
                {
                    Label lbl = new Label();
                    lbl.Name = "Label" + i;
                    lbl.Text = lbl.Name;
                    lbl.Click += new EventHandler(lbl_Click);
                    m_items.Add(lbl);
                    panel1.Controls.Add(lbl);
                }
                ItemsUpdatePositions();
            }
        }

        List<Control> m_items = new List<Control>();
        void ItemsUpdatePositions()
        {
            int top = 0;
            for (int i = 0; i < m_items.Count; i++)
            {
                m_items[i].Location = new Point(0, top);
                top += m_items[i].Height;
            }
        }
        bool ItemsSwap(int x, int y)
        {
            int max = m_items.Count - 1;
            if (!((0 <= x) && (x <= max))) return false;
            if (!((0 <= y) && (y <= max))) return false;

            Control itemX = m_items[x];
            m_items[x] = m_items[y];
            m_items[y] = itemX;
            return true;
        }

        //Vertausche beim Click 2 Labels (hier passiert's)
        void lbl_Click(object sender, EventArgs e)
        {
            Label lbl = (Label)sender;
            lbl.BackColor = Color.Yellow;
            int i = m_items.IndexOf(lbl);
            
            if (ItemsSwap(i, i + 1))
            {
                ItemsUpdatePositions();
            }
        }
    }

06.09.2010 - 13:53 Uhr

Hi,

das sieht mir alles sehr kompliziert aus (Klassendesign).

Brauchst Du überhaupt solch generische Klassen?
Ich würde zusehen, dass ich bei


public abstract class DataPresenterBase<T> : PresenterBase, IDataPresenterBase where T: 

das <T> loswerde.

Muss die Klasse abstrakt sein bzw. gibt es einen anderen Weg ohne abstrakte Klasse?

Versuche es mal ohne wheres und abstracts.
Falls nötig wie Peter schreibt mit Interfaces.

Ich kenne Deine Aufgabe nicht.
Von daher verzeih' diese plumpe Antwort.

Gruß, CoLo

26.07.2010 - 13:00 Uhr
short test1 = ((short)100) / ((short)123);

Hier errechnet der Compiler wohl eine Zahlenkonstante und erkennt,
dass der Wert in ein short passt.

short test2 = ((short)ioo) / ((short)123);//Fehler

Bei allen Rechenoperationen wird immer zu "int" konvertiert.
Daher der Fehler. Das klingt logisch. Vielen Dank.

26.07.2010 - 11:01 Uhr

Hallo,

da der Datentyp short nur 65536 Zustände haben kann,
wollte ich ihn für einen Überlauftest verwenden.
Bei der Zeile mit test2 kommt
Der Typ "int" kann nicht implizit in "short" konvertiert werden.
und ich weiß nicht warum:


private void button1_Click(object sender, EventArgs e)
{
    short ioo = 100;
    short test1 = ((short)100) / ((short)123);
    short test2 = ((short)ioo) / ((short)123);//Fehler
    short test3 = (short)(((short)ioo) / ((short)123));
}

Ist das bei Euch auch so?
Kann mir jm. helfen?
Benutze VS2005
Gruß, CoLo

20.03.2010 - 00:13 Uhr

Hallo EnjoX,

habe mal ein Beispiel zusammengeschustert.
Könntest Du im Code nicht einfach


            timer1.Tick -= new EventHandler(timer1_Tick);
            timer1.Stop();

            //...was Zeitintensives etc.

            timer1.Tick += new EventHandler(timer1_Tick);
            timer1.Start();

verwenden?

Gruß,
CoLo



using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    /// <summary>
    /// Zu einem Leeren Formular wird hinzugefügt:
    ///   Timer    timer1
    ///   Button   button1
    ///   Button   button2
    ///   Button   button3
    ///   ListBox  listBox1
    ///   
    /// der namespace WindowsFormsApplication1 muss eventuell angepasst werden.
    /// Dann läufts (hoffentlich).
    /// </summary>
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            //Meine nachfolgende
            //Initialisierung der Steuerelemente
            //enspricht nicht den Regeln
            //und ist eine Fehlerquelle.
            //
            //Mein Gedanke dabei:
            // Den Copy & Paste Vorgang wollte ich einfach halten.
            // Für das Beispiel ist die Fehlerquelle vernachlässigbar.


            timer1.Enabled = false;
            timer1.Interval = 1000;
            button1.Text = "Start";
            button2.Text = "Stop";
            button3.Text = "Reset";

            this.button1.Click += new System.EventHandler(this.button1_Click);
            this.button2.Click += new System.EventHandler(this.button2_Click);
            this.button3.Click += new System.EventHandler(this.button3_Click);
            this.timer1.Tick += new System.EventHandler(this.timer1_Tick);

        }
        private void timer1_Tick(object sender, EventArgs e)
        {
            Log("Timer");
        }
        private void button1_Click(object sender, EventArgs e)
        {
            Log("Start");
            timer1.Start();
        }
        private void button2_Click(object sender, EventArgs e)
        {
            Log("Stop");
            timer1.Stop();
        }
        private void button3_Click(object sender, EventArgs e)
        {
            //Timer wird deaktiviert
            timer1.Tick -= new EventHandler(timer1_Tick);
            timer1.Stop();

            DateTime dt = DateTime.Now.AddSeconds(2);
            while (dt > DateTime.Now)
            {
                //Auslastungstest:
                //  Zwischenzeitliche Timerevents laufen ins leere.
                Application.DoEvents();//DoEvents ist dirty! Nur für Test!
                System.Threading.Thread.Sleep(100);
            }

            Log("Reset");
            //Timer wird wieder aktiviert
            timer1.Tick += new EventHandler(timer1_Tick);
            timer1.Start();
        }

        DateTime _lastLog = DateTime.MinValue;
        void Log(string text)
        {
            //Ermittlung der Zeitspanne zwischen 2 Logs
            DateTime now = DateTime.Now;
            int span;
            {
                if (_lastLog != DateTime.MinValue)
                    span = (int)(new TimeSpan(now.Ticks - _lastLog.Ticks)).TotalMilliseconds;
                else
                    span = -1
                ;
                _lastLog = now;
            }

            //Ausgabe
            listBox1.BeginUpdate();
            {
                listBox1.Items.Add
                (
                    now.ToString("yyyy-MM-dd HH:mm:ss:fff") + ",  " +
                    span + ",  " +
                    text
                );
                listBox1.SelectedIndex = listBox1.Items.Count - 1;
            }
            listBox1.EndUpdate();
        }
    }
}

10.03.2010 - 20:39 Uhr

Danke für den Hinweis FZelle,

ich habe unbewusst Informationen ausgelassen
und den vorherigen Beitrag um diese überarbeitet.

Auf dem CF und PC habe ich das Timerproblem.
Verhält sich denn CF da richtig? 🤔
Kann mir das nicht Vorstellen.

Gruß,
CoLo

06.03.2010 - 11:24 Uhr

Hallo ErfinderDesRades,

vielen Dank. Das ist es.

Mein VS Studio 2005 Designer für Compact Framework macht das falsch.
Mein VS Studio 2005 Designer für PC habe ich nicht getestet.
Mein VS Studio 2008 Designer für PC macht das richtig.
Mein VS Studio 2010 Beta Designer für PC macht das wieder falsch.
Unglaublich!

Gruß,
CoLo

(Beitrag wurde überarbeitet)

02.03.2010 - 21:10 Uhr

Hallo Community,

mit Visual Studio kann man bequem per Drag & Drop
schnell ein Formular mit einem Timer platzieren.

Beim Dispose des Formulars wird das Formular samt Inhalt befreit...
... von wegen. Aktive Timer laufen einfach weiter!???
Was ist die beste Vorgehensweise um die Timer zu Disposen?
Passiert mit Visual Studio 2005 und 2010.

Beste Grüße,
CoLo

Vollständiger Beispielcode:


using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }

    public class Form1 : Form
    {
        #region ############### Form1.Designer.cs

        private System.ComponentModel.IContainer components;
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
        private void InitializeComponent()
        {
            this.button1 = new System.Windows.Forms.Button();
            this.listBox1 = new System.Windows.Forms.ListBox();
            this.SuspendLayout();
            // 
            // button1
            // 
            this.button1.Location = new System.Drawing.Point(44, 26);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(75, 23);
            this.button1.TabIndex = 0;
            this.button1.Text = "button1";
            this.button1.UseVisualStyleBackColor = true;
            this.button1.Click += new System.EventHandler(this.button1_Click);
            // 
            // listBox1
            // 
            this.listBox1.FormattingEnabled = true;
            this.listBox1.Location = new System.Drawing.Point(44, 82);
            this.listBox1.Name = "listBox1";
            this.listBox1.Size = new System.Drawing.Size(217, 134);
            this.listBox1.TabIndex = 1;
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(284, 264);
            this.Controls.Add(this.listBox1);
            this.Controls.Add(this.button1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);

        }

        private System.Windows.Forms.Button button1;
        private System.Windows.Forms.ListBox listBox1;

        #endregion ############### Form1.Designer.cs

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string form2Hwnd;
            using (Form2 form2 = new Form2())
            {
                form2Hwnd = form2.Handle.ToString();
                Add(form2Hwnd + " created.");
                form2.form1 = this;
                form2.ShowDialog();
                
                //Using sorgt automatisch für
                //  form2.Dispose();
                //bzw.
                //  ((IDisposable)form2).Dispose();
            }
            Add(form2Hwnd + " removed.");
        }

        public void Add(string text)
        {
            listBox1.SelectedIndex = listBox1.Items.Add(text);
        }
    }
    public class Form2 : Form
    {
        #region ############### Form2.Designer.cs

        private System.ComponentModel.IContainer components;
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        private void InitializeComponent()
        {
            this.timer1 = new System.Windows.Forms.Timer();
            this.SuspendLayout();
            // 
            // timer1
            // 
            this.timer1.Enabled = true;
            this.timer1.Interval = 1000;
            this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
            // 
            // Form2
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(284, 264);
            this.Name = "Form2";
            this.Text = "Form2";
            this.ResumeLayout(false);

        }

        private System.Windows.Forms.Timer timer1;

        #endregion ############### Form2.Designer.cs

        public Form2()
        {
            InitializeComponent();
            timer1.Tag = this.Handle.ToString();
        }


        public Form1 form1 = null;
        private void timer1_Tick(object sender, EventArgs e)
        {
            if (form1 == null) return;
            form1.Add((string)timer1.Tag + " - " + DateTime.Now.Ticks.ToString());
        }
    }

}



02.03.2010 - 20:05 Uhr

Evtl so:

Du stehst mit einem Kumpel vor einem Zebrastreifen der durch eine Ampel geregelt wird. Es ist gerade rot.
Du bist blind oder gerade zu faul permanent die Ampel zu beobachten.
Also weisst Du deinen Kumpel an die Ampel für Dich zu beobachten (System).

Du hast eine Schulter auf die du reagieren kannst. Diese entspricht

public delegate void EventHandler(object sender, EventArgs e);

Der Kumpel soll für Dich die Ampel beobachten (Anmeldung):

//this.button1.Click ist der Kumpel
   //this.button1_Click ist Deine Schulter
   this.button1.Click += new System.EventHandler(this.button1_Click);

Er sieht für Dich auf die Ampel (System beobachtet für Dich das Ereignis).
Ampel schaltet auf Grün (Akteur macht Zustandsänderung).
der Kumpel bemerkt die Zustandsänderung.

Er klopft Dir auf die Schulter (Dein Ereignis wird ausgelöst).
Und Du gehst über die Strasse (Reaktion auf das Ereignis)

private void button1_Click(object sender, EventArgs e)
   {
      ....
   }

Du sagst "Danke Kumpel" (Abmeldung):

this.button1.Click -= new System.EventHandler(this.button1_Click);
25.09.2009 - 19:40 Uhr

Dieser Code ermittelt zu einer IP den Benutzernamen:


string name = System.Net.Dns.GetHostEntry("127.0.0.1").HostName;
System.Windows.Forms.MessageBox.Show(name);