Laden...

Forenbeiträge von Vincent Duke Ingesamt 27 Beiträge

11.08.2009 - 16:53 Uhr

Jetzt funktioniert es bei mir auch.

Das erste Problem war wie von JAck30lena und pdelvo richtig bemerkt dass die Werte nicht im c'tor sondern in der Form_Load methode gesetzt werden müssen.

Das zweite Problem war, dass die WindowState Propertie auf FormWindowState.Maximized gesetzt war und diese aber auf Normal gesetzt sein muss.

Danke für die schnelle Hilfe!

11.08.2009 - 16:05 Uhr

Nein er wird nach rechts auf den 2ten hin erweitert.

11.08.2009 - 15:58 Uhr

Der linke auf dem die Form angezeit wird!

11.08.2009 - 15:56 Uhr

Die Location der Form wird auf 0/0 gesetzt.

Dann setze ich mit



this.Width = screens[0].Bounds.Width + screens[1].Bounds.Width;


die Breite der Form auf die Breite beider Bildschirme.

Die Form wird aber nur am 1 Monitor angezeit und abgeschnitten.

11.08.2009 - 15:37 Uhr

Hallo!

Ich habe folgendes Problem:

Ich möchte eine WinForm über 2 Bildschirme anzeigen.
Ich bekomme bereits über:


Screen[] sc = Screen.AllScreens;

ein Screen Array und erhalte daraus die Breite und Höhe der Monitore.
Wenn ich aber die Width Eigenschaft der Form größer setzte als die Breite des anzuzeigenden Monitors wird die Form abgeschnitten.

Wie kann ich die Form über mehrere Monitore anzeigen?

Danke schon im voraus!!!!!

18.04.2009 - 12:00 Uhr

Hallo!

Wie von herbivore vermutet lag der Hund wirklich in dem Bitmap-Objekt selbst begraben.

Vincent

18.04.2009 - 10:58 Uhr

Danke für die schnelle Antwort!

Der überarbeitete Code sieht jetzt wie folgt aus:



public List<List<int>> GetGreyValue(Bitmap image)
        {
            List<List<int>> greyValues = new List<List<int>>();
            Bitmap analysisImage = (Bitmap)image.Clone();

            imageData = analysisImage.LockBits(new Rectangle(0, 0, analysisImage.Width, analysisImage.Height),
                                                   ImageLockMode.ReadWrite,
                                                   analysisImage.PixelFormat);

            int iOffset = imageData.Stride - (imageData.Width * 3);

            unsafe
            {
                byte* pImagePixel = (byte*)imageData.Scan0;
                for (int i = 0; i < imageData.Height; ++i)
                {
                    greyValues.Add(new List<int>());

                    for (int j = 0; j < imageData.Width; ++j)
                    {
                        try
                        {
                            greyValues[i].Add(pImagePixel[0]);
                            pImagePixel += 3;
                        }
                        catch (Exception ex)
                        {
                            System.Windows.Forms.MessageBox.Show(ex.Message);
                        }
                    }
                    pImagePixel += iOffset;
                }
            }

            analysisImage.UnlockBits(imageData);

            return greyValues;
        }
    }


Leider bekomme ich bei "analysisImage.LockBits(..)" immer noch die AccessViolationException.

Als Zusatzinfo:
Bei dem Bild handelt es sich um ein Image dass im LiveMode von einer Kamera eingelesen wird.

Vincent

18.04.2009 - 10:21 Uhr

Hallo!

Ich möchte den Grauwert eines Bildes ermitteln. Dabei gehe ich wie folgt vor.



public List<List<int>> GetGreyValue(Bitmap image)
        {
            List<List<int>> greyValues = new List<List<int>>();
            Bitmap analysisImage = (Bitmap)image.Clone();

            BitmapData imageData = analysisImage.LockBits(new Rectangle(0, 0, analysisImage.Width, analysisImage.Height),
                                                          ImageLockMode.ReadWrite,
                                                          PixelFormat.Format24bppRgb);

            unsafe
            {
                byte* pImagePixel = (byte*)imageData.Scan0;
                for (int i = 0; i < imageData.Height; ++i)
                {
                    greyValues.Add(new List<int>());

                    for (int j = 0; j < imageData.Width; ++j)
                    {
                        try
                        {
                            greyValues[i].Add(pImagePixel[0]);
                            pImagePixel += 3;
                        }
                        catch (Exception ex)
                        {
                            System.Windows.Forms.MessageBox.Show(ex.Message);
                        }
                    }
                }
            }

            analysisImage.UnlockBits(imageData);

            return greyValues;
        }


Wenn diese Funktion öffters aufgerufen wird bekomme ich folgende Exception:
AccessViolationException (Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.)

Weiß irgendjemand was in diesem Fall der Grund für diese Exception sein kann.

danke schon mal im vorraus

12.03.2009 - 15:12 Uhr

Die Lösung kann oft so einfach sein! Danke so werde ich es machen!

mfg Vincent

12.03.2009 - 14:45 Uhr

Hallo!

Ich möchte herausfinden ob eine Method bereits auf ein Delegate angemeldet ist, und abhängig davon die Methode dann auf dem Delegate anmelden oder auch nicht.

Kann ich über die Method Property des Delegate dies herausfinden?

mfg
Vincent

03.03.2009 - 10:23 Uhr

Danke!

Dann werde ich das Kreuz einfach über das Bild zeichnen.

03.03.2009 - 09:59 Uhr

Hallo!

Ich habe folgendes Problem:

Ich lese über eine Kamera Bilder im Live - Modus ein. Diese Bilder stelle ich dann in einem Panel dar.
Jetzt möchte ich aber über dieses Bild ein Kreuz legen. Ein Ansatz wäre es jedesmal über das neue Bild das Kreuz zu zeichnen. Gibt es da eine bessere Lösung so das ich das Kreuz nicht immer neu zeichnen muss?

24.02.2009 - 11:14 Uhr

Hallo!

Ich habe folgendes Proble:

Ich arbeite in meiner Anwendung mit einem DataGridView.
An dieses übergebe ich eine Liste mit Objecten.



class TMP
{
      public int value{get; set;}
}

List<TMP> liTmp = new List<TMP>();

//Fill list

dataGridView.DataSource = liTmp;


Das funktioniert.

Wenn ich jetzt aber eine Wert im DataGridView ändere bekomme ich folgende Exception:

Der Vorgang ist ungültig, da er einen Wiedereintrittsaufruf an die SetCurrentCellAddressCore-Funktion zur Folge hat.

Wo liegt das Problem?
Was kann ich dagegen tun?

Vincent

20.02.2009 - 08:37 Uhr

Genau.
Ich möchte es so haben wie z.B. bei einer PictureBox und dessen BackgroundImage. Erst beim hinzufügen eines Images werden einige Subeinstellungen sichtbar.

19.02.2009 - 14:47 Uhr

Hallo!

Ich habe eine eigene TextBox erstellt. Diese TextBox verfügt über mehrere zusätzliche properties.
Eine davon gibt an ob die TextBox double Werte zulässt.
Nun möchte ich als subproperty von "AllowDouble", "OnlyPositive" haben.
Gibt es dazu ein Attribut.

Gruß
Vincent

16.02.2009 - 14:01 Uhr

Ich arbeite mit dem State pattern. Ich habe für jeden schritt eine eigene Klasse.
Wenn ich jetzt ein Event aus dem ReadValueThread feuere wird der nächste schritt aktiv und die abarbeitung der Schrittkette geht im ReadValue Thread weiter wodurch die eigentliche Funktion des ReadValue Threads (Werte einlesen) nicht mehr gegeben ist.

 

public void ReadValue()
{

      i = ReadValueFromExtern();
      if (i > 10)
           ValueReachedEvent();

}


 

tmp.ValueReachedEvent += new OwnEventHandler(WaitForI);

public void WaitForI()
{

      stateHandler.NextState();

}


16.02.2009 - 13:46 Uhr

Ich möchte dass die Schrittkette im MainThread weiterläuft!

Wenn ich ein Event in der readValue methode feuere wird die abarbeitung der Schrittkette im readValue Thread ausgeführt.

Oder habe ich da einen Denkfehler?

16.02.2009 - 13:30 Uhr

Hallo!

Ich habe einen Thread der ständig Werte von einem externen Gerät einliest.

Dann habe ich noch meinen Main Thread in dem eine Schrittkette abgearbeitet wird.
In einem Schritt der Schrittkette warte ich bis das externe Gerät einen gewissen Wert erreicht.

Zur Zeit mache ich es so, dass ich den eingelesenen Wert auf eine Variable schreible.
Diese Varible frage ich dann in dem Warteschritt (Wert > xy) in einer Schleife ab.

MainThread:



public void WaitForI()
{

while(i < 10)
{
Application.DoEvents();
}
NextState();

}

Thread zum Einlesen der Werte



public void ReadValue()
{

i = ReadValueFromExtern();

}

Gibt es hier irgendeine Möglichkeit dies über ein Event zu lösen um im MainThread nicht immer die Variable abfragen zu müssen?

Vincent

13.02.2009 - 10:34 Uhr

Hallo!

Ich habe zuerst auch an eine Enum gedacht.
Aber da ich als Werte strings(Namen) bereitstellen möchte ist dies nicht möglich.

Vincent

13.02.2009 - 10:21 Uhr

Hallo!

Danke für die schnelle Antwort!

13.02.2009 - 10:07 Uhr

Hallo!

Ich möchte aus folgender Klasse


public static class TMP
{
      public const string TMP1 = "1";
      public const string TMP2 = "2";
      public const string TMP3 = "3";
      public const string TMP4 = "4";
      public const string TMP5 = "5";
}

alle string member auslesen.

Wäre reflection ein Ansatz?

Hat irgendwer eine Idee?

Vincent

12.02.2009 - 19:50 Uhr

[EDIT=herbivore]Abgeteilt von GUI-Error: Ungültier threadübergreifender Vorgang[EDIT]

Ok, danke für die schnelle Antwort.

Jetzt habe ich noch eine Frage und zwar wie ihr folgendes Problem angehen würdet:

Ich arbeite mit dem StatePattern.
Mein aktiver State wartet bis ein externes Gerät einen bestimmten Wert ereicht.
Das einlesen dieser Werte mache ich in einem eigenem Thread in einer eigenen Klasse (wie gehabt).
Beim erreichen der Werten möchte ich jetzt dem aktivem State mitteilen dass der Wert erreicht ist und er mit der ausführung seiner Funktion in seinem Thread fortsetzen kann.
Zurzeit schreibe ich die Werte auf eine Variable die dann wiederum im MainThread zyklisch abgefragt wird.

Kann man das nicht besser lösen?

Vincent

12.02.2009 - 19:29 Uhr

Ich melde mich mit einer Methode der GUI Instanz auf dem Delegate an.

Außerdem arbeite ich in derselben Anwendung auf genau diese Art und weise.
Wenn mein Ansatz falsch wäre würde es nicht möglich sein dass ich mit Delegate.Invoke(..) breits Werte auf der GUI auslese.

Hier muss also irgendein spezieller Fall vorliegen!

12.02.2009 - 19:12 Uhr

Wenn ich auf dem Control invoke aufrufe funktioniert es.

Kann mir trotzdem jemand erklären warum es sein kann dass, wenn ich auf dem delegate, auf dem die GUI methode zum setzen der Werte angemeldet ist, invoke aufrufe, ich dann trotzdem die obige Fehlermeldung bekomme.

Das Handle meiner GUI ist != null.
Weiters wartet auch der GUI Thread nicht auf den Thread zum einlesen der Werte.
Auserdem funktioniert das genau gleich Design wenn ich von einer anderen Klasse auf dieselbe GUI zugreife.

Ich bin für jeden Hinweis dankbar

Vincent

12.02.2009 - 18:28 Uhr

Hallo!

Ich habe folgendes Problem:

Ich lese von einem externen Gerät über die serielle Schnittstelle Messwerte ein.
Dieses einlesen passiert in einem eigenem Thread.
Nun möchte ich die eingelesenen Werte auf der GUI in einer TexBox anzeigen.
Dazu habe ich ein delegate erstellt.
Auf diesem Delegate meldet sich dann eine Methode in der GUI an welche Werte in die TextBox schreibt.
Sobald jetzt im Thread zum Einlesen der Werte ein neuer Wert gelesen wurde rufe ich dieses Delegate mit Delegate.Invoke(DoubleValue) auf.
Diese Methode habe ich schon einmal erfolgreich eingesetzt.

Doch leider bekomme ich jetzt immer beim schreiben des Wertes in die Textbox folgende Fehlermeldung:

Ungültier threadübergreifender Vorgang: Der Zugriff auf das Steuerelement erfolgt von einem anderen Thread als dem Thread, für des es erstellt wurde.

Ich hoffe irgendwer kann mir helfen.

mfg
Vincent

06.02.2009 - 15:30 Uhr

Hallo!

Super so funktioniert es!

Danke für die schnelle Hilfe!

Vincent

06.02.2009 - 14:36 Uhr

Hallo!

Ich habe folgendes Problem:

In meiner GUI befindet sich eine TrackBar. Wenn ich auf diese TrackBar mit der Maus fahre die linke Maustaste drücke und dann auf und ab fahre wird dass Scroll event ausgelöst.
Tritt während dieses scrollens ein Fehler auf gebe ich eine MessageBox aus.
Wenn ich jetzt nach bestätigen der MessageBox auf die TrackBar fahre wird trotz nicht gedrückter Maustaste das scroll event ausgelöst.
Ich vermute, dass das Programm wenn die MessageBox offen ist das MouseUp event nicht mitbekommt!

Gibt es irgendeine Möglichkeit dieses MouseUp event sofwareseitig auszulösen?
Oder setze ich an der falschen Stelle an?

mfg
Vincent