Laden...

Profil von Mani

myCSharp.de - Member Mitglied seit

Alle Beiträge

12.09.2006 - 22:04 Uhr

Jetzt hab ich mal wieder etwas mehr Zeit und steh noch vor gleichem Problem.

Hat niemand nen heissen Tip für mich wie ich konkret das endlosdrucken verhinder ?

02.08.2006 - 21:34 Uhr

So, nachdem die Hitze erstmal vorbei ist trau ich mich auch wieder an mein Laptop 🙂

Original von FZelle
Und selbst wenn er die Funktion aufruft, wird es "lustig".

Sollte tatsächlich mehr als eine Seite zu drucken sein, wird nämlich dann
gedruckt, bis das Papier alle ist.

Bei jedem betreten der Funktion wird von vorne gedruckt, und das
auch noch immer an die selbe Position.

Und Irgendwann wird auch der Speicher knapp, weil die Font-Handles nicht
Disposed werden.

Ich hab das Forum jetzt mehrmals durchsucht nach dem drucken mehrerer Seiten.
Ich bin heute leider nicht zur Lösung gekommen.


private void printDocument1_PrintPage(int seite, object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            Graphics g = e.Graphics;
            float lineH = g.MeasureString("X", new Font("Verdana", 10, FontStyle.Regular)).Height;

            int y = 100;
            int z = 1;

            for (int i = 0; i < listBox1.Items.Count; i++)
            {
                g.DrawString("(" + z + ") " + listBox1.Items[i].ToString(), new Font("Verdana", 10, FontStyle.Regular), Brushes.Black, 50, y);
                y += (int)lineH;
                if (y >= e.MarginBounds.Bottom)
                {
                    e.HasMorePages = true;
                    return;
                }
                z++;
            }
            e.HasMorePages = false;
        }

Ok, sind mehr als 1 Seite da tritt das e.HasMorePages = true; in kraft, die for Schleife wird neu begonnen und es gibt endlosseiten.
Das hab ich soweit verstanden.
Wie übergeb ich denn dann jetzt die aktuelle Stelle der Listboxeinträge an die printDocument1_PrintPage Funktion ?
Wenn ich diese übergabe habe dann brauch ich ja im Grunde nur die For-Schleife daran anpassen.

Das mit dem Dispose versuch ich jetzt mal in den Kopf zu bekommen.
Ich glaub ich werd mir doch mal endlich nen Buch dazu besorgen.

17.07.2006 - 20:45 Uhr

Das war die Lösung.
Ich danke dir.
Ausdruck rennt zwar noch nicht richtig und sieht bisschen dumm aus, aber das bekomm ich denke ich in den Griff.

Vielen Dank nochmal.

17.07.2006 - 20:05 Uhr

Asche auf mein Haupt, kannst du das bitte für nen totalen Noob übersetzen ?

17.07.2006 - 17:21 Uhr

Original von Programmierhans
Läuft er überhaupt in den printDocument1_PrintPage rein ?

Anscheinend tut er dies nicht.
Ne Idee warum nicht ?

16.07.2006 - 22:54 Uhr

Sorry das ich jetzt so blöd frage, aber wie überprüf ich das ?
Bin ziemlicher Neuling auf dem Gebiet.

16.07.2006 - 18:19 Uhr

Hallo,

ich hab mal wieder ein Problem.
Ich versuche seit heute mittag es hinzubekommen Einträge einer Listbox zu drucken.
Habe hier das Forum durchsucht, so ziemlich alles probiert was nach einer Lösung aussehen könnte und google hab ich auch zum qualmen gebracht.

Das hier ist der momentane Codestand den ich habe, aber es kommt immer nur eine leere Seite.

private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            Graphics g = e.Graphics;
            float lineH = g.MeasureString("X", new Font("Verdana", 10, FontStyle.Regular)).Height;

            int y = 100;

            foreach (string str in listBox1.Items)
            {
                g.DrawString(str, new Font("Verdana", 10, FontStyle.Regular), Brushes.Black, 50, 100);
                y += (int)lineH;
                if (y >= e.MarginBounds.Bottom)
                {
                    e.HasMorePages = true;
                    return;
                }
            }
            e.HasMorePages = false;
        }

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

        private void druckenToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            PrintDialog printDialog1 = new PrintDialog();
            printDialog1.Document = printDocument1;
            DialogResult result = printDialog1.ShowDialog();
            if (result == DialogResult.OK)
            {
                printDocument1.Print();
            }
        }

Es gibt hier im Forum ein Thread wo auch jemand das Problem mit der leeren Seite hat, aber irgendwie haben mich die Hinweise in dem Thread nicht weiter gebracht.

Kann mir hier jemand nen hilfreichen Schups geben ?

Hallöchen,

ich hab mal wieder ein Problem.
Ich wollte mein kleines Programm mal um eine kleine Vorschaufunktion erweitern.
Klappt auch alles soweit wunderbar mit GetThumbnail() usw., aber bei größeren Bildern dauert das manchmal >2 Sekunden.
Ist schon recht nervig wenn sich da einer dann viele Bilder vorher einmal anschauen möchte.

Wenn ich die Umrechnung weg lasse und die Picturebox auf Strech stelle damit das gesamte Bild zu sehen ist dauerts auch recht lang.

Das muss doch auch anders gehen.
Es gibt neben der Vorschau Funktion von Windows noch etliche andere Programme die sowas machen und da dauerts auch nicht so lang.

Hat da jemand nen Tip für mich ?

Das hier ist mein Code...

private void SetImage(PictureBox pPictureBox, Image pImage)
        {
            pPictureBox.Image = this.GetThumbnail(pImage, pPictureBox.ClientRectangle);
        }

        private Image GetThumbnail(Image pImage, Rectangle pBounds)
        {
            Image ret = new Bitmap(pBounds.Width, pBounds.Height);
            Graphics g = Graphics.FromImage(ret);
            g.FillRectangle(new SolidBrush(Color.Transparent), 0, 0, ret.Width, ret.Height);

            float factor = Math.Max((float)pImage.Width / (float)pBounds.Width, (float)pImage.Height / (float)pBounds.Height);
            g.DrawImage(pImage, 0, 0, (float)pImage.Width / factor, (float)pImage.Height / factor);
            g.Dispose();

            return ret;
        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (listBox1.SelectedItems.Count == 1)
            {
                Image img = Image.FromFile(@textBox1.Text + "\\" + listBox1.SelectedItem.ToString());
                this.SetImage(this.pictureBox2, img);
            }
        }
27.01.2006 - 10:31 Uhr

Soooo

Aller Anfang ist bekanntlich schwer 🙂

Ich habe Stunden, fast schon Tage gebraucht bis ich es in meinen Kopf bekam 🙂

Ich kann nicht sagen wie oft ich die Postings hier nochmal gelesen habe, aber sie haben mir definitiv die Lösung gebracht.

Ich hab alles in einer Klasse gelassen, für jedes bearbeiten der Controls, sei es auch nur das deaktivieren und aktivieren, eine Methode angelegt.
Eine Methode für die Verarbeitung angelegt.

Thread mit dieser Methode angelegt, BeginInvoke überall eingesetzt und es rennt wie es rennen soll.

Nachdem ich das mit dem BeginInvoke raus hatte war es eine Sache von paar Minuten 😉

Ich bedanke mich bei allen die mir geholfen haben.

Schön das es noch Foren gibt wo Anfänger die auch manchmal nervig werden so behandelt werden wie hier.

Daumen hoch dafür.

Und ihr werdet noch einiges von mir zu lesen bekommen 🙂

25.01.2006 - 10:14 Uhr

Ich bekomm das nicht auf die Reihe.

Ich habe nun alles an Code was Du gesagt hast in eine Methode Namens resizePic in der selben Klasse gelegt und die Threadklasse entfernt.

Bei der Ausführung des Programms meckert er dann nachdem ich auf Start gedrückt habe hier als erstes...
auswahlcount = listBox1.SelectedItems.Count;

Da sagt er mir das mit dem Threadübergreifend.

Wie wende ich da Begininvoke mit an ?
Das BeginInvoke muss ich doch in der Methode resizePic nutzen wenn ich das richtig verstanden habe, oder ?

Ok, ich muss noch mit delegate arbeiten, aber wie setze ich delegate in Bezug auf die listBox an ?

Sorry für meine dummen Fragen, aber trotz Forensuche, MSDN und wühlen in einem Buch komm ich nicht weiter.

24.01.2006 - 19:37 Uhr

Puuh, das mit dem Invoke ist mir ein bisschen zu hart für heute.

Ich glaub ich setz da morgen früh nochmal an.
Dieses Threadübergreifende mit der listbox und den ganzen anderen Controls wird mich denke ich noch aufhalten.

Ich danke für die Hilfe bis hierher und werd mich hier nochmal melden wenn ich es geschafft habe (oder wenn ich am verzweifeln bin 🙂).

24.01.2006 - 19:08 Uhr

Kleine Anfängerfrage noch dazu...

Wie kann ich aus der Threadklasse denn auf die Steuerelemente zugreifen ?
Er meckert bei textBox1 sowie den anderen auch das die im aktuellen Kontext nicht vorhanden sind.

24.01.2006 - 19:02 Uhr

Vielen Dank, ich werd mich dann mal dransetzen und es versuchen so umzusetzen.

Aller Anfang ist schwer, aber wer die Arbeit nicht scheut der wird den Anfang schaffen 🙂

24.01.2006 - 18:50 Uhr

Ich seh den Knackpunkt nicht 🙁
Hier mal die Threadklasse und der Button_Click aus der Form...


// Threadklasse
    public class resize
    {
        private int maxbreite;
        private string picture;
        private string picture_neu;

        public resize(int size, string pic1, string pic2)
        {
            maxbreite = size;
            picture = pic1;
            picture_neu = pic2;
        }

        public void resizePic()
        {
            Int32 iScaledWidth = new Int32();
            Int32 iScaledHeight = new Int32();

            System.Drawing.Image oImg = System.Drawing.Image.FromFile(picture);
            if (oImg.Height > oImg.Width)
            {
                iScaledHeight = Convert.ToInt32(maxbreite);
                iScaledWidth = (int)((double)((double)oImg.Width / (double)oImg.Height) * (double)iScaledHeight);
            }
            if (oImg.Height < oImg.Width)
            {
                iScaledWidth = Convert.ToInt32(maxbreite);
                iScaledHeight = (int)((double)((double)oImg.Height / (double)oImg.Width) * (double)iScaledWidth);
            }

            System.Drawing.Image oScaledImage = new Bitmap(iScaledWidth, iScaledHeight, oImg.PixelFormat);
            Graphics oGraphic = Graphics.FromImage(oScaledImage);
            oGraphic.CompositingQuality = CompositingQuality.HighQuality;
            oGraphic.SmoothingMode = SmoothingMode.HighQuality;
            oGraphic.InterpolationMode = InterpolationMode.HighQualityBicubic;
            Rectangle oRectangle = new Rectangle(0, 0, iScaledWidth, iScaledHeight);

            oGraphic.DrawImage(oImg, oRectangle);

            oScaledImage.Save(picture_neu, System.Drawing.Imaging.ImageFormat.Jpeg);

            oImg.Dispose();
        }
    }



// Buttonklick
private void startToolStripMenuItem_Click(object sender, EventArgs e)
        {
                // Zeiger in eine Sanduhr ändern
                this.Cursor = System.Windows.Forms.Cursors.WaitCursor;
                    
                // Elemente sperren
                menuStrip1.Enabled = false;
                listBox1.Enabled = false;
                checkBox1.Enabled = false;
                groupBox1.Enabled = false;
                groupBox2.Enabled = false;
                pictureBox1.Enabled = false;
                textBox1.Enabled = false;
                statusStrip1.Enabled = false;
                toolStripStatusLabel1.Enabled = false;

                // Neues Verzeichnis benennen
                string newpath = textBox1.Text + "\\" + DateTime.Now.Year.ToString() + 
                        DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString() + 
                        DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + 
                        DateTime.Now.Second.ToString();

                // Anzahl der ausgewählten Dateien
                int auswahlcount = listBox1.SelectedItems.Count;

                // Label setzen
                label1.Text = "Bild:  0/" + auswahlcount;

                // Minimumanzeige
                progressBar1.Minimum = 1;
                // Maximumanzeige
                progressBar1.Maximum = listBox1.SelectedItems.Count;
                // Startanzahl der Balken
                progressBar1.Value = 1;
                // Balken pro Schritt
                progressBar1.Step = 1;

                // überprüfen ob das Verzeichnis schon existiert
                if (!Directory.Exists(newpath))
                {
                    // neues Verzeichnis für die neuen Bilder erstellen
                    Directory.CreateDirectory(newpath);
                }

                // Neuer Thread wird gestartet
                Thread[] th = new Thread[auswahlcount];

                for (int i = 0; i < auswahlcount; i++)
                {
                    if (!File.Exists(newpath + "\\" + listBox1.SelectedItems[i].ToString()))
                    {
                        // Hier soll die Kopie hin
                        string picture = textBox1.Text + "\\" + listBox1.SelectedItems[i].ToString();

                        // verkleinertes Bild
                        string picture_neu = newpath + "\\" + i + ".jpg";

                        // Kopiert das Bild in den neuen Ordner
                        //File.Copy(textBox1.Text + "\\" + listBox1.SelectedItems[i].ToString(), newpath + "\\" + listBox1.SelectedItems[i].ToString());

                        resize picresize = new resize(600, picture, picture_neu);

                        th[i] = new Thread(new ThreadStart(picresize.resizePic));
                        th[i].Start();

                        // Progressbar erhöhen
                        progressBar1.PerformStep();

                        // Label setzen
                        label1.Text = "Bild: " + (i+1) + "/" + auswahlcount;

                        Application.DoEvents();
                    }
                    else
                    {
                        //File.Copy(textBox1.Text + "\\" + listBox1.SelectedItems[i].ToString(), newpath + "\\new_" + listBox1.SelectedItems[i].ToString());
                    }
                }

                // Auswahl aufheben
                listBox1.SelectedItems.Clear();

                // Alle Funktionen aktivieren
                menuStrip1.Enabled = true;
                listBox1.Enabled = true;
                checkBox1.Enabled = true;
                groupBox1.Enabled = true;
                groupBox2.Enabled = true;
                pictureBox1.Enabled = true;
                textBox1.Enabled = true;
                statusStrip1.Enabled = true;
                toolStripStatusLabel1.Enabled = true;

                this.Cursor = System.Windows.Forms.Cursors.Default;

                // Erfolgsmeldung bringen
                MessageBox.Show(auswahlcount + " Bilder erfolgreich verkleinert und in " + newpath + " kopiert !", "Hinweis");
        }

Erschlagt mich nicht gleich wegen dem Code, ich sitze an C# erst seit 9 Tagen dran 🙁

24.01.2006 - 17:17 Uhr

Nach rausnehmen der FileCopy Anweisung hängt nun fast der ganze PC für einige Minuten.
Der Speicherverbrauch geht in die 100e MB.

Kleiner Hinweis, das Programm verkleinert Bilder die ich in einer Listbox gelistet habe.

Zum testen nehme ich immer 100 Bilder von einer Digicam.

Ich glaube da hab ich noch fette Fehler drin 🙁

Doofe Frage, was ist ein Profiler ?

24.01.2006 - 17:02 Uhr

Also es friert selbst dann ein wenn der File.Copy Befehl weg ist.

Dann schau ich mal das ich das in nen Extra Thread packe.

24.01.2006 - 16:58 Uhr

Ein File.Copy sowie 2 - 3 Zuweisungen sind da nur noch.
Liegt es evtl. am Filecopy ?

24.01.2006 - 15:51 Uhr

Ich mag es nicht wenn etwas riecht 😉


Thread[] th = new Thread[auswahlcount];
for (int i = 0; i < auswahlcount; i++)
{
    // ....
    th[i] = new Thread(new ThreadStart(picresize.resizePic));
    th[i].Start();
    // ....
    Application.DoEvents();
}

Reicht das für eine eventuelle Fehlerdiagnose ?

24.01.2006 - 15:29 Uhr

Ich habe es jetzt mit Threads gelöst, musste allerdings auch mit DoEvents arbeiten da es sonst wieder einfror.
Vielen dank für die Beiträge.

23.01.2006 - 19:14 Uhr

Hmmm, also im Grunde brauch ich ja keinen Hintergrundprozess.
Der User soll in dem Programm ja eh nix drücken dürfen solang die Verarbeitung läuft.

21.01.2006 - 10:39 Uhr

Danke, werd mich da mal einlesen.

21.01.2006 - 10:20 Uhr

Hallöchen,

ich bin vor knapp 7 Tagen mit C# angefangen und hatte bisher nur Kenntnisse in PHP.
Ich hab mir ein Programm geschrieben mit dem ich Fotos verkleinern kann.

Ich nehme Beispielsweise 100 Fotos in die Liste, klicke auf Start und er ackert.
Das klappt alles soweit sehr gut.
Mir wird wie gewünscht eine ProgressBar angezeigt usw.

Sobald ich aber in dem Programm rumklicke (bin grad bei meiner eigenen Betaphase und will Fehler ausbügeln 😉) friert das Form ein, oben erscheint Keine Rückmeldung und ich muss warten bis das verkleinern durchgelaufen ist.
Also er arbeitet noch weiter.

Ich habe probiert jedes einzelne Element mittels .Enable = False zu blockieren, hab es auch schon mit this.Enable = True gemacht, aber das scheint nicht die Lösung meines Problems zu sein.
Ich hab hier im Forum schon danach gesucht aber keine Lösung gefunden.

Wäre super wenn mir da jemand auf die Sprünge helfen könnte.