Laden...

Drucken Vorschau wird nicht gezeichnet

Erstellt von AceTecNic vor einem Jahr Letzter Beitrag vor einem Jahr 693 Views
A
AceTecNic Themenstarter:in
51 Beiträge seit 2018
vor einem Jahr
Drucken Vorschau wird nicht gezeichnet

Hallo zusammen,

wie oben beschrieben, lasse ich eine Vorschau mit Bitmap zeichnen. Alles was sich auf dem Panel befindet, soll eben mitgezeichnet werden und ausgedruckt.
Aktuell wird allerdings nichts mit aufgezeichnet bei der Vorschau und beim Druck selbst. Fällt irgendjemanden was auf dabei?


using System;
using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;

namespace Schmid_Prüfprogramm
{
    public partial class Prüfprotokoll : Form
    {
        public Prüfprotokoll()
        {
            InitializeComponent();

            printDocument1.OriginAtMargins = true;
            printDialog1.Document = printDocument1;
            pageSetupDialog1.EnableMetric = true;
            pageSetupDialog1.Document = printDocument1;
            printPreviewDialog1.Document = printDocument1;
            /*
            Schmid_PP schmid_PP = new Schmid_PP();
            Schmid_PP.
            lbl_DruckMessung1.Text = 
            */
        }

        private void Prüfprotokoll_Load(object sender, EventArgs e)
        {

        }

        private void btnPageSetup_Click(object sender, EventArgs e)
        {
            pageSetupDialog1.ShowDialog();
        }

        private void btnPagePreview_Click(object sender, EventArgs e)
        {
            printPreviewDialog1.Top = this.Top;
            printPreviewDialog1.Width = this.Width * 2;
            printPreviewDialog1.Height = this.Height * 2;
            

            printPreviewDialog1.ShowDialog();
        }

        private void btnPrinterDialog_Click(object sender, EventArgs e)
        {
            if (printDialog1.ShowDialog() == DialogResult.OK)
            {
                printDocument1.Print();
            }
        }


        private void printDocument_PrintPage(object sender, PrintPageEventArgs e)
        {
            Bitmap bitmap = new Bitmap(this.Width, this.Height);

            panel1.DrawToBitmap(bitmap, new Rectangle(0, 0, bitmap.Width, bitmap.Height)); //<-- Hier sollte das Panel und die Controls darauf gezeichnet werden

            Rectangle target = new Rectangle(0, 0, e.MarginBounds.Width, e.MarginBounds.Height);
            double xScale = (double)bitmap.Width / e.MarginBounds.Width;
            double yScale = (double)bitmap.Height / e.MarginBounds.Height;

            if (xScale < yScale)
                target.Width = (int)(xScale * target.Width / yScale);
            else
                target.Height = (int)(yScale * target.Height / xScale);

            e.Graphics.PageUnit = GraphicsUnit.Display;

            e.Graphics.DrawImage(bitmap, target);
        }
    }
}

Noch eine kleine Frage am Rande:
Wenn ich Daten von einer anderen Form auf diese übertragen möchte, wie stell ich das am besten an?
Dachte mir bereits: Daten aus Form1 temporär in C:\tmp ablegen und in Form2_load wieder laden.
Macht man das so oder gibt es einen einfacheren Weg?

Danke!

16.807 Beiträge seit 2008
vor einem Jahr

Dachte mir bereits: Daten aus Form1 temporär in C:\tmp ablegen und in Form2_load wieder laden.
Macht man das so oder gibt es einen einfacheren Weg?

So macht man das nie.

[FAQ] Kommunikation von 2 Forms alternativ mit States arbeiten, zB mit Reactive Extensions.

A
AceTecNic Themenstarter:in
51 Beiträge seit 2018
vor einem Jahr

Das mit der dritten Klasse würde mir auch sehr gefallen, allerdings habe ich keine Ahnung wie ich das umsetzen soll.
Mein Problem ist auf Form1: SerialPort + Invoke welcher mir ein Label konstant aktuell hält mit einem string. Zudem werden aus dem gesendeten Daten noch zwei weitere Werte weiter verwendet.

Ist es generell möglich, aus der Helper.cs ein Control(label) auf Form1.cs zu überschreiben bzw. zu aktualisieren?

16.807 Beiträge seit 2008
vor einem Jahr

Ist es generell möglich, aus der Helper.cs ein Control(label) auf Form1.cs zu überschreiben bzw. zu aktualisieren?

Niemand hier kennt Deinen Code und weiß was Helper.cs ist. "Ist es möglich"-Fragen können generell immer mit Ja beantwortet werden; alles eine Frage des Aufwands.
Im verlinkten Artikel ist ein Beispiel Code, wie alles geht. Anwenden musst es selbst.

A
AceTecNic Themenstarter:in
51 Beiträge seit 2018
vor einem Jahr

Ich versuchs anderst zu erklären. Ich versuche auf Grundlage von diesem Drei-Schicht-Modell mein Projekt zu bewältigen.
Jetzt habe ich aktuell auf der Präsentationsschicht das meiste von meinem Code, insbesondere diesen hier um ein Label konstant zu füttern:


private void updateMessung(string indata)
        {
            
            if (this.InvokeRequired)
            {
                this.Invoke(new threadSicher(updateMessung), new object[] {indata});
            }
            string[] arr = indata.Split('|'); //winkelWert|btnStatus|timer
            lbl_Anzeige.Text = arr[0] + " °";
          }

Wie könnte ich diesen Abschnitt denn auf die Logikschicht übertragen? Dazu benötige ich doch eine neue Klasse? Ich habe im Moment keinerlei Ansatz wie ich das Label auf der Form1 von der Logikschicht aus aktualisieren könnte.

Ich habe versucht mich möglichst genau auszudrücken. Ich bin dabei, die verlinkten Seiten durchzulesen. Allerdings übersehe ich dabei die "für mich wichtigen" Punkte, oder es ist nicht das wonach ich suche.

16.807 Beiträge seit 2008
vor einem Jahr

Wie könnte ich diesen Abschnitt denn auf die Logikschicht übertragen?

Gar nicht, weil die Logik die UI nicht kennen darf. Daher kann man da auch nichts übertragen. Siehe [Artikel] Drei-Schichten-Architektur
Die Logik muss wenn dann Events zur Verfügung stellen, die dann die UI abonnieren darf.

Wenn das nicht gemeint ist, dann bitte eine Frage so stellen, dass wir verstehen, was das Problem ist.
Wir haben den Code nicht vor uns.

Zweitens: der Code kann so nicht funktionieren.
Wenn der Invoke notwendig ist, dann startest die Methode erneut - aber führst trotzdem ein Label-Zugriff durch: das wird knallen.

A
AceTecNic Themenstarter:in
51 Beiträge seit 2018
vor einem Jahr

Alles klar. Bedeutet für mich, dass manche Teile des Codes zwangsläufig in der UI bleiben.
Somit muss ich versuchen, von der Form2(Prüfprotokoll.cs) auf Form1(Schmid_PP.cs) zuzugreifen.

Vielleicht ist der Code nicht zu 100% richtig, aber auf irgendeine Weise funktioniert es 😁


using System;
using System.IO.Ports;
using System.Windows.Forms;
using System.IO;
using System.Diagnostics;
using System.Drawing;

namespace Schmid_Prüfprogramm
{
    public partial class Schmid_PP : Form
    {

        string portName;
        int baudRate = 19200;
        SerialPort SerialPort = new SerialPort();
        private delegate void threadSicher(string messung);

        public Schmid_PP()
        {
            InitializeComponent();
            fillComPortComBoBox();    
        }

        private void btn_portVerbinden_Click(object sender, EventArgs e)
        {
            try
            {
                SerialPort.PortName = combox_Portliste.SelectedItem.ToString();
                SerialPort.BaudRate = baudRate;
                SerialPort.Open();
                SerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message + ex.StackTrace, "Fehler", MessageBoxButtons.OKCancel, MessageBoxIcon.Error);
            }
        }

        private void fillComPortComBoBox()
        {
            combox_Portliste.Items.AddRange(SerialPort.GetPortNames());
            combox_Portliste.SelectedItem = portName;
        }

        public void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        {
            SerialPort serialPort = (SerialPort)sender;
            string indata = serialPort.ReadLine();
            updateMessung(indata);
        }

        
        
        
        private void updateMessung(string indata)
        {
            //string zeit1;

            if (this.InvokeRequired)
            {
                this.Invoke(new threadSicher(updateMessung), new object[] {indata});
            }

            string[] arr = indata.Split('|'); //winkelWert|btnStatus|timer
            lbl_Anzeige.Text = arr[0] + " °";
            //lbl_checkBTN.Text = arr[1];
            //lbl_Zeit1.Text = arr[2];

            if (messung1.Checked)
            {
                //lbl_Zeit1.Text = arr[2];
                lbl_Grad1.Text = arr[0];
            }

            else if (messung2.Checked)
            {
                //lbl_Zeit2.Text = arr[2];
                lbl_Grad2.Text = arr[0];
            }
            else if (messung3.Checked)
            {
                //lbl_Zeit3.Text = arr[2];
                lbl_Grad3.Text = arr[0];
            }
            if (messung4.Checked)
            {
                //lbl_Zeit4.Text = arr[2];
                lbl_Grad4.Text = arr[0];
            }
            if (messung5.Checked)
            {
                //lbl_Zeit5.Text = arr[2];
                lbl_Grad5.Text = arr[0];
            }
            if (messung6.Checked)
            {
                //lbl_Zeit6.Text = arr[2];
                lbl_Grad6.Text = arr[0];
            }
        }

        private void speichernToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Datenspeichernöffnen datenspeichernöffnen = new Datenspeichernöffnen(txtin_Person1.Text, txtin_Person2.Text, txtin_Person3.Text, txtin_Person4.Text, txtin_Person5.Text, txtin_Person6.Text, lbl_Zeit1.Text, lbl_Zeit2.Text, lbl_Zeit3.Text, lbl_Zeit4.Text, lbl_Zeit5.Text, lbl_Zeit6.Text, lbl_Grad1.Text, lbl_Grad2.Text, lbl_Grad3.Text, lbl_Grad4.Text, lbl_Grad5.Text, lbl_Grad6.Text);
            Datenspeichernöffnen.speichernunter(txtin_Person1.Text, txtin_Person2.Text, txtin_Person3.Text, txtin_Person4.Text, txtin_Person5.Text, txtin_Person6.Text, lbl_Zeit1.Text, lbl_Zeit2.Text, lbl_Zeit3.Text, lbl_Zeit4.Text, lbl_Zeit5.Text, lbl_Zeit6.Text, lbl_Grad1.Text, lbl_Grad2.Text, lbl_Grad3.Text, lbl_Grad4.Text, lbl_Grad5.Text, lbl_Grad6.Text);
        }

        private void btn_PortAbbrechen_Click(object sender, EventArgs e)
        {
            SerialPort.Close();
            SerialPort.DataReceived -= new SerialDataReceivedEventHandler(DataReceivedHandler);
            lbl_Anzeige.Text = "";
        }
        private void öffnenToolStripMenuItem_Click(object sender, EventArgs e)
        {
                using (OpenFileDialog openFileDialog = new OpenFileDialog() { Filter = "Prüfprotokoll|*.pp", Multiselect = false })
            {
                if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    using (StreamReader rd = new StreamReader(openFileDialog.FileName))
                    {
                        txtin_Person1.Text = rd.ReadLine();
                        lbl_Zeit1.Text = rd.ReadLine();
                        lbl_Grad1.Text = rd.ReadLine();

                        txtin_Person2.Text = rd.ReadLine();
                        lbl_Zeit2.Text = rd.ReadLine();
                        lbl_Grad2.Text = rd.ReadLine();

                        txtin_Person3.Text = rd.ReadLine();
                        lbl_Zeit3.Text = rd.ReadLine();
                        lbl_Grad3.Text = rd.ReadLine();

                        txtin_Person4.Text = rd.ReadLine();
                        lbl_Zeit4.Text = rd.ReadLine();
                        lbl_Grad4.Text = rd.ReadLine();

                        txtin_Person5.Text = rd.ReadLine();
                        lbl_Zeit5.Text = rd.ReadLine();
                        lbl_Grad5.Text = rd.ReadLine();

                        txtin_Person6.Text = rd.ReadLine();
                        lbl_Zeit6.Text = rd.ReadLine();
                        lbl_Grad6.Text = rd.ReadLine();
                    }
                }
                else
                {
                    MessageBox.Show("Konnte nicht geladen werden");
                }
            }
        }
        private void druckenToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Prüfprotokoll prüfprotokoll = new Prüfprotokoll();
            prüfprotokoll.Show();

            /*if (printDialog1.ShowDialog() == DialogResult.OK)
            {
                printDocument1.Print();
            }*/
        }   
    }
}

Bevor jetzt alle drauf rumhacken: Ja der Code mag nicht perfekt sein, durcheinander und unordentlich. Trotzallem funktioniert er und ich bin stolz darauf 🙂 . Zudem bin ich noch nicht fertig damit und weiß, dass ich noch einiges vor mir habe 😉
Bin für Vorschläge immer offen.

Danke für die Hilfestellungen!

M
368 Beiträge seit 2006
vor einem Jahr

auf irgendeine Weise funktioniert es

  
...Person2.Text, txtin_Person3.Text, txtin_Person4.Text,...  
                        txtin_Person4.Text...   
                        txtin_Person5.Text   

Längerfristig sollte man (häufige(re)) Änderungen/Erweiterungen/Wartbarkeit/... des Codes einplanen (deswegen auch die bereits genannte Schichtentrennung: um genau diese Aktionen (an einer (zentralen) Stelle) zu erleichtern). Um mehrere Controls anzusprechen gibt es auch einen Artikel: FAQ - Variablennmen zur Laufzeit...

Goalkicker.com // DNC Magazine for .NET Developers // .NET Blogs zum Folgen
Software is like cathedrals: first we build them, then we pray 😉