void printDoc_PrintPage(object sender, PrintPageEventArgs e)
{
Margins margin = printDoc.DefaultPageSettings.Margins; // Один раз вычисляем необходимые данные
Graphics g = e.Graphics;
float h = myFont.GetHeight (g);
int nLines = (int)(e.MarginBounds.Height / h);
string line = "";
//===== Начиная отсюда, идет аналог двух фрагментов, приведенных выше.
for (int i=0, y=margin.Top; i<nLines && line != null; i++, y+=(int)h)
{
if ((line = reader.ReadLine()) != null)
g.DrawString (line, myFont, myBrush, margin.Left, y);
}
e.HasMorePages = line != null;
}
Заголовок цикла стал сложнее, но логика сосредоточена в одном месте (наши услилия — тоже). Пойми заголовок и ты поймешь все, что здесь хотят сделать. Причины всех возможных ошибок в одном месте. Самое важное в алгоритме: "До каких пор крутиться?" Ответ (в одном месте): крутись, пока i < nLines && line != null.
Все 3 группы заголовка цикла артикулированы (четко выделены), логику управления не надо расследовать (как было со строкой CurrentLine += 1;). Переменные i и y не требуют особого внимания, это всего лишь временные инструменты с очевидным смыслом (индекс и координата y). Если заменить i на CurrentLine, то это затормозит восприятие тривиального пробега по всем элементам, тем более, что само имя CurrentLine несет смысл строки текста, а не индекса.
Рассмотрим еще один (более короткий) вариант кода. Он выполнен в стиле Кернигана, Ритчи и Фьюэра. Праотцы-основатели понимали толк в оптимизации кода. Здесь заголовок цикла еще сложнее, но в целом этот вариант выигрывает.
for (int i=0, y=margin.Top; i<nLines && (line=reader.ReadLine())!=null; i++, y+=(int)h)
g.DrawString (line, myFont, myBrush, margin.Left, y);
В качестве упражнения приведите в порядок еще один шедевр от Microsoft.
void ShowPageSettings()
{
string pageSettings = "";
int topMargin;
int bottomMargin;
int leftMargin;
int rightMargin;
string pageOrientation;
if (printDocument1.DefaultPageSettings.Landscape == true)
{
pageOrientation = "Landscape";
}
else
{
pageOrientation = "Portrait";
}
topMargin = printDocument1.DefaultPageSettings.Margins.Top;
bottomMargin = printDocument1.DefaultPageSettings.Margins.Bottom;
leftMargin = printDocument1.DefaultPageSettings.Margins.Left;
rightMargin = printDocument1.DefaultPageSettings.Margins.Right;
pageSettings = pageSettings + "Page Orientation = " + pageOrientation + "\n";
pageSettings = pageSettings + "Top margin = " + topMargin + "\n";
pageSettings = pageSettings + "Bottom margin = " + bottomMargin + "\n";
pageSettings = pageSettings + "Left margin = " + leftMargin + "\n";
pageSettings = pageSettings + "Right margin = " + rightMargin + "\n";
MessageBox.Show(pageSettings, "Default Page Settings", MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
Свой вариант изменений (всего из двух операторов) приведу в стиле Hidden. Если вам захочется (здесь же, в Word'е) проявить "скрытый" текст, выделите его и нажмите Ctrl+Space.
void ShowPageSettings()
{
PageSettings setting = printDoc.DefaultPageSettings;
MessageBox.Show (
"\nTop margin = " + setting.Margins.Top +
"\nBottom margin = " + setting.Margins.Bottom +
"\nLeft margin = " + setting.Margins.Left +
"\nRight margin = " + setting.Margins.Right +
"\nPage Orientation = " + (setting.Landscape ? "Landscape" : "Portrait"),
"Default Page Settings");
}
Для выработки "правильного" стиля читайте Керниган и Ритчи! Читайте сборники алгоритмов известных численных методов, которые написаны акулами в мире программирования! Долой неграмотность и словоблудие!
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.