Funkcja drukująca z pliku.txt

0

Witam !

Mam taki problem : chce wydrukować plik tekstowy o rozmiarze kilku stron. Napisałem funkcje drukującą ale w printPreviewDialog zapętla się i wczytuje nieskończona ilosć stron. Oto funkcja drukująca :

 
  
private void PrintPage(object sender, PrintPageEventArgs e)
        {
            Graphics g = e.Graphics;
            string actualLine;
            int lineWrite = 1;
            float lineHeight;
                float y = 1;
                string zmienna = "";
             //   float x = e.MarginBounds.Left;
             //   float y = e.MarginBounds.Top;

                Font f = new Font("Courier", 10);
                
                    lineHeight = f.GetHeight(g);
                  
                    int linesPerPage = (int)((e.MarginBounds.Bottom - e.MarginBounds.Top) / lineHeight);

                    //y = 2 * lineHeight;
                    czytaj = new StreamReader(openFileDialog1.FileName);
                    while ((zmienna = czytaj.ReadLine()) != null)
                    {

                  //  string zmienna = czytaj.ReadToEnd();
                    g.DrawString(zmienna.ToString(), f, Brushes.Black, new PointF(0, y)); 
                        y += lineHeight;
                        
                       if (lineWrite >= linesPerPage)
                       {
                           e.HasMorePages = true;

                       }
                       else
                           e.HasMorePages = false; 


                    }



                }


        

Pracuje w Visual Studio 2010 w c#. Do drukowania wykorzystuje komponenty Windows Form takie jak : PrintPreviewDialog oraz OpenFileDialog. W pierwszej kolejności otwieram plik.txt a następnie przesyłam go do Okna dialogowego drukarki. I tutaj program się zapętla. Proszę o pomoc.

1

podpowiem Ci: ustawiasz w metodzie PrintPage() e.HasMorePages na true. a co zrobi PrintPage() wywołane dla następnej strony? proponuję nie tworzyć kolejnego StreamReadera, jeśli jeden już istnieje.

inna sprawa, że robisz mnóstwo drobnych błędów:

  • po zakończeniu korzystania z dowolnego obiektu klasy implementującej interfejs IDisposable należy wywołać jego metodę Dispose(), a jeszcze lepiej stworzyć ten obiekt wewnątrz klauzuli using. jeśli tak nie zrobisz, możesz zgubić zasoby. StreamReader i Graphics są klasami implementującymi taki interfejs.
  • tworzysz globalną (w ramach obiektu) zmienną czytaj, a korzystasz z niej tylko lokalnie. w połączeniu z moją podpowiedzią ma to ręce i nogi, ale tak jak używasz tej zmiennej teraz jest to bez sensu, zaśmieca kod i prosi się o wycieki pamięci/zasobów.
  • duperel: e.HasMorePages = lineWrite >= linesPerPage. i wywal to z pętli.
  • co to jest lineWrite? ma zawsze wartość 1 i między innymi dlatego drukowanie wpada w nieskończoną pętlę. i chyba chciałeś nazwać tą zmienną linesWritten?
  • zmienna? a klasy nazywasz Klasa, Klasa1...? nie nazywaj tak zmiennych! nazwy elementów muszą mówić do czego służą te elementy.
  • paskudne wcięcia. wcięcie rób tylko tam, gdzie zaczyna się nowy blok kodu albo tam, gdzie łamiesz zbyt długą linijkę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1