Разработка приложений на языке C#. Полезные настройки. Особые спецификаторы формата, страница 45

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");

}

Для выработки "правильного" стиля читайте Керниган и Ритчи! Читайте сборники алгоритмов известных численных методов, которые написаны акулами в мире программирования! Долой неграмотность и словоблудие!