tutorials.de Buch-Aktion 05/2012
Like Tree2Danke
  • 1 Beitrag von Alexander Schuc
  • 1 Beitrag von Alexander Schuc
ERLEDIGT
NEIN
ANTWORTEN
8
ZUGRIFFE
7555
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Terminator2 Terminator2 ist offline Mitglied Brokat
    Registriert seit
    Aug 2005
    Beiträge
    256
    Ich habe einen Typ "Element" erstellt:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
       public class Element
        {
            //Dezimalzahlen sind 4-stellig gerundet.
            //Prozentsatz der X1,Y1 Koordinate
            public Decimal Pos1_X;
            public Decimal Pos1_Y;
     
            //Prozentsatz der X2,Y2 Koordinate
            public Decimal Pos2_X;
            public Decimal Pos2_Y;
        }

    Wenn man mit der Maus ein Fenster auf dem Bildschirm aufzieht, wird das Rechteck beim Loslassen der Maus gesichert:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    
            private void cameraWindow_MouseDown(object sender, MouseEventArgs e)
            {
                //Nur durchführen, wenn ein neues Fenster gezeichnet werden soll:
                if (DrawingWindow == true)
                {
                    //Nur bei linker Maustaste reagieren & voriger Auswahl des Objekttypes:
                    if (e.Button == MouseButtons.Left)
                    {
                        MausDown = true;
                        list.Add(new Point(e.X, e.Y));
                    }
     
                    //Bei rechter Maustaste Vorgang abbrechen:
                    if (e.Button == MouseButtons.Right)
                    {
                        DrawingWindow = false;
                        MausDown = false;
                        list.Clear();
                        cameraWindow.Invalidate();
                        StatusInfo.Text = "";
                    }
                }
            }
     
            private void cameraWindow_MouseMove(object sender, MouseEventArgs e)
            {
                if (MausDown == true)
                {
                    if ((e.X >= 0) & (e.Y >= 0) & (e.X <= cameraWindow.Width) & (e.Y <= cameraWindow.Height))
                    {
                        list.Add(new Point(e.X, e.Y));
                    }
                }
            }
     
            private void cameraWindow_MouseUp(object sender, MouseEventArgs e)
            {
                if ((MausDown == true) & (DrawingWindow == true))             //Wenn Maustaste gedrückt war und ein Fenster gezeichnet werden soll
                {
                    SaveElement();                                          //Objekt in Bibliothek übernehmen
                    list.Clear();                                           //Liste mit Koordinaten leeren
                    if (e.Button == MouseButtons.Left) MausDown = false;    //Maustaste losgelassen
                    DrawingWindow = false;                                  //Fenster gezeichnet -> fertig
                    StatusInfo.Text = "";
                }
            }
     
            private void SaveElement()
            {
                Element Form = new Element();                               //Ein neues Objekt wird in die Bibliothek eingefügt
     
                decimal POS;
     
                //X-WERTE:  Koordinaten nach Größe ordnen und auf 4-stelligen %-Wert runden
                if (list[0].X < list[list.Count - 1].X)
                {
                    POS = list[0].X * 100 / cameraWindow.Width;
                    Form.Pos1_X = Math.Round(POS, 4);
     
                    POS = list[list.Count - 1].X * 100 / cameraWindow.Width;
                    Form.Pos2_X = Math.Round(POS, 4);
                }
                else
                {
                    POS = list[0].X * 100 / cameraWindow.Width;
                    Form.Pos2_X = Math.Round(POS, 4);
     
                    POS = list[list.Count - 1].X * 100 / cameraWindow.Width;
                    Form.Pos1_X = Math.Round(POS, 4);
                }
     
                //Y-WERTE:  Koordinaten nach Größe ordnen und auf 4-stelligen %-Wert runden
                if (list[0].Y < list[list.Count - 1].Y)
                {
                    POS = list[0].Y * 100 / cameraWindow.Height;
                    Form.Pos1_Y = Math.Round(POS, 4);
     
                    POS = list[list.Count - 1].Y * 100 / cameraWindow.Height;
                    Form.Pos2_Y = Math.Round(POS, 4);
                }
                else
                {
                    POS = list[0].Y * 100 / cameraWindow.Height;
                    Form.Pos2_Y = Math.Round(POS, 4);
     
                    POS = list[list.Count - 1].Y * 100 / cameraWindow.Height;
                    Form.Pos1_Y = Math.Round(POS, 4);
                }
     
                AlarmWindow.Add(Form);  //Element hinzufügen zur Liste mit allen Alarm-Fenstern
            }

    Ich habe absolut keinen Fehler finden können. Die Prozeduren werden außerdem alle vollständig ausgeführt.
    Allerdings kann ich die Elemente mit nichts in der Welt wieder weiterverarbeiten...
    Hier noch die Deklaration der Liste, die die Elemente enthält:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
        public class MainForm : System.Windows.Forms.Form
        {
            public static MainForm Instance = new MainForm();
     
            //Variablen
            private Boolean MausDown;
            private Boolean DrawingWindow;
            private readonly List<Point> list;
            public List<Element> AlarmWindow;


    Bin leider noch ganz neu in C# und komme nicht mehr weiter, ich hoffe Ihr könnt mir helfen.


    Danke!
     

  2. #2
    Avatar von Alexander Schuc
    Alexander Schuc Alexander Schuc ist offline admin | crazy-weasel
    tutorials.de Administrator
    Registriert seit
    Aug 2001
    Ort
    Österreich, Stmk, Graz
    Beiträge
    2.783
    Hi.

    1. Warum speicherst du alle Punkte die sich bei MouseMove ansammeln in einer Liste?
    Statt deiner Liste "list" würden es 2 Variablen vom Typ Point auch tun. Bei MouseDown setzt du den ersten Punkt, und bei MouseMove überschreibst du den 2. Das sind ja die einzigen interessanten. Deine Liste kann ja durchaus mal etwas lang werden, und beinhaltet nur uninteressante Objekte.

    2. Was meinst du mit Allerdings kann ich die Elemente mit nichts in der Welt wieder weiterverarbeiten...?

    Deine erstellten Element-Objekte liegen in der Liste AlarmWindow, und wenn du damit etwas machen möchtest, musst ja nur auf diese über eben jene Liste zugreifen.

    lg, Alex
    c4dazubi08 bedankt sich. 
    With the first link the chain is forged. The first speech censored, the first thought forbidden, the first freedom denied, chains us all irrevocably.
    Aaron Satie

    Legends... are the spice of the universe, Mr. Data, because they have a way of sometimes coming true.
    Captain Jean-Luc Picard, Stardate ~41294.5

    Tutorials.de chattet. Hier gibts auch .net Support ^^
    Klickt auf chattet und nutzt den Webchat, oder verbindet euch zu irc.tutorials.de - Channel #Tutorials.de

    (moo)blog furred.net // SiteInfo für WP7 // Pastebin für WP7 // BlogEngine.net Extensions

  3. #3
    Terminator2 Terminator2 ist offline Mitglied Brokat
    Registriert seit
    Aug 2005
    Beiträge
    256
    Also zu 1.
    Das stimmt natürlich Der Grund für die Liste war der, dass man das Rechteck während des Aufziehens mit der Maus auch sehen sollte. Allerdings braucht man da auch keine Liste für. Ich werde das bei nächster Gelegenheit ändern

    Und zu 2.
    Ich greife in einer anderen Klasse auf diese globalen Variablen zu. Da habe ich den Code vergessen, stelle ich gerade fest. Also hier der Code, mit dem ich gerne auf die Variablen zugreifen würde und dann in meine PictureBox zeichnen will:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
               //Elemente zeichnen               
                for (int i = 0; i <= MainForm.Instance.AlarmWindow.Count - 1; i++)
                {
                    //Da die Koordinaten sortiert vorliegen, kann die Breite einfach errechnet werden
                    int X1 = (int)MainForm.Instance.AlarmWindow[i].Pos1_X / 100 * MainForm.Instance.cameraWindow.Width;
                    int Y1 = (int)MainForm.Instance.AlarmWindow[i].Pos1_Y / 100 * MainForm.Instance.cameraWindow.Height;
                    int X2 = (int)MainForm.Instance.AlarmWindow[i].Pos2_X / 100 * MainForm.Instance.cameraWindow.Width;
                    int Y2 = (int)MainForm.Instance.AlarmWindow[i].Pos2_Y / 100 * MainForm.Instance.cameraWindow.Height;
     
                    int W = X2 - X1;
                    int H = Y2 - Y1;
     
                    Graphics g = pe.Graphics;
                    Pen pen = new Pen(rectColor, 1);
     
                    g.DrawRectangle(pen, X1, Y1, W, H);
               }
                g.DrawRectangle(pen, 5, 5, 50, 50);

    In dem Code sollen alle Elemente aus der Liste gezeichnet werden. Es erscheint jedoch nichts.
    Zur Kontrolle ist der letzte Befehl: Dieses Rechteck wird gezeichnet.
    Ich vermute, dass etwas mit der For-Schleife nicht stimmt oder ich falsch auf meine globale Variable zugreife. Fehlermeldungen bekomme ich keine und Haltepunkte kann ich auch nicht setzen.

    PS: Wie kann ich Integer Werte bei C# mal eben mit einer MsgBox ausgeben? Bei VB mache ich das öfters wenn ich Probleme habe, hier habe ich jedoch nichts richtiges gefunden, da C# auch ziehmlich oft meckert wenn man Integer nicht zu String konvertiert. Diesen Befehl habe ich auch nicht auffinden können

    Ich hoffe, dass Ihr mit den Infos etwas mehr anfangen könnt


    Gruß David
     

  4. #4
    Avatar von Alexander Schuc
    Alexander Schuc Alexander Schuc ist offline admin | crazy-weasel
    tutorials.de Administrator
    Registriert seit
    Aug 2001
    Ort
    Österreich, Stmk, Graz
    Beiträge
    2.783
    Hi.

    Mhm auf den ersten Blick fällt mir jetzt nichts auf, worans scheitern könnte.
    Nur ein paar kosmetische Sachen:

    1. Bei deiner Schleife kannst du statt "<=" und ".Count -1" auch einfach
    Code csharp:
    1
    
    for (int i = 0; i < MainForm.Instance.AlarmWindow.Count ; i++)
    schreiben.

    2. In deiner Schleife hast du
    Code csharp:
    1
    2
    
    Graphics g = pe.Graphics;
    Pen pen = new Pen(rectColor, 1);

    Das kann vor die Schleife! (Also bevor dem "for") Du musst das, vorallem den Stift, nicht jedes mal neu erstellen. (bzw zuweisen beim Graphics Objekt)

    3. Bei Pen sollte Dispose aufgerufen werden, wenns nicht mehr benutzt wird.

    PS: Wie kann ich Integer Werte bei C# mal eben mit einer MsgBox ausgeben?
    Unter anderem so:
    Code csharp:
    1
    2
    
    int i = 5;
    MessageBox.Show(i.ToString());

    lg,..
     
    With the first link the chain is forged. The first speech censored, the first thought forbidden, the first freedom denied, chains us all irrevocably.
    Aaron Satie

    Legends... are the spice of the universe, Mr. Data, because they have a way of sometimes coming true.
    Captain Jean-Luc Picard, Stardate ~41294.5

    Tutorials.de chattet. Hier gibts auch .net Support ^^
    Klickt auf chattet und nutzt den Webchat, oder verbindet euch zu irc.tutorials.de - Channel #Tutorials.de

    (moo)blog furred.net // SiteInfo für WP7 // Pastebin für WP7 // BlogEngine.net Extensions

  5. #5
    Terminator2 Terminator2 ist offline Mitglied Brokat
    Registriert seit
    Aug 2005
    Beiträge
    256
    hey,

    Habe alles soweit geändert.
    Das mit der MessageBox würde es normalerweise tun, aber die Meldung wird gar nicht gesendet. Das wundert mich wirklich sehr...
    Hier erstmal mein aktueller Code:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
                Graphics    g = pe.Graphics;
                Pen         pen = new Pen( rectColor, 1 );
     
                for (int i = 0; i < MainForm.Instance.AlarmWindow.Count; i++)
                {
                    //Da die Koordinaten sortiert vorliegen, kann die Breite einfach errechnet werden
                    int X1 = (int)MainForm.Instance.AlarmWindow[i].Pos1_X / 100 * MainForm.Instance.cameraWindow.Width;
                    int Y1 = (int)MainForm.Instance.AlarmWindow[i].Pos1_Y / 100 * MainForm.Instance.cameraWindow.Height;
                    int X2 = (int)MainForm.Instance.AlarmWindow[i].Pos2_X / 100 * MainForm.Instance.cameraWindow.Width;
                    int Y2 = (int)MainForm.Instance.AlarmWindow[i].Pos2_Y / 100 * MainForm.Instance.cameraWindow.Height;
     
                    int W = X2 - X1;
                    int H = Y2 - Y1;
     
                    MessageBox.Show(X1.ToString());
                    
                    g.DrawRectangle(pen, X1, Y1, W, H);
               }
                g.DrawRectangle(pen, 5, 5, 50, 50);
                
                pen.Dispose( );

    Das merkwürdige ist ja, dass dieses Rechteck nach der For-Schleife gezeichnet wird und die Befehle in der For-Schleife scheinbar gar nicht beachtet werden... Woran kann das denn liegen? Vielleicht ist die Liste immer leer oÄ.

    @Alex,
    Soll ich dir das Projekt vielleicht mal zusenden?
     

  6. #6
    Avatar von Alexander Schuc
    Alexander Schuc Alexander Schuc ist offline admin | crazy-weasel
    tutorials.de Administrator
    Registriert seit
    Aug 2001
    Ort
    Österreich, Stmk, Graz
    Beiträge
    2.783
    Hm..

    Dann mach mal folgendes

    Code csharp:
    1
    2
    3
    4
    
    MessageBox.Show(MainForm.Instance.AlarmWindow.Count.ToString());
     
    for (int i = 0; i < MainForm.Instance.AlarmWindow.Count; i++)
    {

    Scheinbar bekommst du da nichts rein... dürfte also 0 sein. Vielleicht hilft dir das beim Debuggen.

    Und nein, bitte nicht zuschicken. Wenn könntest es an einen Beitrag anhängen,.. aber ich hab grad nicht wirklich Zeit da ganz drüber zu sehen..

    Probier da mal rum, und versuch rauszufinden, warum da nichts in deine Liste reinkommt. (Auch mal mit Haltepunkten in deinen Eventhandlern wo die Objekte erstellt werden zum Beispiel)

    lg,..
     
    With the first link the chain is forged. The first speech censored, the first thought forbidden, the first freedom denied, chains us all irrevocably.
    Aaron Satie

    Legends... are the spice of the universe, Mr. Data, because they have a way of sometimes coming true.
    Captain Jean-Luc Picard, Stardate ~41294.5

    Tutorials.de chattet. Hier gibts auch .net Support ^^
    Klickt auf chattet und nutzt den Webchat, oder verbindet euch zu irc.tutorials.de - Channel #Tutorials.de

    (moo)blog furred.net // SiteInfo für WP7 // Pastebin für WP7 // BlogEngine.net Extensions

  7. #7
    Terminator2 Terminator2 ist offline Mitglied Brokat
    Registriert seit
    Aug 2005
    Beiträge
    256
    Habe nochmal was weiterprobiert.
    Ich vermute, das hat mit der globelen Deklaration der Variablen zu tun. ich habe das neue Element einmal einfach zu "AlarmWindow" hinzugefügt und ein anderes Mal zu "MainForm.Instance.AlarmWindow". Die beiden Variablen müssten identisch sein, sind sie aber nicht...

    Hier nochmal der Deklarationsbefehl:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
        public class MainForm : System.Windows.Forms.Form
        {
            public static MainForm Instance = new MainForm();
     
            //Variablen
            private Boolean MausDown;
            private Boolean DrawingWindow;
            private List<Point> list = new List<Point>();
            public List<Element> AlarmWindow=new List<Element>();

    Ich habe das nur im Internet gefunden, bin aber etwas verwirrt, warum das hier so schwierig ist... Dieses new MainForm erzeugt doch alles ein zweites Mal oder?


    Gruß David
     

  8. #8
    Avatar von Alexander Schuc
    Alexander Schuc Alexander Schuc ist offline admin | crazy-weasel
    tutorials.de Administrator
    Registriert seit
    Aug 2001
    Ort
    Österreich, Stmk, Graz
    Beiträge
    2.783
    Argh!

    Ja, das passt nicht. Du schreibst dort Instance = new MainForm();. Damit erzeugst du eine neue Instanz von deinem Fenster. Du siehst das nur nicht, weil Show nicht augerufen wird, deswegen ist das Fenster nicht sichtbar.

    Mach das eher so:

    Code csharp:
    1
    2
    3
    4
    5
    6
    7
    8
    
    public static MainForm Instance;
     
    // und im Konstruktor:
    public MainForm()
    {
      MainForm.Instance = this;
      //.. rest
    }

    Klappt dann eher..

    Übrigens.. du machst vieles mit öffentlichen Membern in deinen Klassen. Schau dir mal Properties an.
    Terminator2 bedankt sich. 
    With the first link the chain is forged. The first speech censored, the first thought forbidden, the first freedom denied, chains us all irrevocably.
    Aaron Satie

    Legends... are the spice of the universe, Mr. Data, because they have a way of sometimes coming true.
    Captain Jean-Luc Picard, Stardate ~41294.5

    Tutorials.de chattet. Hier gibts auch .net Support ^^
    Klickt auf chattet und nutzt den Webchat, oder verbindet euch zu irc.tutorials.de - Channel #Tutorials.de

    (moo)blog furred.net // SiteInfo für WP7 // Pastebin für WP7 // BlogEngine.net Extensions

  9. #9
    Terminator2 Terminator2 ist offline Mitglied Brokat
    Registriert seit
    Aug 2005
    Beiträge
    256
    Die Sache mit den Properties werde ich mir mal genau anschauen

    Hab die Sachen jetzt geändert, die du gepostet hast. Damit klappt es schon um einiges besser. Jetzt greife ich immer auf das richtige Element zu.
    Die Anzahl der Elemente wird auch größer wenn ich neue Fenster aufziehe, so wie gewollt.
    Jetzt habe ich noch weitergetestet und soeben festgestellt, dass meine Umrechnung von Prozentwerten in Koordinaten nicht funktioniert:
    Code :
    1
    
    decimal W_korrektur = 1 / 100 * MainForm.Instance.cameraWindow.Width; //Ergibt immer 0, Breite des Fensters jedoch 321

    Vielleicht habe ich da etwas falsch umgewandelt?!


    Gruß David und schon einmal ein großes Lob an deine Hilfe, wäre nie auf die Fehler gekommen

    EDIT:

    Habe den Fehler nun selbst gefunden und behoben. Konvertieren war das Stichwort. Man muss tatsächlich selbst die Zahl 1 in Decimal konvertieren, um damit rechnen zu können... Das war ich von Visual Basic wirklich nicht gewohnt. Hier nun der Befehl von oben korrigiert:
    Code :
    1
    
    decimal W_korrektur = (decimal)1 / (decimal)100 * (decimal)MainForm.Instance.cameraWindow.Width;

    Edit 2:

    Habe noch eine Fehlermeldung beim Öffnen des Designers:

    Das Steuerelement motion.CameraWindow hat eine unbehandelte Ausnahme im Designer ausgelöst und wurde deaktiviert.
    Ausnahme:
    Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
    Stapelüberwachung:
    bei motion.CameraWindow.OnPaint(PaintEventArgs pe)

    Der Fehler war anfangs nicht da. Ich glaube dass er erst kam, als ich diese globalen Variablen gesetzt habe...
    Hier noch die Funktion OnPaint ohne ihren Inhalt:

    Code :
    1
    2
    3
    
    protected override void OnPaint(PaintEventArgs pe)
            {
            }
    Geändert von Terminator2 (31.03.09 um 20:39 Uhr)
     

Ähnliche Themen

  1. Lineare Liste, Elemente hinzufügen und entfernen
    Von mrs_schokokeks im Forum C/C++
    Antworten: 11
    Letzter Beitrag: 07.09.10, 08:07
  2. Qt: Elemente bei Tab-wechsel hinzufügen
    Von Ozzy Ozborn im Forum C/C++
    Antworten: 0
    Letzter Beitrag: 06.11.07, 09:07
  3. Dom Elemente hinzufügen und löschen
    Von Stefan Miefert im Forum Javascript & Ajax
    Antworten: 4
    Letzter Beitrag: 15.09.06, 06:07
  4. GEF Grundlagen - Elemente hinzufügen
    Von SOSUS im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 3
    Letzter Beitrag: 10.12.04, 15:11
  5. mit js dom td-Elemente hinzufügen
    Von quezo im Forum Javascript & Ajax
    Antworten: 6
    Letzter Beitrag: 26.02.03, 14:25