Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Вычисление кол-ва строк и столбцов на листе


Автор: ЧеловекБорща 13.7.2013, 18:16
Доброго времени суток!

Была задача, заполнять шаблоны данными, и вводить на лист в принтере в указанном количестве колонок и столбцов. 
С учетом отступа от краев листа и расстоянием между картинками. Получился такой код: 
Код

var
  iRow, iCol, // Счетчики
  iBorderSize, // Размер отступа отступа от края
  iImgDistance, // Дистанция между картинками
  iRows, // Кол-во строк
  iColumns, // Кол-во изображений в строке
  iLeft, iTop: Integer; // Для удобства расчетов
  bmp: TBitmap;
begin
  iBorderSize := StrToInt(BorderSizeEdit.Text);
  iImgDistance := StrToInt(ImgsDistanceEdit.Text);
  iRows := StrToInt(RowsCountEdit.Text);
  iColumns := StrToInt(ColCountEdit.Text);
  iRow := 0;
  iCol := 0;
  // Начальные значения координат рисования
  iLeft := iBorderSize;
  iTop := iBorderSize;
  bmp := TBitmap.Create;
  try
    bmp.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Source.bmp');
    with Img.Canvas do
    begin
      // Чищу Canvas
      Brush.Color := clWhite;
      FillRect(Img.BoundsRect);

      for iRow := 1 to iRows do
      begin
        // Кальк. позицию строки
        if (iRow = 1) then
          iTop := iBorderSize
        else
          iTop := iBorderSize + (iImgDistance * (iRow - 1)) +
            (bmp.Height * (iRow - 1));

        // Кальк. позиции картинок в строке
        for iCol := 1 to iColumns do
        begin
          if (iCol = 1) then
            iLeft := iBorderSize
          else
            iLeft := iBorderSize + (iImgDistance * (iCol - 1)) +
              (bmp.Width * (iCol - 1));
          Draw(iLeft, iTop, bmp);
        end;
      end;
    end;
  finally
    FreeAndNil(bmp);
  end;
end;


Работает на ура!


Сейчас же мая задача ограничить юзера в кол-ве строк и столбцов, т.е. автоматически находить их максимум исходя из размеров листа в принтере, ориентации листа, расстояния от края и расстояния между картинками. 

Как это сделать? 
Я пробовал переворачивать код, т.е. ставил while true и увеличивал iCol,iRow пока те не выходили за пределы ширины, высоты листа. Но результат отличается от реаьности, 
т.е. на листе 800x1000 px реально влезает сетка 3 на 3(картишка 200x420 px , отсуп от края 1 px, от картинки 3 px) а мне выдает 5 столбцов и 6 строк.


Пожалуйста, помогите с проблемой.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)