Laden...

Forenbeiträge von MBoerner Ingesamt 22 Beiträge

17.05.2018 - 10:21 Uhr

Danke schön!
das hat mir geholfen.
Es klappt auch.

16.05.2018 - 16:34 Uhr

Guten Tag!
ich habe ein Demo-Programm in WPF, das ich gern in Windowsform umsetzen würde.

Es gibt in der Demo-Anwendung ICommand-Befehle, ich sehe nicht, wo man nachvollziehen kann, was sie machen. Und auch nicht, wie man sie aufruft.

Zum Beispiel:

    /// <summary>
    /// Gets the DoOpenBusCommand. This command opens the bus connection.  
    /// </summary>
    public ICommand DoOpenBusCommand
    {
      get
      {
        if (_openBusCommand == null)
        {
          _openBusCommand = new DelegateCommand(new Action(OpenBusExecuted), true);
        }
        return _openBusCommand;
      }
    }

Wo sehe ich da, was für Befehle aufgerufen wurden? Und kann man sowas auch in WindowsForms machen?

Danke im Voraus für die Hilfe

20.03.2018 - 16:28 Uhr

Ach so,
danke schön!

ich probiere es so.

MBoerner

16.03.2018 - 13:22 Uhr

Guten Tag,
ich habe eine grundsätzliche Frage zu einer Aufgabe, die mir öfter begegnet:

ich habe eine Windows Form. Dort erstelle ich ein Tabcontrol.
Die einzelnen Pages sind user controls, die ich dann mit bunten Kästchen fülle.
Beim Erstellen einer Instanz aus dieser Page, wird das Paintereignis aufgerufen mit dem Parameter PaintEventArgs e.
Die Grafik-Operationen mache ich mit Graphics g = e.Graphics;

Alles läuft gut, bis ein Maus-Ereignis erfordert, einen Teil der Grafik zu verändern (in dem Fall einen eigenen Tooltip mit Formatierungen) später aber den ursprünglichen Zustand zurück haben will.

Auf dem Graphics g = e.Graphics habe ich keinen zugriff mehr, seitdem ich das Paint-Ereignis verlassen habe.

Wie löse ich das am Besten?

zur Zeit mache ich es, indem ich einen screenshot vom Bildschirm sichere für später für die Wiederherstellung und in der Zwischenzeit mir eine neue Grafik erstelle.


//alter Zustand sichern
this.savedBackground = new Bitmap(this.panel.Width, this.panel.Height);  //gesamte Panelgröße
this.panel.DrawToBitmap(this.savedBackground, new Rectangle(0, 0, this.savedBackground.Width, this.savedBackground.Height));


//Neue Grafik benutzen
this.toolTipGraphics = this.panel.CreateGraphics();

Aber ich bin sicher, dass es keine elegante Lösung ist, obwohl sie funktioniert.

Wie macht man das am Besten? Wie behalte ich den Zugriff auf die Grafik der Page auch außerhalb des Paint-Ereignisses?

Vielen Dank im Voraus für Eure Ratschläge

MBoerner

10.01.2018 - 11:09 Uhr

guten Tag,

ich habe eine Anwendung gefunden, die einen comport benutzt.
Ich sehe nirgendwo, wo dieser ComPort angelegt wird, bisauf in der Datei Form.designer.cs, dort steht


      private System.IO.Ports.SerialPort serialAPI;

Wie bekommt man diese Variable, da rein? Dort sind sonst nur die Controls aus dem Werkzeugskasten wie buttons, usw...

Vielen Dank im Voraus

MBoerner

03.01.2018 - 16:25 Uhr

Guten Tag!
Dank eines Tutorials für 32Feet.NET habe ich ein kleines Programm, was eine Verbindung zu bluetooth-geräte erstellt.

Die Clientseite scheint zu funktionieren, jedenfalls sehe ich mein Fitbit-Armband.

Aber die Serverseite funktioniert nicht. Ich verstehe nicht, wie man die Servie GUI-Id bildet. Wenn ich es richtig verstanden habe steht "00001101-" für den serialPort der Bluetooth Verbindung.
Aber wie bilde ich den Rest?

Hier ist mein Code, er bleibt ewig bei "Server started; waiting for clients" stehen, mehr passiert nicht.

Vielen Dank im Voraus für Eure Hilfe


Guid mUUId = new Guid("00001101-0000-1000-8000-00805F9B34FB"); //00001101 ist der serialPort für Bluetooth, der Rest ist fest??
        
        Boolean serverStarted = false;

        public void ServerConnectThread()
        {
            BluetoothListener blueListener = new BluetoothListener(mUUId);
            updateUI("Server started; waiting for clients");
            blueListener.Start();
            BluetoothClient conn = blueListener.AcceptBluetoothClient();
            updateUI("client has connected");

            Stream mStream = conn.GetStream();
            while (true)
            {
                try
                {
                    //handle server connection
                    byte[] received = new byte[2014];
                    mStream.Read(received, 0, received.Length);
                    updateUI("received:" + Encoding.ASCII.GetString(received));
                    byte[] sent = new byte[2014];
                    sent = Encoding.ASCII.GetBytes("Hello World");
                    mStream.Write(sent, 0, sent.Length);
                }
                catch(IOException exception)
                {
                    updateUI("Client has disconnected");
                }

            }
        }

27.06.2017 - 11:27 Uhr

Guten Tag!
ich schreibe mir eigene Tooltips wegen der Formatierung. Das funktioniert jetzt ganz gut.
Der Benutzer zeigt über diverse gemalte Rechtecke in EINEM Panel und dann erscheint der toolTip.
Es wird aber bei dem MouseMove Ereignis geguckt, ob der Bereich sich geändert hat (der Benutzer über einen anderen Rechteck steht). Es passiert ab un zu, dass während der Bewegung "Zwischen"-Tooltips angezegt werden udn dann verschwinden, was unruhig aussieht.

Eigentlich wäre das Ereignis MouseHover am Besten, weil es erst feuert, wenn die Maus eine Weile still ist.
Aber soweit ich weiß, ist das MouveHover-Ereignis nur für ein Control, In dem Fall mein großes Panel mit vielen Rechtecken.
Das Ereignis feuert nur, wenn ich das Panel verlassen würde und dann wieder betreten würde, aber ich bewegen den Cursor nur innerhalb des Panels. Deswegen feuert es nur einmal und dann nicht wieder.

Meine Frage: Gibt es einen Möglichkeit einem Teilbereich eines Controls ein Hoverereignis zuzuordnen? Also jedem einzelnen Rechteck?

Ich habe alles Möglich probiert:
Delay nach einem Move Ereignis aber sobald die Maus still ist, wird das MouseMove Event nicht mehr ausgeführt.
MouseMove mit prüfen, ob die Koordinaten ähnlich sind udn nicht mehr soweit auseinander,
Das alles ist nicht so optimal.

Oder gibt es ein "Maus-ist-Still" Ereignis 😃

Vielen Dank im Voraus

27.06.2017 - 11:12 Uhr

Ja, das wäre eine Möglichkeit, aber man sieht es, das Bild flackert, weil es ziemlich viel ist. Das hat gut funktioniert mit dem screenshot sichern und zurückspielen.
Aber Danke für den Tip!

23.06.2017 - 14:07 Uhr

@Th69 : du hast recht, mit

 toolTipGraphics.DrawImage(_Background, this.toolTipRect);

funktioniert es einwandfrei!

Das Sleep ist nur zum Test, später verschwindet es und das Entfernen des ToolTips wird ausgelöst werden durch ein Maus-Ereignis.

Das " this.CreateGraphics()" habe ich tatsächlich aus der Not gemacht.
Diese Funktion "showToolTipRectWithText" wird indirekt von einem Mousereignis aufgerufen.
Da habe ich keinen Zugriff mehr auf die e.Graphics vom Paint Ereignis. "PaintEventArgs e"
Auch nicht, wenn ich ihn mir als " this.g = e.Graphics; merke, weil das PaintEventArgs nicht mehr zur Verfügung steht.
Ehrlich gesagt, weiß ich nicht, wie ich auf die Graphics von diesem Panel noch zugreifen kann, wenn ich außerhalb der Paint Funktion bin...
Da wäre ich für einen tip dankbar.

Vielen Dank für die Hilfe!

23.06.2017 - 13:58 Uhr

jetzt das Bild, wie es zum Schluss aussieht.
Die Größe und die Koordinaten sind richtig, aber der Inhalt ist falsch.

23.06.2017 - 13:54 Uhr

jetzt der screenshot, der gespeichert wurde.

23.06.2017 - 13:50 Uhr
  1. das Bild "ZeigerAufEFT.png" zeigt das ursprüngliche Bild, bevor der Tooltip erscheint.
    Da habe ich den zeiger genau auf dem "E" von "EFT " gehalten.
  2. das Bild "screenshot" zeigt den Inhalt der Bitmap
  3. das Bild "nachRestore.png" zeigt das Endergebnis. Der Rechteck ist genau an der richtigen Stelle und hat die richtigen Dimension (vom Tooltip) aber der Inhalt ist verschoben.
    Man sieht, dass es wie gekachelt ist, denn im screenshot stand "EFT" über "1.923,6"
    und im Endergebnis ist es darunter.
    Als wäre das Bild mehrmals hintereinander wiederholt worden und der ausschnitt ist falsch.

Vielen Dank im voraus

23.06.2017 - 12:46 Uhr

Guten Tag,
ich mache mir einen eigenen tootip, damit ich Textteile formatieren kann.
Dafür male ich einfach ein gelbes Rechteck und schreibe formatierten Text rein.
Bevor ich das male, mache ich mir einen screenshot im Bereich des Rechtseck.
Wenn der Toooltip verschwinden soll, male ich wieder ein Recjhteck an der gleichen Stelle mit den screenshot als Füllung (brush)
Es funktioniert aber nicht richtig.
Der screenshot ist richtig, ich kann mir die erstellte Bitmap angucken.
Die Größe und die position des zurückgestellten Bereichs ist auch OK.
Aber der Inhalt nicht: wenn ich die screenshot-Bitmap in ein Rechteck male, erscheint etwas anderes, als wäre das gekachelt und verschoben.

Ich schätze, dass es daran liegt, dass ich einen Screenshot vom Bildchirm mache (mit den Koordinaten der Form), das Rechteck aber in einem panel ist auf einer Registerkarte in der Form.

Aber ich kriege es nicht hin.

Kann jemand einen Blick auf meinem Code werfen? (der Text ist da noch nicht formatiert, kommt aber noch)

Die Parameter mouseX und mouseY sind die e.X udn e.Y beim mouseEventArgs e.

Vielen Dank im Voraus

 private void showToolTipRectWithText(String text, int mouseX, int mouseY)
        {
            //aktuellen Koordinaten festhalten
            int absX = Cursor.Position.X;
            int absY = Cursor.Position.Y; 
            if (text != null && text != "")
            {

                SolidBrush beigeBrush = new SolidBrush(Color.Beige);
                Font stringFont = new Font("Arial", 10);
                Bitmap _Background;
                int recMaxWidth = this.Width;  //Max Breite: die des Panels
                if (this.toolTipGraphics != null)
                    this.toolTipGraphics.Dispose();
                this.toolTipGraphics = this.CreateGraphics();

                // Measure string to have the dimension of the rectangle
                SizeF stringSize = new SizeF();
                stringSize = this.toolTipGraphics.MeasureString(text, stringFont, recMaxWidth);
                this.toolTipRect.Location = new Point(mouseX, mouseY);
                this.toolTipRect.Width = (int)stringSize.Width;
                this.toolTipRect.Height = (int)stringSize.Height;
                
                //Save the area in a screenshot before you draw the rectangle
                _Background = new Bitmap(this.toolTipRect.Width, this.toolTipRect.Height);
                Graphics.FromImage(_Background).CopyFromScreen(absX, absY, 0, 0, this.toolTipRect.Size);
                Brush brsBackground = new TextureBrush(_Background);
                _Background.Save("C:\\privat\\test.png");  //Prüfen, dass das Bild den richtigen Bereich beinhaltet->OK
                //

                // Draw rectangle with the  size of string.
                Pen pen = new Pen(Color.Black, 2);
                toolTipGraphics.DrawRectangle(pen, this.toolTipRect);
                toolTipGraphics.FillRectangle(beigeBrush, this.toolTipRect);
                // Draw string into the rectangle
                this.toolTipGraphics.DrawString(text, stringFont, Brushes.Black, new PointF(mouseX, mouseY));
                System.Threading.Thread.Sleep(3000);  //wait 3sec (test)
                //restore the screenshot into the rectangle
                toolTipGraphics.FillRectangle(brsBackground, this.toolTipRect);
                this.toolTipGraphics.Dispose();

            }   
        }
08.11.2016 - 16:34 Uhr

Das war es! in einem Fall war die Höhe des Rechteckes 0.

Die Lösung war wie in deinem Link angegeben in http://stackoverflow.com/questions/6506089/system-drawing-out-of-memory-exception?

Vielen Dank! ich hätte ewig suchen können.

08.11.2016 - 14:43 Uhr

OK danke schön, so klappt es. ich mache am Ende jeder Schleife ein Dispose()
Jetzt läuft es im mittleren Fenster.

Aber Sobald ich das Fenster maximiere, geht mir wieder der Speicher aus.
Jedenfalls kommt die se Meldung. Aber wenn ich anzeigen lasse, wieviel mein Prozess verbraucht, sind es gerade 4MB.

Kann es an der Größe der Rechtecke liegen? oder von e.Gaphics?
Kann man Rechtecke auch freigeben? Dispose steht jedenfalls nicht zur Auswahl.
Und wieso geben mir immer

currentProcess.WorkingSet64

und

System.Diagnostics.Process.GetCurrentProcess(

)

so niedrige Werte, wenn es wirklich an Speicher mangelt?

Kann es etwas anders sein als der Speicher?
mit catch(Exception e) lasse ich mir e.Message ausgeben und es steht wirklich
"nicht genügend Arbeitsspeicher "

Danke nochmal

08.11.2016 - 10:37 Uhr

Leider habe ich noch ein Problem: wenn ich versuche die LinearGradientBrush Eigenschaften vom Rectangle zu ändern bekomme ich die Fehlermeldung > Fehlermeldung:

Der Rückgabewert "System.Drawing.Drawing2D.LinearGradientBrush.Rectangle" kann nicht geändert werden, da er keine Variable ist.

Bei linearColors geht das.


 //
                        using (LinearGradientBrush linGrBrush = new LinearGradientBrush(
                        new Point((int)0, (int)currYAbgang),
                        new Point((int)(BEGINBALKEN - 5), (int)(currYAbgang + rectKWHight)),
                        Color.FromArgb(255, 255, 255, 255),  
                        Color.FromArgb(0, 0, 0))) 
                        {
                               
                                this.g.FillRectangle(linGrBrush, rectKW);
                                // jetzt für die Abgänge
                                linGrBrush.Rectangle.X = BEGINBALKEN;
                                linGrBrush.Rectangle.Y = currYAbgang;
                                linGrBrush.Rectangle.Width= BEGINBALKEN - 5;
                                linGrBrush.Rectangle.Height = rectKWHight;
                                linGrBrush.LinearColors[0] = Color.FromArgb(255, 255, 100, 100);
                                linGrBrush.LinearColors[1] = Color.FromArgb(165, 42, 42);

                                this.g.FillRectangle(linGrBrush, rectAbgang);
                        
                            // fliessende Farbe für die Zugänges
                                linGrBrush.Rectangle.X = BEGINBALKEN;
                                linGrBrush.Rectangle.Y = currYAbgang;
                                linGrBrush.Rectangle.Width= gesamtZugangWidth;
                                linGrBrush.Rectangle.Height = rectHeight;
                                linGrBrush.LinearColors[0] = Color.FromArgb(255, 255, 100, 100);
                                linGrBrush.LinearColors[1] = Color.FromArgb(165, 42, 42);

                                this.g.FillRectangle(linGrBrush, rectZugang);

                            
                        }

Was mache ich falsch?

Vielen Dank im Voraus

08.11.2016 - 09:45 Uhr

Sehr schön, danke, ich schreibe das um.

08.11.2016 - 09:02 Uhr

Danke schön!
und den dispose mache ich einmalig am Ende nach dem using?
Oder wird es durch den "using" automatisch gemacht?

Vielen Dank für deine Hilfe

07.11.2016 - 15:08 Uhr

Hallo
ich bekomme eine SpeicherException ("Nicht genügend Arbeitsspeicher."), wenn ich aus einer csv Datei heraus 80 Rechtecke male, die einen Farbverlauf haben.
"Darunter", also auf der gleichen Grafik gibt es noch ca. 144 Rechtecke, ebenfalls mit einem Farbverlauf, die einen Tagesraster darstellen.

Mache ich die gleiche Grafik ohne Farbverlauf, mit SolidBrush statt LinearGradientBrush , bekomme ich den Fehler nicht.

Kann das sein, dass es schon zuviele Grafik sind? ich kann mir das gar nicht vorstellen. Oder soll ich irgendetwas regelmäßig freigeben?

Vielen Dank im Voraus für Eure Hilfe
MBoerner


 try
            {
                LinearGradientBrush linGrBrush = new LinearGradientBrush(
                new Point((int)firstX, (int)currY),
                new Point((int)(firstX + rectWidth), (int)currY),
                Color.FromArgb(20, 255, 255, 255),  
                Color.FromArgb(220, 20, 60)); 
                g.FillRectangle(linGrBrush, firstX, currY, rectWidth, rectHeight);
                //Brush brush = new SolidBrush(Color.FromArgb(20, 220, 20, 60));
                //g.FillRectangle(brush, firstX, currY, rectWidth, rectHeight);
            }
            catch(Exception e)
            {
                MessageBox.Show("exception Error {0}", e.Message);
                throw;
            }

04.11.2016 - 11:22 Uhr

Hallo!, ich weiss, dass das Thema oft angesprochen wird, aber ich verstehe es lesen noch nicht ganz:
Im Beitrag von Falk82 wird empfohlen usercontrols nach dem Entfernen aus der Form wieder freizugeben. und zwar so:


                    tabAuslastung.Controls.Remove(userControl1);
                    userControl1.Dispose();  // gibt den Speicher wieder frei
                    userControl1= null;

  1. muss man das wirklich machen? werden nicht alle usercontrols von der Garbage Collection freigegeben, wenn man sie aus dem Formular entfernt?

2)wenn ich eine Klasse erstelle, die auch Listen enthält, muss ich die Listen, die sie enthält eigenständig freigeben, wenn ich eine instanz der Klasse lösche?

 class nachAuftrag: Panel
  {
      private Auftrag             currAuftrag;
       List<Auftrag>              AuftragsList = new List<Auftrag>();
...
  }

3)wenn ich eine DataTable erstelle, und mit dem Inhalt einer Textdatei fülle, muss ich die DataTable auch freigeben mit dispose, wenn ich eine neue Textdatei lade und eine neue Datatable erstelle?

                // create a Datatable and Fill it
                AuftragDatatable = new DataTableAuftraege(currFileName);
                AuftragDatatable.fill();

Danke im Voraus für Eure Hilfe

02.11.2016 - 07:43 Uhr

ja stimmt, inzwischen habe ich gesehen, dass es klappt. Nur wenn man scrollt ist es natürlich blöd, weil die Grafik schön mit transpose verschoben wird, die buttons aber neu platziert werden müssen. Oder kann man buttons irgendwie an die Grafik verankern?(wie man in Word Grafiken an Texte verankert)

Ich muss mal durchtesten, ob es schlau ist, buttons zu nehmen

Vielen Dank für die Antwort

MBoerner

01.11.2016 - 14:07 Uhr

Hallo!
ich habe ein Windows-Formular mit mehreren Registerkarten (Tabs).
Auf einer dieser Registerkarte habe ich einen Panel mit einer Grafik erstellt, die ein Zeit-Raster darstellt.
Jetzt würde ich gern darauf buttons mit tooltips. plazieren, die man anklicken kann, um weitere Informationen zu sehen.

Wie mache ich das am Schlauesten?

  1. kann man überhaupt buttons auf einer Grafik in einem Panel erstellen, oder geht es nur in Windows-Formulare? In der Klasse kenne ich nämlich nicht das Formular.

  2. mit lauter Rechtecken ginge es ja, aber dann hätte ich keinen ClickEreignisse udn die MouseDown-Ereignisse finde ich umständlich, weil man immer die Koordinaten rausfinden muss und bei überlappende Rechtecken wird es schwierig. Am Libesten wäre mir ein button.

Vielen Dank im Voraus für Eure Hilfe